*/ public function toArray(Request $request): array { $fieldsCollection = $this->relationLoaded('fields') ? $this->fields : $this->fields()->get(); $visible = app(FieldAccessService::class) ->filterVisibleFields($request->user(), $fieldsCollection); $submissionsCount = $this->whenCounted( 'submissions', default: FormSubmission::query()->where('form_schema_id', $this->id)->count(), ); return [ 'id' => $this->id, 'organisation_id' => $this->organisation_id, 'owner_type' => $this->owner_type, 'owner_id' => $this->owner_id, 'name' => $this->name, 'slug' => $this->slug, 'purpose' => $this->purpose instanceof \BackedEnum ? $this->purpose->value : $this->purpose, 'description' => $this->description, 'is_published' => (bool) $this->is_published, 'submission_mode' => $this->submission_mode instanceof \BackedEnum ? $this->submission_mode->value : $this->submission_mode, 'locale' => $this->locale, 'settings' => $this->settings, 'snapshot_mode' => $this->snapshot_mode instanceof \BackedEnum ? $this->snapshot_mode->value : $this->snapshot_mode, 'freeze_on_submit' => (bool) $this->freeze_on_submit, 'retention_days' => $this->retention_days, 'consent_version' => $this->consent_version, 'section_level_submit' => (bool) $this->section_level_submit, 'auto_save_enabled' => (bool) $this->auto_save_enabled, 'max_submissions' => $this->max_submissions, 'version' => (int) $this->version, 'public_token' => $this->public_token, 'public_token_previous' => $this->public_token_previous, 'public_token_rotated_at' => optional($this->public_token_rotated_at)->toIso8601String(), 'submission_deadline' => optional($this->submission_deadline)->toIso8601String(), 'created_by_user_id' => $this->created_by_user_id, 'last_updated_by_user_id' => $this->last_updated_by_user_id, 'edit_lock_user_id' => $this->edit_lock_user_id, 'edit_lock_expires_at' => optional($this->edit_lock_expires_at)->toIso8601String(), 'is_locked' => $this->isLocked(), 'public_form_url' => $this->publicFormUrl(), 'fields_count' => $fieldsCollection->count(), 'submissions_count' => $submissionsCount, 'has_submissions' => is_int($submissionsCount) ? $submissionsCount > 0 : null, 'fields' => FormFieldResource::collection($visible), 'sections' => FormSchemaSectionResource::collection( $this->relationLoaded('sections') ? $this->sections : $this->sections()->get(), ), 'created_at' => optional($this->created_at)->toIso8601String(), 'updated_at' => optional($this->updated_at)->toIso8601String(), ]; } private function isLocked(): bool { if ($this->edit_lock_user_id === null || $this->edit_lock_expires_at === null) { return false; } return $this->edit_lock_expires_at->isFuture(); } private function publicFormUrl(): ?string { if (empty($this->public_token)) { return null; } $base = rtrim((string) config('crewli.portal_url', config('app.url')), '/'); return $base.'/f/'.$this->public_token; } }