in internal/repo/explore.go [34:134]
func (e *Explore) GetPathContents(path string, sortBy SortType) ([]*model.Metadata, error) {
if path == "" {
path = "/"
}
queryContent := `
SELECT
name,
LENGTH(name) AS name_length,
size_standard,
size_nearline,
size_coldline,
size_archive,
(size_standard +
size_nearline +
size_coldline +
size_archive) AS size,
count,
'' as storage_class,
parent
FROM directory
WHERE
parent = $1 OR
name = $1
UNION ALL
SELECT
name,
LENGTH(name) AS name_length,
0 as size_standard,
0 as size_nearline,
0 as size_coldline,
0 as size_archive,
size,
0 as count,
storage_class,
parent
FROM metadata
WHERE
parent = $1
`
if sortBy != SortByCount && sortBy != SortBySize {
return nil, errors.New("invalid sort parameter")
}
queryContent += fmt.Sprintf(" ORDER BY %s DESC, name_length", sortBy)
queryContent += " LIMIT 100;"
type contentRow struct {
Name string `db:"name"`
NameLength int `db:"name_length"`
StorageClass string `db:"storage_class"`
SizeStandard int64 `db:"size_standard"`
SizeNearline int64 `db:"size_nearline"`
SizeColdline int64 `db:"size_coldline"`
SizeArchive int64 `db:"size_archive"`
Size int64 `db:"size"`
Count int64 `db:"count"`
Parent string `db:"parent"`
}
rows, err := e.DB.Queryx(queryContent, path)
if err != nil {
return nil, fmt.Errorf("query error: %w", err)
}
defer rows.Close()
var pathContents []*model.Metadata
for rows.Next() {
var row contentRow
if err := rows.StructScan(&row); err != nil {
return nil, fmt.Errorf("scan error: %w", err)
}
metadata := &model.Metadata{
Name: row.Name,
Size: row.Size,
Count: row.Count,
StorageClass: row.StorageClass,
Parent: row.Parent,
}
// Calculate costs of every object and directory
// defaultLocation is used for all results until storing location from bucket is implemented
if len(metadata.StorageClass) > 0 { // object
cost, err := getObjectCost(defaultLocation, StorageClass(metadata.StorageClass), metadata.Size)
if err != nil {
return nil, err
}
metadata.Cost = cost
} else { // directory
totalCost, err := getDirectoryCost(defaultLocation, row.SizeStandard, row.SizeNearline, row.SizeColdline, row.SizeArchive)
if err != nil {
return nil, err
}
metadata.Cost = totalCost
}
pathContents = append(pathContents, metadata)
}
return pathContents, nil
}