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()) }