44 lines
1.4 KiB
Go
44 lines
1.4 KiB
Go
// Package storage provides object storage for media files.
|
|
// In production, uses GCS. In development (standalone mode), uses in-memory storage.
|
|
package storage
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
)
|
|
|
|
// Store abstracts object storage operations.
|
|
type Store interface {
|
|
// Upload stores data at the given path and returns its public/signed URL.
|
|
Upload(ctx context.Context, path string, data []byte, contentType string) (string, error)
|
|
|
|
// UploadPresigned returns a presigned URL for direct client-to-storage uploads.
|
|
UploadPresigned(ctx context.Context, path string, contentType string) (*PresignedUpload, error)
|
|
|
|
// GetURL returns a signed or public URL for the object.
|
|
GetURL(ctx context.Context, path string) (string, error)
|
|
|
|
// Delete removes an object.
|
|
Delete(ctx context.Context, path string) error
|
|
|
|
// List returns objects matching the given prefix.
|
|
List(ctx context.Context, prefix string) ([]MediaObject, error)
|
|
}
|
|
|
|
// PresignedUpload contains the details for a direct-upload to storage.
|
|
type PresignedUpload struct {
|
|
URL string `json:"url"`
|
|
Headers map[string]string `json:"headers"`
|
|
Method string `json:"method"` // "PUT"
|
|
Expires time.Time `json:"expires"`
|
|
}
|
|
|
|
// MediaObject represents a stored media file.
|
|
type MediaObject struct {
|
|
Path string `json:"path"`
|
|
URL string `json:"url"`
|
|
ContentType string `json:"contentType"`
|
|
Size int64 `json:"size"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
}
|