package logic import ( "context" "time" "spark-server/internal/module/friend/entity" "spark-server/internal/pkg/errs" "spark-server/internal/pkg/i18n" "spark-server/internal/pkg/reqctx" "spark-server/internal/pkg/validate" ) // RejectInput ignores/rejects a pending incoming friend request. type RejectInput struct { RequestID int64 `json:"request_id" validate:"required,gt=0" label:"field.request_id" errmsg:"required:validate.friend.request_required"` } // Reject marks a pending request as rejected (status=3). Idempotent if already rejected. func (s *Service) Reject(ctx context.Context, userID int64, in RejectInput) error { if !s.ready() || userID <= 0 { return errs.ErrUnauthorized } if err := validate.StructLang(reqctx.Lang(ctx), in); err != nil { return err } req, err := s.repo.GetRequest(ctx, in.RequestID) if err != nil { return err } lang := reqctx.Lang(ctx) if req.ToUser != userID { return errs.ErrForbidden.WithMsg(i18n.T(lang, i18n.KeyFriendRequestInvalid, nil)) } if req.Status == entity.RequestRejected { return nil } if req.Status != entity.RequestPending { return errs.ErrForbidden.WithMsg(i18n.T(lang, i18n.KeyFriendRequestInvalid, nil)) } req.Status = entity.RequestRejected req.UpdatedAt = time.Now() return s.repo.UpsertRequest(ctx, req) }