spark-server/internal/module/friend/logic/reject.go
DESKTOP-L8OUL9F\gfl0034 1edcb959b7 feat: 补好友拒绝、客户端配置 API 与 OpenAPI/popadmin
为 Spark Messenger 主路径补齐 POST /v1/friends/requests/reject,并落地法律协议/反馈/订阅/密码登录及管理页,同步 OpenAPI 文档。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-24 14:01:46 +08:00

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