""" Edição das páginas HTML (institucionais) direto pelo painel admin. Só as páginas "seguras" de editar entram na lista abaixo — ou seja, as que não dependem de variáveis dinâmicas complexas passadas pelo backend (busca, imóvel, admin*) para funcionar. Editar essas por aqui, sem cuidado com as tags {% %} e {{ }}, quebraria a busca/anúncios/login para todo mundo. Cada página tem um identificador curto (usado na API e no seletor do painel) mapeado para o arquivo real em /templates. """ import os from fastapi import HTTPException from app.config import BASE_DIR TEMPLATES_DIR = os.path.join(BASE_DIR, "templates") # id -> (arquivo em /templates, nome amigável, descrição curta) PAGINAS_EDITAVEIS = { "inicio": ("index.html", "Página inicial", "A home do site (/)"), "sobre": ("sobre.html", "Sobre", "/sobre.html"), "servicos": ("servicos.html", "Serviços", "/servicos.html"), "contato": ("contato.html", "Contato", "/contato.html"), "404": ("404.html", "Página não encontrada (404)", "Exibida quando a URL não existe"), "header": ("_header.html", "Cabeçalho", "Aparece no topo de todas as páginas do site"), "footer": ("_footer.html", "Rodapé", "Aparece no rodapé de todas as páginas do site"), } def listar_paginas() -> list: return [ {"id": pid, "nome": nome, "descricao": desc} for pid, (_, nome, desc) in PAGINAS_EDITAVEIS.items() ] def _caminho(pagina_id: str) -> str: entrada = PAGINAS_EDITAVEIS.get(pagina_id) if not entrada: raise HTTPException(status_code=404, detail="Página não encontrada ou não editável por aqui.") return os.path.join(TEMPLATES_DIR, entrada[0]) def ler_pagina(pagina_id: str) -> str: caminho = _caminho(pagina_id) if not os.path.exists(caminho): raise HTTPException(status_code=404, detail="Arquivo da página não existe no servidor.") with open(caminho, "r", encoding="utf-8") as f: return f.read() def salvar_pagina(pagina_id: str, conteudo: str, jinja_env=None) -> None: caminho = _caminho(pagina_id) if not conteudo or not conteudo.strip(): raise HTTPException(status_code=400, detail="O conteúdo da página não pode ficar vazio.") # Valida a sintaxe Jinja (tags {% %} / {{ }}) antes de gravar, para não # derrubar a página pro público com um erro de digitação no template. if jinja_env is not None: try: jinja_env.parse(conteudo) except Exception as e: raise HTTPException(status_code=400, detail=f"HTML/Jinja inválido — nada foi salvo: {e}") # Guarda uma cópia da versão anterior (um nível de backup) antes de sobrescrever. if os.path.exists(caminho): try: with open(caminho, "r", encoding="utf-8") as f: anterior = f.read() with open(caminho + ".bak", "w", encoding="utf-8") as f: f.write(anterior) except OSError: pass # backup é best-effort, não deve impedir o salvamento with open(caminho, "w", encoding="utf-8") as f: f.write(conteudo)