From 452d7d9557b9ee0a002bbde097a20ad9ea0d1460 Mon Sep 17 00:00:00 2001 From: Sergey Yarkov Date: Thu, 3 Feb 2022 22:32:47 +0300 Subject: [PATCH] feat: updating info of authorized user --- app/Repositories/UserRepository.ts | 3 +- app/Services/MeService.ts | 61 +++++++++++++------ .../User/UpdateUserInfoValidator.ts | 11 +++- 3 files changed, 54 insertions(+), 21 deletions(-) diff --git a/app/Repositories/UserRepository.ts b/app/Repositories/UserRepository.ts index a0651eb..1f7ee8a 100644 --- a/app/Repositories/UserRepository.ts +++ b/app/Repositories/UserRepository.ts @@ -177,9 +177,10 @@ export default class UserRepository { */ public async updateInfo(id: string | number, data: UpdateUserInfoValidator['schema']['props']) { const user = await this.User.query().preload('contacts').preload('roles').where('id', id).first(); + const { about } = data; if (user) { - await user.merge(data).save(); + await user.merge({ about }).save(); return { about: user.about }; } diff --git a/app/Services/MeService.ts b/app/Services/MeService.ts index 15183e8..ebd7875 100644 --- a/app/Services/MeService.ts +++ b/app/Services/MeService.ts @@ -248,9 +248,9 @@ export default class MeService { /** * Update user conctact * - * @param data Data to update + * @param data Fields to update * @param auth AuthContract - * @returns Updated user contacts + * @returns IResponse */ public async updateUserContacts( data: UpdateContactsValidator['schema']['props'], @@ -281,34 +281,59 @@ export default class MeService { }; } + /** + * Update info about user + * + * @param data Fields to update + * @param auth AuthContract + * @returns IResponse + */ public async updateUserInfo( data: UpdateUserInfoValidator['schema']['props'], auth: AuthContract ): Promise { const user = await auth.use(this.authGuard).authenticate(); - const info = await this.userRepository.updateInfo(user.id, data); - - if (info) { - const { about } = info; + if (Object.keys(data).length === 0) { return { - success: true, - status: HttpStatusEnum.OK, - message: 'User info updated.', - data: { - about, + success: false, + status: HttpStatusEnum.BAD_REQUEST, + message: 'You must specify at least one field.', + data: {}, + error: { + code: 'E_BAD_REQUEST', }, }; } + /** + * Personal info updating + */ + if (data.about !== undefined) { + await this.userRepository.updateInfo(user.id, data); + } + + /** + * Contacts updating + */ + if (data.phone_number !== undefined || data.twitter_id !== undefined || data.telegram_id !== undefined) { + const contacts = await this.contactRepository.update(user, { + phone_number: data.phone_number, + twitter_id: data.twitter_id, + telegram_id: data.telegram_id, + vk_id: data.vk_id, + }); + + if (!contacts) { + await this.contactRepository.create(user, data); + } + } + return { - success: false, - status: HttpStatusEnum.SERVICE_UNAVAILABLE, - message: 'Cannot update personal info.', - data: {}, - error: { - code: 'E_SERVICE_UNAVAILABLE', - }, + success: true, + status: HttpStatusEnum.OK, + message: 'User contacts updated.', + data: { ...data }, }; } } diff --git a/app/Validators/User/UpdateUserInfoValidator.ts b/app/Validators/User/UpdateUserInfoValidator.ts index f9f1034..b50c183 100644 --- a/app/Validators/User/UpdateUserInfoValidator.ts +++ b/app/Validators/User/UpdateUserInfoValidator.ts @@ -1,11 +1,18 @@ -import { schema } from '@ioc:Adonis/Core/Validator'; +import { schema, rules } from '@ioc:Adonis/Core/Validator'; import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'; export default class UpdateUserInfoValidator { constructor(protected ctx: HttpContextContract) {} public schema = schema.create({ - about: schema.string.optional(), + about: schema.string.nullableAndOptional(), + phone_number: schema.string.nullableAndOptional({}, [ + rules.mobile({ locales: ['ru-RU', 'en-US'], strict: true }), + rules.unique({ table: 'contacts', column: 'phone_number' }), + ]), + vk_id: schema.string.nullableAndOptional({}, [rules.regex(/^([a-zA-Z0-9_]){1,64}$/)]), + twitter_id: schema.string.nullableAndOptional({}, [rules.regex(/(^|[^@\w])@(\w{1,15})\b/)]), + telegram_id: schema.string.nullableAndOptional({}, [rules.regex(/(^|[^@\w])@(\w{1,64})\b/)]), }); public messages = {};