import { deleteUser, loginUser, registerUser } from '#db/index.js'; import { AuthDto, RegisterDto } from '#dto/index.js'; import { RouteDescription, RouteMethod } from '#api/RouteDescription.js'; import { WhoAmIDto } from '#dto/auth/WhoAmIDto.js'; import { requireAuth } from '#api/middlewares/index.js'; import { SafeNSoundError } from '#util/error.js'; /** * @type {RouteDescription} */ export const registerRoute = { path: '/auth/register', methods: { post: new RouteMethod({ description: 'Create a new user', exampleBody: { username: '{{username}}', email: '{{email}}', password: '{{email}}', type: '{{userType}}' }, async method(req, res) { const data = await RegisterDto.create(req.body); await registerUser(data); res.status(204).send(); } }) } }; /** * @type {RouteDescription} */ export const loginRoute = { path: '/auth/login', methods: { post: new RouteMethod({ description: 'Log in as a user', exampleBody: { username: '{{username}}', email: '{{email}}', password: '{{email}}' }, async method(req, res) { const data = await AuthDto.create(req.body); const loginResult = await loginUser( data, req.headers['user-agent'] ); res.send(loginResult); } }) } }; /** * @type {RouteDescription} */ export const logoutRoute = { path: '/auth/logout', methods: { post: new RouteMethod({ description: 'Log out from a device', exampleHeaders: { Authorization: 'Bearer {{accessToken}}' }, middlewares: [requireAuth], async method(req, res) { const deviceIndex = req.user.devices.findIndex( device => device.id === req.device._id ); req.user.devices.splice(deviceIndex, 1); await req.user.save(); res.status(204).send(); } }) } }; /** * @type {RouteDescription} */ export const deleteRoute = { path: '/auth/delete', methods: { delete: new RouteMethod({ description: 'Delete account', exampleBody: { username: '{{username}}', email: '{{email}}', password: '{{email}}' }, async method(req, res) { const data = await AuthDto.create(req.body); await deleteUser(data); res.status(204).send(); } }) } }; /** * @type {RouteDescription} */ export const whoAmI = { path: '/auth/whoami', methods: { get: new RouteMethod({ description: 'Get current user', exampleHeaders: { Authorization: 'Bearer {{accessToken}}' }, middlewares: [requireAuth], async method(req, res) { const data = await WhoAmIDto.create({ userId: req.auth.sub, deviceId: req.auth.deviceId, type: req.auth.type }); res.send(data); } }) } };