@polymorphism-tech/morph-spec 4.6.0 → 4.7.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/README.md +394 -700
- package/docs/ARCHITECTURE.md +331 -0
- package/docs/CHEATSHEET.md +221 -0
- package/docs/COMMAND-FLOWS.md +368 -0
- package/docs/QUICKSTART.md +212 -0
- package/docs/examples/order-management/contracts.cs +84 -0
- package/docs/examples/order-management/proposal.md +24 -0
- package/docs/examples/order-management/spec.md +162 -0
- package/docs/plans/2026-02-23-ddd-architecture-refactor.md +1153 -0
- package/docs/plans/2026-02-23-ddd-nextsteps.md +682 -0
- package/docs/plans/2026-02-23-infra-architect-refactor.md +437 -0
- package/docs/plans/2026-02-23-nextjs-code-review-design.md +156 -0
- package/docs/plans/2026-02-23-nextjs-code-review-impl.md +1254 -0
- package/docs/plans/2026-02-23-nextjs-standards-design.md +149 -0
- package/docs/plans/2026-02-23-nextjs-standards-impl.md +1846 -0
- package/framework/agents/README.md +14 -14
- package/framework/agents/architecture/standards-architect.md +159 -159
- package/framework/agents/frontend/nextjs-expert.md +87 -127
- package/framework/agents/infrastructure/azure-architect.md +147 -147
- package/framework/agents/infrastructure/infra-architect.md +45 -0
- package/framework/agents.json +1145 -278
- package/framework/rules/frontend-standards.md +0 -3
- package/framework/rules/nextjs-standards.md +17 -0
- package/framework/skills/level-0-meta/code-review-nextjs/SKILL.md +147 -0
- package/framework/skills/level-0-meta/code-review-nextjs/references/review-example-nextjs.md +254 -0
- package/framework/skills/level-0-meta/tool-usage-guide/SKILL.md +3 -3
- package/framework/skills/level-1-workflows/phase-design/SKILL.md +45 -9
- package/framework/skills/level-1-workflows/phase-tasks/SKILL.md +38 -0
- package/framework/standards/STANDARDS.json +121 -0
- package/framework/standards/architecture/ddd/bounded-contexts.md +105 -0
- package/framework/standards/architecture/ddd/complexity-levels.md +108 -0
- package/framework/standards/architecture/ddd/ubiquitous-language.md +58 -0
- package/framework/standards/frontend/nextjs/app-router.md +123 -0
- package/framework/standards/frontend/nextjs/components.md +132 -0
- package/framework/standards/frontend/nextjs/data-fetching.md +126 -0
- package/framework/standards/frontend/nextjs/forms.md +128 -0
- package/framework/standards/frontend/nextjs/naming-conventions.md +67 -0
- package/framework/standards/frontend/nextjs/project-structure.md +102 -0
- package/framework/standards/frontend/nextjs/state-management.md +72 -0
- package/framework/standards/frontend/nextjs/testing.md +111 -0
- package/framework/templates/REGISTRY.json +538 -142
- package/framework/templates/code/dotnet/contracts/contracts-level1.cs +69 -0
- package/framework/templates/code/dotnet/contracts/contracts-level2.cs +86 -0
- package/framework/templates/code/dotnet/contracts/contracts-level3.cs +41 -0
- package/framework/templates/docs/spec.md +49 -0
- package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -0
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -0
- package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -0
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -0
- package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -0
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -0
- package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -0
- package/framework/templates/project-structure/dotnet-ddd.md +70 -0
- package/framework/workflows/docs/enforcement-pipeline.md +2 -1
- package/package.json +1 -1
- package/scripts/scan-nextjs.mjs +169 -0
- package/src/commands/project/doctor.js +52 -1
- package/src/commands/project/init.js +15 -1
- package/src/commands/project/update.js +6 -1
- package/src/lib/standards/standards-context-injector.js +5 -0
- package/src/lib/validators/nextjs/index.js +6 -0
- package/src/lib/validators/nextjs/next-component-validator.js +181 -0
- package/src/lib/validators/validation-runner.js +5 -0
- package/src/utils/agents-installer.js +14 -2
- package/.morph/.morphversion +0 -5
- package/.morph/analytics/threads-log.jsonl +0 -6
- package/.morph/config/config.json +0 -8
- package/.morph/framework/agents.json +0 -948
- package/.morph/framework/standards/STANDARDS.json +0 -812
- package/.morph/framework/standards/ai-agents/blazor-ui.md +0 -364
- package/.morph/framework/standards/ai-agents/production.md +0 -415
- package/.morph/framework/standards/ai-agents/setup.md +0 -418
- package/.morph/framework/standards/ai-agents/team-orchestration.md +0 -479
- package/.morph/framework/standards/ai-agents/workflows.md +0 -354
- package/.morph/framework/standards/architecture/ddd/aggregates.md +0 -120
- package/.morph/framework/standards/architecture/ddd/entities.md +0 -99
- package/.morph/framework/standards/architecture/ddd/value-objects.md +0 -124
- package/.morph/framework/standards/backend/api/minimal-api.md +0 -494
- package/.morph/framework/standards/backend/api/rest.md +0 -492
- package/.morph/framework/standards/backend/api/validation.md +0 -88
- package/.morph/framework/standards/backend/authentication/passkeys.md +0 -428
- package/.morph/framework/standards/backend/database/ef-core.md +0 -199
- package/.morph/framework/standards/backend/database/migrations.md +0 -393
- package/.morph/framework/standards/backend/database/postgresql/database.md +0 -352
- package/.morph/framework/standards/backend/database/repository-patterns.md +0 -528
- package/.morph/framework/standards/backend/database/vector-search-rag.md +0 -541
- package/.morph/framework/standards/backend/dotnet/async.md +0 -366
- package/.morph/framework/standards/backend/dotnet/core.md +0 -117
- package/.morph/framework/standards/backend/dotnet/di.md +0 -439
- package/.morph/framework/standards/backend/dotnet/program-cs-checklist.md +0 -92
- package/.morph/framework/standards/backend/integrations/asaas/asaas-api.md +0 -216
- package/.morph/framework/standards/backend/integrations/clerk/clerk-auth.md +0 -290
- package/.morph/framework/standards/backend/integrations/hangfire/hangfire-jobs.md +0 -350
- package/.morph/framework/standards/backend/integrations/resend/resend-email.md +0 -385
- package/.morph/framework/standards/context/analytics.md +0 -96
- package/.morph/framework/standards/context/bundles.md +0 -110
- package/.morph/framework/standards/context/priming.md +0 -78
- package/.morph/framework/standards/core/architecture.md +0 -185
- package/.morph/framework/standards/core/coding.md +0 -214
- package/.morph/framework/standards/core/git-branching-strategy.md +0 -403
- package/.morph/framework/standards/core/git.md +0 -185
- package/.morph/framework/standards/core/testing.md +0 -295
- package/.morph/framework/standards/data/nosql/blob-storage.md +0 -102
- package/.morph/framework/standards/data/nosql/cache/redis.md +0 -97
- package/.morph/framework/standards/data/nosql/cosmos-db.md +0 -118
- package/.morph/framework/standards/data/vector-search/azure-ai-search.md +0 -121
- package/.morph/framework/standards/data/vector-search/rag-chunking.md +0 -104
- package/.morph/framework/standards/frontend/blazor/design-checklist.md +0 -222
- package/.morph/framework/standards/frontend/blazor/fluent-ui-setup.md +0 -595
- package/.morph/framework/standards/frontend/blazor/fluent-ui.md +0 -137
- package/.morph/framework/standards/frontend/blazor/html-conversion.md +0 -184
- package/.morph/framework/standards/frontend/blazor/lifecycle.md +0 -195
- package/.morph/framework/standards/frontend/blazor/pitfalls.md +0 -198
- package/.morph/framework/standards/frontend/blazor/state.md +0 -191
- package/.morph/framework/standards/frontend/design-system/animations.md +0 -151
- package/.morph/framework/standards/frontend/design-system/naming.md +0 -64
- package/.morph/framework/standards/frontend/nextjs/nextjs-patterns.md +0 -215
- package/.morph/framework/standards/infrastructure/azure/azure.md +0 -624
- package/.morph/framework/standards/infrastructure/azure/bicep/bicep-patterns.md +0 -422
- package/.morph/framework/standards/infrastructure/azure/devops/azure-devops-setup.md +0 -516
- package/.morph/framework/standards/infrastructure/azure/devops/local-development.md +0 -520
- package/.morph/framework/standards/infrastructure/azure/services/functions.md +0 -486
- package/.morph/framework/standards/infrastructure/azure/services/service-bus.md +0 -459
- package/.morph/framework/standards/infrastructure/azure/services/storage.md +0 -407
- package/.morph/framework/standards/infrastructure/docker/easypanel-deploy.md +0 -196
- package/.morph/framework/standards/infrastructure/supabase/mcp-setup.md +0 -252
- package/.morph/framework/standards/infrastructure/supabase/supabase-auth.md +0 -176
- package/.morph/framework/standards/infrastructure/supabase/supabase-pgvector.md +0 -169
- package/.morph/framework/standards/infrastructure/supabase/supabase-rls.md +0 -184
- package/.morph/framework/standards/infrastructure/supabase/supabase-storage.md +0 -153
- package/.morph/framework/standards/integration/api/graphql.md +0 -91
- package/.morph/framework/standards/integration/api/grpc.md +0 -114
- package/.morph/framework/standards/integration/api/rest-design.md +0 -95
- package/.morph/framework/standards/integration/event-driven/cqrs.md +0 -101
- package/.morph/framework/standards/integration/event-driven/event-sourcing.md +0 -124
- package/.morph/framework/standards/integration/event-driven/service-bus.md +0 -95
- package/.morph/framework/standards/integration/mcp/mcp-tools.md +0 -384
- package/.morph/framework/standards/observability/logging.md +0 -131
- package/.morph/framework/standards/observability/metrics.md +0 -121
- package/.morph/framework/standards/observability/monitoring.md +0 -114
- package/.morph/framework/standards/observability/tracing.md +0 -132
- package/.morph/framework/standards/workflows/parallel-execution.md +0 -112
- package/.morph/framework/standards/workflows/thread-management.md +0 -113
- package/.morph/framework/templates/.idea/morph-templates.xml +0 -92
- package/.morph/framework/templates/.vscode/morph-templates.code-snippets +0 -186
- package/.morph/framework/templates/IDE-SNIPPETS.md +0 -266
- package/.morph/framework/templates/README.md +0 -814
- package/.morph/framework/templates/REGISTRY.json +0 -1492
- package/.morph/framework/templates/code/dotnet/backend/repository.cs +0 -141
- package/.morph/framework/templates/code/dotnet/backend/service.cs +0 -139
- package/.morph/framework/templates/code/dotnet/contracts/Commands.cs +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/Entities.cs +0 -25
- package/.morph/framework/templates/code/dotnet/contracts/Queries.cs +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/README.md +0 -74
- package/.morph/framework/templates/code/dotnet/contracts/api-contracts.cs +0 -173
- package/.morph/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
- package/.morph/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
- package/.morph/framework/templates/code/dotnet/database/migration.cs +0 -83
- package/.morph/framework/templates/code/dotnet/frontend/component.razor +0 -239
- package/.morph/framework/templates/code/dotnet/jobs/agent.cs +0 -163
- package/.morph/framework/templates/code/dotnet/jobs/job.cs +0 -171
- package/.morph/framework/templates/code/dotnet/test.cs +0 -239
- package/.morph/framework/templates/code/sql/rls-policy.sql +0 -57
- package/.morph/framework/templates/code/sql/supabase-migration.sql +0 -100
- package/.morph/framework/templates/code/sql/supabase-migration.template.sql +0 -113
- package/.morph/framework/templates/code/typescript/contracts.ts +0 -168
- package/.morph/framework/templates/context/CONTEXT-FEATURE.md +0 -276
- package/.morph/framework/templates/context/CONTEXT.md +0 -181
- package/.morph/framework/templates/docs/clarifications.md +0 -253
- package/.morph/framework/templates/docs/onboarding.md +0 -123
- package/.morph/framework/templates/docs/proposal.md +0 -182
- package/.morph/framework/templates/docs/schema-analysis.md +0 -119
- package/.morph/framework/templates/docs/spec.md +0 -149
- package/.morph/framework/templates/docs/ui-components.md +0 -124
- package/.morph/framework/templates/docs/ui-design-system.md +0 -76
- package/.morph/framework/templates/docs/ui-flows.md +0 -167
- package/.morph/framework/templates/docs/ui-mockups.md +0 -98
- package/.morph/framework/templates/docs/user-stories.md +0 -34
- package/.morph/framework/templates/examples/design-system-examples.md +0 -357
- package/.morph/framework/templates/examples/spec-examples.md +0 -90
- package/.morph/framework/templates/feature/decisions.md +0 -187
- package/.morph/framework/templates/feature/recap.md +0 -146
- package/.morph/framework/templates/feature/tasks.md +0 -199
- package/.morph/framework/templates/infrastructure/azure/Dockerfile.example +0 -82
- package/.morph/framework/templates/infrastructure/azure/README.md +0 -286
- package/.morph/framework/templates/infrastructure/azure/app-insights.bicep +0 -63
- package/.morph/framework/templates/infrastructure/azure/app-service.bicep +0 -164
- package/.morph/framework/templates/infrastructure/azure/container-app-env.bicep +0 -49
- package/.morph/framework/templates/infrastructure/azure/container-app.bicep +0 -156
- package/.morph/framework/templates/infrastructure/azure/deploy-checklist.md +0 -426
- package/.morph/framework/templates/infrastructure/azure/deploy.ps1 +0 -229
- package/.morph/framework/templates/infrastructure/azure/deploy.sh +0 -208
- package/.morph/framework/templates/infrastructure/azure/key-vault.bicep +0 -91
- package/.morph/framework/templates/infrastructure/azure/main.bicep +0 -189
- package/.morph/framework/templates/infrastructure/azure/parameters.dev.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/parameters.prod.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/parameters.staging.json +0 -29
- package/.morph/framework/templates/infrastructure/azure/sql-database.bicep +0 -103
- package/.morph/framework/templates/infrastructure/azure/storage.bicep +0 -106
- package/.morph/framework/templates/infrastructure/docker/Dockerfile.template +0 -58
- package/.morph/framework/templates/infrastructure/docker/docker-compose.template.yml +0 -67
- package/.morph/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +0 -38
- package/.morph/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +0 -48
- package/.morph/framework/templates/infrastructure/docker/easypanel.template.json +0 -54
- package/.morph/framework/templates/infrastructure/github/README.md +0 -593
- package/.morph/framework/templates/infrastructure/github/actions/azure-auth/action.yml.hbs +0 -22
- package/.morph/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +0 -45
- package/.morph/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +0 -27
- package/.morph/framework/templates/infrastructure/github/workflows/deploy-azure-app-service.yml.hbs +0 -61
- package/.morph/framework/templates/infrastructure/github/workflows/deploy-easypanel.yml.hbs +0 -31
- package/.morph/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +0 -59
- package/.morph/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +0 -39
- package/.morph/framework/templates/integrations/asaas-client.cs +0 -387
- package/.morph/framework/templates/integrations/asaas-webhook.cs +0 -351
- package/.morph/framework/templates/integrations/azure-identity-config.cs +0 -288
- package/.morph/framework/templates/integrations/clerk-config.cs +0 -258
- package/.morph/framework/templates/meta-prompts/fusion/fusion-agent.md +0 -76
- package/.morph/framework/templates/meta-prompts/fusion/fusion-aggregator.md +0 -100
- package/.morph/framework/templates/meta-prompts/hops/hop-retry.md +0 -78
- package/.morph/framework/templates/meta-prompts/hops/hop-validation.md +0 -97
- package/.morph/framework/templates/meta-prompts/hops/hop-wrapper.md +0 -36
- package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +0 -113
- package/.morph/framework/templates/meta-prompts/parallel-workers/parallel-worker.md +0 -80
- package/.morph/framework/templates/meta-prompts/squad-leaders/backend-squad.md +0 -90
- package/.morph/framework/templates/meta-prompts/squad-leaders/frontend-squad.md +0 -126
- package/.morph/framework/templates/meta-prompts/squad-leaders/squad-leader.md +0 -43
- package/.morph/framework/templates/meta-prompts/validators/checkpoint-validator.md +0 -107
- package/.morph/framework/templates/meta-prompts/validators/pre-commit-validator.md +0 -95
- package/.morph/framework/templates/saas/subscription.cs +0 -347
- package/.morph/framework/templates/saas/tenant.cs +0 -338
- package/.morph/framework/templates/state.template.json +0 -17
- package/.morph/framework/templates/ui/FluentDesignTheme.cs +0 -149
- package/.morph/framework/templates/ui/MudTheme.cs +0 -281
- package/.morph/framework/templates/ui/design-system.css +0 -226
- package/.morph/logs/tool-failures.log +0 -7
- package/.morph/memory/pre-compact-2026-02-23T15-43-03-521Z.json +0 -16
- package/.morph/state.json +0 -48
- package/framework/templates/code/dotnet/contracts/contracts.cs +0 -217
- package/framework/templates/code/dotnet/contracts/contracts.cs.hbs +0 -172
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
# Asaas API Integration Standard
|
|
2
|
-
|
|
3
|
-
> **Scope:** universal
|
|
4
|
-
> **Layer:** 2 (on keyword)
|
|
5
|
-
> **Keywords:** asaas, payment, brazilian, pix, boleto, billing
|
|
6
|
-
> **Load When:** asaas or brazilian payment keywords detected
|
|
7
|
-
|
|
8
|
-
Brazilian payment gateway integration for PIX, Boleto, and credit card processing.
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Overview
|
|
13
|
-
|
|
14
|
-
Asaas is a Brazilian payment service provider offering:
|
|
15
|
-
- PIX instant payments
|
|
16
|
-
- Boleto bancário
|
|
17
|
-
- Credit card processing
|
|
18
|
-
- Subscription billing
|
|
19
|
-
- Split payments
|
|
20
|
-
|
|
21
|
-
**Stack:** .NET Backend
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## Core Principles
|
|
26
|
-
|
|
27
|
-
1. **Webhook-First**: All payment state changes via webhooks
|
|
28
|
-
2. **Idempotency**: Use idempotency keys for all POST requests
|
|
29
|
-
3. **Security**: Validate webhook signatures, never store full card data
|
|
30
|
-
4. **Brazil-Specific**: Handle CPF/CNPJ validation, Brazilian tax rules
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## API Configuration
|
|
35
|
-
|
|
36
|
-
### Environment Variables
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
# .env.local
|
|
40
|
-
ASAAS_API_KEY=your_api_key_here
|
|
41
|
-
ASAAS_WEBHOOK_SECRET=your_webhook_secret
|
|
42
|
-
ASAAS_ENVIRONMENT=sandbox # or production
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### TypeScript Client Setup
|
|
46
|
-
|
|
47
|
-
```typescript
|
|
48
|
-
// lib/asaas/client.ts
|
|
49
|
-
import { createClient } from '@asaas/node-sdk';
|
|
50
|
-
|
|
51
|
-
export const asaasClient = createClient({
|
|
52
|
-
apiKey: process.env.ASAAS_API_KEY!,
|
|
53
|
-
environment: process.env.ASAAS_ENVIRONMENT as 'sandbox' | 'production'
|
|
54
|
-
});
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
## Common Operations
|
|
60
|
-
|
|
61
|
-
### Create PIX Payment
|
|
62
|
-
|
|
63
|
-
```typescript
|
|
64
|
-
// app/api/payments/pix/route.ts
|
|
65
|
-
import { asaasClient } from '@/lib/asaas/client';
|
|
66
|
-
|
|
67
|
-
export async function POST(req: Request) {
|
|
68
|
-
const { amount, customerId, description } = await req.json();
|
|
69
|
-
|
|
70
|
-
const payment = await asaasClient.payments.create({
|
|
71
|
-
customer: customerId,
|
|
72
|
-
billingType: 'PIX',
|
|
73
|
-
value: amount,
|
|
74
|
-
dueDate: new Date().toISOString().split('T')[0],
|
|
75
|
-
description,
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
return Response.json({
|
|
79
|
-
paymentId: payment.id,
|
|
80
|
-
pixCode: payment.pixTransaction.payload,
|
|
81
|
-
qrCode: payment.pixTransaction.qrCode.encodedImage
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
### Webhook Handler
|
|
87
|
-
|
|
88
|
-
```typescript
|
|
89
|
-
// app/api/webhooks/asaas/route.ts
|
|
90
|
-
import { headers } from 'next/headers';
|
|
91
|
-
import crypto from 'crypto';
|
|
92
|
-
|
|
93
|
-
export async function POST(req: Request) {
|
|
94
|
-
const body = await req.text();
|
|
95
|
-
const signature = headers().get('asaas-signature');
|
|
96
|
-
|
|
97
|
-
// Verify webhook signature
|
|
98
|
-
const expectedSignature = crypto
|
|
99
|
-
.createHmac('sha256', process.env.ASAAS_WEBHOOK_SECRET!)
|
|
100
|
-
.update(body)
|
|
101
|
-
.digest('hex');
|
|
102
|
-
|
|
103
|
-
if (signature !== expectedSignature) {
|
|
104
|
-
return new Response('Invalid signature', { status: 401 });
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const event = JSON.parse(body);
|
|
108
|
-
|
|
109
|
-
// Handle payment events
|
|
110
|
-
switch (event.event) {
|
|
111
|
-
case 'PAYMENT_RECEIVED':
|
|
112
|
-
await handlePaymentReceived(event.payment);
|
|
113
|
-
break;
|
|
114
|
-
case 'PAYMENT_CONFIRMED':
|
|
115
|
-
await handlePaymentConfirmed(event.payment);
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return new Response('OK');
|
|
120
|
-
}
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
---
|
|
124
|
-
|
|
125
|
-
## Database Schema (Supabase)
|
|
126
|
-
|
|
127
|
-
```sql
|
|
128
|
-
-- Store payment records
|
|
129
|
-
create table payments (
|
|
130
|
-
id uuid primary key default gen_random_uuid(),
|
|
131
|
-
user_id uuid references auth.users(id),
|
|
132
|
-
asaas_payment_id text unique not null,
|
|
133
|
-
amount decimal(10,2) not null,
|
|
134
|
-
status text not null, -- pending, confirmed, received
|
|
135
|
-
billing_type text not null, -- PIX, BOLETO, CREDIT_CARD
|
|
136
|
-
created_at timestamptz default now(),
|
|
137
|
-
updated_at timestamptz default now()
|
|
138
|
-
);
|
|
139
|
-
|
|
140
|
-
-- RLS policies
|
|
141
|
-
alter table payments enable row level security;
|
|
142
|
-
|
|
143
|
-
create policy "Users read own payments"
|
|
144
|
-
on payments for select
|
|
145
|
-
using (auth.uid() = user_id);
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
---
|
|
149
|
-
|
|
150
|
-
## Best Practices
|
|
151
|
-
|
|
152
|
-
### CPF/CNPJ Validation
|
|
153
|
-
|
|
154
|
-
```typescript
|
|
155
|
-
export function validateCPF(cpf: string): boolean {
|
|
156
|
-
cpf = cpf.replace(/[^\d]/g, '');
|
|
157
|
-
if (cpf.length !== 11) return false;
|
|
158
|
-
|
|
159
|
-
// Validation logic...
|
|
160
|
-
return true;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
export function validateCNPJ(cnpj: string): boolean {
|
|
164
|
-
cnpj = cnpj.replace(/[^\d]/g, '');
|
|
165
|
-
if (cnpj.length !== 14) return false;
|
|
166
|
-
|
|
167
|
-
// Validation logic...
|
|
168
|
-
return true;
|
|
169
|
-
}
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
### Idempotency Keys
|
|
173
|
-
|
|
174
|
-
```typescript
|
|
175
|
-
const idempotencyKey = `payment-${userId}-${Date.now()}`;
|
|
176
|
-
|
|
177
|
-
const payment = await asaasClient.payments.create({
|
|
178
|
-
// ... payment data
|
|
179
|
-
}, {
|
|
180
|
-
headers: {
|
|
181
|
-
'Idempotency-Key': idempotencyKey
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
---
|
|
187
|
-
|
|
188
|
-
## Error Handling
|
|
189
|
-
|
|
190
|
-
```typescript
|
|
191
|
-
try {
|
|
192
|
-
const payment = await asaasClient.payments.create(data);
|
|
193
|
-
} catch (error) {
|
|
194
|
-
if (error.code === 'invalid_cpf') {
|
|
195
|
-
return Response.json({ error: 'CPF inválido' }, { status: 400 });
|
|
196
|
-
}
|
|
197
|
-
if (error.code === 'insufficient_balance') {
|
|
198
|
-
return Response.json({ error: 'Saldo insuficiente' }, { status: 402 });
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
console.error('Asaas API error:', error);
|
|
202
|
-
return Response.json({ error: 'Erro no processamento' }, { status: 500 });
|
|
203
|
-
}
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
---
|
|
207
|
-
|
|
208
|
-
## References
|
|
209
|
-
|
|
210
|
-
- [Asaas API Documentation](https://docs.asaas.com/)
|
|
211
|
-
- [Asaas Node SDK](https://github.com/asaas/asaas-node)
|
|
212
|
-
- PIX Specification: Brazilian Central Bank
|
|
213
|
-
|
|
214
|
-
---
|
|
215
|
-
|
|
216
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
# Clerk Authentication Integration Standard
|
|
2
|
-
|
|
3
|
-
> **Scope:** universal
|
|
4
|
-
> **Layer:** 2 (on keyword)
|
|
5
|
-
> **Keywords:** clerk, auth, authentication, nextjs, user management
|
|
6
|
-
> **Load When:** clerk authentication keywords detected
|
|
7
|
-
|
|
8
|
-
Modern authentication and user management for Next.js applications.
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Overview
|
|
13
|
-
|
|
14
|
-
Clerk provides:
|
|
15
|
-
- Pre-built UI components (SignIn, SignUp, UserProfile)
|
|
16
|
-
- Social auth (Google, GitHub, etc.)
|
|
17
|
-
- Multi-factor authentication
|
|
18
|
-
- Session management
|
|
19
|
-
- User metadata and organizations
|
|
20
|
-
|
|
21
|
-
**Primary Use Case:** Next.js 15 + App Router
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## Core Principles
|
|
26
|
-
|
|
27
|
-
1. **Server-First**: Use server-side auth checks with `auth()` helper
|
|
28
|
-
2. **Route Protection**: Middleware-based protection for private routes
|
|
29
|
-
3. **Type Safety**: Use Clerk's TypeScript types
|
|
30
|
-
4. **Edge Compatible**: Works with Edge Runtime
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## Installation & Setup
|
|
35
|
-
|
|
36
|
-
### Install Packages
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
npm install @clerk/nextjs
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### Environment Variables
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
# .env.local
|
|
46
|
-
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
|
|
47
|
-
CLERK_SECRET_KEY=sk_test_...
|
|
48
|
-
NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in
|
|
49
|
-
NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up
|
|
50
|
-
NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL=/dashboard
|
|
51
|
-
NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL=/onboarding
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### Root Layout Wrapper
|
|
55
|
-
|
|
56
|
-
```typescript
|
|
57
|
-
// app/layout.tsx
|
|
58
|
-
import { ClerkProvider } from '@clerk/nextjs';
|
|
59
|
-
|
|
60
|
-
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
61
|
-
return (
|
|
62
|
-
<ClerkProvider>
|
|
63
|
-
<html lang="en">
|
|
64
|
-
<body>{children}</body>
|
|
65
|
-
</html>
|
|
66
|
-
</ClerkProvider>
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
### Middleware Protection
|
|
72
|
-
|
|
73
|
-
```typescript
|
|
74
|
-
// middleware.ts
|
|
75
|
-
import { authMiddleware } from '@clerk/nextjs';
|
|
76
|
-
|
|
77
|
-
export default authMiddleware({
|
|
78
|
-
publicRoutes: ['/', '/api/webhooks/clerk'],
|
|
79
|
-
ignoredRoutes: ['/api/public']
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
export const config = {
|
|
83
|
-
matcher: ['/((?!.+\\.[\\w]+$|_next).*)', '/', '/(api|trpc)(.*)'],
|
|
84
|
-
};
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
---
|
|
88
|
-
|
|
89
|
-
## Common Patterns
|
|
90
|
-
|
|
91
|
-
### Sign In Page
|
|
92
|
-
|
|
93
|
-
```typescript
|
|
94
|
-
// app/sign-in/[[...sign-in]]/page.tsx
|
|
95
|
-
import { SignIn } from '@clerk/nextjs';
|
|
96
|
-
|
|
97
|
-
export default function SignInPage() {
|
|
98
|
-
return (
|
|
99
|
-
<div className="flex items-center justify-center min-h-screen">
|
|
100
|
-
<SignIn />
|
|
101
|
-
</div>
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
### Server-Side Auth Check
|
|
107
|
-
|
|
108
|
-
```typescript
|
|
109
|
-
// app/dashboard/page.tsx
|
|
110
|
-
import { auth } from '@clerk/nextjs';
|
|
111
|
-
import { redirect } from 'next/navigation';
|
|
112
|
-
|
|
113
|
-
export default async function DashboardPage() {
|
|
114
|
-
const { userId } = auth();
|
|
115
|
-
|
|
116
|
-
if (!userId) {
|
|
117
|
-
redirect('/sign-in');
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
return <div>Dashboard for user {userId}</div>;
|
|
121
|
-
}
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
### Client Component with User Data
|
|
125
|
-
|
|
126
|
-
```typescript
|
|
127
|
-
// components/UserProfile.tsx
|
|
128
|
-
'use client';
|
|
129
|
-
import { useUser } from '@clerk/nextjs';
|
|
130
|
-
|
|
131
|
-
export function UserProfile() {
|
|
132
|
-
const { user, isLoaded, isSignedIn } = useUser();
|
|
133
|
-
|
|
134
|
-
if (!isLoaded) return <div>Loading...</div>;
|
|
135
|
-
if (!isSignedIn) return <div>Not signed in</div>;
|
|
136
|
-
|
|
137
|
-
return (
|
|
138
|
-
<div>
|
|
139
|
-
<p>Welcome, {user.firstName}!</p>
|
|
140
|
-
<p>Email: {user.primaryEmailAddress?.emailAddress}</p>
|
|
141
|
-
</div>
|
|
142
|
-
);
|
|
143
|
-
}
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
### API Route Protection
|
|
147
|
-
|
|
148
|
-
```typescript
|
|
149
|
-
// app/api/protected/route.ts
|
|
150
|
-
import { auth } from '@clerk/nextjs';
|
|
151
|
-
|
|
152
|
-
export async function GET() {
|
|
153
|
-
const { userId } = auth();
|
|
154
|
-
|
|
155
|
-
if (!userId) {
|
|
156
|
-
return new Response('Unauthorized', { status: 401 });
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// Fetch user-specific data
|
|
160
|
-
const data = await fetchUserData(userId);
|
|
161
|
-
|
|
162
|
-
return Response.json(data);
|
|
163
|
-
}
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
---
|
|
167
|
-
|
|
168
|
-
## Webhook Integration
|
|
169
|
-
|
|
170
|
-
### Setup Webhook Endpoint
|
|
171
|
-
|
|
172
|
-
```typescript
|
|
173
|
-
// app/api/webhooks/clerk/route.ts
|
|
174
|
-
import { Webhook } from 'svix';
|
|
175
|
-
import { headers } from 'next/headers';
|
|
176
|
-
|
|
177
|
-
export async function POST(req: Request) {
|
|
178
|
-
const WEBHOOK_SECRET = process.env.CLERK_WEBHOOK_SECRET!;
|
|
179
|
-
|
|
180
|
-
const headerPayload = headers();
|
|
181
|
-
const svix_id = headerPayload.get('svix-id');
|
|
182
|
-
const svix_timestamp = headerPayload.get('svix-timestamp');
|
|
183
|
-
const svix_signature = headerPayload.get('svix-signature');
|
|
184
|
-
|
|
185
|
-
if (!svix_id || !svix_timestamp || !svix_signature) {
|
|
186
|
-
return new Response('Missing svix headers', { status: 400 });
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
const payload = await req.json();
|
|
190
|
-
const body = JSON.stringify(payload);
|
|
191
|
-
|
|
192
|
-
const wh = new Webhook(WEBHOOK_SECRET);
|
|
193
|
-
|
|
194
|
-
let evt;
|
|
195
|
-
try {
|
|
196
|
-
evt = wh.verify(body, {
|
|
197
|
-
'svix-id': svix_id,
|
|
198
|
-
'svix-timestamp': svix_timestamp,
|
|
199
|
-
'svix-signature': svix_signature,
|
|
200
|
-
});
|
|
201
|
-
} catch (err) {
|
|
202
|
-
return new Response('Invalid signature', { status: 400 });
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// Handle events
|
|
206
|
-
switch (evt.type) {
|
|
207
|
-
case 'user.created':
|
|
208
|
-
await handleUserCreated(evt.data);
|
|
209
|
-
break;
|
|
210
|
-
case 'user.updated':
|
|
211
|
-
await handleUserUpdated(evt.data);
|
|
212
|
-
break;
|
|
213
|
-
case 'user.deleted':
|
|
214
|
-
await handleUserDeleted(evt.data);
|
|
215
|
-
break;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
return new Response('OK');
|
|
219
|
-
}
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
---
|
|
223
|
-
|
|
224
|
-
## Supabase Integration
|
|
225
|
-
|
|
226
|
-
### Sync Users to Supabase
|
|
227
|
-
|
|
228
|
-
```typescript
|
|
229
|
-
// lib/clerk/sync-user.ts
|
|
230
|
-
import { createClient } from '@supabase/supabase-js';
|
|
231
|
-
|
|
232
|
-
async function handleUserCreated(userData: any) {
|
|
233
|
-
const supabase = createClient(
|
|
234
|
-
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
|
235
|
-
process.env.SUPABASE_SERVICE_ROLE_KEY!
|
|
236
|
-
);
|
|
237
|
-
|
|
238
|
-
await supabase.from('profiles').insert({
|
|
239
|
-
clerk_user_id: userData.id,
|
|
240
|
-
email: userData.email_addresses[0].email_address,
|
|
241
|
-
first_name: userData.first_name,
|
|
242
|
-
last_name: userData.last_name,
|
|
243
|
-
avatar_url: userData.image_url
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
---
|
|
249
|
-
|
|
250
|
-
## Best Practices
|
|
251
|
-
|
|
252
|
-
### Custom Claims
|
|
253
|
-
|
|
254
|
-
```typescript
|
|
255
|
-
// Add custom claims in Clerk Dashboard or via API
|
|
256
|
-
const { sessionClaims } = auth();
|
|
257
|
-
const role = sessionClaims?.metadata?.role as string;
|
|
258
|
-
|
|
259
|
-
if (role !== 'admin') {
|
|
260
|
-
return new Response('Forbidden', { status: 403 });
|
|
261
|
-
}
|
|
262
|
-
```
|
|
263
|
-
|
|
264
|
-
### Organizations
|
|
265
|
-
|
|
266
|
-
```typescript
|
|
267
|
-
import { auth } from '@clerk/nextjs';
|
|
268
|
-
|
|
269
|
-
const { orgId, orgRole } = auth();
|
|
270
|
-
|
|
271
|
-
if (!orgId) {
|
|
272
|
-
redirect('/create-organization');
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
if (orgRole !== 'admin') {
|
|
276
|
-
return <div>Admin access required</div>;
|
|
277
|
-
}
|
|
278
|
-
```
|
|
279
|
-
|
|
280
|
-
---
|
|
281
|
-
|
|
282
|
-
## References
|
|
283
|
-
|
|
284
|
-
- [Clerk Next.js Documentation](https://clerk.com/docs/nextjs)
|
|
285
|
-
- [Clerk API Reference](https://clerk.com/docs/reference/backend-api)
|
|
286
|
-
- [Webhooks Guide](https://clerk.com/docs/integrations/webhooks)
|
|
287
|
-
|
|
288
|
-
---
|
|
289
|
-
|
|
290
|
-
*MORPH-SPEC by Polymorphism Tech*
|