mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-12 22:13:05 +00:00
Compare commits
2 commits
377a2c89b1
...
87ab9a2b1d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
87ab9a2b1d | ||
|
|
999de98295 |
8 changed files with 431 additions and 2 deletions
1
docs/changelog/2026-11-08-ops131-redirects-wordpress.md
Normal file
1
docs/changelog/2026-11-08-ops131-redirects-wordpress.md
Normal file
|
|
@ -0,0 +1 @@
|
|||
**OPS131 — redirects do WordPress legado e decisão de cutover total (2026-11-08):** o domínio novo `jorgesolla.com.br` vai receber o site público e o `/campanha` juntos (decisão A); as 4 contas com passkey (7 credenciais) re-registram uma vez no domínio novo e o login por senha segue disponível. Os 43 permalinks do WordPress (`/<ano>/<mês>/<dia>/<slug>/`, último post em 2026-08-17) foram mapeados para o caminho canônico do Teqo em `scripts/lib/legacyWordPressRedirects.mjs`; categoria, tag, author, feeds, paginação e arquivos de data vão para `/artigos`, `/home` vai para `/` e `wp-admin`/`wp-login.php` para `/` (`next.config.mjs`). A paridade do acervo é 43/43 (Teqo com 43 publicados, último em 2026-08-18), registrada como evidência do OPS130 — o REST do WordPress não responde do homeserver/workstation, mas o inventário foi lido pela API pública via proxy externo. O runbook de cutover/rollback ficou em `docs/ops/teqo-1313-deploy.md` §OPS131; a janela de DNS/Cloudflare, a troca de `NEXT_PUBLIC_SITE_URL` + rebuild, o reenrollment e a verificação em produção seguem pendentes. Testes: unit do mapa (43 entradas, forma e unicidade) e e2e do frontend para os redirects do legado; sem migration e sem mudança de conteúdo no CMS.
|
||||
|
|
@ -1953,6 +1953,76 @@ pula o que já entrou).
|
|||
Rollback: nada de schema. O kill switch é despublicar/apagar as peças no admin
|
||||
(a Central pública atualiza na hora pelo tag `contentPieces`).
|
||||
|
||||
## OPS131 — cutover do domínio jorgesolla.com.br
|
||||
|
||||
Decisão de produto: **A — cutover total**. O site público e `/campanha` passam a
|
||||
viver em `https://jorgesolla.com.br`; as passkeys são re-registradas uma vez no
|
||||
domínio novo (o RP ID do WebAuthn é o hostname de `NEXT_PUBLIC_SITE_URL`). O
|
||||
login por senha continua funcionando durante e depois da troca.
|
||||
|
||||
### Pré-flight (evidência de 2026-11-08)
|
||||
|
||||
- **WordPress:** sitemap com **43 posts** publicados (último em 2026-08-17),
|
||||
2 categorias (`noticias`, `uncategorized`), tags e author; o page sitemap só
|
||||
tem `home`. O REST do WordPress não responde a partir do homeserver/workstation
|
||||
(timeout/WAF), mas o inventário foi lido pela API pública via proxy externo.
|
||||
- **Teqo:** **43 posts** publicados (último em 2026-08-18) — paridade 43/43, sem
|
||||
conteúdo novo a importar. O `pnpm db:seed:posts` não roda a partir do
|
||||
homeserver enquanto o REST do WordPress estiver bloqueado; o registro desta
|
||||
paridade é a evidência do OPS130.
|
||||
- **Redirects:** os 43 permalinks `/YYYY/MM/DD/<slug>/` estão em
|
||||
`scripts/lib/legacyWordPressRedirects.mjs` (destino = caminho canônico Teqo).
|
||||
Categorias, tags, author, feeds, paginação e arquivos de data vão para
|
||||
`/artigos`; `/home` vai para `/`; `wp-admin`/`wp-login.php` para `/`.
|
||||
- **Passkeys:** 4 usuários / 7 credenciais no RP ID atual
|
||||
(`jorgesolla1313.com.br`); serão re-registradas no domínio novo.
|
||||
- **Metadados:** `metadata.URL` já é `https://jorgesolla.com.br`;
|
||||
`NEXT_PUBLIC_SITE_URL` de produção ainda é `https://jorgesolla1313.com.br`.
|
||||
|
||||
### Janela de cutover
|
||||
|
||||
1. **Congelar o WordPress (read-only)** e guardar o backup final. Confirmar que
|
||||
o sitemap continua com os 43 posts; se houver post novo, regenerar o mapa e
|
||||
rodar o teste unitário antes de seguir.
|
||||
2. **Env de produção:** editar `~/stack/teqo-1313.env` com
|
||||
`NEXT_PUBLIC_SITE_URL=https://jorgesolla.com.br` (backup do arquivo antes).
|
||||
Como o valor é inlined no build, o deploy precisa rebuildar.
|
||||
3. **Cloudflare:** no túnel remotely-managed, adicionar o ingress
|
||||
`jorgesolla.com.br` → `http://localhost:1313`; criar o DNS proxied do apex
|
||||
para o túnel e o `www` (CNAME para o apex ou para o túnel). Na zona
|
||||
`jorgesolla1313.com.br`, criar uma Redirect Rule 301 de
|
||||
`https://jorgesolla1313.com.br/*` para `https://jorgesolla.com.br` preservando
|
||||
`http.request.uri.path`. No `www`, 301 para o apex. **Não tocar em MX, TXT,
|
||||
SPF, DKIM ou DMARC** — o e-mail `@jorgesolla.com.br` continua no mesmo lugar.
|
||||
4. **Deploy:** rodar o workflow de deploy (push em `main` ou `workflow_dispatch`)
|
||||
e aprovar produção. O build novo inlina o domínio novo.
|
||||
5. **Passkeys:** avisar os 4 usuários para re-registrar a passkey em
|
||||
`https://jorgesolla.com.br/campanha` depois do switch. Quem usa senha não
|
||||
precisa fazer nada; as credenciais antigas ficam no banco, mas o browser não
|
||||
as oferece no domínio novo.
|
||||
6. **Verificação (read-only):**
|
||||
- `https://jorgesolla.com.br/` e `https://www.jorgesolla.com.br/` → 200
|
||||
(www 301 para o apex), canonical/OG no domínio novo;
|
||||
- `https://jorgesolla1313.com.br/artigos` → 301 para
|
||||
`https://jorgesolla.com.br/artigos` (Redirect Rule do Cloudflare);
|
||||
- amostras do WordPress: `/2026/08/17/bruno-reis-.../` → caminho canônico,
|
||||
`/category/noticias/`, `/tag/lula/`, `/2026/08/` → `/artigos` (o Next
|
||||
responde **308 permanente** para os redirects in-app; o Cloudflare usa 301
|
||||
no domínio 1313);
|
||||
- `/api/media/file/...` e a imagem OG respondem 200 no domínio novo;
|
||||
- `/campanha` autentica por senha; uma passkey nova é registrada e usada.
|
||||
7. **WordPress:** manter read-only por ~30 dias (janela de rollback), depois
|
||||
desligar o host antigo. O backup/dump fica arquivado; as uploads antigas não
|
||||
são proxiadas (não há imagem do WordPress no corpo dos 43 posts do Teqo).
|
||||
|
||||
### Rollback
|
||||
|
||||
- Reverter `NEXT_PUBLIC_SITE_URL` para `https://jorgesolla1313.com.br` e
|
||||
redeployar; as passkeys antigas voltam a valer.
|
||||
- Remover o ingress/DNS de `jorgesolla.com.br` do túnel e restaurar o A record
|
||||
do WordPress (`128.201.75.110`) enquanto a janela de rollback estiver aberta.
|
||||
- O WordPress fica read-only, então o rollback não perde conteúdo novo.
|
||||
|
||||
## Referências
|
||||
|
||||
- `scripts/deploy-homeserver.sh` — o script (fonte da verdade do fluxo; parametrizado por `TEQO_ENV`)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# OPS131 — Cutover do domínio jorgesolla.com.br para o Teqo e desativação do WordPress
|
||||
|
||||
Status: rascunho
|
||||
Status: em andamento — decisão A assinada; redirects do legado implementados; janela de DNS pendente
|
||||
Atualizado em: 2026-10-21
|
||||
Issue: #1445
|
||||
Priority: P1
|
||||
|
|
@ -78,7 +78,7 @@ O site do mandato ainda vive em duas casas: o Teqo em `jorgesolla1313.com.br` (c
|
|||
|
||||
## Questões em aberto (produto)
|
||||
|
||||
- **Passkeys:** **Opções:** A) cutover total + reenrollment dos usuários de campanha; B) manter `/campanha` em `jorgesolla1313.com.br` e só o site público no novo domínio; C) adiar o cutover até um mecanismo de migração. **Recomendação:** A — a eleição acabou e a equipe é pequena; reenrollment assistido é aceitável, com aviso prévio. _(assumido — decisão humana obrigatória)_
|
||||
- **Passkeys:** **Decidido em 2026-11-08: A** — cutover total + reenrollment assistido dos 4 usuários com passkey (7 credenciais); o login por senha segue disponível durante e depois da troca.
|
||||
- **Janela do WordPress:** **Opções:** A) desligar após a verificação, com backup/arquivo; B) manter read-only por 30 dias. **Recomendação:** B — janela curta de rollback, sem escritas. _(assumido)_
|
||||
- **Redirect de `jorgesolla1313.com.br`:** **Opções:** A) 301 permanente; B) 302 por 90 dias. **Recomendação:** A — o 1313 não volta; 301 preserva o SEO. _(assumido)_
|
||||
- **Escopo dos redirects antigos:** **Opções:** A) posts + páginas conhecidas; B) todas as URLs do sitemap do WP. **Recomendação:** B — inventariar o sitemap e mapear; o que não tiver equivalente vai para `/`. _(assumido)_
|
||||
|
|
@ -89,3 +89,22 @@ O site do mandato ainda vive em duas casas: o Teqo em `jorgesolla1313.com.br` (c
|
|||
- `docs/ops/teqo-1313-deploy.md` (homeserver, tunnel, envs, staging); `AGENTS-infra.md`
|
||||
- `src/utilities/seo.ts`, `src/utilities/campaignInviteOrigin.ts`, `src/utilities/webauthn/campaignWebAuthnConfig.ts`, `next.config.mjs`
|
||||
- OPS80/OPS81 (`pt.jorgesolla.com.br`), OPS130 (sync), S47 (site pós-eleição)
|
||||
|
||||
## Progresso (2026-11-08)
|
||||
|
||||
- **Decisão A assinada:** o site público e `/campanha` vão juntos para
|
||||
`jorgesolla.com.br`; as 4 contas com passkey (7 credenciais) re-registram uma
|
||||
vez no domínio novo. Login por senha permanece disponível.
|
||||
- **Redirects do legado implementados:** os 43 permalinks
|
||||
`/YYYY/MM/DD/<slug>/` estão em
|
||||
`scripts/lib/legacyWordPressRedirects.mjs` (destino canônico Teqo); categoria,
|
||||
tag, author, feeds, paginação e arquivos de data vão para `/artigos`; `/home`
|
||||
para `/`; `wp-admin`/`wp-login.php` para `/` (`next.config.mjs`).
|
||||
- **Evidência OPS130:** WordPress com 43 posts (último 2026-08-17) e Teqo com 43
|
||||
posts (último 2026-08-18) — paridade 43/43; o REST do WordPress não responde
|
||||
do homeserver/workstation, mas o inventário foi lido pela API pública via
|
||||
proxy externo.
|
||||
- **Runbook de cutover/rollback:** `docs/ops/teqo-1313-deploy.md` §OPS131.
|
||||
- **Pendente:** janela de DNS/Cloudflare (ingress + apex/www + 301 do 1313),
|
||||
`NEXT_PUBLIC_SITE_URL` de produção + rebuild, reenrollment das passkeys,
|
||||
verificação e desligamento do WordPress após a janela read-only.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
import { withPayload } from '@payloadcms/next/withPayload'
|
||||
|
||||
import { legacyWordPressPostRedirects } from './scripts/lib/legacyWordPressRedirects.mjs'
|
||||
|
||||
/** @type {import('next').NextConfig} */
|
||||
const allowedImageHost = process.env.NEXT_PUBLIC_SITE_URL || 'https://jorgesolla.com.br'
|
||||
|
||||
|
|
@ -11,6 +13,35 @@ const nextConfig = {
|
|||
// circulated (and any index entry) pointing at the mandate instead of a 404.
|
||||
async redirects() {
|
||||
return [
|
||||
// OPS131 — the old WordPress site (jorgesolla.com.br) becomes this app.
|
||||
// The 43 post permalinks are enumerated (date → canonical Teqo path);
|
||||
// the archive/category/tag/author routes below catch the remaining
|
||||
// indexed URLs from the WordPress sitemap, plus the date archives.
|
||||
...legacyWordPressPostRedirects.map((entry) => ({ ...entry, permanent: true })),
|
||||
{ source: '/category/:path*', destination: '/artigos', permanent: true },
|
||||
{ source: '/tag/:path*', destination: '/artigos', permanent: true },
|
||||
{ source: '/author/:path*', destination: '/artigos', permanent: true },
|
||||
{ source: '/feed', destination: '/artigos', permanent: true },
|
||||
{ source: '/comments/feed', destination: '/artigos', permanent: true },
|
||||
{ source: '/page/:path*', destination: '/artigos', permanent: true },
|
||||
{ source: '/home', destination: '/', permanent: true },
|
||||
{
|
||||
source: '/:year(\\d{4})/:month(\\d{2})/:day(\\d{2})/:slug',
|
||||
destination: '/artigos',
|
||||
permanent: true,
|
||||
},
|
||||
{
|
||||
source: '/:year(\\d{4})/:month(\\d{2})/:day(\\d{2})',
|
||||
destination: '/artigos',
|
||||
permanent: true,
|
||||
},
|
||||
{ source: '/:year(\\d{4})/:month(\\d{2})', destination: '/artigos', permanent: true },
|
||||
{ source: '/:year(\\d{4})', destination: '/artigos', permanent: true },
|
||||
{ source: '/wp-admin/:path*', destination: '/', permanent: true },
|
||||
{ source: '/wp-login.php', destination: '/', permanent: true },
|
||||
// S47 — the campaign surfaces left the air after the election. The pages are
|
||||
// gone from the tree; the permanent redirects keep the links that already
|
||||
// circulated (and any index entry) pointing at the mandate instead of a 404.
|
||||
{ source: '/conteudos', destination: '/artigos', permanent: true },
|
||||
{ source: '/conteudos/:path*', destination: '/artigos', permanent: true },
|
||||
{ source: '/jingles', destination: '/', permanent: true },
|
||||
|
|
|
|||
244
scripts/lib/legacyWordPressRedirects.mjs
Normal file
244
scripts/lib/legacyWordPressRedirects.mjs
Normal file
|
|
@ -0,0 +1,244 @@
|
|||
/**
|
||||
* Legacy WordPress permalinks (`jorgesolla.com.br/<YYYY>/<MM>/<DD>/<slug>/`)
|
||||
* redirected to the canonical Teqo article path.
|
||||
*
|
||||
* Snapshot: WordPress REST `/wp-json/wp/v2/posts?per_page=100` on 2026-11-08 —
|
||||
* 43 published posts, latest 2026-08-17. Destinations are the current
|
||||
* `post.type` + `post.category` of the same slug in the production database.
|
||||
* The unit test pins the count, shape and uniqueness; if the WordPress archive
|
||||
* changes before the cutover, update this list and re-run it.
|
||||
*/
|
||||
export const legacyWordPressPostRedirects = [
|
||||
{
|
||||
source: '/2024/07/22/apresentacao-do-plano-de-restauracao-arquitetonica-da-famed-ufba',
|
||||
destination:
|
||||
'/noticia/educacao/apresentacao-do-plano-de-restauracao-arquitetonica-da-famed-ufba',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2024/07/22/obra-de-ampliacao-do-sistema-de-abastecimento-do-rio-paraguacu-itirucu-jaguaquara',
|
||||
destination:
|
||||
'/noticia/desenvolvimento/obra-de-ampliacao-do-sistema-de-abastecimento-do-rio-paraguacu-itirucu-jaguaquara',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2024/07/22/solla-e-indicado-em-estudo-da-arko-advice-como-um-politico-da-elite-parlamentar',
|
||||
destination:
|
||||
'/noticia/politica/solla-e-indicado-em-estudo-da-arko-advice-como-um-politico-da-elite-parlamentar',
|
||||
},
|
||||
{
|
||||
source: '/2024/07/24/jorge-solla-apresenta-pec-que-eleva-pensao-por-morte',
|
||||
destination:
|
||||
'/noticia/direitos-trabalhistas/jorge-solla-apresenta-pec-que-eleva-pensao-por-morte',
|
||||
},
|
||||
{
|
||||
source: '/2024/07/24/portaria-autoriza-retorno-de-mais-de-300-servidores-a-funasa',
|
||||
destination: '/noticia/saude/portaria-autoriza-retorno-de-mais-de-300-servidores-a-funasa',
|
||||
},
|
||||
{
|
||||
source: '/2024/07/24/solla-comemora-anuncio-de-construcao-de-novo-campus-federal-em-jequie',
|
||||
destination:
|
||||
'/noticia/educacao/solla-comemora-anuncio-de-construcao-de-novo-campus-federal-em-jequie',
|
||||
},
|
||||
{
|
||||
source: '/2024/07/26/entrevista-solla-fala-sobre-a-retomada-dos-investimentos-publicos-no-pais',
|
||||
destination:
|
||||
'/noticia/desenvolvimento/entrevista-solla-fala-sobre-a-retomada-dos-investimentos-publicos-no-pais',
|
||||
},
|
||||
{
|
||||
source: '/2026/02/20/solla-desembarca-na-india-em-missao-oficial-com-lula-pela-asia',
|
||||
destination: '/noticia/saude/solla-desembarca-na-india-em-missao-oficial-com-lula-pela-asia',
|
||||
},
|
||||
{
|
||||
source: '/2026/02/23/da-asia-solla-manifesta-apoio-a-servidores-demitidos-por-bruno-reis',
|
||||
destination:
|
||||
'/noticia/direitos-trabalhistas/da-asia-solla-manifesta-apoio-a-servidores-demitidos-por-bruno-reis',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/02/24/governo-lula-corrige-erro-de-antecessor-diz-solla-sobre-suspensao-da-importacao-de-cacau',
|
||||
destination:
|
||||
'/noticia/desenvolvimento/governo-lula-corrige-erro-de-antecessor-diz-solla-sobre-suspensao-da-importacao-de-cacau',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/02/24/missao-internacional-com-solla-lula-e-jeronimo-fortalece-producao-de-medicamentos-estrategicos-e-projeta-a-bahia-como-polo-de-biofarmacos',
|
||||
destination:
|
||||
'/noticia/saude/missao-internacional-com-solla-lula-e-jeronimo-fortalece-producao-de-medicamentos-estrategicos-e-projeta-a-bahia-como-polo-de-biofarmacos',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/02/26/solla-articula-agenda-de-dirigentes-da-ufba-no-ministerio-da-cultura-para-viabilizar-reforma-de-alas-da-faculdade-de-medicina',
|
||||
destination:
|
||||
'/noticia/educacao/solla-articula-agenda-de-dirigentes-da-ufba-no-ministerio-da-cultura-para-viabilizar-reforma-de-alas-da-faculdade-de-medicina',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/02/28/pt-de-jacobina-celebra-aniversario-com-presenca-de-jorge-solla-e-do-secretario-do-governo-lula-julio-pinheiro',
|
||||
destination:
|
||||
'/noticia/politica/pt-de-jacobina-celebra-aniversario-com-presenca-de-jorge-solla-e-do-secretario-do-governo-lula-julio-pinheiro',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/03/03/com-presenca-de-solla-e-aliados-aniversario-do-pt-de-jacobina-reune-liderancas-e-reafirma-compromisso-o-desenvolvimento-da-bahia',
|
||||
destination:
|
||||
'/noticia/politica/com-presenca-de-solla-e-aliados-aniversario-do-pt-de-jacobina-reune-liderancas-e-reafirma-compromisso-o-desenvolvimento-da-bahia',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/03/04/solla-participa-das-celebracoes-pelos-218-anos-da-faculdade-de-medicina-da-ufba',
|
||||
destination:
|
||||
'/noticia/educacao/solla-participa-das-celebracoes-pelos-218-anos-da-faculdade-de-medicina-da-ufba',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/03/04/solla-rebate-ataques-de-ze-coca-e-destaca-investimentos-do-mandato-em-itirucu-e-na-regiao-de-jequie',
|
||||
destination:
|
||||
'/noticia/politica/solla-rebate-ataques-de-ze-coca-e-destaca-investimentos-do-mandato-em-itirucu-e-na-regiao-de-jequie',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/03/06/camara-aprova-pec-da-seguranca-publica-e-solla-destaca-avanco-da-proposta-do-governo-lula',
|
||||
destination:
|
||||
'/noticia/seguranca/camara-aprova-pec-da-seguranca-publica-e-solla-destaca-avanco-da-proposta-do-governo-lula',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/03/17/articulacao-de-solla-fortalece-pt-com-filiacao-da-lideranca-sindical-zilar-portela',
|
||||
destination:
|
||||
'/noticia/politica/articulacao-de-solla-fortalece-pt-com-filiacao-da-lideranca-sindical-zilar-portela',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/03/17/solla-articula-no-mec-avancos-para-expansao-da-educacao-superior-e-da-educacao-profissional-na-bahia',
|
||||
destination:
|
||||
'/noticia/educacao/solla-articula-no-mec-avancos-para-expansao-da-educacao-superior-e-da-educacao-profissional-na-bahia',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/03/18/solla-protocola-pec-para-garantir-controle-estatal-sobre-petroleo-e-derivados-no-brasil',
|
||||
destination:
|
||||
'/noticia/desenvolvimento/solla-protocola-pec-para-garantir-controle-estatal-sobre-petroleo-e-derivados-no-brasil',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/03/20/ao-lado-de-camilo-santana-jorge-solla-acompanha-avancos-da-educacao-federal-em-barreiras-e-pocoes',
|
||||
destination:
|
||||
'/noticia/educacao/ao-lado-de-camilo-santana-jorge-solla-acompanha-avancos-da-educacao-federal-em-barreiras-e-pocoes',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/03/20/articulada-por-solla-filiacao-de-zilar-portela-ao-pt-marca-lancamento-de-pre-candidatura-a-deputada-estadual',
|
||||
destination:
|
||||
'/noticia/politica/articulada-por-solla-filiacao-de-zilar-portela-ao-pt-marca-lancamento-de-pre-candidatura-a-deputada-estadual',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/03/22/recomprar-a-refinaria-de-mataripe-e-defender-a-bahia-e-a-soberania-do-brasil',
|
||||
destination:
|
||||
'/noticia/desenvolvimento/recomprar-a-refinaria-de-mataripe-e-defender-a-bahia-e-a-soberania-do-brasil',
|
||||
},
|
||||
{
|
||||
source: '/2026/03/31/emenda-de-solla-garante-maquinas-de-costura-a-associacao-de-fibromialgia',
|
||||
destination:
|
||||
'/noticia/saude/emenda-de-solla-garante-maquinas-de-costura-a-associacao-de-fibromialgia',
|
||||
},
|
||||
{
|
||||
source: '/2026/04/01/federacao-brasil-esperanca-exige-defesa-do-nosso-projeto-politico',
|
||||
destination:
|
||||
'/noticia/politica/federacao-brasil-esperanca-exige-defesa-do-nosso-projeto-politico',
|
||||
},
|
||||
{
|
||||
source: '/2026/04/01/fim-da-escala-6x1-tambem-e-questao-de-saude',
|
||||
destination: '/noticia/direitos-trabalhistas/fim-da-escala-6x1-tambem-e-questao-de-saude',
|
||||
},
|
||||
{
|
||||
source: '/2026/04/14/fora-trump-em-defesa-da-saude-e-da-paz',
|
||||
destination: '/noticia/saude/fora-trump-em-defesa-da-saude-e-da-paz',
|
||||
},
|
||||
{
|
||||
source: '/2026/04/16/solla-comemora-25-anos-da-politica-nacional-de-sangue-neste-16-de-abril',
|
||||
destination:
|
||||
'/noticia/saude/solla-comemora-25-anos-da-politica-nacional-de-sangue-neste-16-de-abril',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/05/05/solla-leva-comissao-da-camara-para-nova-visita-tecnica-ao-estaleiro-enseada',
|
||||
destination:
|
||||
'/noticia/desenvolvimento/solla-leva-comissao-da-camara-para-nova-visita-tecnica-ao-estaleiro-enseada',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/05/08/com-solla-comissao-acompanha-retomada-da-producao-no-enseada-em-maragogipe',
|
||||
destination:
|
||||
'/noticia/desenvolvimento/com-solla-comissao-acompanha-retomada-da-producao-no-enseada-em-maragogipe',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/05/08/solla-conduz-cffc-em-visita-tecnica-a-primeira-faculdade-de-medicina-do-brasil',
|
||||
destination:
|
||||
'/noticia/educacao/solla-conduz-cffc-em-visita-tecnica-a-primeira-faculdade-de-medicina-do-brasil',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/05/11/solla-reforca-luta-por-cumprimento-do-piso-da-enfermagem-em-audiencia-na-camara',
|
||||
destination:
|
||||
'/noticia/saude/solla-reforca-luta-por-cumprimento-do-piso-da-enfermagem-em-audiencia-na-camara',
|
||||
},
|
||||
{
|
||||
source: '/2026/05/14/audiencia-publica-debate-plano-nacional-de-cultura',
|
||||
destination: '/noticia/cultura/audiencia-publica-debate-plano-nacional-de-cultura',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/05/28/clube-2004-celebra-a-democracia-com-o-lancamento-da-pre-candidatura-de-jorge-solla-a-deputado-federal',
|
||||
destination:
|
||||
'/noticia/politica/clube-2004-celebra-a-democracia-com-o-lancamento-da-pre-candidatura-de-jorge-solla-a-deputado-federal',
|
||||
},
|
||||
{
|
||||
source: '/2026/06/10/programa-de-governo-participativo-reune-multidao-em-periperi',
|
||||
destination: '/noticia/politica/programa-de-governo-participativo-reune-multidao-em-periperi',
|
||||
},
|
||||
{
|
||||
source: '/2026/06/12/governo-da-bahia-anuncia-pacote-de-quase-r-2-bi',
|
||||
destination: '/noticia/desenvolvimento/governo-da-bahia-anuncia-pacote-de-quase-r-2-bi',
|
||||
},
|
||||
{
|
||||
source: '/2026/06/20/solla-e-jeronimo-inauguram-mercado-publico-de-ubata',
|
||||
destination: '/noticia/desenvolvimento/solla-e-jeronimo-inauguram-mercado-publico-de-ubata',
|
||||
},
|
||||
{
|
||||
source: '/2026/07/02/lula-jeronimo-e-solla-inauguram-hospital-do-litoral-norte-da-bahia',
|
||||
destination:
|
||||
'/noticia/saude/lula-jeronimo-e-solla-inauguram-hospital-do-litoral-norte-da-bahia',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/07/02/solla-exalta-primeiro-ano-de-salvador-como-capital-do-brasil-no-2-de-julho',
|
||||
destination:
|
||||
'/noticia/cultura/solla-exalta-primeiro-ano-de-salvador-como-capital-do-brasil-no-2-de-julho',
|
||||
},
|
||||
{
|
||||
source: '/2026/07/31/chapada-diamantina-recebe-caravana-liderada-pelo-deputado-jorge-solla',
|
||||
destination:
|
||||
'/noticia/politica/chapada-diamantina-recebe-caravana-liderada-pelo-deputado-jorge-solla',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/08/02/lula-reforca-o-time-de-jeronimo-wagner-rui-e-jorge-solla-na-convencao-estadual-do-pt',
|
||||
destination:
|
||||
'/noticia/politica/lula-reforca-o-time-de-jeronimo-wagner-rui-e-jorge-solla-na-convencao-estadual-do-pt',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/08/11/o-pt-tem-que-disputar-o-programa-de-governo-conclamou-jorge-solla-em-plenaria',
|
||||
destination:
|
||||
'/noticia/politica/o-pt-tem-que-disputar-o-programa-de-governo-conclamou-jorge-solla-em-plenaria',
|
||||
},
|
||||
{
|
||||
source:
|
||||
'/2026/08/17/bruno-reis-foi-covarde-detonou-solla-ao-rebater-o-prefeito-sobre-saude-de-salvador',
|
||||
destination:
|
||||
'/noticia/politica/bruno-reis-foi-covarde-detonou-solla-ao-rebater-o-prefeito-sobre-saude-de-salvador',
|
||||
},
|
||||
]
|
||||
|
|
@ -98,6 +98,7 @@ export const SCRIPTS_SPEC_PINNED = [
|
|||
'scripts/lib/imageResize.mjs',
|
||||
'scripts/lib/instagramContentPlan.mjs',
|
||||
'scripts/lib/issues-panel.mjs',
|
||||
'scripts/lib/legacyWordPressRedirects.mjs',
|
||||
'scripts/lib/markdown-ansi.mjs',
|
||||
'scripts/lib/mediaBinaries.mjs',
|
||||
'scripts/lib/mediaEndpoint.mjs',
|
||||
|
|
|
|||
|
|
@ -76,6 +76,24 @@ test.describe('Frontend', () => {
|
|||
expect(new URL(response.headers().location, 'http://localhost').pathname).toBe(to)
|
||||
}
|
||||
})
|
||||
|
||||
test('redirects the legacy WordPress permalinks and archive routes', async ({ request }) => {
|
||||
for (const [from, to] of [
|
||||
[
|
||||
'/2026/08/17/bruno-reis-foi-covarde-detonou-solla-ao-rebater-o-prefeito-sobre-saude-de-salvador',
|
||||
'/noticia/politica/bruno-reis-foi-covarde-detonou-solla-ao-rebater-o-prefeito-sobre-saude-de-salvador',
|
||||
],
|
||||
['/category/noticias', '/artigos'],
|
||||
['/tag/lula', '/artigos'],
|
||||
['/2026/08', '/artigos'],
|
||||
['/2024/07/22/qualquer-post-antigo', '/artigos'],
|
||||
['/home', '/'],
|
||||
]) {
|
||||
const response = await request.get(from, { maxRedirects: 0 })
|
||||
expect(response.status()).toBe(308)
|
||||
expect(new URL(response.headers().location, 'http://localhost').pathname).toBe(to)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
test.describe('Campaign home content section', () => {
|
||||
|
|
|
|||
45
tests/unit/legacyWordPressRedirects.unit.spec.ts
Normal file
45
tests/unit/legacyWordPressRedirects.unit.spec.ts
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
import { describe, expect, it } from 'vitest'
|
||||
|
||||
import { legacyWordPressPostRedirects } from '../../scripts/lib/legacyWordPressRedirects.mjs'
|
||||
|
||||
const SOURCE_PATTERN = /^\/\d{4}\/\d{2}\/\d{2}\/[a-z0-9-]+$/
|
||||
const DESTINATION_PATTERN = /^\/noticia\/[a-z-]+\/[a-z0-9-]+$/
|
||||
|
||||
describe('legacy WordPress post redirects (OPS131)', () => {
|
||||
it('covers the 43 published posts from the WordPress archive', () => {
|
||||
expect(legacyWordPressPostRedirects).toHaveLength(43)
|
||||
})
|
||||
|
||||
it('uses the WordPress date permalink shape and the canonical Teqo article path', () => {
|
||||
for (const { source, destination } of legacyWordPressPostRedirects) {
|
||||
expect(source).toMatch(SOURCE_PATTERN)
|
||||
expect(destination).toMatch(DESTINATION_PATTERN)
|
||||
expect(destination.split('/').at(-1)).toBe(source.split('/').at(-1))
|
||||
}
|
||||
})
|
||||
|
||||
it('has no duplicate source or destination', () => {
|
||||
const sources = legacyWordPressPostRedirects.map((entry) => entry.source)
|
||||
const destinations = legacyWordPressPostRedirects.map((entry) => entry.destination)
|
||||
|
||||
expect(new Set(sources).size).toBe(sources.length)
|
||||
expect(new Set(destinations).size).toBe(destinations.length)
|
||||
})
|
||||
|
||||
it('pins the oldest and newest archived posts', () => {
|
||||
const bySource = new Map(
|
||||
legacyWordPressPostRedirects.map((entry) => [entry.source, entry.destination]),
|
||||
)
|
||||
|
||||
expect(
|
||||
bySource.get('/2024/07/22/apresentacao-do-plano-de-restauracao-arquitetonica-da-famed-ufba'),
|
||||
).toBe('/noticia/educacao/apresentacao-do-plano-de-restauracao-arquitetonica-da-famed-ufba')
|
||||
expect(
|
||||
bySource.get(
|
||||
'/2026/08/17/bruno-reis-foi-covarde-detonou-solla-ao-rebater-o-prefeito-sobre-saude-de-salvador',
|
||||
),
|
||||
).toBe(
|
||||
'/noticia/politica/bruno-reis-foi-covarde-detonou-solla-ao-rebater-o-prefeito-sobre-saude-de-salvador',
|
||||
)
|
||||
})
|
||||
})
|
||||
Loading…
Reference in a new issue