From 227f5814df0c70bf595b009e4c93b15aed3c1e1b Mon Sep 17 00:00:00 2001 From: zetaloop Date: Sun, 3 May 2026 06:04:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(player):=20=E6=96=B0=E5=A2=9E=20GET=20/pla?= =?UTF-8?q?yers/me=20=E6=9F=A5=E8=AF=A2=E5=BD=93=E5=89=8D=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=89=93=E6=89=8B=E8=B5=84=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handler/player/getmyplayerhandler.go | 32 +++++ app/player/api/internal/handler/routes.go | 6 + .../internal/logic/player/getmyplayerlogic.go | 126 ++++++++++++++++++ deploy/dev/envoy.yaml | 16 +++ desc/api/player.api | 4 + 5 files changed, 184 insertions(+) create mode 100644 app/player/api/internal/handler/player/getmyplayerhandler.go create mode 100644 app/player/api/internal/logic/player/getmyplayerlogic.go diff --git a/app/player/api/internal/handler/player/getmyplayerhandler.go b/app/player/api/internal/handler/player/getmyplayerhandler.go new file mode 100644 index 0000000..158fa66 --- /dev/null +++ b/app/player/api/internal/handler/player/getmyplayerhandler.go @@ -0,0 +1,32 @@ +// Code scaffolded by goctl. Safe to edit. +// goctl 1.10.1 + +package player + +import ( + "net/http" + + "github.com/zeromicro/go-zero/rest/httpx" + "juwan-backend/app/player/api/internal/logic/player" + "juwan-backend/app/player/api/internal/svc" + "juwan-backend/app/player/api/internal/types" +) + +// 获取当前用户的打手资料 +func GetMyPlayerHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + var req types.EmptyResp + if err := httpx.Parse(r, &req); err != nil { + httpx.ErrorCtx(r.Context(), w, err) + return + } + + l := player.NewGetMyPlayerLogic(r.Context(), svcCtx) + resp, err := l.GetMyPlayer(&req) + if err != nil { + httpx.ErrorCtx(r.Context(), w, err) + } else { + httpx.OkJsonCtx(r.Context(), w, resp) + } + } +} diff --git a/app/player/api/internal/handler/routes.go b/app/player/api/internal/handler/routes.go index 1b8bfb2..1e6f291 100644 --- a/app/player/api/internal/handler/routes.go +++ b/app/player/api/internal/handler/routes.go @@ -57,6 +57,12 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { Path: "/players/me", Handler: player.InitPlayerHandler(serverCtx), }, + { + // 获取当前用户的打手资料 + Method: http.MethodGet, + Path: "/players/me", + Handler: player.GetMyPlayerHandler(serverCtx), + }, { // 更新接单状态 Method: http.MethodPut, diff --git a/app/player/api/internal/logic/player/getmyplayerlogic.go b/app/player/api/internal/logic/player/getmyplayerlogic.go new file mode 100644 index 0000000..18ee22a --- /dev/null +++ b/app/player/api/internal/logic/player/getmyplayerlogic.go @@ -0,0 +1,126 @@ +// Code scaffolded by goctl. Safe to edit. +// goctl 1.10.1 + +package player + +import ( + "context" + "encoding/json" + "errors" + "strconv" + "time" + + "juwan-backend/app/player/api/internal/svc" + "juwan-backend/app/player/api/internal/types" + "juwan-backend/app/player/rpc/pb" + "juwan-backend/app/player/rpc/playerservice" + "juwan-backend/app/users/rpc/usercenter" + "juwan-backend/common/utils/contextj" + + "github.com/zeromicro/go-zero/core/logx" + "google.golang.org/grpc/status" +) + +type GetMyPlayerLogic struct { + logx.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +// 获取当前用户的打手资料 +func NewGetMyPlayerLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetMyPlayerLogic { + return &GetMyPlayerLogic{ + Logger: logx.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *GetMyPlayerLogic) GetMyPlayer(req *types.EmptyResp) (resp *types.PlayerProfile, err error) { + userID, err := contextj.UserIDFrom(l.ctx) + if err != nil { + return nil, err + } + + playerResp, err := l.svcCtx.PlayerRpc.GetPlayerByUserId(l.ctx, &playerservice.SearchPlayersReq{UserId: &userID}) + if err != nil { + st, _ := status.FromError(err) + if st.Code().String() == "NotFound" { + return nil, errors.New("player not found") + } + return nil, err + } + player := playerResp.GetPlayers() + if player == nil { + return nil, errors.New("player not found") + } + + userResp, err := l.svcCtx.UserRpc.GetUsersById(l.ctx, &usercenter.GetUsersByIdReq{Id: userID}) + if err != nil { + return nil, err + } + user := userResp.GetUsers() + if user == nil { + return nil, errors.New("user not found") + } + + games := make([]string, 0, len(player.Games)) + for _, gameID := range player.Games { + games = append(games, strconv.FormatInt(gameID, 10)) + } + + verificationStatus := map[string]string{} + if user.VerificationStatus != "" { + _ = json.Unmarshal([]byte(user.VerificationStatus), &verificationStatus) + } + + resp = &types.PlayerProfile{ + Id: player.Id, + User: types.UserProfile{ + Id: strconv.FormatInt(user.Id, 10), + Username: user.Username, + Nickname: user.Nickname, + Avatar: user.Avatar, + Role: user.CurrentRole, + VerifiedRoles: append([]string{}, user.VerifiedRoles...), + VerificationStatus: verificationStatus, + Phone: user.Phone, + Bio: user.Bio, + CreatedAt: time.Unix(user.CreatedAt, 0).Format(time.DateTime), + }, + Rating: player.Rating, + TotalOrders: player.TotalOrders, + Status: player.Status, + Games: games, + Services: []types.PlayerService{}, + Gender: player.Gender, + Tags: append([]string{}, player.Tags...), + } + if player.ShopId != 0 { + resp.ShopId = strconv.FormatInt(player.ShopId, 10) + } + + svcResp, svcErr := l.svcCtx.PlayerRpc.SearchPlayerServices(l.ctx, &pb.SearchPlayerServicesReq{ + PlayerId: player.Id, + Limit: 100, + }) + if svcErr != nil { + logx.Errorf("GetMyPlayer SearchPlayerServices player=%d err: %v", player.Id, svcErr) + } else { + for _, s := range svcResp.PlayerServices { + resp.Services = append(resp.Services, types.PlayerService{ + Id: s.Id, + PlayerId: s.PlayerId, + GameId: s.GameId, + Title: s.Title, + Description: s.Description, + Price: s.Price, + Unit: s.Unit, + RankRange: s.RankRange, + Availability: s.Availability, + }) + } + } + + return resp, nil +} diff --git a/deploy/dev/envoy.yaml b/deploy/dev/envoy.yaml index fa840bf..6d3ed90 100644 --- a/deploy/dev/envoy.yaml +++ b/deploy/dev/envoy.yaml @@ -116,6 +116,15 @@ static_resources: "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthzPerRoute disabled: true + - match: + path: /api/v1/players/me + headers: + - name: ":method" + exact_match: GET + route: + cluster: player_api_cluster + timeout: 30s + - match: prefix: /api/v1/players headers: @@ -616,6 +625,13 @@ static_resources: headers: - name: ":method" exact_match: GET + - match: + path: /api/v1/players/me + headers: + - name: ":method" + exact_match: GET + requires: + provider_name: juwan_user_jwt - match: prefix: /api/v1/players headers: diff --git a/desc/api/player.api b/desc/api/player.api index be19ec9..7309813 100644 --- a/desc/api/player.api +++ b/desc/api/player.api @@ -127,6 +127,10 @@ service player-api { @handler InitPlayer post /players/me (EmptyResp) returns (PlayerProfile) + @doc "获取当前用户的打手资料" + @handler GetMyPlayer + get /players/me (EmptyResp) returns (PlayerProfile) + @doc "更新接单状态" @handler UpdatePlayerStatus put /players/me/status (UpdatePlayerStatusReq) returns (EmptyResp)