package filemanager import ( "context" "io" "time" ) type PutObjectInput struct { ObjectKey string ContentType string SizeBytes int64 Body io.Reader Metadata map[string]string } type PresignPutObjectInput struct { ObjectKey string ContentType string SizeBytes int64 Metadata map[string]string TTL time.Duration } type PresignedPutObject struct { Bucket string ObjectKey string Method string URL string Headers map[string]string ExpiresAt time.Time } type ObjectMetadata struct { Bucket string ObjectKey string ETag string VersionID string SizeBytes int64 LastModified *time.Time ContentType string } type ObjectStorage interface { EnsureBucket(ctx context.Context) error PutObject(ctx context.Context, input PutObjectInput) (ObjectMetadata, error) DeleteObject(ctx context.Context, objectKey string) error HeadObject(ctx context.Context, objectKey string) (ObjectMetadata, error) PresignPutObject(ctx context.Context, input PresignPutObjectInput) (PresignedPutObject, error) PresignGetObject(ctx context.Context, objectKey string, ttl time.Duration) (string, error) } type ObjectTaggingStorage interface { PutObjectTagging(ctx context.Context, objectKey string, tags map[string]string) error DeleteObjectTaggingKeys(ctx context.Context, objectKey string, keys []string) error }