95 lines
5.5 KiB
Go
95 lines
5.5 KiB
Go
// monorepo/cloud/backend/internal/maplefile/domain/file/interface.go
|
|
package file
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/gocql/gocql"
|
|
)
|
|
|
|
// FileMetadataRepository defines the interface for interacting with file metadata storage.
|
|
// It handles operations related to storing, retrieving, updating, and deleting file information (metadata).
|
|
type FileMetadataRepository interface {
|
|
// Create saves a single File metadata record to the storage.
|
|
Create(file *File) error
|
|
// CreateMany saves multiple File metadata records to the storage.
|
|
CreateMany(files []*File) error
|
|
// Get retrieves a single File metadata record (regardless of its state) by its unique identifier (ID) .
|
|
Get(id gocql.UUID) (*File, error)
|
|
// GetByIDs retrieves multiple File metadata records by their unique identifiers (IDs).
|
|
GetByIDs(ids []gocql.UUID) ([]*File, error)
|
|
// GetByCollection retrieves all File metadata records associated with a specific collection ID.
|
|
GetByCollection(collectionID gocql.UUID) ([]*File, error)
|
|
// Update modifies an existing File metadata record in the storage.
|
|
Update(file *File) error
|
|
// SoftDelete removes a single File metadata record by its unique identifier (ID) by setting its state to deleted.
|
|
SoftDelete(id gocql.UUID) error
|
|
// HardDelete permanently removes a file metadata record
|
|
HardDelete(id gocql.UUID) error
|
|
// SoftDeleteMany removes multiple File metadata records by their unique identifiers (IDs) by setting its state to deleted.
|
|
SoftDeleteMany(ids []gocql.UUID) error
|
|
// HardDeleteMany permanently removes multiple file metadata records
|
|
HardDeleteMany(ids []gocql.UUID) error
|
|
// CheckIfExistsByID verifies if a File metadata record with the given ID exists in the storage.
|
|
CheckIfExistsByID(id gocql.UUID) (bool, error)
|
|
// CheckIfUserHasAccess determines if a specific user (userID) has access permissions for a given file (fileID).
|
|
CheckIfUserHasAccess(fileID gocql.UUID, userID gocql.UUID) (bool, error)
|
|
GetByCreatedByUserID(createdByUserID gocql.UUID) ([]*File, error)
|
|
GetByOwnerID(ownerID gocql.UUID) ([]*File, error)
|
|
|
|
// State management operations
|
|
Archive(id gocql.UUID) error
|
|
Restore(id gocql.UUID) error
|
|
RestoreMany(ids []gocql.UUID) error
|
|
|
|
// ListSyncData retrieves file sync data with pagination for the specified user and accessible collections
|
|
ListSyncData(ctx context.Context, userID gocql.UUID, cursor *FileSyncCursor, limit int64, accessibleCollectionIDs []gocql.UUID) (*FileSyncResponse, error)
|
|
|
|
// ListRecentFiles retrieves recent files with pagination for the specified user and accessible collections
|
|
ListRecentFiles(ctx context.Context, userID gocql.UUID, cursor *RecentFilesCursor, limit int64, accessibleCollectionIDs []gocql.UUID) (*RecentFilesResponse, error)
|
|
|
|
// CountFilesByUser counts all active files accessible to the user
|
|
CountFilesByUser(ctx context.Context, userID gocql.UUID, accessibleCollectionIDs []gocql.UUID) (int, error)
|
|
|
|
// CountFilesByCollection counts active files in a specific collection
|
|
CountFilesByCollection(ctx context.Context, collectionID gocql.UUID) (int, error)
|
|
|
|
// Storage size calculation methods
|
|
GetTotalStorageSizeByOwner(ctx context.Context, ownerID gocql.UUID) (int64, error)
|
|
GetTotalStorageSizeByUser(ctx context.Context, userID gocql.UUID, accessibleCollectionIDs []gocql.UUID) (int64, error)
|
|
GetTotalStorageSizeByCollection(ctx context.Context, collectionID gocql.UUID) (int64, error)
|
|
|
|
// IP Anonymization for GDPR compliance
|
|
AnonymizeOldIPs(ctx context.Context, cutoffDate time.Time) (int, error)
|
|
AnonymizeFileIPsByOwner(ctx context.Context, ownerID gocql.UUID) (int, error) // For GDPR right-to-be-forgotten
|
|
|
|
// Tag-related operations
|
|
// ListByTagID retrieves all files that have the specified tag assigned
|
|
// Used for tag update propagation (updating embedded tag data across all files)
|
|
ListByTagID(ctx context.Context, tagID gocql.UUID) ([]*File, error)
|
|
}
|
|
|
|
// FileObjectStorageRepository defines the interface for interacting with the actual encrypted file data storage.
|
|
// It handles operations related to storing, retrieving, deleting, and generating access URLs for encrypted data.
|
|
type FileObjectStorageRepository interface {
|
|
// StoreEncryptedData saves encrypted file data to the storage system. It takes the owner's ID,
|
|
// the file's ID (metadata ID), and the encrypted byte slice. It returns the storage path
|
|
// where the data was saved, or an error.
|
|
StoreEncryptedData(ownerID string, fileID string, encryptedData []byte) (string, error)
|
|
// GetEncryptedData retrieves encrypted file data from the storage system using its storage path.
|
|
// It returns the encrypted data as a byte slice, or an error.
|
|
GetEncryptedData(storagePath string) ([]byte, error)
|
|
// DeleteEncryptedData removes encrypted file data from the storage system using its storage path.
|
|
DeleteEncryptedData(storagePath string) error
|
|
// GeneratePresignedDownloadURL creates a temporary, time-limited URL that allows direct download
|
|
// of the file data located at the given storage path, with proper content disposition headers.
|
|
GeneratePresignedDownloadURL(storagePath string, duration time.Duration) (string, error)
|
|
// GeneratePresignedUploadURL creates a temporary, time-limited URL that allows clients to upload
|
|
// encrypted file data directly to the storage system at the specified storage path.
|
|
GeneratePresignedUploadURL(storagePath string, duration time.Duration) (string, error)
|
|
// VerifyObjectExists checks if an object exists at the given storage path.
|
|
VerifyObjectExists(storagePath string) (bool, error)
|
|
// GetObjectSize returns the size in bytes of the object at the given storage path.
|
|
GetObjectSize(storagePath string) (int64, error)
|
|
}
|