Implement creator studio and upload updates

This commit is contained in:
2026-04-04 10:12:02 +02:00
parent 1da7d3bf88
commit 0b216b7ecd
15107 changed files with 31206 additions and 626514 deletions

View File

@@ -0,0 +1,150 @@
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Studio;
use App\Http\Controllers\Controller;
use App\Models\Artwork;
use App\Models\Collection;
use App\Models\NovaCard;
use App\Models\Story;
use App\Services\CollectionLifecycleService;
use App\Services\NovaCards\NovaCardPublishService;
use App\Services\StoryPublicationService;
use App\Services\Studio\CreatorStudioContentService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
final class StudioScheduleApiController extends Controller
{
public function __construct(
private readonly CreatorStudioContentService $content,
private readonly NovaCardPublishService $cards,
private readonly CollectionLifecycleService $collections,
private readonly StoryPublicationService $stories,
) {
}
public function publishNow(Request $request, string $module, int $id): JsonResponse
{
$user = $request->user();
match ($module) {
'artworks' => $this->publishArtworkNow($user->id, $id),
'cards' => $this->cards->publishNow($this->card($user->id, $id)),
'collections' => $this->publishCollectionNow($user->id, $id),
'stories' => $this->stories->publish($this->story($user->id, $id), 'published', ['published_at' => now()]),
default => abort(404),
};
return response()->json([
'ok' => true,
'item' => $this->serializedItem($request->user(), $module, $id),
]);
}
public function unschedule(Request $request, string $module, int $id): JsonResponse
{
$user = $request->user();
match ($module) {
'artworks' => $this->unscheduleArtwork($user->id, $id),
'cards' => $this->cards->clearSchedule($this->card($user->id, $id)),
'collections' => $this->unscheduleCollection($user->id, $id),
'stories' => $this->unscheduleStory($user->id, $id),
default => abort(404),
};
return response()->json([
'ok' => true,
'item' => $this->serializedItem($request->user(), $module, $id),
]);
}
private function publishArtworkNow(int $userId, int $id): void
{
$artwork = Artwork::query()
->where('user_id', $userId)
->findOrFail($id);
$artwork->forceFill([
'artwork_status' => 'published',
'publish_at' => null,
'artwork_timezone' => null,
'published_at' => now(),
'is_public' => $artwork->visibility !== Artwork::VISIBILITY_PRIVATE,
])->save();
}
private function unscheduleArtwork(int $userId, int $id): void
{
Artwork::query()
->where('user_id', $userId)
->findOrFail($id)
->forceFill([
'artwork_status' => 'draft',
'publish_at' => null,
'artwork_timezone' => null,
'published_at' => null,
])
->save();
}
private function publishCollectionNow(int $userId, int $id): void
{
$collection = Collection::query()
->where('user_id', $userId)
->findOrFail($id);
$this->collections->applyAttributes($collection, [
'published_at' => now(),
'lifecycle_state' => Collection::LIFECYCLE_PUBLISHED,
]);
}
private function unscheduleCollection(int $userId, int $id): void
{
$collection = Collection::query()
->where('user_id', $userId)
->findOrFail($id);
$this->collections->applyAttributes($collection, [
'published_at' => null,
'lifecycle_state' => Collection::LIFECYCLE_DRAFT,
]);
}
private function unscheduleStory(int $userId, int $id): void
{
Story::query()
->where('creator_id', $userId)
->findOrFail($id)
->forceFill([
'status' => 'draft',
'scheduled_for' => null,
'published_at' => null,
])
->save();
}
private function card(int $userId, int $id): NovaCard
{
return NovaCard::query()
->where('user_id', $userId)
->findOrFail($id);
}
private function story(int $userId, int $id): Story
{
return Story::query()
->where('creator_id', $userId)
->findOrFail($id);
}
private function serializedItem($user, string $module, int $id): ?array
{
return $this->content->provider($module)?->items($user, 'all', 400)
->first(fn (array $item): bool => (int) ($item['numeric_id'] ?? 0) === $id);
}
}