añadir nuevas funcionalidades
This commit is contained in:
@@ -47,24 +47,24 @@ class ProjectController extends Controller
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'name' => 'required|string|max:255',
|
||||
'description' => 'required|string',
|
||||
'status' => 'required|in:active,inactive',
|
||||
'team' => 'sometimes|array',
|
||||
'team.*' => 'exists:users,id',
|
||||
'description' => 'nullable|string',
|
||||
'status' => 'required|in:Activo,Inactivo',
|
||||
//'team' => 'sometimes|array',
|
||||
//'team.*' => 'exists:users,id',
|
||||
'project_image' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
|
||||
'address' => 'nullable|string|max:255',
|
||||
'province' => 'nullable|string|max:100',
|
||||
'country' => 'nullable|string|size:2',
|
||||
//'country' => 'nullable|string|size:2',
|
||||
'postal_code' => 'nullable|string|max:10',
|
||||
'latitude' => 'required|numeric|between:-90,90',
|
||||
'longitude' => 'required|numeric|between:-180,180',
|
||||
'icon' => 'nullable|in:'.implode(',', config('project.icons')),
|
||||
//'icon' => 'nullable|in:'.implode(',', config('project.icons')),
|
||||
'start_date' => 'nullable|date',
|
||||
'deadline' => 'nullable|date|after:start_date',
|
||||
'categories' => 'array|exists:categories,id',
|
||||
'categories' => 'nullable|array|exists:categories,id',
|
||||
//'categories' => 'required|array',
|
||||
'categories.*' => 'exists:categories,id',
|
||||
'documents.*' => 'file|max:5120|mimes:pdf,docx,xlsx,jpg,png'
|
||||
//'categories.*' => 'exists:categories,id',
|
||||
//'documents.*' => 'file|max:5120|mimes:pdf,docx,xlsx,jpg,png'
|
||||
]);
|
||||
|
||||
|
||||
@@ -98,12 +98,10 @@ class ProjectController extends Controller
|
||||
}
|
||||
}
|
||||
|
||||
return redirect()->route('projects.show', $project)
|
||||
->with('success', 'Proyecto creado exitosamente');
|
||||
return redirect()->route('projects.show', $project)->with('success', 'Proyecto creado exitosamente');
|
||||
|
||||
} catch (\Exception $e) {
|
||||
return back()->withInput()
|
||||
->with('error', 'Error al crear el proyecto: ' . $e->getMessage());
|
||||
return back()->withInput()->with('error', 'Error al crear el proyecto: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,7 +5,14 @@ namespace App\Http\Controllers;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\User;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use App\Http\Requests\UpdateUserRequest;
|
||||
use App\Rules\PasswordRule;
|
||||
use Illuminate\Database\QueryException;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Illuminate\Validation\Rules\Password;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
use Spatie\Permission\Models\Permission;
|
||||
use Spatie\Permission\Models\Role;
|
||||
|
||||
class UserController extends Controller
|
||||
@@ -13,7 +20,7 @@ class UserController extends Controller
|
||||
public function index()
|
||||
{
|
||||
$this->authorize('viewAny', User::class);
|
||||
$users = User::with('roles')->paginate(10);
|
||||
$users = User::paginate(10);
|
||||
return view('users.index', compact('users'));
|
||||
}
|
||||
|
||||
@@ -27,24 +34,60 @@ class UserController extends Controller
|
||||
public function store(Request $request)
|
||||
{
|
||||
$this->authorize('create', User::class);
|
||||
|
||||
$data = $request->validate([
|
||||
'name' => 'required|string|max:255',
|
||||
'email' => 'required|email|unique:users',
|
||||
'password' => 'required|min:8|confirmed',
|
||||
'roles' => 'array'
|
||||
]);
|
||||
|
||||
$user = User::create([
|
||||
'name' => $data['name'],
|
||||
'email' => $data['email'],
|
||||
'password' => Hash::make($data['password'])
|
||||
]);
|
||||
|
||||
$user->syncRoles($data['roles'] ?? []);
|
||||
|
||||
return redirect()->route('users.index')
|
||||
->with('success', 'Usuario creado exitosamente');
|
||||
try {
|
||||
// Validación de datos
|
||||
$validated = $request->validate([
|
||||
'title' => 'nullable|string|max:10',
|
||||
'first_name' => 'required|string|max:50',
|
||||
'last_name' => 'required|string|max:50',
|
||||
'username' => 'required|string|unique:users|max:30',
|
||||
'password' => ['required',
|
||||
new PasswordRule(
|
||||
minLength: 12,
|
||||
requireUppercase: true,
|
||||
requireNumeric: true,
|
||||
requireSpecialCharacter: true,
|
||||
//uncompromised: true, // Verificar contra Have I Been Pwned
|
||||
//requireLetters: true
|
||||
),
|
||||
Password::defaults()->mixedCase()->numbers()->symbols()
|
||||
->uncompromised(3) // Número mínimo de apariciones en brechas
|
||||
],
|
||||
'start_date' => 'nullable|date',
|
||||
'end_date' => 'nullable|date|after_or_equal:start_date',
|
||||
'email' => 'required|email|unique:users',
|
||||
'phone' => 'nullable|string|max:20',
|
||||
'address' => 'nullable|string|max:255'
|
||||
]);
|
||||
|
||||
// Creación del usuario
|
||||
$user = User::create([
|
||||
'title' => $validated['title'],
|
||||
'first_name' => $validated['first_name'],
|
||||
'last_name' => $validated['last_name'],
|
||||
'username' => $validated['username'],
|
||||
'password' => Hash::make($validated['password']),
|
||||
'email' => $validated['email'],
|
||||
'phone' => $validated['phone'],
|
||||
'address' => $validated['address'],
|
||||
'access_start' => $validated['start_date'],
|
||||
'access_end' => $validated['end_date'],
|
||||
'is_active' => true
|
||||
]);
|
||||
|
||||
if ($request->hasFile('photo')) {
|
||||
$path = $request->file('photo')->store('public/photos');
|
||||
$user->profile_photo_path = basename($path);
|
||||
$user->save();
|
||||
}
|
||||
|
||||
// Asignación de roles (opcional, usando Spatie Permissions)
|
||||
// $user->assignRole('user');
|
||||
|
||||
return redirect()->route('users.index')->with('success', 'Usuario creado exitosamente.')->with('temp_password', $validated['password']);;
|
||||
} catch (\Exception $e) {
|
||||
return back()->withInput()->with('error', 'Error al crear el usuario: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public function edit(User $user)
|
||||
@@ -52,17 +95,114 @@ class UserController extends Controller
|
||||
$this->authorize('update', $user);
|
||||
$roles = Role::all();
|
||||
$userRoles = $user->roles->pluck('id')->toArray();
|
||||
|
||||
return view('users.edit', compact('user', 'roles', 'userRoles'));
|
||||
return view('users.create', compact('user', 'roles', 'userRoles'));
|
||||
}
|
||||
|
||||
public function update(UpdateUserRequest $request, User $user)
|
||||
public function update(Request $request, User $user)
|
||||
{
|
||||
$user->update($request->validated());
|
||||
$user->syncRoles($request->roles);
|
||||
|
||||
return redirect()->route('users.index')
|
||||
->with('success', 'Usuario actualizado correctamente');
|
||||
try {
|
||||
// Validación de datos
|
||||
$validated = $request->validate([
|
||||
'title' => 'nullable|string|max:10',
|
||||
'first_name' => 'required|string|max:50',
|
||||
'last_name' => 'required|string|max:50',
|
||||
'username' => [
|
||||
'required',
|
||||
'string',
|
||||
'max:30',
|
||||
Rule::unique('users')->ignore($user->id)
|
||||
],
|
||||
'password' => [
|
||||
'nullable',
|
||||
Password::min(12)
|
||||
->mixedCase()
|
||||
->numbers()
|
||||
->symbols()
|
||||
->uncompromised(3)
|
||||
],
|
||||
'start_date' => 'nullable|date',
|
||||
'end_date' => 'nullable|date|after_or_equal:start_date',
|
||||
'email' => [
|
||||
'required',
|
||||
'email',
|
||||
Rule::unique('users')->ignore($user->id)
|
||||
],
|
||||
'phone' => 'nullable|string|max:20',
|
||||
'address' => 'nullable|string|max:255'
|
||||
]);
|
||||
|
||||
// Preparar datos para actualización
|
||||
$updateData = [
|
||||
'title' => $validated['title'],
|
||||
'first_name' => $validated['first_name'],
|
||||
'last_name' => $validated['last_name'],
|
||||
'username' => $validated['username'],
|
||||
'email' => $validated['email'],
|
||||
'phone' => $validated['phone'],
|
||||
'address' => $validated['address'],
|
||||
'access_start' => $validated['start_date'],
|
||||
'access_end' => $validated['end_date'],
|
||||
'is_active' => $request->has('is_active') // Si usas un checkbox
|
||||
];
|
||||
|
||||
// Actualizar contraseña solo si se proporciona
|
||||
if (!empty($validated['password'])) {
|
||||
$updateData['password'] = Hash::make($validated['password']);
|
||||
}
|
||||
|
||||
if ($request->hasFile('photo')) {
|
||||
// Eliminar foto anterior si existe
|
||||
if ($user->prfile_photo_path) {
|
||||
Storage::delete('public/photos/'.$user->profile_photo_path);
|
||||
}
|
||||
|
||||
$path = $request->file('photo')->store('public/photos');
|
||||
$user->update(['profile_photo_path' => basename($path)]);
|
||||
}
|
||||
|
||||
// Actualizar el usuario
|
||||
$user->update($updateData);
|
||||
|
||||
// Redireccionar con mensaje de éxito
|
||||
return redirect()->route('users.show', $user)
|
||||
->with('success', 'Usuario actualizado exitosamente');
|
||||
|
||||
} catch (ValidationException $e) {
|
||||
// Redireccionar con errores de validación
|
||||
return redirect()->back()->withErrors($e->validator)->withInput();
|
||||
|
||||
} catch (QueryException $e) {
|
||||
// Manejar errores de base de datos
|
||||
$errorCode = $e->errorInfo[1];
|
||||
$errorMessage = 'Error al actualizar el usuario: ';
|
||||
|
||||
if ($errorCode == 1062) {
|
||||
$errorMessage .= 'El nombre de usuario o correo electrónico ya está en uso';
|
||||
} else {
|
||||
$errorMessage .= 'Error en la base de datos';
|
||||
}
|
||||
|
||||
Log::error("Error actualizando usuario ID {$user->id}: " . $e->getMessage());
|
||||
return redirect()->back()->with('error', $errorMessage)->withInput();
|
||||
|
||||
} catch (\Exception $e) {
|
||||
// Manejar otros errores
|
||||
Log::error("Error general actualizando usuario ID {$user->id}: " . $e->getMessage());
|
||||
return redirect()->back()->with('error', 'Ocurrió un error inesperado al actualizar el usuario')->withInput();
|
||||
}
|
||||
}
|
||||
|
||||
public function show(User $user)
|
||||
{
|
||||
$previousUser = User::where('id', '<', $user->id)->latest('id')->first();
|
||||
$nextUser = User::where('id', '>', $user->id)->oldest('id')->first();
|
||||
|
||||
return view('users.show', [
|
||||
'user' => $user,
|
||||
'previousUser' => $previousUser,
|
||||
'nextUser' => $nextUser,
|
||||
'permissionGroups' => Permission::all()->groupBy('group')
|
||||
]);
|
||||
}
|
||||
|
||||
public function updatePassword(Request $request, User $user)
|
||||
|
||||
Reference in New Issue
Block a user