spark-server/internal/module/favorite/logic/list.go
zhr ae9a71034d feat: implement Spark IM V3 modular monolith
Add HTTP /v1 MVC, TCP send path, groups with server-side member-avatar collage, object-storage upload, and friends/favorites around the architecture-v3 layout.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-17 19:52:11 +08:00

58 lines
1.3 KiB
Go

package logic
import (
"context"
"spark-server/internal/module/favorite/entity"
msgentity "spark-server/internal/module/message/entity"
"spark-server/internal/pkg/errs"
)
type ListResult struct {
Items []*Item `json:"items"`
}
func (s *Service) List(ctx context.Context, userID int64, limit int) (*ListResult, error) {
if !s.ready() || userID <= 0 {
return nil, errs.ErrUnauthorized
}
rows, err := s.repo.ListByUser(ctx, userID, entity.ClampLimit(limit))
if err != nil {
return nil, err
}
out := &ListResult{Items: make([]*Item, 0, len(rows))}
for _, row := range rows {
out.Items = append(out.Items, itemOf(row))
}
return out, nil
}
func (s *Service) Delete(ctx context.Context, userID, id int64) error {
if !s.ready() || userID <= 0 {
return errs.ErrUnauthorized
}
if id <= 0 {
return errs.ErrInvalidArgument
}
fav, err := s.repo.Get(ctx, id)
if err != nil {
return err
}
if fav.UserID != userID {
return errs.ErrForbidden
}
if err := s.repo.Delete(ctx, userID, id); err != nil {
return err
}
s.deleteFavoriteMedia(ctx, fav.Content)
return nil
}
func (s *Service) deleteFavoriteMedia(ctx context.Context, raw []byte) {
payload, err := msgentity.UnmarshalContent(raw)
if err != nil {
return
}
s.deleteKeys(ctx, payload.ObjectKeys())
}