为 Spark Messenger 主路径补齐 POST /v1/friends/requests/reject,并落地法律协议/反馈/订阅/密码登录及管理页,同步 OpenAPI 文档。 Co-authored-by: Cursor <cursoragent@cursor.com>
45 lines
1.3 KiB
Go
45 lines
1.3 KiB
Go
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)
|
|
}
|