package logic import ( "context" "strings" "time" "spark-server/internal/module/moment/entity" "spark-server/internal/pkg/errs" "spark-server/internal/pkg/i18n" "spark-server/internal/pkg/reqctx" "spark-server/internal/pkg/validate" ) type SettingsView struct { CoverKey string `json:"cover_key"` VisibleDays entity.VisibleDays `json:"visible_days"` Hides []*HideView `json:"hides"` } type HideView struct { User UserCard `json:"user"` HideHim bool `json:"hide_him"` HideMe bool `json:"hide_me"` } type PatchSettingsInput struct { CoverKey *string `json:"cover_key" validate:"omitempty,max=512" label:"field.moment_cover"` VisibleDays *entity.VisibleDays `json:"visible_days" validate:"omitempty,oneof=0 3 30 180" label:"field.moment_visible_days" errmsg:"oneof:validate.moment.visible_days_invalid"` } type HideInput struct { HideHim bool `json:"hide_him"` HideMe bool `json:"hide_me"` } func (s *Service) GetSettings(ctx context.Context, userID int64) (*SettingsView, error) { if !s.ready() || userID <= 0 { return nil, errs.ErrUnauthorized } st, err := s.repo.GetSettings(ctx, userID) if err != nil { return nil, err } hides, err := s.repo.ListHides(ctx, userID) if err != nil { return nil, err } uids := make([]int64, 0, len(hides)) for _, h := range hides { uids = append(uids, h.PeerID) } users := s.loadUsers(ctx, uids) remarks := s.loadRemarks(ctx, userID, uids) items := make([]*HideView, 0, len(hides)) for _, h := range hides { items = append(items, &HideView{User: cardOf(users[h.PeerID], remarks[h.PeerID]), HideHim: h.HideHim, HideMe: h.HideMe}) } return &SettingsView{CoverKey: st.CoverKey, VisibleDays: st.VisibleDays, Hides: items}, nil } func (s *Service) PatchSettings(ctx context.Context, userID int64, in *PatchSettingsInput) (*SettingsView, error) { if !s.ready() || userID <= 0 { return nil, errs.ErrUnauthorized } if in == nil { return nil, errs.ErrInvalidArgument } if err := validate.StructLang(reqctx.Lang(ctx), in); err != nil { return nil, err } st, err := s.repo.GetSettings(ctx, userID) if err != nil { return nil, err } if in.VisibleDays != nil { if !in.VisibleDays.Valid() { return nil, errs.ErrInvalidArgument.WithMsg(i18n.T(reqctx.Lang(ctx), i18n.KeyMomentVisibleDaysInvalid, nil)) } st.VisibleDays = *in.VisibleDays } if in.CoverKey != nil { if err := s.setCover(ctx, st, strings.TrimSpace(*in.CoverKey)); err != nil { return nil, err } } st.UserID = userID st.UpdatedAtMS = time.Now().UnixMilli() if err := s.repo.UpsertSettings(ctx, st); err != nil { return nil, err } return s.GetSettings(ctx, userID) } func (s *Service) setCover(ctx context.Context, st *entity.Settings, key string) error { if key != "" && !entity.ValidCoverKey(key) { return errs.ErrInvalidArgument.WithMsg(i18n.T(reqctx.Lang(ctx), i18n.KeyMomentCoverInvalid, nil)) } old := st.CoverKey st.CoverKey = key if s.objects != nil && old != "" && old != key { _ = s.objects.Delete(ctx, old) } return nil } func (s *Service) PutHide(ctx context.Context, userID, peerID int64, in *HideInput) (*SettingsView, error) { if !s.ready() || userID <= 0 { return nil, errs.ErrUnauthorized } if peerID <= 0 || peerID == userID { return nil, errs.ErrInvalidArgument } ok, err := s.friends.AreFriends(ctx, userID, peerID) if err != nil { return nil, err } if !ok { return nil, errs.ErrInvalidArgument.WithMsg(i18n.T(reqctx.Lang(ctx), i18n.KeyMomentHideNotFriend, nil)) } if in == nil { in = &HideInput{} } if err := s.repo.UpsertHide(ctx, &entity.Hide{UserID: userID, PeerID: peerID, HideHim: in.HideHim, HideMe: in.HideMe}); err != nil { return nil, err } return s.GetSettings(ctx, userID) } func (s *Service) DeleteHide(ctx context.Context, userID, peerID int64) (*SettingsView, error) { if !s.ready() || userID <= 0 { return nil, errs.ErrUnauthorized } if peerID <= 0 { return nil, errs.ErrInvalidArgument } if err := s.repo.DeleteHide(ctx, userID, peerID); err != nil { return nil, err } return s.GetSettings(ctx, userID) }