Skip to content

Commit 49097d6

Browse files
committed
Add API for Impostazioni
1 parent e94aa64 commit 49097d6

11 files changed

Lines changed: 250 additions & 0 deletions
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace Modules\Impostazioni\API\Controllers;
4+
5+
use ApiPlatform\Metadata\Operation;
6+
use ApiPlatform\State\ProviderInterface;
7+
use Models\Setting;
8+
use Modules\Impostazioni\API\ImpostazioneResource;
9+
10+
final class GetImpostazioneProvider implements ProviderInterface
11+
{
12+
public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?ImpostazioneResource
13+
{
14+
$setting = Setting::find($uriVariables['id']);
15+
if (!$setting) {
16+
return null;
17+
}
18+
19+
$response = ImpostazioneResource::fromModel($setting);
20+
21+
return $response;
22+
}
23+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace Modules\Impostazioni\API\Controllers;
4+
5+
use ApiPlatform\Metadata\Operation;
6+
use ApiPlatform\State\ParameterNotFound;
7+
use ApiPlatform\State\ProviderInterface;
8+
use Models\Setting;
9+
use Modules\Impostazioni\API\ImpostazioneResource;
10+
11+
final class ListImpostazioniProvider implements ProviderInterface
12+
{
13+
public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?array
14+
{
15+
$sezione = $operation->getParameters()->get('sezione')->getValue();
16+
$search = $operation->getParameters()->get('ricerca')->getValue();
17+
18+
// Trova le impostazioni che corrispondono alla ricerca
19+
if (!($search instanceof ParameterNotFound)) {
20+
$impostazioni = Setting::where('nome', 'like', '%'.$search.'%')
21+
->orWhere('sezione', 'like', '%'.$search.'%')
22+
->get();
23+
} elseif (!($sezione instanceof ParameterNotFound)) {
24+
$impostazioni = Setting::where('sezione', $sezione)->get();
25+
} else {
26+
$impostazioni = Setting::all();
27+
}
28+
29+
$results = [];
30+
foreach ($impostazioni as $impostazione) {
31+
$results[] = ImpostazioneResource::fromModel($impostazione);
32+
}
33+
34+
return $results;
35+
}
36+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace Modules\Impostazioni\API\Controllers;
4+
5+
use ApiPlatform\Metadata\Operation;
6+
use ApiPlatform\State\ProviderInterface;
7+
use Models\Setting;
8+
use Modules\Impostazioni\API\Models\ListSezioniImpostazioniResponse;
9+
10+
final class ListSezioniImpostazioniProvider implements ProviderInterface
11+
{
12+
public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?ListSezioniImpostazioniResponse
13+
{
14+
$gruppi = Setting::selectRaw('sezione AS nome, COUNT(id) AS numero')
15+
->groupBy(['sezione'])
16+
->orderBy('sezione')
17+
->get();
18+
19+
$response = new ListSezioniImpostazioniResponse();
20+
$response->sezioni = [];
21+
22+
foreach ($gruppi as $key => $gruppo) {
23+
$response->sezioni[$gruppo->nome] = $gruppo->numero;
24+
}
25+
26+
return $response;
27+
}
28+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace Modules\Impostazioni\API\Controllers;
4+
5+
use ApiPlatform\Metadata\Operation;
6+
use ApiPlatform\State\ProcessorInterface;
7+
use Models\Setting;
8+
use Modules\Impostazioni\API\Models\UpdateImpostazioneRequest;
9+
use Modules\Impostazioni\API\Models\UpdateImpostazioneResponse;
10+
11+
final class UpdateImpostazioneProcessor implements ProcessorInterface
12+
{
13+
public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): UpdateImpostazioneResponse
14+
{
15+
if (!$data instanceof UpdateImpostazioneRequest) {
16+
throw new \InvalidArgumentException();
17+
}
18+
19+
$id = $uriVariables['id'];
20+
$response = new UpdateImpostazioneResponse();
21+
22+
$impostazione = Setting::find($id);
23+
if (!$impostazione->editable) {
24+
$response->edited = true;
25+
26+
return $response;
27+
}
28+
29+
$response->edited = \Settings::setValue($impostazione->id, $data->valore);
30+
31+
return $response;
32+
}
33+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
3+
namespace Modules\Impostazioni\API;
4+
5+
use ApiPlatform\Metadata\ApiResource;
6+
use ApiPlatform\Metadata\Get;
7+
use ApiPlatform\Metadata\GetCollection;
8+
use ApiPlatform\Metadata\Put;
9+
use ApiPlatform\Metadata\QueryParameter;
10+
use Models\Setting;
11+
use Modules\Impostazioni\API\Controllers\GetImpostazioneProvider;
12+
use Modules\Impostazioni\API\Controllers\ListImpostazioniProvider;
13+
use Modules\Impostazioni\API\Controllers\ListSezioniImpostazioniProvider;
14+
use Modules\Impostazioni\API\Controllers\UpdateImpostazioneProcessor;
15+
use Modules\Impostazioni\API\Models\ListSezioniImpostazioniResponse;
16+
use Modules\Impostazioni\API\Models\UpdateImpostazioneRequest;
17+
use Modules\Impostazioni\API\Models\UpdateImpostazioneResponse;
18+
19+
#[ApiResource(
20+
shortName: 'Impostazione',
21+
operations: [
22+
new Get(
23+
uriTemplate: '/impostazioni/sezioni',
24+
provider: ListSezioniImpostazioniProvider::class,
25+
output: ListSezioniImpostazioniResponse::class,
26+
),
27+
new GetCollection(
28+
uriTemplate: '/impostazioni',
29+
provider: ListImpostazioniProvider::class,
30+
paginationEnabled: false,
31+
parameters: [
32+
'ricerca' => new QueryParameter(property: 'hydra:freetextQuery', required: false),
33+
'sezione' => new QueryParameter(property: 'hydra:freetextQuery', required: false),
34+
]
35+
),
36+
new Get(
37+
uriTemplate: '/impostazione/{id}',
38+
provider: GetImpostazioneProvider::class,
39+
),
40+
new Put(
41+
uriTemplate: '/impostazione/{id}',
42+
provider: GetImpostazioneProvider::class,
43+
processor: UpdateImpostazioneProcessor::class,
44+
input: UpdateImpostazioneRequest::class,
45+
output: UpdateImpostazioneResponse::class,
46+
),
47+
],
48+
)]
49+
class ImpostazioneResource
50+
{
51+
public function __construct(
52+
public int $id,
53+
public string $sezione,
54+
public string $nome,
55+
public ?string $valore,
56+
public string $tipo,
57+
public bool $editable,
58+
public ?string $created_at,
59+
public ?string $updated_at,
60+
) {
61+
}
62+
63+
public static function fromModel(Setting $setting)
64+
{
65+
return new self(
66+
id: $setting->id,
67+
sezione: $setting->sezione,
68+
nome: $setting->nome,
69+
valore: $setting->valore,
70+
tipo: $setting->tipo,
71+
editable: $setting->editable,
72+
created_at: $setting->created_at,
73+
updated_at: $setting->updated_at,
74+
);
75+
}
76+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace Modules\Impostazioni\API\Models;
4+
5+
class ListSezioniImpostazioniResponse
6+
{
7+
/** @var array<string,int> */
8+
public array $sezioni;
9+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Modules\Impostazioni\API\Models;
4+
5+
use Symfony\Component\Validator\Constraints as Assert;
6+
7+
class PutImpostazioneRequest
8+
{
9+
#[Assert\NotBlank]
10+
public string $valore;
11+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?php
2+
3+
namespace Modules\Impostazioni\API\Models;
4+
5+
class PutImpostazioneResponse
6+
{
7+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Modules\Impostazioni\API\Models;
4+
5+
use Symfony\Component\Validator\Constraints as Assert;
6+
7+
class UpdateImpostazioneRequest
8+
{
9+
#[Assert\NotBlank]
10+
public string $valore;
11+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Modules\Impostazioni\API\Models;
4+
5+
class UpdateImpostazioneResponse
6+
{
7+
public bool $edited;
8+
}

0 commit comments

Comments
 (0)