feat(admin): add admin endpoint to list user devices with JPush registration IDs
All checks were successful
Build Backend / build (push) Successful in 2m32s
Build Backend / build-docker (push) Successful in 6m22s

- Add AdminDeviceTokenResponse DTO including push_token (RegistrationID) for push debugging
- Add DeviceTokenToAdminResponse and DeviceTokensToAdminResponse converters
- Inject PushService into AdminUserHandler for retrieving user devices
- Register GET /api/v1/admin/users/:id/devices route for querying target user's device tokens
This commit is contained in:
lafay
2026-06-18 20:07:24 +08:00
parent 821e066446
commit cb85c62093
10 changed files with 116 additions and 23 deletions

View File

@@ -18,6 +18,10 @@ type DeviceTokenRepository interface {
GetActiveByUserID(userID string) ([]*model.DeviceToken, error)
GetByDeviceID(deviceID string) (*model.DeviceToken, error)
GetByPushToken(pushToken string) (*model.DeviceToken, error)
// DeactivateByPushToken 失效指定 pushToken 的所有记录
// 用于处理同设备多账号场景registration_id 是设备级标识,
// 当新账号在同一设备注册时,需失效旧账号对该 pushToken 的关联,避免跨账号误推
DeactivateByPushToken(pushToken string) error
DeactivateAllExcept(userID int64, deviceID string) error
Upsert(token *model.DeviceToken) error
UpdateLastUsed(deviceID string) error
@@ -104,6 +108,15 @@ func (r *deviceTokenRepository) GetByPushToken(pushToken string) (*model.DeviceT
return &token, nil
}
// DeactivateByPushToken 失效指定 pushToken 的所有记录
// registration_idpushToken是设备级标识同一物理设备登录不同账号时 pushToken 不变。
// 失效旧关联可防止给账号 A 推送时,同设备的账号 B 也收到通知。
func (r *deviceTokenRepository) DeactivateByPushToken(pushToken string) error {
return r.db.Model(&model.DeviceToken{}).
Where("push_token = ?", pushToken).
Update("is_active", false).Error
}
// DeactivateAllExcept 登出其他设备(停用除指定设备外的所有设备)
func (r *deviceTokenRepository) DeactivateAllExcept(userID int64, deviceID string) error {
return r.db.Model(&model.DeviceToken{}).