spark-server/internal/module/moment/logic/settings.go
2026-09-18 17:51:42 +08:00

142 lines
4.0 KiB
Go

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