@polymorphism-tech/morph-spec 2.4.0 → 3.0.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.
Files changed (218) hide show
  1. package/CLAUDE.md +158 -26
  2. package/LICENSE +72 -72
  3. package/bin/detect-agents.js +225 -225
  4. package/bin/morph-spec.js +8 -0
  5. package/bin/render-template.js +302 -302
  6. package/bin/semantic-detect-agents.js +246 -246
  7. package/bin/validate-agents-skills.js +251 -251
  8. package/bin/validate-agents.js +69 -69
  9. package/bin/validate-phase.js +263 -263
  10. package/content/.azure/README.md +293 -293
  11. package/content/.azure/docs/azure-devops-setup.md +454 -454
  12. package/content/.azure/docs/branch-strategy.md +398 -398
  13. package/content/.azure/docs/local-development.md +515 -515
  14. package/content/.azure/pipelines/pipeline-variables.yml +34 -34
  15. package/content/.azure/pipelines/prod-pipeline.yml +319 -319
  16. package/content/.azure/pipelines/staging-pipeline.yml +234 -234
  17. package/content/.azure/pipelines/templates/build-dotnet.yml +75 -75
  18. package/content/.azure/pipelines/templates/deploy-app-service.yml +94 -94
  19. package/content/.azure/pipelines/templates/deploy-container-app.yml +120 -120
  20. package/content/.azure/pipelines/templates/infra-deploy.yml +90 -90
  21. package/content/.claude/commands/morph-archive.md +79 -79
  22. package/content/.claude/commands/morph-deploy.md +529 -0
  23. package/content/.claude/commands/morph-infra.md +209 -209
  24. package/content/.claude/commands/morph-preflight.md +227 -227
  25. package/content/.claude/commands/morph-troubleshoot.md +122 -122
  26. package/content/.claude/settings.local.json +15 -15
  27. package/content/.claude/skills/infra/azure-deploy-specialist.md +699 -0
  28. package/content/.claude/skills/level-0-meta/README.md +7 -0
  29. package/content/.claude/skills/{checklists → level-0-meta}/morph-checklist.md +117 -117
  30. package/content/.claude/skills/level-1-workflows/README.md +7 -0
  31. package/content/.claude/skills/{workflows → level-1-workflows}/morph-replicate.md +213 -213
  32. package/content/.claude/skills/{workflows → level-1-workflows}/phase-clarify.md +131 -131
  33. package/content/.claude/skills/{workflows → level-1-workflows}/phase-design.md +213 -205
  34. package/content/.claude/skills/{workflows → level-1-workflows}/phase-setup.md +106 -92
  35. package/content/.claude/skills/{workflows → level-1-workflows}/phase-tasks.md +164 -164
  36. package/content/.claude/skills/{workflows → level-1-workflows}/phase-uiux.md +169 -138
  37. package/content/.claude/skills/level-2-domains/README.md +14 -0
  38. package/content/.claude/skills/{specialists → level-2-domains/quality}/testing-specialist.md +126 -126
  39. package/content/.claude/skills/level-3-technologies/README.md +7 -0
  40. package/content/.claude/skills/level-4-patterns/README.md +7 -0
  41. package/content/.claude/skills/specialists/prompt-engineer.md +189 -0
  42. package/content/.claude/skills/specialists/seo-growth-hacker.md +320 -0
  43. package/content/.morph/.morphversion +5 -5
  44. package/content/.morph/archive/.gitkeep +25 -25
  45. package/content/.morph/config/agents.json +742 -358
  46. package/content/.morph/config/config.template.json +33 -0
  47. package/content/.morph/docs/STORY-DRIVEN-DEVELOPMENT.md +392 -392
  48. package/content/.morph/docs/workflows/enforcement-pipeline.md +668 -0
  49. package/content/.morph/examples/api-nextjs/README.md +241 -241
  50. package/content/.morph/examples/api-nextjs/contracts.ts +307 -307
  51. package/content/.morph/examples/api-nextjs/spec.md +399 -399
  52. package/content/.morph/examples/api-nextjs/tasks.md +168 -168
  53. package/content/.morph/examples/micro-saas/README.md +125 -125
  54. package/content/.morph/examples/micro-saas/contracts.cs +358 -358
  55. package/content/.morph/examples/micro-saas/decisions.md +246 -246
  56. package/content/.morph/examples/micro-saas/spec.md +236 -236
  57. package/content/.morph/examples/micro-saas/tasks.md +150 -150
  58. package/content/.morph/examples/multi-agent/README.md +309 -309
  59. package/content/.morph/examples/multi-agent/contracts.cs +433 -433
  60. package/content/.morph/examples/multi-agent/spec.md +479 -479
  61. package/content/.morph/examples/multi-agent/tasks.md +185 -185
  62. package/content/.morph/examples/scheduled-reports/decisions.md +158 -158
  63. package/content/.morph/examples/scheduled-reports/proposal.md +95 -95
  64. package/content/.morph/examples/scheduled-reports/spec.md +267 -267
  65. package/content/.morph/examples/state-v3.json +188 -188
  66. package/content/.morph/features/.gitkeep +25 -25
  67. package/content/.morph/hooks/README.md +158 -0
  68. package/content/.morph/hooks/pre-commit-all.sh +48 -48
  69. package/content/.morph/hooks/pre-commit-specs.sh +49 -49
  70. package/content/.morph/hooks/pre-commit-tests.sh +60 -60
  71. package/content/.morph/hooks/task-completed.js +73 -0
  72. package/content/.morph/hooks/teammate-idle.js +68 -0
  73. package/content/.morph/project.md +160 -160
  74. package/content/.morph/schemas/agent.schema.json +296 -296
  75. package/content/.morph/schemas/tasks.schema.json +220 -220
  76. package/content/.morph/specs/.gitkeep +20 -20
  77. package/content/.morph/standards/agent-teams-workflow.md +474 -0
  78. package/content/.morph/standards/coding.md +377 -377
  79. package/content/.morph/standards/fluent-ui-setup.md +590 -590
  80. package/content/.morph/standards/migration-guide.md +514 -514
  81. package/content/.morph/standards/passkeys-auth.md +423 -423
  82. package/content/.morph/standards/vector-search-rag.md +536 -536
  83. package/content/.morph/state.json +17 -17
  84. package/content/.morph/templates/CONTEXT-FEATURE.md +276 -0
  85. package/content/.morph/templates/CONTEXT.md +170 -0
  86. package/content/.morph/templates/FluentDesignTheme.cs +149 -149
  87. package/content/.morph/templates/MudTheme.cs +281 -281
  88. package/content/.morph/templates/clarify-questions.md +159 -159
  89. package/content/.morph/templates/component.razor +239 -239
  90. package/content/.morph/templates/contracts/Commands.cs +74 -74
  91. package/content/.morph/templates/contracts/Entities.cs +25 -25
  92. package/content/.morph/templates/contracts/Queries.cs +74 -74
  93. package/content/.morph/templates/contracts/README.md +74 -74
  94. package/content/.morph/templates/contracts.cs +217 -217
  95. package/content/.morph/templates/design-system.css +226 -226
  96. package/content/.morph/templates/infra/.dockerignore.example +89 -89
  97. package/content/.morph/templates/infra/Dockerfile.example +82 -82
  98. package/content/.morph/templates/infra/README.md +286 -286
  99. package/content/.morph/templates/infra/app-insights.bicep +63 -63
  100. package/content/.morph/templates/infra/app-service.bicep +164 -164
  101. package/content/.morph/templates/infra/azure-pipelines-deploy.yml +480 -0
  102. package/content/.morph/templates/infra/container-app-env.bicep +49 -49
  103. package/content/.morph/templates/infra/container-app.bicep +156 -156
  104. package/content/.morph/templates/infra/deploy-checklist.md +426 -426
  105. package/content/.morph/templates/infra/deploy.ps1 +229 -229
  106. package/content/.morph/templates/infra/deploy.sh +208 -208
  107. package/content/.morph/templates/infra/key-vault.bicep +91 -91
  108. package/content/.morph/templates/infra/main.bicep +189 -189
  109. package/content/.morph/templates/infra/parameters.dev.json +29 -29
  110. package/content/.morph/templates/infra/parameters.prod.json +29 -29
  111. package/content/.morph/templates/infra/parameters.staging.json +29 -29
  112. package/content/.morph/templates/infra/sql-database.bicep +103 -103
  113. package/content/.morph/templates/infra/storage.bicep +106 -106
  114. package/content/.morph/templates/integrations/asaas-client.cs +387 -387
  115. package/content/.morph/templates/integrations/asaas-webhook.cs +351 -351
  116. package/content/.morph/templates/integrations/azure-identity-config.cs +288 -288
  117. package/content/.morph/templates/integrations/clerk-config.cs +258 -258
  118. package/content/.morph/templates/job.cs +171 -171
  119. package/content/.morph/templates/migration.cs +83 -83
  120. package/content/.morph/templates/repository.cs +141 -141
  121. package/content/.morph/templates/saas/subscription.cs +347 -347
  122. package/content/.morph/templates/saas/tenant.cs +338 -338
  123. package/content/.morph/templates/service.cs +139 -139
  124. package/content/.morph/templates/sprint-status.yaml +68 -68
  125. package/content/.morph/templates/story.md +143 -143
  126. package/content/.morph/templates/test.cs +239 -239
  127. package/content/.morph/templates/ui-design-system.md +286 -286
  128. package/content/.morph/templates/ui-flows.md +336 -336
  129. package/content/.morph/templates/ui-mockups.md +133 -133
  130. package/content/.morph/test-infra/example.bicep +59 -59
  131. package/content/README.md +79 -79
  132. package/detectors/config-detector.js +223 -223
  133. package/detectors/conversation-analyzer.js +163 -163
  134. package/detectors/index.js +84 -84
  135. package/detectors/standards-generator.js +275 -275
  136. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +977 -977
  137. package/docs/api/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1048 -1048
  138. package/docs/api/scripts/collapse.js +38 -38
  139. package/docs/api/scripts/commonNav.js +28 -28
  140. package/docs/api/scripts/linenumber.js +25 -25
  141. package/docs/api/scripts/nav.js +12 -12
  142. package/docs/api/scripts/polyfill.js +3 -3
  143. package/docs/api/scripts/prettify/Apache-License-2.0.txt +202 -202
  144. package/docs/api/scripts/prettify/lang-css.js +2 -2
  145. package/docs/api/scripts/prettify/prettify.js +28 -28
  146. package/docs/api/scripts/search.js +98 -98
  147. package/docs/api/styles/jsdoc.css +776 -776
  148. package/docs/api/styles/prettify.css +80 -80
  149. package/docs/examples.md +328 -328
  150. package/docs/templates.md +418 -418
  151. package/package.json +1 -1
  152. package/scripts/postinstall.js +132 -132
  153. package/src/commands/advance-phase.js +83 -0
  154. package/src/commands/analyze-blazor-concurrency.js +193 -193
  155. package/src/commands/create-story.js +351 -351
  156. package/src/commands/deploy.js +780 -0
  157. package/src/commands/detect-agents.js +34 -6
  158. package/src/commands/detect.js +104 -104
  159. package/src/commands/generate-context.js +40 -0
  160. package/src/commands/generate.js +149 -149
  161. package/src/commands/lint-fluent.js +352 -352
  162. package/src/commands/rollback-phase.js +185 -185
  163. package/src/commands/session-summary.js +291 -291
  164. package/src/commands/shard-spec.js +224 -224
  165. package/src/commands/sprint-status.js +250 -250
  166. package/src/commands/state.js +333 -333
  167. package/src/commands/sync.js +167 -167
  168. package/src/commands/troubleshoot.js +222 -222
  169. package/src/commands/validate-blazor-state.js +210 -210
  170. package/src/commands/validate-blazor.js +156 -156
  171. package/src/commands/validate-css.js +84 -84
  172. package/src/commands/validate-phase.js +221 -221
  173. package/src/lib/blazor-concurrency-analyzer.js +288 -288
  174. package/src/lib/blazor-state-validator.js +291 -291
  175. package/src/lib/blazor-validator.js +374 -374
  176. package/src/lib/context-generator.js +513 -0
  177. package/src/lib/css-validator.js +352 -352
  178. package/src/lib/design-system-detector.js +187 -0
  179. package/src/lib/design-system-generator.js +298 -298
  180. package/src/lib/design-system-scaffolder.js +299 -0
  181. package/src/lib/hook-executor.js +256 -0
  182. package/src/lib/learning-system.js +520 -520
  183. package/src/lib/mockup-generator.js +366 -366
  184. package/src/lib/spec-validator.js +258 -0
  185. package/src/lib/standards-context-injector.js +287 -0
  186. package/src/lib/team-orchestrator.js +322 -0
  187. package/src/lib/troubleshoot-grep.js +194 -194
  188. package/src/lib/troubleshoot-index.js +144 -144
  189. package/src/lib/ui-detector.js +350 -350
  190. package/src/lib/validation-runner.js +65 -13
  191. package/src/lib/validators/architecture-validator.js +387 -387
  192. package/src/lib/validators/design-system-validator.js +231 -0
  193. package/src/lib/validators/package-validator.js +360 -360
  194. package/src/lib/validators/ui-contrast-validator.js +422 -422
  195. package/src/utils/file-copier.js +9 -1
  196. package/src/utils/logger.js +32 -32
  197. package/src/utils/version-checker.js +175 -175
  198. /package/content/.claude/skills/{checklists → level-0-meta}/code-review.md +0 -0
  199. /package/content/.claude/skills/{checklists → level-0-meta}/simulation-checklist.md +0 -0
  200. /package/content/.claude/skills/{specialists → level-2-domains/ai-agents}/ai-system-architect.md +0 -0
  201. /package/content/.claude/skills/{specialists → level-2-domains/architecture}/po-pm-advisor.md +0 -0
  202. /package/content/.claude/skills/{specialists → level-2-domains/architecture}/standards-architect.md +0 -0
  203. /package/content/.claude/skills/{specialists → level-2-domains/backend}/dotnet-senior.md +0 -0
  204. /package/content/.claude/skills/{specialists → level-2-domains/backend}/ef-modeler.md +0 -0
  205. /package/content/.claude/skills/{specialists → level-2-domains/backend}/hangfire-orchestrator.md +0 -0
  206. /package/content/.claude/skills/{specialists → level-2-domains/backend}/ms-agent-expert.md +0 -0
  207. /package/content/.claude/skills/{stacks/dotnet-blazor.md → level-2-domains/frontend/blazor-builder.md} +0 -0
  208. /package/content/.claude/skills/{stacks/dotnet-nextjs.md → level-2-domains/frontend/nextjs-expert.md} +0 -0
  209. /package/content/.claude/skills/{specialists → level-2-domains/frontend}/ui-ux-designer.md +0 -0
  210. /package/content/.claude/skills/{specialists → level-2-domains/infrastructure}/azure-architect.md +0 -0
  211. /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/bicep-architect.md +0 -0
  212. /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/container-specialist.md +0 -0
  213. /package/content/.claude/skills/{infra → level-2-domains/infrastructure}/devops-engineer.md +0 -0
  214. /package/content/.claude/skills/{integrations → level-2-domains/integrations}/asaas-financial.md +0 -0
  215. /package/content/.claude/skills/{integrations → level-2-domains/integrations}/azure-identity.md +0 -0
  216. /package/content/.claude/skills/{integrations → level-2-domains/integrations}/clerk-auth.md +0 -0
  217. /package/content/.claude/skills/{integrations → level-2-domains/integrations}/resend-email.md +0 -0
  218. /package/content/.claude/skills/{specialists → level-2-domains/quality}/code-analyzer.md +0 -0
@@ -1,358 +1,358 @@
1
- // ==============================================================================
2
- // Micro-SaaS - Contracts
3
- // Interfaces, DTOs e Enums do exemplo Micro-SaaS
4
- // ==============================================================================
5
-
6
- namespace MicroSaaS.Contracts;
7
-
8
- // ==============================================================================
9
- // ENUMS
10
- // ==============================================================================
11
-
12
- public enum TenantStatus
13
- {
14
- Active,
15
- Suspended,
16
- Deleted
17
- }
18
-
19
- public enum TenantUserRole
20
- {
21
- Owner,
22
- Admin,
23
- Member,
24
- Viewer
25
- }
26
-
27
- public enum TenantUserStatus
28
- {
29
- Pending,
30
- Active,
31
- Inactive
32
- }
33
-
34
- public enum SubscriptionStatus
35
- {
36
- Trial,
37
- Active,
38
- PastDue,
39
- Canceled,
40
- Expired
41
- }
42
-
43
- public enum BillingCycle
44
- {
45
- Monthly,
46
- Yearly
47
- }
48
-
49
- public enum PaymentStatus
50
- {
51
- Pending,
52
- Confirmed,
53
- Received,
54
- Overdue,
55
- Refunded,
56
- Chargeback
57
- }
58
-
59
- public enum PaymentMethod
60
- {
61
- Pix,
62
- Boleto,
63
- CreditCard
64
- }
65
-
66
- // ==============================================================================
67
- // DTOs - TENANT
68
- // ==============================================================================
69
-
70
- public record CreateTenantRequest(
71
- string Name,
72
- string Slug,
73
- string OwnerEmail,
74
- string OwnerExternalId
75
- );
76
-
77
- public record UpdateTenantRequest(
78
- string Name,
79
- string? Description,
80
- string? LogoUrl
81
- );
82
-
83
- public record TenantResponse(
84
- int Id,
85
- string Name,
86
- string Slug,
87
- string? Description,
88
- string? LogoUrl,
89
- TenantStatus Status,
90
- string? CustomDomain,
91
- SubscriptionSummaryResponse? Subscription,
92
- DateTime CreatedAt
93
- );
94
-
95
- public record TenantSummaryResponse(
96
- int Id,
97
- string Name,
98
- string Slug,
99
- TenantStatus Status
100
- );
101
-
102
- // ==============================================================================
103
- // DTOs - TENANT USER
104
- // ==============================================================================
105
-
106
- public record InviteUserRequest(
107
- string Email,
108
- TenantUserRole Role = TenantUserRole.Member
109
- );
110
-
111
- public record UpdateUserRoleRequest(
112
- TenantUserRole Role
113
- );
114
-
115
- public record TenantUserResponse(
116
- int Id,
117
- string Email,
118
- string? Name,
119
- TenantUserRole Role,
120
- TenantUserStatus Status,
121
- DateTime? LastLoginAt,
122
- DateTime CreatedAt
123
- );
124
-
125
- // ==============================================================================
126
- // DTOs - PLAN
127
- // ==============================================================================
128
-
129
- public record PlanResponse(
130
- int Id,
131
- string Name,
132
- string? Description,
133
- decimal PriceMonthly,
134
- decimal PriceYearly,
135
- PlanLimits Limits,
136
- PlanFeatures Features,
137
- bool IsActive
138
- );
139
-
140
- public record PlanLimits(
141
- int MaxUsers,
142
- long MaxStorageBytes,
143
- int MaxApiRequestsPerMonth
144
- );
145
-
146
- public record PlanFeatures(
147
- bool CustomDomain,
148
- bool ApiAccess,
149
- bool PrioritySupport,
150
- bool AdvancedAnalytics
151
- );
152
-
153
- // ==============================================================================
154
- // DTOs - SUBSCRIPTION
155
- // ==============================================================================
156
-
157
- public record CreateSubscriptionRequest(
158
- int PlanId,
159
- BillingCycle BillingCycle,
160
- PaymentMethod PaymentMethod
161
- );
162
-
163
- public record UpgradeSubscriptionRequest(
164
- int NewPlanId,
165
- bool ImmediateUpgrade = true
166
- );
167
-
168
- public record SubscriptionResponse(
169
- int Id,
170
- int TenantId,
171
- PlanResponse Plan,
172
- SubscriptionStatus Status,
173
- BillingCycle BillingCycle,
174
- DateTime CurrentPeriodStart,
175
- DateTime CurrentPeriodEnd,
176
- DateTime? TrialEndsAt,
177
- DateTime? CanceledAt,
178
- string? AsaasSubscriptionId,
179
- DateTime CreatedAt
180
- );
181
-
182
- public record SubscriptionSummaryResponse(
183
- int Id,
184
- string PlanName,
185
- SubscriptionStatus Status,
186
- DateTime CurrentPeriodEnd,
187
- int DaysRemaining
188
- );
189
-
190
- // ==============================================================================
191
- // DTOs - PAYMENT
192
- // ==============================================================================
193
-
194
- public record PaymentResponse(
195
- int Id,
196
- decimal Amount,
197
- PaymentStatus Status,
198
- PaymentMethod Method,
199
- DateTime? PaidAt,
200
- DateTime DueDate,
201
- string? AsaasPaymentId,
202
- string? InvoiceUrl,
203
- string? PixQrCode,
204
- string? BoletoBarcode
205
- );
206
-
207
- // ==============================================================================
208
- // DTOs - DASHBOARD
209
- // ==============================================================================
210
-
211
- public record DashboardResponse(
212
- TenantSummaryResponse Tenant,
213
- SubscriptionSummaryResponse? Subscription,
214
- DashboardMetrics Metrics,
215
- IReadOnlyList<RecentActivityItem> RecentActivity
216
- );
217
-
218
- public record DashboardMetrics(
219
- int TotalUsers,
220
- int ActiveUsers,
221
- long StorageUsedBytes,
222
- long StorageLimitBytes,
223
- int ApiRequestsThisMonth,
224
- int ApiRequestsLimit
225
- );
226
-
227
- public record RecentActivityItem(
228
- string Description,
229
- string? UserId,
230
- string? UserName,
231
- DateTime Timestamp
232
- );
233
-
234
- // ==============================================================================
235
- // DTOs - WEBHOOKS
236
- // ==============================================================================
237
-
238
- public record AsaasWebhookPayload(
239
- string Event,
240
- AsaasPaymentData? Payment
241
- );
242
-
243
- public record AsaasPaymentData(
244
- string Id,
245
- string Customer,
246
- string? Subscription,
247
- decimal Value,
248
- decimal NetValue,
249
- string Status,
250
- string BillingType,
251
- DateTime? PaymentDate,
252
- DateTime DueDate
253
- );
254
-
255
- // ==============================================================================
256
- // INTERFACES - SERVICES
257
- // ==============================================================================
258
-
259
- public interface ITenantService
260
- {
261
- Task<TenantResponse> CreateAsync(CreateTenantRequest request, CancellationToken ct = default);
262
- Task<TenantResponse?> GetByIdAsync(int id, CancellationToken ct = default);
263
- Task<TenantResponse?> GetBySlugAsync(string slug, CancellationToken ct = default);
264
- Task<TenantResponse> UpdateAsync(int id, UpdateTenantRequest request, CancellationToken ct = default);
265
- Task SuspendAsync(int id, CancellationToken ct = default);
266
- Task ActivateAsync(int id, CancellationToken ct = default);
267
- }
268
-
269
- public interface ITenantUserService
270
- {
271
- Task<IReadOnlyList<TenantUserResponse>> GetByTenantAsync(int tenantId, CancellationToken ct = default);
272
- Task<TenantUserResponse> InviteAsync(int tenantId, InviteUserRequest request, CancellationToken ct = default);
273
- Task<TenantUserResponse> UpdateRoleAsync(int tenantId, int userId, UpdateUserRoleRequest request, CancellationToken ct = default);
274
- Task RemoveAsync(int tenantId, int userId, CancellationToken ct = default);
275
- Task RecordLoginAsync(string externalUserId, CancellationToken ct = default);
276
- }
277
-
278
- public interface ISubscriptionService
279
- {
280
- Task<SubscriptionResponse> CreateAsync(int tenantId, CreateSubscriptionRequest request, CancellationToken ct = default);
281
- Task<SubscriptionResponse?> GetCurrentAsync(int tenantId, CancellationToken ct = default);
282
- Task<SubscriptionResponse> UpgradeAsync(int tenantId, UpgradeSubscriptionRequest request, CancellationToken ct = default);
283
- Task CancelAsync(int tenantId, CancellationToken ct = default);
284
- Task<IReadOnlyList<PaymentResponse>> GetPaymentsAsync(int tenantId, CancellationToken ct = default);
285
- }
286
-
287
- public interface IPlanService
288
- {
289
- Task<IReadOnlyList<PlanResponse>> GetAllAsync(CancellationToken ct = default);
290
- Task<PlanResponse?> GetByIdAsync(int id, CancellationToken ct = default);
291
- }
292
-
293
- public interface IDashboardService
294
- {
295
- Task<DashboardResponse> GetDashboardAsync(int tenantId, CancellationToken ct = default);
296
- }
297
-
298
- public interface IWebhookService
299
- {
300
- Task HandleAsaasWebhookAsync(AsaasWebhookPayload payload, CancellationToken ct = default);
301
- }
302
-
303
- // ==============================================================================
304
- // INTERFACES - REPOSITORIES
305
- // ==============================================================================
306
-
307
- public interface ITenantRepository
308
- {
309
- Task<Tenant?> GetByIdAsync(int id, CancellationToken ct = default);
310
- Task<Tenant?> GetBySlugAsync(string slug, CancellationToken ct = default);
311
- Task<bool> SlugExistsAsync(string slug, CancellationToken ct = default);
312
- Task AddAsync(Tenant tenant, CancellationToken ct = default);
313
- void Update(Tenant tenant);
314
- }
315
-
316
- public interface ITenantUserRepository
317
- {
318
- Task<IReadOnlyList<TenantUser>> GetByTenantAsync(int tenantId, CancellationToken ct = default);
319
- Task<TenantUser?> GetByIdAsync(int id, CancellationToken ct = default);
320
- Task<TenantUser?> GetByExternalIdAsync(string externalUserId, CancellationToken ct = default);
321
- Task AddAsync(TenantUser user, CancellationToken ct = default);
322
- void Update(TenantUser user);
323
- void Remove(TenantUser user);
324
- }
325
-
326
- public interface ISubscriptionRepository
327
- {
328
- Task<Subscription?> GetByIdAsync(int id, CancellationToken ct = default);
329
- Task<Subscription?> GetCurrentByTenantAsync(int tenantId, CancellationToken ct = default);
330
- Task<Subscription?> GetByAsaasIdAsync(string asaasSubscriptionId, CancellationToken ct = default);
331
- Task AddAsync(Subscription subscription, CancellationToken ct = default);
332
- void Update(Subscription subscription);
333
- }
334
-
335
- public interface IPlanRepository
336
- {
337
- Task<IReadOnlyList<Plan>> GetAllActiveAsync(CancellationToken ct = default);
338
- Task<Plan?> GetByIdAsync(int id, CancellationToken ct = default);
339
- }
340
-
341
- public interface IPaymentRepository
342
- {
343
- Task<IReadOnlyList<SubscriptionPayment>> GetBySubscriptionAsync(int subscriptionId, CancellationToken ct = default);
344
- Task<SubscriptionPayment?> GetByAsaasIdAsync(string asaasPaymentId, CancellationToken ct = default);
345
- Task AddAsync(SubscriptionPayment payment, CancellationToken ct = default);
346
- void Update(SubscriptionPayment payment);
347
- }
348
-
349
- // ==============================================================================
350
- // PLACEHOLDER ENTITY REFERENCES (implementados em Domain)
351
- // ==============================================================================
352
-
353
- // Estas classes são placeholders - a implementação real está em Domain/Entities
354
- public class Tenant { public int Id { get; set; } }
355
- public class TenantUser { public int Id { get; set; } }
356
- public class Subscription { public int Id { get; set; } }
357
- public class Plan { public int Id { get; set; } }
358
- public class SubscriptionPayment { public int Id { get; set; } }
1
+ // ==============================================================================
2
+ // Micro-SaaS - Contracts
3
+ // Interfaces, DTOs e Enums do exemplo Micro-SaaS
4
+ // ==============================================================================
5
+
6
+ namespace MicroSaaS.Contracts;
7
+
8
+ // ==============================================================================
9
+ // ENUMS
10
+ // ==============================================================================
11
+
12
+ public enum TenantStatus
13
+ {
14
+ Active,
15
+ Suspended,
16
+ Deleted
17
+ }
18
+
19
+ public enum TenantUserRole
20
+ {
21
+ Owner,
22
+ Admin,
23
+ Member,
24
+ Viewer
25
+ }
26
+
27
+ public enum TenantUserStatus
28
+ {
29
+ Pending,
30
+ Active,
31
+ Inactive
32
+ }
33
+
34
+ public enum SubscriptionStatus
35
+ {
36
+ Trial,
37
+ Active,
38
+ PastDue,
39
+ Canceled,
40
+ Expired
41
+ }
42
+
43
+ public enum BillingCycle
44
+ {
45
+ Monthly,
46
+ Yearly
47
+ }
48
+
49
+ public enum PaymentStatus
50
+ {
51
+ Pending,
52
+ Confirmed,
53
+ Received,
54
+ Overdue,
55
+ Refunded,
56
+ Chargeback
57
+ }
58
+
59
+ public enum PaymentMethod
60
+ {
61
+ Pix,
62
+ Boleto,
63
+ CreditCard
64
+ }
65
+
66
+ // ==============================================================================
67
+ // DTOs - TENANT
68
+ // ==============================================================================
69
+
70
+ public record CreateTenantRequest(
71
+ string Name,
72
+ string Slug,
73
+ string OwnerEmail,
74
+ string OwnerExternalId
75
+ );
76
+
77
+ public record UpdateTenantRequest(
78
+ string Name,
79
+ string? Description,
80
+ string? LogoUrl
81
+ );
82
+
83
+ public record TenantResponse(
84
+ int Id,
85
+ string Name,
86
+ string Slug,
87
+ string? Description,
88
+ string? LogoUrl,
89
+ TenantStatus Status,
90
+ string? CustomDomain,
91
+ SubscriptionSummaryResponse? Subscription,
92
+ DateTime CreatedAt
93
+ );
94
+
95
+ public record TenantSummaryResponse(
96
+ int Id,
97
+ string Name,
98
+ string Slug,
99
+ TenantStatus Status
100
+ );
101
+
102
+ // ==============================================================================
103
+ // DTOs - TENANT USER
104
+ // ==============================================================================
105
+
106
+ public record InviteUserRequest(
107
+ string Email,
108
+ TenantUserRole Role = TenantUserRole.Member
109
+ );
110
+
111
+ public record UpdateUserRoleRequest(
112
+ TenantUserRole Role
113
+ );
114
+
115
+ public record TenantUserResponse(
116
+ int Id,
117
+ string Email,
118
+ string? Name,
119
+ TenantUserRole Role,
120
+ TenantUserStatus Status,
121
+ DateTime? LastLoginAt,
122
+ DateTime CreatedAt
123
+ );
124
+
125
+ // ==============================================================================
126
+ // DTOs - PLAN
127
+ // ==============================================================================
128
+
129
+ public record PlanResponse(
130
+ int Id,
131
+ string Name,
132
+ string? Description,
133
+ decimal PriceMonthly,
134
+ decimal PriceYearly,
135
+ PlanLimits Limits,
136
+ PlanFeatures Features,
137
+ bool IsActive
138
+ );
139
+
140
+ public record PlanLimits(
141
+ int MaxUsers,
142
+ long MaxStorageBytes,
143
+ int MaxApiRequestsPerMonth
144
+ );
145
+
146
+ public record PlanFeatures(
147
+ bool CustomDomain,
148
+ bool ApiAccess,
149
+ bool PrioritySupport,
150
+ bool AdvancedAnalytics
151
+ );
152
+
153
+ // ==============================================================================
154
+ // DTOs - SUBSCRIPTION
155
+ // ==============================================================================
156
+
157
+ public record CreateSubscriptionRequest(
158
+ int PlanId,
159
+ BillingCycle BillingCycle,
160
+ PaymentMethod PaymentMethod
161
+ );
162
+
163
+ public record UpgradeSubscriptionRequest(
164
+ int NewPlanId,
165
+ bool ImmediateUpgrade = true
166
+ );
167
+
168
+ public record SubscriptionResponse(
169
+ int Id,
170
+ int TenantId,
171
+ PlanResponse Plan,
172
+ SubscriptionStatus Status,
173
+ BillingCycle BillingCycle,
174
+ DateTime CurrentPeriodStart,
175
+ DateTime CurrentPeriodEnd,
176
+ DateTime? TrialEndsAt,
177
+ DateTime? CanceledAt,
178
+ string? AsaasSubscriptionId,
179
+ DateTime CreatedAt
180
+ );
181
+
182
+ public record SubscriptionSummaryResponse(
183
+ int Id,
184
+ string PlanName,
185
+ SubscriptionStatus Status,
186
+ DateTime CurrentPeriodEnd,
187
+ int DaysRemaining
188
+ );
189
+
190
+ // ==============================================================================
191
+ // DTOs - PAYMENT
192
+ // ==============================================================================
193
+
194
+ public record PaymentResponse(
195
+ int Id,
196
+ decimal Amount,
197
+ PaymentStatus Status,
198
+ PaymentMethod Method,
199
+ DateTime? PaidAt,
200
+ DateTime DueDate,
201
+ string? AsaasPaymentId,
202
+ string? InvoiceUrl,
203
+ string? PixQrCode,
204
+ string? BoletoBarcode
205
+ );
206
+
207
+ // ==============================================================================
208
+ // DTOs - DASHBOARD
209
+ // ==============================================================================
210
+
211
+ public record DashboardResponse(
212
+ TenantSummaryResponse Tenant,
213
+ SubscriptionSummaryResponse? Subscription,
214
+ DashboardMetrics Metrics,
215
+ IReadOnlyList<RecentActivityItem> RecentActivity
216
+ );
217
+
218
+ public record DashboardMetrics(
219
+ int TotalUsers,
220
+ int ActiveUsers,
221
+ long StorageUsedBytes,
222
+ long StorageLimitBytes,
223
+ int ApiRequestsThisMonth,
224
+ int ApiRequestsLimit
225
+ );
226
+
227
+ public record RecentActivityItem(
228
+ string Description,
229
+ string? UserId,
230
+ string? UserName,
231
+ DateTime Timestamp
232
+ );
233
+
234
+ // ==============================================================================
235
+ // DTOs - WEBHOOKS
236
+ // ==============================================================================
237
+
238
+ public record AsaasWebhookPayload(
239
+ string Event,
240
+ AsaasPaymentData? Payment
241
+ );
242
+
243
+ public record AsaasPaymentData(
244
+ string Id,
245
+ string Customer,
246
+ string? Subscription,
247
+ decimal Value,
248
+ decimal NetValue,
249
+ string Status,
250
+ string BillingType,
251
+ DateTime? PaymentDate,
252
+ DateTime DueDate
253
+ );
254
+
255
+ // ==============================================================================
256
+ // INTERFACES - SERVICES
257
+ // ==============================================================================
258
+
259
+ public interface ITenantService
260
+ {
261
+ Task<TenantResponse> CreateAsync(CreateTenantRequest request, CancellationToken ct = default);
262
+ Task<TenantResponse?> GetByIdAsync(int id, CancellationToken ct = default);
263
+ Task<TenantResponse?> GetBySlugAsync(string slug, CancellationToken ct = default);
264
+ Task<TenantResponse> UpdateAsync(int id, UpdateTenantRequest request, CancellationToken ct = default);
265
+ Task SuspendAsync(int id, CancellationToken ct = default);
266
+ Task ActivateAsync(int id, CancellationToken ct = default);
267
+ }
268
+
269
+ public interface ITenantUserService
270
+ {
271
+ Task<IReadOnlyList<TenantUserResponse>> GetByTenantAsync(int tenantId, CancellationToken ct = default);
272
+ Task<TenantUserResponse> InviteAsync(int tenantId, InviteUserRequest request, CancellationToken ct = default);
273
+ Task<TenantUserResponse> UpdateRoleAsync(int tenantId, int userId, UpdateUserRoleRequest request, CancellationToken ct = default);
274
+ Task RemoveAsync(int tenantId, int userId, CancellationToken ct = default);
275
+ Task RecordLoginAsync(string externalUserId, CancellationToken ct = default);
276
+ }
277
+
278
+ public interface ISubscriptionService
279
+ {
280
+ Task<SubscriptionResponse> CreateAsync(int tenantId, CreateSubscriptionRequest request, CancellationToken ct = default);
281
+ Task<SubscriptionResponse?> GetCurrentAsync(int tenantId, CancellationToken ct = default);
282
+ Task<SubscriptionResponse> UpgradeAsync(int tenantId, UpgradeSubscriptionRequest request, CancellationToken ct = default);
283
+ Task CancelAsync(int tenantId, CancellationToken ct = default);
284
+ Task<IReadOnlyList<PaymentResponse>> GetPaymentsAsync(int tenantId, CancellationToken ct = default);
285
+ }
286
+
287
+ public interface IPlanService
288
+ {
289
+ Task<IReadOnlyList<PlanResponse>> GetAllAsync(CancellationToken ct = default);
290
+ Task<PlanResponse?> GetByIdAsync(int id, CancellationToken ct = default);
291
+ }
292
+
293
+ public interface IDashboardService
294
+ {
295
+ Task<DashboardResponse> GetDashboardAsync(int tenantId, CancellationToken ct = default);
296
+ }
297
+
298
+ public interface IWebhookService
299
+ {
300
+ Task HandleAsaasWebhookAsync(AsaasWebhookPayload payload, CancellationToken ct = default);
301
+ }
302
+
303
+ // ==============================================================================
304
+ // INTERFACES - REPOSITORIES
305
+ // ==============================================================================
306
+
307
+ public interface ITenantRepository
308
+ {
309
+ Task<Tenant?> GetByIdAsync(int id, CancellationToken ct = default);
310
+ Task<Tenant?> GetBySlugAsync(string slug, CancellationToken ct = default);
311
+ Task<bool> SlugExistsAsync(string slug, CancellationToken ct = default);
312
+ Task AddAsync(Tenant tenant, CancellationToken ct = default);
313
+ void Update(Tenant tenant);
314
+ }
315
+
316
+ public interface ITenantUserRepository
317
+ {
318
+ Task<IReadOnlyList<TenantUser>> GetByTenantAsync(int tenantId, CancellationToken ct = default);
319
+ Task<TenantUser?> GetByIdAsync(int id, CancellationToken ct = default);
320
+ Task<TenantUser?> GetByExternalIdAsync(string externalUserId, CancellationToken ct = default);
321
+ Task AddAsync(TenantUser user, CancellationToken ct = default);
322
+ void Update(TenantUser user);
323
+ void Remove(TenantUser user);
324
+ }
325
+
326
+ public interface ISubscriptionRepository
327
+ {
328
+ Task<Subscription?> GetByIdAsync(int id, CancellationToken ct = default);
329
+ Task<Subscription?> GetCurrentByTenantAsync(int tenantId, CancellationToken ct = default);
330
+ Task<Subscription?> GetByAsaasIdAsync(string asaasSubscriptionId, CancellationToken ct = default);
331
+ Task AddAsync(Subscription subscription, CancellationToken ct = default);
332
+ void Update(Subscription subscription);
333
+ }
334
+
335
+ public interface IPlanRepository
336
+ {
337
+ Task<IReadOnlyList<Plan>> GetAllActiveAsync(CancellationToken ct = default);
338
+ Task<Plan?> GetByIdAsync(int id, CancellationToken ct = default);
339
+ }
340
+
341
+ public interface IPaymentRepository
342
+ {
343
+ Task<IReadOnlyList<SubscriptionPayment>> GetBySubscriptionAsync(int subscriptionId, CancellationToken ct = default);
344
+ Task<SubscriptionPayment?> GetByAsaasIdAsync(string asaasPaymentId, CancellationToken ct = default);
345
+ Task AddAsync(SubscriptionPayment payment, CancellationToken ct = default);
346
+ void Update(SubscriptionPayment payment);
347
+ }
348
+
349
+ // ==============================================================================
350
+ // PLACEHOLDER ENTITY REFERENCES (implementados em Domain)
351
+ // ==============================================================================
352
+
353
+ // Estas classes são placeholders - a implementação real está em Domain/Entities
354
+ public class Tenant { public int Id { get; set; } }
355
+ public class TenantUser { public int Id { get; set; } }
356
+ public class Subscription { public int Id { get; set; } }
357
+ public class Plan { public int Id { get; set; } }
358
+ public class SubscriptionPayment { public int Id { get; set; } }