fix(auth): fix listMembers response shape and updateMember role sync

- listMembers was returning { data, total } but frontend expects TenantMember[]
  directly, causing members.map is not a function crash on the detail page.
- updateMember now also syncs role changes to public.users so the new role
  takes effect the next time the user logs in (JWT is generated from public.users).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-03-07 05:39:52 -08:00
parent 6e50f4cc50
commit e48615e713
1 changed files with 8 additions and 2 deletions

View File

@ -170,14 +170,13 @@ export class TenantController {
const rows = await qr.query(
`SELECT id, email, name, roles, is_active, created_at FROM users ORDER BY created_at ASC`,
);
const data = rows.map((row: any) => ({
return rows.map((row: any) => ({
id: row.id,
email: row.email,
name: row.name,
role: this.parseRole(row.roles),
joinedAt: row.created_at,
}));
return { data, total: data.length };
} finally {
await qr.release();
}
@ -230,6 +229,13 @@ export class TenantController {
`UPDATE users SET ${updates.join(', ')} WHERE id = $${idx}`,
params,
);
// Sync role change to public.users so it takes effect on next login
if (body.role) {
await this.dataSource.query(
`UPDATE public.users SET roles = $1, updated_at = NOW() WHERE id = $2`,
[[body.role], memberId],
);
}
}
const updated = await qr.query(