go-duck-cli 1.0.9 → 1.1.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.
Files changed (70) hide show
  1. package/README.md +30 -15
  2. package/generators/ai_docs.js +130 -0
  3. package/generators/broker.js +63 -0
  4. package/generators/config.js +149 -7
  5. package/generators/devops.js +210 -43
  6. package/generators/docs.js +23 -4
  7. package/generators/elasticsearch.js +263 -0
  8. package/generators/kratos.js +229 -41
  9. package/generators/metering.js +280 -48
  10. package/generators/migrations.js +92 -198
  11. package/generators/mqtt.js +2 -39
  12. package/generators/multitenancy.js +274 -71
  13. package/generators/nats.js +39 -0
  14. package/generators/outbox.js +171 -0
  15. package/generators/postgrest.js +7 -3
  16. package/generators/postman.js +405 -0
  17. package/generators/repository.js +27 -0
  18. package/generators/router.js +27 -0
  19. package/generators/security.js +95 -14
  20. package/generators/serverless.js +147 -0
  21. package/generators/storage.js +589 -0
  22. package/generators/swagger.js +84 -60
  23. package/generators/telemetry.js +23 -32
  24. package/generators/websocket.js +55 -21
  25. package/index.js +481 -116
  26. package/package.json +6 -4
  27. package/parser/gdl.js +163 -24
  28. package/templates/docs/index.html.hbs +5 -5
  29. package/templates/docs/layout.hbs +221 -62
  30. package/templates/docs/pages/audit.hbs +83 -35
  31. package/templates/docs/pages/cli.hbs +18 -0
  32. package/templates/docs/pages/configuration.hbs +241 -0
  33. package/templates/docs/pages/datadog.hbs +46 -0
  34. package/templates/docs/pages/elasticsearch.hbs +121 -0
  35. package/templates/docs/pages/federation.hbs +241 -0
  36. package/templates/docs/pages/gdl-advanced.hbs +91 -0
  37. package/templates/docs/pages/gdl-annotations.hbs +137 -0
  38. package/templates/docs/pages/gdl-entities.hbs +134 -0
  39. package/templates/docs/pages/gdl-relationships.hbs +80 -0
  40. package/templates/docs/pages/gdl.hbs +60 -204
  41. package/templates/docs/pages/graphql.hbs +58 -44
  42. package/templates/docs/pages/grpc.hbs +53 -90
  43. package/templates/docs/pages/hybrid-store.hbs +127 -0
  44. package/templates/docs/pages/index.hbs +418 -149
  45. package/templates/docs/pages/keycloak.hbs +43 -0
  46. package/templates/docs/pages/legend.hbs +116 -0
  47. package/templates/docs/pages/mosquitto.hbs +39 -0
  48. package/templates/docs/pages/multitenancy.hbs +139 -71
  49. package/templates/docs/pages/otel.hbs +40 -0
  50. package/templates/docs/pages/realtime.hbs +38 -12
  51. package/templates/docs/pages/redis.hbs +40 -0
  52. package/templates/docs/pages/rest.hbs +120 -202
  53. package/templates/docs/pages/saga.hbs +94 -0
  54. package/templates/docs/pages/security.hbs +150 -44
  55. package/templates/docs/pages/serverless.hbs +157 -0
  56. package/templates/docs/pages/storage.hbs +127 -0
  57. package/templates/docs/pages/wizard.hbs +683 -0
  58. package/templates/docs/triple_identity_registry.png +0 -0
  59. package/templates/go/controller.go.hbs +287 -283
  60. package/templates/go/entity.go.hbs +17 -15
  61. package/templates/go/main.go.hbs +47 -180
  62. package/templates/go/migrator.go.hbs +65 -0
  63. package/templates/go/router.go.hbs +272 -0
  64. package/templates/graphql/resolver.go.hbs +53 -34
  65. package/templates/graphql/schema.graphql.hbs +17 -5
  66. package/templates/kratos/service.go.hbs +169 -34
  67. package/templates/proto/entity.proto.hbs +10 -14
  68. package/test_nested.gdl +21 -0
  69. package/templates/docs/intro.mp4 +0 -0
  70. package/test_parser.js +0 -9
@@ -1,227 +1,145 @@
1
- <div class="mb-10 text-center lg:text-left border-b border-slate-200 pb-8 text-neutral-900">
2
- <div class="inline-flex items-center px-3 py-1 rounded-full bg-indigo-100 text-indigo-700 text-xs font-semibold tracking-wide uppercase mb-4">
3
- Communication Layer
4
- </div>
5
- <h1 class="text-4xl lg:text-5xl font-extrabold text-slate-900 tracking-tight leading-tight mb-4">REST & Search API</h1>
6
- <p class="text-lg lg:text-xl text-slate-600 max-w-2xl leading-relaxed">High-performance, tenant-aware JSON endpoints powered by Gin Gonic and GORM.</p>
7
- </div>
8
-
9
- <!-- Mode Overview -->
10
- <div class="grid grid-cols-1 md:grid-cols-2 gap-8 mb-12">
11
- <div class="bg-gradient-to-br from-indigo-600 to-indigo-800 p-8 rounded-[2rem] text-white shadow-xl shadow-indigo-200/50">
12
- <h3 class="text-xl font-bold mb-3 flex items-center">
13
- <svg class="w-6 h-6 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"></path></svg>
14
- Entity-Specific CRUD
15
- </h3>
16
- <p class="text-indigo-100 text-sm leading-relaxed mb-6">Standard strongly-typed controllers for every entity. Includes built-in caching, MQTT eventing, and multi-tenancy.</p>
17
- <div class="text-xs font-mono bg-white/10 p-3 rounded-xl border border-white/20">
18
- GET /api/articles<br>
19
- GET /api/articles/:id?eager=true
20
- </div>
21
- </div>
22
- <div class="bg-gradient-to-br from-slate-800 to-slate-900 p-8 rounded-[2rem] text-white shadow-xl shadow-slate-300/50">
23
- <h3 class="text-xl font-bold mb-3 flex items-center">
24
- <svg class="w-6 h-6 mr-3 text-emerald-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path></svg>
25
- Generic Search RPC
26
- </h3>
27
- <p class="text-slate-300 text-sm leading-relaxed mb-6">A single, ultra-flexible engine mirroring PostgREST. Filter by any column using powerful operators WITHOUT writing code.</p>
28
- <div class="text-xs font-mono bg-white/10 p-3 rounded-xl border border-white/20">
29
- GET /api/rpc/articles?status=eq.PUBLISHED<br>
30
- GET /api/rpc/articles?id=gt.100&order=id.desc
1
+ <div class="prose prose-slate max-w-none">
2
+ <!-- Marketing Hero -->
3
+ <div class="flex items-center space-x-3 mb-8">
4
+ <div class="p-4 bg-gradient-to-br from-indigo-600 to-indigo-800 rounded-2xl shadow-lg shadow-indigo-200">
5
+ <svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
6
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z" />
7
+ </svg>
31
8
  </div>
9
+ <h1 class="text-5xl font-black text-slate-900 m-0 tracking-tight leading-tight">PostgREST-like <br><span class="text-indigo-600 italic">RPC Search Engine.</span></h1>
32
10
  </div>
33
- </div>
34
11
 
35
- <section class="mb-12">
36
- <h2 class="text-2xl font-bold text-slate-800 mb-6 flex items-center">
37
- <span class="w-8 h-8 rounded-lg bg-indigo-100 text-indigo-600 flex items-center justify-center mr-3 text-sm">
38
- <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16m-7 6h7"></path></svg>
39
- </span>
40
- Standard Controller Features
41
- </h2>
12
+ <p class="text-2xl text-slate-500 font-medium mb-12 leading-relaxed">
13
+ Stop writing boiler-plate search controllers. GO-DUCK generates an high-performance, unified RPC layer for deep, transactional querying across your multi-silo empire.
14
+ </p>
42
15
 
43
- <div class="space-y-8">
44
- <!-- Relationship Loading -->
45
- <div class="bg-white border border-slate-200 rounded-2xl p-6 shadow-sm">
46
- <h4 class="font-bold text-slate-900 mb-3">📦 Eager vs. Lazy Loading</h4>
47
- <p class="text-slate-600 text-sm mb-4 leading-relaxed">
48
- By default, entities are loaded <strong>Lazily</strong> (IDs only for foreign keys). To perform a Join and fetch the full object graph, use the <code class="bg-slate-100 px-1 py-0.5 rounded text-indigo-600 font-mono">eager</code> parameter.
49
- </p>
50
- <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
51
- <div class="bg-slate-50 p-4 rounded-xl">
52
- <span class="text-[10px] font-bold uppercase tracking-widest text-slate-400">Lazy (Default)</span>
53
- <p class="font-mono text-xs mt-2 text-slate-700">GET /api/article/1</p>
54
- </div>
55
- <div class="bg-emerald-50 p-4 rounded-xl">
56
- <span class="text-[10px] font-bold uppercase tracking-widest text-emerald-500">Eager (Joined)</span>
57
- <p class="font-mono text-xs mt-2 text-slate-700">GET /api/article/1?eager=true</p>
58
- </div>
59
- </div>
16
+ <!-- Key Features Highlights -->
17
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-8 mb-16">
18
+ <div class="p-8 bg-slate-50 rounded-3xl border border-slate-100 shadow-sm border-l-4 border-l-orange-500">
19
+ <h4 class="font-bold text-slate-900 mb-2 italic tracking-tight">Pure Full-Text Search</h4>
20
+ <p class="text-xs text-slate-600">Native <strong>Elasticsearch</strong> engine for sub-millisecond fuzzy matching on millions of records.</p>
60
21
  </div>
22
+ <div class="p-8 bg-slate-50 rounded-3xl border border-slate-100 shadow-sm border-l-4 border-l-indigo-600">
23
+ <h4 class="font-bold text-slate-900 mb-2 italic tracking-tight">Transactional RPC</h4>
24
+ <p class="text-xs text-slate-600">Dynamic, server-side filtering with <code>?filter=eq.val</code> directly on your GORM models.</p>
25
+ </div>
26
+ <div class="p-8 bg-slate-50 rounded-3xl border border-slate-100 shadow-sm border-l-4 border-l-purple-600">
27
+ <h4 class="font-bold text-slate-900 mb-2 italic tracking-tight">Postgres Arrow Power</h4>
28
+ <p class="text-xs text-slate-600">Query your <strong>JSONB</strong> fields using Postgres arrow operators (<code>-></code>, <code>->></code>) in your URI.</p>
29
+ </div>
30
+ </div>
61
31
 
62
- <!-- Pagination -->
63
- <div class="bg-white border border-slate-200 rounded-2xl p-6 shadow-sm">
64
- <h4 class="font-bold text-slate-900 mb-3">📏 Offset Pagination</h4>
65
- <p class="text-slate-600 text-sm mb-4 leading-relaxed">
66
- All collection endpoints support built-in pagination to keep your frontend lightning fast.
67
- </p>
68
- <table class="w-full text-xs text-left border-collapse">
69
- <thead>
70
- <tr class="text-slate-400 border-b border-slate-100">
71
- <th class="py-2">Parameter</th>
72
- <th class="py-2">Description</th>
73
- <th class="py-2">Default</th>
32
+ <!-- API ENDPOINT MAP -->
33
+ <section class="mb-20">
34
+ <h2 class="text-3xl font-black text-slate-900 mb-8 tracking-tight">API Reference & Endpoint Map</h2>
35
+ <div class="overflow-x-auto rounded-[2.5rem] border border-slate-200 shadow-sm transition-all duration-300">
36
+ <table class="min-w-full divide-y divide-slate-200">
37
+ <thead class="bg-indigo-50/50 text-indigo-900">
38
+ <tr>
39
+ <th class="px-6 py-4 text-left text-xs font-black uppercase tracking-widest">Verb</th>
40
+ <th class="px-6 py-4 text-left text-xs font-black uppercase tracking-widest">Endpoint Pattern</th>
41
+ <th class="px-6 py-4 text-left text-xs font-black uppercase tracking-widest">Discovery Power</th>
74
42
  </tr>
75
43
  </thead>
76
- <tbody class="text-slate-700">
77
- <tr class="border-b border-slate-50"><td class="py-3 font-mono font-bold">page</td><td class="py-3">The index of the page to fetch</td><td class="py-3">0</td></tr>
78
- <tr class="border-b border-slate-50"><td class="py-3 font-mono font-bold">size</td><td class="py-3">Number of records per page</td><td class="py-3">20</td></tr>
44
+ <tbody class="bg-white divide-y divide-slate-100 text-sm italic font-medium">
45
+ <tr class="bg-orange-50/20"><td class="px-6 py-4 font-bold text-orange-600">GET</td><td class="px-6 py-4 font-mono">/api/search/{entity}?q=keyword</td><td class="px-6 py-4 font-bold text-orange-800">Elite Elasticsearch Fuzzy Search</td></tr>
46
+ <tr><td class="px-6 py-4 font-bold text-green-600">GET</td><td class="px-6 py-4 font-mono">/api/v1/{entity}</td><td class="px-6 py-4 text-slate-600">List and Search with GORM Filter Logic</td></tr>
47
+ <tr><td class="px-6 py-4 font-bold text-orange-600">POST</td><td class="px-6 py-4 font-mono">/api/v1/{entity}</td><td class="px-6 py-4 text-slate-600">Atomic Primary Write + Saga Multi-Broadcast</td></tr>
48
+ <tr><td class="px-6 py-4 font-bold text-purple-600">PATCH</td><td class="px-6 py-4 font-mono">/api/v1/{entity}/{id}</td><td class="px-6 py-4 text-slate-600">Partial Update (Single Silo or Global)</td></tr>
49
+ <tr><td class="px-6 py-4 font-bold text-red-600">DELETE</td><td class="px-6 py-4 font-mono">/api/v1/{entity}/{id}</td><td class="px-6 py-4 text-slate-600">Distributed Atomic Deletion</td></tr>
50
+ <tr class="bg-indigo-50/30"><td class="px-6 py-4 font-bold text-indigo-800">POST</td><td class="px-6 py-4 font-mono">/api/v1/{entity}/bulk</td><td class="px-6 py-4 text-indigo-900">Bulk Multi-Silo Transaction</td></tr>
51
+ <tr class="bg-slate-900"><td class="px-6 py-4 font-bold text-yellow-400">GET</td><td class="px-6 py-4 font-mono text-slate-300">/api/admin/audit</td><td class="px-6 py-4 text-slate-400">Centralized Audit Log Retrieval (SuperAdmin)</td></tr>
52
+ <tr class="bg-slate-900"><td class="px-6 py-4 font-bold text-yellow-400">POST</td><td class="px-6 py-4 font-mono text-slate-300">/management/tenant/assign</td><td class="px-6 py-4 text-slate-400">Dynamic Tenant DB Provisioning (SuperAdmin)</td></tr>
79
53
  </tbody>
80
54
  </table>
81
55
  </div>
56
+ </section>
82
57
 
83
- <!-- Distributed Caching -->
84
- <div class="bg-gradient-to-r from-blue-500 to-indigo-600 rounded-2xl p-6 text-white text-sm shadow-lg">
85
- <div class="flex items-start">
86
- <div class="bg-white/20 p-2 rounded-lg mr-4">
87
- <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg>
88
- </div>
89
- <div>
90
- <h4 class="font-bold mb-1">Distributed Redis Shield</h4>
91
- <p class="text-blue-50 leading-relaxed">
92
- Every <code class="bg-white/20 px-1 rounded">GetByID</code> request is automatically protected by a Redis cache layer. Mutations (Create/Update/Delete) trigger <strong>Automatic Cache Invalidation</strong> across the cluster, ensuring data consistency with zero effort.
93
- </p>
58
+ <!-- SILO NARROWING MASTERCLASS -->
59
+ <section class="mb-20">
60
+ <h2 class="text-3xl font-black text-slate-900 mb-8 tracking-tight italic underline decoration-blue-600 underline-offset-8">Silo Precision: Transactional Isolation</h2>
61
+ <div class="bg-slate-900 rounded-[3rem] p-12 text-white shadow-2xl relative overflow-hidden">
62
+ <div class="relative z-10">
63
+ <p class="text-lg text-slate-300 mb-8 leading-relaxed italic">
64
+ While GO-DUCK defaults to global federation, sometimes you need surgical precision. Our <strong>Dual-Path Orchestrator</strong> is controlled by your headers.
65
+ </p>
66
+
67
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-8">
68
+ <div class="p-8 bg-slate-800 rounded-3xl border border-white/10">
69
+ <h4 class="text-blue-400 font-bold mb-4">Federal Broadcast (Default)</h4>
70
+ <p class="text-xs text-slate-400 mb-4 font-mono uppercase tracking-widest font-black">Headers: Empty</p>
71
+ <p class="text-sm text-slate-200">Writes synchronize to all silos. Reads aggregate data from the entire dealership empire into a single view.</p>
72
+ </div>
73
+ <div class="p-8 border-2 border-blue-500/50 bg-blue-600/10 rounded-3xl">
74
+ <h4 class="text-green-400 font-bold mb-4">Silo Narrowing (Precision)</h4>
75
+ <p class="text-xs text-green-400 mb-4 font-mono uppercase tracking-widest font-black">X-Tenant-ID: {Opaque-Silo-ID}</p>
76
+ <p class="text-sm text-slate-200">Bypasses federation. Reads and writes are isolated to <strong>ONLY</strong> that specific silo. Perfect for site-specific audits or sensitive data entries.</p>
77
+ </div>
94
78
  </div>
95
79
  </div>
96
80
  </div>
97
- </div>
98
- </section>
81
+ </section>
99
82
 
100
- <section class="mb-12">
101
- <h2 class="text-2xl font-bold text-slate-800 mb-6 flex items-center">
102
- <span class="w-8 h-8 rounded-lg bg-emerald-100 text-emerald-600 flex items-center justify-center mr-3 text-sm">
103
- <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path></svg>
104
- </span>
105
- Generic Search RPC Engine
106
- </h2>
107
- <p class="mb-6 text-slate-600 leading-relaxed text-sm">Accessed via <code class="bg-slate-100 px-1 py-0.5 rounded text-indigo-600 font-mono">/api/rpc/:tableName</code>, this engine provides a dynamic interface to your database.</p>
108
-
109
- <div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-8 text-sm">
110
- <div class="bg-slate-900 rounded-2xl p-6 text-slate-300 font-mono text-xs overflow-x-auto">
111
- <span class="text-emerald-400"># Complex query example</span><br>
112
- curl -X GET "http://localhost:8080/api/rpc/articles?status=eq.PUBLISHED&views=gt.500&order=views.desc&limit=5"
113
- </div>
114
- <div class="bg-slate-50 border border-slate-200 rounded-2xl p-6">
115
- <h5 class="text-slate-900 font-bold mb-3">Supported Operators</h5>
116
- <div class="grid grid-cols-2 gap-2 text-[11px] font-mono">
117
- <div class="flex justify-between border-b pb-1"><span>eq</span><span class="text-indigo-600">Equals</span></div>
118
- <div class="flex justify-between border-b pb-1"><span>neq</span><span class="text-indigo-600">Not Equals</span></div>
119
- <div class="flex justify-between border-b pb-1"><span>gt / gte</span><span class="text-indigo-600">Greater Than</span></div>
120
- <div class="flex justify-between border-b pb-1"><span>lt / lte</span><span class="text-indigo-600">Less Than</span></div>
121
- <div class="flex justify-between border-b pb-1"><span>like</span><span class="text-indigo-600">Search (%)</span></div>
122
- <div class="flex justify-between border-b pb-1"><span>ilike</span><span class="text-indigo-600">Case-Insensitive</span></div>
123
- <div class="flex justify-between border-b pb-1"><span>in</span><span class="text-indigo-600">List (1,2,3)</span></div>
83
+ <!-- BULK OPERATIONS -->
84
+ <section class="mb-20">
85
+ <h2 class="text-3xl font-black text-slate-900 mb-8 tracking-tight">Industrial Velocity: Bulk Operations</h2>
86
+ <div class="bg-indigo-900 rounded-[3rem] p-10 text-white shadow-2xl relative overflow-hidden">
87
+ <div class="absolute top-0 right-0 w-64 h-64 bg-indigo-500/20 blur-3xl -mr-32 -mt-32"></div>
88
+ <div class="relative z-10">
89
+ <p class="text-lg text-indigo-100 mb-8 leading-relaxed italic">
90
+ For high-velocity data ingestion, GO-DUCK generates transaction-aware <strong>Bulk Endpoints</strong>. A single request can mutate thousands of records across your silos.
91
+ </p>
92
+
93
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-8">
94
+ <div class="p-6 bg-slate-800 rounded-2xl border border-white/5">
95
+ <h4 class="text-indigo-400 font-bold mb-2">Endpoint: POST /api/v1/{entity}/bulk</h4>
96
+ <p class="text-xs text-slate-400 mb-4 font-mono font-black italic">Payload: Array of Objects</p>
97
+ <pre class="bg-slate-900 p-4 rounded-xl text-xs text-indigo-300"><code>[
98
+ { "make": "Tesla", "model": "Model S" },
99
+ { "make": "Lucid", "model": "Air" }
100
+ ]</code></pre>
101
+ </div>
102
+ <div class="p-6 bg-slate-800 rounded-2xl border border-white/5">
103
+ <h4 class="text-emerald-400 font-bold mb-2">Atomic & Federated</h4>
104
+ <p class="text-sm text-slate-300">Bulk operations are wrapped in a database transaction. If one record fails validation or insertion, the entire batch is rolled back across all Silos.</p>
105
+ </div>
106
+ </div>
124
107
  </div>
125
108
  </div>
126
- </div>
109
+ </section>
127
110
 
128
- <!-- JSON Querying Section -->
129
- <div class="bg-white border border-slate-200 rounded-2xl p-8 shadow-sm">
130
- <h4 class="text-xl font-bold text-slate-900 mb-4 flex items-center">
131
- <svg class="w-6 h-6 mr-3 text-indigo-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4"></path></svg>
132
- Deep JSON/JSONB Querying
133
- </h4>
134
- <p class="text-slate-600 text-sm mb-6 leading-relaxed">
135
- The GO-DUCK generator natively supports PostgreSQL JSONB operators. You can drill down into nested fields directly from the URL using arrow notation.
136
- </p>
137
-
138
- <div class="space-y-4">
139
- <div class="bg-slate-50 p-5 rounded-xl border border-slate-100">
140
- <div class="flex items-center justify-between mb-2">
141
- <span class="text-xs font-bold text-indigo-600 uppercase tracking-widest">Text Extraction (->>)</span>
142
- <span class="px-2 py-0.5 rounded bg-indigo-100 text-indigo-700 text-[10px] font-bold">Standard Use</span>
111
+ <!-- RELATIONSHIP LOADING -->
112
+ <section class="mb-20">
113
+ <h2 class="text-3xl font-black text-slate-900 mb-8 tracking-tight italic underline decoration-indigo-600 underline-offset-8">Relational Intelligence: Eager Loading</h2>
114
+ <div class="p-8 bg-slate-50 border border-slate-200 rounded-[2.5rem] shadow-sm">
115
+ <p class="text-slate-600 mb-6">By default, GO-DUCK uses <strong>Lazy Loading</strong> to keep responses lightweight. However, you can toggle relational graph expansion using our intelligent URI flags.</p>
116
+
117
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-8">
118
+ <div class="p-6 bg-white rounded-2xl border border-slate-100 shadow-sm border-l-4 border-l-indigo-600">
119
+ <h4 class="font-bold text-slate-900 mb-2">Eager Expansion (?eager=true)</h4>
120
+ <p class="text-xs text-slate-500 mb-4">Recursively loads all 1:m and m:1 relationships defined in your GDL. Perfect for building complex dashboard views in a single call.</p>
121
+ <code class="text-xs font-mono font-bold text-indigo-700 bg-indigo-50 px-3 py-1 rounded-full">GET /api/v1/car/1?eager=true</code>
143
122
  </div>
144
- <code class="text-xs text-slate-800">GET /api/rpc/users?metadata->>role=eq.ADMIN</code>
145
- <p class="text-[11px] text-slate-500 mt-2">Extracts the value as text. Perfect for equality checks on nested strings.</p>
146
- </div>
147
-
148
- <div class="bg-slate-50 p-5 rounded-xl border border-slate-100">
149
- <div class="flex items-center justify-between mb-2">
150
- <span class="text-xs font-bold text-purple-600 uppercase tracking-widest">Object Extraction (->)</span>
123
+ <div class="p-6 bg-white rounded-2xl border border-slate-100 shadow-sm border-l-4 border-l-slate-400">
124
+ <h4 class="font-bold text-slate-900 mb-2">Lazy Defaults</h4>
125
+ <p class="text-xs text-slate-500 mb-4">Returns only the primary entity fields. Relationships remain hydrated as IDs, reducing bandwidth and database overhead.</p>
126
+ <code class="text-xs font-mono font-bold text-slate-700 bg-slate-100 px-3 py-1 rounded-full">GET /api/v1/car/1</code>
151
127
  </div>
152
- <code class="text-xs text-slate-800">GET /api/rpc/orders?details->itemsCount=gt.5</code>
153
- <p class="text-[11px] text-slate-500 mt-2">Treats the extracted value as a JSON object/numeric, allowing for range checks on nested numbers.</p>
154
- </div>
155
- </div>
156
-
157
- <div class="mt-6 p-4 bg-amber-50 rounded-xl border border-amber-100">
158
- <p class="text-[11px] text-amber-800 leading-relaxed">
159
- <strong>Pro Tip:</strong> For high-performance JSON querying, ensure you have a <code>GIN</code> index on the JSONB column in your database.
160
- </p>
161
- </div>
162
- </div>
163
- </section>
164
-
165
- <section class="mb-12">
166
- <h2 class="text-2xl font-bold text-slate-800 mb-6 flex items-center">
167
- <span class="w-8 h-8 rounded-lg bg-orange-100 text-orange-600 flex items-center justify-center mr-3 text-sm">
168
- <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg>
169
- </span>
170
- Bulk Mission Control (High Velocity)
171
- </h2>
172
- <p class="text-slate-600 text-sm mb-6 leading-relaxed">
173
- For batch processing and migrations, avoid the overhead of multiple HTTP calls. Use the specialized <code class="bg-orange-50 px-1 rounded text-orange-700">/bulk</code> endpoints to process hundreds of records in a single transaction.
174
- </p>
175
-
176
- <div class="space-y-6">
177
- <!-- Bulk Create -->
178
- <div class="bg-white border border-slate-200 rounded-2xl overflow-hidden">
179
- <div class="bg-slate-50 px-6 py-3 border-b border-slate-200 flex items-center justify-between">
180
- <span class="text-[10px] font-bold text-slate-500 uppercase tracking-widest">Bulk Create Transaction</span>
181
- <span class="px-2 py-0.5 rounded bg-emerald-100 text-emerald-700 text-[10px] font-bold">POST /api/:entities/bulk</span>
182
- </div>
183
- <div class="p-6">
184
- <pre class="bg-slate-900 rounded-xl p-4 text-xs text-slate-300 font-mono">[
185
- { "title": "Bulk Article A", "status": "DRAFT" },
186
- { "title": "Bulk Article B", "status": "PUBLISHED" }
187
- ]</pre>
188
128
  </div>
189
129
  </div>
130
+ </section>
190
131
 
191
- <!-- Bulk Patch -->
192
- <div class="bg-white border border-slate-200 rounded-2xl overflow-hidden">
193
- <div class="bg-slate-50 px-6 py-3 border-b border-slate-200 flex items-center justify-between">
194
- <span class="text-[10px] font-bold text-slate-500 uppercase tracking-widest">Multi-Entity Patch</span>
195
- <span class="px-2 py-0.5 rounded bg-blue-100 text-blue-700 text-[10px] font-bold">PATCH /api/:entities/bulk</span>
196
- </div>
197
- <div class="p-6">
198
- <pre class="bg-slate-900 rounded-xl p-4 text-xs text-slate-300 font-mono">[
199
- { "id": 1, "changes": { "status": "ARCHIVED" } },
200
- { "id": 2, "changes": { "title": "Updated Title via Bulk" } }
201
- ]</pre>
202
- </div>
132
+ <!-- RPC OPERATORS -->
133
+ <section class="mb-10 text-center">
134
+ <h2 class="text-2xl font-black text-slate-900 mb-6 italic italic underline decoration-indigo-200 underline-offset-8 decoration-8 font-serif uppercase tracking-widest">GORM Filter Reference</h2>
135
+ <div class="flex flex-wrap justify-center gap-2">
136
+ <span class="px-4 py-2 bg-slate-100 rounded-full text-xs font-mono font-bold text-indigo-700">eq. (Equals)</span>
137
+ <span class="px-4 py-2 bg-slate-100 rounded-full text-xs font-mono font-bold text-indigo-700">ne. (Not Equal)</span>
138
+ <span class="px-4 py-2 bg-slate-100 rounded-full text-xs font-mono font-bold text-indigo-700">gt. (Greater)</span>
139
+ <span class="px-4 py-2 bg-slate-100 rounded-full text-xs font-mono font-bold text-indigo-700">lt. (Lesser)</span>
140
+ <span class="px-4 py-2 bg-slate-100 rounded-full text-xs font-mono font-bold text-indigo-700">like. (%)</span>
141
+ <span class="px-4 py-2 bg-slate-100 rounded-full text-xs font-mono font-bold text-indigo-700">in. (A,B,C)</span>
142
+ <span class="px-4 py-2 bg-slate-100 rounded-full text-xs font-mono font-bold text-indigo-700">is. (null)</span>
203
143
  </div>
204
- </div>
205
- </section>
206
-
207
- <section class="mb-12">
208
- <h2 class="text-2xl font-bold text-slate-800 mb-6 flex items-center">
209
- <span class="w-8 h-8 rounded-lg bg-rose-100 text-rose-600 flex items-center justify-center mr-3 text-sm">
210
- <svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"></path></svg>
211
- </span>
212
- Security & Context
213
- </h2>
214
- <div class="bg-rose-50 border border-rose-100 rounded-2xl p-6 flex items-start">
215
- <div class="bg-rose-100 p-2 rounded-lg mr-4">
216
- <svg class="w-6 h-6 text-rose-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
217
- </div>
218
- <div>
219
- <h4 class="font-bold text-rose-900 mb-1">Mandatory Headers</h4>
220
- <p class="text-rose-700 text-sm leading-relaxed mb-4">Every Go-Duck API request must satisfy the Identity and Multi-Tenancy gatekeepers.</p>
221
- <ul class="space-y-2 text-xs font-mono text-rose-800">
222
- <li><span class="font-bold">Authorization:</span> Bearer &lt;Keycloak_JWT&gt;</li>
223
- <li><span class="font-bold">X-Tenant-ID:</span> Subdomain or ID of the tenant dashboard</li>
224
- </ul>
225
- </div>
226
- </div>
227
- </section>
144
+ </section>
145
+ </div>
@@ -0,0 +1,94 @@
1
+ <div class="prose prose-slate max-w-none">
2
+ <div class="flex items-center space-x-3 mb-8">
3
+ <div class="p-3 bg-red-100 rounded-xl">
4
+ <svg class="w-8 h-8 text-red-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
5
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />
6
+ </svg>
7
+ </div>
8
+ <h1 class="text-4xl font-bold text-slate-900 m-0">Distributed Saga & Outbox</h1>
9
+ </div>
10
+
11
+ <p class="text-xl text-slate-600 mb-12">
12
+ Maintain 100% data consistency across federated database silos, even during network failures, using the Transactional Outbox pattern.
13
+ </p>
14
+
15
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-8 mb-16">
16
+ <div class="bg-white p-8 rounded-2xl shadow-sm border border-slate-200">
17
+ <h3 class="text-xl font-bold mb-4 flex items-center text-slate-800">
18
+ <span class="w-8 h-8 bg-slate-100 rounded-full flex items-center justify-center text-sm mr-3">01</span>
19
+ Atomic Persistence
20
+ </h3>
21
+ <p class="text-slate-600">
22
+ When a mutation occurs (Create/Update/Delete), the primary silo transaction atomatically persists both the entity and a "Pending Task" in the <code>distributed_outbox</code> table.
23
+ </p>
24
+ </div>
25
+ <div class="p-8 bg-slate-100 rounded-3xl border border-slate-200">
26
+ <h4 class="font-bold text-slate-800 mb-2 font-mono flex items-center">
27
+ <span class="w-2 h-2 rounded-full bg-blue-500 mr-2"></span>
28
+ NATS Streaming (CQRS)
29
+ </h4>
30
+ <p class="text-xs text-slate-600 mb-4 font-mono font-black italic">Subject Pattern: go.duck.events.{entity}.{action}</p>
31
+ <p class="text-sm text-slate-700 leading-relaxed">High-performance internal messaging bridge. Supports <strong>wildcard subscriptions</strong> (e.g., <code>go.duck.events.article.*</code>) for ultra-fast, decoupled service-to-service orchestration.</p>
32
+ </div>
33
+ </div>
34
+
35
+ <div class="mt-8 p-10 bg-slate-900 rounded-[2.5rem] border border-white/5 shadow-2xl relative overflow-hidden">
36
+ <div class="relative z-10">
37
+ <h3 class="text-2xl font-black text-white mb-6 tracking-tight italic">NATS Performance & CQRS</h3>
38
+ <p class="text-slate-400 text-sm leading-relaxed mb-8">NATS acts as the nervous system for your microservice. While MQTT is optimized for UI/WebSockets, NATS provides the dot-separated power needed for enterprise message routing.</p>
39
+
40
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
41
+ <div class="p-4 bg-white/5 rounded-xl border border-white/10 italic text-xs text-slate-300">
42
+ <span class="text-blue-400 font-bold block mb-1">Subject Strategy</span>
43
+ Dot-separated subjects for hierarchical routing and filtering.
44
+ </div>
45
+ <div class="p-4 bg-white/5 rounded-xl border border-white/10 italic text-xs text-slate-300">
46
+ <span class="text-blue-400 font-bold block mb-1">CQRS Evolution</span>
47
+ Easily separate Reads and Writes by listening to NATS events for cache invalidation.
48
+ </div>
49
+ </div>
50
+ </div>
51
+ </div>
52
+ </section>
53
+
54
+ <section class="mb-16">
55
+ <h2 class="text-3xl font-bold text-slate-900 mb-6">How it Works</h2>
56
+ <div class="bg-slate-900 rounded-3xl p-8 overflow-hidden shadow-2xl">
57
+ <pre class="text-blue-300 font-mono text-sm leading-relaxed">
58
+ # The Saga Workflow
59
+ 1. Client sends POST /cars (Federated Entity)
60
+ 2. Controller opens transaction on Master Silo
61
+ 3. Local Car record is saved
62
+ 4. "PROPAGATE_CREATE" task is saved to `distributed_outbox`
63
+ 5. Transaction COMMIT
64
+ 6. OutboxWorker picks up the task
65
+ 7. OutboxWorker broadcasts to Silo B, C, D...
66
+ 8. On Success, task is marked "COMPLETED"
67
+ </pre>
68
+ </div>
69
+ </section>
70
+
71
+ <section class="mb-16">
72
+ <h2 class="text-3xl font-bold text-slate-900 mb-6">Outbox Schema</h2>
73
+ <p class="text-slate-600 mb-6">
74
+ Every silo in your infrastructure includes this safety net automatically:
75
+ </p>
76
+ <div class="overflow-x-auto rounded-xl border border-slate-200">
77
+ <table class="min-w-full divide-y divide-slate-200">
78
+ <thead class="bg-slate-50">
79
+ <tr>
80
+ <th class="px-6 py-4 text-left text-xs font-semibold text-slate-500 uppercase tracking-wider">Field</th>
81
+ <th class="px-6 py-4 text-left text-xs font-semibold text-slate-500 uppercase tracking-wider">Type</th>
82
+ <th class="px-6 py-4 text-left text-xs font-semibold text-slate-500 uppercase tracking-wider">Description</th>
83
+ </tr>
84
+ </thead>
85
+ <tbody class="bg-white divide-y divide-slate-200">
86
+ <tr><td class="px-6 py-4 font-mono text-sm text-indigo-600">event_type</td><td class="px-6 py-4 text-sm">String</td><td class="px-6 py-4 text-sm">CREATE, UPDATE, DELETE, BULK_...</td></tr>
87
+ <tr><td class="px-6 py-4 font-mono text-sm text-indigo-600">payload</td><td class="px-6 py-4 text-sm">JSONB</td><td class="px-6 py-4 text-sm">The delta or entity data</td></tr>
88
+ <tr><td class="px-6 py-4 font-mono text-sm text-indigo-600">status</td><td class="px-6 py-4 text-sm">String</td><td class="px-6 py-4 text-sm">PENDING, COMPLETED, FAILED</td></tr>
89
+ <tr><td class="px-6 py-4 font-mono text-sm text-indigo-600">retry_count</td><td class="px-6 py-4 text-sm">Int</td><td class="px-6 py-4 text-sm">Exponential backoff tracking</td></tr>
90
+ </tbody>
91
+ </table>
92
+ </div>
93
+ </section>
94
+ </div>