89 lines
4.7 KiB
Go
89 lines
4.7 KiB
Go
// monorepo/cloud/maplefile-backend/internal/maplefile/domain/collection/interface.go
|
|
package collection
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/gocql/gocql"
|
|
)
|
|
|
|
// CollectionRepository defines the interface for collection persistence operations
|
|
type CollectionRepository interface {
|
|
// Collection CRUD operations
|
|
Create(ctx context.Context, collection *Collection) error
|
|
Get(ctx context.Context, id gocql.UUID) (*Collection, error)
|
|
Update(ctx context.Context, collection *Collection) error
|
|
SoftDelete(ctx context.Context, id gocql.UUID) error // Now soft delete
|
|
HardDelete(ctx context.Context, id gocql.UUID) error
|
|
|
|
// State management operations
|
|
Archive(ctx context.Context, id gocql.UUID) error
|
|
Restore(ctx context.Context, id gocql.UUID) error
|
|
|
|
// Hierarchical queries (now state-aware)
|
|
FindByParent(ctx context.Context, parentID gocql.UUID) ([]*Collection, error)
|
|
FindRootCollections(ctx context.Context, ownerID gocql.UUID) ([]*Collection, error)
|
|
FindDescendants(ctx context.Context, collectionID gocql.UUID) ([]*Collection, error)
|
|
// GetFullHierarchy(ctx context.Context, rootID gocql.UUID) (*Collection, error) // DEPRECATED AND WILL BE REMOVED
|
|
|
|
// Move collection to a new parent
|
|
MoveCollection(ctx context.Context, collectionID, newParentID gocql.UUID, updatedAncestors []gocql.UUID, updatedPathSegments []string) error
|
|
|
|
// Collection ownership and access queries (now state-aware)
|
|
CheckIfExistsByID(ctx context.Context, id gocql.UUID) (bool, error)
|
|
GetAllByUserID(ctx context.Context, ownerID gocql.UUID) ([]*Collection, error)
|
|
GetCollectionsSharedWithUser(ctx context.Context, userID gocql.UUID) ([]*Collection, error)
|
|
IsCollectionOwner(ctx context.Context, collectionID, userID gocql.UUID) (bool, error)
|
|
CheckAccess(ctx context.Context, collectionID, userID gocql.UUID, requiredPermission string) (bool, error)
|
|
GetUserPermissionLevel(ctx context.Context, collectionID, userID gocql.UUID) (string, error)
|
|
|
|
// Filtered collection queries (now state-aware)
|
|
GetCollectionsWithFilter(ctx context.Context, options CollectionFilterOptions) (*CollectionFilterResult, error)
|
|
|
|
// Collection membership operations
|
|
AddMember(ctx context.Context, collectionID gocql.UUID, membership *CollectionMembership) error
|
|
RemoveMember(ctx context.Context, collectionID, recipientID gocql.UUID) error
|
|
RemoveUserFromAllCollections(ctx context.Context, userID gocql.UUID, userEmail string) ([]gocql.UUID, error)
|
|
UpdateMemberPermission(ctx context.Context, collectionID, recipientID gocql.UUID, newPermission string) error
|
|
GetCollectionMembership(ctx context.Context, collectionID, recipientID gocql.UUID) (*CollectionMembership, error)
|
|
|
|
// Hierarchical sharing
|
|
AddMemberToHierarchy(ctx context.Context, rootID gocql.UUID, membership *CollectionMembership) error
|
|
RemoveMemberFromHierarchy(ctx context.Context, rootID, recipientID gocql.UUID) error
|
|
|
|
// GetCollectionSyncData retrieves collection sync data with pagination for the specified user
|
|
GetCollectionSyncData(ctx context.Context, userID gocql.UUID, cursor *CollectionSyncCursor, limit int64) (*CollectionSyncResponse, error)
|
|
GetCollectionSyncDataByAccessType(ctx context.Context, userID gocql.UUID, cursor *CollectionSyncCursor, limit int64, accessType string) (*CollectionSyncResponse, error)
|
|
|
|
// Count operations for all collection types (folders + albums)
|
|
CountOwnedCollections(ctx context.Context, userID gocql.UUID) (int, error)
|
|
CountSharedCollections(ctx context.Context, userID gocql.UUID) (int, error)
|
|
CountOwnedFolders(ctx context.Context, userID gocql.UUID) (int, error)
|
|
CountSharedFolders(ctx context.Context, userID gocql.UUID) (int, error)
|
|
CountTotalUniqueFolders(ctx context.Context, userID gocql.UUID) (int, error)
|
|
|
|
// IP Anonymization for GDPR compliance
|
|
AnonymizeOldIPs(ctx context.Context, cutoffDate time.Time) (int, error)
|
|
AnonymizeCollectionIPsByOwner(ctx context.Context, ownerID gocql.UUID) (int, error) // For GDPR right-to-be-forgotten
|
|
|
|
// File count maintenance operations
|
|
IncrementFileCount(ctx context.Context, collectionID gocql.UUID) error
|
|
DecrementFileCount(ctx context.Context, collectionID gocql.UUID) error
|
|
|
|
// RecalculateAllFileCounts recalculates file_count for all collections
|
|
// by counting active files. Used for data migration/repair.
|
|
RecalculateAllFileCounts(ctx context.Context) (*RecalculateAllFileCountsResult, error)
|
|
|
|
// Tag-related operations
|
|
// ListByTagID retrieves all collections that have the specified tag assigned
|
|
// Used for tag update propagation (updating embedded tag data across all collections)
|
|
ListByTagID(ctx context.Context, tagID gocql.UUID) ([]*Collection, error)
|
|
}
|
|
|
|
// RecalculateAllFileCountsResult holds the results of the recalculation operation
|
|
type RecalculateAllFileCountsResult struct {
|
|
TotalCollections int
|
|
UpdatedCount int
|
|
ErrorCount int
|
|
}
|