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