@polymorphism-tech/morph-spec 3.0.0 → 3.0.1
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/CLAUDE.md +75 -371
- package/LICENSE +72 -72
- package/bin/detect-agents.js +225 -225
- package/bin/render-template.js +302 -302
- package/bin/semantic-detect-agents.js +246 -246
- package/bin/validate-agents-skills.js +251 -251
- package/bin/validate-agents.js +69 -69
- package/bin/validate-phase.js +263 -263
- package/content/.azure/README.md +293 -293
- package/content/.azure/docs/azure-devops-setup.md +454 -454
- package/content/.azure/docs/branch-strategy.md +398 -398
- package/content/.azure/docs/local-development.md +515 -515
- package/content/.azure/pipelines/pipeline-variables.yml +34 -34
- package/content/.azure/pipelines/prod-pipeline.yml +319 -319
- package/content/.azure/pipelines/staging-pipeline.yml +234 -234
- package/content/.azure/pipelines/templates/build-dotnet.yml +75 -75
- package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -94
- package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -120
- package/content/.azure/pipelines/templates/infra-deploy.yml +90 -90
- package/content/.claude/commands/morph-archive.md +79 -79
- package/content/.claude/commands/morph-deploy.md +529 -529
- package/content/.claude/commands/morph-infra.md +209 -209
- package/content/.claude/commands/morph-preflight.md +227 -227
- package/content/.claude/commands/morph-troubleshoot.md +122 -122
- package/content/.claude/settings.local.json +15 -15
- package/content/.claude/skills/{specialists → level-2-domains/architecture}/prompt-engineer.md +189 -189
- package/content/.claude/skills/{specialists → level-2-domains/architecture}/seo-growth-hacker.md +320 -320
- package/content/.claude/skills/{infra → level-2-domains/infrastructure}/azure-deploy-specialist.md +699 -699
- package/content/.morph/.morphversion +5 -5
- package/content/.morph/archive/.gitkeep +25 -25
- package/content/.morph/config/agents.json +7 -5
- package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
- package/content/.morph/examples/api-nextjs/README.md +241 -241
- package/content/.morph/examples/api-nextjs/contracts.ts +307 -307
- package/content/.morph/examples/api-nextjs/spec.md +399 -399
- package/content/.morph/examples/api-nextjs/tasks.md +168 -168
- package/content/.morph/examples/micro-saas/README.md +125 -125
- package/content/.morph/examples/micro-saas/contracts.cs +358 -358
- package/content/.morph/examples/micro-saas/decisions.md +246 -246
- package/content/.morph/examples/micro-saas/spec.md +236 -236
- package/content/.morph/examples/micro-saas/tasks.md +150 -150
- package/content/.morph/examples/multi-agent/README.md +309 -309
- package/content/.morph/examples/multi-agent/contracts.cs +433 -433
- package/content/.morph/examples/multi-agent/spec.md +479 -479
- package/content/.morph/examples/multi-agent/tasks.md +185 -185
- package/content/.morph/examples/state-v3.json +188 -188
- package/content/.morph/features/.gitkeep +25 -25
- package/content/.morph/hooks/pre-commit-all.sh +48 -48
- package/content/.morph/hooks/pre-commit-specs.sh +49 -49
- package/content/.morph/hooks/pre-commit-tests.sh +60 -60
- package/content/.morph/project.md +160 -160
- package/content/.morph/schemas/agent.schema.json +296 -296
- package/content/.morph/specs/.gitkeep +20 -20
- package/content/.morph/standards/coding.md +377 -377
- package/content/.morph/standards/fluent-ui-setup.md +590 -590
- package/content/.morph/standards/migration-guide.md +514 -514
- package/content/.morph/standards/passkeys-auth.md +423 -423
- package/content/.morph/standards/vector-search-rag.md +536 -536
- package/content/.morph/state.json +17 -17
- package/content/.morph/templates/FluentDesignTheme.cs +149 -149
- package/content/.morph/templates/MudTheme.cs +281 -281
- package/content/.morph/templates/component.razor +239 -239
- package/content/.morph/templates/contracts.cs +217 -217
- package/content/.morph/templates/design-system.css +226 -226
- package/content/.morph/templates/infra/.dockerignore.example +89 -89
- package/content/.morph/templates/infra/Dockerfile.example +82 -82
- package/content/.morph/templates/infra/README.md +286 -286
- package/content/.morph/templates/infra/app-insights.bicep +63 -63
- package/content/.morph/templates/infra/app-service.bicep +164 -164
- package/content/.morph/templates/infra/azure-pipelines-deploy.yml +480 -480
- package/content/.morph/templates/infra/container-app-env.bicep +49 -49
- package/content/.morph/templates/infra/container-app.bicep +156 -156
- package/content/.morph/templates/infra/deploy-checklist.md +426 -426
- package/content/.morph/templates/infra/deploy.ps1 +229 -229
- package/content/.morph/templates/infra/deploy.sh +208 -208
- package/content/.morph/templates/infra/key-vault.bicep +91 -91
- package/content/.morph/templates/infra/main.bicep +189 -189
- package/content/.morph/templates/infra/parameters.dev.json +29 -29
- package/content/.morph/templates/infra/parameters.prod.json +29 -29
- package/content/.morph/templates/infra/parameters.staging.json +29 -29
- package/content/.morph/templates/infra/sql-database.bicep +103 -103
- package/content/.morph/templates/infra/storage.bicep +106 -106
- package/content/.morph/templates/integrations/asaas-client.cs +387 -387
- package/content/.morph/templates/integrations/asaas-webhook.cs +351 -351
- package/content/.morph/templates/integrations/azure-identity-config.cs +288 -288
- package/content/.morph/templates/integrations/clerk-config.cs +258 -258
- package/content/.morph/templates/job.cs +171 -171
- package/content/.morph/templates/migration.cs +83 -83
- package/content/.morph/templates/repository.cs +141 -141
- package/content/.morph/templates/saas/subscription.cs +347 -347
- package/content/.morph/templates/saas/tenant.cs +338 -338
- package/content/.morph/templates/service.cs +139 -139
- package/content/.morph/templates/sprint-status.yaml +68 -68
- package/content/.morph/templates/story.md +143 -143
- package/content/.morph/templates/test.cs +239 -239
- package/content/.morph/templates/ui-design-system.md +286 -286
- package/content/.morph/templates/ui-flows.md +336 -336
- package/content/.morph/templates/ui-mockups.md +133 -133
- package/content/.morph/test-infra/example.bicep +59 -59
- package/content/README.md +79 -79
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
- package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
- package/docs/api/scripts/collapse.js +38 -38
- package/docs/api/scripts/commonNav.js +28 -28
- package/docs/api/scripts/linenumber.js +25 -25
- package/docs/api/scripts/nav.js +12 -12
- package/docs/api/scripts/polyfill.js +3 -3
- package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
- package/docs/api/scripts/prettify/lang-css.js +2 -2
- package/docs/api/scripts/prettify/prettify.js +28 -28
- package/docs/api/scripts/search.js +98 -98
- package/docs/api/styles/jsdoc.css +776 -776
- package/docs/api/styles/prettify.css +80 -80
- package/docs/examples.md +328 -328
- package/docs/templates.md +418 -418
- package/package.json +1 -2
- package/scripts/postinstall.js +132 -132
- package/scripts/reorganize-skills.cjs +175 -0
- package/scripts/validate-agents-structure.cjs +52 -0
- package/scripts/validate-skills.cjs +180 -0
- package/src/commands/analyze-blazor-concurrency.js +193 -193
- package/src/commands/create-story.js +351 -351
- package/src/commands/deploy.js +780 -780
- package/src/commands/detect-agents.js +9 -0
- package/src/commands/detect.js +104 -104
- package/src/commands/generate.js +149 -149
- package/src/commands/lint-fluent.js +352 -352
- package/src/commands/rollback-phase.js +185 -185
- package/src/commands/session-summary.js +291 -291
- package/src/commands/shard-spec.js +224 -224
- package/src/commands/sprint-status.js +250 -250
- package/src/commands/state.js +334 -333
- package/src/commands/sync.js +167 -167
- package/src/commands/troubleshoot.js +222 -222
- package/src/commands/update.js +13 -1
- package/src/commands/validate-blazor-state.js +210 -210
- package/src/commands/validate-blazor.js +156 -156
- package/src/commands/validate-css.js +84 -84
- package/src/commands/validate-phase.js +221 -221
- package/src/lib/blazor-concurrency-analyzer.js +288 -288
- package/src/lib/blazor-state-validator.js +291 -291
- package/src/lib/blazor-validator.js +374 -374
- package/src/lib/css-validator.js +352 -352
- package/src/lib/design-system-generator.js +298 -298
- package/{detectors → src/lib/detectors}/config-detector.js +223 -223
- package/{detectors → src/lib/detectors}/conversation-analyzer.js +163 -163
- package/{detectors → src/lib/detectors}/index.js +84 -84
- package/{detectors → src/lib/detectors}/standards-generator.js +275 -275
- package/src/lib/learning-system.js +520 -520
- package/src/lib/mockup-generator.js +366 -366
- package/src/lib/state-manager.js +21 -4
- package/src/lib/troubleshoot-grep.js +194 -194
- package/src/lib/troubleshoot-index.js +144 -144
- package/src/lib/ui-detector.js +350 -350
- package/src/lib/validators/architecture-validator.js +387 -387
- package/src/lib/validators/package-validator.js +360 -360
- package/src/lib/validators/ui-contrast-validator.js +422 -422
- package/src/utils/logger.js +32 -32
- package/src/utils/version-checker.js +175 -175
- /package/{detectors → src/lib/detectors}/structure-detector.js +0 -0
|
@@ -1,241 +1,241 @@
|
|
|
1
|
-
# API .NET + Next.js Example
|
|
2
|
-
|
|
3
|
-
Exemplo de arquitetura full-stack com .NET API backend e Next.js frontend.
|
|
4
|
-
|
|
5
|
-
## Stack
|
|
6
|
-
|
|
7
|
-
| Camada | Tecnologia |
|
|
8
|
-
|--------|------------|
|
|
9
|
-
| **Frontend** | Next.js 14 (App Router) |
|
|
10
|
-
| **Backend** | .NET 8 Minimal APIs |
|
|
11
|
-
| **Database** | SQL Server / PostgreSQL |
|
|
12
|
-
| **Auth** | Clerk (SSO) |
|
|
13
|
-
| **API Communication** | REST + React Query |
|
|
14
|
-
| **Infra** | Azure Container Apps |
|
|
15
|
-
|
|
16
|
-
## Arquitetura
|
|
17
|
-
|
|
18
|
-
```
|
|
19
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
20
|
-
│ Next.js Frontend │
|
|
21
|
-
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
|
|
22
|
-
│ │ Pages │ │ Components │ │ Hooks │ │
|
|
23
|
-
│ │ /dashboard │ │ DataTable │ │ useProducts() │ │
|
|
24
|
-
│ │ /products │ │ Forms │ │ useOrders() │ │
|
|
25
|
-
│ │ /orders │ │ Charts │ │ useAuth() │ │
|
|
26
|
-
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
|
|
27
|
-
└─────────────────────────────────────────────────────────────┘
|
|
28
|
-
│
|
|
29
|
-
│ REST API
|
|
30
|
-
▼
|
|
31
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
32
|
-
│ .NET API │
|
|
33
|
-
│ ┌─────────────────────────────────────────────────────┐ │
|
|
34
|
-
│ │ Endpoints: /api/products, /api/orders, /api/users │ │
|
|
35
|
-
│ └─────────────────────────────────────────────────────┘ │
|
|
36
|
-
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
|
|
37
|
-
│ │ Services │ │ Validators │ │ Middlewares │ │
|
|
38
|
-
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
|
|
39
|
-
└─────────────────────────────────────────────────────────────┘
|
|
40
|
-
│
|
|
41
|
-
▼
|
|
42
|
-
┌─────────────────────────────────────────────────────────────┐
|
|
43
|
-
│ Infrastructure │
|
|
44
|
-
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
|
|
45
|
-
│ │ EF Core │ │ Redis │ │ Blob Storage │ │
|
|
46
|
-
│ │ Repository │ │ Cache │ │ (files) │ │
|
|
47
|
-
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
|
|
48
|
-
└─────────────────────────────────────────────────────────────┘
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Estrutura de Pastas
|
|
52
|
-
|
|
53
|
-
```
|
|
54
|
-
project/
|
|
55
|
-
├── src/
|
|
56
|
-
│ ├── api/ # .NET Backend
|
|
57
|
-
│ │ ├── Api/
|
|
58
|
-
│ │ │ ├── Endpoints/
|
|
59
|
-
│ │ │ │ ├── ProductEndpoints.cs
|
|
60
|
-
│ │ │ │ ├── OrderEndpoints.cs
|
|
61
|
-
│ │ │ │ └── UserEndpoints.cs
|
|
62
|
-
│ │ │ ├── Middleware/
|
|
63
|
-
│ │ │ └── Program.cs
|
|
64
|
-
│ │ ├── Application/
|
|
65
|
-
│ │ │ ├── Services/
|
|
66
|
-
│ │ │ └── Validators/
|
|
67
|
-
│ │ ├── Domain/
|
|
68
|
-
│ │ │ ├── Entities/
|
|
69
|
-
│ │ │ └── Interfaces/
|
|
70
|
-
│ │ └── Infrastructure/
|
|
71
|
-
│ │ ├── Data/
|
|
72
|
-
│ │ └── Repositories/
|
|
73
|
-
│ │
|
|
74
|
-
│ └── web/ # Next.js Frontend
|
|
75
|
-
│ ├── app/
|
|
76
|
-
│ │ ├── (auth)/
|
|
77
|
-
│ │ │ ├── sign-in/
|
|
78
|
-
│ │ │ └── sign-up/
|
|
79
|
-
│ │ ├── (dashboard)/
|
|
80
|
-
│ │ │ ├── dashboard/
|
|
81
|
-
│ │ │ ├── products/
|
|
82
|
-
│ │ │ └── orders/
|
|
83
|
-
│ │ ├── layout.tsx
|
|
84
|
-
│ │ └── page.tsx
|
|
85
|
-
│ ├── components/
|
|
86
|
-
│ │ ├── ui/
|
|
87
|
-
│ │ └── shared/
|
|
88
|
-
│ ├── hooks/
|
|
89
|
-
│ │ ├── use-products.ts
|
|
90
|
-
│ │ └── use-orders.ts
|
|
91
|
-
│ ├── lib/
|
|
92
|
-
│ │ ├── api-client.ts
|
|
93
|
-
│ │ └── utils.ts
|
|
94
|
-
│ └── types/
|
|
95
|
-
│
|
|
96
|
-
├── infra/ # Infrastructure as Code
|
|
97
|
-
│ ├── main.bicep
|
|
98
|
-
│ └── modules/
|
|
99
|
-
│
|
|
100
|
-
└── docker-compose.yml
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Quick Start
|
|
104
|
-
|
|
105
|
-
### Backend (.NET)
|
|
106
|
-
|
|
107
|
-
```bash
|
|
108
|
-
cd src/api
|
|
109
|
-
dotnet restore
|
|
110
|
-
dotnet ef database update
|
|
111
|
-
dotnet run
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
### Frontend (Next.js)
|
|
115
|
-
|
|
116
|
-
```bash
|
|
117
|
-
cd src/web
|
|
118
|
-
npm install
|
|
119
|
-
npm run dev
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
### Docker Compose
|
|
123
|
-
|
|
124
|
-
```bash
|
|
125
|
-
docker-compose up -d
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
## Features
|
|
129
|
-
|
|
130
|
-
### Backend
|
|
131
|
-
- Minimal APIs com OpenAPI
|
|
132
|
-
- FluentValidation para validação
|
|
133
|
-
- EF Core com Repository Pattern
|
|
134
|
-
- JWT Bearer Authentication
|
|
135
|
-
- Health Checks
|
|
136
|
-
- Structured Logging
|
|
137
|
-
|
|
138
|
-
### Frontend
|
|
139
|
-
- App Router (Next.js 14)
|
|
140
|
-
- Server Components + Client Components
|
|
141
|
-
- React Query para data fetching
|
|
142
|
-
- Tailwind CSS + shadcn/ui
|
|
143
|
-
- Form handling com React Hook Form
|
|
144
|
-
- TypeScript estrito
|
|
145
|
-
|
|
146
|
-
## Autenticação
|
|
147
|
-
|
|
148
|
-
### Fluxo
|
|
149
|
-
|
|
150
|
-
```mermaid
|
|
151
|
-
sequenceDiagram
|
|
152
|
-
participant User
|
|
153
|
-
participant NextJS
|
|
154
|
-
participant Clerk
|
|
155
|
-
participant API
|
|
156
|
-
|
|
157
|
-
User->>NextJS: Acessa /sign-in
|
|
158
|
-
NextJS->>Clerk: Redirect para Clerk
|
|
159
|
-
User->>Clerk: Login
|
|
160
|
-
Clerk-->>NextJS: JWT Token
|
|
161
|
-
NextJS->>API: Request com Bearer Token
|
|
162
|
-
API->>Clerk: Valida token (JWKS)
|
|
163
|
-
API-->>NextJS: Response
|
|
164
|
-
NextJS-->>User: Renderiza página
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
### Configuração Clerk (Next.js)
|
|
168
|
-
|
|
169
|
-
```typescript
|
|
170
|
-
// middleware.ts
|
|
171
|
-
import { clerkMiddleware } from "@clerk/nextjs/server";
|
|
172
|
-
|
|
173
|
-
export default clerkMiddleware();
|
|
174
|
-
|
|
175
|
-
export const config = {
|
|
176
|
-
matcher: ["/((?!.*\\..*|_next).*)", "/", "/(api|trpc)(.*)"],
|
|
177
|
-
};
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
### Configuração JWT (API)
|
|
181
|
-
|
|
182
|
-
```csharp
|
|
183
|
-
// Program.cs
|
|
184
|
-
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
|
|
185
|
-
.AddJwtBearer(options =>
|
|
186
|
-
{
|
|
187
|
-
options.Authority = builder.Configuration["Clerk:Authority"];
|
|
188
|
-
options.TokenValidationParameters = new TokenValidationParameters
|
|
189
|
-
{
|
|
190
|
-
ValidateAudience = false,
|
|
191
|
-
NameClaimType = "sub"
|
|
192
|
-
};
|
|
193
|
-
});
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
## API Client (Frontend)
|
|
197
|
-
|
|
198
|
-
```typescript
|
|
199
|
-
// lib/api-client.ts
|
|
200
|
-
import { auth } from "@clerk/nextjs/server";
|
|
201
|
-
|
|
202
|
-
const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL;
|
|
203
|
-
|
|
204
|
-
export async function apiClient<T>(
|
|
205
|
-
endpoint: string,
|
|
206
|
-
options: RequestInit = {}
|
|
207
|
-
): Promise<T> {
|
|
208
|
-
const { getToken } = auth();
|
|
209
|
-
const token = await getToken();
|
|
210
|
-
|
|
211
|
-
const response = await fetch(`${API_BASE_URL}${endpoint}`, {
|
|
212
|
-
...options,
|
|
213
|
-
headers: {
|
|
214
|
-
"Content-Type": "application/json",
|
|
215
|
-
Authorization: `Bearer ${token}`,
|
|
216
|
-
...options.headers,
|
|
217
|
-
},
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
if (!response.ok) {
|
|
221
|
-
throw new Error(`API Error: ${response.statusText}`);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
return response.json();
|
|
225
|
-
}
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
## Custos Estimados
|
|
229
|
-
|
|
230
|
-
| Recurso | Tier | Custo/mês |
|
|
231
|
-
|---------|------|-----------|
|
|
232
|
-
| Container App (API) | Consumption | ~$0-5 |
|
|
233
|
-
| Container App (Web) | Consumption | ~$0-5 |
|
|
234
|
-
| SQL Database | Free 32GB | $0 |
|
|
235
|
-
| Clerk | Free 10k MAU | $0 |
|
|
236
|
-
|
|
237
|
-
**Total**: < $10/mês para MVPs
|
|
238
|
-
|
|
239
|
-
---
|
|
240
|
-
|
|
241
|
-
*MORPH-SPEC by Polymorphism Tech*
|
|
1
|
+
# API .NET + Next.js Example
|
|
2
|
+
|
|
3
|
+
Exemplo de arquitetura full-stack com .NET API backend e Next.js frontend.
|
|
4
|
+
|
|
5
|
+
## Stack
|
|
6
|
+
|
|
7
|
+
| Camada | Tecnologia |
|
|
8
|
+
|--------|------------|
|
|
9
|
+
| **Frontend** | Next.js 14 (App Router) |
|
|
10
|
+
| **Backend** | .NET 8 Minimal APIs |
|
|
11
|
+
| **Database** | SQL Server / PostgreSQL |
|
|
12
|
+
| **Auth** | Clerk (SSO) |
|
|
13
|
+
| **API Communication** | REST + React Query |
|
|
14
|
+
| **Infra** | Azure Container Apps |
|
|
15
|
+
|
|
16
|
+
## Arquitetura
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
20
|
+
│ Next.js Frontend │
|
|
21
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
|
|
22
|
+
│ │ Pages │ │ Components │ │ Hooks │ │
|
|
23
|
+
│ │ /dashboard │ │ DataTable │ │ useProducts() │ │
|
|
24
|
+
│ │ /products │ │ Forms │ │ useOrders() │ │
|
|
25
|
+
│ │ /orders │ │ Charts │ │ useAuth() │ │
|
|
26
|
+
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
|
|
27
|
+
└─────────────────────────────────────────────────────────────┘
|
|
28
|
+
│
|
|
29
|
+
│ REST API
|
|
30
|
+
▼
|
|
31
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
32
|
+
│ .NET API │
|
|
33
|
+
│ ┌─────────────────────────────────────────────────────┐ │
|
|
34
|
+
│ │ Endpoints: /api/products, /api/orders, /api/users │ │
|
|
35
|
+
│ └─────────────────────────────────────────────────────┘ │
|
|
36
|
+
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
|
|
37
|
+
│ │ Services │ │ Validators │ │ Middlewares │ │
|
|
38
|
+
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
|
|
39
|
+
└─────────────────────────────────────────────────────────────┘
|
|
40
|
+
│
|
|
41
|
+
▼
|
|
42
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
43
|
+
│ Infrastructure │
|
|
44
|
+
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
|
|
45
|
+
│ │ EF Core │ │ Redis │ │ Blob Storage │ │
|
|
46
|
+
│ │ Repository │ │ Cache │ │ (files) │ │
|
|
47
|
+
│ └──────────────┘ └──────────────┘ └──────────────────┘ │
|
|
48
|
+
└─────────────────────────────────────────────────────────────┘
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Estrutura de Pastas
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
project/
|
|
55
|
+
├── src/
|
|
56
|
+
│ ├── api/ # .NET Backend
|
|
57
|
+
│ │ ├── Api/
|
|
58
|
+
│ │ │ ├── Endpoints/
|
|
59
|
+
│ │ │ │ ├── ProductEndpoints.cs
|
|
60
|
+
│ │ │ │ ├── OrderEndpoints.cs
|
|
61
|
+
│ │ │ │ └── UserEndpoints.cs
|
|
62
|
+
│ │ │ ├── Middleware/
|
|
63
|
+
│ │ │ └── Program.cs
|
|
64
|
+
│ │ ├── Application/
|
|
65
|
+
│ │ │ ├── Services/
|
|
66
|
+
│ │ │ └── Validators/
|
|
67
|
+
│ │ ├── Domain/
|
|
68
|
+
│ │ │ ├── Entities/
|
|
69
|
+
│ │ │ └── Interfaces/
|
|
70
|
+
│ │ └── Infrastructure/
|
|
71
|
+
│ │ ├── Data/
|
|
72
|
+
│ │ └── Repositories/
|
|
73
|
+
│ │
|
|
74
|
+
│ └── web/ # Next.js Frontend
|
|
75
|
+
│ ├── app/
|
|
76
|
+
│ │ ├── (auth)/
|
|
77
|
+
│ │ │ ├── sign-in/
|
|
78
|
+
│ │ │ └── sign-up/
|
|
79
|
+
│ │ ├── (dashboard)/
|
|
80
|
+
│ │ │ ├── dashboard/
|
|
81
|
+
│ │ │ ├── products/
|
|
82
|
+
│ │ │ └── orders/
|
|
83
|
+
│ │ ├── layout.tsx
|
|
84
|
+
│ │ └── page.tsx
|
|
85
|
+
│ ├── components/
|
|
86
|
+
│ │ ├── ui/
|
|
87
|
+
│ │ └── shared/
|
|
88
|
+
│ ├── hooks/
|
|
89
|
+
│ │ ├── use-products.ts
|
|
90
|
+
│ │ └── use-orders.ts
|
|
91
|
+
│ ├── lib/
|
|
92
|
+
│ │ ├── api-client.ts
|
|
93
|
+
│ │ └── utils.ts
|
|
94
|
+
│ └── types/
|
|
95
|
+
│
|
|
96
|
+
├── infra/ # Infrastructure as Code
|
|
97
|
+
│ ├── main.bicep
|
|
98
|
+
│ └── modules/
|
|
99
|
+
│
|
|
100
|
+
└── docker-compose.yml
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Quick Start
|
|
104
|
+
|
|
105
|
+
### Backend (.NET)
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
cd src/api
|
|
109
|
+
dotnet restore
|
|
110
|
+
dotnet ef database update
|
|
111
|
+
dotnet run
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Frontend (Next.js)
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
cd src/web
|
|
118
|
+
npm install
|
|
119
|
+
npm run dev
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Docker Compose
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
docker-compose up -d
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Features
|
|
129
|
+
|
|
130
|
+
### Backend
|
|
131
|
+
- Minimal APIs com OpenAPI
|
|
132
|
+
- FluentValidation para validação
|
|
133
|
+
- EF Core com Repository Pattern
|
|
134
|
+
- JWT Bearer Authentication
|
|
135
|
+
- Health Checks
|
|
136
|
+
- Structured Logging
|
|
137
|
+
|
|
138
|
+
### Frontend
|
|
139
|
+
- App Router (Next.js 14)
|
|
140
|
+
- Server Components + Client Components
|
|
141
|
+
- React Query para data fetching
|
|
142
|
+
- Tailwind CSS + shadcn/ui
|
|
143
|
+
- Form handling com React Hook Form
|
|
144
|
+
- TypeScript estrito
|
|
145
|
+
|
|
146
|
+
## Autenticação
|
|
147
|
+
|
|
148
|
+
### Fluxo
|
|
149
|
+
|
|
150
|
+
```mermaid
|
|
151
|
+
sequenceDiagram
|
|
152
|
+
participant User
|
|
153
|
+
participant NextJS
|
|
154
|
+
participant Clerk
|
|
155
|
+
participant API
|
|
156
|
+
|
|
157
|
+
User->>NextJS: Acessa /sign-in
|
|
158
|
+
NextJS->>Clerk: Redirect para Clerk
|
|
159
|
+
User->>Clerk: Login
|
|
160
|
+
Clerk-->>NextJS: JWT Token
|
|
161
|
+
NextJS->>API: Request com Bearer Token
|
|
162
|
+
API->>Clerk: Valida token (JWKS)
|
|
163
|
+
API-->>NextJS: Response
|
|
164
|
+
NextJS-->>User: Renderiza página
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Configuração Clerk (Next.js)
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
// middleware.ts
|
|
171
|
+
import { clerkMiddleware } from "@clerk/nextjs/server";
|
|
172
|
+
|
|
173
|
+
export default clerkMiddleware();
|
|
174
|
+
|
|
175
|
+
export const config = {
|
|
176
|
+
matcher: ["/((?!.*\\..*|_next).*)", "/", "/(api|trpc)(.*)"],
|
|
177
|
+
};
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Configuração JWT (API)
|
|
181
|
+
|
|
182
|
+
```csharp
|
|
183
|
+
// Program.cs
|
|
184
|
+
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
|
|
185
|
+
.AddJwtBearer(options =>
|
|
186
|
+
{
|
|
187
|
+
options.Authority = builder.Configuration["Clerk:Authority"];
|
|
188
|
+
options.TokenValidationParameters = new TokenValidationParameters
|
|
189
|
+
{
|
|
190
|
+
ValidateAudience = false,
|
|
191
|
+
NameClaimType = "sub"
|
|
192
|
+
};
|
|
193
|
+
});
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## API Client (Frontend)
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
// lib/api-client.ts
|
|
200
|
+
import { auth } from "@clerk/nextjs/server";
|
|
201
|
+
|
|
202
|
+
const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL;
|
|
203
|
+
|
|
204
|
+
export async function apiClient<T>(
|
|
205
|
+
endpoint: string,
|
|
206
|
+
options: RequestInit = {}
|
|
207
|
+
): Promise<T> {
|
|
208
|
+
const { getToken } = auth();
|
|
209
|
+
const token = await getToken();
|
|
210
|
+
|
|
211
|
+
const response = await fetch(`${API_BASE_URL}${endpoint}`, {
|
|
212
|
+
...options,
|
|
213
|
+
headers: {
|
|
214
|
+
"Content-Type": "application/json",
|
|
215
|
+
Authorization: `Bearer ${token}`,
|
|
216
|
+
...options.headers,
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
if (!response.ok) {
|
|
221
|
+
throw new Error(`API Error: ${response.statusText}`);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return response.json();
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## Custos Estimados
|
|
229
|
+
|
|
230
|
+
| Recurso | Tier | Custo/mês |
|
|
231
|
+
|---------|------|-----------|
|
|
232
|
+
| Container App (API) | Consumption | ~$0-5 |
|
|
233
|
+
| Container App (Web) | Consumption | ~$0-5 |
|
|
234
|
+
| SQL Database | Free 32GB | $0 |
|
|
235
|
+
| Clerk | Free 10k MAU | $0 |
|
|
236
|
+
|
|
237
|
+
**Total**: < $10/mês para MVPs
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
*MORPH-SPEC by Polymorphism Tech*
|