75 lines
2.6 KiB
Go
75 lines
2.6 KiB
Go
package collection
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/gocql/gocql"
|
|
"go.uber.org/zap"
|
|
|
|
dom_collection "codeberg.org/mapleopentech/monorepo/cloud/maplefile-backend/internal/domain/collection"
|
|
)
|
|
|
|
// RecalculateAllFileCounts recalculates the file_count for all collections
|
|
// by counting active files in each collection. This is useful for fixing
|
|
// collections that were created before file count tracking was implemented.
|
|
func (impl *collectionRepositoryImpl) RecalculateAllFileCounts(ctx context.Context) (*dom_collection.RecalculateAllFileCountsResult, error) {
|
|
impl.Logger.Info("Starting recalculation of all collection file counts")
|
|
|
|
result := &dom_collection.RecalculateAllFileCountsResult{}
|
|
|
|
// Get all collection IDs
|
|
query := `SELECT id FROM maplefile.collections_by_id`
|
|
iter := impl.Session.Query(query).WithContext(ctx).Iter()
|
|
|
|
var collectionIDs []gocql.UUID
|
|
var collectionID gocql.UUID
|
|
for iter.Scan(&collectionID) {
|
|
collectionIDs = append(collectionIDs, collectionID)
|
|
}
|
|
|
|
if err := iter.Close(); err != nil {
|
|
return nil, fmt.Errorf("failed to get collection IDs: %w", err)
|
|
}
|
|
|
|
result.TotalCollections = len(collectionIDs)
|
|
impl.Logger.Info("Found collections to process",
|
|
zap.Int("count", result.TotalCollections))
|
|
|
|
// For each collection, count active files and update
|
|
for _, colID := range collectionIDs {
|
|
// Count active files in this collection
|
|
countQuery := `SELECT COUNT(*) FROM maplefile.files_by_collection WHERE collection_id = ? AND state = 'active' ALLOW FILTERING`
|
|
var fileCount int64
|
|
if err := impl.Session.Query(countQuery, colID).WithContext(ctx).Scan(&fileCount); err != nil {
|
|
impl.Logger.Error("Failed to count files for collection",
|
|
zap.String("collection_id", colID.String()),
|
|
zap.Error(err))
|
|
result.ErrorCount++
|
|
continue
|
|
}
|
|
|
|
// Update the collection's file_count
|
|
updateQuery := `UPDATE maplefile.collections_by_id SET file_count = ? WHERE id = ?`
|
|
if err := impl.Session.Query(updateQuery, fileCount, colID).WithContext(ctx).Exec(); err != nil {
|
|
impl.Logger.Error("Failed to update file count for collection",
|
|
zap.String("collection_id", colID.String()),
|
|
zap.Int64("file_count", fileCount),
|
|
zap.Error(err))
|
|
result.ErrorCount++
|
|
continue
|
|
}
|
|
|
|
result.UpdatedCount++
|
|
impl.Logger.Debug("Updated file count for collection",
|
|
zap.String("collection_id", colID.String()),
|
|
zap.Int64("file_count", fileCount))
|
|
}
|
|
|
|
impl.Logger.Info("Completed recalculation of all collection file counts",
|
|
zap.Int("total", result.TotalCollections),
|
|
zap.Int("updated", result.UpdatedCount),
|
|
zap.Int("errors", result.ErrorCount))
|
|
|
|
return result, nil
|
|
}
|