Planificacion y avances de backend

This commit is contained in:
2021-04-29 01:59:08 -04:00
parent 6e4076cf15
commit b6ea4a7ce2
21 changed files with 486 additions and 156 deletions

View File

@@ -2,9 +2,12 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Laravel\Lumen\Routing\Controller as BaseController;
class Controller extends BaseController
{
//
protected function buildFailedValidationResponse(Request $request, array $errors) {
return ["error" => "validation_error", "message" => $errors];
}
}

View File

@@ -1,18 +0,0 @@
<?php
namespace App\Http\Controllers;
class ExampleController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
//
}
//
}

View File

@@ -0,0 +1,110 @@
<?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 {
/**
* @return JsonResponse
*/
public function all() {
$usuarios = Usuario::all();
return response()->json(['usuarios' => $usuarios]);
}
/**
* @param $id
* @return JsonResponse
*/
public function get($id) {
if (!Uuid::isValid($id)) {
return response()->json([
'error' => 'invalid_id',
'message' => 'El id debe ser un UUID valido'
]);
}
$usuario = Usuario::find($id);
if (!$usuario) {
return response()->json([
'error' => 'not_found',
'message' => 'El usuario con id ' . $id . ' no existe'
], 404);
}
return response()->json(['usuario' => $usuario]);
}
/**
* @throws ValidationException
*/
public function create(Request $request) {
$this->validate($request, [
'nombre' => 'required',
'email' => 'required|email',
'username' => 'required',
'password' => 'required',
'type' => 'required|array',
'type.*' => ['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'
]);
}
// los administradores solo pueden crear restaurantes 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'
]);
}
}
$auth0 = app(Auth0Service::class);
$auth0User = $auth0->createUser(
email: $request->input('email'),
username: $request->input('username'),
password: $request->input('password'),
metadata: [
'roles' => $request->input('type'),
'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);
}
}

View File

@@ -3,26 +3,37 @@
namespace App\Http\Middleware;
use Closure;
use App\Models\Usuario;
use Auth0\SDK\Exception\InvalidTokenException;
use Auth0\SDK\Helpers\JWKFetcher;
use Auth0\SDK\Helpers\Tokens\AsymmetricVerifier;
use Auth0\SDK\Helpers\Tokens\TokenVerifier;
use Illuminate\Support\Facades\Log;
class Auth0Middleware {
/**
* @throws InvalidTokenException
*/
public function handle($request, Closure $next) {
$token = $request->bearerToken();
if (!$token) {
return response()->json('No token provided', 401);
return response()->json(['error' => 'no_token', 'message' => 'No se envío el token'], 401);
}
$this->validateToken($token);
$validated = $this->validateToken($token);
$user = Usuario::where('auth0_id', $validated['sub'])->first();
$request = $request->merge(['user' => $user]);
return $next($request);
}
/**
* @throws InvalidTokenException
*/
public function validateToken($token) {
try {
$jwksUri = env('AUTH0_DOMAIN') . '.well-known/jwks.json';
@@ -30,9 +41,9 @@ class Auth0Middleware {
$signatureVerifier = new AsymmetricVerifier($jwksFetcher);
$tokenVerifier = new TokenVerifier(env('AUTH0_DOMAIN'), env('AUTH0_AUD'), $signatureVerifier);
$decoded = $tokenVerifier->verify($token);
return $tokenVerifier->verify($token);
} catch (InvalidTokenException $e) {
throw $e;
};
}
}
}