chore: update gitignore for phase02
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
export class AppError extends Error {
|
||||
constructor(
|
||||
public statusCode: number,
|
||||
message: string,
|
||||
public code?: string,
|
||||
) {
|
||||
super(message);
|
||||
this.name = 'AppError';
|
||||
}
|
||||
|
||||
static badRequest(message: string, code?: string) {
|
||||
return new AppError(400, message, code);
|
||||
}
|
||||
|
||||
static unauthorized(message = 'Unauthorized', code?: string) {
|
||||
return new AppError(401, message, code);
|
||||
}
|
||||
|
||||
static forbidden(message = 'Forbidden', code?: string) {
|
||||
return new AppError(403, message, code);
|
||||
}
|
||||
|
||||
static notFound(message = 'Not found', code?: string) {
|
||||
return new AppError(404, message, code);
|
||||
}
|
||||
|
||||
static conflict(message: string, code?: string) {
|
||||
return new AppError(409, message, code);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
import type { FastifyInstance } from 'fastify';
|
||||
|
||||
export interface AccessTokenPayload {
|
||||
sub: string; // user id
|
||||
email: string;
|
||||
isSuperAdmin: boolean;
|
||||
}
|
||||
|
||||
export interface RefreshTokenPayload {
|
||||
sub: string; // user id
|
||||
type: 'refresh';
|
||||
}
|
||||
|
||||
const ACCESS_TOKEN_EXPIRY = '15m';
|
||||
const REFRESH_TOKEN_EXPIRY = '7d';
|
||||
|
||||
export function signAccessToken(app: FastifyInstance, payload: AccessTokenPayload): string {
|
||||
return app.jwt.sign(payload, { expiresIn: ACCESS_TOKEN_EXPIRY });
|
||||
}
|
||||
|
||||
export function signRefreshToken(app: FastifyInstance, payload: RefreshTokenPayload): string {
|
||||
return (app as any).jwtRefresh.sign(payload, { expiresIn: REFRESH_TOKEN_EXPIRY });
|
||||
}
|
||||
|
||||
export function verifyRefreshToken(app: FastifyInstance, token: string): RefreshTokenPayload {
|
||||
return (app as any).jwtRefresh.verify(token) as RefreshTokenPayload;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import argon2 from 'argon2';
|
||||
|
||||
export async function hashPassword(password: string): Promise<string> {
|
||||
return argon2.hash(password, {
|
||||
type: argon2.argon2id,
|
||||
memoryCost: 65536,
|
||||
timeCost: 3,
|
||||
parallelism: 4,
|
||||
});
|
||||
}
|
||||
|
||||
export async function verifyPassword(hash: string, password: string): Promise<boolean> {
|
||||
return argon2.verify(hash, password);
|
||||
}
|
||||
Reference in New Issue
Block a user