103 lines
2.8 KiB
TypeScript

import { Exception } 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';
/**
* Models
*/
import Contact from 'App/Models/Contact';
/**
* Validators
*/
import ChangePasswordValidator from 'App/Validators/ChangePasswordValidator';
import UpdateContactsValidator from 'App/Validators/UpdateContactsValidator';
export default class MeController {
private readonly guard: 'api';
private readonly Contact: typeof Contact;
constructor() {
this.Contact = Contact;
}
/**
* Shows user info of the access token resource owner.
* GET /me
*/
public async show({ response, auth }: HttpContextContract) {
const user = await auth.use(this.guard).authenticate();
await user.load('contacts');
await user.load('roles');
return response.ok({
message: 'Fetched data about me.',
data: user,
});
}
/**
* Change password of authenticated user
* PATCH /me/password
*/
public async changePassword({ request, response, auth }: HttpContextContract) {
await request.validate(ChangePasswordValidator);
const user = await auth.use(this.guard).authenticate();
const oldPassword: string = request.input('oldPassword');
const newPassword: string = request.input('newPassword');
if (oldPassword === newPassword) {
throw new Exception('The new password is the same as the old one.', 400, 'E_PASSWORD_VALUES');
}
/**
* Verify old password
*/
if (!(await Hash.verify(user.password, oldPassword))) {
throw new Exception('Invalid credentials.', 403, 'E_INVALID_CREDENTIALS');
}
/**
* Update user password
*/
user.password = newPassword;
await user.save();
Logger.info(`Password of user with id: "${user.id}" was updated.`);
return response.ok({
message: 'The password was successfully changed to the new value.',
});
}
/**
* Update contacts of authenticated user
* PATCH /me/contacts
*/
public async updateContacts({ request, response, auth }: HttpContextContract) {
const payload = await request.validate(UpdateContactsValidator);
const user = await auth.use(this.guard).authenticate();
const contacts = await this.Contact.findByOrFail('user_id', user.id);
/**
* Update contacts
*/
if (payload.email) contacts.email = payload.email;
contacts.phone_number = payload.phone_number ?? null;
contacts.vk_id = payload.vk_id ?? null;
contacts.twitter_id = payload.twitter_id ?? null;
contacts.telegram_id = payload.telegram_id ?? null;
await contacts.save();
return response.ok({
message: `Contacts has been successfully updated.`,
data: contacts,
});
}
}