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>
58 lines
1.3 KiB
Go
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())
|
|
}
|