This commit is contained in:
iu
2026-10-10 14:21:43 +03:00
parent 84ce4d1930
commit 9329ebc023
17 changed files with 591 additions and 34 deletions
+37 -3
View File
@@ -17,15 +17,20 @@ type MemberLookup interface {
Role(ctx context.Context, albumID, userID string) (string, error)
}
type PhotoLookup interface {
PhotoInAlbum(ctx context.Context, photoID, albumID string) (bool, error)
}
type Service struct {
store *Store
members MemberLookup
photos PhotoLookup
hub *sse.Hub
storage *storage.Client
}
func NewService(store *Store, members MemberLookup, hub *sse.Hub, storage *storage.Client) *Service {
return &Service{store: store, members: members, hub: hub, storage: storage}
func NewService(store *Store, members MemberLookup, hub *sse.Hub, storage *storage.Client, photos PhotoLookup) *Service {
return &Service{store: store, members: members, photos: photos, hub: hub, storage: storage}
}
type CreateInput struct {
@@ -51,7 +56,23 @@ func (s *Service) Create(ctx context.Context, userID string, in CreateInput) (*m
}
func (s *Service) List(ctx context.Context, userID string) ([]models.Album, error) {
return s.store.ListForUser(ctx, userID)
list, err := s.store.ListForUser(ctx, userID)
if err != nil {
return nil, err
}
for i := range list {
s.attachCoverURL(ctx, &list[i])
}
return list, nil
}
func (s *Service) attachCoverURL(ctx context.Context, a *models.Album) {
if a == nil || a.CoverThumbKey == "" || s.storage == nil {
return
}
if url, err := s.storage.PresignGet(ctx, a.CoverThumbKey); err == nil {
a.CoverURL = url
}
}
func (s *Service) Access(ctx context.Context, albumID, userID string) (*models.Album, string, error) {
@@ -62,6 +83,7 @@ func (s *Service) Access(ctx context.Context, albumID, userID string) (*models.A
}
return nil, "", err
}
s.attachCoverURL(ctx, a)
if a.OwnerID == userID {
return a, roles.Owner, nil
}
@@ -107,11 +129,23 @@ func (s *Service) Update(ctx context.Context, albumID, userID string, in UpdateI
if in.ClearCover {
a.CoverPhotoID = nil
} else if in.CoverPhotoID != nil {
ok, err := s.photos.PhotoInAlbum(ctx, *in.CoverPhotoID, albumID)
if err != nil {
return nil, err
}
if !ok {
return nil, httpx.BadRequest("invalid_cover", "cover photo must belong to the album")
}
a.CoverPhotoID = in.CoverPhotoID
}
if err := s.store.Update(ctx, a); err != nil {
return nil, err
}
if fresh, err := s.store.GetByID(ctx, albumID); err == nil {
a.CoverThumbKey = fresh.CoverThumbKey
a.CoverURL = ""
s.attachCoverURL(ctx, a)
}
s.hub.Publish(albumID, "album.updated", a)
return a, nil
}
+9 -5
View File
@@ -43,9 +43,11 @@ func (s *Store) OwnerID(ctx context.Context, id string) (string, error) {
func (s *Store) GetByID(ctx context.Context, id string) (*models.Album, error) {
var a models.Album
err := s.pool.QueryRow(ctx,
`SELECT id, owner_id, title, description, cover_photo_id, created_at, updated_at
FROM albums WHERE id = $1`, id).
Scan(&a.ID, &a.OwnerID, &a.Title, &a.Description, &a.CoverPhotoID, &a.CreatedAt, &a.UpdatedAt)
`SELECT a.id, a.owner_id, a.title, a.description, a.cover_photo_id,
COALESCE((SELECT p.thumb_key FROM photos p WHERE p.id = a.cover_photo_id), ''),
a.created_at, a.updated_at
FROM albums a WHERE a.id = $1`, id).
Scan(&a.ID, &a.OwnerID, &a.Title, &a.Description, &a.CoverPhotoID, &a.CoverThumbKey, &a.CreatedAt, &a.UpdatedAt)
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return nil, ErrNotFound
@@ -57,7 +59,9 @@ func (s *Store) GetByID(ctx context.Context, id string) (*models.Album, error) {
func (s *Store) ListForUser(ctx context.Context, userID string) ([]models.Album, error) {
rows, err := s.pool.Query(ctx,
`SELECT a.id, a.owner_id, a.title, a.description, a.cover_photo_id, a.created_at, a.updated_at
`SELECT a.id, a.owner_id, a.title, a.description, a.cover_photo_id,
COALESCE((SELECT p.thumb_key FROM photos p WHERE p.id = a.cover_photo_id), ''),
a.created_at, a.updated_at
FROM albums a
LEFT JOIN album_members m ON m.album_id = a.id AND m.user_id = $1
WHERE a.owner_id = $1 OR m.user_id IS NOT NULL
@@ -70,7 +74,7 @@ func (s *Store) ListForUser(ctx context.Context, userID string) ([]models.Album,
out := []models.Album{}
for rows.Next() {
var a models.Album
if err := rows.Scan(&a.ID, &a.OwnerID, &a.Title, &a.Description, &a.CoverPhotoID, &a.CreatedAt, &a.UpdatedAt); err != nil {
if err := rows.Scan(&a.ID, &a.OwnerID, &a.Title, &a.Description, &a.CoverPhotoID, &a.CoverThumbKey, &a.CreatedAt, &a.UpdatedAt); err != nil {
return nil, err
}
out = append(out, a)