Files
backend/internal/handler/push_handler.go

158 lines
3.8 KiB
Go
Raw Normal View History

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)
}