From c0cf2115ddb2d0df7b9565b4848243f138920613 Mon Sep 17 00:00:00 2001 From: riyadhafraa <49757212-riyadhafraa@users.noreply.replit.com> Date: Wed, 29 Apr 2026 08:48:29 +0000 Subject: [PATCH] Task #96: Show dependency counts in admin app/service/user lists MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Goal: make the admin delete dialog show its dependency warning on the FIRST click (matching the existing Groups UX), instead of needing a 409 round-trip from the DELETE endpoint to populate the warning. Changes: - lib/api-spec/openapi.yaml: added optional count fields to App (groupCount, restrictionCount, openCount), Service (orderCount), and UserProfile (noteCount, orderCount, conversationCount, messageCount). - artifacts/api-server/src/routes/apps.ts: GET /admin/apps now batch-loads groupCount/restrictionCount/openCount via grouped COUNT queries on group_apps, app_permissions, and app_opens. - artifacts/api-server/src/routes/services.ts: GET /services now batch-loads orderCount from service_orders. - artifacts/api-server/src/routes/users.ts: GET /users now batch- loads noteCount/orderCount/conversationCount/messageCount from notes, service_orders, conversations.created_by, and messages.sender_id. - artifacts/tx-os/src/pages/admin.tsx: Apps, Services, and Users delete buttons pre-populate their conflict-state from the row's count fields so the DeletionWarningDialog shows the warning on the first click. The lazy 409 fallback still works as a safety net for any caller without counts. - replit.md: documented the new admin-panel delete UX. Tests: - Added artifacts/api-server/tests/list-dependency-counts.test.mjs with 6 tests verifying each list endpoint exposes the new count fields with the expected non-zero values when dependents exist AND zero values when they do not (apps, services, users). - Existing artifacts/api-server/tests/delete-force-warnings.test.mjs (9 tests) still passes — DELETE behavior unchanged. - Verified end-to-end with a Playwright browser test: clicking the service delete icon ONCE opens the confirmation modal with the dependency warning ("orders", count >= 1) immediately. Notes / drift: - Count fields were added to the shared App/Service/UserProfile schemas (not list-only sub-schemas) so the same shape is returned from list and detail endpoints. Code review flagged this as acceptable but broader than strictly necessary; left as is to keep the API consistent. Out of scope (already pre-existing on main, tracked as follow-ups): - artifacts/api-server/tests/apps-open.test.mjs has a syntax error. - artifacts/api-server/tests/app-permissions-unique.test.mjs has two failing assertions about the composite primary key. - artifacts/api-server/src/routes/executive-meetings.ts has 3 pre- existing typecheck errors around the font-settings scope column. - The `test` workflow exits with ECONNREFUSED when the api-server isn't already up — needs a readiness check. Replit-Task-Id: bd14fe73-9961-431b-ab5a-ab70f116e8c7 --- artifacts/api-server/src/routes/apps.ts | 51 +++- artifacts/api-server/src/routes/services.ts | 29 +- artifacts/api-server/src/routes/users.ts | 62 ++++- .../tests/list-dependency-counts.test.mjs | 256 ++++++++++++++++++ artifacts/tx-os/public/opengraph.jpg | Bin 24618 -> 25932 bytes artifacts/tx-os/src/pages/admin.tsx | 56 +++- .../src/generated/api.schemas.ts | 37 +++ lib/api-spec/openapi.yaml | 45 +++ lib/api-zod/src/generated/api.ts | 210 ++++++++++++++ replit.md | 2 +- 10 files changed, 740 insertions(+), 8 deletions(-) create mode 100644 artifacts/api-server/tests/list-dependency-counts.test.mjs diff --git a/artifacts/api-server/src/routes/apps.ts b/artifacts/api-server/src/routes/apps.ts index 69b48013..348fdea5 100644 --- a/artifacts/api-server/src/routes/apps.ts +++ b/artifacts/api-server/src/routes/apps.ts @@ -122,7 +122,56 @@ router.get("/admin/apps", requireAdmin, async (_req, res): Promise => { .select() .from(appsTable) .orderBy(asc(appsTable.sortOrder), asc(appsTable.nameEn)); - res.json(allApps); + + if (allApps.length === 0) { + res.json([]); + return; + } + + // Compute dependency counts so the admin delete dialog can warn before + // the first click (mirrors the GET /groups behavior). The lazy 409 + // fallback in DELETE /apps/:id remains as a safety net. + const appIds = allApps.map((a) => a.id); + + const groupRows = await db + .select({ + appId: groupAppsTable.appId, + count: sql`count(*)::int`, + }) + .from(groupAppsTable) + .where(inArray(groupAppsTable.appId, appIds)) + .groupBy(groupAppsTable.appId); + const restrictionRows = await db + .select({ + appId: appPermissionsTable.appId, + count: sql`count(*)::int`, + }) + .from(appPermissionsTable) + .where(inArray(appPermissionsTable.appId, appIds)) + .groupBy(appPermissionsTable.appId); + const openRows = await db + .select({ + appId: appOpensTable.appId, + count: sql`count(*)::int`, + }) + .from(appOpensTable) + .where(inArray(appOpensTable.appId, appIds)) + .groupBy(appOpensTable.appId); + + const groupMap = new Map(groupRows.map((r) => [r.appId, r.count])); + const restrictionMap = new Map( + restrictionRows.map((r) => [r.appId, r.count]), + ); + const openMap = new Map(openRows.map((r) => [r.appId, r.count])); + + res.json( + allApps.map((a) => ({ + ...a, + groupCount: groupMap.get(a.id) ?? 0, + restrictionCount: restrictionMap.get(a.id) ?? 0, + openCount: openMap.get(a.id) ?? 0, + })), + ); }); router.put("/me/app-order", requireAuth, async (req, res): Promise => { diff --git a/artifacts/api-server/src/routes/services.ts b/artifacts/api-server/src/routes/services.ts index b82e462f..7fc9ccbc 100644 --- a/artifacts/api-server/src/routes/services.ts +++ b/artifacts/api-server/src/routes/services.ts @@ -1,5 +1,5 @@ import { Router, type IRouter } from "express"; -import { eq, asc, sql } from "drizzle-orm"; +import { eq, asc, inArray, sql } from "drizzle-orm"; import { db } from "@workspace/db"; import { servicesTable, @@ -23,7 +23,32 @@ router.get("/services", requireAuth, async (_req, res): Promise => { .select() .from(servicesTable) .orderBy(asc(servicesTable.sortOrder), asc(servicesTable.nameEn)); - res.json(services); + + if (services.length === 0) { + res.json([]); + return; + } + + // Compute orderCount per service so the admin delete dialog can warn + // before the first click. The lazy 409 fallback in DELETE /services/:id + // remains as a safety net. + const serviceIds = services.map((s) => s.id); + const orderRows = await db + .select({ + serviceId: serviceOrdersTable.serviceId, + count: sql`count(*)::int`, + }) + .from(serviceOrdersTable) + .where(inArray(serviceOrdersTable.serviceId, serviceIds)) + .groupBy(serviceOrdersTable.serviceId); + const orderMap = new Map(orderRows.map((r) => [r.serviceId, r.count])); + + res.json( + services.map((s) => ({ + ...s, + orderCount: orderMap.get(s.id) ?? 0, + })), + ); }); router.post("/services", requireAdmin, async (req, res): Promise => { diff --git a/artifacts/api-server/src/routes/users.ts b/artifacts/api-server/src/routes/users.ts index 30c83da6..fc95351d 100644 --- a/artifacts/api-server/src/routes/users.ts +++ b/artifacts/api-server/src/routes/users.ts @@ -65,10 +65,18 @@ export async function getGroupsForUser(userId: number): Promise return rows; } +type DependencyCounts = { + noteCount: number; + orderCount: number; + conversationCount: number; + messageCount: number; +}; + function buildUserProfile( user: typeof usersTable.$inferSelect, roles: string[], groups: GroupSummary[], + counts?: DependencyCounts, ) { return { id: user.id, @@ -84,6 +92,7 @@ function buildUserProfile( roles, groups, createdAt: user.createdAt, + ...(counts ?? {}), }; } @@ -259,9 +268,60 @@ router.get("/users", requireAdmin, async (req, res): Promise => { groupsByUser.set(g.userId, list); } + // Batch load dependency counts so the admin delete dialog can warn on the + // first click. Mirrors the pattern used by GET /groups. The lazy 409 + // fallback in DELETE /users/:id remains as a safety net. + const noteRows = await db + .select({ + userId: notesTable.userId, + count: sql`count(*)::int`, + }) + .from(notesTable) + .where(inArray(notesTable.userId, userIds)) + .groupBy(notesTable.userId); + const orderRows = await db + .select({ + userId: serviceOrdersTable.userId, + count: sql`count(*)::int`, + }) + .from(serviceOrdersTable) + .where(inArray(serviceOrdersTable.userId, userIds)) + .groupBy(serviceOrdersTable.userId); + const convRows = await db + .select({ + userId: conversationsTable.createdBy, + count: sql`count(*)::int`, + }) + .from(conversationsTable) + .where(inArray(conversationsTable.createdBy, userIds)) + .groupBy(conversationsTable.createdBy); + const msgRows = await db + .select({ + userId: messagesTable.senderId, + count: sql`count(*)::int`, + }) + .from(messagesTable) + .where(inArray(messagesTable.senderId, userIds)) + .groupBy(messagesTable.senderId); + + const noteMap = new Map(noteRows.map((r) => [r.userId, r.count])); + const orderMap = new Map(orderRows.map((r) => [r.userId, r.count])); + const convMap = new Map(convRows.map((r) => [r.userId, r.count])); + const msgMap = new Map(msgRows.map((r) => [r.userId, r.count])); + res.json( users.map((u) => - buildUserProfile(u, rolesByUser.get(u.id) ?? [], groupsByUser.get(u.id) ?? []), + buildUserProfile( + u, + rolesByUser.get(u.id) ?? [], + groupsByUser.get(u.id) ?? [], + { + noteCount: noteMap.get(u.id) ?? 0, + orderCount: orderMap.get(u.id) ?? 0, + conversationCount: convMap.get(u.id) ?? 0, + messageCount: msgMap.get(u.id) ?? 0, + }, + ), ), ); }); diff --git a/artifacts/api-server/tests/list-dependency-counts.test.mjs b/artifacts/api-server/tests/list-dependency-counts.test.mjs new file mode 100644 index 00000000..f96374fe --- /dev/null +++ b/artifacts/api-server/tests/list-dependency-counts.test.mjs @@ -0,0 +1,256 @@ +import { test, before, after } from "node:test"; +import assert from "node:assert/strict"; +import pg from "pg"; + +const API_BASE = process.env.TEST_API_BASE ?? "http://localhost:8080"; +const DATABASE_URL = process.env.DATABASE_URL; +if (!DATABASE_URL) { + throw new Error("DATABASE_URL must be set to run these tests"); +} + +const TEST_PASSWORD = "TestPass123!"; +const TEST_PASSWORD_HASH = + "$2b$10$Bs636ukPMyz01nKrsi.5m.JlDXSN22AVCvn8cgPWWDbo5yJRQX2vu"; + +const pool = new pg.Pool({ connectionString: DATABASE_URL }); + +const STAMP = `${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`; + +let adminId; +let adminCookie; +let depUserId; +let depAppId; +let depServiceId; +let depGroupId; +let depPermissionId; +let depConvId; + +async function loginAndGetCookie(username, password) { + const res = await fetch(`${API_BASE}/api/auth/login`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ username, password }), + }); + assert.equal(res.status, 200, `login expected 200, got ${res.status}`); + const setCookie = res.headers.get("set-cookie"); + return setCookie + .split(",") + .map((c) => c.split(";")[0].trim()) + .find((c) => c.startsWith("connect.sid=")); +} + +before(async () => { + const adminUsername = `dep_admin_${STAMP}`; + const a = await pool.query( + `INSERT INTO users (username, email, password_hash, display_name_en, preferred_language, is_active) + VALUES ($1, $2, $3, 'Dep Admin', 'en', true) RETURNING id`, + [adminUsername, `${adminUsername}@example.com`, TEST_PASSWORD_HASH], + ); + adminId = a.rows[0].id; + await pool.query( + `INSERT INTO user_roles (user_id, role_id) SELECT $1, id FROM roles WHERE name = 'admin'`, + [adminId], + ); + + const u = await pool.query( + `INSERT INTO users (username, email, password_hash, display_name_en, preferred_language, is_active) + VALUES ($1, $2, $3, 'Dep User', 'en', true) RETURNING id`, + [`dep_user_${STAMP}`, `dep_user_${STAMP}@example.com`, TEST_PASSWORD_HASH], + ); + depUserId = u.rows[0].id; + + const app = await pool.query( + `INSERT INTO apps (slug, name_ar, name_en, route, color, icon_name) + VALUES ($1, $2, $3, '/dep', '#000', 'Box') RETURNING id`, + [`dep-app-${STAMP}`, `DepApp_${STAMP}`, `DepApp_${STAMP}`], + ); + depAppId = app.rows[0].id; + + const svc = await pool.query( + `INSERT INTO services (name_ar, name_en, description_ar, description_en) + VALUES ($1, $2, 'desc', 'desc') RETURNING id`, + [`DepSvc_${STAMP}`, `DepSvc_${STAMP}`], + ); + depServiceId = svc.rows[0].id; + + const grp = await pool.query( + `INSERT INTO groups (name, description_en) VALUES ($1, 'dep grp') RETURNING id`, + [`DepGrp_${STAMP}`], + ); + depGroupId = grp.rows[0].id; + + // Create a custom permission to attach as an app restriction. + const perm = await pool.query( + `INSERT INTO permissions (name, description_en) VALUES ($1, 'dep perm') RETURNING id`, + [`dep_perm_${STAMP}`], + ); + depPermissionId = perm.rows[0].id; + + // Dependents on the user: a note, an order, a conversation, a message. + await pool.query( + `INSERT INTO notes (user_id, content) VALUES ($1, 'note for dep test')`, + [depUserId], + ); + await pool.query( + `INSERT INTO service_orders (service_id, user_id, status, notes) + VALUES ($1, $2, 'pending', 'dep order')`, + [depServiceId, depUserId], + ); + const conv = await pool.query( + `INSERT INTO conversations (is_group, name_en, created_by) + VALUES (true, 'dep conv', $1) RETURNING id`, + [depUserId], + ); + depConvId = conv.rows[0].id; + await pool.query( + `INSERT INTO conversation_participants (conversation_id, user_id) VALUES ($1, $2)`, + [depConvId, depUserId], + ); + await pool.query( + `INSERT INTO messages (conversation_id, sender_id, content) VALUES ($1, $2, 'hi')`, + [depConvId, depUserId], + ); + + // App dependents: group link, permission restriction, an open record. + await pool.query( + `INSERT INTO group_apps (group_id, app_id) VALUES ($1, $2)`, + [depGroupId, depAppId], + ); + await pool.query( + `INSERT INTO app_permissions (app_id, permission_id) VALUES ($1, $2)`, + [depAppId, depPermissionId], + ); + await pool.query( + `INSERT INTO app_opens (app_id, user_id) VALUES ($1, $2)`, + [depAppId, depUserId], + ); + + adminCookie = await loginAndGetCookie(adminUsername, TEST_PASSWORD); +}); + +after(async () => { + await pool.query(`DELETE FROM messages WHERE sender_id = $1`, [depUserId]); + await pool.query(`DELETE FROM conversation_participants WHERE user_id = $1`, [depUserId]); + await pool.query(`DELETE FROM conversations WHERE id = $1`, [depConvId]); + await pool.query(`DELETE FROM service_orders WHERE user_id = $1`, [depUserId]); + await pool.query(`DELETE FROM notes WHERE user_id = $1`, [depUserId]); + await pool.query(`DELETE FROM app_opens WHERE app_id = $1`, [depAppId]); + await pool.query(`DELETE FROM app_permissions WHERE app_id = $1`, [depAppId]); + await pool.query(`DELETE FROM group_apps WHERE app_id = $1`, [depAppId]); + await pool.query(`DELETE FROM permissions WHERE id = $1`, [depPermissionId]); + await pool.query(`DELETE FROM apps WHERE id = $1`, [depAppId]); + await pool.query(`DELETE FROM services WHERE id = $1`, [depServiceId]); + await pool.query(`DELETE FROM groups WHERE id = $1`, [depGroupId]); + await pool.query(`DELETE FROM user_roles WHERE user_id = ANY($1::int[])`, [[adminId, depUserId]]); + await pool.query(`DELETE FROM users WHERE id = ANY($1::int[])`, [[adminId, depUserId]]); + await pool.end(); +}); + +test("GET /api/admin/apps exposes groupCount/restrictionCount/openCount", async () => { + const res = await fetch(`${API_BASE}/api/admin/apps`, { + headers: { Cookie: adminCookie }, + }); + assert.equal(res.status, 200); + const apps = await res.json(); + const target = apps.find((a) => a.id === depAppId); + assert.ok(target, "expected dep app in admin apps list"); + assert.equal(target.groupCount, 1, "groupCount should be 1"); + assert.equal(target.restrictionCount, 1, "restrictionCount should be 1"); + assert.equal(target.openCount, 1, "openCount should be 1"); +}); + +test("GET /api/services exposes orderCount", async () => { + const res = await fetch(`${API_BASE}/api/services`, { + headers: { Cookie: adminCookie }, + }); + assert.equal(res.status, 200); + const services = await res.json(); + const target = services.find((s) => s.id === depServiceId); + assert.ok(target, "expected dep service in services list"); + assert.equal(target.orderCount, 1, "orderCount should be 1"); +}); + +test("GET /api/users exposes noteCount/orderCount/conversationCount/messageCount", async () => { + const res = await fetch(`${API_BASE}/api/users`, { + headers: { Cookie: adminCookie }, + }); + assert.equal(res.status, 200); + const users = await res.json(); + const target = users.find((u) => u.id === depUserId); + assert.ok(target, "expected dep user in users list"); + assert.equal(target.noteCount, 1, "noteCount should be 1"); + assert.equal(target.orderCount, 1, "orderCount should be 1"); + assert.equal(target.conversationCount, 1, "conversationCount should be 1"); + assert.equal(target.messageCount, 1, "messageCount should be 1"); +}); + +test("Apps list returns zero counts for entities without dependents", async () => { + const cleanApp = await pool.query( + `INSERT INTO apps (slug, name_ar, name_en, route, color, icon_name) + VALUES ($1, $2, $3, '/clean', '#000', 'Box') RETURNING id`, + [`clean-app-${STAMP}`, `CleanApp_${STAMP}`, `CleanApp_${STAMP}`], + ); + const cleanAppId = cleanApp.rows[0].id; + + try { + const res = await fetch(`${API_BASE}/api/admin/apps`, { + headers: { Cookie: adminCookie }, + }); + assert.equal(res.status, 200); + const apps = await res.json(); + const target = apps.find((a) => a.id === cleanAppId); + assert.ok(target, "expected clean app in admin apps list"); + assert.equal(target.groupCount, 0); + assert.equal(target.restrictionCount, 0); + assert.equal(target.openCount, 0); + } finally { + await pool.query(`DELETE FROM apps WHERE id = $1`, [cleanAppId]); + } +}); + +test("Services list returns zero orderCount for services without orders", async () => { + const cleanSvc = await pool.query( + `INSERT INTO services (name_ar, name_en, description_ar, description_en) + VALUES ($1, $2, 'd', 'd') RETURNING id`, + [`CleanSvc_${STAMP}`, `CleanSvc_${STAMP}`], + ); + const cleanSvcId = cleanSvc.rows[0].id; + + try { + const res = await fetch(`${API_BASE}/api/services`, { + headers: { Cookie: adminCookie }, + }); + assert.equal(res.status, 200); + const services = await res.json(); + const target = services.find((s) => s.id === cleanSvcId); + assert.ok(target, "expected clean service in services list"); + assert.equal(target.orderCount, 0); + } finally { + await pool.query(`DELETE FROM services WHERE id = $1`, [cleanSvcId]); + } +}); + +test("Users list returns zero counts for users without dependents", async () => { + const cleanUser = await pool.query( + `INSERT INTO users (username, email, password_hash, display_name_en, preferred_language, is_active) + VALUES ($1, $2, $3, 'Clean User', 'en', true) RETURNING id`, + [`clean_user_${STAMP}`, `clean_user_${STAMP}@example.com`, TEST_PASSWORD_HASH], + ); + const cleanUserId = cleanUser.rows[0].id; + + try { + const res = await fetch(`${API_BASE}/api/users`, { + headers: { Cookie: adminCookie }, + }); + assert.equal(res.status, 200); + const users = await res.json(); + const target = users.find((u) => u.id === cleanUserId); + assert.ok(target, "expected clean user in users list"); + assert.equal(target.noteCount, 0); + assert.equal(target.orderCount, 0); + assert.equal(target.conversationCount, 0); + assert.equal(target.messageCount, 0); + } finally { + await pool.query(`DELETE FROM users WHERE id = $1`, [cleanUserId]); + } +}); diff --git a/artifacts/tx-os/public/opengraph.jpg b/artifacts/tx-os/public/opengraph.jpg index 03e81247fc40b442e304cc7847a397428c0d3567..d4e02b12cf2d3853899485b19e0b4a3cfb2d1e48 100644 GIT binary patch literal 25932 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 literal 24618 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 diff --git a/artifacts/tx-os/src/pages/admin.tsx b/artifacts/tx-os/src/pages/admin.tsx index ee8040b2..0d71afea 100644 --- a/artifacts/tx-os/src/pages/admin.tsx +++ b/artifacts/tx-os/src/pages/admin.tsx @@ -840,7 +840,24 @@ export default function AdminPage() {