@laitszkin/apollo-toolkit 3.11.0 → 3.11.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/CHANGELOG.md +17 -0
- package/analyse-app-logs/scripts/__pycache__/filter_logs_by_time.cpython-312.pyc +0 -0
- package/analyse-app-logs/scripts/__pycache__/log_cli_utils.cpython-312.pyc +0 -0
- package/analyse-app-logs/scripts/__pycache__/search_logs.cpython-312.pyc +0 -0
- package/docs-to-voice/scripts/__pycache__/docs_to_voice.cpython-312.pyc +0 -0
- package/generate-spec/scripts/__pycache__/create-specscpython-312.pyc +0 -0
- package/init-project-html/SKILL.md +56 -20
- package/init-project-html/agents/openai.yaml +6 -6
- package/init-project-html/lib/atlas/assets/architecture.css +27 -6
- package/init-project-html/lib/atlas/assets/viewer.client.js +124 -81
- package/init-project-html/lib/atlas/cli.js +31 -3
- package/init-project-html/lib/atlas/layout.js +112 -11
- package/init-project-html/lib/atlas/render.js +131 -33
- package/init-project-html/lib/atlas/schema.js +39 -2
- package/init-project-html/references/TEMPLATE_SPEC.md +26 -8
- package/init-project-html/sample-demo/resources/project-architecture/assets/architecture.css +27 -6
- package/init-project-html/sample-demo/resources/project-architecture/assets/viewer.client.js +124 -81
- package/init-project-html/sample-demo/resources/project-architecture/atlas/features/get-invite-codes.yaml +17 -4
- package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/invite-code-generator.html +23 -7
- package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/invite-issuance-service.html +45 -13
- package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/postgresql.html +28 -10
- package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/public-api.html +33 -13
- package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/web-get-invite-ui.html +28 -10
- package/init-project-html/sample-demo/resources/project-architecture/features/invite-code-registration/postgresql.html +28 -10
- package/init-project-html/sample-demo/resources/project-architecture/features/invite-code-registration/public-api.html +28 -10
- package/init-project-html/sample-demo/resources/project-architecture/features/invite-code-registration/registration-service.html +38 -17
- package/init-project-html/sample-demo/resources/project-architecture/features/invite-code-registration/web-register-ui.html +29 -11
- package/init-project-html/sample-demo/resources/project-architecture/index.html +100 -76
- package/katex/scripts/__pycache__/render_katex.cpython-312.pyc +0 -0
- package/open-github-issue/scripts/__pycache__/open_github_issue.cpython-312.pyc +0 -0
- package/package.json +1 -1
- package/read-github-issue/scripts/__pycache__/find_issues.cpython-312.pyc +0 -0
- package/read-github-issue/scripts/__pycache__/read_issue.cpython-312.pyc +0 -0
- package/resolve-review-comments/scripts/__pycache__/review_threads.cpython-312.pyc +0 -0
- package/spec-to-project-html/SKILL.md +25 -16
- package/spec-to-project-html/agents/openai.yaml +5 -5
- package/spec-to-project-html/references/TEMPLATE_SPEC.md +2 -0
- package/text-to-short-video/scripts/__pycache__/enforce_video_aspect_ratio.cpython-312.pyc +0 -0
|
@@ -36,23 +36,40 @@
|
|
|
36
36
|
</section>
|
|
37
37
|
<section class="sub-dataflow" aria-label="Internal data flow">
|
|
38
38
|
<h2>Internal data flow</h2>
|
|
39
|
-
<
|
|
40
|
-
|
|
39
|
+
<div class="sub-dataflow__canvas" data-pan-zoom-container>
|
|
40
|
+
<div class="sub-dataflow__toolbar" role="toolbar" aria-label="Diagram controls">
|
|
41
|
+
<button type="button" data-pan-zoom="zoom-in" aria-label="Zoom in">+</button>
|
|
42
|
+
<button type="button" data-pan-zoom="zoom-out" aria-label="Zoom out">−</button>
|
|
43
|
+
<button type="button" data-pan-zoom="fit" aria-label="Reset view">Fit</button>
|
|
44
|
+
</div>
|
|
45
|
+
<div class="sub-dataflow__viewport" data-pan-zoom-viewport>
|
|
46
|
+
<svg class="sub-dataflow__svg" data-atlas-svg="sub-dataflow" viewBox="0 0 628 368" role="img" aria-label="Internal dataflow">
|
|
47
|
+
<defs>
|
|
48
|
+
<marker id="sub-arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="9" markerHeight="9" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 Z" /></marker>
|
|
49
|
+
</defs>
|
|
41
50
|
<g class="sub-dataflow__step">
|
|
42
|
-
<
|
|
43
|
-
<text x="
|
|
51
|
+
<circle class="sub-dataflow__badge" cx="42" cy="68" r="18" />
|
|
52
|
+
<text class="sub-dataflow__badge-text" x="42" y="73" text-anchor="middle">1</text>
|
|
53
|
+
<rect class="sub-dataflow__box" x="80" y="32" width="520" height="72" rx="14" ry="14" />
|
|
54
|
+
<text class="sub-dataflow__text" x="340" y="74" text-anchor="middle">Apply row lock on invite_codes.</text>
|
|
44
55
|
</g>
|
|
45
|
-
<line class="sub-dataflow__arrow" x1="
|
|
56
|
+
<line class="sub-dataflow__arrow" x1="340" y1="110" x2="340" y2="140" marker-end="url(#sub-arrow)" />
|
|
46
57
|
<g class="sub-dataflow__step">
|
|
47
|
-
<
|
|
48
|
-
<text x="
|
|
58
|
+
<circle class="sub-dataflow__badge" cx="42" cy="184" r="18" />
|
|
59
|
+
<text class="sub-dataflow__badge-text" x="42" y="189" text-anchor="middle">2</text>
|
|
60
|
+
<rect class="sub-dataflow__box" x="80" y="148" width="520" height="72" rx="14" ry="14" />
|
|
61
|
+
<text class="sub-dataflow__text" x="340" y="190" text-anchor="middle">Validate uniqueness of users.email.</text>
|
|
49
62
|
</g>
|
|
50
|
-
<line class="sub-dataflow__arrow" x1="
|
|
63
|
+
<line class="sub-dataflow__arrow" x1="340" y1="226" x2="340" y2="256" marker-end="url(#sub-arrow)" />
|
|
51
64
|
<g class="sub-dataflow__step">
|
|
52
|
-
<
|
|
53
|
-
<text x="
|
|
65
|
+
<circle class="sub-dataflow__badge" cx="42" cy="300" r="18" />
|
|
66
|
+
<text class="sub-dataflow__badge-text" x="42" y="305" text-anchor="middle">3</text>
|
|
67
|
+
<rect class="sub-dataflow__box" x="80" y="264" width="520" height="72" rx="14" ry="14" />
|
|
68
|
+
<text class="sub-dataflow__text" x="340" y="306" text-anchor="middle">Write users row and update invite_codes.consumed_at.</text>
|
|
54
69
|
</g>
|
|
55
70
|
</svg>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
56
73
|
</section>
|
|
57
74
|
<section class="sub-errors" aria-label="Errors">
|
|
58
75
|
<h2>Errors</h2>
|
|
@@ -64,5 +81,6 @@
|
|
|
64
81
|
</table>
|
|
65
82
|
</section>
|
|
66
83
|
</main>
|
|
84
|
+
<script src="../../assets/viewer.client.js" defer></script>
|
|
67
85
|
</body>
|
|
68
86
|
</html>
|
|
@@ -33,23 +33,40 @@
|
|
|
33
33
|
</section>
|
|
34
34
|
<section class="sub-dataflow" aria-label="Internal data flow">
|
|
35
35
|
<h2>Internal data flow</h2>
|
|
36
|
-
<
|
|
37
|
-
|
|
36
|
+
<div class="sub-dataflow__canvas" data-pan-zoom-container>
|
|
37
|
+
<div class="sub-dataflow__toolbar" role="toolbar" aria-label="Diagram controls">
|
|
38
|
+
<button type="button" data-pan-zoom="zoom-in" aria-label="Zoom in">+</button>
|
|
39
|
+
<button type="button" data-pan-zoom="zoom-out" aria-label="Zoom out">−</button>
|
|
40
|
+
<button type="button" data-pan-zoom="fit" aria-label="Reset view">Fit</button>
|
|
41
|
+
</div>
|
|
42
|
+
<div class="sub-dataflow__viewport" data-pan-zoom-viewport>
|
|
43
|
+
<svg class="sub-dataflow__svg" data-atlas-svg="sub-dataflow" viewBox="0 0 628 368" role="img" aria-label="Internal dataflow">
|
|
44
|
+
<defs>
|
|
45
|
+
<marker id="sub-arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="9" markerHeight="9" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 Z" /></marker>
|
|
46
|
+
</defs>
|
|
38
47
|
<g class="sub-dataflow__step">
|
|
39
|
-
<
|
|
40
|
-
<text x="
|
|
48
|
+
<circle class="sub-dataflow__badge" cx="42" cy="68" r="18" />
|
|
49
|
+
<text class="sub-dataflow__badge-text" x="42" y="73" text-anchor="middle">1</text>
|
|
50
|
+
<rect class="sub-dataflow__box" x="80" y="32" width="520" height="72" rx="14" ry="14" />
|
|
51
|
+
<text class="sub-dataflow__text" x="340" y="74" text-anchor="middle">Decode JSON body.</text>
|
|
41
52
|
</g>
|
|
42
|
-
<line class="sub-dataflow__arrow" x1="
|
|
53
|
+
<line class="sub-dataflow__arrow" x1="340" y1="110" x2="340" y2="140" marker-end="url(#sub-arrow)" />
|
|
43
54
|
<g class="sub-dataflow__step">
|
|
44
|
-
<
|
|
45
|
-
<text x="
|
|
55
|
+
<circle class="sub-dataflow__badge" cx="42" cy="184" r="18" />
|
|
56
|
+
<text class="sub-dataflow__badge-text" x="42" y="189" text-anchor="middle">2</text>
|
|
57
|
+
<rect class="sub-dataflow__box" x="80" y="148" width="520" height="72" rx="14" ry="14" />
|
|
58
|
+
<text class="sub-dataflow__text" x="340" y="190" text-anchor="middle">Call registration-service.RegisterWithInvite.</text>
|
|
46
59
|
</g>
|
|
47
|
-
<line class="sub-dataflow__arrow" x1="
|
|
60
|
+
<line class="sub-dataflow__arrow" x1="340" y1="226" x2="340" y2="256" marker-end="url(#sub-arrow)" />
|
|
48
61
|
<g class="sub-dataflow__step">
|
|
49
|
-
<
|
|
50
|
-
<text x="
|
|
62
|
+
<circle class="sub-dataflow__badge" cx="42" cy="300" r="18" />
|
|
63
|
+
<text class="sub-dataflow__badge-text" x="42" y="305" text-anchor="middle">3</text>
|
|
64
|
+
<rect class="sub-dataflow__box" x="80" y="264" width="520" height="72" rx="14" ry="14" />
|
|
65
|
+
<text class="sub-dataflow__text" x="340" y="306" text-anchor="middle">Serialize success or 422 / 5xx error.</text>
|
|
51
66
|
</g>
|
|
52
67
|
</svg>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
53
70
|
</section>
|
|
54
71
|
<section class="sub-errors" aria-label="Errors">
|
|
55
72
|
<h2>Errors</h2>
|
|
@@ -61,5 +78,6 @@
|
|
|
61
78
|
</table>
|
|
62
79
|
</section>
|
|
63
80
|
</main>
|
|
81
|
+
<script src="../../assets/viewer.client.js" defer></script>
|
|
64
82
|
</body>
|
|
65
83
|
</html>
|
|
@@ -35,34 +35,54 @@
|
|
|
35
35
|
</section>
|
|
36
36
|
<section class="sub-dataflow" aria-label="Internal data flow">
|
|
37
37
|
<h2>Internal data flow</h2>
|
|
38
|
-
<
|
|
39
|
-
|
|
38
|
+
<div class="sub-dataflow__canvas" data-pan-zoom-container>
|
|
39
|
+
<div class="sub-dataflow__toolbar" role="toolbar" aria-label="Diagram controls">
|
|
40
|
+
<button type="button" data-pan-zoom="zoom-in" aria-label="Zoom in">+</button>
|
|
41
|
+
<button type="button" data-pan-zoom="zoom-out" aria-label="Zoom out">−</button>
|
|
42
|
+
<button type="button" data-pan-zoom="fit" aria-label="Reset view">Fit</button>
|
|
43
|
+
</div>
|
|
44
|
+
<div class="sub-dataflow__viewport" data-pan-zoom-viewport>
|
|
45
|
+
<svg class="sub-dataflow__svg" data-atlas-svg="sub-dataflow" viewBox="0 0 628 600" role="img" aria-label="Internal dataflow">
|
|
46
|
+
<defs>
|
|
47
|
+
<marker id="sub-arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="9" markerHeight="9" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 Z" /></marker>
|
|
48
|
+
</defs>
|
|
40
49
|
<g class="sub-dataflow__step">
|
|
41
|
-
<
|
|
42
|
-
<text x="
|
|
50
|
+
<circle class="sub-dataflow__badge" cx="42" cy="68" r="18" />
|
|
51
|
+
<text class="sub-dataflow__badge-text" x="42" y="73" text-anchor="middle">1</text>
|
|
52
|
+
<rect class="sub-dataflow__box" x="80" y="32" width="520" height="72" rx="14" ry="14" />
|
|
53
|
+
<text class="sub-dataflow__text" x="340" y="74" text-anchor="middle">Open transaction.</text>
|
|
43
54
|
</g>
|
|
44
|
-
<line class="sub-dataflow__arrow" x1="
|
|
55
|
+
<line class="sub-dataflow__arrow" x1="340" y1="110" x2="340" y2="140" marker-end="url(#sub-arrow)" />
|
|
45
56
|
<g class="sub-dataflow__step">
|
|
46
|
-
<
|
|
47
|
-
<text x="
|
|
57
|
+
<circle class="sub-dataflow__badge" cx="42" cy="184" r="18" />
|
|
58
|
+
<text class="sub-dataflow__badge-text" x="42" y="189" text-anchor="middle">2</text>
|
|
59
|
+
<rect class="sub-dataflow__box" x="80" y="148" width="520" height="72" rx="14" ry="14" />
|
|
60
|
+
<text class="sub-dataflow__text" x="340" y="190" text-anchor="middle">SELECT invite_codes FOR UPDATE WHERE code = ?</text>
|
|
48
61
|
</g>
|
|
49
|
-
<line class="sub-dataflow__arrow" x1="
|
|
62
|
+
<line class="sub-dataflow__arrow" x1="340" y1="226" x2="340" y2="256" marker-end="url(#sub-arrow)" />
|
|
50
63
|
<g class="sub-dataflow__step">
|
|
51
|
-
<
|
|
52
|
-
<text x="
|
|
64
|
+
<circle class="sub-dataflow__badge" cx="42" cy="300" r="18" />
|
|
65
|
+
<text class="sub-dataflow__badge-text" x="42" y="305" text-anchor="middle">3</text>
|
|
66
|
+
<rect class="sub-dataflow__box" x="80" y="264" width="520" height="72" rx="14" ry="14" />
|
|
67
|
+
<text class="sub-dataflow__text" x="340" y="306" text-anchor="middle">decideInviteValid against current time.</text>
|
|
53
68
|
</g>
|
|
54
|
-
<line class="sub-dataflow__arrow" x1="
|
|
69
|
+
<line class="sub-dataflow__arrow" x1="340" y1="342" x2="340" y2="372" marker-end="url(#sub-arrow)" />
|
|
55
70
|
<g class="sub-dataflow__step">
|
|
56
|
-
<
|
|
57
|
-
<text x="
|
|
58
|
-
<
|
|
71
|
+
<circle class="sub-dataflow__badge" cx="42" cy="416" r="18" />
|
|
72
|
+
<text class="sub-dataflow__badge-text" x="42" y="421" text-anchor="middle">4</text>
|
|
73
|
+
<rect class="sub-dataflow__box" x="80" y="380" width="520" height="72" rx="14" ry="14" />
|
|
74
|
+
<text class="sub-dataflow__text" x="340" y="422" text-anchor="middle">INSERT users row and UPDATE invite_codes.consumed_at.</text>
|
|
59
75
|
</g>
|
|
60
|
-
<line class="sub-dataflow__arrow" x1="
|
|
76
|
+
<line class="sub-dataflow__arrow" x1="340" y1="458" x2="340" y2="488" marker-end="url(#sub-arrow)" />
|
|
61
77
|
<g class="sub-dataflow__step">
|
|
62
|
-
<
|
|
63
|
-
<text x="
|
|
78
|
+
<circle class="sub-dataflow__badge" cx="42" cy="532" r="18" />
|
|
79
|
+
<text class="sub-dataflow__badge-text" x="42" y="537" text-anchor="middle">5</text>
|
|
80
|
+
<rect class="sub-dataflow__box" x="80" y="496" width="520" height="72" rx="14" ry="14" />
|
|
81
|
+
<text class="sub-dataflow__text" x="340" y="538" text-anchor="middle">Commit and return NewUserID.</text>
|
|
64
82
|
</g>
|
|
65
83
|
</svg>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
66
86
|
</section>
|
|
67
87
|
<section class="sub-errors" aria-label="Errors">
|
|
68
88
|
<h2>Errors</h2>
|
|
@@ -75,5 +95,6 @@
|
|
|
75
95
|
</table>
|
|
76
96
|
</section>
|
|
77
97
|
</main>
|
|
98
|
+
<script src="../../assets/viewer.client.js" defer></script>
|
|
78
99
|
</body>
|
|
79
100
|
</html>
|
|
@@ -34,24 +34,41 @@
|
|
|
34
34
|
</section>
|
|
35
35
|
<section class="sub-dataflow" aria-label="Internal data flow">
|
|
36
36
|
<h2>Internal data flow</h2>
|
|
37
|
-
<
|
|
38
|
-
|
|
37
|
+
<div class="sub-dataflow__canvas" data-pan-zoom-container>
|
|
38
|
+
<div class="sub-dataflow__toolbar" role="toolbar" aria-label="Diagram controls">
|
|
39
|
+
<button type="button" data-pan-zoom="zoom-in" aria-label="Zoom in">+</button>
|
|
40
|
+
<button type="button" data-pan-zoom="zoom-out" aria-label="Zoom out">−</button>
|
|
41
|
+
<button type="button" data-pan-zoom="fit" aria-label="Reset view">Fit</button>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="sub-dataflow__viewport" data-pan-zoom-viewport>
|
|
44
|
+
<svg class="sub-dataflow__svg" data-atlas-svg="sub-dataflow" viewBox="0 0 628 372" role="img" aria-label="Internal dataflow">
|
|
45
|
+
<defs>
|
|
46
|
+
<marker id="sub-arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="9" markerHeight="9" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 Z" /></marker>
|
|
47
|
+
</defs>
|
|
39
48
|
<g class="sub-dataflow__step">
|
|
40
|
-
<
|
|
41
|
-
<text x="
|
|
49
|
+
<circle class="sub-dataflow__badge" cx="42" cy="68" r="18" />
|
|
50
|
+
<text class="sub-dataflow__badge-text" x="42" y="73" text-anchor="middle">1</text>
|
|
51
|
+
<rect class="sub-dataflow__box" x="80" y="32" width="520" height="72" rx="14" ry="14" />
|
|
52
|
+
<text class="sub-dataflow__text" x="340" y="74" text-anchor="middle">Collect form fields.</text>
|
|
42
53
|
</g>
|
|
43
|
-
<line class="sub-dataflow__arrow" x1="
|
|
54
|
+
<line class="sub-dataflow__arrow" x1="340" y1="110" x2="340" y2="140" marker-end="url(#sub-arrow)" />
|
|
44
55
|
<g class="sub-dataflow__step">
|
|
45
|
-
<
|
|
46
|
-
<text x="
|
|
56
|
+
<circle class="sub-dataflow__badge" cx="42" cy="184" r="18" />
|
|
57
|
+
<text class="sub-dataflow__badge-text" x="42" y="189" text-anchor="middle">2</text>
|
|
58
|
+
<rect class="sub-dataflow__box" x="80" y="148" width="520" height="72" rx="14" ry="14" />
|
|
59
|
+
<text class="sub-dataflow__text" x="340" y="190" text-anchor="middle">POST /api/register with payload.</text>
|
|
47
60
|
</g>
|
|
48
|
-
<line class="sub-dataflow__arrow" x1="
|
|
61
|
+
<line class="sub-dataflow__arrow" x1="340" y1="226" x2="340" y2="256" marker-end="url(#sub-arrow)" />
|
|
49
62
|
<g class="sub-dataflow__step">
|
|
50
|
-
<
|
|
51
|
-
<text x="
|
|
52
|
-
<
|
|
63
|
+
<circle class="sub-dataflow__badge" cx="42" cy="302" r="18" />
|
|
64
|
+
<text class="sub-dataflow__badge-text" x="42" y="307" text-anchor="middle">3</text>
|
|
65
|
+
<rect class="sub-dataflow__box" x="80" y="264" width="520" height="76" rx="14" ry="14" />
|
|
66
|
+
<text class="sub-dataflow__text" x="340" y="298" text-anchor="middle">On 2xx redirect to /welcome; otherwise surface field-level</text>
|
|
67
|
+
<text class="sub-dataflow__text" x="340" y="318" text-anchor="middle">errors.</text>
|
|
53
68
|
</g>
|
|
54
69
|
</svg>
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
55
72
|
</section>
|
|
56
73
|
<section class="sub-errors" aria-label="Errors">
|
|
57
74
|
<h2>Errors</h2>
|
|
@@ -63,5 +80,6 @@
|
|
|
63
80
|
</table>
|
|
64
81
|
</section>
|
|
65
82
|
</main>
|
|
83
|
+
<script src="../../assets/viewer.client.js" defer></script>
|
|
66
84
|
</body>
|
|
67
85
|
</html>
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
<button type="button" data-pan-zoom="fit" aria-label="Reset view">Fit</button>
|
|
20
20
|
</div>
|
|
21
21
|
<div class="atlas-canvas__viewport" data-pan-zoom-viewport>
|
|
22
|
-
<svg class="atlas-svg" viewBox="0 0
|
|
22
|
+
<svg class="atlas-svg" viewBox="0 0 3831 521" role="img" aria-label="Project architecture atlas" data-atlas-svg="macro">
|
|
23
23
|
<defs>
|
|
24
24
|
<marker id="arrow-call" class="m-arrow m-arrow--call" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 Z" /></marker>
|
|
25
25
|
<marker id="arrow-return" class="m-arrow m-arrow--return" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="8" markerHeight="8" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 Z" /></marker>
|
|
@@ -28,118 +28,142 @@
|
|
|
28
28
|
</defs>
|
|
29
29
|
<g transform="translate(24,24)">
|
|
30
30
|
<g class="m-cluster" data-feature="get-invite-codes">
|
|
31
|
-
<rect class="m-cluster__bg" x="40.00" y="40.00" width="
|
|
32
|
-
<text class="m-cluster__title" x="
|
|
31
|
+
<rect class="m-cluster__bg" x="40.00" y="40.00" width="1576.00" height="393.00" rx="14" ry="14" />
|
|
32
|
+
<text class="m-cluster__title" x="828.00" y="66.00" text-anchor="middle">Get invite codes</text>
|
|
33
33
|
</g>
|
|
34
34
|
<g class="m-cluster" data-feature="invite-code-registration">
|
|
35
|
-
<rect class="m-cluster__bg" x="
|
|
36
|
-
<text class="m-cluster__title" x="
|
|
35
|
+
<rect class="m-cluster__bg" x="2017.00" y="133.00" width="1726.00" height="266.40" rx="14" ry="14" />
|
|
36
|
+
<text class="m-cluster__title" x="2880.00" y="159.00" text-anchor="middle">Invite-code registration</text>
|
|
37
37
|
</g>
|
|
38
|
-
<a class="m-node m-node--ui" href="features/get-invite-codes/web-get-invite-ui.html" data-feature="get-invite-codes" data-submodule="web-get-invite-ui">
|
|
39
|
-
<
|
|
40
|
-
<
|
|
41
|
-
<text class="m-
|
|
42
|
-
<text class="m-
|
|
38
|
+
<a class="m-node m-node--ui" href="features/get-invite-codes/web-get-invite-ui.html" data-feature="get-invite-codes" data-submodule="web-get-invite-ui" tabindex="0" aria-label="web-get-invite-ui — React page that lets a signed-in member request a new invite code. — open sub-module page">
|
|
39
|
+
<title>web-get-invite-ui — React page that lets a signed-in member request a new invite code.</title>
|
|
40
|
+
<rect x="64.00" y="166.80" width="220.00" height="126.00" rx="10" ry="10" />
|
|
41
|
+
<text class="m-node__title" x="174.00" y="196.80" text-anchor="middle">web-get-invite-ui</text>
|
|
42
|
+
<text class="m-node__kind" x="174.00" y="212.80" text-anchor="middle">UI</text>
|
|
43
|
+
<text class="m-node__role" x="174.00" y="232.80" text-anchor="middle">React page that lets a</text>
|
|
44
|
+
<text class="m-node__role" x="174.00" y="248.80" text-anchor="middle">signed-in member request a new</text>
|
|
45
|
+
<text class="m-node__role" x="174.00" y="264.80" text-anchor="middle">invite code.</text>
|
|
43
46
|
</a>
|
|
44
|
-
<a class="m-node m-node--api" href="features/get-invite-codes/public-api.html" data-feature="get-invite-codes" data-submodule="public-api">
|
|
45
|
-
<
|
|
46
|
-
<
|
|
47
|
-
<text class="m-
|
|
48
|
-
<text class="m-
|
|
47
|
+
<a class="m-node m-node--api" href="features/get-invite-codes/public-api.html" data-feature="get-invite-codes" data-submodule="public-api" tabindex="0" aria-label="public-api — HTTP boundary for `/api/invites` POST requests. — open sub-module page">
|
|
48
|
+
<title>public-api — HTTP boundary for `/api/invites` POST requests.</title>
|
|
49
|
+
<rect x="491.00" y="174.80" width="220.00" height="110.00" rx="10" ry="10" />
|
|
50
|
+
<text class="m-node__title" x="601.00" y="204.80" text-anchor="middle">public-api</text>
|
|
51
|
+
<text class="m-node__kind" x="601.00" y="220.80" text-anchor="middle">API</text>
|
|
52
|
+
<text class="m-node__role" x="601.00" y="240.80" text-anchor="middle">HTTP boundary for</text>
|
|
53
|
+
<text class="m-node__role" x="601.00" y="256.80" text-anchor="middle">`/api/invites` POST requests.</text>
|
|
49
54
|
</a>
|
|
50
|
-
<a class="m-node m-node--service" href="features/get-invite-codes/invite-issuance-service.html" data-feature="get-invite-codes" data-submodule="invite-issuance-service">
|
|
51
|
-
<
|
|
52
|
-
<
|
|
53
|
-
<text class="m-
|
|
54
|
-
<text class="m-
|
|
55
|
+
<a class="m-node m-node--service" href="features/get-invite-codes/invite-issuance-service.html" data-feature="get-invite-codes" data-submodule="invite-issuance-service" tabindex="0" aria-label="invite-issuance-service — Domain service that mints and persists a single invite row per request. — open sub-module page">
|
|
56
|
+
<title>invite-issuance-service — Domain service that mints and persists a single invite row per request.</title>
|
|
57
|
+
<rect x="925.00" y="166.80" width="226.00" height="126.00" rx="10" ry="10" />
|
|
58
|
+
<text class="m-node__title" x="1038.00" y="196.80" text-anchor="middle">invite-issuance-service</text>
|
|
59
|
+
<text class="m-node__kind" x="1038.00" y="212.80" text-anchor="middle">service</text>
|
|
60
|
+
<text class="m-node__role" x="1038.00" y="232.80" text-anchor="middle">Domain service that mints and</text>
|
|
61
|
+
<text class="m-node__role" x="1038.00" y="248.80" text-anchor="middle">persists a single invite row per</text>
|
|
62
|
+
<text class="m-node__role" x="1038.00" y="264.80" text-anchor="middle">request.</text>
|
|
55
63
|
</a>
|
|
56
|
-
<a class="m-node m-node--pure-fn" href="features/get-invite-codes/invite-code-generator.html" data-feature="get-invite-codes" data-submodule="invite-code-generator">
|
|
57
|
-
<
|
|
58
|
-
<
|
|
59
|
-
<text class="m-
|
|
60
|
-
<text class="m-
|
|
64
|
+
<a class="m-node m-node--pure-fn" href="features/get-invite-codes/invite-code-generator.html" data-feature="get-invite-codes" data-submodule="invite-code-generator" tabindex="0" aria-label="invite-code-generator — Pure helper that turns random bytes into a printable invite code. — open sub-module page">
|
|
65
|
+
<title>invite-code-generator — Pure helper that turns random bytes into a printable invite code.</title>
|
|
66
|
+
<rect x="1372.00" y="129.00" width="220.00" height="126.00" rx="10" ry="10" />
|
|
67
|
+
<text class="m-node__title" x="1482.00" y="159.00" text-anchor="middle">invite-code-generator</text>
|
|
68
|
+
<text class="m-node__kind" x="1482.00" y="175.00" text-anchor="middle">pure function</text>
|
|
69
|
+
<text class="m-node__role" x="1482.00" y="195.00" text-anchor="middle">Pure helper that turns random</text>
|
|
70
|
+
<text class="m-node__role" x="1482.00" y="211.00" text-anchor="middle">bytes into a printable invite</text>
|
|
71
|
+
<text class="m-node__role" x="1482.00" y="227.00" text-anchor="middle">code.</text>
|
|
61
72
|
</a>
|
|
62
|
-
<a class="m-node m-node--db" href="features/get-invite-codes/postgresql.html" data-feature="get-invite-codes" data-submodule="postgresql">
|
|
63
|
-
<
|
|
64
|
-
<
|
|
65
|
-
<text class="m-
|
|
66
|
-
<text class="m-
|
|
73
|
+
<a class="m-node m-node--db" href="features/get-invite-codes/postgresql.html" data-feature="get-invite-codes" data-submodule="postgresql" tabindex="0" aria-label="postgresql — Owns the `invite_codes` table (producer side of the cross-feature data row). — open sub-module page">
|
|
74
|
+
<title>postgresql — Owns the `invite_codes` table (producer side of the cross-feature data row).</title>
|
|
75
|
+
<rect x="1372.00" y="279.00" width="220.00" height="126.00" rx="10" ry="10" />
|
|
76
|
+
<text class="m-node__title" x="1482.00" y="309.00" text-anchor="middle">postgresql</text>
|
|
77
|
+
<text class="m-node__kind" x="1482.00" y="325.00" text-anchor="middle">database</text>
|
|
78
|
+
<text class="m-node__role" x="1482.00" y="345.00" text-anchor="middle">Owns the `invite_codes` table</text>
|
|
79
|
+
<text class="m-node__role" x="1482.00" y="361.00" text-anchor="middle">(producer side of the</text>
|
|
80
|
+
<text class="m-node__role" x="1482.00" y="377.00" text-anchor="middle">cross-feature data row).</text>
|
|
67
81
|
</a>
|
|
68
|
-
<a class="m-node m-node--ui" href="features/invite-code-registration/web-register-ui.html" data-feature="invite-code-registration" data-submodule="web-register-ui">
|
|
69
|
-
<
|
|
70
|
-
<
|
|
71
|
-
<text class="m-
|
|
72
|
-
<text class="m-
|
|
82
|
+
<a class="m-node m-node--ui" href="features/invite-code-registration/web-register-ui.html" data-feature="invite-code-registration" data-submodule="web-register-ui" tabindex="0" aria-label="web-register-ui — React page that captures email, password, and invite code. — open sub-module page">
|
|
83
|
+
<title>web-register-ui — React page that captures email, password, and invite code.</title>
|
|
84
|
+
<rect x="2041.00" y="222.00" width="220.00" height="110.00" rx="10" ry="10" />
|
|
85
|
+
<text class="m-node__title" x="2151.00" y="252.00" text-anchor="middle">web-register-ui</text>
|
|
86
|
+
<text class="m-node__kind" x="2151.00" y="268.00" text-anchor="middle">UI</text>
|
|
87
|
+
<text class="m-node__role" x="2151.00" y="288.00" text-anchor="middle">React page that captures email,</text>
|
|
88
|
+
<text class="m-node__role" x="2151.00" y="304.00" text-anchor="middle">password, and invite code.</text>
|
|
73
89
|
</a>
|
|
74
|
-
<a class="m-node m-node--api" href="features/invite-code-registration/public-api.html" data-feature="invite-code-registration" data-submodule="public-api">
|
|
75
|
-
<
|
|
76
|
-
<
|
|
77
|
-
<text class="m-
|
|
78
|
-
<text class="m-
|
|
90
|
+
<a class="m-node m-node--api" href="features/invite-code-registration/public-api.html" data-feature="invite-code-registration" data-submodule="public-api" tabindex="0" aria-label="public-api — HTTP boundary for `/api/register` POST requests. — open sub-module page">
|
|
91
|
+
<title>public-api — HTTP boundary for `/api/register` POST requests.</title>
|
|
92
|
+
<rect x="2475.00" y="222.00" width="220.00" height="110.00" rx="10" ry="10" />
|
|
93
|
+
<text class="m-node__title" x="2585.00" y="252.00" text-anchor="middle">public-api</text>
|
|
94
|
+
<text class="m-node__kind" x="2585.00" y="268.00" text-anchor="middle">API</text>
|
|
95
|
+
<text class="m-node__role" x="2585.00" y="288.00" text-anchor="middle">HTTP boundary for</text>
|
|
96
|
+
<text class="m-node__role" x="2585.00" y="304.00" text-anchor="middle">`/api/register` POST requests.</text>
|
|
79
97
|
</a>
|
|
80
|
-
<a class="m-node m-node--service" href="features/invite-code-registration/registration-service.html" data-feature="invite-code-registration" data-submodule="registration-service">
|
|
81
|
-
<
|
|
82
|
-
<
|
|
83
|
-
<text class="m-
|
|
84
|
-
<text class="m-
|
|
98
|
+
<a class="m-node m-node--service" href="features/invite-code-registration/registration-service.html" data-feature="invite-code-registration" data-submodule="registration-service" tabindex="0" aria-label="registration-service — Owns the registration transaction (consumer side of the invite_codes data row). — open sub-module page">
|
|
99
|
+
<title>registration-service — Owns the registration transaction (consumer side of the invite_codes data row).</title>
|
|
100
|
+
<rect x="2987.00" y="235.00" width="220.00" height="126.00" rx="10" ry="10" />
|
|
101
|
+
<text class="m-node__title" x="3097.00" y="265.00" text-anchor="middle">registration-service</text>
|
|
102
|
+
<text class="m-node__kind" x="3097.00" y="281.00" text-anchor="middle">service</text>
|
|
103
|
+
<text class="m-node__role" x="3097.00" y="301.00" text-anchor="middle">Owns the registration</text>
|
|
104
|
+
<text class="m-node__role" x="3097.00" y="317.00" text-anchor="middle">transaction (consumer side of</text>
|
|
105
|
+
<text class="m-node__role" x="3097.00" y="333.00" text-anchor="middle">the invite_codes data row).</text>
|
|
85
106
|
</a>
|
|
86
|
-
<a class="m-node m-node--db" href="features/invite-code-registration/postgresql.html" data-feature="invite-code-registration" data-submodule="postgresql">
|
|
87
|
-
<
|
|
88
|
-
<
|
|
89
|
-
<text class="m-
|
|
90
|
-
<text class="m-
|
|
107
|
+
<a class="m-node m-node--db" href="features/invite-code-registration/postgresql.html" data-feature="invite-code-registration" data-submodule="postgresql" tabindex="0" aria-label="postgresql — Stores `users` rows and applies invite-code state transitions inside the registration tx. — open sub-module page">
|
|
108
|
+
<title>postgresql — Stores `users` rows and applies invite-code state transitions inside the registration tx.</title>
|
|
109
|
+
<rect x="3499.00" y="228.20" width="220.00" height="126.00" rx="10" ry="10" />
|
|
110
|
+
<text class="m-node__title" x="3609.00" y="258.20" text-anchor="middle">postgresql</text>
|
|
111
|
+
<text class="m-node__kind" x="3609.00" y="274.20" text-anchor="middle">database</text>
|
|
112
|
+
<text class="m-node__role" x="3609.00" y="294.20" text-anchor="middle">Stores `users` rows and applies</text>
|
|
113
|
+
<text class="m-node__role" x="3609.00" y="310.20" text-anchor="middle">invite-code state transitions</text>
|
|
114
|
+
<text class="m-node__role" x="3609.00" y="326.20" text-anchor="middle">inside the registration tx.</text>
|
|
91
115
|
</a>
|
|
92
116
|
<g class="m-edge m-edge--data-row" data-edge="cross-issuance-to-postgres-codes">
|
|
93
|
-
<path d="
|
|
94
|
-
<text class="m-edge__label" x="
|
|
117
|
+
<path d="M1111.00,227.60 L1121.00,227.60 L1121.00,334.00 L1306.00,334.00 L1306.00,333.50 L1332.00,333.50" fill="none" marker-end="url(#arrow-data-row)" />
|
|
118
|
+
<text class="m-edge__label" x="1221.50" y="350.00" text-anchor="middle">INSERT invite_codes</text>
|
|
95
119
|
</g>
|
|
96
120
|
<g class="m-edge m-edge--data-row" data-edge="cross-postgres-codes-to-registration">
|
|
97
|
-
<path d="
|
|
98
|
-
<text class="m-edge__label" x="
|
|
121
|
+
<path d="M1592.00,342.00 L2961.00,342.00 L2961.00,319.00 L2987.00,319.00" fill="none" marker-end="url(#arrow-data-row)" />
|
|
122
|
+
<text class="m-edge__label" x="1816.50" y="358.00" text-anchor="middle">read/consume invite_codes</text>
|
|
99
123
|
</g>
|
|
100
124
|
<g class="m-edge m-edge--call" data-edge="e-ui-api">
|
|
101
|
-
<path d="
|
|
102
|
-
<text class="m-edge__label" x="
|
|
125
|
+
<path d="M284.00,229.80 L491.00,229.80" fill="none" marker-end="url(#arrow-call)" />
|
|
126
|
+
<text class="m-edge__label" x="387.50" y="245.80" text-anchor="middle">POST /api/invites</text>
|
|
103
127
|
</g>
|
|
104
128
|
<g class="m-edge m-edge--call" data-edge="e-api-svc">
|
|
105
|
-
<path d="
|
|
106
|
-
<text class="m-edge__label" x="
|
|
129
|
+
<path d="M711.00,229.80 L925.00,229.80" fill="none" marker-end="url(#arrow-call)" />
|
|
130
|
+
<text class="m-edge__label" x="818.00" y="245.80" text-anchor="middle">Issue(ctx, userId)</text>
|
|
107
131
|
</g>
|
|
108
132
|
<g class="m-edge m-edge--call" data-edge="e-svc-gen">
|
|
109
|
-
<path d="
|
|
110
|
-
<text class="m-edge__label" x="
|
|
133
|
+
<path d="M1151.00,192.00 L1372.00,192.00" fill="none" marker-end="url(#arrow-call)" />
|
|
134
|
+
<text class="m-edge__label" x="1261.50" y="208.00" text-anchor="middle">encode(rand)</text>
|
|
111
135
|
</g>
|
|
112
136
|
<g class="m-edge m-edge--call" data-edge="e-svc-db">
|
|
113
|
-
<path d="
|
|
114
|
-
<text class="m-edge__label" x="
|
|
137
|
+
<path d="M1151.00,242.40 L1171.00,242.40 L1171.00,342.00 L1372.00,342.00" fill="none" marker-end="url(#arrow-call)" />
|
|
138
|
+
<text class="m-edge__label" x="1261.50" y="358.00" text-anchor="middle">INSERT invite_codes</text>
|
|
115
139
|
</g>
|
|
116
140
|
<g class="m-edge m-edge--return" data-edge="e-db-svc-return">
|
|
117
|
-
<path d="
|
|
118
|
-
<text class="m-edge__label" x="
|
|
141
|
+
<path d="M1372.00,310.50 L1346.00,310.50 L1346.00,224.00 L1161.00,224.00 L1161.00,217.20 L1151.00,217.20" fill="none" marker-end="url(#arrow-return)" />
|
|
142
|
+
<text class="m-edge__label" x="1261.50" y="240.00" text-anchor="middle">rowid</text>
|
|
119
143
|
</g>
|
|
120
144
|
<g class="m-edge m-edge--call" data-edge="e-ui-api">
|
|
121
|
-
<path d="
|
|
122
|
-
<text class="m-edge__label" x="
|
|
145
|
+
<path d="M2261.00,277.00 L2475.00,277.00" fill="none" marker-end="url(#arrow-call)" />
|
|
146
|
+
<text class="m-edge__label" x="2368.00" y="269.00" text-anchor="middle">POST /api/register</text>
|
|
123
147
|
</g>
|
|
124
148
|
<g class="m-edge m-edge--call" data-edge="e-api-svc">
|
|
125
|
-
<path d="
|
|
126
|
-
<text class="m-edge__label" x="
|
|
149
|
+
<path d="M2695.00,277.00 L2987.00,277.00" fill="none" marker-end="url(#arrow-call)" />
|
|
150
|
+
<text class="m-edge__label" x="2841.00" y="269.00" text-anchor="middle">RegisterWithInvite(ctx, RegisterInput)</text>
|
|
127
151
|
</g>
|
|
128
152
|
<g class="m-edge m-edge--call" data-edge="e-svc-db-select">
|
|
129
|
-
<path d="
|
|
130
|
-
<text class="m-edge__label" x="
|
|
153
|
+
<path d="M3207.00,285.40 L3473.00,285.40 L3473.00,278.60 L3499.00,278.60" fill="none" marker-end="url(#arrow-call)" />
|
|
154
|
+
<text class="m-edge__label" x="3353.00" y="301.40" text-anchor="middle">SELECT invite_codes FOR UPDATE</text>
|
|
131
155
|
</g>
|
|
132
156
|
<g class="m-edge m-edge--call" data-edge="e-svc-db-insert">
|
|
133
|
-
<path d="
|
|
134
|
-
<text class="m-edge__label" x="
|
|
157
|
+
<path d="M3207.00,310.60 L3217.00,310.60 L3217.00,317.40 L3473.00,317.40 L3473.00,303.80 L3499.00,303.80" fill="none" marker-end="url(#arrow-call)" />
|
|
158
|
+
<text class="m-edge__label" x="3353.00" y="333.40" text-anchor="middle">INSERT users</text>
|
|
135
159
|
</g>
|
|
136
160
|
<g class="m-edge m-edge--call" data-edge="e-svc-db-update">
|
|
137
|
-
<path d="
|
|
138
|
-
<text class="m-edge__label" x="
|
|
161
|
+
<path d="M3207.00,335.80 L3217.00,335.80 L3217.00,349.40 L3473.00,349.40 L3473.00,329.00 L3499.00,329.00" fill="none" marker-end="url(#arrow-call)" />
|
|
162
|
+
<text class="m-edge__label" x="3353.00" y="365.40" text-anchor="middle">UPDATE invite_codes.consumed_at</text>
|
|
139
163
|
</g>
|
|
140
164
|
<g class="m-edge m-edge--return" data-edge="e-db-svc-return">
|
|
141
|
-
<path d="
|
|
142
|
-
<text class="m-edge__label" x="
|
|
165
|
+
<path d="M3499.00,253.40 L3217.00,253.40 L3217.00,260.20 L3207.00,260.20" fill="none" marker-end="url(#arrow-return)" />
|
|
166
|
+
<text class="m-edge__label" x="3353.00" y="269.40" text-anchor="middle">row | rows_affected</text>
|
|
143
167
|
</g>
|
|
144
168
|
</g>
|
|
145
169
|
</svg>
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
Binary file
|
|
Binary file
|