63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
package store
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/jackc/pgx/v5"
|
|
)
|
|
|
|
// Media stores metadata of an uploaded file. The file bytes live in the
|
|
// media storage backend (see internal/media), referenced by StorageKey.
|
|
type Media struct {
|
|
ID int64
|
|
UploaderID int64
|
|
Filename string
|
|
ContentType string
|
|
Size int64
|
|
StorageKey string
|
|
ThumbKey string
|
|
CreatedAt time.Time
|
|
}
|
|
|
|
// CreateMedia inserts a media record and returns it with its ID.
|
|
func (s *Store) CreateMedia(ctx context.Context, m Media) (*Media, error) {
|
|
err := s.pool.QueryRow(ctx, `
|
|
INSERT INTO media(uploader_id, filename, content_type, size, storage_key, thumb_key)
|
|
VALUES($1, $2, $3, $4, $5, $6)
|
|
RETURNING id, created_at
|
|
`, m.UploaderID, m.Filename, m.ContentType, m.Size, m.StorageKey, nullableString(m.ThumbKey)).Scan(&m.ID, &m.CreatedAt)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &m, nil
|
|
}
|
|
|
|
// GetMediaByID retrieves a media record or returns ErrNotFound.
|
|
func (s *Store) GetMediaByID(ctx context.Context, id int64) (*Media, error) {
|
|
var m Media
|
|
var thumbKey *string
|
|
err := s.pool.QueryRow(ctx, `
|
|
SELECT id, uploader_id, filename, content_type, size, storage_key, thumb_key, created_at
|
|
FROM media WHERE id=$1
|
|
`, id).Scan(&m.ID, &m.UploaderID, &m.Filename, &m.ContentType, &m.Size, &m.StorageKey, &thumbKey, &m.CreatedAt)
|
|
if err != nil {
|
|
if errors.Is(err, pgx.ErrNoRows) {
|
|
return nil, ErrNotFound
|
|
}
|
|
return nil, err
|
|
}
|
|
if thumbKey != nil {
|
|
m.ThumbKey = *thumbKey
|
|
}
|
|
return &m, nil
|
|
}
|
|
|
|
func nullableString(s string) *string {
|
|
if s == "" {
|
|
return nil
|
|
}
|
|
return &s
|
|
}
|