270 lines
8.9 KiB
PHP
270 lines
8.9 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Repuve;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\Repuve\ModuleStoreRequest;
|
|
use App\Http\Requests\Repuve\ModuleUpdateRequest;
|
|
use App\Models\Module;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
|
use Notsoweb\ApiResponse\Enums\ApiResponse;
|
|
use Illuminate\Routing\Controllers\HasMiddleware;
|
|
|
|
class ModuleController extends Controller implements HasMiddleware
|
|
{
|
|
/**
|
|
* Middleware
|
|
*/
|
|
public static function middleware(): array
|
|
{
|
|
return [
|
|
self::can('modules.index', ['index']),
|
|
self::can('modules.show', ['show']),
|
|
self::can('modules.destroy', ['destroy']),
|
|
self::can('modules.toggle_status', ['toggleStatus']),
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Listar módulos existentes
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
try {
|
|
$modules = Module::with([
|
|
'responsible:id,name,username',
|
|
'municipality:id,code,name',
|
|
'users:id,name,paternal,maternal,username,module_id',
|
|
'users.roles:id,name,description'
|
|
]);
|
|
|
|
// Filtro por nombre
|
|
if ($request->filled('name')) {
|
|
$modules->where('name', 'like', '%' . $request->input('name') . '%');
|
|
}
|
|
|
|
if ($request->filled('municipality')) {
|
|
$modules->whereHas('municipality', function ($q) use ($request) {
|
|
$q->where('name', 'like', '%' . $request->input('municipality') . '%');
|
|
});
|
|
}
|
|
|
|
return ApiResponse::OK->response([
|
|
'modules' => $modules->paginate(config('app.pagination')),
|
|
]);
|
|
} catch (\Exception $e) {
|
|
return ApiResponse::INTERNAL_ERROR->response([
|
|
'message' => 'Error al listar módulos',
|
|
'error' => $e->getMessage(),
|
|
]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Crear un nuevo módulo
|
|
*/
|
|
public function store(ModuleStoreRequest $request)
|
|
{
|
|
try {
|
|
DB::beginTransaction();
|
|
|
|
// Crear el módulo
|
|
$module = Module::create([
|
|
'name' => $request->input('name'),
|
|
'responsible_id' => $request->input('responsible_id'),
|
|
'municipality_id' => $request->input('municipality_id'),
|
|
'address' => $request->input('address'),
|
|
'longitude' => $request->input('longitude'),
|
|
'latitude' => $request->input('latitude'),
|
|
'status' => $request->input('status', true), // Por defecto activo
|
|
]);
|
|
|
|
DB::commit();
|
|
|
|
$module->load('municipality');
|
|
|
|
return ApiResponse::CREATED->response([
|
|
'message' => 'Módulo creado exitosamente',
|
|
'module' => [
|
|
'name' => $module->name,
|
|
'responsible_id' => $module->responsible_id,
|
|
'municipality' => $module->municipality ? [
|
|
'id' => $module->municipality->id,
|
|
'code' => $module->municipality->code,
|
|
'name' => $module->municipality->name,
|
|
] : null,
|
|
'address' => $module->address,
|
|
'longitude' => $module->longitude,
|
|
'latitude' => $module->latitude,
|
|
'status' => $module->status ? 'Activo' : 'Inactivo',
|
|
'created_at' => $module->created_at->format('Y-m-d H:i:s'),
|
|
],
|
|
]);
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
return ApiResponse::INTERNAL_ERROR->response([
|
|
'message' => 'Error al crear módulo',
|
|
'error' => $e->getMessage(),
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function show($id)
|
|
{
|
|
try {
|
|
$module = Module::with([
|
|
'responsible:id,name,username',
|
|
'municipality:id,code,name',
|
|
'users:id,name,paternal,maternal,username,module_id',
|
|
'users.roles:id,name,description'
|
|
])->findOrFail($id);
|
|
|
|
return ApiResponse::OK->response([
|
|
'module' => $module,
|
|
]);
|
|
} catch (ModelNotFoundException $e) {
|
|
return ApiResponse::NOT_FOUND->response([
|
|
'message' => 'Módulo no encontrado.',
|
|
]);
|
|
} catch (\Exception $e) {
|
|
return ApiResponse::INTERNAL_ERROR->response([
|
|
'message' => 'Error al obtener el módulo.',
|
|
'error' => $e->getMessage(),
|
|
]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Actualizar un módulo existente
|
|
*/
|
|
public function update(ModuleUpdateRequest $request, int $id)
|
|
{
|
|
try {
|
|
$module = Module::findOrFail($id);
|
|
|
|
DB::beginTransaction();
|
|
|
|
// Actualizar solo los campos que vienen en el request
|
|
$module->update($request->validated());
|
|
|
|
DB::commit();
|
|
|
|
// Cargar la relación actualizada
|
|
$module->load('municipality');
|
|
|
|
return ApiResponse::OK->response([
|
|
'message' => 'Módulo actualizado exitosamente',
|
|
'module' => [
|
|
'name' => $module->name,
|
|
'responsible_id' => $module->responsible_id,
|
|
'municipality' => $module->municipality ? [
|
|
'id' => $module->municipality->id,
|
|
'code' => $module->municipality->code,
|
|
'name' => $module->municipality->name,
|
|
] : null,
|
|
'address' => $module->address,
|
|
'longitude' => $module->longitude,
|
|
'latitude' => $module->latitude,
|
|
'status' => $module->status ? 'Activo' : 'Inactivo',
|
|
'updated_at' => $module->updated_at->format('Y-m-d H:i:s'),
|
|
],
|
|
]);
|
|
} catch (ModelNotFoundException $e) {
|
|
return ApiResponse::NOT_FOUND->response([
|
|
'message' => 'Módulo no encontrado',
|
|
]);
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
return ApiResponse::INTERNAL_ERROR->response([
|
|
'message' => 'Error al actualizar módulo',
|
|
'error' => $e->getMessage(),
|
|
]);
|
|
}
|
|
}
|
|
|
|
public function destroy(int $id)
|
|
{
|
|
try {
|
|
$module = Module::findOrFail($id);
|
|
|
|
DB::beginTransaction();
|
|
|
|
$module->delete();
|
|
|
|
DB::commit();
|
|
|
|
return ApiResponse::OK->response([
|
|
'message' => 'Módulo eliminado exitosamente',
|
|
]);
|
|
} catch (ModelNotFoundException $e) {
|
|
return ApiResponse::NOT_FOUND->response([
|
|
'message' => 'Módulo no encontrado',
|
|
]);
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
Log::error('Error al eliminar módulo: ' . $e->getMessage(), [
|
|
'module_id' => $id,
|
|
'trace' => $e->getTraceAsString()
|
|
]);
|
|
|
|
return ApiResponse::INTERNAL_ERROR->response([
|
|
'message' => 'Error al eliminar el módulo',
|
|
'error' => $e->getMessage(),
|
|
]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Cambiar solo el status de un módulo
|
|
*/
|
|
public function toggleStatus(int $id)
|
|
{
|
|
try {
|
|
$module = Module::findOrFail($id);
|
|
|
|
DB::beginTransaction();
|
|
|
|
$newStatus = !$module->status;
|
|
|
|
$module->update([
|
|
'status' => $newStatus,
|
|
]);
|
|
|
|
DB::commit();
|
|
|
|
$module->refresh();
|
|
|
|
return ApiResponse::OK->response([
|
|
'message' => $module->status
|
|
? 'Módulo activado exitosamente'
|
|
: 'Módulo desactivado exitosamente',
|
|
'module' => [
|
|
'id' => $module->id,
|
|
'name' => $module->name,
|
|
'status' => $module->status,
|
|
'status_text' => $module->status ? 'Activo' : 'Inactivo',
|
|
'updated_at' => $module->updated_at->format('Y-m-d H:i:s'),
|
|
],
|
|
]);
|
|
} catch (ModelNotFoundException $e) {
|
|
return ApiResponse::NOT_FOUND->response([
|
|
'message' => 'Módulo no encontrado',
|
|
]);
|
|
} catch (\Exception $e) {
|
|
DB::rollBack();
|
|
Log::error('Error al cambiar status del módulo: ' . $e->getMessage(), [
|
|
'module_id' => $id,
|
|
'trace' => $e->getTraceAsString()
|
|
]);
|
|
|
|
return ApiResponse::INTERNAL_ERROR->response([
|
|
'message' => 'Error al cambiar status del módulo',
|
|
'error' => $e->getMessage(),
|
|
]);
|
|
}
|
|
}
|
|
}
|