Skip to content

Commit 0f86ecd

Browse files
authored
Merge pull request #1 from mateocarciu/refacto/tasks/services
feat: refactor task and column management by using services and resou…
2 parents 1710284 + 69261a1 commit 0f86ecd

9 files changed

Lines changed: 228 additions & 80 deletions

File tree

.github/workflows/deploy.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ name: Deploy to Debian
33
on:
44
push:
55
branches: [ main ]
6+
workflow_dispatch:
67

78
jobs:
89
deploy:
@@ -21,6 +22,9 @@ jobs:
2122
2223
# Reconstruction des containers avec le nouveau Dockerfile (PHP 8.4 + Node)
2324
docker compose up -d --build
25+
26+
# Eviter l'erreur dubious ownership de Git dans le conteneur
27+
docker exec laravel-app git config --global --add safe.directory /var/www
2428
2529
# 2. Installer les dépendances PHP
2630
docker exec laravel-app composer install --ignore-platform-reqs
@@ -34,5 +38,5 @@ jobs:
3438
docker exec laravel-app php artisan migrate --force
3539
3640
# 5. Nettoyage des droits et des images
37-
docker exec laravel-app chown -R www-data:www-data storage bootstrap/cache database
41+
docker exec laravel-app sh -lc "mkdir -p storage bootstrap/cache database && touch database/database.sqlite && chown -R 1000:33 storage bootstrap/cache && chown 1000:33 database/database.sqlite"
3842
docker image prune -f

app/Http/Controllers/ColumnController.php

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,21 @@
33
namespace App\Http\Controllers;
44

55
use App\Models\Column;
6+
use App\Services\ColumnService;
67
use Illuminate\Http\Request;
78
use Illuminate\Http\RedirectResponse;
89

910
class ColumnController extends Controller
1011
{
12+
public function __construct(private ColumnService $columnService) {}
13+
1114
public function store(Request $request): RedirectResponse
1215
{
1316
$validated = $request->validate([
1417
'name' => ['required', 'string', 'max:255'],
1518
]);
1619

17-
$order = Column::where('team_id', $request->user()->team_id)->max('order') + 1 ?? 0;
18-
19-
Column::create([
20-
'name' => $validated['name'],
21-
'team_id' => $request->user()->team_id,
22-
'order' => $order,
23-
]);
20+
$this->columnService->createColumn($validated, $request->user());
2421

2522
return back();
2623
}
@@ -35,7 +32,7 @@ public function update(Request $request, Column $column): RedirectResponse
3532
'name' => ['required', 'string', 'max:255'],
3633
]);
3734

38-
$column->update($validated);
35+
$this->columnService->updateColumn($column, $validated);
3936

4037
return back();
4138
}
@@ -46,7 +43,7 @@ public function destroy(Request $request, Column $column): RedirectResponse
4643
abort(403);
4744
}
4845

49-
$column->delete();
46+
$this->columnService->deleteColumn($column);
5047

5148
return back();
5249
}

app/Http/Controllers/TaskController.php

Lines changed: 18 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,50 +4,40 @@
44

55
use App\Models\Task;
66
use App\Models\Column;
7+
use App\Services\TaskService;
8+
use App\Http\Resources\ColumnResource;
79
use Inertia\Inertia;
810
use Inertia\Response;
911
use Illuminate\Http\Request;
1012
use App\Http\Controllers\Controller;
1113
use App\Http\Requests\TaskCreateRequest;
1214
use Illuminate\Http\RedirectResponse;
1315
use App\Http\Requests\TaskUpdateRequest;
14-
use App\Jobs\IncrementTeamCompletedTasks;
1516

1617
class TaskController extends Controller
1718
{
19+
public function __construct(private TaskService $taskService) {}
20+
1821
public function index(Request $request): Response
1922
{
23+
$columns = Column::query()
24+
->with([
25+
'tasks' => function ($query) {
26+
$query->with('creator:id,name')->orderBy('order');
27+
}
28+
])
29+
->where('team_id', $request->user()->team_id)
30+
->orderBy('order')
31+
->get();
32+
2033
return Inertia::render('Tasks', [
21-
'columns' => Column::query()
22-
->with([
23-
'tasks' => function ($query) {
24-
$query->with('creator:id,name')->orderBy('order');
25-
}
26-
])
27-
->where('team_id', $request->user()->team_id)
28-
->orderBy('order')
29-
->get(),
34+
'columns' => ColumnResource::collection($columns),
3035
]);
3136
}
3237

3338
public function store(TaskCreateRequest $request): RedirectResponse
3439
{
35-
$columnId = $request->validated('column_id') ?? null;
36-
37-
if (!$columnId) {
38-
$columnId = Column::where('team_id', $request->user()->team_id)->orderBy('order')->value('id');
39-
}
40-
41-
$order = Task::where('column_id', $columnId)->max('order');
42-
$order = $order !== null ? $order + 1 : 0;
43-
44-
Task::query()->create([
45-
...$request->safe()->except('column_id'),
46-
'team_id' => $request->user()->team_id,
47-
'created_by' => $request->user()->id,
48-
'column_id' => $columnId,
49-
'order' => $order,
50-
]);
40+
$this->taskService->createTask($request->safe()->all(), $request->user());
5141

5242
return to_route('tasks.index');
5343
}
@@ -58,11 +48,7 @@ public function update(TaskUpdateRequest $request, Task $task): RedirectResponse
5848
abort(403, 'You are not authorized to update this task.');
5949
}
6050

61-
$task->update($request->validated());
62-
63-
if ($task->completed) {
64-
IncrementTeamCompletedTasks::dispatch($task->team_id);
65-
}
51+
$this->taskService->updateTask($task, $request->validated());
6652

6753
return back();
6854
}
@@ -73,7 +59,7 @@ public function destroy(Request $request, Task $task): RedirectResponse
7359
abort(403, 'You are not authorized to delete this task.');
7460
}
7561

76-
$task->delete();
62+
$this->taskService->deleteTask($task);
7763

7864
return back();
7965
}

app/Http/Controllers/TaskSequenceController.php

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
namespace App\Http\Controllers;
44

55
use App\Models\Task;
6+
use App\Services\TaskService;
67
use Illuminate\Http\Request;
78
use Illuminate\Http\RedirectResponse;
8-
use Illuminate\Support\Facades\DB;
99

1010
class TaskSequenceController extends Controller
1111
{
12+
public function __construct(private TaskService $taskService) {}
13+
1214
public function update(Request $request, Task $task): RedirectResponse
1315
{
1416
if ($task->team_id !== $request->user()->team_id) {
@@ -20,42 +22,7 @@ public function update(Request $request, Task $task): RedirectResponse
2022
'order' => ['required', 'integer', 'min:0'],
2123
]);
2224

23-
$newColumnId = $validated['column_id'];
24-
$newOrder = $validated['order'];
25-
26-
$oldColumnId = $task->column_id;
27-
$oldOrder = $task->order;
28-
29-
DB::transaction(function () use ($task, $newColumnId, $newOrder, $oldColumnId, $oldOrder) {
30-
if ($oldColumnId == $newColumnId) {
31-
// Moving within the same column
32-
if ($oldOrder < $newOrder) {
33-
Task::where('column_id', $newColumnId)
34-
->whereBetween('order', [$oldOrder + 1, $newOrder])
35-
->decrement('order');
36-
} elseif ($oldOrder > $newOrder) {
37-
Task::where('column_id', $newColumnId)
38-
->whereBetween('order', [$newOrder, $oldOrder - 1])
39-
->increment('order');
40-
}
41-
} else {
42-
// Moving to a different column
43-
// Shift tasks in old column down
44-
Task::where('column_id', $oldColumnId)
45-
->where('order', '>', $oldOrder)
46-
->decrement('order');
47-
48-
// Shift tasks in new column up to make room
49-
Task::where('column_id', $newColumnId)
50-
->where('order', '>=', $newOrder)
51-
->increment('order');
52-
}
53-
54-
$task->update([
55-
'column_id' => $newColumnId,
56-
'order' => $newOrder,
57-
]);
58-
});
25+
$this->taskService->updateSequence($task, $validated['column_id'], $validated['order']);
5926

6027
return back();
6128
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace App\Http\Resources;
4+
5+
use Illuminate\Http\Request;
6+
use Illuminate\Http\Resources\Json\JsonResource;
7+
8+
class ColumnResource extends JsonResource
9+
{
10+
/**
11+
* Transform the resource into an array.
12+
*
13+
* @return array<string, mixed>
14+
*/
15+
public function toArray(Request $request): array
16+
{
17+
return [
18+
'id' => $this->id,
19+
'team_id' => $this->team_id,
20+
'name' => $this->name,
21+
'order' => $this->order,
22+
'tasks' => TaskResource::collection($this->whenLoaded('tasks')),
23+
];
24+
}
25+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
3+
namespace App\Http\Resources;
4+
5+
use Illuminate\Http\Request;
6+
use Illuminate\Http\Resources\Json\JsonResource;
7+
8+
class TaskResource extends JsonResource
9+
{
10+
/**
11+
* Transform the resource into an array.
12+
*
13+
* @return array<string, mixed>
14+
*/
15+
public function toArray(Request $request): array
16+
{
17+
return [
18+
'id' => $this->id,
19+
'team_id' => $this->team_id,
20+
'column_id' => $this->column_id,
21+
'order' => $this->order,
22+
'title' => $this->title,
23+
'completed' => (bool)$this->completed,
24+
'due_date' => $this->due_date,
25+
'created_by' => $this->created_by,
26+
'creator' => $this->whenLoaded('creator', fn () => [
27+
'id' => $this->creator->id,
28+
'name' => $this->creator->name,
29+
]),
30+
];
31+
}
32+
}

app/Providers/AppServiceProvider.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace App\Providers;
44

55
use Illuminate\Support\ServiceProvider;
6+
use Illuminate\Http\Resources\Json\JsonResource;
67

78
class AppServiceProvider extends ServiceProvider
89
{
@@ -19,6 +20,6 @@ public function register(): void
1920
*/
2021
public function boot(): void
2122
{
22-
//
23+
JsonResource::withoutWrapping();
2324
}
2425
}

app/Services/ColumnService.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
namespace App\Services;
4+
5+
use App\Models\Column;
6+
use App\Models\User;
7+
8+
class ColumnService
9+
{
10+
/**
11+
* Create a new column.
12+
*/
13+
public function createColumn(array $data, User $user): Column
14+
{
15+
$order = Column::where('team_id', $user->team_id)->max('order');
16+
$order = $order !== null ? $order + 1 : 0;
17+
18+
return Column::create([
19+
'name' => $data['name'],
20+
'team_id' => $user->team_id,
21+
'order' => $order,
22+
]);
23+
}
24+
25+
/**
26+
* Update an existing column.
27+
*/
28+
public function updateColumn(Column $column, array $data): bool
29+
{
30+
return $column->update($data);
31+
}
32+
33+
/**
34+
* Delete a column.
35+
*/
36+
public function deleteColumn(Column $column): ?bool
37+
{
38+
return $column->delete();
39+
}
40+
}

0 commit comments

Comments
 (0)