makeSlug($title); $group = $this->resolveGroup($user, $groupIdentifier); $artwork = Artwork::create([ 'user_id' => (int) $user->id, 'group_id' => $group?->id, 'uploaded_by_user_id' => (int) $user->id, 'primary_author_user_id' => (int) $user->id, 'published_as_type' => $group ? Artwork::PUBLISHED_AS_GROUP : Artwork::PUBLISHED_AS_USER, 'published_as_id' => $group?->id ?: (int) $user->id, 'title' => $title, 'slug' => $slug, 'description' => $description, 'file_name' => 'pending', 'file_path' => '', 'file_size' => 0, 'mime_type' => 'application/octet-stream', 'width' => 1, 'height' => 1, 'is_public' => false, 'visibility' => Artwork::VISIBILITY_PRIVATE, 'is_approved' => false, 'is_mature' => $isMature, 'published_at' => null, 'artwork_status' => 'draft', ]); // Attach the selected category to the artwork pivot table if ($categoryId !== null && \App\Models\Category::where('id', $categoryId)->exists()) { $artwork->categories()->sync([$categoryId]); } if ($group) { $this->groups->syncArtworkCount($group); } return new ArtworkDraftResult((int) $artwork->id, 'draft'); }); } private function resolveGroup(User $user, string|int|null $groupIdentifier): ?Group { if ($groupIdentifier === null || $groupIdentifier === '') { return null; } $group = is_numeric($groupIdentifier) ? Group::query()->with('members')->findOrFail((int) $groupIdentifier) : Group::query()->with('members')->where('slug', (string) $groupIdentifier)->firstOrFail(); if (! $group->canCreateArtworkDrafts($user) && ! $user->isAdmin()) { throw ValidationException::withMessages([ 'group' => 'You are not allowed to create drafts for this group.', ]); } return $group; } private function makeSlug(string $title): string { $base = Str::slug($title); return Str::limit($base !== '' ? $base : 'artwork', 160, ''); } }