fix: join address to the customer get by admin

This commit is contained in:
mahyargdz
2025-03-06 10:35:12 +03:30
parent b92a65c22c
commit 144bfb2ac1
12 changed files with 257 additions and 75 deletions
+62 -32
View File
@@ -1,53 +1,83 @@
import { Injectable } from "@nestjs/common";
import { Injectable, UnauthorizedException } from "@nestjs/common";
import { ConfigService } from "@nestjs/config";
import { JwtService } from "@nestjs/jwt";
import dayjs from "dayjs";
import { AuthMessage } from "../../../common/enums/message.enum";
import { User } from "../../users/entities/user.entity";
import { UsersService } from "../../users/providers/users.service";
import { RefreshTokensRepository } from "../../users/repositories/refresh-token.repository";
import { ITokenPayload } from "../interfaces/IToken-payload";
// import { UserRepository } from "../users/providers/users.repository";
@Injectable()
export class TokensService {
constructor(
private readonly configService: ConfigService,
private readonly jwtService: JwtService,
// private readonly userRepository: UserRepository,
private readonly refreshTokensRepository: RefreshTokensRepository,
private readonly usersService: UsersService,
) {}
// ----------- generate token -----------------
generateAccessAndRefreshToken(payload: ITokenPayload) {
const access_expire = this.configService.getOrThrow<number>("ACCESS_TOKEN_EXPIRE");
const refresh_expire = this.configService.getOrThrow<number>("REFRESH_TOKEN_EXPIRE");
const accessToken = this.jwtService.sign(payload, { expiresIn: `${access_expire}h` });
async generateTokens(user: User) {
return this.generateAccessAndRefreshToken({
id: user.id,
isAdmin: user.roles.some((r) => r.isAdmin),
permissions: user.roles.flatMap((r) => (r?.permissions?.length ? r.permissions.map((p) => p.name) : [])),
});
}
const refreshToken = this.jwtService.sign(payload, { expiresIn: `${refresh_expire}d` });
//**************************************************************** */
private async generateAccessAndRefreshToken(payload: ITokenPayload) {
const accessExpire = this.configService.getOrThrow<number>("ACCESS_TOKEN_EXPIRE");
const refreshExpire = this.configService.getOrThrow<number>("REFRESH_TOKEN_EXPIRE");
const accessToken = this.jwtService.sign(payload, { expiresIn: `${accessExpire}h` });
const refreshToken = this.jwtService.sign(payload, { expiresIn: `${refreshExpire}d` });
await this.storeRefreshToken(payload.id, refreshToken);
return {
accessToken: { token: accessToken, expire: Date.now() + 1000 * 60 * 60 * access_expire },
refreshToken: { token: refreshToken, expire: Date.now() + 1000 * 60 * 60 * 24 * refresh_expire },
accessToken: { token: accessToken, expire: Date.now() + 1000 * 60 * 60 * accessExpire },
refreshToken: { token: refreshToken, expire: Date.now() + 1000 * 60 * 60 * 24 * refreshExpire },
};
}
//****************************** */
// validateRefreshToken(token: string) {
// const { sub } = this.verifyToken(token, "refresh");
// return this.generateAccessAndRefreshToken({ sub: sub });
// }
//**************************************************************** */
async storeRefreshToken(userId: string, refreshToken: string) {
const refreshExpire = this.configService.getOrThrow<number>("REFRESH_TOKEN_EXPIRE");
// verifyToken(token: string, type: "access" | "refresh"): ITokenPayload {
// try {
// if (type === "access") {
// return this.jwtService.verify(token, {
// secret: process.env.ACCESS_TOKEN_SECRET,
// ignoreExpiration: false,
// });
// } else if (type === "refresh") {
// return this.jwtService.verify(token, {
// secret: process.env.REFRESH_TOKEN_SECRET,
// ignoreExpiration: false,
// });
// } else throw new Error("Invalid token type => access / refresh");
// } catch {
// throw new HttpException(AuthMessage.LoginAgain, HttpStatus.UNAUTHORIZED);
// }
// }
const expiresAt = dayjs().add(refreshExpire, "day").toDate();
const token = this.refreshTokensRepository.create({
token: refreshToken,
user: { id: userId },
expiresAt,
});
await this.refreshTokensRepository.save(token);
}
/************************************************************ */
async refreshToken(oldRefreshToken: string) {
const token = await this.refreshTokensRepository.findOne({ where: { token: oldRefreshToken }, relations: { user: true } });
if (!token) throw new UnauthorizedException(AuthMessage.INVALID_REFRESH_TOKEN);
if (dayjs(token.expiresAt).isBefore(dayjs())) throw new UnauthorizedException(AuthMessage.REFRESH_TOKEN_EXPIRED);
const { user } = await this.usersService.findOneById(token.user.id);
await this.refreshTokensRepository.delete({ id: token.id });
return await this.generateTokens(user);
}
/************************************************************ */
async invalidateRefreshToken(oldRefreshToken: string) {
const token = await this.refreshTokensRepository.findOne({ where: { token: oldRefreshToken }, relations: { user: true } });
if (token) await this.refreshTokensRepository.delete({ id: token.id });
}
}