File manager - Edit - /var/www/html/portalHomolog/app/Http/Controllers/Api/ObservatorioApiController.php
Back
<?php namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; use App\Http\Services\Observatorio\ObservatorioUploadHelper; use App\Models\Observatorio\Indicador; use App\Models\Observatorio\MapaTema; use App\Models\Observatorio\Tema; use Illuminate\Http\JsonResponse; /** * API pública (somente leitura) do Observatório da Cidade. * * Consumida pelo site público (observaangra). Expõe apenas indicadores * marcados para o observatório (observatorio = 1) e registros ATIVADOS. */ class ObservatorioApiController extends Controller { /** Lista os temas que possuem ao menos um indicador visível. */ public function temas(): JsonResponse { $temas = Tema::query() ->where('status', 'ATIVADO') ->withCount(['indicadores as indicadores_count' => function ($query) { $query->where('observatorio', 1)->where('status', 'ATIVADO'); }]) ->having('indicadores_count', '>', 0) ->orderBy('nome') ->get() ->map(fn (Tema $tema) => $this->temaResumo($tema)); return response()->json(['data' => $temas]); } /** Detalhe de um tema + seus indicadores visíveis. */ public function tema(int $id): JsonResponse { $tema = Tema::query()->where('status', 'ATIVADO')->findOrFail($id); $indicadores = $tema->indicadores() ->where('observatorio', 1) ->where('status', 'ATIVADO') ->orderBy('nome') ->get(['id', 'nome', 'tema_id']) ->map(fn (Indicador $i) => ['id' => $i->id, 'nome' => $i->nome]); return response()->json([ 'data' => array_merge($this->temaResumo($tema), [ 'indicadores' => $indicadores, ]), ]); } /** Detalhe completo de um indicador (com rótulos das tabelas de domínio). */ public function indicador(int $id): JsonResponse { $indicador = Indicador::query() ->with(['tema', 'diretriz', 'eixo', 'orgao', 'programa', 'fonte', 'base', 'periodicidade']) ->where('observatorio', 1) ->where('status', 'ATIVADO') ->findOrFail($id); $irmaos = Indicador::query() ->where('tema_id', $indicador->tema_id) ->where('observatorio', 1) ->where('status', 'ATIVADO') ->orderBy('nome') ->get(['id', 'nome']) ->map(fn (Indicador $i) => ['id' => $i->id, 'nome' => $i->nome]); return response()->json([ 'data' => [ 'id' => $indicador->id, 'nome' => $indicador->nome, 'tema' => $indicador->tema ? $this->temaResumo($indicador->tema) : null, 'diretriz' => $indicador->diretriz?->descricao, 'eixo' => $indicador->eixo?->descricao, 'orgao' => $indicador->orgao?->descricao, 'programa' => $indicador->programa?->descricao, 'fonte' => $indicador->fonte?->descricao, 'base' => $indicador->base?->descricao, 'periodicidade' => $indicador->periodicidade?->descricao, 'ppa' => (bool) $indicador->ppa, 'memoria_calculo' => $indicador->memoria_calculo, 'proxima_apuracao' => $indicador->proxima_apuracao, 'planilha_link' => $indicador->planilha_link, 'graficos_links' => [], 'graficos_embeds' => array_values(array_filter([ $indicador->grafico_link_1, $indicador->grafico_link_2, $indicador->grafico_link_3, $indicador->grafico_link_4, $indicador->grafico_link_5, ])), 'grafico_embed' => $indicador->grafico_embed, 'irmaos' => $irmaos, ], ]); } /** Indicadores em destaque (home). */ public function destaques(): JsonResponse { $destaques = Indicador::query() ->with('tema') ->where('destaque', 1) ->where('observatorio', 1) ->where('status', 'ATIVADO') ->orderBy('nome') ->limit(8) ->get() ->map(fn (Indicador $i) => [ 'id' => $i->id, 'nome' => $i->nome, 'tema' => $i->tema?->nome, ]); return response()->json(['data' => $destaques]); } /** Temas de mapas que possuem mapas cadastrados. */ public function mapaTemas(): JsonResponse { $temas = MapaTema::query() ->where('status', 'ATIVADO') ->withCount(['mapas as mapas_count' => function ($query) { $query->where('status', 'ATIVADO'); }]) ->having('mapas_count', '>', 0) ->orderBy('nome') ->get() ->map(fn (MapaTema $t) => [ 'id' => $t->id, 'nome' => $t->nome, 'descricao' => $t->descricao, 'cor' => $t->cor, 'icone' => ObservatorioUploadHelper::publicUrl($t->icone), ]); return response()->json(['data' => $temas]); } /** Mapas de um tema de mapa. */ public function mapaTema(int $id): JsonResponse { $tema = MapaTema::query()->where('status', 'ATIVADO')->findOrFail($id); $mapas = $tema->mapas() ->where('status', 'ATIVADO') ->orderBy('titulo') ->get(['id', 'titulo', 'link']) ->map(fn ($m) => ['id' => $m->id, 'titulo' => $m->titulo, 'link' => $m->link]); return response()->json([ 'data' => [ 'id' => $tema->id, 'nome' => $tema->nome, 'descricao' => $tema->descricao, 'cor' => $tema->cor, 'icone' => ObservatorioUploadHelper::publicUrl($tema->icone), 'mapas' => $mapas, ], ]); } /** @return array<string, mixed> */ private function temaResumo(Tema $tema): array { return [ 'id' => $tema->id, 'nome' => $tema->nome, 'descricao' => $tema->descricao, 'cor' => $tema->cor, 'icone' => ObservatorioUploadHelper::publicUrl($tema->icone), 'indicadores_count' => $tema->indicadores_count ?? null, ]; } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.01 |
proxy
|
phpinfo
|
Settings