Skip to content

Commit 4474496

Browse files
author
pb
committed
cleanup dead ends from previous json api. Refactor code to use resource hooks https://laraveljsonapi.io/5.x/routing/controllers.html#resource-hooks
1 parent 2bc22fc commit 4474496

21 files changed

Lines changed: 80 additions & 491 deletions

app/Http/Controllers/AssistantController.php

Lines changed: 31 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -4,91 +4,65 @@
44

55
namespace App\Http\Controllers;
66

7-
use App\Http\Controllers\Controller;
7+
use App\Events\AssistantCreated;
8+
use App\Events\AssistantUpdated;
89
use App\JsonApi\V1\Assistants\AssistantQuery;
910
use App\JsonApi\V1\Assistants\AssistantRequest;
1011
use App\JsonApi\V1\Assistants\AssistantSchema;
12+
use App\JsonApi\V1\Assistants\ReleaseAssistantRequest;
1113
use App\Models\Assistants\Assistant;
1214
use App\Services\Assistant\AssistantService;
13-
use App\JsonApi\V1\Assistants\ReleaseAssistantRequest;
1415
use App\Services\Assistant\Values\ReleaseStage;
1516
use Illuminate\Contracts\Support\Responsable;
1617
use Illuminate\Http\Response;
18+
use Illuminate\Support\Facades\Event;
1719
use LaravelJsonApi\Core\Responses\DataResponse;
1820
use LaravelJsonApi\Laravel\Http\Controllers\Actions;
1921

2022
class AssistantController extends Controller
2123
{
2224
use Actions\FetchMany;
2325
use Actions\FetchOne;
24-
25-
private const RELATIONS = ['language', 'category', 'tags', 'ai_tools', 'user_prompts'];
26-
27-
private function extractServiceDataForUpdateOrCreate(AssistantRequest $request): array
28-
{
29-
$validated = $request->validated();
30-
31-
$data = collect($validated)
32-
->except(['type', 'id', ...self::RELATIONS])
33-
->all();
34-
35-
if (isset($validated['language'])) {
36-
$data['language_id'] = (int) $validated['language']['id'];
37-
}
38-
if (isset($validated['category'])) {
39-
$data['category_id'] = (int) $validated['category']['id'];
40-
}
41-
if (isset($validated['tags'])) {
42-
$data['tag_ids'] = collect($validated['tags'])->map(fn ($item) => (int) $item['id'])->all();
43-
}
44-
if (isset($validated['ai_tools'])) {
45-
$data['ai_tool_ids'] = collect($validated['ai_tools'])->map(fn ($item) => (int) $item['id'])->all();
46-
}
47-
if (isset($validated['user_prompts'])) {
48-
$data['user_prompt_ids'] = collect($validated['user_prompts'])->map(fn ($item) => (int) $item['id'])->all();
49-
}
50-
51-
return $data;
52-
}
26+
use Actions\Store;
27+
use Actions\Update;
28+
use Actions\Destroy;
5329

5430
public function __construct(
5531
private readonly AssistantService $assistantService,
5632
) {
5733
$this->authorizeResource(Assistant::class, 'assistant');
5834
}
5935

60-
public function store(AssistantRequest $request, AssistantSchema $schema, AssistantQuery $query): Responsable
61-
{
62-
$this->authorize('create', Assistant::class);
63-
64-
$data = $this->extractServiceDataForUpdateOrCreate($request);
65-
66-
$assistant = $this->assistantService->create($data, $request->user());
67-
68-
return DataResponse::make($assistant)
69-
->withQueryParameters($query)
70-
->didCreate();
71-
}
72-
73-
public function update(AssistantRequest $request, AssistantSchema $schema, AssistantQuery $query, Assistant $assistant): Responsable
36+
public function created(Assistant $assistant, AssistantRequest $request, AssistantQuery $query): void
7437
{
75-
$this->authorize('update', $assistant);
76-
77-
$data = $this->extractServiceDataForUpdateOrCreate($request);
78-
79-
$assistant = $this->assistantService->update($assistant, $data);
80-
81-
return DataResponse::make($assistant)
82-
->withQueryParameters($query);
38+
Event::dispatch(new AssistantCreated($assistant));
8339
}
8440

85-
public function destroy(Assistant $assistant): Response
41+
public function updated(Assistant $assistant, AssistantRequest $request, AssistantQuery $query): void
8642
{
87-
$this->authorize('delete', $assistant);
43+
$changedKeys = array_values(array_filter(
44+
array_keys($assistant->getChanges()),
45+
fn(string $key) => $key !== 'updated_at',
46+
));
8847

89-
$assistant->delete();
48+
$validated = $request->validated();
49+
if (isset($validated['tags'])) {
50+
$changedKeys[] = 'tags';
51+
}
52+
if (isset($validated['ai_tools'])) {
53+
$changedKeys[] = 'ai_tools';
54+
}
55+
if (isset($validated['user_prompts'])) {
56+
$changedKeys[] = 'user_prompts';
57+
}
9058

91-
return response()->noContent();
59+
if ($changedKeys !== []) {
60+
Event::dispatch(new AssistantUpdated(
61+
$assistant,
62+
$validated['version_text'] ?? null,
63+
$changedKeys,
64+
));
65+
}
9266
}
9367

9468
public function remix(AssistantSchema $schema, AssistantQuery $query, Assistant $assistant): Responsable

app/Http/Resources/AiTool/AiToolResource.php

Lines changed: 0 additions & 22 deletions
This file was deleted.

app/Http/Resources/Organization/OrganizationResource.php

Lines changed: 0 additions & 16 deletions
This file was deleted.

app/Http/Resources/Tag/TagResource.php

Lines changed: 0 additions & 16 deletions
This file was deleted.

app/Http/Resources/User/UserResource.php

Lines changed: 0 additions & 14 deletions
This file was deleted.

app/Http/Resources/UserPrompt/UserPromptResource.php

Lines changed: 0 additions & 16 deletions
This file was deleted.

app/Http/Resources/Version/VersionResource.php

Lines changed: 0 additions & 18 deletions
This file was deleted.

app/JsonApi/V1/Assistants/AssistantRequest.php

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use App\Services\Assistant\Values\ReleaseStage;
88
use Illuminate\Validation\Rule;
99
use LaravelJsonApi\Laravel\Http\Requests\ResourceRequest;
10+
use LaravelJsonApi\Validation\Rule as JsonApiRule;
1011

1112
class AssistantRequest extends ResourceRequest
1213
{
@@ -29,22 +30,15 @@ public function rules(): array
2930
'allow_model_select' => ['required', 'boolean'],
3031
'release_stage' => ['required', Rule::enum(ReleaseStage::class)],
3132
'formality' => ['required', 'string'],
32-
'category' => ['required', 'array:type,id'],
33-
'category.type' => ['required', 'in:categories'],
34-
'category.id' => ['required', 'integer', 'exists:categories,id'],
35-
'language' => ['required', 'array:type,id'],
36-
'language.type' => ['required', 'in:languages'],
37-
'language.id' => ['required', 'integer', 'exists:languages,id'],
33+
'category' => ['required', JsonApiRule::toOne()],
34+
'language' => ['required', JsonApiRule::toOne()],
3835
'model' => ['required', 'string'],
3936
'model_length' => ['required', 'integer', 'min:1'],
4037
'model_temp' => ['required', 'numeric', 'min:0', 'max:1'],
4138
'model_top_p' => ['required', 'numeric', 'min:0', 'max:1'],
42-
'user_prompts' => ['array'],
43-
'user_prompts.*.id' => ['required', 'integer', 'exists:user_prompts,id'],
44-
'ai_tools' => ['array'],
45-
'ai_tools.*.id' => ['required', 'integer', 'exists:ai_tools,id'],
46-
'tags' => ['array'],
47-
'tags.*.id' => ['required', 'integer', 'exists:tags,id'],
39+
'user_prompts' => [JsonApiRule::toMany()],
40+
'ai_tools' => [JsonApiRule::toMany()],
41+
'tags' => [JsonApiRule::toMany()],
4842
];
4943

5044
if ($this->isUpdating()) {
@@ -65,21 +59,17 @@ public function rules(): array
6559
$rules['detail_description'] = ['sometimes', 'nullable', 'string'];
6660
$rules['allow_remix'] = ['sometimes', 'boolean'];
6761
$rules['allow_model_select'] = ['sometimes', 'boolean'];
68-
$rules['category'] = ['sometimes', 'array:type,id'];
69-
$rules['category.type'] = ['sometimes', 'in:categories'];
70-
$rules['category.id'] = ['sometimes', 'integer', 'exists:categories,id'];
71-
$rules['language'] = ['sometimes', 'array:type,id'];
72-
$rules['language.type'] = ['sometimes', 'in:languages'];
73-
$rules['language.id'] = ['sometimes', 'integer', 'exists:languages,id'];
62+
$rules['category'] = ['sometimes', JsonApiRule::toOne()];
63+
$rules['language'] = ['sometimes', JsonApiRule::toOne()];
7464
$rules['release_stage'] = ['sometimes', Rule::enum(ReleaseStage::class)];
7565
$rules['formality'] = ['sometimes', 'string'];
7666
$rules['model'] = ['sometimes', 'string'];
7767
$rules['model_length'] = ['sometimes', 'integer', 'min:1'];
7868
$rules['model_temp'] = ['sometimes', 'numeric', 'min:0', 'max:1'];
7969
$rules['model_top_p'] = ['sometimes', 'numeric', 'min:0', 'max:1'];
80-
$rules['user_prompts'] = ['sometimes', 'array'];
81-
$rules['ai_tools'] = ['sometimes', 'array'];
82-
$rules['tags'] = ['sometimes', 'array'];
70+
$rules['user_prompts'] = ['sometimes', JsonApiRule::toMany()];
71+
$rules['ai_tools'] = ['sometimes', JsonApiRule::toMany()];
72+
$rules['tags'] = ['sometimes', JsonApiRule::toMany()];
8373
$rules['version_text'] = ['sometimes', 'nullable', 'string'];
8474
}
8575

app/JsonApi/V1/Assistants/AssistantSchema.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,6 @@ public function indexQuery(?Request $request, Builder $query): Builder
8080
return $query;
8181
}
8282

83-
return app(AssistantRepository::class)->scopeVisible($query, $user);
83+
return app(AssistantRepository::class)->filterVisibleForUser($query, $user);
8484
}
8585
}

app/JsonApi/V1/Assistants/CategoryFilter.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace App\JsonApi\V1\Assistants;
66

7+
use App\Services\Assistant\Repositories\AssistantRepository;
78
use LaravelJsonApi\Eloquent\Contracts\Filter;
89
use LaravelJsonApi\Eloquent\Filters\Concerns\DeserializesValue;
910
use LaravelJsonApi\Eloquent\Filters\Concerns\IsSingular;
@@ -25,8 +26,6 @@ public function key(): string
2526

2627
public function apply($query, $value)
2728
{
28-
return $query->whereHas('category', function ($q) use ($value) {
29-
$q->where('text', $value);
30-
});
29+
return app(AssistantRepository::class)->filterByCategoryText($query, $value);
3130
}
3231
}

0 commit comments

Comments
 (0)