2024-08-08 19:38:17 +00:00
|
|
|
import 'reflect-metadata';
|
|
|
|
|
import { Hono } from 'hono';
|
2024-08-15 23:25:41 +00:00
|
|
|
import { setCookie } from 'hono/cookie';
|
2024-08-10 17:03:30 +00:00
|
|
|
import {inject, injectable} from 'tsyringe';
|
2024-08-08 19:38:17 +00:00
|
|
|
import { zValidator } from '@hono/zod-validator';
|
2024-08-15 23:25:41 +00:00
|
|
|
import { TimeSpan } from 'oslo';
|
2024-08-08 19:38:17 +00:00
|
|
|
import type { HonoTypes } from '../types';
|
|
|
|
|
import type { Controller } from '../interfaces/controller.interface';
|
|
|
|
|
import { signupUsernameEmailDto } from "$lib/dtos/signup-username-email.dto";
|
|
|
|
|
import {limiter} from "$lib/server/api/middleware/rate-limiter.middleware";
|
2024-08-10 17:03:30 +00:00
|
|
|
import {UsersService} from "$lib/server/api/services/users.service";
|
2024-08-15 23:25:41 +00:00
|
|
|
import {LoginRequestsService} from "$lib/server/api/services/loginrequest.service";
|
|
|
|
|
import {LuciaProvider} from "$lib/server/api/providers";
|
2024-08-08 19:38:17 +00:00
|
|
|
|
|
|
|
|
@injectable()
|
|
|
|
|
export class SignupController implements Controller {
|
|
|
|
|
controller = new Hono<HonoTypes>();
|
|
|
|
|
|
|
|
|
|
constructor(
|
2024-08-15 23:25:41 +00:00
|
|
|
@inject(UsersService) private readonly usersService: UsersService,
|
|
|
|
|
@inject(LoginRequestsService) private readonly loginRequestService: LoginRequestsService,
|
|
|
|
|
@inject(LuciaProvider) private lucia: LuciaProvider
|
2024-08-08 19:38:17 +00:00
|
|
|
) { }
|
|
|
|
|
|
|
|
|
|
routes() {
|
|
|
|
|
return this.controller
|
|
|
|
|
.post('/', zValidator('json', signupUsernameEmailDto), limiter({ limit: 10, minutes: 60 }), async (c) => {
|
2024-08-15 23:25:41 +00:00
|
|
|
const { firstName, lastName, email, username, password, confirm_password } = await c.req.valid('json');
|
2024-08-10 17:03:30 +00:00
|
|
|
const existingUser = await this.usersService.findOneByUsername(username);
|
|
|
|
|
|
|
|
|
|
if (existingUser) {
|
|
|
|
|
return c.body("User already exists", 400);
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-15 23:25:41 +00:00
|
|
|
const user = await this.usersService.create({ firstName, lastName, email, username, password, confirm_password });
|
2024-08-08 19:38:17 +00:00
|
|
|
|
2024-08-15 23:25:41 +00:00
|
|
|
if (!user) {
|
|
|
|
|
return c.body("Failed to create user", 500);
|
|
|
|
|
}
|
2024-08-08 19:38:17 +00:00
|
|
|
|
2024-08-15 23:25:41 +00:00
|
|
|
const session = await this.loginRequestService.createUserSession(user.id, c.req, undefined);
|
|
|
|
|
const sessionCookie = this.lucia.createSessionCookie(session.id);
|
|
|
|
|
console.log("set cookie", sessionCookie);
|
|
|
|
|
setCookie(c, sessionCookie.name, sessionCookie.value, {
|
|
|
|
|
path: sessionCookie.attributes.path,
|
|
|
|
|
maxAge: sessionCookie?.attributes?.maxAge && sessionCookie?.attributes?.maxAge < new TimeSpan(365, 'd').seconds()
|
|
|
|
|
? sessionCookie.attributes.maxAge : new TimeSpan(2, 'w').seconds(),
|
|
|
|
|
domain: sessionCookie.attributes.domain,
|
|
|
|
|
sameSite: sessionCookie.attributes.sameSite as any,
|
|
|
|
|
secure: sessionCookie.attributes.secure,
|
|
|
|
|
httpOnly: sessionCookie.attributes.httpOnly,
|
|
|
|
|
expires: sessionCookie.attributes.expires
|
|
|
|
|
});
|
|
|
|
|
return c.json({ message: 'ok' });
|
2024-08-08 19:38:17 +00:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|