diff --git a/backend/gateway/cmd/main.go b/backend/gateway/cmd/main.go index 4e5ad5e..d946cdf 100644 --- a/backend/gateway/cmd/main.go +++ b/backend/gateway/cmd/main.go @@ -19,10 +19,6 @@ func main() { log.Fatalf("Failed to load config: %v", err) } - // 创建 WebSocket Hub - hub := ws.NewHub() - go hub.Run() - // 初始化用户服务 userService, err := service.NewUserService(cfg) if err != nil { @@ -30,6 +26,10 @@ func main() { } logger.Info("User service initialized successfully") + // 创建 WebSocket Hub + hub := ws.NewHub(userService) + go hub.Run() + // 创建路由器 r := router.NewRouter(hub, userService) @@ -38,7 +38,6 @@ func main() { log.Printf("Gateway service starting on %s", serverAddr) log.Printf("WebSocket endpoint: ws://localhost%s/ws", serverAddr) log.Printf("Health check: http://localhost%s/health", serverAddr) - log.Printf("User register endpoint: http://localhost%s/api/user/register", serverAddr) if err := http.ListenAndServe(serverAddr, r.SetupRoutes()); err != nil { log.Fatalf("Failed to start server: %v", err) diff --git a/backend/gateway/internal/router/router.go b/backend/gateway/internal/router/router.go index f67cc3f..dc48fa3 100644 --- a/backend/gateway/internal/router/router.go +++ b/backend/gateway/internal/router/router.go @@ -41,64 +41,10 @@ func (r *Router) SetupRoutes() http.Handler { // 健康检查 mux.HandleFunc("/health", r.handleHealth) - // 用户注册 - mux.HandleFunc("/api/user/register", r.handleRegister) - return mux } -// 注册请求结构 -type registerRequest struct { - Account string `json:"account"` - Password string `json:"password"` -} -// 注册响应结构 -type registerResponse struct { - UserID string `json:"user_id"` - Account string `json:"account"` - Message string `json:"message"` - Code int `json:"code"` -} - -// handleRegister 处理用户注册请求 -func (r *Router) handleRegister(w http.ResponseWriter, req *http.Request) { - if req.Method != http.MethodPost { - w.WriteHeader(http.StatusMethodNotAllowed) - w.Write([]byte(`{"code": 405, "message": "Method not allowed"}`)) - return - } - - // 解析请求体 - var registerReq registerRequest - if err := json.NewDecoder(req.Body).Decode(®isterReq); err != nil { - w.WriteHeader(http.StatusBadRequest) - w.Write([]byte(`{"code": 400, "message": "Invalid request body"}`)) - return - } - - // 调用用户服务注册 - resp, err := r.userService.Register(req.Context(), registerReq.Account, registerReq.Password) - if err != nil { - log.Printf("Register failed: %v", err) - w.WriteHeader(http.StatusInternalServerError) - w.Write([]byte(`{"code": 500, "message": "Internal server error"}`)) - return - } - - // 构造响应 - response := registerResponse{ - UserID: resp.UserId, - Account: resp.Account, - Message: resp.Response.Message, - Code: int(resp.Response.Code), - } - - // 返回响应 - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - json.NewEncoder(w).Encode(response) -} func (r *Router) handleWebSocket(w http.ResponseWriter, req *http.Request) { conn, err := upgrader.Upgrade(w, req, nil) diff --git a/backend/gateway/internal/ws/client.go b/backend/gateway/internal/ws/client.go index 036d5dc..c7a621c 100644 --- a/backend/gateway/internal/ws/client.go +++ b/backend/gateway/internal/ws/client.go @@ -133,7 +133,64 @@ func (c *Client) handleCommand(msg *Message) { // 这里可以根据命令类型执行不同的操作 log.Printf("Received command: %v", msg.Data) - // 示例:回复命令执行结果 + // 检查是否是注册命令 + if cmdData, ok := msg.Data.(map[string]interface{}); ok { + if cmdType, ok := cmdData["type"].(string); ok && cmdType == "register" { + // 提取注册信息 + account, accountOk := cmdData["account"].(string) + password, passwordOk := cmdData["password"].(string) + + if !accountOk || !passwordOk { + // 回复错误信息 + errorResponse := &Message{ + Type: MessageTypeError, + Content: "Invalid register command: missing account or password", + } + c.send <- errorResponse + return + } + + // 调用用户服务注册 + if c.hub.userService != nil { + // 异步调用用户服务注册 + go func() { + resp, err := c.hub.userService.Register(nil, account, password) + if err != nil { + // 回复错误信息 + errorResponse := &Message{ + Type: MessageTypeError, + Content: "Register failed: " + err.Error(), + } + c.send <- errorResponse + return + } + + // 回复成功信息 + successResponse := &Message{ + Type: MessageTypeText, + Content: "Register successful", + Data: map[string]interface{}{ + "user_id": resp.UserId, + "account": resp.Account, + "message": resp.Response.Message, + "code": resp.Response.Code, + }, + } + c.send <- successResponse + }() + } else { + // 回复错误信息 + errorResponse := &Message{ + Type: MessageTypeError, + Content: "User service not available", + } + c.send <- errorResponse + } + return + } + } + + // 其他命令处理 response := &Message{ Type: MessageTypeText, Content: "Command executed successfully", diff --git a/backend/gateway/internal/ws/hub.go b/backend/gateway/internal/ws/hub.go index 5a4ddd3..ba0ce22 100644 --- a/backend/gateway/internal/ws/hub.go +++ b/backend/gateway/internal/ws/hub.go @@ -2,6 +2,8 @@ package ws import ( "log" + + "backend/gateway/internal/service" ) type Hub struct { @@ -16,14 +18,18 @@ type Hub struct { // 注销请求 unregister chan *Client + + // 用户服务 + userService *service.UserService } -func NewHub() *Hub { +func NewHub(userService *service.UserService) *Hub { return &Hub{ - broadcast: make(chan *Message), - register: make(chan *Client), - unregister: make(chan *Client), - clients: make(map[*Client]bool), + broadcast: make(chan *Message), + register: make(chan *Client), + unregister: make(chan *Client), + clients: make(map[*Client]bool), + userService: userService, } }