diff --git a/.idea/osm_rewrite.iml b/.idea/osm_rewrite.iml
index 7d22bbad4..fed8ab103 100644
--- a/.idea/osm_rewrite.iml
+++ b/.idea/osm_rewrite.iml
@@ -86,6 +86,7 @@
+
diff --git a/.idea/php.xml b/.idea/php.xml
index edeb4dabe..201f1f385 100644
--- a/.idea/php.xml
+++ b/.idea/php.xml
@@ -112,6 +112,7 @@
+
diff --git a/app/Http/Controllers/Api/ApiController.php b/app/Http/Controllers/Api/ApiController.php
new file mode 100644
index 000000000..aaf32b3f5
--- /dev/null
+++ b/app/Http/Controllers/Api/ApiController.php
@@ -0,0 +1,85 @@
+respondWithSuccess(new $this->resource($this->model::all()));
+ }
+
+ /**
+ * Store a newly created resource in storage.
+ */
+ public function store(Request $request): JsonResponse
+ {
+ $instance = new $this->model();
+ $instance->fill($request->all());
+
+ $created = $instance->save();
+
+ return $created ? $this->respondCreated(new $this->resource($instance)) : $this->respondError();
+ }
+
+ /**
+ * Display the specified resource.
+ */
+ public function show(int $id): JsonResponse
+ {
+ $instance = $this->model::find($id);
+
+ if (!assert($instance instanceof Model)) {
+ return $this->respondNotFound(__('Risorsa non trovata.'));
+ }
+
+ return $this->respondWithSuccess(new $this->resource($this->model::find($id)));
+ }
+
+ /**
+ * Update the specified resource in storage.
+ */
+ public function update(Request $request, int $id): JsonResponse
+ {
+ $instance = $this->model::find($id);
+ if (!assert($instance instanceof Model)) {
+ return $this->respondNotFound(__('Risorsa non trovata.'));
+ }
+
+ $instance->fill($request->all());
+ $updated = $instance->save();
+
+ return $updated ? $this->respondWithSuccess($instance) : $this->respondError();
+ }
+
+ /**
+ * Remove the specified resource from storage.
+ */
+ public function destroy(int $id): JsonResponse
+ {
+ $instance = $this->model::find($id);
+
+ if (!assert($instance instanceof Model)) {
+ return $this->respondNotFound(__('Risorsa non trovata.'));
+ }
+
+ $deleted = $instance->delete();
+
+ return $deleted ? $this->respondNoContent() : $this->respondError();
+ }
+}
diff --git a/app/Http/Controllers/Api/UserController.php b/app/Http/Controllers/Api/UserController.php
index 4544af9f2..a282c085b 100644
--- a/app/Http/Controllers/Api/UserController.php
+++ b/app/Http/Controllers/Api/UserController.php
@@ -2,60 +2,10 @@
namespace App\Http\Controllers\Api;
-use App\Http\Controllers\Controller;
-use App\Http\Resources\UserResource;
use App\Models\User;
-use Illuminate\Http\Request;
-use Illuminate\Http\Resources\Json\JsonResource;
+use Illuminate\Database\Eloquent\Model;
-class UserController extends Controller
+class UserController extends ApiController
{
- /**
- * Display a listing of the resource.
- *
- * @return \Illuminate\Http\Response
- */
- public function index()
- {
- return new UserResource(User::all());
- }
-
- /**
- * Store a newly created resource in storage.
- *
- * @return \Illuminate\Http\Response
- */
- public function store(Request $request)
- {
- }
-
- /**
- * Display the specified resource.
- */
- public function show(int $id): JsonResource
- {
- return new UserResource(User::find($id));
- }
-
- /**
- * Update the specified resource in storage.
- *
- * @param int $id
- *
- * @return \Illuminate\Http\Response
- */
- public function update(Request $request, $id)
- {
- }
-
- /**
- * Remove the specified resource from storage.
- *
- * @param int $id
- *
- * @return \Illuminate\Http\Response
- */
- public function destroy($id)
- {
- }
+ protected string|Model $model = User::class;
}
diff --git a/app/Http/Resources/UserResource.php b/app/Http/Resources/ApiResource.php
similarity index 91%
rename from app/Http/Resources/UserResource.php
rename to app/Http/Resources/ApiResource.php
index a24b00412..6f9df9670 100644
--- a/app/Http/Resources/UserResource.php
+++ b/app/Http/Resources/ApiResource.php
@@ -7,7 +7,7 @@ use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use JsonSerializable;
-class UserResource extends JsonResource
+class ApiResource extends JsonResource
{
/**
* Transform the resource into an array.
diff --git a/composer.json b/composer.json
index 34c2fe059..717b711e4 100644
--- a/composer.json
+++ b/composer.json
@@ -31,6 +31,7 @@
"require": {
"php": "^8",
"ext-pdo": "*",
+ "f9webltd/laravel-api-response-helpers": "^1.4",
"fideloper/proxy": "^4",
"fruitcake/laravel-cors": "^2",
"guzzlehttp/guzzle": "^7",
diff --git a/routes/api.php b/routes/api.php
index 4a4f3282c..01529f18e 100644
--- a/routes/api.php
+++ b/routes/api.php
@@ -3,7 +3,6 @@
/** @noinspection UnusedFunctionResultInspection */
use App\Http\Controllers\Api\UserController;
-use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
/*