Adds JSON API for Posts (index/show/store/update/destroy) so an AI
agent can draft posts, read what's due for publishing, and report
back publish/fail status. Unlike the existing read-only Sites/Accounts
APIs, this is full CRUD since the app itself never publishes anything.
- PostController with status/site_id/social_account_id/due filters
- StorePostRequest/UpdatePostRequest validate against Post::TYPES/STATUSES
- PostResource shapes the JSON response
- Route::apiResource('posts', ...) registered with ->names('api.posts')
to avoid colliding with the existing web posts.index route name
- store() calls ->fresh() after create() so the response reflects the
DB-level default status ('draft') instead of a stale in-memory null
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
28 lines
779 B
PHP
28 lines
779 B
PHP
<?php
|
|
|
|
namespace App\Http\Requests;
|
|
|
|
use App\Models\Post;
|
|
use Illuminate\Foundation\Http\FormRequest;
|
|
|
|
class StorePostRequest extends FormRequest
|
|
{
|
|
public function authorize(): bool
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public function rules(): array
|
|
{
|
|
return [
|
|
'site_id' => ['required', 'integer', 'exists:sites,id'],
|
|
'social_account_id' => ['nullable', 'integer', 'exists:social_accounts,id'],
|
|
'type' => ['required', 'string', 'in:' . implode(',', Post::TYPES)],
|
|
'title' => ['nullable', 'string', 'max:255'],
|
|
'body' => ['required', 'string'],
|
|
'status' => ['sometimes', 'string', 'in:' . implode(',', Post::STATUSES)],
|
|
'scheduled_at' => ['nullable', 'date'],
|
|
];
|
|
}
|
|
}
|