Files
backend/internal/handler/push_handler.go
lan 4d8f2ec997 Initial backend repository commit.
Set up project files and add .gitignore to exclude local build/runtime artifacts.

Made-with: Cursor
2026-03-09 21:28:58 +08:00

158 lines
3.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
}