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>
64 lines
1.6 KiB
PHP
64 lines
1.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\StorePostRequest;
|
|
use App\Http\Requests\UpdatePostRequest;
|
|
use App\Http\Resources\PostResource;
|
|
use App\Models\Post;
|
|
use Illuminate\Http\Request;
|
|
|
|
class PostController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
$query = Post::query();
|
|
|
|
if ($request->filled('status')) {
|
|
$query->where('status', $request->string('status'));
|
|
}
|
|
|
|
if ($request->filled('site_id')) {
|
|
$query->where('site_id', $request->integer('site_id'));
|
|
}
|
|
|
|
if ($request->filled('social_account_id')) {
|
|
$query->where('social_account_id', $request->integer('social_account_id'));
|
|
}
|
|
|
|
if ($request->boolean('due')) {
|
|
$query->where('status', 'scheduled')
|
|
->where('scheduled_at', '<=', now());
|
|
}
|
|
|
|
return PostResource::collection($query->orderByDesc('created_at')->get());
|
|
}
|
|
|
|
public function show(Post $post)
|
|
{
|
|
return new PostResource($post);
|
|
}
|
|
|
|
public function store(StorePostRequest $request)
|
|
{
|
|
$post = Post::create($request->validated())->fresh();
|
|
|
|
return (new PostResource($post))->response()->setStatusCode(201);
|
|
}
|
|
|
|
public function update(UpdatePostRequest $request, Post $post)
|
|
{
|
|
$post->update($request->validated());
|
|
|
|
return new PostResource($post);
|
|
}
|
|
|
|
public function destroy(Post $post)
|
|
{
|
|
$post->delete();
|
|
|
|
return response()->noContent();
|
|
}
|
|
}
|