Each field's original sits beside the field to write, and a translation that fell behind shows what the original said when it was translated and what it says now, word by word. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
82 lines
2.8 KiB
PHP
82 lines
2.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Http\Controllers\Api\V1;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Support\Health\Finding;
|
|
use App\Support\Health\HealthReport;
|
|
use App\Support\PendingTranslations;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Validation\Rule;
|
|
|
|
/**
|
|
* What is wrong with the site, and what is left to translate — the panel's
|
|
* health screen, for a client that cannot open it.
|
|
*/
|
|
class HealthController extends Controller
|
|
{
|
|
/**
|
|
* Every check the caller may see, problems first. A check behind a
|
|
* permission they lack is left out, as on the panel.
|
|
*/
|
|
public function index(Request $request, HealthReport $report): JsonResponse
|
|
{
|
|
// Who may open the panel's screen; each check guards itself further.
|
|
$this->authorize('panel.access');
|
|
|
|
$findings = $report->runFor($request->user());
|
|
|
|
return response()->json([
|
|
'data' => $findings->map(fn (Finding $finding) => [
|
|
'key' => $finding->key,
|
|
'severity' => $finding->severity->value,
|
|
'count' => $finding->count,
|
|
'title' => $finding->title(),
|
|
'description' => $finding->description(),
|
|
'samples' => $finding->samples,
|
|
'panel_url' => $finding->url,
|
|
])->values(),
|
|
'meta' => [
|
|
'problems' => $findings->filter(fn (Finding $f) => $f->severity->isProblem())->count(),
|
|
'checked_at' => now()->toIso8601String(),
|
|
],
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Records with a language still to write (`missing`) or left behind by the
|
|
* one it was translated from (`stale`, with since when).
|
|
*
|
|
* Filters: locale (only what that language lacks), type, published (only
|
|
* what is on the site — open, for calls).
|
|
*/
|
|
public function translations(Request $request): JsonResponse
|
|
{
|
|
$locales = array_keys((array) config('locales.supported'));
|
|
|
|
$request->validate([
|
|
'locale' => ['sometimes', Rule::in($locales)],
|
|
'type' => ['sometimes', Rule::in(['pages', 'projects', 'services', 'calls'])],
|
|
'published' => ['sometimes', 'boolean'],
|
|
]);
|
|
|
|
$items = PendingTranslations::find(
|
|
$request->user(),
|
|
$request->input('locale'),
|
|
$request->input('type'),
|
|
$request->boolean('published'),
|
|
)->map(fn (array $item) => [
|
|
'type' => $item['type'],
|
|
'id' => $item['id'],
|
|
'title' => $item['title'],
|
|
'missing' => $item['missing'],
|
|
'stale' => (object) collect($item['stale'])->map(fn ($since) => $since->toIso8601String())->all(),
|
|
]);
|
|
|
|
return response()->json(['data' => $items->values()]);
|
|
}
|
|
}
|