Explorar el Código

feat: :sparkles: crud especialidades

crud especialidades
Gustavo Zanatta hace 1 mes
padre
commit
ac77588b66

+ 46 - 0
app/Http/Controllers/SpecialityController.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Services\SpecialityService;
+use App\Http\Requests\SpecialityRequest;
+use App\Http\Resources\SpecialityResource;
+use Illuminate\Http\JsonResponse;
+use Illuminate\Support\Facades\Log;
+
+class SpecialityController extends Controller
+{
+    public function __construct(
+        protected SpecialityService $service,
+    ) {}
+
+    public function index(): JsonResponse
+    {
+        $items = $this->service->getAll();
+        return $this->successResponse(payload: SpecialityResource::collection($items));
+    }
+
+    public function store(SpecialityRequest $request): JsonResponse
+    {
+        $item = $this->service->create($request->validated());
+        return $this->successResponse(payload: new SpecialityResource($item), message: __('messages.created'), code: 201);
+    }
+
+    public function show(int $id): JsonResponse
+    {
+        $item = $this->service->findById($id);
+        return $this->successResponse(payload: new SpecialityResource($item));
+    }
+
+    public function update(SpecialityRequest $request, int $id): JsonResponse
+    {
+        $item = $this->service->update($id, $request->validated());
+        return $this->successResponse(payload: new SpecialityResource($item), message: __('messages.updated'));
+    }
+
+    public function destroy(int $id): JsonResponse
+    {
+        $this->service->delete($id);
+        return $this->successResponse(message: __('messages.deleted'), code: 204);
+    }
+}

+ 32 - 0
app/Http/Requests/SpecialityRequest.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class SpecialityRequest extends FormRequest
+{
+    public function rules(): array
+    {
+        $rules = [
+            'description' => 'sometimes|string|max:255',
+            'active' => 'sometimes|boolean',
+        ];
+
+        if ($this->isMethod('POST')) {
+            $rules['description'] = 'required|string|max:255';
+        }
+
+        return $rules;
+    }
+
+    /**
+    * Add custom messages when needed
+    * public function messages(): array
+    * {
+    *   return [
+    *        'field.required' => __('message.algo'),
+    *    ];
+    * }
+    */
+}

+ 36 - 0
app/Http/Resources/SpecialityResource.php

@@ -0,0 +1,36 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
+use App\Models\Speciality;
+
+class SpecialityResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @return array<string, mixed>
+     */
+    public function toArray(Request $request): array
+    {
+        return [
+            'id' => $this->id,
+            'description' => $this->description,
+            'active' => $this->active,
+            'created_at' => $this->created_at?->format('d/m/Y H:i'),
+            'updated_at' => $this->updated_at?->format('d/m/Y H:i'),
+        ];
+    }
+
+    /**
+     * @param \Illuminate\Database\Eloquent\Collection<Speciality> $resource
+     * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection<SpecialityResource>
+     */
+    public static function collection($resource): AnonymousResourceCollection
+    {
+        return parent::collection($resource);
+    }
+}

+ 38 - 0
app/Models/Speciality.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+/**
+ * @property int $id
+ * @property string $description
+ * @property bool $active
+ * @property \Carbon\Carbon $created_at
+ * @property \Carbon\Carbon $updated_at
+ * @property \Carbon\Carbon|null $deleted_at
+ */
+class Speciality extends Model
+{
+    use HasFactory, SoftDeletes;
+
+    protected $table = 'specialities';
+
+    protected $guarded = [
+        'id',
+    ];
+
+    protected $casts = [
+        'created_at' => 'datetime',
+        'updated_at' => 'datetime',
+        'deleted_at' => 'datetime',
+        'active' => 'boolean',
+    ];
+
+    protected $fillable = [
+        'description',
+        'active',
+    ];
+}

+ 51 - 0
app/Services/SpecialityService.php

@@ -0,0 +1,51 @@
+<?php
+
+namespace App\Services;
+
+use App\Models\Speciality;
+use Illuminate\Database\Eloquent\Collection;
+
+class SpecialityService
+{
+    public function getAll(): Collection
+    {
+        return Speciality::query()
+            ->orderBy('created_at', 'desc')
+            ->get();
+    }
+
+    public function findById(int $id): ?Speciality
+    {
+        return Speciality::find($id);
+    }
+
+    public function create(array $data): Speciality
+    {
+        return Speciality::create($data);
+    }
+
+    public function update(int $id, array $data): ?Speciality
+    {
+        $model = $this->findById($id);
+
+        if (!$model) {
+            return null;
+        }
+
+        $model->update($data);
+        return $model->fresh();
+    }
+
+    public function delete(int $id): bool
+    {
+        $model = $this->findById($id);
+
+        if (!$model) {
+            return false;
+        }
+
+        return $model->delete();
+    }
+
+    // Add custom business logic methods here
+}

+ 24 - 0
database/migrations/2026_02_06_182358_create_specialities_table.php

@@ -0,0 +1,24 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    public function up(): void
+    {
+        Schema::create('specialities', function (Blueprint $table) {
+            $table->id();
+            $table->string('description');
+            $table->boolean('active')->default(true);
+            $table->timestamps();
+            $table->softDeletes();
+        });
+    }
+
+    public function down(): void
+    {
+        Schema::dropIfExists('specialities');
+    }
+};

+ 6 - 0
database/seeders/PermissionSeeder.php

@@ -100,6 +100,12 @@ class PermissionSeeder extends Seeder
                         "bits" => 271,
                         "children" => [],
                     ],
+                    [
+                        "scope" => "config.speciality",
+                        "description" => "Configurações de Especialidades",
+                        "bits" => 271,
+                        "children" => [],
+                    ],
                 ],
             ],
         ];

+ 1 - 0
database/seeders/UserTypePermissionSeeder.php

@@ -39,6 +39,7 @@ class UserTypePermissionSeeder extends Seeder
                         ['scope' => 'config.provider', 'bits' => 271],
                         ['scope' => 'config.media', 'bits' => 271],
                         ['scope' => 'config.service_type', 'bits' => 271],
+                        ['scope' => 'config.speciality', 'bits' => 271],
                     ];
                     $this->seedUserTypePermissions($userPermissions, UserTypeEnum::USER->value);
                     break;

+ 14 - 0
routes/authRoutes/speciality.php

@@ -0,0 +1,14 @@
+<?php
+
+use Illuminate\Support\Facades\Route;
+use App\Http\Controllers\SpecialityController;
+
+Route::get('/specialities', [SpecialityController::class, 'index'])->middleware('permission:config.speciality,view');
+
+Route::post('/speciality', [SpecialityController::class, 'store'])->middleware('permission:config.speciality,add');
+
+Route::get('/speciality/{id}', [SpecialityController::class, 'show'])->middleware('permission:config.speciality,view');
+
+Route::put('/speciality/{id}', [SpecialityController::class, 'update'])->middleware('permission:config.speciality,edit');
+
+Route::delete('/speciality/{id}', [SpecialityController::class, 'destroy'])->middleware('permission:config.speciality,delete');