bindbox-game/internal/api/user/profile_app.go
2026-02-06 15:18:16 +08:00

150 lines
4.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package app
import (
"net/http"
"bindbox-game/internal/code"
"bindbox-game/internal/pkg/core"
"bindbox-game/internal/pkg/validation"
)
// GetUserProfile 获取当前用户信息
// @Summary 获取用户信息
// @Description 获取当前登录用户的详细信息
// @Tags APP端.用户
// @Accept json
// @Produce json
// @Security LoginVerifyToken
// @Success 200 {object} userItem
// @Failure 400 {object} code.Failure
// @Router /api/app/users/profile [get]
func (h *handler) GetUserProfile() core.HandlerFunc {
return func(ctx core.Context) {
userID := int64(ctx.SessionUserInfo().Id)
user, err := h.user.GetProfile(ctx.RequestContext(), userID)
if err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ServerError, err.Error()))
return
}
// Mask sensitive data if needed, but for "My Profile" usually we return full non-critical info.
// Returning masked phone for display.
phone := user.Mobile
if len(phone) >= 11 {
phone = phone[:3] + "****" + phone[7:]
}
balance, _ := h.user.GetPointsBalance(ctx.RequestContext(), userID)
// 转换为积分(浮点)用于显示
balancePoints := h.user.CentsToPointsFloat(ctx.RequestContext(), balance)
var inviterNickname, inviterAvatar, inviterCode string
if user.InviterID > 0 {
if inviter, err := h.user.GetProfile(ctx.RequestContext(), user.InviterID); err == nil {
inviterNickname = inviter.Nickname
inviterAvatar = inviter.Avatar
inviterCode = inviter.InviteCode
}
}
res := userItem{
ID: user.ID,
Nickname: user.Nickname,
Avatar: user.Avatar,
InviteCode: user.InviteCode,
InviterID: user.InviterID,
InviterNickname: inviterNickname,
InviterAvatar: inviterAvatar,
InviterCode: inviterCode,
Mobile: phone,
DouyinUserID: user.DouyinUserID,
Balance: balancePoints,
}
ctx.Payload(res)
}
}
type modifyUserRequest struct {
Nickname *string `json:"nickname"`
Avatar *string `json:"avatar"`
}
type userItem struct {
ID int64 `json:"id"`
Nickname string `json:"nickname"`
Avatar string `json:"avatar"`
InviteCode string `json:"invite_code"`
InviterID int64 `json:"inviter_id"`
InviterNickname string `json:"inviter_nickname"` // 邀请人昵称
InviterAvatar string `json:"inviter_avatar"` // 邀请人头像
InviterCode string `json:"inviter_code"` // 邀请人邀请码
Mobile string `json:"mobile"`
DouyinUserID string `json:"douyin_user_id"`
Balance float64 `json:"balance"` // 积分(分/rate
}
type modifyUserResponse struct {
User userItem `json:"user"`
}
// ModifyUser 修改用户信息
// @Summary 修改用户信息
// @Description 修改用户昵称与头像
// @Tags APP端.用户
// @Accept json
// @Produce json
// @Param user_id path integer true "用户ID"
// @Security LoginVerifyToken
// @Param RequestBody body modifyUserRequest true "请求参数"
// @Success 200 {object} modifyUserResponse
// @Failure 400 {object} code.Failure
// @Router /api/app/users/{user_id} [put]
func (h *handler) ModifyUser() core.HandlerFunc {
return func(ctx core.Context) {
req := new(modifyUserRequest)
rsp := new(modifyUserResponse)
if err := ctx.ShouldBindJSON(req); err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, code.ParamBindError, validation.Error(err)))
return
}
userID := int64(ctx.SessionUserInfo().Id)
item, err := h.user.UpdateProfile(ctx.RequestContext(), userID, req.Nickname, req.Avatar)
if err != nil {
ctx.AbortWithError(core.Error(http.StatusBadRequest, 10001, err.Error()))
return
}
// For update response, we might not have all fields populated from Update result if it returns a partial object or just the updated fields?
// But Service UpdateProfile returns the Full User object.
// So we can populate everything.
maskedPhone := item.Mobile
if len(maskedPhone) >= 11 {
maskedPhone = maskedPhone[:3] + "****" + maskedPhone[7:]
}
balance, _ := h.user.GetPointsBalance(ctx.RequestContext(), userID)
balancePoints := h.user.CentsToPointsFloat(ctx.RequestContext(), balance)
var inviterNickname, inviterAvatar, inviterCode string
if item.InviterID > 0 {
if inviter, err := h.user.GetProfile(ctx.RequestContext(), item.InviterID); err == nil {
inviterNickname = inviter.Nickname
inviterAvatar = inviter.Avatar
inviterCode = inviter.InviteCode
}
}
rsp.User = userItem{
ID: item.ID,
Nickname: item.Nickname,
Avatar: item.Avatar,
InviteCode: item.InviteCode,
InviterID: item.InviterID,
InviterNickname: inviterNickname,
InviterAvatar: inviterAvatar,
InviterCode: inviterCode,
Mobile: maskedPhone,
DouyinUserID: item.DouyinUserID,
Balance: balancePoints,
}
ctx.Payload(rsp)
}
}