150 lines
4.8 KiB
Go
150 lines
4.8 KiB
Go
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)
|
||
}
|
||
}
|