@seedgrid/ai-toolkit 0.0.0-stage → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +151 -2
- package/dist/adapters/claude.js +114 -0
- package/dist/adapters/codex.js +108 -0
- package/dist/adapters/index.js +17 -0
- package/dist/adapters/shared.js +142 -0
- package/dist/adapters/types.js +1 -0
- package/dist/cli.js +203 -0
- package/dist/commands/common.js +98 -0
- package/dist/commands/doctor.js +290 -0
- package/dist/commands/init.js +9 -0
- package/dist/commands/install.js +107 -0
- package/dist/commands/remove.js +54 -0
- package/dist/commands/review.js +127 -0
- package/dist/commands/status.js +73 -0
- package/dist/commands/update.js +8 -0
- package/dist/commands/validate.js +27 -0
- package/dist/core/apply.js +181 -0
- package/dist/core/blocks.js +64 -0
- package/dist/core/content.js +528 -0
- package/dist/core/env.js +40 -0
- package/dist/core/frontmatter.js +29 -0
- package/dist/core/hash.js +14 -0
- package/dist/core/inspect.js +51 -0
- package/dist/core/lock.js +124 -0
- package/dist/core/paths.js +65 -0
- package/dist/core/plan.js +242 -0
- package/dist/core/tools.js +62 -0
- package/dist/core/types.js +11 -0
- package/dist/core/updates.js +121 -0
- package/docs/arquitetura.md +80 -0
- package/docs/compatibilidade.md +50 -0
- package/docs/formato.md +155 -0
- package/docs/instalacao.md +105 -0
- package/docs/manutencao.md +115 -0
- package/package.json +43 -4
- package/seedgridKB/SeedGrid/Extensions/Catalogo-de-enums.md +161 -0
- package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +971 -0
- package/seedgridKB/SeedGrid/Extensions/Indice.md +63 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +124 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Enums.md +40 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +97 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao-Rust.md +69 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao.md +88 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Enums.md +33 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Exemplos.md +121 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Rust.md +126 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Visao-geral.md +111 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Configuracao-Rust.md +93 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Configuracao.md +127 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Enums.md +66 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Exemplos.md +151 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Rust.md +120 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Configuracao-Rust.md +136 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Configuracao.md +319 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Enums.md +131 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Exemplos.md +210 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Rust.md +135 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Visao-geral.md +150 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Configuracao-Rust.md +86 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Configuracao.md +243 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Enums.md +165 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Exemplos.md +205 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Rust.md +109 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Visao-geral.md +181 -0
- package/seedgridKB/SeedGrid/Extensions/broker/Configuracao-Rust.md +40 -0
- package/seedgridKB/SeedGrid/Extensions/broker/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Configuracao-Rust.md +73 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Configuracao.md +112 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Enums.md +36 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Exemplos.md +149 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Rust.md +81 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Visao-geral.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Configuracao.md +107 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Enums.md +105 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Exemplos.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Visao-geral.md +99 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +122 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Enums.md +29 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +82 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +118 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao-Rust.md +110 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao.md +157 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Exemplos.md +157 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Rust.md +70 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Visao-geral.md +88 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao-Rust.md +124 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +195 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Enums.md +71 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Exemplos.md +149 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Rust.md +139 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +130 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Configuracao.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Enums.md +52 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Exemplos.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Visao-geral.md +113 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao-Rust.md +67 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao.md +94 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Enums.md +79 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Exemplos.md +172 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Rust.md +107 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Visao-geral.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao-Rust.md +72 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao.md +104 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Exemplos.md +104 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Rust.md +69 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Visao-geral.md +105 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao-Rust.md +68 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao.md +186 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Enums.md +96 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Exemplos.md +229 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Rust.md +80 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Visao-geral.md +112 -0
- package/seedgridKB/SeedGrid/Extensions/runtime/Configuracao-Rust.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/runtime/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/security/Configuracao-Rust.md +327 -0
- package/seedgridKB/SeedGrid/Extensions/security/Configuracao.md +510 -0
- package/seedgridKB/SeedGrid/Extensions/security/Enums.md +95 -0
- package/seedgridKB/SeedGrid/Extensions/security/Exemplos.md +218 -0
- package/seedgridKB/SeedGrid/Extensions/security/Rust.md +203 -0
- package/seedgridKB/SeedGrid/Extensions/security/Visao-geral.md +131 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao-Rust.md +188 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +345 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Enums.md +117 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Exemplos.md +205 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Rust.md +161 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +142 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao-Rust.md +75 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao.md +152 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Enums.md +198 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Exemplos.md +173 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Rust.md +83 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Visao-geral.md +99 -0
- package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +112 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/Indice.md +323 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/API.md +257 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Exemplos.md +307 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Visao-geral.md +51 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/API.md +174 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Exemplos.md +236 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Visao-geral.md +76 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/API.md +339 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/Exemplos.md +311 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/Visao-geral.md +57 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/API.md +125 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/Exemplos.md +116 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/Visao-geral.md +86 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/API.md +490 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Exemplos.md +544 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Visao-geral.md +69 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/API.md +113 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Exemplos.md +159 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Visao-geral.md +92 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/API.md +516 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Exemplos.md +629 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Visao-geral.md +80 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/API.md +615 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Exemplos.md +384 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral.md +111 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/API.md +661 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Exemplos.md +312 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Visao-geral.md +123 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/API.md +1090 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/Exemplos.md +1172 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/Visao-geral.md +98 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/Visao-geral.md +98 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-apikeys.md +118 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-audit.md +88 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-backup.md +131 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-platform.md +132 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-user.md +120 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-login-tenancy.md +119 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-security.md +427 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-self-enter.md +104 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-subdomain-tenancy.md +110 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/API.md +490 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Exemplos.md +561 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Visao-geral.md +82 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/Visao-geral.md +68 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-commons.md +61 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-core.md +140 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-playground.md +112 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-theme.md +97 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/API.md +177 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/Exemplos.md +332 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/Visao-geral.md +106 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/showcase.md +70 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/arquiteto.md +53 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +45 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +43 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +41 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +44 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +40 -0
- package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +78 -0
- package/seedgridKB/SeedGrid/Toolkit/references/glossario.md +15 -0
- package/seedgridKB/SeedGrid/Toolkit/references/modos-shared-native.md +27 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +54 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +39 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/formato-entrega.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +47 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/personalizacao-local.md +22 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/planejar-mudanca/SKILL.md +38 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/SKILL.md +33 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/references/checklist.md +25 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-backend-crud/SKILL.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-bump/SKILL.md +26 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/SKILL.md +221 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/checklist.md +31 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/patterns.md +185 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/routing.md +66 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/SKILL.md +56 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/checklist.md +32 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/steps.md +114 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-review/SKILL.md +61 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/validar-mudanca/SKILL.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/decisao-arquitetura.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/especificacao-tarefa.md +32 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/relatorio-validacao.md +30 -0
- package/seedgridKB/SeedGrid/Versoes.md +64 -0
- package/seedgridKB/SeedGrid/Visao-geral.md +35 -0
- package/seedgridKB/manifest.json +142 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, front, modulo, fe-billing-platform]
|
|
3
|
+
fonte: front/seedgrid-fe-components/packages/modules/seedgrid-fe-billing-platform
|
|
4
|
+
branch: main
|
|
5
|
+
commit: ad30fc11de
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# @seedgrid/fe-billing-platform
|
|
10
|
+
|
|
11
|
+
Módulo front de **billing da plataforma** (backoffice de planos): CRUD de planos, faixas de preço (*terms*) com publicação/arquivamento e configuração do trial. É a visão de quem opera a plataforma; a visão do assinante é o [[SeedGrid/SeedGrid-components/modulos/fe-billing-user|fe-billing-user]]. Compõe sobre o motor de sessão do [[SeedGrid/SeedGrid-components/modulos/fe-security|fe-security]]. Parte dos [[SeedGrid/SeedGrid-components/modulos/Visao-geral|Módulos front]].
|
|
12
|
+
|
|
13
|
+
Backend: [[SeedGrid/Extensions/billing/Visao-geral|extension billing]]. O README cita o `AdminPlanResource` do `seedgrid-report-api`; no monorepo, os mesmos paths `/admin/plans/**` estão em `java/seedgrid-quarkus-ext-billing/seedgrid-billing-core/runtime/src/main/java/br/com/seedgrid/billing/controllers/AdminPlanController.java` (`@MonoCompany`) (verbo e permissões em Limitações).
|
|
14
|
+
|
|
15
|
+
## Pacote
|
|
16
|
+
|
|
17
|
+
| Item | Valor |
|
|
18
|
+
|---|---|
|
|
19
|
+
| Nome npm / versão | `@seedgrid/fe-billing-platform` `2026.7.0` |
|
|
20
|
+
| peerDependencies | `@seedgrid/fe-core: *`, `@seedgrid/fe-security: *` |
|
|
21
|
+
| `files` | `dist`, `scaffold` |
|
|
22
|
+
| Build | `tsc -p tsconfig.json` + `postbuild` `emit-module-manifest.mjs` → `dist/module.json` |
|
|
23
|
+
| `exports` | `.` → `./dist/index.{d.ts,js}`; `./server` → `./dist/server/index.{d.ts,js}` |
|
|
24
|
+
|
|
25
|
+
Dependência de módulo: **requer `security`** (usa `SecurityServer`, `PaginatedResult`; scaffold usa `toRouteResponse` de `@seedgrid/fe-security/server`).
|
|
26
|
+
|
|
27
|
+
## Exports públicos
|
|
28
|
+
|
|
29
|
+
| Export | Tipo | Subpath | Descrição | Fonte |
|
|
30
|
+
|---|---|---|---|---|
|
|
31
|
+
| `BillingPlatformPaths` | const | `.` | `plans`, `trial`, `planById`, `terms`, `termById`, `archiveTerm`, `publishTerm` | `front/seedgrid-fe-components/packages/modules/seedgrid-fe-billing-platform/src/paths.ts → BillingPlatformPaths` |
|
|
32
|
+
| `PlanCurrentTerm` | interface | `.` | Term vigente embutido no plano | `.../src/billing-platform.ts → PlanCurrentTerm` |
|
|
33
|
+
| `PlanEntry` | type | `.` | Plano (limiares de cota, `currentTerm`) | `.../src/billing-platform.ts → PlanEntry` |
|
|
34
|
+
| `PlanTermStatus` | type | `.` | `"SCHEDULED" \| "CURRENT" \| "ENDED"` | `.../src/billing-platform.ts → PlanTermStatus` |
|
|
35
|
+
| `PlanTermEntry` | type | `.` | Faixa de preço | `.../src/billing-platform.ts → PlanTermEntry` |
|
|
36
|
+
| `TrialConfig` | interface | `.` | `{ planPublicId; termPublicId; monthlyRequests }` | `.../src/billing-platform.ts → TrialConfig` |
|
|
37
|
+
| `CreatePlanRequest` | interface | `.` | POST/PUT de plano (`name` obrigatório) | `.../src/billing-platform.ts → CreatePlanRequest` |
|
|
38
|
+
| `CreatePlanTermRequest` | interface | `.` | Criação de term (`monthlyPrice`, `overagePrice` obrigatórios) | `.../src/billing-platform.ts → CreatePlanTermRequest` |
|
|
39
|
+
| `CreatePlanTermResponse` | interface | `.` | Term + `published`/`publishError` (publicação automática no provedor) | `.../src/billing-platform.ts → CreatePlanTermResponse` |
|
|
40
|
+
| `PatchPlanTermRequest` | interface | `.` | Edição parcial de term agendado | `.../src/billing-platform.ts → PatchPlanTermRequest` |
|
|
41
|
+
| `PatchTrialRequest` | interface | `.` | `{ monthlyRequests? }` | `.../src/billing-platform.ts → PatchTrialRequest` |
|
|
42
|
+
| `billingPlatformMessages` | const | `.` | i18n `en`, `pt-BR` completos; `es`/`fr` = `en`; `pt-PT` = `pt-BR` | `.../src/messages.ts → billingPlatformMessages` |
|
|
43
|
+
| `createBillingPlatformServer` | função | `./server` | `(session) => BillingPlatformServer` | `.../src/server/create-billing-platform-server.ts → createBillingPlatformServer` |
|
|
44
|
+
| `BillingPlatformServer` | interface | `./server` | 13 métodos (planos, terms, trial) | idem `→ BillingPlatformServer` |
|
|
45
|
+
|
|
46
|
+
Contagem: `.` = 12; `./server` = 2.
|
|
47
|
+
|
|
48
|
+
## Registro no @seedgrid/fe-core (manifesto do CLI)
|
|
49
|
+
|
|
50
|
+
`SeedGridCliModuleManifest` ([[SeedGrid/SeedGrid-components/pacotes/fe-core|@seedgrid/fe-core]]), `src/module.ts`:
|
|
51
|
+
|
|
52
|
+
| Campo | Valor |
|
|
53
|
+
|---|---|
|
|
54
|
+
| `id` / `configKey` | `billing-platform` |
|
|
55
|
+
| `requires` | `["security"]` |
|
|
56
|
+
| `navigation` | `useBillingPlatformAppShellSections` de `@/modules/billing-platform` |
|
|
57
|
+
| `messages` | `billingPlatformMessages` de `@seedgrid/fe-billing-platform` |
|
|
58
|
+
|
|
59
|
+
Menu: seção `platform` (order 40) → `platform-billing` → `platform-plans` (`/platform/plans`, badge "readonly" se só leitura) e `platform-trial` (`/platform/plans/trial`); só aparece com `useCrudPermission("PLAN").canRead`.
|
|
60
|
+
|
|
61
|
+
## Páginas (scaffold) e permissões
|
|
62
|
+
|
|
63
|
+
| Rota | Arquivo | Permissão |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| `/platform/plans` | `scaffold/src/app/platform/plans/(list)/page.tsx` | `PLAN_READ` (ações via `useCrudPermission("PLAN")`) |
|
|
66
|
+
| `/platform/plans/new` | `.../(create)/new/page.tsx` → `PlanEditor` | `PLAN_CREATE` |
|
|
67
|
+
| `/platform/plans/[publicId]` | `.../(edit)/[publicId]/page.tsx` → `PlanEditor` + `TermsSection` | `PLAN_READ` |
|
|
68
|
+
| `/platform/plans/trial` | `.../trial/page.tsx` | `PLAN_READ` |
|
|
69
|
+
|
|
70
|
+
Route Handlers (proxies finos com `toRouteResponse`) em `scaffold/src/app/api/platform/plans/**`: `GET/POST /api/platform/plans`, `GET/POST /api/platform/plans/trial`, `GET/PUT/DELETE /api/platform/plans/[publicId]`, `GET/POST .../[publicId]/terms`, `PATCH/DELETE .../terms/[termId]`, `POST .../terms/[termId]/publish`, `POST .../terms/[termId]/archive`. Bootstrap: `scaffold/src/modules/billing-platform/server.ts.hbs → getBillingPlatformServer`.
|
|
71
|
+
|
|
72
|
+
## APIs backend chamadas (`createBillingPlatformServer`)
|
|
73
|
+
|
|
74
|
+
| Método | Path | Função |
|
|
75
|
+
|---|---|---|
|
|
76
|
+
| GET | `/admin/plans` | `listPlans` |
|
|
77
|
+
| POST | `/admin/plans` | `createPlan` |
|
|
78
|
+
| GET | `/admin/plans/{id}` | `getPlan` |
|
|
79
|
+
| PUT | `/admin/plans/{id}` | `updatePlan` |
|
|
80
|
+
| DELETE | `/admin/plans/{id}` | `deletePlan` |
|
|
81
|
+
| GET | `/admin/plans/{id}/terms` | `listTerms` |
|
|
82
|
+
| POST | `/admin/plans/{id}/terms` | `createTerm` |
|
|
83
|
+
| PATCH | `/admin/plans/{id}/terms/{termId}` | `updateTerm` (sem UI) |
|
|
84
|
+
| DELETE | `/admin/plans/{id}/terms/{termId}` | `deleteTerm` |
|
|
85
|
+
| POST | `/admin/plans/{id}/terms/{termId}/archive` | `archiveTerm` |
|
|
86
|
+
| POST | `/admin/plans/{id}/terms/{termId}/publish` | `publishTerm` |
|
|
87
|
+
| GET | `/admin/plans/trial` | `getTrial` |
|
|
88
|
+
| POST | `/admin/plans/trial` | `updateTrial` |
|
|
89
|
+
|
|
90
|
+
13 chamadas (método+path).
|
|
91
|
+
|
|
92
|
+
## Separação client/server
|
|
93
|
+
|
|
94
|
+
Lib `.` client-safe; `./server` SERVER-ONLY. As telas (client) só chamam `/api/platform/plans/**` via `fetch`; os Route Handlers chamam o engine no servidor com o cookie de sessão.
|
|
95
|
+
|
|
96
|
+
## Configuração
|
|
97
|
+
|
|
98
|
+
Variáveis de ambiente lidas no scaffold (`server.ts.hbs`) e objeto `billingPlatformConfig`:
|
|
99
|
+
|
|
100
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
|
|
101
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
102
|
+
| `SEEDGRID_SECURITY_ACCESS_COOKIE_NAME` | string (env) | nome de cookie | `sg_{{project_slug}}_access_token` (slug substituído pelo CLI) | Não | Nome do cookie do access token usado pela sessão; `trim()`, vazio cai no padrão | `getBillingPlatformServer → createSecurityServer({ cookies.token })` | deve coincidir com o do fe-security (mesma sessão) | runtime server | `scaffold/src/modules/billing-platform/server.ts.hbs → ACCESS_COOKIE_NAME` |
|
|
103
|
+
| `SEEDGRID_SECURITY_REFRESH_COOKIE_NAME` | string (env) | nome de cookie | `sg_{{project_slug}}_refresh_token` | Não | Nome do cookie do refresh token | idem `cookies.refresh` | idem | runtime server | `... → REFRESH_COOKIE_NAME` |
|
|
104
|
+
| `billingPlatformConfig.pagination.defaultPageSize` | number | inteiro | `10` | Não | Página inicial | telas | — | runtime client | `scaffold/src/modules/billing-platform/config.ts → billingPlatformConfig` |
|
|
105
|
+
| `billingPlatformConfig.pagination.pageSizeOptions` | number[] | inteiros | `[10, 20, 50]` | Não | Opções do paginador | telas | — | runtime client | idem |
|
|
106
|
+
| `billingPlatformConfig.routes.*` | string / função | rotas | `plans=/platform/plans`, `newPlan=/platform/plans/new`, `trial=/platform/plans/trial`, `plan(id)=/platform/plans/{id}` | Não | Rotas das telas e do menu | menu e navegação | — | runtime client | idem |
|
|
107
|
+
|
|
108
|
+
O cookie `passwordChangeRequired` é fixo (`sg_{{project_slug}}_password_change_required`, sem env). A base da API vem de `resolvePublicApiBaseUrl` (`@/modules/security/server/public-api-base-url`, scaffold do [[SeedGrid/SeedGrid-components/modulos/fe-security|fe-security]]).
|
|
109
|
+
|
|
110
|
+
## Exemplo (fonte: README)
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
import { createSecurityServer } from "@seedgrid/fe-security/server";
|
|
114
|
+
import { createBillingPlatformServer } from "@seedgrid/fe-billing-platform/server";
|
|
115
|
+
const billingPlatform = createBillingPlatformServer(createSecurityServer({ /* ... */ }));
|
|
116
|
+
const planos = await billingPlatform.listPlans();
|
|
117
|
+
await billingPlatform.publishTerm(planId, termId);
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Exemplo real de composição: `scaffold/src/modules/billing-platform/server.ts.hbs`. Sem consumidor em `apps/showcase`.
|
|
121
|
+
|
|
122
|
+
## Testes (não executados)
|
|
123
|
+
|
|
124
|
+
`tests/module-manifest.test.mjs` — `id`, `requires`, `configKey`.
|
|
125
|
+
|
|
126
|
+
## Limitações
|
|
127
|
+
|
|
128
|
+
- `updateTrial` usa `POST /admin/plans/trial`; na extension billing o path é declarado como `@PATCH`.
|
|
129
|
+
- O backend da extension exige `PLAN_TERM_READ/CREATE/UPDATE/DELETE/PUBLISH/ARCHIVE` para terms e trial; o front só verifica `PLAN_*`.
|
|
130
|
+
- Sem UI para editar term agendado (PATCH).
|
|
131
|
+
- Moeda fixa BRL; traduções `es`/`fr`/`pt-PT` são fallback.
|
|
132
|
+
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, front, modulo, fe-billing-user]
|
|
3
|
+
fonte: front/seedgrid-fe-components/packages/modules/seedgrid-fe-billing-user
|
|
4
|
+
branch: main
|
|
5
|
+
commit: ad30fc11de
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# @seedgrid/fe-billing-user
|
|
10
|
+
|
|
11
|
+
Módulo front de **billing do assinante**: assinatura corrente, uso do ciclo, checkout (1ª assinatura), troca de plano com prévia de rateio, cancelar/reativar, customer portal e faturas. A visão de backoffice é o [[SeedGrid/SeedGrid-components/modulos/fe-billing-platform|fe-billing-platform]]. Compõe sobre o [[SeedGrid/SeedGrid-components/modulos/fe-security|fe-security]]. Parte dos [[SeedGrid/SeedGrid-components/modulos/Visao-geral|Módulos front]].
|
|
12
|
+
|
|
13
|
+
Backend: [[SeedGrid/Extensions/billing/Visao-geral|extension billing]]. Na extension billing, `MeBillingController`, `SubscriptionController`, `PlanCatalogController` e `UsageController` expõem os mesmos `/me/*`, **exceto** os de uso (ver Limitações).
|
|
14
|
+
|
|
15
|
+
## Pacote
|
|
16
|
+
|
|
17
|
+
| Item | Valor |
|
|
18
|
+
|---|---|
|
|
19
|
+
| Nome npm / versão | `@seedgrid/fe-billing-user` `2026.7.0` |
|
|
20
|
+
| peerDependencies | `@seedgrid/fe-core: *`, `@seedgrid/fe-security: *` |
|
|
21
|
+
| `files` | `dist`, `scaffold` |
|
|
22
|
+
| Build | `tsc -p tsconfig.json` + `postbuild` `emit-module-manifest.mjs` |
|
|
23
|
+
| `exports` | `.` → `./dist/index.{d.ts,js}`; `./server` → `./dist/server/index.{d.ts,js}` |
|
|
24
|
+
|
|
25
|
+
Dependência de módulo: **requer `security`**.
|
|
26
|
+
|
|
27
|
+
## Exports públicos
|
|
28
|
+
|
|
29
|
+
| Export | Tipo | Subpath | Descrição | Fonte |
|
|
30
|
+
|---|---|---|---|---|
|
|
31
|
+
| `BillingUserPaths` | const | `.` | 13 paths `/me/*` | `front/seedgrid-fe-components/packages/modules/seedgrid-fe-billing-user/src/paths.ts → BillingUserPaths` |
|
|
32
|
+
| `SubscriptionCycle`, `SubscriptionPlanRef`, `SubscriptionPlanTerm`, `SubscriptionPendingChange`, `SubscriptionResponse` | interfaces | `.` | Assinatura corrente (`pendingChange`, `cancelAtPeriodEnd`…) | `.../src/billing.ts` |
|
|
33
|
+
| `UsageAlert`, `UsageSummaryResponse`, `UsageStatementEntry`, `UsageStatementResponse` | interfaces | `.` | Resumo e extrato de uso | `.../src/billing.ts` |
|
|
34
|
+
| `PlanCatalogItem`, `PlansPendingChange`, `PlansCatalogResponse` | interfaces | `.` | Catálogo assinável (`checkoutEnabled`, `current`, `pendingDowngrade`) | `.../src/billing.ts` |
|
|
35
|
+
| `CheckoutRequest`, `CheckoutSessionResponse` | interfaces | `.` | `{ planId }` → `checkoutUrl` | `.../src/billing.ts` |
|
|
36
|
+
| `PortalSessionResponse` | interface | `.` | `portalUrl` (request sem corpo) | `.../src/billing.ts` |
|
|
37
|
+
| `ChangePlanRequest`, `ChangePlanResponse` | interfaces | `.` | `PLAN_CHANGED` / `DOWNGRADE_SCHEDULED` | `.../src/billing.ts` |
|
|
38
|
+
| `CancelScheduledChangeResponse`, `CancelSubscriptionResponse`, `ReactivateSubscriptionResponse` | interfaces | `.` | Status literais | `.../src/billing.ts` |
|
|
39
|
+
| `ChangePreviewResponse` | interface | `.` | Prévia de rateio | `.../src/billing.ts` |
|
|
40
|
+
| `UpcomingInvoiceLine`, `UpcomingInvoiceResponse` | interfaces | `.` | Próxima fatura | `.../src/billing.ts` |
|
|
41
|
+
| `BillingInvoiceEnvelope` | interface | `.` | `{ invoices: Record<string, unknown>[] }` (item cru do provedor) | `.../src/billing.ts` |
|
|
42
|
+
| `billingUserMessages` | const | `.` | i18n `en`/`pt-BR` completos; `es`/`fr` = `en`; `pt-PT` = `pt-BR` | `.../src/messages.ts → billingUserMessages` |
|
|
43
|
+
| `createBillingUserServer` | função | `./server` | `(session) => BillingUserServer` | `.../src/server/create-billing-user-server.ts → createBillingUserServer` |
|
|
44
|
+
| `BillingUserServer` | interface | `./server` | 13 métodos | idem `→ BillingUserServer` |
|
|
45
|
+
|
|
46
|
+
Contagem: `.` = 26 (1 const de paths + 24 tipos + `billingUserMessages`); `./server` = 2.
|
|
47
|
+
|
|
48
|
+
## Registro no @seedgrid/fe-core (manifesto do CLI)
|
|
49
|
+
|
|
50
|
+
`SeedGridCliModuleManifest` ([[SeedGrid/SeedGrid-components/pacotes/fe-core|@seedgrid/fe-core]]): `id: "billing-user"`, `configKey: "billing-user"`, `requires: ["security"]`, `navigation: useBillingUserAppShellSections` (`@/modules/billing-user`), `messages: billingUserMessages` (`@seedgrid/fe-billing-user`). Sem `variantGroup`/`provider` (o teste verifica).
|
|
51
|
+
|
|
52
|
+
Menu: seção `billing` (order 30) → `billing-user` → `billing-overview` (`/billing`), `billing-plans` (`/billing/plans`), `billing-invoices` (`/billing/invoices`); gated por `BILLING_READ`.
|
|
53
|
+
|
|
54
|
+
## Páginas (scaffold) e permissões
|
|
55
|
+
|
|
56
|
+
| Rota | Arquivo | Permissão |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| `/billing` | `scaffold/src/app/billing/page.tsx` | `BILLING_READ` |
|
|
59
|
+
| `/billing/plans` | `scaffold/src/app/billing/plans/page.tsx` | `BILLING_READ` |
|
|
60
|
+
| `/billing/invoices` | `scaffold/src/app/billing/invoices/page.tsx` | `BILLING_READ` |
|
|
61
|
+
|
|
62
|
+
Route Handlers em `scaffold/src/app/api/billing/`: `GET me` (combina assinatura + resumo de uso), `GET plans`, `POST checkout`, `POST portal`, `POST change-plan`, `GET change-preview?planId=`, `POST cancel`, `POST cancel-scheduled-change`, `POST reactivate`, `GET invoices?limit=`, `GET upcoming`. Bootstrap: `scaffold/src/modules/billing-user/server.ts.hbs → getBillingUserServer`.
|
|
63
|
+
|
|
64
|
+
## APIs backend chamadas (`createBillingUserServer`)
|
|
65
|
+
|
|
66
|
+
| Método | Path | Função |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| GET | `/me/subscription` | `getSubscription` |
|
|
69
|
+
| GET | `/me/plans` | `listPlans` |
|
|
70
|
+
| GET | `/me/usage/summary` | `getUsageSummary` |
|
|
71
|
+
| GET | `/me/usage/statement` | `getUsageStatement` (sem UI; requer `STATEMENT_READ` segundo comentário) |
|
|
72
|
+
| POST | `/me/billing/checkout` | `createCheckout` |
|
|
73
|
+
| POST | `/me/billing/portal` | `openPortal` |
|
|
74
|
+
| POST | `/me/billing/change-plan` | `changePlan` |
|
|
75
|
+
| POST | `/me/billing/cancel-scheduled-change` | `cancelScheduledChange` |
|
|
76
|
+
| POST | `/me/billing/cancel` | `cancelSubscription` |
|
|
77
|
+
| POST | `/me/billing/reactivate` | `reactivateSubscription` |
|
|
78
|
+
| GET | `/me/billing/invoices?limit=` | `listInvoices` |
|
|
79
|
+
| GET | `/me/billing/upcoming` | `getUpcomingInvoice` |
|
|
80
|
+
| GET | `/me/billing/change-preview?planId=` | `getChangePreview` |
|
|
81
|
+
|
|
82
|
+
13 endpoints. Na extension, esses controllers são `@Authenticated` (sem `@PermissionsAllowed`) — **Confirmado**.
|
|
83
|
+
|
|
84
|
+
## Separação client/server
|
|
85
|
+
|
|
86
|
+
Lib `.` client-safe; `./server` SERVER-ONLY. Telas client chamam apenas `/api/billing/*`.
|
|
87
|
+
|
|
88
|
+
## Configuração
|
|
89
|
+
|
|
90
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
|
|
91
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
92
|
+
| `SEEDGRID_SECURITY_ACCESS_COOKIE_NAME` | string (env) | nome de cookie | `sg_{{project_slug}}_access_token` | Não | Cookie do access token da sessão; vazio cai no padrão | `getBillingUserServer → createSecurityServer` | igual ao fe-security | runtime server | `scaffold/src/modules/billing-user/server.ts.hbs → ACCESS_COOKIE_NAME` |
|
|
93
|
+
| `SEEDGRID_SECURITY_REFRESH_COOKIE_NAME` | string (env) | nome de cookie | `sg_{{project_slug}}_refresh_token` | Não | Cookie do refresh token | idem | idem | runtime server | `... → REFRESH_COOKIE_NAME` |
|
|
94
|
+
| `billingUserConfig.routes.overview` / `.plans` / `.invoices` | string | rotas | `/billing`, `/billing/plans`, `/billing/invoices` | Não | Rotas do menu | `useBillingUserAppShellSections` | — | runtime client | `scaffold/src/modules/billing-user/config.ts → billingUserConfig` |
|
|
95
|
+
|
|
96
|
+
URLs de sucesso/cancelamento do checkout e retorno do portal são resolvidas **no backend** (`seedgrid.report.billing.checkout.{success,cancel}-url`, `seedgrid.report.billing.portal.return-url`, segundo comentários de `src/billing.ts`) — **Não confirmado** na extension.
|
|
97
|
+
|
|
98
|
+
## Exemplo (fonte: README)
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
import { createBillingUserServer } from "@seedgrid/fe-billing-user/server";
|
|
102
|
+
const billing = createBillingUserServer(session);
|
|
103
|
+
const assinatura = await billing.getSubscription();
|
|
104
|
+
const preview = await billing.getChangePreview("plan-pro");
|
|
105
|
+
await billing.changePlan({ planId: "plan-pro" });
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Sem consumidor em `apps/showcase`.
|
|
109
|
+
|
|
110
|
+
## Testes (não executados)
|
|
111
|
+
|
|
112
|
+
`tests/module-manifest.test.mjs` — `id`, `requires`, `configKey`, `variantGroup`/`provider` ausentes, `navigation`, `messages`.
|
|
113
|
+
|
|
114
|
+
## Limitações
|
|
115
|
+
|
|
116
|
+
- A extension billing expõe apenas `GET /me/usage`; `getUsageSummary` e `getUsageStatement` (`/me/usage/summary`, `/me/usage/statement`) retornariam 404 contra ela.
|
|
117
|
+
- A extension tem endpoints sem contrato no front: `GET /me/billing/checkout/preview`, `GET|POST /me/billing/downgrade-user-selection`, `POST /me/billing/trial-ended`.
|
|
118
|
+
- O item de fatura é cru do provedor; a tela lê campos estilo Stripe defensivamente.
|
|
119
|
+
- `getUsageStatement` não tem tela; traduções `es`/`fr`/`pt-PT` em fallback.
|
|
120
|
+
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, front, modulo, fe-login-tenancy]
|
|
3
|
+
fonte: front/seedgrid-fe-components/packages/modules/seedgrid-fe-login-tenancy
|
|
4
|
+
branch: main
|
|
5
|
+
commit: ad30fc11de
|
|
6
|
+
analisado-em: 2026-10-14
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# @seedgrid/fe-login-tenancy
|
|
10
|
+
|
|
11
|
+
Módulo front de **multiempresa por login**: URL única, o usuário escolhe a empresa após o login e o backend re-emite o par de tokens escopado; inclui o signup institucional de empresa (CNPJ) com fluxo de **vinculação** quando o e-mail já existe. Variante exclusiva com [[SeedGrid/SeedGrid-components/modulos/fe-subdomain-tenancy|fe-subdomain-tenancy]] (`variantGroup: "tenancy"`). Compõe sobre o [[SeedGrid/SeedGrid-components/modulos/fe-security|fe-security]]. Parte dos [[SeedGrid/SeedGrid-components/modulos/Visao-geral|Módulos front]].
|
|
12
|
+
|
|
13
|
+
Backend: [[SeedGrid/Extensions/login-tenancy/Visao-geral|extension login-tenancy]] (signup público, `RestControllerPath` em `java/seedgrid-quarkus-ext-login-tenancy/runtime/src/main/java/br/com/seedgrid/logintenancy/controllers/`) e [[SeedGrid/Extensions/security/Visao-geral|extension security]] (`/me/companies`, `/me/select-company` em `AccountUserController`) — **Confirmado** por leitura dos `RestControllerPath`.
|
|
14
|
+
|
|
15
|
+
## Pacote
|
|
16
|
+
|
|
17
|
+
| Item | Valor |
|
|
18
|
+
|---|---|
|
|
19
|
+
| Nome npm / versão | `@seedgrid/fe-login-tenancy` `2026.7.0` |
|
|
20
|
+
| peerDependencies | `@seedgrid/fe-components: *` (opcional), `@seedgrid/fe-core: *`, `@seedgrid/fe-security: *`, `react: ^18.2.0 \|\| ^19.0.0` |
|
|
21
|
+
| devDependencies | workspace `fe-components`, `fe-core`, `fe-security`; `react 19.0.0`; `@types/react ^19` |
|
|
22
|
+
| `files` | `dist`, `scaffold` |
|
|
23
|
+
| Build | `tsc -p tsconfig.json` + `postbuild` `emit-module-manifest.mjs` |
|
|
24
|
+
|
|
25
|
+
`exports`: `.` → `./dist/index.{d.ts,js}`; `./client` → `./dist/client/index.{d.ts,js}`; `./server` → `./dist/server/index.{d.ts,js}`.
|
|
26
|
+
|
|
27
|
+
Dependência de módulo: **requer `security`** (usa `SecurityPaths.me`, `isLoginSuccess`, `SecurityLoginResponse`, `SecurityServer`, `applySessionCookies`).
|
|
28
|
+
|
|
29
|
+
## Exports públicos
|
|
30
|
+
|
|
31
|
+
| Export | Tipo | Subpath | Descrição | Fonte |
|
|
32
|
+
|---|---|---|---|---|
|
|
33
|
+
| `MyCompany` | interface | `.` | Empresa do usuário (`publicId`, `tradeName`, `corporateName`, `isRoot`) | `front/seedgrid-fe-components/packages/modules/seedgrid-fe-login-tenancy/src/company.ts → MyCompany` |
|
|
34
|
+
| `SelectCompanyResult` | interface | `.` | `{ kind; message? }` (`"signed_in"` = sucesso) | `.../src/company.ts → SelectCompanyResult` |
|
|
35
|
+
| `companyLabel` | função | `.` | `tradeName → corporateName → publicId` | `.../src/company.ts → companyLabel` |
|
|
36
|
+
| `SignupRequestStatus` | type | `.` | `string` | `.../src/signup.ts` |
|
|
37
|
+
| `SignupAddress`, `SignupLegalRepresentative`, `InstitutionalSignupRequest`, `SignupResponse`, `EmailExistsResponse`, `ConfirmSignupRequest`, `ConfirmSignupResponse`, `ResendSignupEmailRequest` | interfaces | `.` | DTOs do signup institucional (`plainRootPassword?` opcional por causa da vinculação) | `.../src/signup.ts` |
|
|
38
|
+
| `LoginTenancyPaths` | const | `.` | `signup`, `signupEmailExists(email)`, `signupConfirmEmail`, `signupResendEmail` | `.../src/paths.ts → LoginTenancyPaths` |
|
|
39
|
+
| `loginTenancyMessages` | const | `.` | i18n `en`/`pt-BR`; `es`/`fr` = `en`; `pt-PT` = `pt-BR` | `.../src/messages.ts → loginTenancyMessages` |
|
|
40
|
+
| `CompanyScopePicker` | componente React | `./client` | Seletor de empresa desacoplado do transporte (props `listCompanies`, `selectCompany`, `onSignedIn`, `onCancel?`, textos, `readError?`); usa `SgCombobox`/`SgButton` | `.../src/client/company-scope-picker.tsx → CompanyScopePicker` |
|
|
41
|
+
| `CompanyScopePickerProps` | interface | `./client` | Props do picker | idem |
|
|
42
|
+
| `createLoginTenancyServer` | função | `./server` | `(session) => LoginTenancyServer` | `.../src/server/create-login-tenancy.ts → createLoginTenancyServer` |
|
|
43
|
+
| `LoginTenancyServer` | interface | `./server` | métodos do servidor (endpoints na seção de APIs backend) | idem |
|
|
44
|
+
| `SelectCompanyOutcome` | interface | `./server` | `{ signedIn; response }` | idem |
|
|
45
|
+
|
|
46
|
+
Contagem: `.` = 15; `./client` = 2; `./server` = 3.
|
|
47
|
+
|
|
48
|
+
## Registro no @seedgrid/fe-core (manifesto do CLI)
|
|
49
|
+
|
|
50
|
+
`SeedGridCliModuleManifest` ([[SeedGrid/SeedGrid-components/pacotes/fe-core|@seedgrid/fe-core]]):
|
|
51
|
+
|
|
52
|
+
| Campo | Valor |
|
|
53
|
+
|---|---|
|
|
54
|
+
| `id` / `configKey` | `login-tenancy` |
|
|
55
|
+
| `requires` | `["security"]` |
|
|
56
|
+
| `variantGroup` | `tenancy` |
|
|
57
|
+
| `messages` | `loginTenancyMessages` de `@seedgrid/fe-login-tenancy` |
|
|
58
|
+
| `postAuthResolver` | `resolveLoginTenancyPostAuthPath` de `@/modules/login-tenancy` |
|
|
59
|
+
|
|
60
|
+
`postAuthResolver` é inserido pelo CLI no registry `resolvePostAuthPath` do `navigation.ts` do fe-security; o resolver (`scaffold/src/modules/login-tenancy/post-auth.ts`) faz `GET /api/login-tenancy/companies` e devolve `/auth/select-company` quando há mais de uma empresa (falha → `null`, cai no dashboard). **Confirmado** no código do módulo; o lado do fe-security não foi verificado aqui.
|
|
61
|
+
|
|
62
|
+
## Páginas (scaffold)
|
|
63
|
+
|
|
64
|
+
| Rota | Arquivo | Acesso |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| `/signup` | `scaffold/src/app/(public)/signup/page.tsx` | público; wizard CNPJ/ViaCEP/UF; checa e-mail existente e ativa vinculação |
|
|
67
|
+
| `/auth/select-company` | `scaffold/src/app/auth/select-company/page.tsx` | pós-login; envolve `CompanyScopePicker`; sucesso → `/`, cancelar → `/auth/login` |
|
|
68
|
+
|
|
69
|
+
Route Handlers em `scaffold/src/app/api/login-tenancy/`: `GET companies`, `POST select-company` (exige `companyPublicId`, 400 se ausente), `POST signup`, `GET signup/email-exists?email=`, `POST signup/confirm-email`, `POST signup/resend-email`. Nenhuma permissão (`RouteGuard`) é usada.
|
|
70
|
+
|
|
71
|
+
## APIs backend chamadas (`createLoginTenancyServer`)
|
|
72
|
+
|
|
73
|
+
| Método | Path | Função |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| GET | `/me/companies` | `listMyCompanies` |
|
|
76
|
+
| POST | `/me/select-company` (body `{ companyPublicId }`) | `selectCompany` (em sucesso persiste cookies via `session.applySessionCookies`) |
|
|
77
|
+
| POST | `/public/signup` | `signup` |
|
|
78
|
+
| GET | `/public/signup/email-exists?email=` | `emailExists` |
|
|
79
|
+
| POST | `/public/signup/confirm-email` | `confirmSignup` |
|
|
80
|
+
| POST | `/public/signup/resend-email` | `resendSignupEmail` |
|
|
81
|
+
|
|
82
|
+
6 endpoints.
|
|
83
|
+
|
|
84
|
+
## Separação client/server
|
|
85
|
+
|
|
86
|
+
`.` client-safe; `./client` React (`"use client"`, depende de `@seedgrid/fe-components`); `./server` SERVER-ONLY. O `server.ts.hbs` do scaffold é `"use server"` e não é reexportado pelo barrel client do scaffold.
|
|
87
|
+
|
|
88
|
+
## Configuração
|
|
89
|
+
|
|
90
|
+
| Propriedade | Tipo | Valores aceitos | Padrão | Obrigatória | Comportamento | Uso | Relações | Fase | Origem |
|
|
91
|
+
|---|---|---|---|---|---|---|---|---|---|
|
|
92
|
+
| `SEEDGRID_SECURITY_ACCESS_COOKIE_NAME` | string (env) | nome de cookie | `sg_{{project_slug}}_access_token` | Não | Cookie do access token; vazio cai no padrão | `getLoginTenancyServer → createSecurityServer` | deve coincidir com o fe-security; `selectCompany` regrava esse cookie | runtime server | `scaffold/src/modules/login-tenancy/server.ts.hbs → ACCESS_COOKIE_NAME` |
|
|
93
|
+
| `SEEDGRID_SECURITY_REFRESH_COOKIE_NAME` | string (env) | nome de cookie | `sg_{{project_slug}}_refresh_token` | Não | Cookie do refresh token | idem | idem | runtime server | `... → REFRESH_COOKIE_NAME` |
|
|
94
|
+
|
|
95
|
+
Props de texto do `CompanyScopePicker` têm padrões em pt-BR (`description`, `companyFieldLabel = "Empresa"`, `confirmLabel = "Entrar"`, `cancelLabel = "Voltar ao login"`).
|
|
96
|
+
|
|
97
|
+
## Exemplos
|
|
98
|
+
|
|
99
|
+
Fonte: README.
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
import { createLoginTenancyServer } from "@seedgrid/fe-login-tenancy/server";
|
|
103
|
+
const loginTenancy = createLoginTenancyServer(session);
|
|
104
|
+
const empresas = await loginTenancy.listMyCompanies();
|
|
105
|
+
await loginTenancy.selectCompany(empresas[0].publicId);
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Uso real do picker: `scaffold/src/app/auth/select-company/page.tsx`. Sem consumidor em `apps/showcase`.
|
|
109
|
+
|
|
110
|
+
## Testes (não executados)
|
|
111
|
+
|
|
112
|
+
`tests/module-manifest.test.mjs` — `id`, `requires`, `variantGroup`, `configKey`.
|
|
113
|
+
|
|
114
|
+
## Limitações
|
|
115
|
+
|
|
116
|
+
- `POST /api/login-tenancy/select-company` exige `companyPublicId` no corpo (enviar `{ publicId }` responde 400).
|
|
117
|
+
- A tela `/signup` consulta `/api/locations/states` e `/api/locations/cities`, que só existem no scaffold do `fe-subdomain-tenancy` (mutuamente exclusivo); sem eles os combos de UF/cidade ficam vazios.
|
|
118
|
+
- A extension tem `GET /public/signup/cnpj-status` sem contrato no front.
|
|
119
|
+
|