chore: get announcements for user that buy service
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
import { Body, Controller, Get, Param, Post, Query } from "@nestjs/common";
|
import { Body, Controller, Get, Param, Post, Query } from "@nestjs/common";
|
||||||
import { ApiProperty, ApiTags } from "@nestjs/swagger";
|
import { ApiProperty, ApiTags } from "@nestjs/swagger";
|
||||||
|
|
||||||
import { AnnouncementService } from "./announcement.service";
|
|
||||||
import { CreateAnnouncementDto } from "./DTO/create-announcement.dto";
|
import { CreateAnnouncementDto } from "./DTO/create-announcement.dto";
|
||||||
|
import { AnnouncementService } from "./providers/announcement.service";
|
||||||
import { AuthGuards } from "../../common/decorators/auth-guard.decorator";
|
import { AuthGuards } from "../../common/decorators/auth-guard.decorator";
|
||||||
import { PermissionsDec } from "../../common/decorators/permission.decorator";
|
import { PermissionsDec } from "../../common/decorators/permission.decorator";
|
||||||
import { UserDec } from "../../common/decorators/user.decorator";
|
import { UserDec } from "../../common/decorators/user.decorator";
|
||||||
@@ -17,6 +17,7 @@ export class AnnouncementController {
|
|||||||
constructor(private readonly announcementService: AnnouncementService) {}
|
constructor(private readonly announcementService: AnnouncementService) {}
|
||||||
|
|
||||||
@AuthGuards()
|
@AuthGuards()
|
||||||
|
@PermissionsDec(PermissionEnum.ANNOUNCEMENTS)
|
||||||
@ApiProperty({ description: "Create a new announcement ===> login as admin" })
|
@ApiProperty({ description: "Create a new announcement ===> login as admin" })
|
||||||
@Post()
|
@Post()
|
||||||
async create(@Body() createAnnouncementDto: CreateAnnouncementDto) {
|
async create(@Body() createAnnouncementDto: CreateAnnouncementDto) {
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ import { Module } from "@nestjs/common";
|
|||||||
import { TypeOrmModule } from "@nestjs/typeorm";
|
import { TypeOrmModule } from "@nestjs/typeorm";
|
||||||
|
|
||||||
import { AnnouncementController } from "./announcement.controller";
|
import { AnnouncementController } from "./announcement.controller";
|
||||||
import { AnnouncementService } from "./announcement.service";
|
|
||||||
import { Announcement } from "./entities/announcement.entity";
|
import { Announcement } from "./entities/announcement.entity";
|
||||||
|
import { AnnouncementService } from "./providers/announcement.service";
|
||||||
import { AnnouncementRepository } from "./repositories/announcement.repository";
|
import { AnnouncementRepository } from "./repositories/announcement.repository";
|
||||||
import { DanakServicesModule } from "../danak-services/danak-services.module";
|
import { DanakServicesModule } from "../danak-services/danak-services.module";
|
||||||
import { UsersModule } from "../users/users.module";
|
import { UsersModule } from "../users/users.module";
|
||||||
|
|||||||
+86
-15
@@ -1,13 +1,13 @@
|
|||||||
import { BadRequestException, Injectable } from "@nestjs/common";
|
import { BadRequestException, Injectable } from "@nestjs/common";
|
||||||
|
|
||||||
import { CreateAnnouncementDto } from "./DTO/create-announcement.dto";
|
import { AnnouncementMessage, CommonMessage } from "../../../common/enums/message.enum";
|
||||||
import { SearchAnnouncementQueryDto } from "./DTO/search-announcement-query.dto";
|
import { DanakServicesService } from "../../danak-services/providers/danak-services.service";
|
||||||
import { AnnouncementRepository } from "./repositories/announcement.repository";
|
import { UsersService } from "../../users/providers/users.service";
|
||||||
import { UserAnnouncementRepository } from "./repositories/user-announcement.repository";
|
import { PaginationUtils } from "../../utils/providers/pagination.utils";
|
||||||
import { AnnouncementMessage, CommonMessage } from "../../common/enums/message.enum";
|
import { CreateAnnouncementDto } from "../DTO/create-announcement.dto";
|
||||||
import { DanakServicesService } from "../danak-services/providers/danak-services.service";
|
import { SearchAnnouncementQueryDto } from "../DTO/search-announcement-query.dto";
|
||||||
import { UsersService } from "../users/providers/users.service";
|
import { AnnouncementRepository } from "../repositories/announcement.repository";
|
||||||
import { PaginationUtils } from "../utils/providers/pagination.utils";
|
import { UserAnnouncementRepository } from "../repositories/user-announcement.repository";
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class AnnouncementService {
|
export class AnnouncementService {
|
||||||
@@ -18,6 +18,7 @@ export class AnnouncementService {
|
|||||||
private readonly usersService: UsersService,
|
private readonly usersService: UsersService,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
|
/***************************************** */
|
||||||
async createAnnouncement(createAnnouncementDto: CreateAnnouncementDto) {
|
async createAnnouncement(createAnnouncementDto: CreateAnnouncementDto) {
|
||||||
let service;
|
let service;
|
||||||
let groups;
|
let groups;
|
||||||
@@ -40,6 +41,8 @@ export class AnnouncementService {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************** */
|
||||||
|
|
||||||
async getAllAnnouncements(queryDto: SearchAnnouncementQueryDto, userId: string) {
|
async getAllAnnouncements(queryDto: SearchAnnouncementQueryDto, userId: string) {
|
||||||
const { limit, skip } = PaginationUtils(queryDto);
|
const { limit, skip } = PaginationUtils(queryDto);
|
||||||
|
|
||||||
@@ -70,18 +73,81 @@ export class AnnouncementService {
|
|||||||
return { announcements, count, paginate: true };
|
return { announcements, count, paginate: true };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************** */
|
||||||
|
|
||||||
|
// async getAllAnnouncementsByUser(queryDto: SearchAnnouncementQueryDto, userId: string) {
|
||||||
|
// const { limit, skip } = PaginationUtils(queryDto);
|
||||||
|
// const queryBuilder = this.announcementRepository
|
||||||
|
// .createQueryBuilder("announcement")
|
||||||
|
// .leftJoin("announcement.service", "danak_service")
|
||||||
|
// .addSelect(["danak_service.id", "danak_service.name"])
|
||||||
|
// .leftJoin("announcement.targetGroups", "group")
|
||||||
|
// .addSelect(["group.id", "group.name"])
|
||||||
|
// .leftJoin("group.users", "groupUser")
|
||||||
|
// .leftJoinAndSelect("announcement.userAnnouncements", "userAnnouncements", "userAnnouncements.userId = :userId", { userId })
|
||||||
|
// .where("announcement.isPublic = :isPublic", { isPublic: true }) // Check if the announcement is public
|
||||||
|
// .orWhere("groupUser.id = :userId", { userId });
|
||||||
|
|
||||||
|
// if (queryDto.since) {
|
||||||
|
// queryBuilder.andWhere("announcement.createdAt >= :since", { since: queryDto.since });
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (queryDto.publishAt) {
|
||||||
|
// queryBuilder.andWhere("announcement.publishAt >= :publishAt", { publishAt: queryDto.publishAt });
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (queryDto.q) {
|
||||||
|
// queryBuilder.andWhere("announcement.title LIKE :q", { q: `%${queryDto.q}%` });
|
||||||
|
// }
|
||||||
|
|
||||||
|
// queryBuilder.orderBy("announcement.createdAt", "DESC");
|
||||||
|
// const rawResults = await queryBuilder.getRawMany();
|
||||||
|
|
||||||
|
// const [, count] = await queryBuilder.skip(skip).take(limit).getManyAndCount();
|
||||||
|
|
||||||
|
// const announcements = rawResults.map((raw) => ({
|
||||||
|
// id: raw.announcement_id,
|
||||||
|
// createdAt: raw.announcement_createdAt,
|
||||||
|
// updatedAt: raw.announcement_updatedAt,
|
||||||
|
// title: raw.announcement_title,
|
||||||
|
// content: raw.announcement_content,
|
||||||
|
// publishAt: raw.announcement_publishAt,
|
||||||
|
// service: {
|
||||||
|
// id: raw.danak_service_id,
|
||||||
|
// name: raw.danak_service_name,
|
||||||
|
// },
|
||||||
|
// isImportant: raw.announcement_isImportant,
|
||||||
|
// targetGroups: raw.group_id ? [{ id: raw.group_id, name: raw.group_name }] : [],
|
||||||
|
// isPublic: raw.announcement_isPublic,
|
||||||
|
// isRead: raw.userAnnouncements_isRead ? true : false,
|
||||||
|
// }));
|
||||||
|
|
||||||
|
// return { announcements, count, paginate: true };
|
||||||
|
// }
|
||||||
|
|
||||||
|
/***************************************** */
|
||||||
|
|
||||||
async getAllAnnouncementsByUser(queryDto: SearchAnnouncementQueryDto, userId: string) {
|
async getAllAnnouncementsByUser(queryDto: SearchAnnouncementQueryDto, userId: string) {
|
||||||
const { limit, skip } = PaginationUtils(queryDto);
|
const { limit, skip } = PaginationUtils(queryDto);
|
||||||
|
|
||||||
const queryBuilder = this.announcementRepository
|
const queryBuilder = this.announcementRepository
|
||||||
.createQueryBuilder("announcement")
|
.createQueryBuilder("announcement")
|
||||||
.leftJoin("announcement.service", "danak_service")
|
.leftJoin("announcement.service", "service")
|
||||||
.addSelect(["danak_service.id", "danak_service.name"])
|
.addSelect(["service.id", "service.name"])
|
||||||
.leftJoin("announcement.targetGroups", "group")
|
.leftJoin("announcement.targetGroups", "group")
|
||||||
.addSelect(["group.id", "group.name"])
|
.addSelect(["group.id", "group.name"])
|
||||||
.leftJoin("group.users", "groupUser")
|
.leftJoin("group.users", "groupUser")
|
||||||
|
.leftJoin("service.subscriptionPlans", "subscriptionPlan")
|
||||||
|
.leftJoin(
|
||||||
|
"UserSubscription",
|
||||||
|
"userSubscription",
|
||||||
|
"userSubscription.planId = subscriptionPlan.id AND userSubscription.userId = :userId",
|
||||||
|
{ userId },
|
||||||
|
)
|
||||||
.leftJoinAndSelect("announcement.userAnnouncements", "userAnnouncements", "userAnnouncements.userId = :userId", { userId })
|
.leftJoinAndSelect("announcement.userAnnouncements", "userAnnouncements", "userAnnouncements.userId = :userId", { userId })
|
||||||
.where("announcement.isPublic = :isPublic", { isPublic: true }) // Check if the announcement is public
|
.where("announcement.isPublic = :isPublic", { isPublic: true })
|
||||||
.orWhere("groupUser.id = :userId", { userId });
|
.orWhere("groupUser.id = :userId", { userId })
|
||||||
|
.orWhere("userSubscription.userId = :userId", { userId });
|
||||||
|
|
||||||
if (queryDto.since) {
|
if (queryDto.since) {
|
||||||
queryBuilder.andWhere("announcement.createdAt >= :since", { since: queryDto.since });
|
queryBuilder.andWhere("announcement.createdAt >= :since", { since: queryDto.since });
|
||||||
@@ -97,7 +163,6 @@ export class AnnouncementService {
|
|||||||
|
|
||||||
queryBuilder.orderBy("announcement.createdAt", "DESC");
|
queryBuilder.orderBy("announcement.createdAt", "DESC");
|
||||||
const rawResults = await queryBuilder.getRawMany();
|
const rawResults = await queryBuilder.getRawMany();
|
||||||
|
|
||||||
const [, count] = await queryBuilder.skip(skip).take(limit).getManyAndCount();
|
const [, count] = await queryBuilder.skip(skip).take(limit).getManyAndCount();
|
||||||
|
|
||||||
const announcements = rawResults.map((raw) => ({
|
const announcements = rawResults.map((raw) => ({
|
||||||
@@ -108,8 +173,8 @@ export class AnnouncementService {
|
|||||||
content: raw.announcement_content,
|
content: raw.announcement_content,
|
||||||
publishAt: raw.announcement_publishAt,
|
publishAt: raw.announcement_publishAt,
|
||||||
service: {
|
service: {
|
||||||
id: raw.danak_service_id,
|
id: raw.service_id,
|
||||||
name: raw.danak_service_name,
|
name: raw.service_name,
|
||||||
},
|
},
|
||||||
isImportant: raw.announcement_isImportant,
|
isImportant: raw.announcement_isImportant,
|
||||||
targetGroups: raw.group_id ? [{ id: raw.group_id, name: raw.group_name }] : [],
|
targetGroups: raw.group_id ? [{ id: raw.group_id, name: raw.group_name }] : [],
|
||||||
@@ -120,6 +185,8 @@ export class AnnouncementService {
|
|||||||
return { announcements, count, paginate: true };
|
return { announcements, count, paginate: true };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************** */
|
||||||
|
|
||||||
async getOneAnnouncement(id: string, userId: string) {
|
async getOneAnnouncement(id: string, userId: string) {
|
||||||
const announcement = await this.announcementRepository.findOneBy({ id });
|
const announcement = await this.announcementRepository.findOneBy({ id });
|
||||||
if (!announcement) throw new BadRequestException(AnnouncementMessage.NOT_FOUND);
|
if (!announcement) throw new BadRequestException(AnnouncementMessage.NOT_FOUND);
|
||||||
@@ -132,11 +199,15 @@ export class AnnouncementService {
|
|||||||
return { announcement };
|
return { announcement };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************** */
|
||||||
|
|
||||||
async getPublicAnnouncements() {
|
async getPublicAnnouncements() {
|
||||||
const announcements = await this.announcementRepository.find({ where: { isPublic: true }, relations: ["service", "targetGroups"] });
|
const announcements = await this.announcementRepository.find({ where: { isPublic: true }, relations: ["service", "targetGroups"] });
|
||||||
return { announcements };
|
return { announcements };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************** */
|
||||||
|
|
||||||
async getAnnouncementByService(queryDto: SearchAnnouncementQueryDto, serviceId: string) {
|
async getAnnouncementByService(queryDto: SearchAnnouncementQueryDto, serviceId: string) {
|
||||||
const { limit, skip } = PaginationUtils(queryDto);
|
const { limit, skip } = PaginationUtils(queryDto);
|
||||||
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { createHmac } from "node:crypto";
|
import { createHmac } from "node:crypto";
|
||||||
|
|
||||||
import { BadRequestException, Injectable } from "@nestjs/common";
|
import { BadRequestException, Injectable, Logger } from "@nestjs/common";
|
||||||
import { ConfigService } from "@nestjs/config";
|
import { ConfigService } from "@nestjs/config";
|
||||||
import { FastifyReply } from "fastify";
|
import { FastifyReply } from "fastify";
|
||||||
import slugify from "slugify";
|
import slugify from "slugify";
|
||||||
@@ -9,6 +9,7 @@ import { In, Not, QueryRunner } from "typeorm";
|
|||||||
import {
|
import {
|
||||||
AdminMessage,
|
AdminMessage,
|
||||||
AdsMessage,
|
AdsMessage,
|
||||||
|
AuthMessage,
|
||||||
CommonMessage,
|
CommonMessage,
|
||||||
LegalUserMessage,
|
LegalUserMessage,
|
||||||
RealUserMessage,
|
RealUserMessage,
|
||||||
@@ -16,10 +17,14 @@ import {
|
|||||||
} from "../../../common/enums/message.enum";
|
} from "../../../common/enums/message.enum";
|
||||||
import { AddressService } from "../../address/providers/address.service";
|
import { AddressService } from "../../address/providers/address.service";
|
||||||
import { CompleteRegistrationDto } from "../../auth/DTO/complete-register.dto";
|
import { CompleteRegistrationDto } from "../../auth/DTO/complete-register.dto";
|
||||||
|
import { RequestOtpDto } from "../../auth/DTO/request-otp.dto";
|
||||||
|
import { VerifyOtpDto } from "../../auth/DTO/verify-otp.dto";
|
||||||
import { UserSettingsService } from "../../settings/providers/user-settings.service";
|
import { UserSettingsService } from "../../settings/providers/user-settings.service";
|
||||||
import { EmailService } from "../../utils/providers/email.service";
|
import { EmailService } from "../../utils/providers/email.service";
|
||||||
|
import { OTPService } from "../../utils/providers/otp.service";
|
||||||
import { PaginationUtils } from "../../utils/providers/pagination.utils";
|
import { PaginationUtils } from "../../utils/providers/pagination.utils";
|
||||||
import { PasswordService } from "../../utils/providers/password.service";
|
import { PasswordService } from "../../utils/providers/password.service";
|
||||||
|
import { SmsService } from "../../utils/providers/sms.service";
|
||||||
import { WalletsService } from "../../wallets/providers/wallets.service";
|
import { WalletsService } from "../../wallets/providers/wallets.service";
|
||||||
import { CheckValidityDTO } from "../DTO/check-validity.dto";
|
import { CheckValidityDTO } from "../DTO/check-validity.dto";
|
||||||
import { CreateAdminDto } from "../DTO/create-admin.dto";
|
import { CreateAdminDto } from "../DTO/create-admin.dto";
|
||||||
@@ -47,6 +52,7 @@ import { UserRepository } from "../repositories/users.repository";
|
|||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class UsersService {
|
export class UsersService {
|
||||||
|
private readonly logger = new Logger(UsersService.name);
|
||||||
constructor(
|
constructor(
|
||||||
private readonly userRepository: UserRepository,
|
private readonly userRepository: UserRepository,
|
||||||
private readonly userGroupRepository: UserGroupRepository,
|
private readonly userGroupRepository: UserGroupRepository,
|
||||||
@@ -60,6 +66,8 @@ export class UsersService {
|
|||||||
private readonly addressService: AddressService,
|
private readonly addressService: AddressService,
|
||||||
private readonly emailService: EmailService,
|
private readonly emailService: EmailService,
|
||||||
private readonly configService: ConfigService,
|
private readonly configService: ConfigService,
|
||||||
|
private readonly otpService: OTPService,
|
||||||
|
private readonly smsService: SmsService,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
/************************************************************ */
|
/************************************************************ */
|
||||||
@@ -178,6 +186,50 @@ export class UsersService {
|
|||||||
|
|
||||||
/************************************************************ */
|
/************************************************************ */
|
||||||
|
|
||||||
|
async updatePhone(userId: string, requestOtpDto: RequestOtpDto) {
|
||||||
|
const { phone } = requestOtpDto;
|
||||||
|
const user = await this.userRepository.findOneBy({ id: userId });
|
||||||
|
if (!user) throw new BadRequestException(UserMessage.USER_NOT_FOUND);
|
||||||
|
|
||||||
|
const existPhone = await this.userRepository.findOneBy({ phone });
|
||||||
|
if (existPhone) throw new BadRequestException(UserMessage.PHONE_EXIST);
|
||||||
|
|
||||||
|
const existCode = await this.otpService.checkExistOtp(phone, "LOGIN");
|
||||||
|
if (existCode) {
|
||||||
|
return {
|
||||||
|
message: AuthMessage.OTP_ALREADY_SENT,
|
||||||
|
ttlSecond: existCode,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const otpCode = await this.otpService.generateAndSetInCache(phone, "LOGIN");
|
||||||
|
//
|
||||||
|
await this.smsService.sendSmsVerifyCode(phone, otpCode);
|
||||||
|
this.logger.debug(`OTP sent to ${phone}: ${otpCode}`);
|
||||||
|
|
||||||
|
return {
|
||||||
|
message: AuthMessage.OTP_SENT,
|
||||||
|
otpCode,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************ */
|
||||||
|
|
||||||
|
async verifyPhone(verifyOtpDto: VerifyOtpDto, userId: string) {
|
||||||
|
const { code, phone } = verifyOtpDto;
|
||||||
|
|
||||||
|
const user = await this.checkUserLoginCredentialWithPhone(phone, code, userId);
|
||||||
|
|
||||||
|
user.phone = phone;
|
||||||
|
await this.userRepository.save(user);
|
||||||
|
|
||||||
|
return {
|
||||||
|
message: CommonMessage.UPDATE_SUCCESS,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************ */
|
||||||
|
|
||||||
async findOneWithEmail(email: string): Promise<User | null> {
|
async findOneWithEmail(email: string): Promise<User | null> {
|
||||||
const user = await this.userRepository.findOneWithEmail(email);
|
const user = await this.userRepository.findOneWithEmail(email);
|
||||||
return user;
|
return user;
|
||||||
@@ -594,4 +646,18 @@ export class UsersService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************ */
|
/************************************************************ */
|
||||||
|
|
||||||
|
private async checkUserLoginCredentialWithPhone(phone: string, otpCode: string, userId: string) {
|
||||||
|
const isValid = await this.otpService.verifyOtp(phone, otpCode, "LOGIN");
|
||||||
|
if (!isValid) throw new BadRequestException(AuthMessage.INVALID_OTP);
|
||||||
|
|
||||||
|
await this.otpService.delOtpFormCache(phone, "LOGIN");
|
||||||
|
|
||||||
|
const user = await this.userRepository.findOneBy({ id: userId });
|
||||||
|
if (!user) throw new BadRequestException(UserMessage.USER_NOT_FOUND);
|
||||||
|
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************ */
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ import { AuthGuards } from "../../common/decorators/auth-guard.decorator";
|
|||||||
import { PermissionsDec } from "../../common/decorators/permission.decorator";
|
import { PermissionsDec } from "../../common/decorators/permission.decorator";
|
||||||
import { UserDec } from "../../common/decorators/user.decorator";
|
import { UserDec } from "../../common/decorators/user.decorator";
|
||||||
import { ParamDto } from "../../common/DTO/param.dto";
|
import { ParamDto } from "../../common/DTO/param.dto";
|
||||||
|
import { RequestOtpDto } from "../auth/DTO/request-otp.dto";
|
||||||
|
import { VerifyOtpDto } from "../auth/DTO/verify-otp.dto";
|
||||||
|
|
||||||
@Controller("users")
|
@Controller("users")
|
||||||
@ApiTags("users")
|
@ApiTags("users")
|
||||||
@@ -54,6 +56,8 @@ export class UsersController {
|
|||||||
return this.usersService.updateProfile(userId, updateProfileDto);
|
return this.usersService.updateProfile(userId, updateProfileDto);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/************************************************************ */
|
||||||
|
|
||||||
@AuthGuards()
|
@AuthGuards()
|
||||||
@ApiOperation({ summary: "Update user email" })
|
@ApiOperation({ summary: "Update user email" })
|
||||||
@Patch("update-email")
|
@Patch("update-email")
|
||||||
@@ -61,6 +65,8 @@ export class UsersController {
|
|||||||
return this.usersService.updateEmail(userId, updateEmailDto);
|
return this.usersService.updateEmail(userId, updateEmailDto);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/************************************************************ */
|
||||||
|
|
||||||
@ApiOperation({ summary: "Verify email" })
|
@ApiOperation({ summary: "Verify email" })
|
||||||
@HttpCode(HttpStatus.PERMANENT_REDIRECT)
|
@HttpCode(HttpStatus.PERMANENT_REDIRECT)
|
||||||
@Get("verify-email")
|
@Get("verify-email")
|
||||||
@@ -70,6 +76,25 @@ export class UsersController {
|
|||||||
|
|
||||||
/************************************************************ */
|
/************************************************************ */
|
||||||
|
|
||||||
|
@AuthGuards()
|
||||||
|
@ApiOperation({ summary: "Update user phone" })
|
||||||
|
@Patch("update-phone")
|
||||||
|
updatePhone(@Body() updateDto: RequestOtpDto, @UserDec("id") userId: string) {
|
||||||
|
return this.usersService.updatePhone(userId, updateDto);
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************ */
|
||||||
|
|
||||||
|
@AuthGuards()
|
||||||
|
@ApiOperation({ summary: "Verify phone" })
|
||||||
|
@HttpCode(HttpStatus.OK)
|
||||||
|
@Patch("verify-phone")
|
||||||
|
verifyPhone(@Body() verifyOtpDto: VerifyOtpDto, @UserDec("id") userId: string) {
|
||||||
|
return this.usersService.verifyPhone(verifyOtpDto, userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************************ */
|
||||||
|
|
||||||
@AuthGuards()
|
@AuthGuards()
|
||||||
@ApiOperation({ summary: "Check validity of user field" })
|
@ApiOperation({ summary: "Check validity of user field" })
|
||||||
@HttpCode(HttpStatus.OK)
|
@HttpCode(HttpStatus.OK)
|
||||||
|
|||||||
Reference in New Issue
Block a user