Commit the Projects/Tasks/Ideas/TaskComments feature

This was already implemented, migrated, and running live, but had
never been committed. Bringing it into git: Project/Task/Idea/
TaskComment models, their JSON API (CRUD + status transitions,
task comments, idea<->project linking), Livewire UI pages, and the
nav/route wiring for them. All 42 of its own tests pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
m105
2026-08-06 20:41:57 +03:00
co-authored by Claude Sonnet 5
parent 6ff7f78c9c
commit a4ff6c0ccb
39 changed files with 3411 additions and 0 deletions
+20
View File
@@ -1,8 +1,11 @@
<?php
use App\Http\Controllers\Api\PostController;
use App\Http\Controllers\Api\ProjectController;
use App\Http\Controllers\Api\SiteController;
use App\Http\Controllers\Api\SocialAccountController;
use App\Http\Controllers\Api\TaskCommentController;
use App\Http\Controllers\Api\TaskController;
use App\Http\Controllers\Api\WebhookController;
use Illuminate\Support\Facades\Route;
@@ -14,6 +17,23 @@ Route::get('/accounts/{socialAccount}', [SocialAccountController::class, 'show']
Route::apiResource('posts', PostController::class)->names('api.posts');
// Project Management API
Route::apiResource('projects', ProjectController::class)->names('api.projects');
Route::get('/projects/{project}/tasks', [ProjectController::class, 'tasks'])->name('api.projects.tasks');
Route::get('/projects/{project}/ideas', [ProjectController::class, 'ideas'])->name('api.projects.ideas');
Route::apiResource('tasks', TaskController::class)->names('api.tasks');
Route::get('/tasks/{task}/comments', [TaskController::class, 'comments'])->name('api.tasks.comments');
Route::post('/tasks/{task}/status', [TaskController::class, 'changeStatus'])->name('api.tasks.status');
Route::apiResource('tasks.comments', TaskCommentController::class)->shallow()->names('api.task_comments');
// Ideas API
Route::apiResource('ideas', \App\Http\Controllers\Api\IdeaController::class)->names('api.ideas');
Route::post('/ideas/{idea}/status', [\App\Http\Controllers\Api\IdeaController::class, 'changeStatus'])->name('api.ideas.status');
Route::post('/ideas/{idea}/link-project', [\App\Http\Controllers\Api\IdeaController::class, 'linkToProject'])->name('api.ideas.link_project');
Route::post('/ideas/{idea}/unlink-project', [\App\Http\Controllers\Api\IdeaController::class, 'unlinkFromProject'])->name('api.ideas.unlink_project');
// Webhook endpoints (require X-Muninn-Token header)
Route::prefix('webhooks')->group(function () {
Route::post('/posts', [WebhookController::class, 'createPost']);
+4
View File
@@ -27,4 +27,8 @@ Route::middleware('auth')->group(function () {
Route::get('/social-accounts', SocialAccountsIndex::class)->name('social-accounts.index');
Route::get('/posts', PostsIndex::class)->name('posts.index');
Route::get('/templates', TemplatesIndex::class)->name('templates.index');
Route::get('/projects', \App\Livewire\Projects\Index::class)->name('projects.index');
Route::get('/tasks', \App\Livewire\Tasks\Index::class)->name('tasks.index');
Route::get('/task-comments', \App\Livewire\TaskComments\Index::class)->name('task-comments.index');
Route::get('/ideas', \App\Livewire\Ideas\Index::class)->name('ideas.index');
});