feat: add organization settings and invitations

This commit is contained in:
2026-07-02 05:12:35 -07:00
parent a555c9dd23
commit ba8097e583
20 changed files with 2959 additions and 130 deletions

View File

@@ -9,6 +9,7 @@ import {
elders,
joinRequests,
memberships,
organizationInvitations,
organizations,
roles,
rooms,
@@ -23,6 +24,7 @@ import type {
JoinRequest,
Membership,
Organization,
OrganizationInvitation,
Room,
Session,
SystemIncident,
@@ -40,6 +42,7 @@ export async function readData(): Promise<AppData> {
accountRows,
membershipRows,
joinRequestRows,
invitationRows,
sessionRows,
elderRows,
roomRows,
@@ -62,6 +65,16 @@ export async function readData(): Promise<AppData> {
.innerJoin(accounts, eq(accounts.id, joinRequests.accountId))
.innerJoin(organizations, eq(organizations.id, joinRequests.organizationId))
.orderBy(desc(joinRequests.createdAt)),
database
.select({
invitation: organizationInvitations,
organizationName: organizations.name,
roleLabel: roles.label,
})
.from(organizationInvitations)
.innerJoin(organizations, eq(organizations.id, organizationInvitations.organizationId))
.innerJoin(roles, eq(roles.id, organizationInvitations.roleId))
.orderBy(desc(organizationInvitations.createdAt)),
database.select().from(sessions).orderBy(desc(sessions.createdAt)),
database.select().from(elders).orderBy(desc(elders.createdAt)),
database.select().from(rooms).orderBy(desc(rooms.createdAt)),
@@ -112,6 +125,14 @@ export async function readData(): Promise<AppData> {
name: row.name,
slug: row.slug,
status: row.status,
registrationEnabled: row.registrationEnabled,
oidcEnabled: row.oidcEnabled,
oidcIssuerUrl: row.oidcIssuerUrl,
oidcClientId: row.oidcClientId,
oidcHasClientSecret: row.oidcClientSecret.length > 0,
oidcScopes: row.oidcScopes,
oidcRedirectUri: row.oidcRedirectUri,
oidcAutoProvision: row.oidcAutoProvision,
createdAt: iso(row.createdAt),
updatedAt: iso(row.updatedAt),
}));
@@ -158,6 +179,23 @@ export async function readData(): Promise<AppData> {
createdAt: iso(row.request.createdAt),
}));
const organizationInvitationsData: OrganizationInvitation[] = invitationRows.map((row) => ({
id: row.invitation.id,
organizationId: row.invitation.organizationId,
organizationName: row.organizationName,
roleId: row.invitation.roleId,
roleLabel: row.roleLabel,
email: row.invitation.email,
token: row.invitation.token,
status: row.invitation.status as OrganizationInvitation["status"],
createdByAccountId: row.invitation.createdByAccountId ?? undefined,
acceptedByAccountId: row.invitation.acceptedByAccountId ?? undefined,
acceptedAt: row.invitation.acceptedAt ? iso(row.invitation.acceptedAt) : undefined,
expiresAt: iso(row.invitation.expiresAt),
createdAt: iso(row.invitation.createdAt),
updatedAt: iso(row.invitation.updatedAt),
}));
const sessionsData: Session[] = sessionRows.map((row) => ({
id: row.id,
accountId: row.accountId,
@@ -243,6 +281,7 @@ export async function readData(): Promise<AppData> {
accounts: accountsData,
memberships: membershipsData,
joinRequests: joinRequestsData,
organizationInvitations: organizationInvitationsData,
sessions: sessionsData,
elders: eldersData,
rooms: roomsData,