Initial backend repository commit.
Set up project files and add .gitignore to exclude local build/runtime artifacts. Made-with: Cursor
This commit is contained in:
157
internal/handler/push_handler.go
Normal file
157
internal/handler/push_handler.go
Normal file
@@ -0,0 +1,157 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user