Skip to content

Commit 7b4ffb3

Browse files
committed
Complete provider failure behavior, Supabase activation readiness, users roles migration, Site Setup ownership, and final DB/Auth lane audit - PR_26166_130-134-db-auth-finish-line
1 parent 5320402 commit 7b4ffb3

17 files changed

Lines changed: 2241 additions & 297 deletions

.env.example

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Game Foundry Studio local development environment
22

3-
# Keep Local DB active by default. Future Supabase provider selectors stay inactive
4-
# until a dedicated adapter PR enables them.
3+
# Local DB is explicitly selected for local development. Selecting Supabase
4+
# without complete configuration reports provider diagnostics instead of falling back.
55
GAMEFOUNDRY_AUTH_PROVIDER=local-db
66
GAMEFOUNDRY_DB_PROVIDER=local-db
77

admin/site-setup.html

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ <h2>Admin</h2>
4646
<label>Setup Area <select disabled><option>Default roles</option><option>First admin</option><option>Tool metadata bootstrap</option><option>Starter platform settings</option><option>Ticket categories</option></select></label>
4747
<label>Review Mode <select disabled><option>Foundation only</option><option>Local DB dry run</option><option>Admin approval</option></select></label>
4848
<button class="btn btn--compact" type="button" data-admin-setup-reseed>Reseed Local DB</button>
49+
<button class="btn btn--compact" type="button" data-admin-setup-refresh>Refresh Setup Status</button>
4950
<p class="status" role="status" data-admin-setup-status>SKIP: No setup action has been run.</p>
5051
</div>
5152
</details>
@@ -69,12 +70,12 @@ <h2 id="admin-site-setup-title">Controlled Setup Foundation</h2>
6970
<th scope="col">Guardrail</th>
7071
</tr>
7172
</thead>
72-
<tbody>
73-
<tr><td>Default Roles</td><td>Create approved role records</td><td>Foundation</td><td>Local DB contract required</td></tr>
74-
<tr><td>First Admin</td><td>Assign the initial admin user</td><td>Foundation</td><td>No hidden default user</td></tr>
75-
<tr><td>Tool Metadata Bootstrap</td><td>Seed active tool metadata</td><td>Foundation</td><td>Shared metadata source required</td></tr>
76-
<tr><td>Starter Platform Settings</td><td>Create baseline settings records</td><td>Foundation</td><td>Visible diagnostics required</td></tr>
77-
<tr><td>Ticket/Support Categories</td><td>Prepare support category setup</td><td>Foundation</td><td>Admin approval required</td></tr>
73+
<tbody data-admin-setup-status-rows>
74+
<tr><td>Default Roles</td><td>Create approved role records</td><td>SKIP</td><td>Refresh setup status to read server-owned diagnostics.</td></tr>
75+
<tr><td>First Admin</td><td>Assign the initial admin user</td><td>SKIP</td><td>Refresh setup status to read server-owned diagnostics.</td></tr>
76+
<tr><td>Tool Metadata Bootstrap</td><td>Seed active tool metadata</td><td>SKIP</td><td>Refresh setup status to read server-owned diagnostics.</td></tr>
77+
<tr><td>Starter Platform Settings</td><td>Create baseline settings records</td><td>SKIP</td><td>Refresh setup status to read server-owned diagnostics.</td></tr>
78+
<tr><td>Support Categories</td><td>Prepare support category setup</td><td>SKIP</td><td>Refresh setup status to read server-owned diagnostics.</td></tr>
7879
</tbody>
7980
</table>
8081
</div>

assets/theme-v2/js/admin-setup-actions.js

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import { reseedAdminSetup } from "../../../src/engine/api/admin-setup-api-client.js";
1+
import { readAdminSetupStatus, reseedAdminSetup } from "../../../src/engine/api/admin-setup-api-client.js";
22

33
const reseedButtons = Array.from(document.querySelectorAll("[data-admin-setup-reseed]"));
4+
const refreshButtons = Array.from(document.querySelectorAll("[data-admin-setup-refresh]"));
45
const statusFields = Array.from(document.querySelectorAll("[data-admin-setup-status]"));
6+
const statusRows = Array.from(document.querySelectorAll("[data-admin-setup-status-rows]"));
57

68
function setStatus(message, status = "PASS") {
79
const text = `${status}: ${message}`;
@@ -11,7 +13,7 @@ function setStatus(message, status = "PASS") {
1113
}
1214

1315
function setBusy(isBusy) {
14-
reseedButtons.forEach((button) => {
16+
[...reseedButtons, ...refreshButtons].forEach((button) => {
1517
button.disabled = isBusy;
1618
if (isBusy) {
1719
button.setAttribute("aria-disabled", "true");
@@ -21,6 +23,41 @@ function setBusy(isBusy) {
2123
});
2224
}
2325

26+
function appendCell(row, text) {
27+
const cell = document.createElement("td");
28+
cell.textContent = text;
29+
row.appendChild(cell);
30+
}
31+
32+
function renderSetupRows(report) {
33+
statusRows.forEach((body) => {
34+
body.replaceChildren();
35+
(report.areas || []).forEach((area) => {
36+
const row = document.createElement("tr");
37+
appendCell(row, area.label || area.id || "Setup Area");
38+
appendCell(row, area.action || "Server-owned setup check");
39+
appendCell(row, area.status || "WARN");
40+
appendCell(row, area.message || "No setup status message returned.");
41+
body.appendChild(row);
42+
});
43+
});
44+
}
45+
46+
function refreshSetupStatus() {
47+
setBusy(true);
48+
setStatus("Reading Site Setup status through Admin setup.", "WARN");
49+
try {
50+
const report = readAdminSetupStatus();
51+
renderSetupRows(report);
52+
setStatus(report.message || "Site Setup status refreshed.", report.status || "PASS");
53+
} catch (error) {
54+
const message = error instanceof Error ? error.message : String(error || "Admin setup status failed.");
55+
setStatus(message, "FAIL");
56+
} finally {
57+
setBusy(false);
58+
}
59+
}
60+
2461
function runReseed() {
2562
setBusy(true);
2663
setStatus("Running Local DB reseed through Admin setup.", "WARN");
@@ -41,3 +78,7 @@ function runReseed() {
4178
reseedButtons.forEach((button) => {
4279
button.addEventListener("click", runReseed);
4380
});
81+
82+
refreshButtons.forEach((button) => {
83+
button.addEventListener("click", refreshSetupStatus);
84+
});
Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
1-
# git status --short
2-
M docs_build/dev/reports/codex_changed_files.txt
3-
M docs_build/dev/reports/codex_review.diff
4-
?? docs_build/dev/reports/pr129-local-db-migration-audit.md
5-
6-
# git ls-files --others --exclude-standard
7-
docs_build/dev/reports/pr129-local-db-migration-audit.md
8-
9-
# git diff --stat
10-
docs_build/dev/reports/codex_changed_files.txt | 20 +-
11-
docs_build/dev/reports/codex_review.diff | 1001 +++++-------------------
12-
2 files changed, 215 insertions(+), 806 deletions(-)
1+
.env.example
2+
admin/site-setup.html
3+
assets/theme-v2/js/admin-setup-actions.js
4+
docs_build/dev/reports/codex_changed_files.txt
5+
docs_build/dev/reports/codex_review.diff
6+
docs_build/dev/reports/coverage_changed_js_guardrail.txt
7+
docs_build/dev/reports/playwright_v8_coverage_report.txt
8+
docs_build/dev/reports/pr130-provider-failure-contract.md
9+
docs_build/dev/reports/pr131-supabase-dev-activation-runtime.md
10+
docs_build/dev/reports/pr132-supabase-users-roles-migration.md
11+
docs_build/dev/reports/pr133-site-setup-productionization.md
12+
docs_build/dev/reports/pr134-db-migration-finish-line-audit.md
13+
src/dev-runtime/auth/provider-contract-stubs.mjs
14+
src/dev-runtime/server/local-api-router.mjs
15+
src/engine/api/admin-setup-api-client.js
16+
tests/dev-runtime/SupabaseProviderContractStub.test.mjs
17+
tests/playwright/tools/LoginSessionMode.spec.mjs

0 commit comments

Comments
 (0)