package http import ( "net/http" "strings" userv1 "hyapp/api/proto/user/v1" "hyapp/services/gateway-service/internal/auth" ) // userIdentityData 是 gateway 对外返回的当前短号投影。 // `display_user_id` 永远表示当前有效展示号,临时靓号过期后由 user-service 恢复为默认短号。 type userIdentityData struct { UserID int64 `json:"user_id"` DisplayUserID string `json:"display_user_id"` Status string `json:"status"` DefaultDisplayUserID string `json:"default_display_user_id"` DisplayUserIDKind string `json:"display_user_id_kind"` DisplayUserIDExpiresAtMs int64 `json:"display_user_id_expires_at_ms"` LeaseID string `json:"lease_id,omitempty"` } // getMyIdentity 返回当前登录用户的短号状态。 func (h *Handler) getMyIdentity(writer http.ResponseWriter, request *http.Request) { if h.userIdentityClient == nil { writeError(writer, request, http.StatusBadGateway, codeUpstreamError, "upstream service error") return } resp, err := h.userIdentityClient.GetUserIdentity(request.Context(), &userv1.GetUserIdentityRequest{ Meta: authRequestMeta(request, ""), UserId: auth.UserIDFromContext(request.Context()), }) if err != nil { writeRPCError(writer, request, err) return } writeOK(writer, request, identityData(resp.GetIdentity(), "")) } // resolveDisplayUserID 通过当前有效展示号解析用户。 func (h *Handler) resolveDisplayUserID(writer http.ResponseWriter, request *http.Request) { if h.userIdentityClient == nil { writeError(writer, request, http.StatusBadGateway, codeUpstreamError, "upstream service error") return } displayUserID := strings.TrimPrefix(request.URL.Path, apiV1Prefix+"/users/by-display-user-id/") resp, err := h.userIdentityClient.ResolveDisplayUserID(request.Context(), &userv1.ResolveDisplayUserIDRequest{ Meta: authRequestMeta(request, ""), DisplayUserId: displayUserID, }) if err != nil { writeRPCError(writer, request, err) return } writeOK(writer, request, identityData(resp.GetIdentity(), "")) } // changeMyDisplayUserID 修改当前登录用户的默认短号。 func (h *Handler) changeMyDisplayUserID(writer http.ResponseWriter, request *http.Request) { var body struct { NewDisplayUserID string `json:"new_display_user_id"` Reason string `json:"reason"` } if !decode(writer, request, &body) { return } if h.userIdentityClient == nil { writeError(writer, request, http.StatusBadGateway, codeUpstreamError, "upstream service error") return } resp, err := h.userIdentityClient.ChangeDisplayUserID(request.Context(), &userv1.ChangeDisplayUserIDRequest{ Meta: authRequestMeta(request, ""), UserId: auth.UserIDFromContext(request.Context()), NewDisplayUserId: body.NewDisplayUserID, Reason: body.Reason, OperatorUserId: auth.UserIDFromContext(request.Context()), }) if err != nil { writeRPCError(writer, request, err) return } writeOK(writer, request, identityData(resp.GetIdentity(), "")) } // applyMyPrettyDisplayUserID 为当前登录用户申请临时靓号。 func (h *Handler) applyMyPrettyDisplayUserID(writer http.ResponseWriter, request *http.Request) { var body struct { PrettyDisplayUserID string `json:"pretty_display_user_id"` LeaseDurationMs int64 `json:"lease_duration_ms"` PaymentReceiptID string `json:"payment_receipt_id"` } if !decode(writer, request, &body) { return } if h.userIdentityClient == nil { writeError(writer, request, http.StatusBadGateway, codeUpstreamError, "upstream service error") return } resp, err := h.userIdentityClient.ApplyPrettyDisplayUserID(request.Context(), &userv1.ApplyPrettyDisplayUserIDRequest{ Meta: authRequestMeta(request, ""), UserId: auth.UserIDFromContext(request.Context()), PrettyDisplayUserId: body.PrettyDisplayUserID, LeaseDurationMs: body.LeaseDurationMs, PaymentReceiptId: body.PaymentReceiptID, }) if err != nil { writeRPCError(writer, request, err) return } writeOK(writer, request, identityData(resp.GetIdentity(), resp.GetLeaseId())) } func identityData(identity *userv1.UserIdentity, leaseID string) userIdentityData { if identity == nil { return userIdentityData{LeaseID: leaseID} } return userIdentityData{ UserID: identity.GetUserId(), DisplayUserID: identity.GetDisplayUserId(), Status: identity.GetStatus(), DefaultDisplayUserID: identity.GetDefaultDisplayUserId(), DisplayUserIDKind: identity.GetDisplayUserIdKind(), DisplayUserIDExpiresAtMs: identity.GetDisplayUserIdExpiresAtMs(), LeaseID: leaseID, } }