File size: 3,118 Bytes
8072ab3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
"""
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)