diff --git a/CHANGELOG.md b/CHANGELOG.md index e189c1f..5bfaf68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,33 @@ e este projeto adere ao [Versionamento Semântico](https://semver.org/lang/pt-BR ## [Unreleased] +## [2.4.4] - 2026-04-25 + +Esta versão remove a dependência da extensão `pgcrypto` do PostgreSQL para a geração do `share_code` em pagadores. O default a nível de banco (`gen_random_bytes`) foi removido — agora a aplicação gera o código sempre via `crypto.randomBytes` do Node.js, num utilitário compartilhado. A consequência prática é que o setup inicial fica mais simples: não há mais script de habilitação de extensão, nem etapa extra no primeiro `db:push`, e bancos restaurados de dumps externos não precisam ter `pgcrypto` instalada. O script de backup também foi enxugado para gerar dumps focados nos schemas relevantes (`public` e `drizzle`), descartando os schemas internos do Supabase e eliminando os ~148 erros de restore em PostgreSQL padrão. + +### Alterado + +- Schema: coluna `share_code` em `pagadores` perdeu o default `substr(encode(gen_random_bytes(24), 'base64'), 1, 24)` — campo continua `NOT NULL` e a aplicação passa a fornecer o valor explicitamente em todas as inserções +- Pagadores: nova função utilitária `generateShareCode()` em `src/shared/lib/payers/share-code.ts` (server-only) — usa `crypto.randomBytes(18).toString("base64url").slice(0, 24)` +- Pagadores: `createPayerAction`, `ensureDefaultPagadorForUser`, `resetUserAppData` (settings) e `mock-data.ts` agora chamam `generateShareCode()` ao inserir um pagador +- Backup: `scripts/backup.sh` agora dumpa apenas os schemas `public` e `drizzle` — schemas internos do Supabase (`auth`, `realtime`, `storage`, `vault`, `graphql`, `graphql_public`, `extensions`, `pgbouncer`) e suas extensions/roles deixam de poluir os dumps. Restaurações em PostgreSQL padrão passam a executar sem os ~148 erros de `role/extension does not exist` + +### Removido + +- Pasta `scripts/postgres/` (continha `init.sql` e `enable-extensions.ts`) +- Script `pnpm db:extensions` no `package.json` +- Referências ao `pnpm db:extensions` no README + +### Corrigido + +- Migrations: conflito de numeração resolvido — `0027_fancy_reaper` renomeado para `0028_fancy_reaper` (o número 0027 já estava ocupado pelo arquivo órfão `0027_glorious_mindworm`); journal e snapshot atualizados + +### Documentação + +- README: seção Backup atualizada — arquivos gerados agora especificam que apenas os schemas `public` e `drizzle` são dumpados +- README: seção Restore reescrita com o fluxo correto para banco Docker (`DROP SCHEMA public CASCADE` + `pg_restore --clean --if-exists --disable-triggers`) +- README: comando rápido de Docker Compose de backup/restore substituído por `pnpm backup` + ## [2.4.3] - 2026-04-25 Esta versão amplia o trabalho com lançamentos divididos: anexos passam a ser visíveis para pessoas com acesso compartilhado, a importação para conta própria copia os arquivos de forma independente e a edição ganha a opção de aplicar a alteração nos dois lados do par. Três caminhos de deleção foram corrigidos para não deixar arquivos órfãos no storage. Também traz refresh visual nos badges de tipo e radio buttons, prefetch server-side de logos para reduzir chamadas de API no dashboard, e ajustes pontuais no healthcheck do container e em rótulos da UI. diff --git a/README.md b/README.md index 6cb3fc5..b2c72fd 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ > **⚠️ Não há versão online hospedada.** Você precisa clonar o repositório e rodar localmente ou no seu próprio servidor. -[![Version](https://img.shields.io/badge/version-2.4.3-blue?style=flat-square)](CHANGELOG.md) +[![Version](https://img.shields.io/badge/version-2.4.4-blue?style=flat-square)](CHANGELOG.md) [![Next.js](https://img.shields.io/badge/Next.js-black?style=flat-square&logo=next.js)](https://nextjs.org/) [![TypeScript](https://img.shields.io/badge/TypeScript-blue?style=flat-square&logo=typescript)](https://www.typescriptlang.org/) [![PostgreSQL](https://img.shields.io/badge/PostgreSQL-blue?style=flat-square&logo=postgresql)](https://www.postgresql.org/) @@ -196,13 +196,10 @@ cp .env.example .env # 4. Suba o banco pnpm docker:db -# 5. Habilite extensões do PostgreSQL (apenas no primeiro setup) -pnpm db:extensions - -# 6. Aplique o schema no banco (apenas no primeiro setup) +# 5. Aplique o schema no banco (apenas no primeiro setup) pnpm db:push -# 7. Inicie o app com hot-reload +# 6. Inicie o app com hot-reload pnpm dev ``` @@ -240,7 +237,6 @@ pnpm lint:fix # Biome auto-fix pnpm db:generate # Gerar migrations pnpm db:migrate # Executar migrations pnpm db:push # Push schema direto (dev) -pnpm db:extensions # Habilitar extensões PostgreSQL (rodar uma vez) pnpm db:studio # Drizzle Studio (UI visual) ``` @@ -291,8 +287,7 @@ docker compose up -d app docker compose exec app sh # Shell da aplicação docker compose exec db psql -U openmonetis -d openmonetis_db # Shell do banco docker compose ps # Status -docker compose exec db pg_dump -U openmonetis openmonetis_db > backup.sql # Backup -docker compose exec -T db psql -U openmonetis -d openmonetis_db < backup.sql # Restore +pnpm backup # Backup (ver seção Backup) ``` ### Customizando portas @@ -318,9 +313,9 @@ Cada execução gera **3 arquivos** em `backup/`: | Arquivo | Conteúdo | Uso | |---|---|---| -| `openmonetis_YYYY-MM-DD_HH-MM.dump` | Dump custom do PostgreSQL (binário) | Restore completo via `pg_restore` | -| `openmonetis_YYYY-MM-DD_HH-MM.sql.gz` | Dump SQL completo compactado | Inspeção manual, portabilidade | -| `openmonetis_YYYY-MM-DD_HH-MM.data.sql.gz` | Apenas os dados da schema `public` | Migração parcial, seed de outro ambiente | +| `openmonetis_YYYY-MM-DD_HH-MM.dump` | Dump custom dos schemas `public` + `drizzle` | Restore completo via `pg_restore` | +| `openmonetis_YYYY-MM-DD_HH-MM.sql.gz` | Dump SQL compactado dos schemas `public` + `drizzle` | Inspeção manual, portabilidade | +| `openmonetis_YYYY-MM-DD_HH-MM.data.sql.gz` | Apenas os dados do schema `public` (sem DDL) | Migração parcial, seed de outro ambiente | ### Modos de conexão @@ -354,16 +349,19 @@ crontab -e ### Restore ```bash -# A partir do .dump (recomendado — mais rápido) -pg_restore --clean --no-owner --no-privileges \ - -d "postgresql://user:senha@host:5432/openmonetis_db" \ - backup/openmonetis_YYYY-MM-DD_HH-MM.dump +# 1. Zerar o banco +docker exec psql -U openmonetis -d openmonetis_db \ + -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;" -# A partir do .sql.gz (banco local via Docker) -gunzip -c backup/openmonetis_YYYY-MM-DD_HH-MM.sql.gz | \ - docker compose exec -T db psql -U openmonetis -d openmonetis_db +# 2. Restaurar schema + dados (um comando) +docker exec -i pg_restore \ + -U openmonetis -d openmonetis_db \ + --clean --if-exists --disable-triggers --no-owner --no-privileges \ + < backup/openmonetis_YYYY-MM-DD_HH-MM.dump ``` +> `--disable-triggers` é necessário para evitar erros de FK durante o restore (os dados são inseridos fora de ordem). O usuário `openmonetis` tem permissão para isso. + --- ## ☁️ Storage S3 Compatível diff --git a/package.json b/package.json index a724495..30a9a58 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "openmonetis", - "version": "2.4.3", + "version": "2.4.4", "private": true, "packageManager": "pnpm@10.33.0", "scripts": { @@ -15,7 +15,6 @@ "db:generate": "drizzle-kit generate", "db:migrate": "drizzle-kit migrate", "db:push": "drizzle-kit push", - "db:extensions": "tsx scripts/postgres/enable-extensions.ts", "db:studio": "drizzle-kit studio", "postinstall": "cp node_modules/pdfjs-dist/build/pdf.worker.min.mjs public/pdf.worker.min.mjs", "docker:up": "docker compose up -d",