AdelieStack/src/lib/server/api/iam/iam.controller.ts

66 lines
3.5 KiB
TypeScript
Raw Normal View History

2025-01-05 05:13:36 +00:00
import { resetPasswordCodeDto, resetPasswordEmailDto } from '$lib/dtos/reset-password';
import { zValidator } from '@hono/zod-validator';
2025-01-05 05:13:36 +00:00
import { inject, injectable } from '@needle-di/core';
import { openApi } from 'hono-zod-openapi';
import { createLoginRequestDto } from '../../../dtos/login/create-login-request.dto';
2025-01-05 05:13:36 +00:00
import { loginRequestDto } from '../../../dtos/login/login-request.dto';
import { signinDto } from '../../../dtos/login/signin.dto';
import { verifyLoginRequestDto } from '../../../dtos/login/verify-login-request.dto';
import { Controller } from '../common/factories/controllers.factory';
2025-01-05 05:13:36 +00:00
import { authState } from '../common/middleware/auth.middleware';
import { rateLimit } from '../common/middleware/rate-limit.middleware';
import { LoggerService } from '../common/services/logger.service';
2025-01-05 05:13:36 +00:00
import { LoginRequestsService } from '../iam/login-requests/login-requests.service';
import { SessionsService } from '../iam/sessions/sessions.service';
import { signInEmail } from './login-requests/routes/login.routes';
import { ResetPasswordRequestsService } from './reset-password-requests/reset-password-requests.service';
import { resetPasswordNewPasswordDto } from '$lib/dtos/reset-password/reset-password-new-password.dto';
@injectable()
export class IamController extends Controller {
constructor(
private loggerService = inject(LoggerService),
private loginRequestsService = inject(LoginRequestsService),
2025-01-05 05:13:36 +00:00
private resetPasswordRequestsService = inject(ResetPasswordRequestsService),
private sessionsService = inject(SessionsService),
) {
super();
}
routes() {
return this.controller
.post('/login', openApi(signInEmail), authState('none'), zValidator('json', signinDto), rateLimit({ limit: 3, minutes: 1 }), async (c) => {
2025-01-06 06:27:41 +00:00
this.loggerService.log.info(`Login with identifier: ${c.req.valid('json').identifier}`);
const session = await this.loginRequestsService.login(c.req.valid('json'));
await this.sessionsService.setSessionCookie(session);
return c.json({ message: 'welcome' });
})
.post('/login/request', authState('none'), zValidator('json', createLoginRequestDto), async (c) => {
await this.loginRequestsService.sendVerificationCode(c.req.valid('json'));
return c.json({ message: 'welcome' });
})
.post('/login/verify', authState('none'), zValidator('json', verifyLoginRequestDto), async (c) => {
const session = await this.loginRequestsService.verify(c.req.valid('json'));
await this.sessionsService.setSessionCookie(session);
return c.json({ message: 'welcome' });
})
.post('/logout', async (c) => {
await this.sessionsService.invalidateSession('');
this.sessionsService.deleteSessionCookie();
return c.json({ message: 'logout' });
2025-01-05 05:13:36 +00:00
})
.post("/password/reset", authState('none'), zValidator('json', resetPasswordNewPasswordDto), async (c) => {
await this.resetPasswordRequestsService.resetPassword(c.req.valid('json'));
return c.json({ message: 'welcome' });
})
.post('/password/reset/request', authState('none'), zValidator('json', resetPasswordEmailDto), async (c) => {
await this.resetPasswordRequestsService.sendResetPasswordCode(c.req.valid('json'));
return c.json({ message: 'success' });
})
.post('/password/reset/verify', authState('none'), zValidator('json', resetPasswordCodeDto), async (c) => {
await this.resetPasswordRequestsService.verify(c.req.valid('json'));
return c.json({ message: 'success' });
});
}
}