Set up project files and add .gitignore to exclude local build/runtime artifacts. Made-with: Cursor
158 lines
3.8 KiB
Go
158 lines
3.8 KiB
Go
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)
|
||
}
|