From 8f753cb3493d86645986b7d45fbed635c260b928 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Mon, 28 Jun 2021 17:04:15 +0200 Subject: [PATCH] Ticket 244 et ompagnie : permet un soft delete de user et projects --- app/Http/Controllers/CrudController.php | 6 +++- app/Http/Controllers/TicketController.php | 2 +- app/Http/Requests/CrudRequest.php | 3 ++ app/Models/Project.php | 7 ++-- app/Models/User.php | 35 ++++++++++++++++++- app/Providers/RouteServiceProvider.php | 4 +++ app/Traits/IsCrudModel.php | 6 ++-- ..._06_28_163754_add_soft_delete_on_users.php | 32 +++++++++++++++++ ..._28_163755_add_soft_delete_on_projects.php | 32 +++++++++++++++++ 9 files changed, 119 insertions(+), 8 deletions(-) create mode 100644 database/migrations/2021_06_28_163754_add_soft_delete_on_users.php create mode 100644 database/migrations/2021_06_28_163755_add_soft_delete_on_projects.php diff --git a/app/Http/Controllers/CrudController.php b/app/Http/Controllers/CrudController.php index 8eb8e1b..ec6e447 100644 --- a/app/Http/Controllers/CrudController.php +++ b/app/Http/Controllers/CrudController.php @@ -10,6 +10,7 @@ use App\Http\Requests\UpdateCrudModel; use App\Http\Resources\CrudResource; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Session; @@ -166,7 +167,10 @@ class CrudController extends Controller public function destroy(Model $model) { - if ($restrict = $model->gotHasManyRelationWithRestrictOnDelete()) { + if ( + !in_array(SoftDeletes::class, class_uses_recursive($model), true) and + $restrict = $model->gotHasManyRelationWithRestrictOnDelete() + ) { return redirect()->back() ->with('error', trans( ':model n\'as pas pu être supprimé car il est encore associé avec des :associated', diff --git a/app/Http/Controllers/TicketController.php b/app/Http/Controllers/TicketController.php index 329e216..d9fc380 100644 --- a/app/Http/Controllers/TicketController.php +++ b/app/Http/Controllers/TicketController.php @@ -39,7 +39,7 @@ class TicketController extends Controller { /** @var \App\Models\User */ $user = auth()->user(); - $tickets = Ticket::with('project'); + $tickets = Ticket::with('project')->has('project'); if (!$user->role->equals(Role::admin())) { $tickets = $tickets->whereHas('project', function ($q) use ($user) { $q->whereHas('users', function ($q) use ($user) { diff --git a/app/Http/Requests/CrudRequest.php b/app/Http/Requests/CrudRequest.php index 3ee5fd7..a7a3cbf 100644 --- a/app/Http/Requests/CrudRequest.php +++ b/app/Http/Requests/CrudRequest.php @@ -60,6 +60,9 @@ class CrudRequest extends FormRequest if ($props[$k]['type']->equals(CrudType::belongsToMany())) { $propsRules["$k.*"][0] = 'exists:' . (new $props[$k]['belongsToMany']())->getTable() . ',id'; + if (!isset($this->{$k})) { + $this->merge([$k => []]); + } } } } diff --git a/app/Models/Project.php b/app/Models/Project.php index 28a236a..58bff7c 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -8,6 +8,7 @@ use App\Enums\Role; use App\Traits\IsCrudModel; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Facades\File; use Illuminate\Support\Str; @@ -15,6 +16,7 @@ class Project extends Model { use HasFactory; use IsCrudModel; + use SoftDeletes; protected $crudLabelColumn = 'name'; @@ -46,6 +48,7 @@ class Project extends Model 'type' => CrudType::belongsToMany(), 'belongsToMany' => User::class, 'belongsToManyLabel' => 'name', + 'nullable' => true, 'readonly' => function () { return auth()->user()->role->equals(Role::admin()) ? false : true; }, @@ -65,7 +68,7 @@ class Project extends Model static::created(function (Project $project) { $path = Project::ticketAssetsFullPath($project->slug_name); if (!File::exists($path)) { - File::makeDirectory($path); + File::makeDirectory($path, 0755, true); } }); static::updating(function (Project $project) { @@ -75,7 +78,7 @@ class Project extends Model if (File::exists($oldPath)) { File::move($oldPath, $newPath); } else { - File::makeDirectory($newPath); + File::makeDirectory($newPath, 0755, true); } }); static::deleted(function (Project $project) { diff --git a/app/Models/User.php b/app/Models/User.php index 7f85d51..cbf45df 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -7,8 +7,11 @@ use App\Enums\CrudType; use App\Enums\Role; use App\Traits\IsCrudModel; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; +use Illuminate\Support\Facades\Hash; +use Illuminate\Support\Str; use Kwaadpepper\Enum\Traits\CastsEnums; class User extends Authenticatable @@ -17,6 +20,7 @@ class User extends Authenticatable use Notifiable; use CastsEnums; use IsCrudModel; + use SoftDeletes; protected $enumCasts = [ 'role' => Role::class @@ -81,7 +85,19 @@ class User extends Authenticatable 'required' => true, 'nullable' => false, 'validate' => [ - 'max:255' + 'max:255', + // @phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed + function ($attribute, $value, $fail) { + $q = static::query(); + if (request()->user) { + $q = $q->where('id', '!=', $this->id); + } + if ($q->where('email', $value)->exists()) { + $fail(__(':attribute est déjà utilisé', [ + 'attribute' => $attribute + ])); + } + } ], 'actions' => [ CrudAction::viewAny(), @@ -123,6 +139,23 @@ class User extends Authenticatable parent::__construct($attributes); } + protected static function booted() + { + static::creating(function (User $user) { + if (\is_null($user->password)) { + $user->password = Str::random(10); + } + if (Hash::needsRehash($user->password)) { + $user->password = Hash::make($user->password); + } + }); + static::updating(function (User $user) { + if (Hash::needsRehash($user->password)) { + $user->password = Hash::make($user->password); + } + }); + } + public function tickets() { return $this->hasMany(Ticket::class, 'created_by'); diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index cd8fc15..2595412 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -3,6 +3,7 @@ namespace App\Providers; use App\Models\Project; +use App\Models\Ticket; use App\Models\User; use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; @@ -51,6 +52,9 @@ class RouteServiceProvider extends ServiceProvider }); Route::model('user', User::class); Route::model('project', Project::class); + Route::bind('ticket', function ($value) { + return Ticket::where('id', $value)->has('project')->firstOrFail(); + }); } /** diff --git a/app/Traits/IsCrudModel.php b/app/Traits/IsCrudModel.php index 70ccd5b..694d06e 100644 --- a/app/Traits/IsCrudModel.php +++ b/app/Traits/IsCrudModel.php @@ -168,11 +168,11 @@ trait IsCrudModel return collect(static::$editableProperties)->mapWithKeys(function ($item, $key) { $item = \array_merge(self::$schemaCrud, $item); $defaultRules = []; - if (!$item['nullable']) { + if (!$item['nullable'] === true) { $defaultRules[] = 'required'; - } elseif ($item['required']) { + } elseif ($item['required'] === true) { $defaultRules[] = 'required'; - } elseif ($item['readonly']) { + } elseif ($item['readonly'] === true) { $defaultRules[] = 'prohibited'; } switch ($item['type']) { diff --git a/database/migrations/2021_06_28_163754_add_soft_delete_on_users.php b/database/migrations/2021_06_28_163754_add_soft_delete_on_users.php new file mode 100644 index 0000000..cf19b99 --- /dev/null +++ b/database/migrations/2021_06_28_163754_add_soft_delete_on_users.php @@ -0,0 +1,32 @@ +softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropSoftDeletes(); + }); + } +} diff --git a/database/migrations/2021_06_28_163755_add_soft_delete_on_projects.php b/database/migrations/2021_06_28_163755_add_soft_delete_on_projects.php new file mode 100644 index 0000000..b58a5fe --- /dev/null +++ b/database/migrations/2021_06_28_163755_add_soft_delete_on_projects.php @@ -0,0 +1,32 @@ +softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('projects', function (Blueprint $table) { + $table->dropSoftDeletes(); + }); + } +}