update: add new logic for push token

This commit is contained in:
mahyargdz
2025-07-28 12:35:18 +03:30
parent 1f932e6f7e
commit b683633e48
11 changed files with 427 additions and 21 deletions
@@ -15,6 +15,7 @@ import { UserSettingsService } from "../../settings/services/user-settings.servi
import { Template } from "../../templates/entities/template.entity";
import { PasswordService } from "../../utils/services/password.service";
import { CreateEmailUserDto } from "../DTO/create-email-user.dto";
import { AddPushTokenDto, RemovePushTokenDto } from "../DTO/manage-push-token.dto";
import { UpdateEmailUserDto } from "../DTO/update-email-user.dto";
import { UpdateUserProfileDto } from "../DTO/update-user-profile.dto";
import { UserListQueryDto } from "../DTO/user-list-query.dto";
@@ -92,6 +93,85 @@ export class UsersService {
}
/*******************************/
async addPushToken(userId: string, addPushTokenDto: AddPushTokenDto) {
const user = await this.userRepository.findOne({ id: userId, deletedAt: null });
if (!user) throw new BadRequestException(UserMessage.USER_NOT_FOUND);
if (!user.pushTokens) {
user.pushTokens = [];
}
if (!user.pushTokens.includes(addPushTokenDto.pushToken)) {
user.pushTokens.push(addPushTokenDto.pushToken);
await this.em.flush();
this.logger.log(`Push token added for user ${userId}. Total tokens: ${user.pushTokens.length}`);
}
return {
message: UserMessage.PUSH_TOKEN_ADDED_SUCCESSFULLY,
totalTokens: user.pushTokens.length,
};
}
/*******************************/
async removePushToken(userId: string, removePushTokenDto: RemovePushTokenDto) {
const user = await this.userRepository.findOne({ id: userId, deletedAt: null });
if (!user) throw new BadRequestException(UserMessage.USER_NOT_FOUND);
if (!user.pushTokens || user.pushTokens.length === 0) {
throw new BadRequestException(UserMessage.NO_PUSH_TOKENS_FOUND);
}
const initialLength = user.pushTokens.length;
user.pushTokens = user.pushTokens.filter((token) => token !== removePushTokenDto.pushToken);
if (user.pushTokens.length === initialLength) {
throw new BadRequestException(UserMessage.PUSH_TOKEN_NOT_FOUND);
}
await this.em.flush();
this.logger.log(`Push token removed for user ${userId}. Remaining tokens: ${user.pushTokens.length}`);
return {
message: UserMessage.PUSH_TOKEN_REMOVED_SUCCESSFULLY,
totalTokens: user.pushTokens.length,
};
}
/*******************************/
async getPushTokens(userId: string) {
const user = await this.userRepository.findOne({ id: userId, deletedAt: null });
if (!user) throw new BadRequestException(UserMessage.USER_NOT_FOUND);
return {
pushTokens: user.pushTokens || [],
totalTokens: user.pushTokens?.length || 0,
};
}
/*******************************/
async cleanupInvalidPushTokens(userId: string, invalidTokens: string[]) {
if (!invalidTokens || invalidTokens.length === 0) return;
const user = await this.userRepository.findOne({ id: userId, deletedAt: null });
if (!user || !user.pushTokens) return;
const initialLength = user.pushTokens.length;
user.pushTokens = user.pushTokens.filter((token) => !invalidTokens.includes(token));
if (user.pushTokens.length !== initialLength) {
await this.em.flush();
this.logger.log(`Cleaned up ${initialLength - user.pushTokens.length} invalid push tokens for user ${userId}`);
}
}
/*******************************/
async findOneByIdWithEntityManager(id: string, em: EntityManager) {
const user = await em.findOne(User, { id }, { populate: ["role"] });
if (!user) throw new BadRequestException(UserMessage.USER_NOT_FOUND);