Introduce Publisher/PublisherManager (WordPress + Reddit implementations) so publishing logic is shared between the CLI, the queue, and future network integrations. Add a "Publish" button on the Posts page that dispatches PublishPostJob instead of blocking the request — Reddit's publisher shells out to the existing Playwright sidecar and can take tens of seconds, so it can't run synchronously in a web request. Adds a `target` field (e.g. subreddit) and `publishing` status to Post, plus a `publish_error` field so failures surface in the UI. Refactors posts:publish to delegate to WordPressPublisher without changing its CLI output contract (existing tests pass unchanged). Also fixes two bugs found along the way: UpdatePostRequest was silently dropping `published_url` from PATCH requests (never in its validation rules, despite AI_API.md documenting it), and three Livewire index-page tests were broken by the earlier auth change (never re-run after adding the `auth` middleware) since they hit routes via HTTP without a logged-in user. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
37 lines
983 B
PHP
37 lines
983 B
PHP
<?php
|
|
|
|
namespace App\Support\Publishing;
|
|
|
|
final class PublishResult
|
|
{
|
|
private function __construct(
|
|
public readonly bool $success,
|
|
public readonly bool $attempted,
|
|
public readonly ?string $url = null,
|
|
public readonly ?string $error = null,
|
|
) {}
|
|
|
|
public static function success(string $url): self
|
|
{
|
|
return new self(success: true, attempted: true, url: $url);
|
|
}
|
|
|
|
/**
|
|
* The publish attempt itself failed (network, API error, etc).
|
|
*/
|
|
public static function failed(string $error): self
|
|
{
|
|
return new self(success: false, attempted: true, error: $error);
|
|
}
|
|
|
|
/**
|
|
* A precondition wasn't met — no attempt was made (bad data, missing
|
|
* credentials, wrong type). Callers should not treat this the same as
|
|
* a failed attempt.
|
|
*/
|
|
public static function rejected(string $error): self
|
|
{
|
|
return new self(success: false, attempted: false, error: $error);
|
|
}
|
|
}
|