Files
Spanglish/photo-api/internal/storage/storage.go
T
MichilisandCursor c9a600b6d6 Add photo galleries API and frontend for public and admin viewing.
Introduces the Go photo-api service, nginx/systemd deploy wiring, and Next.js gallery/lightbox pages so event photos can be managed and browsed.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-25 17:32:23 +00:00

33 lines
1.1 KiB
Go

// Package storage abstracts photo object storage. Selection follows the
// backend's convention (backend/src/lib/storage.ts): S3 when S3_ENDPOINT
// and S3_BUCKET are both set, local disk otherwise. Keys are identical on
// both backends: galleries/<galleryID>/<variantDir>/<photoID>.<ext>.
package storage
import (
"context"
"errors"
"io"
"time"
"git.azzamo.net/Michilis/Spanglish/photo-api/internal/config"
)
// ErrNoPresign is returned by backends that cannot presign (local disk);
// callers then stream the object through the API instead.
var ErrNoPresign = errors.New("presigned URLs not supported")
type Storage interface {
Put(ctx context.Context, key string, r io.Reader, size int64, contentType string) error
Open(ctx context.Context, key string) (io.ReadCloser, int64, error)
Delete(ctx context.Context, key string) error
PresignGet(ctx context.Context, key, downloadFilename, contentType string, expiry time.Duration) (string, error)
}
func New(cfg config.Config) (Storage, error) {
if cfg.S3Enabled() {
return newS3(cfg)
}
return newLocal(cfg.StoragePath)
}