## Summary - move the Laravel application into `apps/platform` and keep the repository root for orchestration, docs, and tooling - update the local command model, Sail/Docker wiring, runtime paths, and ignore rules around the new platform location - add relocation quickstart/contracts plus focused smoke coverage for bootstrap, command model, routes, and runtime behavior ## Validation - `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/PlatformRelocation` - integrated browser smoke validated `/up`, `/`, `/admin`, `/admin/choose-workspace`, and tenant route semantics for `200`, `403`, and `404` ## Remaining Rollout Checks - validate Dokploy build context and working-directory assumptions against the new `apps/platform` layout - confirm web, queue, and scheduler processes all start from the expected working directory in staging/production - verify no legacy volume mounts or asset-publish paths still point at the old root-level `public/` or `storage/` locations Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de> Reviewed-on: #213
42 lines
1.5 KiB
PHP
42 lines
1.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Services\TenantReviews;
|
|
|
|
use App\Models\EvidenceSnapshot;
|
|
use App\Models\Tenant;
|
|
use Illuminate\Support\Arr;
|
|
|
|
final class TenantReviewFingerprint
|
|
{
|
|
public function forSnapshot(Tenant $tenant, EvidenceSnapshot $snapshot): string
|
|
{
|
|
$summary = is_array($snapshot->summary) ? $snapshot->summary : [];
|
|
|
|
$payload = [
|
|
'tenant_id' => (int) $tenant->getKey(),
|
|
'workspace_id' => (int) $tenant->workspace_id,
|
|
'evidence_snapshot_id' => (int) $snapshot->getKey(),
|
|
'snapshot_fingerprint' => (string) $snapshot->fingerprint,
|
|
'snapshot_completeness' => (string) $snapshot->completeness_state,
|
|
'dimension_states' => collect(Arr::wrap($summary['dimensions'] ?? []))
|
|
->map(static fn (mixed $dimension): array => [
|
|
'key' => (string) data_get($dimension, 'key'),
|
|
'state' => (string) data_get($dimension, 'state'),
|
|
'required' => (bool) data_get($dimension, 'required', false),
|
|
])
|
|
->sortBy('key')
|
|
->values()
|
|
->all(),
|
|
'counts' => [
|
|
'finding_count' => (int) ($summary['finding_count'] ?? 0),
|
|
'report_count' => (int) ($summary['report_count'] ?? 0),
|
|
'operation_count' => (int) ($summary['operation_count'] ?? 0),
|
|
],
|
|
];
|
|
|
|
return hash('sha256', json_encode($payload, JSON_THROW_ON_ERROR));
|
|
}
|
|
}
|