diff --git a/app/Controllers/Http/UsersController.ts b/app/Controllers/Http/UsersController.ts index 8d8e2b7..f532def 100755 --- a/app/Controllers/Http/UsersController.ts +++ b/app/Controllers/Http/UsersController.ts @@ -1,41 +1,52 @@ import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext' +import User from "App/Models/User"; +import UserStoreValidator from "App/Validators/users/UserStoreValidator"; +import UserUpdateValidator from "App/Validators/users/UserUpdateValidator"; +import Env from "@ioc:Adonis/Core/Env"; export default class UsersController { - public async login ({request, auth, response}: HttpContextContract) { - const email = request.input('email') - const password = request.input('password') - - const token = await auth.use('api').attempt(email, password, { - expiresIn: '2 days' - }) + public async index ({ response }: HttpContextContract) { return response.status(200).send({ - token: token.toJSON() + users: await User.all() }) } - public async createInfiniteToken ({response, request, auth}: HttpContextContract) { - const email = request.input('email') - const password = request.input('password') - const token = await auth.use('api').attempt(email, password) + public async store ({ request, response }: HttpContextContract) { + const data = await request.validate(UserStoreValidator) return response.status(200).send({ - token: token.toJSON() + user: await User.create(data) }) } - public async logout ({response, auth, i18n}: HttpContextContract) { - await auth.use('api').revoke() + public async show ({ params, response }: HttpContextContract) { return response.status(200).send({ - message: i18n.formatMessage('messages.logout') + user: await User.findOrFail(params.id) }) } - public async me ({response, auth}: HttpContextContract) { - await auth.authenticate() + public async update ({ request, params, response }: HttpContextContract) { + const user = await User.findOrFail(params.id) + const data = await request.validate(UserUpdateValidator) + await user.merge(data).save() + return response.status(200).send({ - user: auth.user + user }) } + public async destroy ({ response, params, auth }: HttpContextContract) { + const user = await User.findOrFail(params.id) + const admin = await User.findBy('email', Env.get('ADMIN_USER')) + + if (auth.user?.id != admin?.id) { + return response.unauthorized() + } + + await user.delete() + return response.status(200).send({ + message: 'User successfully deleted!' + }) + } } diff --git a/app/Validators/users/UserStoreValidator.ts b/app/Validators/users/UserStoreValidator.ts new file mode 100755 index 0000000..a54f6d3 --- /dev/null +++ b/app/Validators/users/UserStoreValidator.ts @@ -0,0 +1,24 @@ +import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext' +import {rules, schema} from '@ioc:Adonis/Core/Validator' + +export default class UserStoreValidator { + constructor (protected ctx: HttpContextContract) {} + + public schema = schema.create({ + email: schema.string({ trim: true }, [ + rules.email(), + rules.required(), + rules.unique({ + table: 'users', + column: 'email' + }) + ]), + password: schema.string({ trim: true }, + [ + rules.confirmed() + ] + ) + }) + + public messages = {} +} diff --git a/app/Validators/users/UserUpdateValidator.ts b/app/Validators/users/UserUpdateValidator.ts new file mode 100755 index 0000000..9e070ec --- /dev/null +++ b/app/Validators/users/UserUpdateValidator.ts @@ -0,0 +1,27 @@ +import {HttpContextContract} from '@ioc:Adonis/Core/HttpContext' +import {rules, schema} from '@ioc:Adonis/Core/Validator' + +export default class UserUpdateValidator { + constructor (protected ctx: HttpContextContract) {} + + public schema = schema.create({ + email: schema.string.optional({ trim: true }, + [ + rules.email(), + rules.unique( + { + table: 'users', + column: 'email' + }) + ] + ), + password: schema.string.optional({ trim: true }, + [ + rules.confirmed(), + rules.minLength(8) + ] + ) + }) + + public messages = {} +}