feat(push): 新增设备推送和测试功能

- 新增基于设备令牌的推送通知接口
- 添加推送测试服务,支持应用启动时自动测试
- 新增推送测试文档说明
- 更新 APNS 配置和日志记录
- 迁移至 apns2 库的 PushType 枚举
- 替换订阅密钥文件
- 添加项目规则文档
This commit is contained in:
richarjiang
2025-10-15 19:09:51 +08:00
parent 38dd740c8c
commit cc83b84c80
20 changed files with 728 additions and 37 deletions

View File

@@ -20,12 +20,11 @@ export class PushTokenService {
*/
async registerToken(tokenData: RegisterDeviceTokenDto, userId?: string): Promise<UserPushToken> {
try {
this.logger.log(`Registering push token for user ${userId}`);
this.logger.log(`Registering push token for device ${tokenData.deviceToken}`);
// 检查是否已存在相同的令牌
const existingToken = await this.pushTokenModel.findOne({
where: {
userId,
deviceToken: tokenData.deviceToken,
},
});
@@ -41,7 +40,7 @@ export class PushTokenService {
lastUsedAt: new Date(),
});
this.logger.log(`Updated existing push token for user ${userId}`);
this.logger.log(`Updated existing push token for device ${tokenData.deviceToken}`);
return existingToken;
}
@@ -58,10 +57,10 @@ export class PushTokenService {
lastUsedAt: new Date(),
});
this.logger.log(`Successfully registered new push token for user ${userId}`);
this.logger.log(`Successfully registered new push token for device ${tokenData.deviceToken}`);
return newToken;
} catch (error) {
this.logger.error(`Failed to register push token for user ${userId}: ${error.message}`, error);
this.logger.error(`Failed to register push token for device ${tokenData.deviceToken}: ${error.message}`, error);
throw error;
}
}
@@ -322,4 +321,34 @@ export class PushTokenService {
this.logger.error(`Failed to update last used time: ${error.message}`, error);
}
}
/**
* 直接停用设备令牌不需要用户ID
*/
async deactivateToken(deviceToken: string): Promise<void> {
try {
this.logger.log(`Deactivating push token: ${deviceToken}`);
const token = await this.pushTokenModel.findOne({
where: {
deviceToken,
isActive: true,
},
});
if (!token) {
this.logger.warn(`Device token not found or already inactive: ${deviceToken}`);
return;
}
await token.update({
isActive: false,
});
this.logger.log(`Successfully deactivated push token: ${deviceToken}`);
} catch (error) {
this.logger.error(`Failed to deactivate push token: ${deviceToken}: ${error.message}`, error);
throw error;
}
}
}