182 lines
6.1 KiB
PHP
182 lines
6.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Usuario;
|
|
use App\Services\Auth0Service;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Validation\Rule;
|
|
use Illuminate\Validation\ValidationException;
|
|
use Ramsey\Uuid\Uuid;
|
|
|
|
class UsuariosController extends Controller {
|
|
|
|
/**
|
|
* Obtiene todos los usuarios registrados en el backend
|
|
* @return JsonResponse
|
|
*/
|
|
public function all() {
|
|
$usuarios = Usuario::all();
|
|
return response()->json(['usuarios' => $usuarios]);
|
|
}
|
|
|
|
/**
|
|
* Obtiene un usuario por su id, siendo el id de auth0 o el id de la base de datos
|
|
* @param $id
|
|
* @return JsonResponse
|
|
*/
|
|
public function get($id) {
|
|
$usuario = Usuario::findByIdOrAuth0Id($id);
|
|
|
|
if (!$usuario) {
|
|
return response()->json([
|
|
'error' => 'not_found',
|
|
'message' => 'El usuario con id ' . $id . ' no existe'
|
|
], 404);
|
|
}
|
|
|
|
return response()->json(['usuario' => $usuario]);
|
|
}
|
|
|
|
/**
|
|
* Crea un nuevo usuario localmente y en auth0
|
|
* @throws ValidationException
|
|
*/
|
|
public function create(Request $request) {
|
|
$this->validate($request, [
|
|
'nombre' => 'required',
|
|
'email' => 'required|email',
|
|
'username' => 'required',
|
|
'password' => 'required',
|
|
'roles' => 'required|array',
|
|
'roles.*' => ['required', Rule::in(['admin', 'mesero', 'recaudador', 'productor'])],
|
|
'restaurant' => 'required|exists:restaurantes,id',
|
|
]);
|
|
|
|
$restaurant = $request->input('restaurant');
|
|
|
|
// solo un global admin puede crear usuarios en cualquier restaurant
|
|
if (!in_array('global_admin', $request->user->roles)) {
|
|
// si el usuario no es administrador no puede crear usuarios
|
|
if (!in_array('admin', $request->user->roles)) {
|
|
return response()->json([
|
|
'error' => 'not_allowed',
|
|
'message' => 'El usuario no puede tiene permisos para crear usuarios'
|
|
], 403);
|
|
}
|
|
// los administradores solo pueden crear usuarios en su propio restaurant
|
|
if (!$request->user->restaurantes->contains($restaurant)) {
|
|
return response()->json([
|
|
'error' => 'not_allowed',
|
|
'message' => 'El usuario no puede crear un usuario en un restaurant al que no pertenece'
|
|
], 403);
|
|
}
|
|
}
|
|
|
|
$auth0 = app(Auth0Service::class);
|
|
$auth0User = $auth0->createUser(
|
|
email: $request->input('email'),
|
|
username: $request->input('username'),
|
|
password: $request->input('password'),
|
|
metadata: [
|
|
'roles' => $request->input('roles'),
|
|
'restaurantes' => [$restaurant],
|
|
]
|
|
);
|
|
|
|
if (array_key_exists('error', $auth0User)) {
|
|
return response()->json([
|
|
'error' => $auth0User['errorCode'],
|
|
'message' => $auth0User['message'],
|
|
], $auth0User['statusCode']);
|
|
}
|
|
|
|
$usuario = new Usuario();
|
|
$usuario->id = Uuid::uuid4();
|
|
$usuario->auth0_id = $auth0User['identities'][0]['provider'] . '|' . $auth0User['identities'][0]['user_id'];
|
|
$usuario->nombre = $request->input('nombre');
|
|
$usuario->save();
|
|
|
|
$usuario->restaurantes()->attach($restaurant);
|
|
|
|
return response()->json(["usuario" => $usuario]);
|
|
}
|
|
|
|
/**
|
|
* Actualiza un usuario, dado su id o auth0_id
|
|
* @param Request $request
|
|
* @param $id
|
|
* @return JsonResponse
|
|
* @throws ValidationException
|
|
*/
|
|
public function update(Request $request, $id) {
|
|
$this->validate($request, [
|
|
'nombre' => 'sometimes',
|
|
'email' => 'sometimes|email',
|
|
'username' => 'sometimes',
|
|
'password' => 'sometimes',
|
|
'roles' => 'sometimes|array',
|
|
'roles.*' => ['sometimes', Rule::in(['admin', 'mesero', 'recaudador', 'productor'])],
|
|
]);
|
|
|
|
$usuario = Usuario::findByIdOrAuth0Id($id);
|
|
|
|
if (!$usuario) {
|
|
return response()->json([
|
|
'error' => 'not_found',
|
|
'message' => 'El usuario con id ' . $id . ' no existe'
|
|
], 404);
|
|
}
|
|
|
|
// solo un global admin puede modificar usuarios en cualquier restaurant
|
|
if (!in_array('global_admin', $request->user->roles)) {
|
|
// si el usuario no es administrador no puede modificar usuarios
|
|
if (!in_array('admin', $request->user->roles)) {
|
|
return response()->json([
|
|
'error' => 'not_allowed',
|
|
'message' => 'El usuario no puede tiene permisos para modificar usuarios'
|
|
], 403);
|
|
}
|
|
// los administradores solo pueden modificar usuarios en sus propio restaurantes
|
|
if ($request->user->restaurantes->intersect($usuario->restaurantes)->count() == 0) {
|
|
return response()->json([
|
|
'error' => 'not_allowed',
|
|
'message' => 'El usuario no puede modificar un usuario en un restaurant al que no pertenece'
|
|
], 403);
|
|
}
|
|
}
|
|
|
|
$metadata = [];
|
|
if ($request->input('roles'))
|
|
$metadata['roles'] = $request->input('roles');
|
|
|
|
$auth0 = app(Auth0Service::class);
|
|
$auth0User = $auth0->updateUser(
|
|
auth0_id: $usuario->auth0_id,
|
|
email: $request->input('email'),
|
|
username: $request->input('username'),
|
|
password: $request->input('password'),
|
|
metadata: $metadata
|
|
);
|
|
|
|
if (array_key_exists('error', $auth0User)) {
|
|
return response()->json([
|
|
'error' => $auth0User['errorCode'],
|
|
'message' => $auth0User['message'],
|
|
], $auth0User['statusCode']);
|
|
}
|
|
|
|
if ($request->input('nombre'))
|
|
$usuario->nombre = $request->input('nombre');
|
|
$usuario->save();
|
|
|
|
return response()->json(["usuario" => $usuario]);
|
|
}
|
|
|
|
public function delete(Request $request) {
|
|
|
|
}
|
|
|
|
}
|