diff --git a/app/Repositories/UserRepository.ts b/app/Repositories/UserRepository.ts index e181742..321354f 100644 --- a/app/Repositories/UserRepository.ts +++ b/app/Repositories/UserRepository.ts @@ -4,6 +4,7 @@ import Hash from '@ioc:Adonis/Core/Hash'; * Models */ import User from 'App/Models/User'; +import Role from 'App/Models/Role'; /** * Validators @@ -14,8 +15,11 @@ import UpdateUserValidator from 'App/Validators/User/UpdateUserValidator'; export default class UserRepository { private User: typeof User; + private Role: typeof Role; + constructor() { this.User = User; + this.Role = Role; } /** @@ -130,9 +134,32 @@ export default class UserRepository { */ public async update(id: number | string, data: UpdateUserValidator['schema']['props']): Promise { const user = await this.User.query().preload('contacts').preload('roles').where('id', id).first(); + const { role: roleSlug, ...updatedFields } = data; if (user) { - await user.merge(data).save(); + /** + * Update fields + */ + user.merge(updatedFields); + + /** + * Attach new single role + */ + if (roleSlug) { + const role = await this.Role.query().where('slug', roleSlug).first(); + + if (role) { + await user.related('roles').detach(); + await user.related('roles').attach([role.id]); + await user.load('roles'); + } + } + + /** + * Save updated user in database + */ + await user.save(); + return user; } diff --git a/app/Services/CourseService.ts b/app/Services/CourseService.ts index 745db37..0b6623d 100644 --- a/app/Services/CourseService.ts +++ b/app/Services/CourseService.ts @@ -16,7 +16,6 @@ import RoleHelper from 'App/Helpers/RoleHelper'; import CourseRepository from 'App/Repositories/CourseRepository'; import UserRepository from 'App/Repositories/UserRepository'; import CategoryRepository from 'App/Repositories/CategoryRepository'; -import ImageRepository from 'App/Repositories/ImageRepository'; /** * Validators @@ -33,18 +32,14 @@ export default class CourseService { private categoryRepository: CategoryRepository; - private imageRepository: ImageRepository; - constructor( courseRepository: CourseRepository, userRepository: UserRepository, - categoryRepository: CategoryRepository, - imageRepository: ImageRepository + categoryRepository: CategoryRepository ) { this.courseRepository = courseRepository; this.userRepository = userRepository; this.categoryRepository = categoryRepository; - this.imageRepository = imageRepository; } /** diff --git a/app/Validators/User/UpdateUserValidator.ts b/app/Validators/User/UpdateUserValidator.ts index 38e8df7..ca9d91f 100644 --- a/app/Validators/User/UpdateUserValidator.ts +++ b/app/Validators/User/UpdateUserValidator.ts @@ -1,5 +1,6 @@ import { schema, rules } from '@ioc:Adonis/Core/Validator'; import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'; +import RoleEnum from 'App/Datatypes/Enums/RoleEnum'; export default class UpdateUserValidator { constructor(protected ctx: HttpContextContract) {} @@ -10,9 +11,11 @@ export default class UpdateUserValidator { login: schema.string.optional({}, [rules.unique({ table: 'users', column: 'login' })]), email: schema.string.optional({}, [rules.email(), rules.unique({ table: 'users', column: 'email' })]), password: schema.string.optional(), + role: schema.enum.optional(Object.values(RoleEnum)), }); public messages = { - 'email.unique': 'Email is not available.', + 'login.unique': '"Login" filed is already in use.', + 'email.unique': '"Email" field is already in use.', }; }