2024-07-21 19:05:48 +00:00
|
|
|
import { Hono } from 'hono';
|
2024-08-15 23:46:58 +00:00
|
|
|
import { inject, injectable } from 'tsyringe';
|
|
|
|
|
import { setCookie } from 'hono/cookie';
|
2024-08-19 03:28:15 +00:00
|
|
|
import { zValidator } from '@hono/zod-validator';
|
2024-07-31 01:50:46 +00:00
|
|
|
import type { HonoTypes } from '../types';
|
2024-07-21 19:05:48 +00:00
|
|
|
import { requireAuth } from "../middleware/auth.middleware";
|
2024-07-31 01:50:46 +00:00
|
|
|
import type { Controller } from '../interfaces/controller.interface';
|
2024-08-15 23:46:58 +00:00
|
|
|
import {IamService} from "$lib/server/api/services/iam.service";
|
|
|
|
|
import {LuciaProvider} from "$lib/server/api/providers";
|
2024-08-19 03:28:15 +00:00
|
|
|
import {limiter} from "$lib/server/api/middleware/rate-limiter.middleware";
|
|
|
|
|
import {updateProfileDto} from "$lib/dtos/update-profile.dto";
|
|
|
|
|
import {updateEmailDto} from "$lib/dtos/update-email.dto";
|
2024-07-21 19:05:48 +00:00
|
|
|
|
2024-07-31 01:50:46 +00:00
|
|
|
@injectable()
|
|
|
|
|
export class IamController implements Controller {
|
|
|
|
|
controller = new Hono<HonoTypes>();
|
2024-07-21 19:05:48 +00:00
|
|
|
|
2024-07-31 01:50:46 +00:00
|
|
|
constructor(
|
2024-08-15 23:46:58 +00:00
|
|
|
@inject(IamService) private readonly iamService: IamService,
|
|
|
|
|
@inject(LuciaProvider) private lucia: LuciaProvider
|
2024-07-31 01:50:46 +00:00
|
|
|
) { }
|
|
|
|
|
|
|
|
|
|
routes() {
|
|
|
|
|
return this.controller
|
|
|
|
|
.get('/me', requireAuth, async (c) => {
|
|
|
|
|
const user = c.var.user;
|
|
|
|
|
return c.json({ user });
|
2024-08-15 23:46:58 +00:00
|
|
|
})
|
2024-08-19 03:28:15 +00:00
|
|
|
.post('/update/profile', requireAuth, zValidator('json', updateProfileDto), limiter({ limit: 10, minutes: 60 }), async (c) => {
|
|
|
|
|
const user = c.var.user;
|
2024-08-19 06:00:59 +00:00
|
|
|
console.log('user id', user.id);
|
2024-08-19 03:28:15 +00:00
|
|
|
const { firstName, lastName, username } = c.req.valid('json');
|
2024-08-19 06:00:59 +00:00
|
|
|
const updatedUser = await this.iamService.updateProfile(user.id, { firstName, lastName, username });
|
2024-08-19 03:28:15 +00:00
|
|
|
return c.json({ status: 'success' });
|
|
|
|
|
})
|
|
|
|
|
.post('/update/email', requireAuth, zValidator('json', updateEmailDto), limiter({ limit: 10, minutes: 60 }), async (c) => {
|
|
|
|
|
const user = c.var.user;
|
|
|
|
|
const { email } = c.req.valid('json');
|
2024-08-19 06:00:59 +00:00
|
|
|
await this.iamService.updateEmail(user.id, { email });
|
2024-08-19 03:28:15 +00:00
|
|
|
return c.json({ status: 'success' });
|
|
|
|
|
})
|
2024-08-15 23:46:58 +00:00
|
|
|
.post('/logout', requireAuth, async (c) => {
|
|
|
|
|
const sessionId = c.var.session.id;
|
|
|
|
|
await this.iamService.logout(sessionId);
|
|
|
|
|
const sessionCookie = this.lucia.createBlankSessionCookie();
|
|
|
|
|
setCookie(c, sessionCookie.name, sessionCookie.value, {
|
|
|
|
|
path: sessionCookie.attributes.path,
|
|
|
|
|
maxAge: sessionCookie.attributes.maxAge,
|
|
|
|
|
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({ status: 'success' });
|
2024-07-31 01:50:46 +00:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|