educt-server/app/Services/AuthService.ts

105 lines
2.4 KiB
TypeScript

import { inject, Ioc } from '@adonisjs/core/build/standalone';
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext';
import Hash from '@ioc:Adonis/Core/Hash';
import Logger from '@ioc:Adonis/Core/Logger';
/**
* Datatypes
*/
import IResponse from 'App/Datatypes/Interfaces/IResponse';
import HttpStatusEnum from 'App/Datatypes/Enums/HttpStatusEnum';
/**
* Reposirories
*/
import UserRepository from 'App/Repositories/UserRepository';
@inject()
export default class AuthService {
private userRepository: UserRepository;
private authGuard: 'api';
constructor(userRepository: UserRepository) {
this.userRepository = userRepository;
}
/**
* Login user
*
* @param login Login
* @param password Password
* @param ctx Http context
* @returns Token data
*/
public async login(login: string, password: string, ctx: HttpContextContract): Promise<IResponse> {
const user = await this.userRepository.getByColumn('login', login);
if (!user) {
return {
success: false,
status: HttpStatusEnum.NOT_FOUND,
message: 'User not found.',
data: {},
error: {
code: 'E_NOT_FOUND',
},
};
}
/**
* Invalid credentials while login
*/
if (!(await Hash.verify(user.password, password))) {
return {
success: false,
status: HttpStatusEnum.UNAUTHORIZED,
message: 'Invalid credentials.',
data: {},
error: {
code: 'E_INVALID_CREDENTIALS',
},
};
}
/**
* Create new token
*/
const token = await ctx.auth.use(this.authGuard).generate(user, {
expiresIn: '1d',
userRoles: user.roles.map(role => role.slug),
});
ctx.response.cookie('token', token.token);
Logger.info(`A token for user with id: "${token.user.id}" was successfully generated.`);
return {
success: true,
status: HttpStatusEnum.OK,
message: 'Login success.',
data: token.toJSON(),
};
}
/**
* Logout user
*
* @param ctx Http context
* @returns Logout message
*/
public async logout(ctx: HttpContextContract): Promise<IResponse> {
ctx.response.clearCookie('token');
await ctx.auth.use(this.authGuard).revoke();
return {
success: true,
status: HttpStatusEnum.OK,
message: 'Logout success.',
data: {},
};
}
}
new Ioc().make(AuthService);