package handler import ( "carrot_bbs/internal/dto" "carrot_bbs/internal/model" "carrot_bbs/internal/pkg/response" "carrot_bbs/internal/service" "github.com/gin-gonic/gin" ) // PushHandler 推送处理器 type PushHandler struct { pushService service.PushService } // NewPushHandler 创建推送处理器 func NewPushHandler(pushService service.PushService) *PushHandler { return &PushHandler{ pushService: pushService, } } // RegisterDevice 注册设备 // POST /api/v1/push/devices func (h *PushHandler) RegisterDevice(c *gin.Context) { userID := c.GetString("user_id") if userID == "" { response.Unauthorized(c, "") return } var req dto.RegisterDeviceRequest if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, err.Error()) return } // 验证设备类型 deviceType := model.DeviceType(req.DeviceType) if !isValidDeviceType(deviceType) { response.BadRequest(c, "invalid device type") return } err := h.pushService.RegisterDevice(c.Request.Context(), userID, req.DeviceID, deviceType, req.PushToken) if err != nil { response.InternalServerError(c, "failed to register device") return } response.SuccessWithMessage(c, "device registered successfully", nil) } // UnregisterDevice 注销设备 // DELETE /api/v1/push/devices/:device_id func (h *PushHandler) UnregisterDevice(c *gin.Context) { userID := c.GetString("user_id") if userID == "" { response.Unauthorized(c, "") return } deviceID := c.Param("device_id") if deviceID == "" { response.BadRequest(c, "device_id is required") return } err := h.pushService.UnregisterDevice(c.Request.Context(), deviceID) if err != nil { response.InternalServerError(c, "failed to unregister device") return } response.SuccessWithMessage(c, "device unregistered successfully", nil) } // GetMyDevices 获取当前用户的设备列表 // GET /api/v1/push/devices func (h *PushHandler) GetMyDevices(c *gin.Context) { userID := c.GetString("user_id") if userID == "" { response.Unauthorized(c, "") return } // 这里需要从DeviceTokenRepository获取设备列表 // 由于PushService接口没有提供获取设备列表的方法,我们暂时返回空列表 // TODO: 在PushService接口中添加GetUserDevices方法 _ = userID // 避免未使用变量警告 response.Success(c, []*dto.DeviceTokenResponse{}) } // GetPushRecords 获取推送记录 // GET /api/v1/push/records func (h *PushHandler) GetPushRecords(c *gin.Context) { userID := c.GetString("user_id") if userID == "" { response.Unauthorized(c, "") return } records, err := h.pushService.GetPendingPushes(c.Request.Context(), userID) if err != nil { response.InternalServerError(c, "failed to get push records") return } response.Success(c, &dto.PushRecordListResponse{ Records: dto.PushRecordsToResponse(records), Total: int64(len(records)), }) } // 辅助函数:验证设备类型 func isValidDeviceType(deviceType model.DeviceType) bool { switch deviceType { case model.DeviceTypeIOS, model.DeviceTypeAndroid, model.DeviceTypeWeb: return true default: return false } } // UpdateDeviceToken 更新设备推送Token // PUT /api/v1/push/devices/:device_id/token func (h *PushHandler) UpdateDeviceToken(c *gin.Context) { userID := c.GetString("user_id") if userID == "" { response.Unauthorized(c, "") return } deviceID := c.Param("device_id") if deviceID == "" { response.BadRequest(c, "device_id is required") return } var req struct { PushToken string `json:"push_token" binding:"required"` } if err := c.ShouldBindJSON(&req); err != nil { response.BadRequest(c, err.Error()) return } err := h.pushService.UpdateDeviceToken(c.Request.Context(), deviceID, req.PushToken) if err != nil { response.InternalServerError(c, "failed to update device token") return } response.SuccessWithMessage(c, "device token updated successfully", nil) }