Files
Messenger/server/internal/store/media.go
T
vantablackTea 9d03ea4c51
CI / Go (build + vet + test) (push) Canceled after 0s
CI / Web (build + lint) (push) Canceled after 0s
big update: added reactions, groups, media share
2026-09-27 21:59:48 +03:00

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
}