UPDATE: Los recursos ahora son catalogos. Forma de acceder dinamica por clase en vez de traits.

This commit is contained in:
Moisés Cortés C. 2025-05-23 13:31:13 -06:00
parent 8b7ed8a6e4
commit 04c4a6b4ee
3 changed files with 73 additions and 23 deletions

View File

@ -0,0 +1,71 @@
<?php namespace App\Http\Controllers\Catalogs;
/**
* @copyright (c) 2025 Notsoweb Software (https://notsoweb.com) - All Rights Reserved
*/
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Notsoweb\ApiResponse\Enums\ApiResponse;
/**
* Catálogos de la aplicación
*
* Permite obtener múltiples catálogos de la aplicación en una sola petición, estas son clases que se encuentran dinámicamente
* en el directorio app/Http/Controllers/Catalogs.
*
* Estas clases solo retornan los datos de una consulta y este controlador los retorna en una solo respuesta.
*
* @author Moisés Cortés C. <moises.cortes@notsoweb.com>
*
* @version 1.0.0
*/
class CatalogController extends Controller
{
/**
* Obtener cualquier recurso
*
* Procesa la matriz de recursos solicitados y retorna una respuesta con los datos de cada recurso.
*/
public function get(Request $request)
{
$resources = $request->all();
$response = [];
foreach ($resources as $resource => $data) {
$exploded = explode(':', $resource);
try {
$class = "App\Http\Controllers\Catalogs\\{$this->toPascalCase($exploded[0])}Resource";
$method = $this->toCamelCase($exploded[1]);
$response[$resource] = (new $class)->{$method}($data);
} catch (\Exception $e) {
$response[$resource] = false;
}
}
return ApiResponse::OK->onSuccess($response);
}
/**
* Transforma un string de formato kebab-case o snake_case a PascalCase
*
* @param string $string String a transformar
* @return string String en formato PascalCase
*/
private function toPascalCase(string $string): string
{
return str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $string)));
}
/**
* Transforma un string de formato kebab-case o snake_case a camelCase
*
* @param string $string String a transformar
* @return string String en formato camelCase
*/
private function toCamelCase(string $string): string
{
return lcfirst(str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $string))));
}
}

View File

@ -4,7 +4,6 @@
*/ */
use App\Models\Setting; use App\Models\Setting;
use Illuminate\Http\Request;
use Notsoweb\ApiResponse\Enums\ApiResponse; use Notsoweb\ApiResponse\Enums\ApiResponse;
use Tighten\Ziggy\Ziggy; use Tighten\Ziggy\Ziggy;
@ -17,27 +16,6 @@
*/ */
class ResourceController extends Controller class ResourceController extends Controller
{ {
/**
* Obtener cualquier recurso
*
* Los recursos son traits que deben ser importados en este controlador. Para consumir el recurso del trait
* se debe de enviar el nombre de la función que se desea consumir, si esta requiere parámetros, se deben de enviar,
* sino se debe colocar un null.
*/
public function get(Request $request)
{
$resources = $request->all();
$response = [];
foreach ($resources as $resource => $data) {
if (method_exists($this, $resource)) {
$response[$resource] = $this->{$resource}($data);
}
}
return ApiResponse::OK->onSuccess($response);
}
/** /**
* Información de la aplicación * Información de la aplicación
*/ */

View File

@ -9,6 +9,7 @@
use App\Http\Controllers\System\NotificationController; use App\Http\Controllers\System\NotificationController;
use App\Http\Controllers\System\SystemController; use App\Http\Controllers\System\SystemController;
use App\Http\Controllers\Admin\UserController; use App\Http\Controllers\Admin\UserController;
use App\Http\Controllers\Catalogs\CatalogController;
use App\Http\Controllers\ChangelogController; use App\Http\Controllers\ChangelogController;
use App\Http\Controllers\ServerController; use App\Http\Controllers\ServerController;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
@ -76,7 +77,7 @@
Route::post('auth/logout', [LoginController::class, 'logout'])->name('auth.logout'); Route::post('auth/logout', [LoginController::class, 'logout'])->name('auth.logout');
Route::get('changelogs', ChangelogController::class)->name('changelogs'); Route::get('changelogs', ChangelogController::class)->name('changelogs');
Route::post('resources/get', [ResourceController::class, 'get'])->name('resources.get'); Route::post('catalogs/get', [CatalogController::class, 'get'])->name('catalogs.get');
}); });
Route::prefix('resources')->name('resources.')->group(function() { Route::prefix('resources')->name('resources.')->group(function() {