Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ name: Deploy to Debian
on:
push:
branches: [ main ]
workflow_dispatch:

jobs:
deploy:
Expand All @@ -21,6 +22,9 @@ jobs:

# Reconstruction des containers avec le nouveau Dockerfile (PHP 8.4 + Node)
docker compose up -d --build

# Eviter l'erreur dubious ownership de Git dans le conteneur
docker exec laravel-app git config --global --add safe.directory /var/www

# 2. Installer les dépendances PHP
docker exec laravel-app composer install --ignore-platform-reqs
Expand All @@ -34,5 +38,5 @@ jobs:
docker exec laravel-app php artisan migrate --force

# 5. Nettoyage des droits et des images
docker exec laravel-app chown -R www-data:www-data storage bootstrap/cache database
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"
docker image prune -f
15 changes: 6 additions & 9 deletions app/Http/Controllers/ColumnController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,21 @@
namespace App\Http\Controllers;

use App\Models\Column;
use App\Services\ColumnService;
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;

class ColumnController extends Controller
{
public function __construct(private ColumnService $columnService) {}

public function store(Request $request): RedirectResponse
{
$validated = $request->validate([
'name' => ['required', 'string', 'max:255'],
]);

$order = Column::where('team_id', $request->user()->team_id)->max('order') + 1 ?? 0;

Column::create([
'name' => $validated['name'],
'team_id' => $request->user()->team_id,
'order' => $order,
]);
$this->columnService->createColumn($validated, $request->user());

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

$column->update($validated);
$this->columnService->updateColumn($column, $validated);

return back();
}
Expand All @@ -46,7 +43,7 @@ public function destroy(Request $request, Column $column): RedirectResponse
abort(403);
}

$column->delete();
$this->columnService->deleteColumn($column);

return back();
}
Expand Down
50 changes: 18 additions & 32 deletions app/Http/Controllers/TaskController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,50 +4,40 @@

use App\Models\Task;
use App\Models\Column;
use App\Services\TaskService;
use App\Http\Resources\ColumnResource;
use Inertia\Inertia;
use Inertia\Response;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Requests\TaskCreateRequest;
use Illuminate\Http\RedirectResponse;
use App\Http\Requests\TaskUpdateRequest;
use App\Jobs\IncrementTeamCompletedTasks;

class TaskController extends Controller
{
public function __construct(private TaskService $taskService) {}

public function index(Request $request): Response
{
$columns = Column::query()
->with([
'tasks' => function ($query) {
$query->with('creator:id,name')->orderBy('order');
}
])
->where('team_id', $request->user()->team_id)
->orderBy('order')
->get();

return Inertia::render('Tasks', [
'columns' => Column::query()
->with([
'tasks' => function ($query) {
$query->with('creator:id,name')->orderBy('order');
}
])
->where('team_id', $request->user()->team_id)
->orderBy('order')
->get(),
'columns' => ColumnResource::collection($columns),
]);
}

public function store(TaskCreateRequest $request): RedirectResponse
{
$columnId = $request->validated('column_id') ?? null;

if (!$columnId) {
$columnId = Column::where('team_id', $request->user()->team_id)->orderBy('order')->value('id');
}

$order = Task::where('column_id', $columnId)->max('order');
$order = $order !== null ? $order + 1 : 0;

Task::query()->create([
...$request->safe()->except('column_id'),
'team_id' => $request->user()->team_id,
'created_by' => $request->user()->id,
'column_id' => $columnId,
'order' => $order,
]);
$this->taskService->createTask($request->safe()->all(), $request->user());

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

$task->update($request->validated());

if ($task->completed) {
IncrementTeamCompletedTasks::dispatch($task->team_id);
}
$this->taskService->updateTask($task, $request->validated());

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

$task->delete();
$this->taskService->deleteTask($task);

return back();
}
Expand Down
41 changes: 4 additions & 37 deletions app/Http/Controllers/TaskSequenceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@
namespace App\Http\Controllers;

use App\Models\Task;
use App\Services\TaskService;
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\DB;

class TaskSequenceController extends Controller
{
public function __construct(private TaskService $taskService) {}

public function update(Request $request, Task $task): RedirectResponse
{
if ($task->team_id !== $request->user()->team_id) {
Expand All @@ -20,42 +22,7 @@ public function update(Request $request, Task $task): RedirectResponse
'order' => ['required', 'integer', 'min:0'],
]);

$newColumnId = $validated['column_id'];
$newOrder = $validated['order'];

$oldColumnId = $task->column_id;
$oldOrder = $task->order;

DB::transaction(function () use ($task, $newColumnId, $newOrder, $oldColumnId, $oldOrder) {
if ($oldColumnId == $newColumnId) {
// Moving within the same column
if ($oldOrder < $newOrder) {
Task::where('column_id', $newColumnId)
->whereBetween('order', [$oldOrder + 1, $newOrder])
->decrement('order');
} elseif ($oldOrder > $newOrder) {
Task::where('column_id', $newColumnId)
->whereBetween('order', [$newOrder, $oldOrder - 1])
->increment('order');
}
} else {
// Moving to a different column
// Shift tasks in old column down
Task::where('column_id', $oldColumnId)
->where('order', '>', $oldOrder)
->decrement('order');

// Shift tasks in new column up to make room
Task::where('column_id', $newColumnId)
->where('order', '>=', $newOrder)
->increment('order');
}

$task->update([
'column_id' => $newColumnId,
'order' => $newOrder,
]);
});
$this->taskService->updateSequence($task, $validated['column_id'], $validated['order']);

return back();
}
Expand Down
25 changes: 25 additions & 0 deletions app/Http/Resources/ColumnResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class ColumnResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'team_id' => $this->team_id,
'name' => $this->name,
'order' => $this->order,
'tasks' => TaskResource::collection($this->whenLoaded('tasks')),
];
}
}
32 changes: 32 additions & 0 deletions app/Http/Resources/TaskResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class TaskResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'team_id' => $this->team_id,
'column_id' => $this->column_id,
'order' => $this->order,
'title' => $this->title,
'completed' => (bool)$this->completed,
'due_date' => $this->due_date,
'created_by' => $this->created_by,
'creator' => $this->whenLoaded('creator', fn () => [
'id' => $this->creator->id,
'name' => $this->creator->name,
]),
];
}
}
3 changes: 2 additions & 1 deletion app/Providers/AppServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Http\Resources\Json\JsonResource;

class AppServiceProvider extends ServiceProvider
{
Expand All @@ -19,6 +20,6 @@ public function register(): void
*/
public function boot(): void
{
//
JsonResource::withoutWrapping();
}
}
40 changes: 40 additions & 0 deletions app/Services/ColumnService.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?php

namespace App\Services;

use App\Models\Column;
use App\Models\User;

class ColumnService
{
/**
* Create a new column.
*/
public function createColumn(array $data, User $user): Column
{
$order = Column::where('team_id', $user->team_id)->max('order');
$order = $order !== null ? $order + 1 : 0;

return Column::create([
'name' => $data['name'],
'team_id' => $user->team_id,
'order' => $order,
]);
}

/**
* Update an existing column.
*/
public function updateColumn(Column $column, array $data): bool
{
return $column->update($data);
}

/**
* Delete a column.
*/
public function deleteColumn(Column $column): ?bool
{
return $column->delete();
}
}
Loading
Loading