typescript-express-starter
Version:
Quick and Easy TypeScript Express Starter
45 lines (36 loc) • 1.6 kB
text/typescript
import type { Request, Response, RequestHandler } from 'express';
import { injectable, container } from 'tsyringe';
import type { RequestWithUser } from '@interfaces/auth.interface';
import type { UserCreateData } from '@entities/user.entity';
import { asyncHandler } from '@utils/asyncHandler';
import { AuthService } from '@services/auth.service';
()
export class AuthController {
private readonly authService: AuthService;
constructor() {
this.authService = container.resolve(AuthService);
}
public signUp: RequestHandler = asyncHandler(async (req: Request, res: Response) => {
const userData: UserCreateData = req.body;
const signUpUserData = await this.authService.signup(userData);
res.status(201).json({ data: signUpUserData.toResponse(), message: 'signup' });
});
public logIn: RequestHandler = asyncHandler(async (req: Request, res: Response) => {
const loginData: { email: string; password: string } = req.body;
const { cookie, user } = await this.authService.login(loginData);
res.setHeader('Set-Cookie', [cookie]);
res.status(200).json({ data: user.toResponse(), message: 'login' });
});
public logOut: RequestHandler = asyncHandler(async (req: Request, res: Response) => {
const userReq = req as RequestWithUser;
const user = userReq.user;
await this.authService.logout(user);
res.clearCookie('Authorization', {
httpOnly: true,
path: '/',
sameSite: 'lax',
// secure: true, // 프로덕션에서 HTTPS일 때만
});
res.status(200).json({ message: 'logout' });
});
}