@mesob/auth-hono 0.4.7 → 0.5.2
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/dist/{index-DssTTD4U.d.ts → index-CDgzxZzO.d.ts} +8 -1
- package/dist/{index-Cb7JZobZ.d.ts → index-Dhe5obDc.d.ts} +2 -58
- package/dist/index.d.ts +5 -5
- package/dist/index.js +591 -491
- package/dist/index.js.map +1 -1
- package/dist/lib/cleanup.d.ts +2 -2
- package/dist/lib/cookie.d.ts +3 -3
- package/dist/lib/has-role-permission.d.ts +3 -3
- package/dist/lib/iam-seed.d.ts +4 -76
- package/dist/lib/normalize-auth-response.d.ts +3 -3
- package/dist/lib/normalize-user.d.ts +3 -3
- package/dist/lib/openapi-config.d.ts +3 -3
- package/dist/lib/permission-catalog.d.ts +2 -2
- package/dist/lib/phone-validation.d.ts +3 -3
- package/dist/lib/session.d.ts +3 -3
- package/dist/lib/tenant.d.ts +3 -3
- package/package.json +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/db/index.ts","../src/db/relations.ts","../src/db/schema.ts","../src/handler.ts","../src/db/orm/session.ts","../src/db/orm/tenant.ts","../src/db/orm/user.ts","../src/lib/user-auth-select.ts","../src/lib/cookie.ts","../src/lib/crypto.ts","../src/lib/error-handler.ts","../src/routes/index.ts","../src/routes/auth/auth.route.ts","../src/routes/auth.schema.ts","../src/routes/auth/handler/check-account.ts","../src/lib/tenant.ts","../src/routes/auth/handler/sign-in.ts","../src/errors.ts","../src/lib/normalize-auth-response.ts","../src/lib/session.ts","../src/routes/auth/helper/session.ts","../src/routes/auth/helper/user.ts","../src/routes/auth/helper/verification.ts","../src/routes/auth/handler/sign-out.ts","../src/db/transaction.ts","../src/lib/phone-validation.ts","../src/routes/auth/handler/sign-up.ts","../src/routes/domains/domains.route.ts","../src/lib/has-role-permission.ts","../src/routes/domains/domains.schema.ts","../src/routes/domains/handler/create-domain.ts","../src/routes/domains/handler/delete-domain.ts","../src/routes/domains/handler/get-domain.ts","../src/routes/domains/handler/list-domains.ts","../src/routes/domains/handler/update-domain.ts","../src/routes/domains/handler/verify-domain.ts","../src/routes/email/email.route.ts","../src/routes/email/handler/verification-confirm.ts","../src/routes/email/handler/verification-request.ts","../src/routes/password/password.route.ts","../src/routes/password/handler/change.ts","../src/routes/password/handler/forgot.ts","../src/routes/password/handler/reset.ts","../src/routes/password/helper/session.ts","../src/routes/password/handler/set.ts","../src/routes/password/handler/verify.ts","../src/routes/permissions/permissions.route.ts","../src/routes/permissions/handler/get-permission.ts","../src/lib/permission-catalog.ts","../src/routes/permissions/handler/list-permissions.ts","../src/lib/iam-seed.ts","../src/routes/permissions/handler/seed-permissions.ts","../src/routes/permissions/permissions.schema.ts","../src/routes/phone/phone.route.ts","../src/routes/phone/handler/verification-confirm.ts","../src/routes/phone/helper/session.ts","../src/routes/phone/handler/verification-request.ts","../src/routes/profile/profile.route.ts","../src/routes/profile/handler/account-change-pending.ts","../src/lib/normalize-user.ts","../src/routes/profile/handler/me.ts","../src/routes/profile/handler/session.ts","../src/routes/profile/handler/update.ts","../src/routes/profile/handler/update-email.ts","../src/routes/profile/handler/update-phone.ts","../src/routes/role-permissions/role-permissions.route.ts","../src/routes/role-permissions/handler/assign-role-permission.ts","../src/routes/role-permissions/handler/list-role-permissions.ts","../src/routes/role-permissions/handler/revoke-role-permission.ts","../src/routes/role-permissions/role-permissions.schema.ts","../src/routes/roles/roles.route.ts","../src/routes/roles/handler/assign-role-permissions.ts","../src/routes/roles/handler/assign-role-users.ts","../src/routes/roles/handler/create-role.ts","../src/routes/roles/handler/delete-role.ts","../src/routes/roles/handler/get-role.ts","../src/routes/roles/handler/list-role-permissions.ts","../src/routes/roles/handler/list-role-users.ts","../src/routes/roles/handler/list-roles.ts","../src/routes/roles/handler/revoke-role-permission.ts","../src/routes/roles/handler/revoke-role-user.ts","../src/routes/roles/handler/seed-roles.ts","../src/routes/roles/handler/update-role.ts","../src/routes/roles/roles.schema.ts","../src/routes/sessions/sessions.route.ts","../src/routes/sessions/handler/get-session.ts","../src/routes/sessions/handler/list-sessions.ts","../src/routes/sessions/handler/revoke-all-sessions.ts","../src/routes/sessions/handler/revoke-session.ts","../src/routes/sessions/sessions.schema.ts","../src/routes/system/system.route.ts","../src/routes/system/handler/tenant.ts","../src/routes/tenants/tenants.route.ts","../src/routes/tenants/handler/create-tenant.ts","../src/routes/tenants/handler/delete-tenant.ts","../src/routes/tenants/handler/get-tenant.ts","../src/routes/tenants/handler/list-tenants.ts","../src/routes/tenants/handler/update-tenant.ts","../src/routes/tenants/tenants.schema.ts","../src/routes/user-roles/user-roles.route.ts","../src/routes/user-roles/handler/assign-user-role.ts","../src/routes/user-roles/handler/list-user-roles.ts","../src/routes/user-roles/handler/revoke-user-role.ts","../src/routes/user-roles/user-roles.schema.ts","../src/routes/users/users.route.ts","../src/routes/users/handler/ban-user.ts","../src/routes/users/helper/user.ts","../src/routes/users/helper/invite.ts","../src/routes/users/handler/bulk-invite-users.ts","../src/routes/users/handler/create-user.ts","../src/routes/users/handler/delete-user.ts","../src/routes/users/handler/get-user.ts","../src/routes/users/handler/invite-user.ts","../src/routes/users/handler/list-users.ts","../src/routes/users/handler/search-users.ts","../src/routes/users/handler/update-user.ts","../src/routes/users/users.schema.ts","../src/routes/verifications/verifications.route.ts","../src/routes/verifications/handler/invalidate-verification.ts","../src/routes/verifications/handler/list-verifications.ts","../src/routes/verifications/verifications.schema.ts","../src/utility/set-auth-context.ts","../src/lib/docs.ts","../src/lib/openapi-config.ts","../src/middlewares/session-middleware.ts","../src/middlewares/tenant-middleware.ts","../src/session.ts","../src/types/index.ts","../src/lib/cleanup.ts"],"sourcesContent":["import { deepmerge } from 'deepmerge-ts';\nimport { createDatabase } from './db';\nimport { createAuthRoutes } from './handler';\nimport { createDocsHandler } from './lib/docs';\nimport { createOpenApiConfig } from './lib/openapi-config';\nimport { createSessionMiddleware } from './middlewares/session-middleware';\nimport { createTenantMiddleware } from './middlewares/tenant-middleware';\nimport { createGetSession } from './session';\nimport { type AuthConfig, defaultAuthConfig, type MesobAuth } from './types';\n\nexport { createDatabase, type Database } from './db';\nexport type { Tenant } from './db/orm/tenant';\nexport {\n cleanupExpiredData,\n cleanupExpiredSessions,\n cleanupExpiredVerifications,\n} from './lib/cleanup';\nexport {\n hasPermission,\n hasPermissionThrow,\n} from './lib/has-role-permission';\nexport { createSessionMiddleware } from './middlewares/session-middleware';\nexport { createTenantMiddleware } from './middlewares/tenant-middleware';\nexport type { SessionStatus } from './session';\nexport type {\n AuthConfig,\n MesobAuth,\n SendInvitationParams,\n SendVerificationOTPParams,\n Session,\n User,\n} from './types';\n\nexport const createMesobAuth = (authConfig: AuthConfig): MesobAuth => {\n const config = deepmerge(\n { ...defaultAuthConfig } as AuthConfig,\n authConfig,\n ) as AuthConfig;\n\n if (!config.secret || config.secret.length === 0) {\n throw new Error(\n 'AUTH_SECRET is required and must be a non-empty string. Please set AUTH_SECRET environment variable.',\n );\n }\n\n const database = createDatabase(config.connectionString);\n const routesApp = createAuthRoutes({ config, database });\n\n const basePath = config.basePath || '';\n const openApiPath = `${basePath}/openapi.json`;\n const enableDocs = config.docs?.enabled ?? true;\n\n // Add OpenAPI docs endpoints to routes if enabled\n if (enableDocs) {\n routesApp.doc('/openapi.json', createOpenApiConfig(config));\n routesApp.get(\n '/docs',\n createDocsHandler({\n title: config.docs?.title || 'Mesob IAM API Reference',\n theme: config.docs?.theme || 'saturn',\n openApiPath,\n }),\n );\n }\n\n const getSession = createGetSession(database, config);\n const tenantMiddleware = createTenantMiddleware(database, config);\n const sessionMiddleware = createSessionMiddleware();\n\n // Simple wrapper - no basePath stripping needed since it's handled by the mounting app\n const routes = routesApp;\n\n return {\n routes: routes as typeof routesApp,\n getSession,\n tenantMiddleware,\n sessionMiddleware,\n };\n};\n","import { drizzle } from 'drizzle-orm/node-postgres';\nimport { Pool } from 'pg';\nimport * as relations from './relations';\nimport * as schema from './schema';\n\nconst schemaConfig = { schema: { ...schema, ...relations } };\n\nexport const createDatabase = (connectionString: string) => {\n const pool = new Pool({ connectionString });\n return drizzle({ client: pool, ...schemaConfig });\n};\n\nexport type Database = ReturnType<typeof createDatabase>;\n","import { relations } from \"drizzle-orm/relations\";\nimport { tenantsInIam, verificationsInIam, usersInIam, sessionsInIam, accountChangesInIam, rolePermissionsInIam, permissionsInIam, rolesInIam, accountsInIam, userRolesInIam, domainsInIam } from \"./schema\";\n\nexport const verificationsInIamRelations = relations(verificationsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [verificationsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [verificationsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const tenantsInIamRelations = relations(tenantsInIam, ({many}) => ({\n\tverificationsInIam: many(verificationsInIam),\n\tsessionsInIam: many(sessionsInIam),\n\taccountChangesInIam: many(accountChangesInIam),\n\trolePermissionsInIam: many(rolePermissionsInIam),\n\taccountsInIam: many(accountsInIam),\n\tusersInIam: many(usersInIam),\n\trolesInIam: many(rolesInIam),\n\tuserRolesInIam: many(userRolesInIam),\n\tdomainsInIam: many(domainsInIam),\n}));\n\nexport const usersInIamRelations = relations(usersInIam, ({one, many}) => ({\n\tverificationsInIam: many(verificationsInIam),\n\tsessionsInIam: many(sessionsInIam),\n\taccountChangesInIam: many(accountChangesInIam),\n\taccountsInIam: many(accountsInIam),\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [usersInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tuserRolesInIam: many(userRolesInIam),\n}));\n\nexport const sessionsInIamRelations = relations(sessionsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [sessionsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [sessionsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const accountChangesInIamRelations = relations(accountChangesInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [accountChangesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [accountChangesInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const rolePermissionsInIamRelations = relations(rolePermissionsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [rolePermissionsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tpermissionsInIam: one(permissionsInIam, {\n\t\tfields: [rolePermissionsInIam.permissionId],\n\t\treferences: [permissionsInIam.id]\n\t}),\n\trolesInIam: one(rolesInIam, {\n\t\tfields: [rolePermissionsInIam.tenantId],\n\t\treferences: [rolesInIam.tenantId]\n\t}),\n}));\n\nexport const permissionsInIamRelations = relations(permissionsInIam, ({many}) => ({\n\trolePermissionsInIam: many(rolePermissionsInIam),\n}));\n\nexport const rolesInIamRelations = relations(rolesInIam, ({one, many}) => ({\n\trolePermissionsInIam: many(rolePermissionsInIam),\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [rolesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tuserRolesInIam: many(userRolesInIam),\n}));\n\nexport const accountsInIamRelations = relations(accountsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [accountsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [accountsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const userRolesInIamRelations = relations(userRolesInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [userRolesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [userRolesInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n\trolesInIam: one(rolesInIam, {\n\t\tfields: [userRolesInIam.tenantId],\n\t\treferences: [rolesInIam.tenantId]\n\t}),\n}));\n\nexport const domainsInIamRelations = relations(domainsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [domainsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n}));","import { pgTable, pgSchema, index, foreignKey, pgPolicy, check, uuid, varchar, timestamp, text, smallint, unique, inet, jsonb, boolean, uniqueIndex } from \"drizzle-orm/pg-core\"\nimport { sql } from \"drizzle-orm\"\n\nexport const iam = pgSchema(\"iam\");\n\n\nexport const verificationsInIam = iam.table(\"verifications\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\tcode: text().notNull(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }).notNull(),\n\ttype: text(),\n\tattempt: smallint().default(0),\n\tto: text(),\n}, (table) => [\n\tindex(\"verifications_expires_at_idx\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"timestamptz_ops\")),\n\tindex(\"verifications_lookup_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.userId.asc().nullsLast().op(\"text_ops\"), table.type.asc().nullsLast().op(\"uuid_ops\"), table.to.asc().nullsLast().op(\"text_ops\"), table.code.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"verifications_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"verifications_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"verifications_attempt_nonnegative_check\", sql`attempt >= 0`),\n\tcheck(\"verifications_expires_after_created_check\", sql`expires_at > created_at`),\n]);\n\nexport const sessionsInIam = iam.table(\"sessions\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }).notNull(),\n\tuserAgent: text(\"user_agent\"),\n\tip: inet(),\n\tmeta: jsonb(),\n\ttoken: text().notNull(),\n\trotatedAt: timestamp(\"rotated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),\n}, (table) => [\n\tindex(\"sessions_expires_at_idx\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"timestamptz_ops\")),\n\tindex(\"sessions_tenant_user_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"uuid_ops\"), table.userId.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"sessions_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"sessions_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"sessions_token_key\").on(table.token),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"sessions_expires_after_created_check\", sql`expires_at > created_at`),\n]);\n\nexport const accountChangesInIam = iam.table(\"account_changes\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tchangeType: text(\"change_type\").notNull(),\n\toldEmail: varchar(\"old_email\"),\n\tnewEmail: varchar(\"new_email\"),\n\toldPhone: text(\"old_phone\"),\n\tnewPhone: text(\"new_phone\"),\n\tstatus: varchar().notNull(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }).notNull(),\n\tconfirmedAt: timestamp(\"confirmed_at\", { withTimezone: true, mode: 'string' }),\n\tcancelledAt: timestamp(\"cancelled_at\", { withTimezone: true, mode: 'string' }),\n\treason: text(),\n}, (table) => [\n\tindex(\"account_changes_expires_at_idx\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"timestamptz_ops\")),\n\tindex(\"account_changes_tenant_user_status_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"uuid_ops\"), table.userId.asc().nullsLast().op(\"text_ops\"), table.status.asc().nullsLast().op(\"uuid_ops\")),\n\tindex(\"idx_account_changes_expired\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"text_ops\"), table.status.asc().nullsLast().op(\"text_ops\")).where(sql`((status)::text = 'pending'::text)`),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"account_changes_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"account_changes_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"account_changes_expires_after_created_check\", sql`expires_at > created_at`),\n\tcheck(\"account_changes_change_type_check\", sql`((change_type = 'EMAIL'::text) AND (old_email IS NOT NULL) AND (new_email IS NOT NULL) AND (old_phone IS NULL) AND (new_phone IS NULL)) OR ((change_type = 'PHONE'::text) AND (old_phone IS NOT NULL) AND (new_phone IS NOT NULL) AND (old_email IS NULL) AND (new_email IS NULL))`),\n\tcheck(\"account_changes_status_check\", sql`(status)::text = ANY (ARRAY[('PENDING'::character varying)::text, ('APPLIED'::character varying)::text, ('CANCELLED'::character varying)::text, ('EXPIRED'::character varying)::text])`),\n]);\n\nexport const tenantsInIam = iam.table(\"tenants\", {\n\tid: varchar({ length: 30 }).primaryKey().notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tname: jsonb().notNull(),\n\tdescription: jsonb(),\n\ttheme: jsonb(),\n\tsupportedLanguages: jsonb(\"supported_languages\"),\n\tdefaultLanguage: text(\"default_language\"),\n\tsupportedCurrency: jsonb(\"supported_currency\"),\n\tdefaultCurrency: text(\"default_currency\"),\n\ttimezone: text(),\n\tisActive: boolean(\"is_active\").default(true).notNull(),\n\tlocale: jsonb(),\n\tsettings: jsonb(),\n\tseo: jsonb(),\n}, (table) => [\n\tindex(\"tenants_is_active_idx\").using(\"btree\", table.isActive.asc().nullsLast().op(\"bool_ops\")),\n]);\n\nexport const rolePermissionsInIam = iam.table(\"role_permissions\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tpermissionId: text(\"permission_id\").notNull(),\n\troleId: uuid(\"role_id\").notNull(),\n}, (table) => [\n\tindex(\"idx_role_permissions_permission_id\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.permissionId.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"role_permissions_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.permissionId],\n\t\t\tforeignColumns: [permissionsInIam.id],\n\t\t\tname: \"role_permissions_permission_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId, table.roleId],\n\t\t\tforeignColumns: [rolesInIam.tenantId, rolesInIam.id],\n\t\t\tname: \"role_permissions_tenant_role_fkey\"\n\t\t}).onDelete(\"cascade\"),\n\tunique(\"role_permissions_tenant_role_permission_unique\").on(table.tenantId, table.permissionId, table.roleId),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const permissionsInIam = iam.table(\"permissions\", {\n\tid: text().primaryKey().notNull(),\n\tdescription: jsonb().notNull(),\n\tactivity: text().notNull(),\n\tapplication: text().notNull(),\n\tfeature: text().notNull(),\n}, (table) => [\n\tunique(\"permissions_activity_application_feature_key\").on(table.activity, table.application, table.feature),\n]);\n\nexport const accountsInIam = iam.table(\"accounts\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\tprovider: text().notNull(),\n\tproviderAccountId: text(\"provider_account_id\").notNull(),\n\tpassword: text(),\n\tpasswordLastChangedAt: timestamp(\"password_last_changed_at\", { withTimezone: true, mode: 'string' }),\n\tidToken: text(\"id_token\"),\n\taccessToken: text(\"access_token\"),\n\taccessTokenExpiresAt: timestamp(\"access_token_expires_at\", { withTimezone: true, mode: 'string' }),\n\trefreshToken: text(\"refresh_token\"),\n\trefreshTokenExpiresAt: timestamp(\"refresh_token_expires_at\", { withTimezone: true, mode: 'string' }),\n\tscope: text(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }),\n\tmeta: jsonb(),\n}, (table) => [\n\tindex(\"idx_accounts_provider_lookup\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.provider.asc().nullsLast().op(\"text_ops\"), table.providerAccountId.asc().nullsLast().op(\"text_ops\")),\n\tindex(\"idx_accounts_user_id\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.userId.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"accounts_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"accounts_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"accounts_tenant_provider_account_unique\").on(table.tenantId, table.provider, table.providerAccountId),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const usersInIam = iam.table(\"users\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tfullName: text(\"full_name\").notNull(),\n\timage: text(),\n\tphone: text(),\n\temail: text(),\n\thandle: text().notNull(),\n\temailVerified: boolean(\"email_verified\").default(false).notNull(),\n\tphoneVerified: boolean(\"phone_verified\").default(false).notNull(),\n\tbannedUntil: timestamp(\"banned_until\", { withTimezone: true, mode: 'string' }),\n\tlastSignInAt: timestamp(\"last_sign_in_at\", { withTimezone: true, mode: 'string' }),\n\tloginAttempt: smallint(\"login_attempt\").default(0).notNull(),\n\tuserType: text(\"user_type\").array().default([\"RAY\"]).notNull(),\n}, (table) => [\n\tindex(\"idx_users_auth_lookup\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"bool_ops\"), table.email.asc().nullsLast().op(\"bool_ops\"), table.id.asc().nullsLast().op(\"timestamptz_ops\"), table.emailVerified.asc().nullsLast().op(\"timestamptz_ops\"), table.bannedUntil.asc().nullsLast().op(\"uuid_ops\")).where(sql`(email IS NOT NULL)`),\n\tindex(\"idx_users_email_lookup\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.email.asc().nullsLast().op(\"text_ops\")).where(sql`(email IS NOT NULL)`),\n\tindex(\"idx_users_handle_lookup\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.handle.asc().nullsLast().op(\"text_ops\")),\n\tindex(\"idx_users_phone_lookup\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.phone.asc().nullsLast().op(\"text_ops\")).where(sql`(phone IS NOT NULL)`),\n\tindex(\"idx_users_tenant_email_unique\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.email.asc().nullsLast().op(\"text_ops\")).where(sql`(email IS NOT NULL)`),\n\tindex(\"idx_users_tenant_is_admin\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\")).where(sql`(user_type @> ARRAY['admin'::text])`),\n\tindex(\"idx_users_tenant_is_candidate\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\")).where(sql`(user_type @> ARRAY['candidate'::text])`),\n\tindex(\"idx_users_tenant_is_employee\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\")).where(sql`(user_type @> ARRAY['employee'::text])`),\n\tindex(\"idx_users_user_types_gin\").using(\"gin\", table.userType.asc().nullsLast().op(\"array_ops\")),\n\tuniqueIndex(\"users_tenant_lower_email_idx\").using(\"btree\", sql`tenant_id`, sql`lower(email)`),\n\tuniqueIndex(\"users_tenant_lower_handle_idx\").using(\"btree\", sql`tenant_id`, sql`lower(handle)`),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"users_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"users_tenant_phone_key\").on(table.tenantId, table.phone),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"users_login_attempt_nonnegative_check\", sql`login_attempt >= 0`),\n\tcheck(\"users_contact_required_check\", sql`(email IS NOT NULL) OR (phone IS NOT NULL)`),\n\tcheck(\"users_user_type_check\", sql`user_type <@ ARRAY['candidate'::text, 'employee'::text, 'admin'::text]`),\n]);\n\nexport const rolesInIam = iam.table(\"roles\", {\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tname: jsonb().notNull(),\n\tdescription: jsonb().notNull(),\n\tcode: text().notNull(),\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\tisSystem: boolean(\"is_system\").default(false).notNull(),\n\tisEditable: boolean(\"is_editable\").default(true).notNull(),\n\tisDeletable: boolean(\"is_deletable\").default(true).notNull(),\n}, (table) => [\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"roles_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"roles_tenant_code_unique\").on(table.tenantId, table.code),\n\tunique(\"roles_tenant_id_unique\").on(table.tenantId, table.id),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const userRolesInIam = iam.table(\"user_roles\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\troleId: uuid(\"role_id\").notNull(),\n}, (table) => [\n\tindex(\"idx_user_roles_tenant_user\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.userId.asc().nullsLast().op(\"uuid_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"user_roles_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"user_roles_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId, table.roleId],\n\t\t\tforeignColumns: [rolesInIam.tenantId, rolesInIam.id],\n\t\t\tname: \"user_roles_tenant_role_fkey\"\n\t\t}).onDelete(\"cascade\"),\n\tunique(\"user_roles_tenant_user_role_unique\").on(table.tenantId, table.userId, table.roleId),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const domainsInIam = iam.table(\"domains\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tdomain: text().notNull(),\n\tstatus: text().default('pending').notNull(),\n\tmeta: jsonb(),\n\tisPrimary: boolean(\"is_primary\").default(false).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n}, (table) => [\n\tuniqueIndex(\"domains_domain_unique_idx\").using(\"btree\", sql`lower(domain)`),\n\tuniqueIndex(\"domains_primary_per_tenant_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\")).where(sql`(is_primary = true)`),\n\tindex(\"domains_tenant_status_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.status.asc().nullsLast().op(\"text_ops\")),\n\tindex(\"idx_domains_tenant_domain_status\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.domain.asc().nullsLast().op(\"text_ops\"), table.status.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"domains_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"domains_domain_format_check\", sql`domain ~ '^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)+$'::text`),\n\tcheck(\"domains_status_check\", sql`status = ANY (ARRAY['PENDING'::text, 'ACTIVE'::text, 'DISABLED'::text, 'DELETED'::text])`),\n]);\n","import { OpenAPIHono } from '@hono/zod-openapi';\nimport { getCookie } from 'hono/cookie';\nimport { fetchSessionByToken, fetchUserWithRoles } from './db/orm';\nimport { getSessionCookieName } from './lib/cookie';\nimport { hashToken } from './lib/crypto';\nimport { handleError } from './lib/error-handler';\nimport routes from './routes';\nimport type { AuthConfig, CreateAuthRoutesOptions, Database } from './types';\nimport type { AuthContext, AuthEnv } from './types/context';\nimport { setAuthContext } from './utility/set-auth-context';\n\nconst loadSession = async ({\n c,\n sessionToken,\n database,\n config,\n}: {\n c: AuthContext;\n sessionToken: string;\n database: Database;\n config: AuthConfig;\n}): Promise<void> => {\n try {\n const hashedToken = await hashToken(sessionToken, config.secret);\n const session = await fetchSessionByToken({\n database,\n hashedToken,\n tenantId: config.tenant?.tenantId || 'tenant',\n });\n if (!session) {\n return;\n }\n const user = await fetchUserWithRoles({\n database,\n userId: session.userId,\n tenantId: session.tenantId,\n });\n if (user) {\n setAuthContext({\n c,\n config,\n database,\n user,\n session,\n });\n }\n } catch {\n // Invalid session, continue without user\n }\n};\n\nconst createAuthMiddleware = ({\n config,\n database,\n}: {\n config: AuthConfig;\n database: Database;\n}) => {\n return async (c: AuthContext, next: () => Promise<void>) => {\n const path = c.req.path;\n const isDocsEndpoint = path === '/docs' || path === '/openapi.json';\n\n if (isDocsEndpoint) {\n setAuthContext({ c, config, database });\n return await next();\n }\n\n setAuthContext({ c, config, database });\n\n const sessionToken = getCookie(c, getSessionCookieName(config));\n if (sessionToken) {\n await loadSession({\n c,\n sessionToken,\n database,\n config,\n });\n }\n\n await next();\n };\n};\n\nexport const createAuthRoutes = ({\n config,\n database,\n}: CreateAuthRoutesOptions) => {\n const app = new OpenAPIHono<AuthEnv>();\n\n app.onError((error, c) => {\n return handleError(error, c);\n });\n\n app.use(\n '*',\n createAuthMiddleware({\n config,\n database,\n }),\n );\n\n app.route('/', routes);\n return app;\n};\n","import { and, eq, gt } from 'drizzle-orm';\nimport type { Session, SessionMeta } from '../../types';\nimport { sessionsInIam } from '../schema';\nimport type {\n DeleteSessionByTokenParams,\n DeleteSessionParams,\n DeleteUserSessionsParams,\n FetchSessionByTokenParams,\n UpdateSessionExpiryParams,\n} from './types';\n\nexport const fetchSessionByToken = async ({\n database,\n hashedToken,\n tenantId,\n}: FetchSessionByTokenParams): Promise<Session | null> => {\n const [sessionResult] = await database\n .select({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n meta: sessionsInIam.meta,\n })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.token, hashedToken),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n eq(sessionsInIam.tenantId, tenantId),\n ),\n )\n .limit(1);\n\n if (!sessionResult) {\n return null;\n }\n\n return {\n ...sessionResult,\n meta: sessionResult.meta as SessionMeta | null,\n };\n};\n\n/**\n * Update session expiry time (for session refresh)\n */\nexport const updateSessionExpiry = async ({\n database,\n sessionId,\n tenantId,\n expiresAt,\n}: UpdateSessionExpiryParams): Promise<void> => {\n await database\n .update(sessionsInIam)\n .set({\n expiresAt,\n updatedAt: new Date().toISOString(),\n })\n .where(\n and(\n eq(sessionsInIam.id, sessionId),\n eq(sessionsInIam.tenantId, tenantId),\n ),\n );\n};\n\n/**\n * Delete a session by ID\n */\nexport const deleteSession = async ({\n database,\n sessionId,\n tenantId,\n}: DeleteSessionParams): Promise<void> => {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.id, sessionId),\n eq(sessionsInIam.tenantId, tenantId),\n ),\n );\n};\n\n/**\n * Delete a session by hashed token\n */\nexport const deleteSessionByToken = async ({\n database,\n hashedToken,\n tenantId,\n}: DeleteSessionByTokenParams): Promise<void> => {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.token, hashedToken),\n eq(sessionsInIam.tenantId, tenantId),\n ),\n );\n};\n\n/**\n * Delete all sessions for a user\n */\nexport const deleteUserSessions = async ({\n database,\n userId,\n tenantId,\n}: DeleteUserSessionsParams): Promise<void> => {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.userId, userId),\n eq(sessionsInIam.tenantId, tenantId),\n ),\n );\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database } from '../index';\nimport { domainsInIam, tenantsInIam } from '../schema';\n\nexport const findTenantByDomain = async (\n database: Database,\n hostname: string,\n): Promise<string | null> => {\n const lowerHostname = hostname.toLowerCase();\n const [domain] = await database\n .select({\n tenantId: domainsInIam.tenantId,\n })\n .from(domainsInIam)\n .where(\n and(\n sql`lower(${domainsInIam.domain}) = ${lowerHostname}`,\n eq(domainsInIam.status, 'active'),\n ),\n )\n .limit(1);\n\n return domain?.tenantId || null;\n};\n\nexport type Tenant = {\n id: string;\n name: unknown;\n description: unknown;\n isActive: boolean;\n};\n\nexport const findTenantById = async (\n database: Database,\n tenantId: string,\n): Promise<Tenant | null> => {\n const [tenant] = await database\n .select({\n id: tenantsInIam.id,\n name: tenantsInIam.name,\n description: tenantsInIam.description,\n isActive: tenantsInIam.isActive,\n })\n .from(tenantsInIam)\n .where(eq(tenantsInIam.id, tenantId))\n .limit(1);\n\n return tenant || null;\n};\n","import { and, eq } from 'drizzle-orm';\nimport { getUserAuthSelect } from '../../lib/user-auth-select';\nimport type { User } from '../../types';\nimport { usersInIam } from '../schema';\nimport type { FetchUserWithRolesParams } from './types';\n\nexport const fetchUserWithRoles = async ({\n database,\n userId,\n tenantId,\n}: FetchUserWithRolesParams): Promise<User | null> => {\n const [userResult] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n bannedUntil: usersInIam.bannedUntil,\n ...getUserAuthSelect(tenantId),\n })\n .from(usersInIam)\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .limit(1);\n return (userResult as User) || null;\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport {\n permissionsInIam,\n rolePermissionsInIam,\n rolesInIam,\n userRolesInIam,\n usersInIam,\n} from '../db/schema';\n\nexport function getUserAuthSelect(tenantId: string) {\n return {\n roles: sql<string[] | null>`COALESCE(\n (\n select array_to_json(array_agg(distinct \"iam\".\"roles\".\"id\"))\n from ${userRolesInIam}\n inner join ${rolesInIam}\n on ${and(\n eq(rolesInIam.tenantId, userRolesInIam.tenantId),\n eq(rolesInIam.id, userRolesInIam.roleId),\n )}\n where ${and(\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.userId, usersInIam.id),\n )}\n ),\n '[]'::json\n )`,\n roleCodes: sql<string[] | null>`COALESCE(\n (\n select array_to_json(array_agg(distinct ${rolesInIam.code}))\n from ${userRolesInIam}\n inner join ${rolesInIam}\n on ${and(\n eq(rolesInIam.tenantId, userRolesInIam.tenantId),\n eq(rolesInIam.id, userRolesInIam.roleId),\n )}\n where ${and(\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.userId, usersInIam.id),\n )}\n ),\n '[]'::json\n )`,\n permissions: sql<string[] | null>`COALESCE(\n (\n select array_to_json(array_agg(distinct \"iam\".\"permissions\".\"id\"))\n from ${userRolesInIam}\n inner join ${rolePermissionsInIam}\n on ${and(\n eq(rolePermissionsInIam.tenantId, userRolesInIam.tenantId),\n eq(rolePermissionsInIam.roleId, userRolesInIam.roleId),\n )}\n inner join ${permissionsInIam}\n on ${eq(permissionsInIam.id, rolePermissionsInIam.permissionId)}\n where ${and(\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.userId, usersInIam.id),\n )}\n ),\n '[]'::json\n )`,\n };\n}\n","import type { Context } from 'hono';\nimport { deleteCookie as honoDel, setCookie as honoSet } from 'hono/cookie';\nimport type { AuthConfig } from '../types';\n\nconst isProduction = process.env.NODE_ENV === 'production';\n\nexport const getSessionCookieName = (config: AuthConfig): string => {\n const prefix = config.cookie?.prefix || '';\n const baseName = 'session_token';\n if (prefix) {\n return `${prefix}_${baseName}`;\n }\n return isProduction ? '__Host-session_token' : baseName;\n};\n\nexport type CookieOptions = {\n expires?: Date;\n path?: string;\n};\n\nexport const setSessionCookie = (\n c: Context,\n token: string,\n config: AuthConfig,\n options: CookieOptions,\n) => {\n const cookieName = getSessionCookieName(config);\n const cookieOptions = {\n httpOnly: true,\n secure: isProduction,\n sameSite: 'Lax' as const,\n path: options.path || '/',\n expires: options.expires,\n ...(isProduction && { domain: undefined }), // __Host- requires no domain\n };\n\n honoSet(c, cookieName, token, cookieOptions);\n};\n\nexport const deleteSessionCookie = (c: Context, config: AuthConfig) => {\n const cookieName = getSessionCookieName(config);\n honoDel(c, cookieName, {\n httpOnly: true,\n secure: isProduction,\n sameSite: 'Lax' as const,\n path: '/',\n expires: new Date(0),\n });\n};\n","import { scrypt } from '@noble/hashes/scrypt.js';\nimport { randomBytes } from '@noble/hashes/utils.js';\n\nconst encoder = new TextEncoder();\n\nconst randomHex = (bytes: number) => {\n const arr = randomBytes(bytes);\n return Array.from(arr, (b: number) => b.toString(16).padStart(2, '0')).join(\n '',\n );\n};\n\nconst toHex = (buffer: Uint8Array) => {\n return Array.from(buffer, (b: number) =>\n b.toString(16).padStart(2, '0'),\n ).join('');\n};\n\nconst hexToBytes = (hex: string): Uint8Array => {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = Number.parseInt(hex.slice(i, i + 2), 16);\n }\n return bytes;\n};\n\nconst SCRYPT_KEYLEN = 64;\nconst SCRYPT_COST = 16384;\nconst SCRYPT_BLOCK_SIZE = 8;\nconst SCRYPT_PARALLELISM = 1;\n\nexport const hashPassword = async (password: string) => {\n const salt = randomBytes(16);\n const saltHex = toHex(salt);\n const passwordBytes = encoder.encode(password);\n const derivedKey = await Promise.resolve(\n scrypt(passwordBytes, salt, {\n N: SCRYPT_COST,\n r: SCRYPT_BLOCK_SIZE,\n p: SCRYPT_PARALLELISM,\n dkLen: SCRYPT_KEYLEN,\n }),\n );\n return `${saltHex}:${toHex(derivedKey)}`;\n};\n\nexport const verifyPassword = async (\n password: string,\n hashed?: string | null,\n) => {\n if (!hashed) {\n return false;\n }\n const [saltHex, keyHex] = hashed.split(':');\n if (!(saltHex && keyHex)) {\n return false;\n }\n\n const salt = hexToBytes(saltHex);\n const passwordBytes = encoder.encode(password);\n const derivedKey = await Promise.resolve(\n scrypt(passwordBytes, salt, {\n N: SCRYPT_COST,\n r: SCRYPT_BLOCK_SIZE,\n p: SCRYPT_PARALLELISM,\n dkLen: SCRYPT_KEYLEN,\n }),\n );\n const derived = toHex(derivedKey);\n\n if (derived.length !== keyHex.length) {\n return false;\n }\n let result = 0;\n for (let i = 0; i < derived.length; i++) {\n result |= derived.charCodeAt(i) ^ keyHex.charCodeAt(i);\n }\n return result === 0;\n};\n\nexport const hashToken = async (token: string, secret: string) => {\n if (!secret || secret.length === 0) {\n throw new Error(\n 'AUTH_SECRET is required and must be a non-empty string. Please set AUTH_SECRET environment variable.',\n );\n }\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const signature = await crypto.subtle.sign(\n 'HMAC',\n key,\n encoder.encode(token),\n );\n return toHex(new Uint8Array(signature));\n};\n\nexport const generateToken = (bytes = 48) => randomHex(bytes);\n\nexport const hashVerificationCode = (code: string, secret: string) =>\n hashToken(code, secret);\n","import { logger } from '@mesob/common';\nimport type { Context } from 'hono';\nimport { HTTPException } from 'hono/http-exception';\n\ntype DatabaseError = {\n code?: string;\n message?: string;\n detail?: string;\n query?: string;\n parameters?: unknown[];\n};\n\nconst isDatabaseError = (error: unknown): error is DatabaseError => {\n if (typeof error !== 'object' || error === null) {\n return false;\n }\n\n if ('code' in error || 'query' in error || 'detail' in error) {\n return true;\n }\n\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('failed query') ||\n message.includes('relation') ||\n message.includes('column') ||\n message.includes('syntax error') ||\n message.includes('duplicate key') ||\n message.includes('foreign key') ||\n message.includes('null value')\n );\n }\n\n return false;\n};\n\nconst sanitizeDatabaseError = (error: DatabaseError): string => {\n const code = error.code;\n\n if (code === '23505') {\n return 'Resource already exists';\n }\n\n if (code === '23503') {\n return 'Referenced resource not found';\n }\n\n if (code === '23502') {\n return 'Required field is missing';\n }\n\n if (code === '42P01') {\n return 'Resource not found';\n }\n\n if (code === '42703') {\n return 'Invalid request';\n }\n\n if (code === '23514') {\n return 'Validation failed';\n }\n\n return 'An error occurred while processing your request';\n};\n\nconst isDatabaseErrorMessage = (message: string): boolean => {\n const lowerMessage = message.toLowerCase();\n return (\n lowerMessage.includes('failed query') ||\n lowerMessage.includes('select') ||\n lowerMessage.includes('insert') ||\n lowerMessage.includes('update') ||\n lowerMessage.includes('delete') ||\n lowerMessage.includes('from') ||\n lowerMessage.includes('where') ||\n lowerMessage.includes('limit') ||\n lowerMessage.includes('params:') ||\n lowerMessage.includes('query') ||\n message.includes('\"iam\".') ||\n message.includes('\"tenants\"') ||\n message.includes('\"users\"') ||\n message.includes('\"sessions\"') ||\n message.includes('\"accounts\"') ||\n lowerMessage.includes('relation') ||\n lowerMessage.includes('column') ||\n lowerMessage.includes('syntax error') ||\n lowerMessage.includes('database') ||\n lowerMessage.includes('postgres') ||\n lowerMessage.includes('sql')\n );\n};\n\nexport const handleError = (error: unknown, c: Context): Response => {\n logger.error('API Error:', {\n error,\n path: c.req.path,\n method: c.req.method,\n url: c.req.url,\n });\n\n if (error instanceof HTTPException) {\n const message = isDatabaseErrorMessage(error.message)\n ? 'An error occurred while processing your request'\n : error.message;\n return c.json({ error: message }, error.status);\n }\n\n if (isDatabaseError(error)) {\n const userMessage = sanitizeDatabaseError(error);\n logger.error('Database error details:', {\n code: error.code,\n message: error.message,\n detail: error.detail,\n query: error.query,\n parameters: error.parameters,\n });\n return c.json({ error: userMessage }, 500);\n }\n\n if (error instanceof Error) {\n const message = error.message;\n const lowerMessage = message.toLowerCase();\n\n // Check for any database/SQL related content\n const isDatabaseError =\n lowerMessage.includes('failed query') ||\n lowerMessage.includes('select') ||\n lowerMessage.includes('insert') ||\n lowerMessage.includes('update') ||\n lowerMessage.includes('delete') ||\n lowerMessage.includes('from') ||\n lowerMessage.includes('where') ||\n lowerMessage.includes('limit') ||\n lowerMessage.includes('params:') ||\n lowerMessage.includes('query') ||\n message.includes('\"iam\".') ||\n message.includes('\"tenants\"') ||\n message.includes('\"users\"') ||\n message.includes('\"sessions\"') ||\n message.includes('\"accounts\"') ||\n lowerMessage.includes('relation') ||\n lowerMessage.includes('column') ||\n lowerMessage.includes('syntax error') ||\n lowerMessage.includes('duplicate key') ||\n lowerMessage.includes('foreign key') ||\n lowerMessage.includes('null value') ||\n lowerMessage.includes('database') ||\n lowerMessage.includes('postgres') ||\n lowerMessage.includes('sql');\n\n if (isDatabaseError) {\n logger.error('SQL/database error detected:', {\n message: error.message,\n stack: error.stack,\n name: error.name,\n });\n return c.json(\n { error: 'An error occurred while processing your request' },\n 500,\n );\n }\n\n logger.error('Error details:', {\n message: error.message,\n stack: error.stack,\n name: error.name,\n });\n return c.json(\n { error: 'An error occurred while processing your request' },\n 500,\n );\n }\n\n logger.error('Unknown error:', error);\n return c.json(\n { error: 'An error occurred while processing your request' },\n 500,\n );\n};\n","import { OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../types/context';\nimport authRoutes from './auth/auth.route';\nimport domainRoutes from './domains/domains.route';\nimport emailRoutes from './email/email.route';\nimport passwordRoutes from './password/password.route';\nimport permissionRoutes from './permissions/permissions.route';\nimport phoneRoutes from './phone/phone.route';\nimport profileRoutes from './profile/profile.route';\nimport rolePermissionRoutes from './role-permissions/role-permissions.route';\nimport roleRoutes from './roles/roles.route';\nimport sessionRoutes from './sessions/sessions.route';\nimport tenantRoutes from './system/system.route';\nimport tenantsRoutes from './tenants/tenants.route';\nimport userRoleRoutes from './user-roles/user-roles.route';\nimport userRoutes from './users/users.route';\nimport verificationRoutes from './verifications/verifications.route';\n\nconst routes = new OpenAPIHono<AuthEnv>()\n .route('/', authRoutes)\n .route('/', profileRoutes)\n .route('/password', passwordRoutes)\n .route('/email', emailRoutes)\n .route('/phone', phoneRoutes)\n .route('/users', userRoutes)\n .route('/system', tenantRoutes)\n .route('/tenants', tenantsRoutes)\n .route('/domains', domainRoutes)\n .route('/roles', roleRoutes)\n .route('/permissions', permissionRoutes)\n .route('/role-permissions', rolePermissionRoutes)\n .route('/user-roles', userRoleRoutes)\n .route('/sessions', sessionRoutes)\n .route('/verifications', verificationRoutes);\n\nexport default routes;\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport {\n checkAccountResponseSchema,\n checkAccountSchema,\n errorResponseSchema,\n messageSchema,\n signInResponseSchema,\n signInSchema,\n signUpResponseSchema,\n signUpSchema,\n} from '../auth.schema';\nimport { checkAccountHandler } from './handler/check-account';\nimport { signInHandler } from './handler/sign-in';\nimport { signOutHandler } from './handler/sign-out';\nimport { signUpHandler } from './handler/sign-up';\n\nexport const signUpRoute = createRoute({\n method: 'post',\n path: '/sign-up',\n tags: ['Auth'],\n summary: 'Sign up with email or phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: signUpSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: signUpResponseSchema,\n },\n },\n description: 'Account created',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid request',\n },\n 403: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Authentication method disabled',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User already exists',\n },\n },\n});\n\nexport const signInRoute = createRoute({\n method: 'post',\n path: '/sign-in',\n tags: ['Auth'],\n summary: 'Sign in with email or phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: signInSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: signInResponseSchema,\n },\n },\n description: 'Signed in',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid credentials',\n },\n },\n});\n\nexport const checkAccountRoute = createRoute({\n method: 'post',\n path: '/check-account',\n tags: ['Auth'],\n summary: 'Check if account exists',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: checkAccountSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: checkAccountResponseSchema,\n },\n },\n description: 'Account check result',\n },\n },\n});\n\nexport const signOutRoute = createRoute({\n method: 'post',\n path: '/sign-out',\n tags: ['Auth'],\n summary: 'Sign out current session',\n responses: {\n 200: {\n content: { 'application/json': { schema: messageSchema } },\n description: 'Signed out',\n },\n },\n});\n\nconst authRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(signUpRoute, signUpHandler)\n .openapi(signInRoute, signInHandler)\n .openapi(checkAccountRoute, checkAccountHandler)\n .openapi(signOutRoute, signOutHandler);\n\nexport default authRoutes;\n","import { z } from 'zod';\n\nconst emailField = z\n .string()\n .trim()\n .email('Invalid email address')\n .max(255, 'Email too long');\n\nconst phoneField = z\n .string()\n .trim()\n .min(6, 'Phone too short')\n .max(30, 'Phone too long')\n .regex(/^[+()\\d\\s-]+$/, 'Invalid phone number format');\n\nconst passwordField = z\n .string()\n .min(8, 'Password must be at least 8 characters')\n .max(128, 'Password too long');\n\nconst identifierField = z.string().trim().min(1, 'Identifier is required');\n\nexport const userSchema = z.object({\n id: z.string().uuid(),\n tenantId: z.string(),\n fullName: z.string(),\n email: z.string().email().nullable(),\n phone: z.string().nullable(),\n handle: z.string(),\n image: z.string().nullable(),\n emailVerified: z.boolean(),\n phoneVerified: z.boolean(),\n lastSignInAt: z.string().datetime().nullable(),\n bannedUntil: z.string().datetime().nullable().optional(),\n createdAt: z.string().datetime().nullable().optional(),\n userType: z.array(z.string()).optional(),\n roles: z.array(z.string()).nullable().optional(),\n roleCodes: z.array(z.string()).nullable().optional(),\n userRoles: z\n .array(\n z.object({\n code: z.string(),\n name: z.record(z.string(), z.string()),\n }),\n )\n .nullable()\n .optional(),\n activeSessionCount: z.number().int().min(0).optional(),\n permissions: z.array(z.string()).nullable().optional(),\n});\n\nexport const sessionSchema = z.object({\n id: z.string().uuid(),\n expiresAt: z.string().datetime(),\n createdAt: z.string().datetime().optional(),\n userAgent: z.string().nullable().optional(),\n ip: z.string().nullable().optional(),\n});\n\nexport const authUserSchema = z.object({\n id: z.string().uuid(),\n tenantId: z.string(),\n fullName: z.string(),\n email: z.string().email().nullable(),\n phone: z.string().nullable(),\n image: z.string().nullable(),\n emailVerified: z.boolean(),\n phoneVerified: z.boolean(),\n});\n\nexport const authSessionSchema = z.object({\n id: z.string().uuid(),\n expiresAt: z.string().datetime(),\n});\n\nexport const authSuccessSchema = z.object({\n user: authUserSchema,\n session: authSessionSchema.nullable(),\n sessionToken: z.string().optional(),\n sessionExpiresAt: z.string().datetime().optional(),\n});\n\nexport const authAccountSchema = z.object({\n fullName: z.string(),\n email: z.string().email().nullable(),\n phone: z.string().nullable(),\n verified: z.boolean(),\n hasPassword: z.boolean(),\n requiresPasswordSetup: z.boolean(),\n});\n\nexport const messageSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string().describe('Error message'),\n code: z.string().optional().describe('Error code'),\n details: z.record(z.string(), z.any()).optional(),\n});\n\nexport const signUpSchema = z\n .object({\n email: emailField.optional(),\n phone: phoneField.optional(),\n password: passwordField,\n fullName: z.string().min(2),\n image: z.string().url().optional(),\n /** Keep me signed in for longer. Default: true */\n rememberMe: z.boolean().default(true),\n })\n .refine((data) => data.email || data.phone, {\n message: 'Either email or phone is required',\n path: ['email'],\n });\n\nexport const signInSchema = z.object({\n identifier: identifierField,\n password: passwordField,\n /** Keep me signed in for longer. Default: true */\n rememberMe: z.boolean().default(true),\n});\n\nexport const setPasswordSchema = z.object({\n identifier: identifierField,\n password: passwordField,\n /** Keep me signed in for longer. Default: true */\n rememberMe: z.boolean().default(true),\n});\n\nexport const signUpResponseSchema = authSuccessSchema.extend({\n verificationId: z.string().uuid().optional(),\n requiresVerification: z.boolean().optional(),\n debugCode: z.string().optional(),\n});\n\nexport const signInResponseSchema = authSuccessSchema.extend({\n verificationId: z.string().uuid().optional(),\n requiresVerification: z.boolean().optional(),\n});\n\nexport const emailVerificationRequestSchema = z.object({\n email: emailField.optional(),\n});\n\nexport const emailVerificationConfirmSchema = z.object({\n verificationId: z.string().uuid(),\n code: z.string().length(6),\n});\n\nexport const phoneVerificationRequestSchema = z.object({\n phone: phoneField,\n context: z.enum(['sign-up', 'sign-in', 'change-phone']),\n});\n\nexport const phoneVerificationConfirmSchema = z.object({\n verificationId: z.string().uuid(),\n code: z.string(),\n context: z.enum(['sign-up', 'sign-in', 'change-phone']),\n});\n\nexport const forgotPasswordSchema = z.object({\n identifier: z.string(),\n});\n\nexport const resetPasswordSchema = z.object({\n verificationId: z.string().uuid(),\n code: z.string(),\n password: passwordField,\n});\n\nexport const changePasswordSchema = z.object({\n currentPassword: passwordField,\n newPassword: passwordField,\n});\n\nexport const verifyPasswordSchema = z.object({\n password: passwordField,\n});\n\nexport const messageWithVerificationIdSchema = messageSchema.extend({\n verificationId: z.string().uuid().optional(),\n});\n\nexport const checkAccountSchema = z.object({\n username: identifierField,\n});\n\nexport const checkAccountResponseSchema = z.object({\n exists: z.boolean(),\n verified: z.boolean(),\n hasPassword: z.boolean(),\n requiresPasswordSetup: z.boolean(),\n account: authAccountSchema.nullable(),\n});\n\nexport const updateProfileSchema = z.object({\n fullName: z.string().min(1).max(255).optional().describe('User full name'),\n});\n\nexport const updateEmailSchema = z.object({\n email: z.string().email().describe('New email address'),\n});\n\nexport const updatePhoneSchema = z.object({\n phone: z.string().min(6).max(30).describe('New phone number'),\n});\n\nexport const profileResponseSchema = z.object({\n user: userSchema.describe('Updated user'),\n});\n\nexport const pendingAccountChangeSchema = z.object({\n changeType: z.enum(['email', 'phone']),\n newEmail: z.string().email().nullable(),\n newPhone: z.string().nullable(),\n expiresAt: z.string().datetime(),\n});\n\nexport const pendingAccountChangeResponseSchema = z.object({\n accountChange: pendingAccountChangeSchema.nullable(),\n verificationId: z.string().uuid().nullable(),\n});\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { accountsInIam, usersInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { checkAccountRoute } from '../auth.route';\n\nexport const checkAccountHandler: RouteHandler<\n typeof checkAccountRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { username } = body;\n\n const isEmail = username.includes('@');\n const userTypeFilter = sql`${usersInIam.userType} @> ARRAY[${config.userType}]::text[]`;\n const whereClause = isEmail\n ? and(\n eq(usersInIam.tenantId, resolvedTenantId),\n userTypeFilter,\n sql`lower(${usersInIam.email}) = lower(${username})`,\n )\n : and(\n eq(usersInIam.tenantId, resolvedTenantId),\n userTypeFilter,\n eq(usersInIam.phone, username),\n );\n\n const [result] = await database\n .select({\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n verified: isEmail ? usersInIam.emailVerified : usersInIam.phoneVerified,\n hasPassword: sql<boolean>`exists(\n select 1\n from ${accountsInIam}\n where ${eq(accountsInIam.tenantId, resolvedTenantId)}\n and ${eq(accountsInIam.userId, usersInIam.id)}\n and ${eq(accountsInIam.provider, 'credentials')}\n and ${sql`${accountsInIam.password} is not null`}\n )`,\n })\n .from(usersInIam)\n .where(whereClause)\n .limit(1);\n\n const verified = result?.verified ?? false;\n const hasPassword = result?.hasPassword ?? false;\n\n return c.json(\n {\n exists: !!result,\n verified,\n hasPassword,\n requiresPasswordSetup: !!result && verified && !hasPassword,\n account: result\n ? {\n fullName: result.fullName,\n email: result.email,\n phone: result.phone,\n verified,\n hasPassword,\n requiresPasswordSetup: verified && !hasPassword,\n }\n : null,\n },\n 200,\n );\n};\n","import { HTTPException } from 'hono/http-exception';\nimport type { AuthConfig } from '../types';\n\nexport const ensureTenantId = (\n config: AuthConfig,\n tenantId: string | undefined,\n): string => {\n const enableTenant = config.tenant?.enabled ?? true;\n if (enableTenant) {\n if (!tenantId) {\n throw new HTTPException(400, {\n message: 'Missing tenantId. Tenant isolation is enabled.',\n });\n }\n return tenantId;\n }\n\n // When tenant is disabled, use tenantId from config\n if (!config.tenant?.tenantId) {\n throw new HTTPException(500, {\n message:\n 'tenantId must be provided in config.tenant when tenant.enabled is false.',\n });\n }\n return config.tenant.tenantId;\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { logger } from '@mesob/common';\nimport { and, eq } from 'drizzle-orm';\nimport { accountsInIam, sessionsInIam, usersInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { generateToken, hashToken, verifyPassword } from '../../../lib/crypto';\nimport {\n normalizeAuthSession,\n normalizeAuthUser,\n} from '../../../lib/normalize-auth-response';\nimport { addDuration, getSessionDuration } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { signInRoute } from '../auth.route';\nimport { cleanupOldSessions } from '../helper/session';\nimport { fetchUserByIdWithRoles, fetchUserForLogin } from '../helper/user';\nimport {\n handleEmailVerification,\n handlePhoneVerification,\n} from '../helper/verification';\n\nexport const signInHandler: RouteHandler<typeof signInRoute, AuthEnv> =\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: auth flow combines lockout, verification, and session creation\n async function signInHandler(c) {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { identifier, password, rememberMe = true } = body;\n\n const isEmail = identifier.includes('@');\n\n if (isEmail && !config.email.enabled) {\n return c.json({ error: 'Email authentication is disabled' }, 401);\n }\n\n if (!(isEmail || config.phone.enabled)) {\n return c.json({ error: 'Phone authentication is disabled' }, 401);\n }\n const user = await fetchUserForLogin({\n database,\n identifier,\n tenantId: resolvedTenantId,\n isEmail,\n userType: config.userType,\n });\n\n if (!user) {\n logger.log('[sign-in] 401: user not found', {\n identifier,\n tenantId: resolvedTenantId,\n userType: config.userType,\n });\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n if (user.bannedUntil && new Date(user.bannedUntil) > new Date()) {\n logger.log('[sign-in] 401: account banned', {\n userId: user.id,\n bannedUntil: user.bannedUntil,\n });\n return c.json(\n {\n error: 'Account locked. Try again later.',\n bannedUntil: user.bannedUntil,\n },\n 401,\n );\n }\n\n const [account] = await database\n .select({\n id: accountsInIam.id,\n tenantId: accountsInIam.tenantId,\n userId: accountsInIam.userId,\n provider: accountsInIam.provider,\n providerAccountId: accountsInIam.providerAccountId,\n password: accountsInIam.password,\n })\n .from(accountsInIam)\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, user.id),\n eq(accountsInIam.provider, 'credentials'),\n ),\n )\n .limit(1);\n\n if (!account?.password) {\n logger.log('[sign-in] 401: no credentials account', { userId: user.id });\n return c.json({ error: AUTH_ERRORS.HAS_NO_PASSWORD }, 401);\n }\n\n const passwordValid = await verifyPassword(password, account.password);\n if (!passwordValid) {\n const newAttempt = (user.loginAttempt || 0) + 1;\n const updateData: {\n loginAttempt: number;\n bannedUntil?: string | null;\n } = {\n loginAttempt: newAttempt,\n };\n\n if (config.security && newAttempt >= config.security.maxLoginAttempts) {\n updateData.bannedUntil = addDuration(config.security.lockoutDuration);\n }\n\n await database\n .update(usersInIam)\n .set(updateData)\n .where(\n and(\n eq(usersInIam.id, user.id),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n );\n\n logger.log('[sign-in] 401: invalid password', {\n userId: user.id,\n loginAttempt: newAttempt,\n });\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const isVerified = isEmail ? user.emailVerified : user.phoneVerified;\n\n if (isEmail && config.email.required && !isVerified) {\n return handleEmailVerification({\n c,\n user: { ...user, roles: [] },\n config,\n database,\n tenantId: resolvedTenantId,\n });\n }\n\n if (!isEmail && config.phone.required && !isVerified) {\n return handlePhoneVerification({\n c,\n user: { ...user, roles: [] },\n config,\n database,\n tenantId: resolvedTenantId,\n });\n }\n\n if (config.session.maxPerUser) {\n await cleanupOldSessions({\n database,\n userId: user.id,\n tenantId: resolvedTenantId,\n maxSessions: config.session.maxPerUser,\n });\n }\n\n await database\n .update(usersInIam)\n .set({ lastSignInAt: new Date().toISOString(), loginAttempt: 0 })\n .where(\n and(\n eq(usersInIam.id, user.id),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n );\n\n const sessionToken = generateToken();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const sessionDuration = getSessionDuration({\n sessionConfig: config.session,\n rememberMe,\n });\n const expiresAt = addDuration(sessionDuration);\n\n const [session] = await database\n .insert(sessionsInIam)\n .values({\n tenantId: resolvedTenantId,\n userId: user.id,\n token: hashedToken,\n expiresAt,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n meta: { action: 'sign-in', rememberMe },\n })\n .returning({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n meta: sessionsInIam.meta,\n });\n setSessionCookie(c, sessionToken, config, {\n expires: new Date(expiresAt),\n });\n\n const fullUser = await fetchUserByIdWithRoles({\n database,\n userId: user.id,\n tenantId: resolvedTenantId,\n });\n\n return c.json(\n {\n user: normalizeAuthUser(fullUser ?? { ...user, roles: [] }),\n session: normalizeAuthSession({\n id: session.id,\n expiresAt: session.expiresAt,\n }),\n sessionExpiresAt: session.expiresAt,\n },\n 200,\n );\n };\n","export const AUTH_ERRORS = {\n USER_NOT_FOUND: 'USER_NOT_FOUND',\n INVALID_PASSWORD: 'INVALID_PASSWORD',\n USER_EXISTS: 'USER_EXISTS',\n VERIFICATION_EXPIRED: 'VERIFICATION_EXPIRED',\n VERIFICATION_MISMATCH: 'VERIFICATION_MISMATCH',\n VERIFICATION_NOT_FOUND: 'VERIFICATION_NOT_FOUND',\n TOO_MANY_ATTEMPTS: 'TOO_MANY_ATTEMPTS',\n REQUIRES_VERIFICATION: 'REQUIRES_VERIFICATION',\n UNAUTHORIZED: 'UNAUTHORIZED',\n ACCESS_DENIED: 'ACCESS_DENIED',\n HAS_NO_PASSWORD: 'HAS_NO_PASSWORD',\n PASSWORD_ALREADY_SET: 'PASSWORD_ALREADY_SET',\n} as const;\n\nexport type AuthError = (typeof AUTH_ERRORS)[keyof typeof AUTH_ERRORS];\n","import type { Session, User } from '../types';\n\nexport const normalizeAuthUser = (\n user: Pick<\n User,\n | 'id'\n | 'tenantId'\n | 'fullName'\n | 'email'\n | 'phone'\n | 'image'\n | 'emailVerified'\n | 'phoneVerified'\n >,\n) => ({\n id: user.id,\n tenantId: user.tenantId,\n fullName: user.fullName,\n email: user.email,\n phone: user.phone,\n image: user.image,\n emailVerified: user.emailVerified,\n phoneVerified: user.phoneVerified,\n});\n\nexport const normalizeAuthSession = (\n session: Pick<Session, 'id' | 'expiresAt'> | null,\n) =>\n session\n ? {\n id: session.id,\n expiresAt: session.expiresAt,\n }\n : null;\n","import { dayjs } from '@mesob/common';\nimport { nanoid } from 'nanoid';\nimport type { SessionConfig } from '../types';\n\nexport const generateHandle = (): string => {\n return nanoid(10);\n};\n\nexport const getSessionExpiresAt = (days = 30) =>\n dayjs().add(days, 'day').toISOString();\n\nexport const parseDuration = (duration: string): number => {\n const match = duration.match(/^(\\d+)([smhd])$/);\n if (!(match?.[1] && match[2])) {\n throw new Error(`Invalid duration format: ${duration}`);\n }\n const value = Number.parseInt(match[1], 10);\n const unit = match[2];\n const multipliers: Record<string, number> = {\n s: 1,\n m: 60,\n h: 3600,\n d: 86400,\n };\n return value * (multipliers[unit] || 1);\n};\n\nexport const addDuration = (duration: string): string => {\n const seconds = parseDuration(duration);\n return dayjs().add(seconds, 'second').toISOString();\n};\n\nexport const generateOtpCode = (length = 6): string => {\n const digits = '0123456789';\n const maxValid = 250; // largest multiple of 10 <= 255 to avoid modulo bias\n let code = '';\n\n while (code.length < length) {\n const randomValues = new Uint8Array(length - code.length);\n crypto.getRandomValues(randomValues);\n for (const val of randomValues) {\n if (val < maxValid && code.length < length) {\n code += digits[val % 10];\n }\n }\n }\n return code;\n};\n\n/**\n * Get session expiration duration based on rememberMe option\n */\nexport const getSessionDuration = ({\n sessionConfig,\n rememberMe,\n}: {\n sessionConfig: SessionConfig;\n rememberMe: boolean;\n}): string => {\n if (rememberMe) {\n return sessionConfig.rememberMeExpiresIn;\n }\n return sessionConfig.shortSessionExpiresIn;\n};\n\n/**\n * Get the update age threshold based on session type\n */\nexport const getSessionUpdateAge = ({\n sessionConfig,\n rememberMe,\n}: {\n sessionConfig: SessionConfig;\n rememberMe: boolean;\n}): string => {\n if (rememberMe) {\n return sessionConfig.updateAge;\n }\n return sessionConfig.shortSessionUpdateAge;\n};\n\n/**\n * Check if session needs refresh based on remaining time\n */\nexport const shouldRefreshSession = ({\n expiresAt,\n updateAge,\n}: {\n expiresAt: string;\n updateAge: string;\n}): boolean => {\n const updateAgeSeconds = parseDuration(updateAge);\n const now = dayjs();\n const expires = dayjs(expiresAt);\n const remainingSeconds = expires.diff(now, 'second');\n\n return remainingSeconds > 0 && remainingSeconds <= updateAgeSeconds;\n};\n\n/**\n * Get new expiration time for session refresh\n */\nexport const getRefreshedExpiresAt = ({\n sessionConfig,\n rememberMe,\n}: {\n sessionConfig: SessionConfig;\n rememberMe: boolean;\n}): string => {\n const duration = getSessionDuration({ sessionConfig, rememberMe });\n return addDuration(duration);\n};\n\n/**\n * Check if session is expired\n */\nexport const isSessionExpired = (expiresAt: string): boolean => {\n return dayjs(expiresAt).isBefore(dayjs());\n};\n","import { and, asc, eq, gt, inArray, sql } from 'drizzle-orm';\nimport { sessionsInIam } from '../../../db/schema';\nimport type { TransactionClient } from '../../../db/transaction';\nimport { generateToken, hashToken } from '../../../lib/crypto';\nimport { addDuration, getSessionDuration } from '../../../lib/session';\nimport type { AuthConfig, SessionMeta } from '../../../types';\nimport type {\n CleanupOldSessionsParams,\n CreateSessionParams,\n} from '../auth.types';\n\ntype CreateSessionRecordParams = {\n tx: TransactionClient;\n tenantId: string;\n userId: string;\n config: AuthConfig;\n userAgent: string | null;\n ip: string | null;\n action: string;\n rememberMe?: boolean;\n expiresIn?: string;\n};\n\nexport const createSessionRecord = async ({\n tx,\n tenantId,\n userId,\n config,\n userAgent,\n ip,\n action,\n rememberMe,\n expiresIn,\n}: CreateSessionRecordParams): Promise<{\n session: {\n id: string;\n expiresAt: string;\n createdAt: string;\n updatedAt: string;\n userAgent: string | null;\n ip: string | null;\n };\n sessionToken: string;\n expiresAt: string;\n}> => {\n const sessionToken = generateToken();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const sessionDuration =\n expiresIn ||\n getSessionDuration({\n sessionConfig: config.session,\n rememberMe: rememberMe ?? true,\n });\n const expiresAt = addDuration(sessionDuration);\n const meta: SessionMeta = { action };\n\n if (rememberMe !== undefined) {\n meta.rememberMe = rememberMe;\n }\n\n const [session] = await tx\n .insert(sessionsInIam)\n .values({\n tenantId,\n userId,\n token: hashedToken,\n expiresAt,\n userAgent,\n ip,\n meta,\n })\n .returning({\n id: sessionsInIam.id,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n });\n\n return { session, sessionToken, expiresAt };\n};\n\nexport const createSession = async ({\n tx,\n tenantId,\n userId,\n config,\n userAgent,\n ip,\n rememberMe = true,\n}: CreateSessionParams): Promise<{\n sessionId: string;\n sessionToken: string;\n expiresAt: string;\n}> => {\n const { session, sessionToken, expiresAt } = await createSessionRecord({\n tx,\n tenantId,\n userId,\n config,\n userAgent,\n ip,\n rememberMe,\n action: 'sign-up',\n });\n\n return { sessionId: session.id, sessionToken, expiresAt };\n};\n\nexport const cleanupOldSessions = async ({\n database,\n userId,\n tenantId,\n maxSessions,\n}: CleanupOldSessionsParams) => {\n const [{ count }] = await database\n .select({ count: sql<number>`count(*)` })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n );\n\n if (count <= maxSessions) {\n return;\n }\n\n const toDeleteCount = count - maxSessions;\n const idsToDelete = await database\n .select({ id: sessionsInIam.id })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .orderBy(asc(sessionsInIam.createdAt))\n .limit(toDeleteCount);\n\n if (!idsToDelete.length) {\n return;\n }\n\n await database.delete(sessionsInIam).where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n inArray(\n sessionsInIam.id,\n idsToDelete.map((s) => s.id),\n ),\n ),\n );\n};\n","import { and, eq, gt, sql } from 'drizzle-orm';\nimport {\n accountsInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { hashPassword } from '../../../lib/crypto';\nimport { getUserAuthSelect } from '../../../lib/user-auth-select';\nimport type { User } from '../../../types';\nimport type {\n AuthAccountLookup,\n CheckExistingUserStatusParams,\n CreateUserWithAccountParams,\n DeleteUnverifiedUserParams,\n FetchUserByIdentifierParams,\n FetchUserByIdWithRolesParams,\n FetchUserForLoginParams,\n UserRecord,\n} from '../auth.types';\n\nexport const checkExistingUserStatus = async ({\n tx,\n identifier,\n tenantId,\n isEmail,\n}: CheckExistingUserStatusParams): Promise<\n | { action: 'proceed' }\n | { action: 'error'; code: string }\n | { action: 'pending'; verificationId: string; user: UserRecord }\n> => {\n const whereClause = isEmail\n ? and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n )\n : and(eq(usersInIam.tenantId, tenantId), eq(usersInIam.phone, identifier));\n\n const [existingUser] = await tx\n .select()\n .from(usersInIam)\n .where(whereClause)\n .limit(1);\n\n if (!existingUser) {\n return { action: 'proceed' };\n }\n\n const isVerified = isEmail\n ? existingUser.emailVerified\n : existingUser.phoneVerified;\n\n if (isVerified) {\n return { action: 'error', code: AUTH_ERRORS.USER_EXISTS };\n }\n\n // Check for valid pending verification\n const [pendingVerification] = await tx\n .select()\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.userId, existingUser.id),\n eq(verificationsInIam.tenantId, tenantId),\n gt(verificationsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .limit(1);\n\n if (pendingVerification) {\n return {\n action: 'pending',\n verificationId: pendingVerification.id,\n user: existingUser,\n };\n }\n\n // Delete expired unverified user\n await deleteUnverifiedUser({ tx, userId: existingUser.id, tenantId });\n return { action: 'proceed' };\n};\n\nexport const deleteUnverifiedUser = async ({\n tx,\n userId,\n tenantId,\n}: DeleteUnverifiedUserParams) => {\n await tx\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.tenantId, tenantId),\n ),\n );\n await tx\n .delete(accountsInIam)\n .where(\n and(\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.tenantId, tenantId),\n ),\n );\n await tx\n .delete(usersInIam)\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)));\n};\n\nexport const createUserWithAccount = async ({\n tx,\n tenantId,\n email,\n phone,\n password,\n fullName,\n handle,\n config,\n}: CreateUserWithAccountParams): Promise<UserRecord> => {\n const [user] = await tx\n .insert(usersInIam)\n .values({\n tenantId,\n fullName,\n handle,\n email: email || null,\n phone: phone || null,\n emailVerified: email ? !config.email.required : false,\n phoneVerified: phone ? !config.phone.required : false,\n userType: [config.userType],\n })\n .returning();\n\n const passwordHash = await hashPassword(password);\n\n await tx.insert(accountsInIam).values({\n tenantId,\n userId: user.id,\n provider: 'credentials',\n providerAccountId: email || phone || user.id,\n password: passwordHash,\n });\n\n return user;\n};\n\nexport const fetchUserForLogin = async ({\n database,\n identifier,\n tenantId,\n isEmail,\n userType,\n}: FetchUserForLoginParams): Promise<AuthAccountLookup | null> => {\n const userTypeFilter = sql`${usersInIam.userType} @> ARRAY[${userType}]::text[]`;\n const whereClause = isEmail\n ? and(\n eq(usersInIam.tenantId, tenantId),\n userTypeFilter,\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n )\n : and(\n eq(usersInIam.tenantId, tenantId),\n userTypeFilter,\n eq(usersInIam.phone, identifier),\n );\n const [row] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n bannedUntil: usersInIam.bannedUntil,\n loginAttempt: usersInIam.loginAttempt,\n hasPassword: sql<boolean>`exists(\n select 1\n from ${accountsInIam}\n where ${eq(accountsInIam.tenantId, tenantId)}\n and ${eq(accountsInIam.userId, usersInIam.id)}\n and ${eq(accountsInIam.provider, 'credentials')}\n and ${sql`${accountsInIam.password} is not null`}\n )`,\n })\n .from(usersInIam)\n .where(whereClause)\n .limit(1);\n return row || null;\n};\n\nexport const fetchUserByIdWithRoles = async ({\n database,\n userId,\n tenantId,\n}: FetchUserByIdWithRolesParams): Promise<User | null> => {\n const [result] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n bannedUntil: usersInIam.bannedUntil,\n loginAttempt: usersInIam.loginAttempt,\n ...getUserAuthSelect(tenantId),\n })\n .from(usersInIam)\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .limit(1);\n return (result as User) || null;\n};\n\nexport const fetchUserByIdentifier = async ({\n database,\n identifier,\n tenantId,\n isEmail,\n userType,\n}: FetchUserByIdentifierParams): Promise<User | null> => {\n const baseWhere = isEmail\n ? and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n )\n : and(eq(usersInIam.tenantId, tenantId), eq(usersInIam.phone, identifier));\n const whereClause = userType\n ? and(baseWhere, sql`${usersInIam.userType} @> ARRAY[${userType}]::text[]`)\n : baseWhere;\n\n const [result] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n bannedUntil: usersInIam.bannedUntil,\n loginAttempt: usersInIam.loginAttempt,\n ...getUserAuthSelect(tenantId),\n })\n .from(usersInIam)\n .where(whereClause)\n .limit(1);\n return (result as User) || null;\n};\n","import { dayjs } from '@mesob/common';\nimport { and, desc, eq } from 'drizzle-orm';\nimport type { Database } from '../../../db';\nimport { verificationsInIam } from '../../../db/schema';\nimport { hashToken } from '../../../lib/crypto';\nimport { normalizeAuthUser } from '../../../lib/normalize-auth-response';\nimport {\n addDuration,\n generateOtpCode,\n parseDuration,\n} from '../../../lib/session';\nimport type {\n CreateVerificationParams,\n HandleVerificationParams,\n SendVerificationParams,\n} from '../auth.types';\n\nexport const createVerification = async ({\n tx,\n tenantId,\n userId,\n type,\n to,\n config,\n}: CreateVerificationParams): Promise<{\n verificationId: string;\n code: string;\n hash: string;\n}> => {\n const isPhone = type === 'phone-otp-sign-up';\n const code = generateOtpCode(\n isPhone ? config.phone.otpLength : config.email.otpLength,\n );\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(\n isPhone ? config.phone.expiresIn : config.email.expiresIn,\n );\n\n const [verification] = await tx\n .insert(verificationsInIam)\n .values({\n tenantId,\n userId,\n type,\n code: hashedCode,\n expiresAt,\n to,\n attempt: 0,\n })\n .returning();\n\n return { verificationId: verification.id, code, hash: hashedCode };\n};\n\nexport const sendVerification = async ({\n channel,\n to,\n code,\n config,\n hash,\n type,\n}: SendVerificationParams & { hash: string; type: string }) => {\n if (channel === 'phone' && config.phone.sendVerificationOTP) {\n await config.phone.sendVerificationOTP({\n phone: to,\n code,\n hash,\n type,\n });\n } else if (config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email: to,\n code,\n hash,\n type,\n });\n }\n};\n\ntype VerificationResendCheckParams = {\n database: Database;\n tenantId: string;\n userId: string;\n type: string;\n resendInterval?: string;\n};\n\ntype VerificationResendCheckResult = {\n blocked: boolean;\n verificationId?: string;\n};\n\nexport const checkVerificationResend = async ({\n database,\n tenantId,\n userId,\n type,\n resendInterval,\n}: VerificationResendCheckParams): Promise<VerificationResendCheckResult> => {\n if (!resendInterval) {\n return { blocked: false };\n }\n\n const [verification] = await database\n .select({\n id: verificationsInIam.id,\n createdAt: verificationsInIam.createdAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, type),\n ),\n )\n .orderBy(desc(verificationsInIam.createdAt))\n .limit(1);\n\n if (!verification) {\n return { blocked: false };\n }\n\n const cooldownSeconds = parseDuration(resendInterval);\n const createdAt = dayjs(verification.createdAt);\n const blocked = dayjs().diff(createdAt, 'second') < cooldownSeconds;\n return { blocked, verificationId: verification.id };\n};\n\nexport const handleEmailVerification = async ({\n c,\n user,\n config,\n database,\n tenantId,\n}: HandleVerificationParams) => {\n if (!user.email) {\n return c.json({ error: 'User email not found' }, 401);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, user.id),\n eq(verificationsInIam.type, 'email-verification'),\n ),\n );\n\n const code = generateOtpCode(config.email.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId,\n userId: user.id,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: user.email,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n\n if (config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email: user.email,\n code,\n hash: hashedCode,\n type: 'email-verification',\n });\n }\n\n return c.json(\n {\n user: normalizeAuthUser(user),\n session: null,\n verificationId: verification.id,\n requiresVerification: true,\n },\n 200,\n );\n};\n\nexport const handlePhoneVerification = async ({\n c,\n user,\n config,\n database,\n tenantId,\n}: HandleVerificationParams) => {\n if (!user.phone) {\n return c.json({ error: 'User phone not found' }, 401);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, user.id),\n eq(verificationsInIam.type, 'phone-otp'),\n ),\n );\n\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId,\n userId: user.id,\n type: 'phone-otp',\n code: hashedCode,\n expiresAt,\n to: user.phone,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n\n if (config.phone.sendVerificationOTP) {\n await config.phone.sendVerificationOTP({\n phone: user.phone,\n code,\n hash: hashedCode,\n type: 'phone-otp',\n });\n }\n\n return c.json(\n {\n user: normalizeAuthUser(user),\n session: null,\n verificationId: verification.id,\n requiresVerification: true,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, gt } from 'drizzle-orm';\nimport { getCookie } from 'hono/cookie';\nimport { sessionsInIam } from '../../../db/schema';\nimport { deleteSessionCookie, getSessionCookieName } from '../../../lib/cookie';\nimport { hashToken } from '../../../lib/crypto';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { signOutRoute } from '../auth.route';\n\nexport const signOutHandler: RouteHandler<\n typeof signOutRoute,\n AuthEnv\n> = async (c) => {\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n ensureTenantId(config, tenantId);\n\n const sessionToken = getCookie(c, getSessionCookieName(config));\n\n if (!sessionToken) {\n return c.json({ message: 'Signed out' }, 200);\n }\n\n const hashedToken = await hashToken(sessionToken, config.secret);\n const [session] = await database\n .select({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.token, hashedToken),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .limit(1);\n\n if (session) {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.id, session.id),\n eq(sessionsInIam.tenantId, session.tenantId),\n ),\n );\n }\n deleteSessionCookie(c, config);\n\n return c.json({ message: 'Signed out' }, 200);\n};\n","import type { ExtractTablesWithRelations } from 'drizzle-orm';\nimport type { PgQueryResultHKT, PgTransaction } from 'drizzle-orm/pg-core';\nimport type { Database } from './index';\nimport type * as relations from './relations';\nimport type * as schema from './schema';\n\nexport type TransactionClient = PgTransaction<\n PgQueryResultHKT,\n typeof schema & typeof relations,\n ExtractTablesWithRelations<typeof schema & typeof relations>\n>;\n\nexport function withTransaction<T>(\n database: Database,\n callback: (tx: TransactionClient) => Promise<T>,\n): Promise<T> {\n return database.transaction(async (tx) => callback(tx));\n}\n","import type { AuthConfig } from '../types';\n\nexport const createPhoneField = (config: AuthConfig) => {\n const phoneRegex =\n config.phone.phoneRegex || /^(\\+2519|\\+2517|2519|2517|09|07)\\d{8}$/;\n const regex =\n typeof phoneRegex === 'string' ? new RegExp(phoneRegex) : phoneRegex;\n\n return {\n validate: (phone: string): boolean => {\n return regex.test(phone.trim());\n },\n regex,\n };\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { withTransaction } from '../../../db/transaction';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport {\n normalizeAuthSession,\n normalizeAuthUser,\n} from '../../../lib/normalize-auth-response';\nimport { createPhoneField } from '../../../lib/phone-validation';\nimport { generateHandle } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { User } from '../../../types';\nimport type { AuthEnv } from '../../../types/context';\nimport type { signUpRoute } from '../auth.route';\nimport type { SignUpResult } from '../auth.types';\nimport { createSession } from '../helper/session';\nimport { checkExistingUserStatus, createUserWithAccount } from '../helper/user';\nimport { createVerification, sendVerification } from '../helper/verification';\n\nclass SignUpError extends Error {\n constructor(\n message: string,\n public status: number,\n ) {\n super(message);\n }\n}\n\nexport const signUpHandler: RouteHandler<typeof signUpRoute, AuthEnv> = async (\n c,\n) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { email, phone, password, fullName, rememberMe = true } = body;\n const identifier = email || phone;\n\n if (!identifier) {\n return c.json({ error: 'Either email or phone is required' }, 409);\n }\n\n const isEmail = identifier.includes('@');\n\n if (phone) {\n const phoneValidator = createPhoneField(config);\n if (!phoneValidator.validate(phone)) {\n return c.json({ error: 'Invalid phone number format' }, 400);\n }\n }\n\n if (isEmail && !config.email.enabled) {\n return c.json({ error: 'Email authentication is disabled' }, 403);\n }\n\n if (!(isEmail || config.phone.enabled)) {\n return c.json({ error: 'Phone authentication is disabled' }, 403);\n }\n const userAgent = c.req.header('user-agent') || null;\n const ip =\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || null;\n\n let result: SignUpResult;\n\n try {\n result = await withTransaction(database, async (tx) => {\n const status = await checkExistingUserStatus({\n tx,\n identifier,\n tenantId: resolvedTenantId,\n isEmail,\n });\n\n if (status.action === 'error') {\n throw new SignUpError(status.code, 409);\n }\n\n if (status.action === 'pending') {\n return {\n type: 'pending' as const,\n verificationId: status.verificationId,\n user: status.user,\n };\n }\n\n const handle = generateHandle();\n\n const user = await createUserWithAccount({\n tx,\n tenantId: resolvedTenantId,\n email,\n phone,\n password,\n fullName,\n handle,\n config,\n });\n\n if (phone && config.phone.required) {\n const { verificationId, code, hash } = await createVerification({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'phone-otp-sign-up',\n to: phone,\n config,\n });\n return {\n type: 'verification' as const,\n user,\n verificationId,\n code,\n hash,\n to: phone,\n channel: 'phone' as const,\n };\n }\n\n if (email && config.email.required) {\n const { verificationId, code, hash } = await createVerification({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'email-verification',\n to: email,\n config,\n });\n return {\n type: 'verification' as const,\n user,\n verificationId,\n code,\n hash,\n to: email,\n channel: 'email' as const,\n };\n }\n\n const { sessionId, sessionToken, expiresAt } = await createSession({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n config,\n userAgent,\n ip,\n rememberMe,\n });\n\n return {\n type: 'session' as const,\n user,\n sessionToken,\n expiresAt,\n sessionId,\n };\n });\n } catch (error) {\n if (error instanceof SignUpError) {\n return c.json({ error: error.message }, error.status as 409);\n }\n throw error;\n }\n\n if (result.type === 'pending') {\n return c.json(\n {\n user: normalizeAuthUser(result.user as unknown as User),\n session: null,\n verificationId: result.verificationId,\n requiresVerification: true,\n },\n 201,\n );\n }\n\n if (result.type === 'verification') {\n await sendVerification({\n channel: result.channel,\n to: result.to,\n code: result.code,\n hash: result.hash,\n type:\n result.channel === 'phone' ? 'phone-otp-sign-up' : 'email-verification',\n config,\n });\n\n return c.json(\n {\n user: normalizeAuthUser(result.user),\n session: null,\n verificationId: result.verificationId,\n requiresVerification: true,\n },\n 201,\n );\n }\n\n setSessionCookie(c, result.sessionToken, config, {\n expires: new Date(result.expiresAt),\n });\n\n return c.json(\n {\n user: normalizeAuthUser(result.user),\n session: normalizeAuthSession({\n id: result.sessionId,\n expiresAt: result.expiresAt,\n }),\n sessionExpiresAt: result.expiresAt,\n },\n 201,\n );\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport {\n createDomainSchema,\n deleteDomainResponseSchema,\n domainIdParamSchema,\n domainResponseSchema,\n errorResponseSchema,\n listDomainsQuerySchema,\n listDomainsResponseSchema,\n updateDomainSchema,\n} from './domains.schema';\nimport { createDomainHandler } from './handler/create-domain';\nimport { deleteDomainHandler } from './handler/delete-domain';\nimport { getDomainHandler } from './handler/get-domain';\nimport { listDomainsHandler } from './handler/list-domains';\nimport { updateDomainHandler } from './handler/update-domain';\nimport { verifyDomainHandler } from './handler/verify-domain';\n\nexport const listDomainsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Domains'],\n summary: 'List domains',\n request: {\n query: listDomainsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listDomainsResponseSchema,\n },\n },\n description: 'List of domains',\n },\n },\n});\n\nexport const getDomainRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Domains'],\n summary: 'Get domain by ID',\n request: {\n params: domainIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: domainResponseSchema,\n },\n },\n description: 'Domain details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Domain not found',\n },\n },\n});\n\nexport const createDomainRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Domains'],\n summary: 'Create domain',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: createDomainSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: domainResponseSchema,\n },\n },\n description: 'Domain created',\n },\n },\n});\n\nexport const updateDomainRoute = createRoute({\n method: 'put',\n path: '/{id}',\n tags: ['Domains'],\n summary: 'Update domain',\n request: {\n params: domainIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: updateDomainSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: domainResponseSchema,\n },\n },\n description: 'Domain updated',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Domain not found',\n },\n },\n});\n\nexport const deleteDomainRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Domains'],\n summary: 'Delete domain',\n request: {\n params: domainIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: deleteDomainResponseSchema,\n },\n },\n description: 'Domain deleted',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Domain not found',\n },\n },\n});\n\nexport const verifyDomainRoute = createRoute({\n method: 'post',\n path: '/{id}/verify',\n tags: ['Domains'],\n summary: 'Verify domain',\n request: {\n params: domainIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: domainResponseSchema,\n },\n },\n description: 'Domain verified',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Domain not found',\n },\n },\n});\n\nconst IAM_ALL = 'iam:all:all';\n\nconst domainRoutesBase = new OpenAPIHono<AuthEnv>().use('*', (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n}) as OpenAPIHono<AuthEnv>;\n\nconst domainRoutes = domainRoutesBase\n .openapi(listDomainsRoute, listDomainsHandler)\n .openapi(getDomainRoute, getDomainHandler)\n .openapi(createDomainRoute, createDomainHandler)\n .openapi(updateDomainRoute, updateDomainHandler)\n .openapi(deleteDomainRoute, deleteDomainHandler)\n .openapi(verifyDomainRoute, verifyDomainHandler);\n\nexport default domainRoutes;\n","import { grant } from '@mesob/common';\nimport { HTTPException } from 'hono/http-exception';\nimport type { User } from '../types';\n\ntype ContextWithUser = { get: (key: 'user') => User | undefined };\n\nconst toArray = <T>(v: T | T[]): T[] => {\n return Array.isArray(v) ? v : [v];\n};\n\nexport const hasRole = (\n c: ContextWithUser,\n role: string | string[],\n): boolean => {\n const user = c.get('user');\n const codes = user?.roleCodes;\n if (!codes?.length) {\n return false;\n }\n const check = toArray(role);\n return check.some((r) => codes.includes(r));\n};\n\nexport const hasRoleThrow = (\n c: ContextWithUser,\n role: string | string[],\n): void => {\n if (!hasRole(c, role)) {\n throw new HTTPException(401, { message: 'Unauthorized' });\n }\n};\n\nexport const hasPermission = (\n c: ContextWithUser,\n permission: string | string[],\n): boolean => {\n const user = c.get('user');\n const perms = user?.permissions;\n const check = toArray(permission);\n return grant(check, perms);\n};\n\nexport const hasPermissionThrow = (\n c: ContextWithUser,\n permission: string | string[],\n): void => {\n if (!hasPermission(c, permission)) {\n throw new HTTPException(401, { message: 'Unauthorized' });\n }\n};\n","import { z } from 'zod';\n\n// Query schemas\nexport const listDomainsQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n status: z.enum(['pending', 'active', 'disabled', 'deleted']).optional(),\n});\n\n// Path parameter schemas\nexport const domainIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Request body schemas\nexport const createDomainSchema = z.object({\n domain: z\n .string()\n .regex(\n /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)+$/,\n ),\n status: z\n .enum(['pending', 'active', 'disabled', 'deleted'])\n .default('pending')\n .optional(),\n meta: z.unknown().optional(),\n isPrimary: z.boolean().default(false).optional(),\n});\n\nexport const updateDomainSchema = z.object({\n domain: z\n .string()\n .regex(\n /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)+$/,\n )\n .optional(),\n status: z.enum(['pending', 'active', 'disabled', 'deleted']).optional(),\n meta: z.unknown().nullable().optional(),\n isPrimary: z.boolean().optional(),\n});\n\n// Response schemas\nexport const domainSchema = z.object({\n id: z.uuid(),\n tenantId: z.string(),\n domain: z.string(),\n status: z.string(),\n meta: z.unknown().nullable(),\n isPrimary: z.boolean(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nexport const listDomainsResponseSchema = z.object({\n domains: z.array(domainSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const domainResponseSchema = z.object({\n domain: domainSchema,\n});\n\nexport const deleteDomainResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { domainsInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { createDomainRoute } from '../domains.route';\n\nexport const createDomainHandler: RouteHandler<\n typeof createDomainRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const status = (body.status || 'pending').toUpperCase();\n const [domain] = await database\n .insert(domainsInIam)\n .values({\n tenantId: resolvedTenantId,\n domain: body.domain,\n status,\n meta: body.meta || null,\n isPrimary: body.isPrimary,\n })\n .returning();\n\n return c.json({ domain }, 201);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { domainsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { deleteDomainRoute } from '../domains.route';\n\nexport const deleteDomainHandler: RouteHandler<\n typeof deleteDomainRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(domainsInIam)\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n await database\n .delete(domainsInIam)\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)));\n\n return c.json({ message: 'Domain deleted' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { domainsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getDomainRoute } from '../domains.route';\n\nexport const getDomainHandler: RouteHandler<\n typeof getDomainRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [domain] = await database\n .select()\n .from(domainsInIam)\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!domain) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n return c.json({ domain }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { domainsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listDomainsRoute } from '../domains.route';\n\nexport const listDomainsHandler: RouteHandler<\n typeof listDomainsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [eq(domainsInIam.tenantId, tenantId)];\n if (query.status) {\n conditions.push(eq(domainsInIam.status, query.status.toUpperCase()));\n }\n\n const [domains, totalResult] = await Promise.all([\n database\n .select()\n .from(domainsInIam)\n .where(and(...conditions))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(domainsInIam)\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ domains, total, page, limit });\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { domainsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateDomainRoute } from '../domains.route';\n\nexport const updateDomainHandler: RouteHandler<\n typeof updateDomainRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(domainsInIam)\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n const updateData: Partial<typeof domainsInIam.$inferInsert> = {};\n\n if (body.domain !== undefined) {\n updateData.domain = body.domain;\n }\n if (body.status !== undefined) {\n updateData.status = body.status.toUpperCase();\n }\n if (body.meta !== undefined) {\n updateData.meta = body.meta;\n }\n if (body.isPrimary !== undefined) {\n updateData.isPrimary = body.isPrimary;\n }\n\n const [updated] = await database\n .update(domainsInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .returning();\n\n if (!updated) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n return c.json({ domain: updated }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { domainsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { verifyDomainRoute } from '../domains.route';\n\nexport const verifyDomainHandler: RouteHandler<\n typeof verifyDomainRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(domainsInIam)\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n const [updated] = await database\n .update(domainsInIam)\n .set({\n status: 'active',\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .returning();\n\n if (!updated) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n return c.json({ domain: updated }, 200);\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport {\n authSuccessSchema,\n emailVerificationConfirmSchema,\n emailVerificationRequestSchema,\n errorResponseSchema,\n messageWithVerificationIdSchema,\n} from '../auth.schema';\nimport { emailVerificationConfirmHandler } from './handler/verification-confirm';\nimport { emailVerificationRequestHandler } from './handler/verification-request';\n\nexport const emailVerificationRequestRoute = createRoute({\n method: 'post',\n path: '/verification/request',\n tags: ['Email'],\n summary: 'Request email verification',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: emailVerificationRequestSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: messageWithVerificationIdSchema,\n },\n },\n description: 'Verification code sent',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid request',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const emailVerificationConfirmRoute = createRoute({\n method: 'post',\n path: '/verification/confirm',\n tags: ['Email'],\n summary: 'Confirm email verification',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: emailVerificationConfirmSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Email verified',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid verification',\n },\n },\n});\n\nconst emailRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(emailVerificationRequestRoute, emailVerificationRequestHandler)\n .openapi(emailVerificationConfirmRoute, emailVerificationConfirmHandler);\n\nexport default emailRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { fetchUserWithRoles } from '../../../db/orm';\nimport { usersInIam, verificationsInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { hashToken } from '../../../lib/crypto';\nimport {\n normalizeAuthSession,\n normalizeAuthUser,\n} from '../../../lib/normalize-auth-response';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { createSessionRecord } from '../../auth/helper/session';\nimport type { emailVerificationConfirmRoute } from '../email.route';\n\nexport const emailVerificationConfirmHandler: RouteHandler<\n typeof emailVerificationConfirmRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code } = body;\n\n const result = await withTransaction(database, async (tx) => {\n const [verification] = await tx\n .select()\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.id, verificationId),\n eq(verificationsInIam.tenantId, resolvedTenantId),\n ),\n )\n .limit(1);\n\n if (!verification || verification.type !== 'email-verification') {\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_NOT_FOUND,\n };\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_EXPIRED,\n };\n }\n\n if ((verification.attempt || 0) >= config.email.maxAttempts) {\n await tx\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.TOO_MANY_ATTEMPTS,\n };\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await tx\n .update(verificationsInIam)\n .set({ attempt: (verification.attempt || 0) + 1 })\n .where(eq(verificationsInIam.id, verificationId));\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_MISMATCH,\n };\n }\n\n await tx\n .update(usersInIam)\n .set({\n emailVerified: true,\n lastSignInAt: new Date().toISOString(),\n })\n .where(\n and(\n eq(usersInIam.id, verification.userId),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n );\n\n await tx\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n\n const user = await fetchUserWithRoles({\n database: tx,\n userId: verification.userId,\n tenantId: resolvedTenantId,\n });\n\n if (!user) {\n return { status: 'error' as const, error: 'User not found' };\n }\n\n const { session, sessionToken, expiresAt } = await createSessionRecord({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n config,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n action: 'email-verification',\n expiresIn: config.session.expiresIn,\n });\n\n return {\n status: 'ok' as const,\n user,\n session,\n sessionToken,\n expiresAt,\n };\n });\n\n if (result.status === 'error') {\n return c.json({ error: result.error }, 400);\n }\n\n setSessionCookie(c, result.sessionToken, config, {\n expires: new Date(result.expiresAt),\n });\n\n return c.json(\n {\n user: normalizeAuthUser(result.user),\n session: normalizeAuthSession(result.session),\n sessionExpiresAt: result.session.expiresAt,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport {\n accountChangesInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { hashToken } from '../../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { checkVerificationResend } from '../../auth/helper/verification';\nimport type { emailVerificationRequestRoute } from '../email.route';\n\nexport const emailVerificationRequestHandler: RouteHandler<\n typeof emailVerificationRequestRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const user = c.get('user');\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n if (!config.email.enabled) {\n return c.json({ error: 'Email authentication is disabled' }, 400);\n }\n\n const email = body.email || user?.email;\n\n if (!email) {\n return c.json({ error: 'Email required' }, 400);\n }\n\n const genericResponse = {\n message: 'If the account exists, a verification code was sent.',\n };\n\n let userId = user?.id;\n if (!userId) {\n const [result] = await database\n .select({ id: usersInIam.id })\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, resolvedTenantId),\n sql`lower(${usersInIam.email}) = lower(${email})`,\n ),\n )\n .limit(1);\n\n if (!result) {\n return c.json(genericResponse, 200);\n }\n\n userId = result.id;\n }\n\n const resendCheck = await checkVerificationResend({\n database,\n tenantId: resolvedTenantId,\n userId,\n type: 'email-verification',\n resendInterval: config.email.resendInterval,\n });\n\n if (resendCheck.blocked) {\n return c.json(\n {\n message: 'Verification recently sent',\n verificationId: resendCheck.verificationId,\n },\n 200,\n );\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, 'email-verification'),\n ),\n );\n\n const code = generateOtpCode(config.email.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId: resolvedTenantId,\n userId,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: email,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n\n if (user?.id && body.email) {\n await database\n .update(accountChangesInIam)\n .set({\n status: 'cancelled',\n cancelledAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n reason: 'replaced',\n })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, user.id),\n eq(accountChangesInIam.changeType, 'email'),\n eq(accountChangesInIam.status, 'pending'),\n ),\n );\n\n await database.insert(accountChangesInIam).values({\n tenantId: resolvedTenantId,\n userId: user.id,\n changeType: 'email',\n oldEmail: user.email ?? '',\n newEmail: body.email,\n oldPhone: null,\n newPhone: null,\n status: 'pending',\n expiresAt: verification.expiresAt,\n updatedAt: new Date().toISOString(),\n });\n }\n\n if (config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email,\n code,\n hash: hashedCode,\n type: 'email-verification',\n });\n }\n\n return c.json(\n {\n message: 'Verification code sent',\n verificationId: verification.id,\n },\n 200,\n );\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport {\n authSuccessSchema,\n changePasswordSchema,\n errorResponseSchema,\n forgotPasswordSchema,\n messageSchema,\n messageWithVerificationIdSchema,\n resetPasswordSchema,\n setPasswordSchema,\n verifyPasswordSchema,\n} from '../auth.schema';\nimport { changePasswordHandler } from './handler/change';\nimport { forgotPasswordHandler } from './handler/forgot';\nimport { resetPasswordHandler } from './handler/reset';\nimport { setPasswordHandler } from './handler/set';\nimport { verifyPasswordHandler } from './handler/verify';\n\nexport const forgotPasswordRoute = createRoute({\n method: 'post',\n path: '/forgot',\n tags: ['Password'],\n summary: 'Request password reset',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: forgotPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: messageWithVerificationIdSchema,\n },\n },\n description: 'Reset code sent if account exists',\n },\n },\n});\n\nexport const resetPasswordRoute = createRoute({\n method: 'post',\n path: '/reset',\n tags: ['Password'],\n summary: 'Reset password',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: resetPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Password reset and new session',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid verification',\n },\n },\n});\n\nexport const verifyPasswordRoute = createRoute({\n method: 'post',\n path: '/verify',\n tags: ['Password'],\n summary: 'Verify password',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: verifyPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: { 'application/json': { schema: messageSchema } },\n description: 'Password verified',\n },\n 401: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Invalid password',\n },\n },\n});\n\nexport const changePasswordRoute = createRoute({\n method: 'post',\n path: '/change',\n tags: ['Password'],\n summary: 'Change password',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: changePasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: { 'application/json': { schema: messageSchema } },\n description: 'Password updated',\n },\n 401: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Invalid password',\n },\n },\n});\n\nexport const setPasswordRoute = createRoute({\n method: 'post',\n path: '/set',\n tags: ['Password'],\n summary: 'Set password for an existing verified account',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: setPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Password set and user signed in',\n },\n 400: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Account not found',\n },\n 409: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Password already exists or verification required',\n },\n },\n});\n\nconst passwordRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(forgotPasswordRoute, forgotPasswordHandler)\n .openapi(resetPasswordRoute, resetPasswordHandler)\n .openapi(verifyPasswordRoute, verifyPasswordHandler)\n .openapi(changePasswordRoute, changePasswordHandler)\n .openapi(setPasswordRoute, setPasswordHandler);\n\nexport default passwordRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, gt, ne } from 'drizzle-orm';\nimport { getCookie } from 'hono/cookie';\nimport { accountsInIam, sessionsInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { getSessionCookieName } from '../../../lib/cookie';\nimport { hashPassword, hashToken, verifyPassword } from '../../../lib/crypto';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { changePasswordRoute } from '../password.route';\n\nexport const changePasswordHandler: RouteHandler<\n typeof changePasswordRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { currentPassword, newPassword } = body;\n\n const [account] = await database\n .select()\n .from(accountsInIam)\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n )\n .limit(1);\n\n if (!account?.password) {\n return c.json({ error: AUTH_ERRORS.HAS_NO_PASSWORD }, 401);\n }\n\n const passwordValid = await verifyPassword(currentPassword, account.password);\n if (!passwordValid) {\n return c.json({ error: AUTH_ERRORS.INVALID_PASSWORD }, 401);\n }\n\n const passwordHash = await hashPassword(newPassword);\n await database\n .update(accountsInIam)\n .set({ password: passwordHash })\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n\n const currentSessionToken = getCookie(c, getSessionCookieName(config));\n if (currentSessionToken) {\n const hashedToken = await hashToken(currentSessionToken, config.secret);\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, resolvedTenantId),\n eq(sessionsInIam.userId, userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ne(sessionsInIam.token, hashedToken),\n ),\n );\n }\n\n return c.json({ message: 'Password updated' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport {\n rolesInIam,\n userRolesInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { hashToken } from '../../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { User } from '../../../types';\nimport type { AuthEnv } from '../../../types/context';\nimport type { forgotPasswordRoute } from '../password.route';\n\nexport const forgotPasswordHandler: RouteHandler<\n typeof forgotPasswordRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { identifier } = body;\n\n const isEmail = identifier.includes('@');\n\n if (isEmail && !config.email.enabled) {\n return c.json({ message: 'If account exists, reset code sent' }, 200);\n }\n\n if (!(isEmail || config.phone.enabled)) {\n return c.json({ message: 'If account exists, reset code sent' }, 200);\n }\n\n let user: User | null = null;\n\n if (isEmail) {\n const [result] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n roles: sql<string[] | null>`COALESCE(\n array_to_json(array_agg(${rolesInIam.id}) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL)),\n '[]'::json\n )`,\n })\n .from(usersInIam)\n .leftJoin(\n userRolesInIam,\n and(\n eq(userRolesInIam.userId, usersInIam.id),\n eq(userRolesInIam.tenantId, resolvedTenantId),\n ),\n )\n .leftJoin(\n rolesInIam,\n and(\n eq(userRolesInIam.roleId, rolesInIam.id),\n eq(rolesInIam.tenantId, resolvedTenantId),\n ),\n )\n .where(\n and(\n eq(usersInIam.tenantId, resolvedTenantId),\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n ),\n )\n .groupBy(usersInIam.id)\n .limit(1);\n user = (result as User) || null;\n } else {\n const [result] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n roles: sql<string[] | null>`COALESCE(\n array_to_json(array_agg(${rolesInIam.id}) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL)),\n '[]'::json\n )`,\n })\n .from(usersInIam)\n .leftJoin(\n userRolesInIam,\n and(\n eq(userRolesInIam.userId, usersInIam.id),\n eq(userRolesInIam.tenantId, resolvedTenantId),\n ),\n )\n .leftJoin(\n rolesInIam,\n and(\n eq(userRolesInIam.roleId, rolesInIam.id),\n eq(rolesInIam.tenantId, resolvedTenantId),\n ),\n )\n .where(\n and(\n eq(usersInIam.tenantId, resolvedTenantId),\n eq(usersInIam.phone, identifier),\n ),\n )\n .groupBy(usersInIam.id)\n .limit(1);\n user = (result as User) || null;\n }\n\n if (!user) {\n return c.json({ message: 'If account exists, reset code sent' }, 200);\n }\n\n let verificationId: string | undefined;\n\n if (isEmail) {\n if (!user.email) {\n return c.json({ message: 'If account exists, reset code sent' }, 200);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, user.id),\n eq(verificationsInIam.type, 'password-reset'),\n ),\n );\n\n const code = generateOtpCode(config.email.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'password-reset',\n code: hashedCode,\n expiresAt,\n to: user.email,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n verificationId = verification.id;\n\n if (config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email: user.email,\n code,\n hash: hashedCode,\n type: 'password-reset',\n });\n }\n } else {\n if (!user.phone) {\n return c.json({ message: 'If account exists, reset code sent' }, 200);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, user.id),\n eq(verificationsInIam.type, 'password-reset-otp'),\n ),\n );\n\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'password-reset-otp',\n code: hashedCode,\n expiresAt,\n to: user.phone,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n verificationId = verification.id;\n\n if (config.phone.sendVerificationOTP) {\n await config.phone.sendVerificationOTP({\n phone: user.phone,\n code,\n hash: hashedCode,\n type: 'password-reset-otp',\n });\n }\n }\n\n return c.json(\n {\n message: 'If account exists, reset code sent',\n // Only return verificationId for UX - security note: this reveals account existence\n // For stricter security, remove verificationId and use email/sms link with token\n verificationId,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, gt } from 'drizzle-orm';\nimport {\n accountsInIam,\n sessionsInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { hashPassword, hashToken } from '../../../lib/crypto';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { createPasswordResetSession } from '../helper/session';\nimport type { resetPasswordRoute } from '../password.route';\n\nexport const resetPasswordHandler: RouteHandler<\n typeof resetPasswordRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code, password } = body;\n\n const [verification] = await database\n .select()\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.id, verificationId),\n eq(verificationsInIam.tenantId, resolvedTenantId),\n ),\n )\n .limit(1);\n\n if (!verification) {\n return c.json({ error: AUTH_ERRORS.VERIFICATION_NOT_FOUND }, 400);\n }\n\n if (\n verification.type !== 'password-reset' &&\n verification.type !== 'password-reset-otp'\n ) {\n return c.json({ error: AUTH_ERRORS.VERIFICATION_NOT_FOUND }, 400);\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n return c.json({ error: AUTH_ERRORS.VERIFICATION_EXPIRED }, 400);\n }\n\n const maxAttempts =\n verification.type === 'password-reset'\n ? config.email.maxAttempts\n : config.phone.maxAttempts;\n if ((verification.attempt || 0) >= maxAttempts) {\n await database\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n return c.json({ error: AUTH_ERRORS.TOO_MANY_ATTEMPTS }, 400);\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await database\n .update(verificationsInIam)\n .set({ attempt: (verification.attempt || 0) + 1 })\n .where(eq(verificationsInIam.id, verificationId));\n return c.json({ error: AUTH_ERRORS.VERIFICATION_MISMATCH }, 400);\n }\n\n const passwordHash = await hashPassword(password);\n await database\n .update(accountsInIam)\n .set({ password: passwordHash })\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, verification.userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, resolvedTenantId),\n eq(sessionsInIam.userId, verification.userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n );\n\n await database\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n\n const [user] = await database\n .select()\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.id, verification.userId),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n )\n .limit(1);\n\n if (!user) {\n return c.json({ error: 'User not found' }, 400);\n }\n\n return createPasswordResetSession({\n c,\n user,\n config,\n database,\n tenantId: resolvedTenantId,\n });\n};\n","import { sessionsInIam } from '../../../db/schema';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { generateToken, hashToken } from '../../../lib/crypto';\nimport {\n normalizeAuthSession,\n normalizeAuthUser,\n} from '../../../lib/normalize-auth-response';\nimport { addDuration } from '../../../lib/session';\nimport type { CreatePasswordResetSessionParams } from '../password.types';\n\nexport const createPasswordResetSession = async ({\n c,\n user,\n config,\n database,\n tenantId,\n}: CreatePasswordResetSessionParams) => {\n const sessionToken = generateToken();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const [session] = await database\n .insert(sessionsInIam)\n .values({\n tenantId,\n userId: user.id,\n token: hashedToken,\n expiresAt,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n meta: { action: 'password-reset' },\n })\n .returning();\n\n setSessionCookie(c, sessionToken, config, {\n expires: new Date(expiresAt),\n });\n\n return c.json(\n {\n user: normalizeAuthUser(user),\n session: normalizeAuthSession(session),\n sessionExpiresAt: session.expiresAt,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { accountsInIam, usersInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { hashPassword } from '../../../lib/crypto';\nimport {\n normalizeAuthSession,\n normalizeAuthUser,\n} from '../../../lib/normalize-auth-response';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { createSessionRecord } from '../../auth/helper/session';\nimport {\n fetchUserByIdWithRoles,\n fetchUserForLogin,\n} from '../../auth/helper/user';\nimport type { setPasswordRoute } from '../password.route';\n\nexport const setPasswordHandler: RouteHandler<\n typeof setPasswordRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { identifier, password, rememberMe = true } = body;\n const isEmail = identifier.includes('@');\n\n const user = await fetchUserForLogin({\n database,\n identifier,\n tenantId: resolvedTenantId,\n isEmail,\n userType: config.userType,\n });\n\n if (!user) {\n return c.json({ error: AUTH_ERRORS.USER_NOT_FOUND }, 400);\n }\n\n const isVerified = isEmail ? user.emailVerified : user.phoneVerified;\n if (!isVerified) {\n return c.json({ error: AUTH_ERRORS.REQUIRES_VERIFICATION }, 409);\n }\n\n if (user.hasPassword) {\n return c.json({ error: AUTH_ERRORS.PASSWORD_ALREADY_SET }, 409);\n }\n\n const userAgent = c.req.header('user-agent') || null;\n const ip =\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || null;\n\n const result = await withTransaction(database, async (tx) => {\n const passwordHash = await hashPassword(password);\n\n const [account] = await tx\n .select({\n id: accountsInIam.id,\n })\n .from(accountsInIam)\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, user.id),\n eq(accountsInIam.provider, 'credentials'),\n ),\n )\n .limit(1);\n\n if (account) {\n await tx\n .update(accountsInIam)\n .set({\n password: passwordHash,\n providerAccountId: identifier,\n })\n .where(eq(accountsInIam.id, account.id));\n } else {\n await tx.insert(accountsInIam).values({\n tenantId: resolvedTenantId,\n userId: user.id,\n provider: 'credentials',\n providerAccountId: identifier,\n password: passwordHash,\n });\n }\n\n await tx\n .update(usersInIam)\n .set({ lastSignInAt: new Date().toISOString(), loginAttempt: 0 })\n .where(\n and(\n eq(usersInIam.id, user.id),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n );\n\n return createSessionRecord({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n config,\n userAgent,\n ip,\n action: 'set-password',\n rememberMe,\n });\n });\n\n setSessionCookie(c, result.sessionToken, config, {\n expires: new Date(result.expiresAt),\n });\n\n const fullUser = await fetchUserByIdWithRoles({\n database,\n userId: user.id,\n tenantId: resolvedTenantId,\n });\n\n return c.json(\n {\n user: normalizeAuthUser(fullUser ?? { ...user, roles: [] }),\n session: normalizeAuthSession(result.session),\n sessionExpiresAt: result.session.expiresAt,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { accountsInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { verifyPassword } from '../../../lib/crypto';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { verifyPasswordRoute } from '../password.route';\n\nexport const verifyPasswordHandler: RouteHandler<\n typeof verifyPasswordRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { password } = body;\n\n const [account] = await database\n .select()\n .from(accountsInIam)\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n )\n .limit(1);\n\n if (!account?.password) {\n return c.json({ error: AUTH_ERRORS.HAS_NO_PASSWORD }, 401);\n }\n\n const passwordValid = await verifyPassword(password, account.password);\n if (!passwordValid) {\n return c.json({ error: AUTH_ERRORS.INVALID_PASSWORD }, 401);\n }\n\n return c.json({ message: 'Password verified' }, 200);\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport { getPermissionHandler } from './handler/get-permission';\nimport { listPermissionsHandler } from './handler/list-permissions';\nimport { seedPermissionsHandler } from './handler/seed-permissions';\nimport {\n errorResponseSchema,\n listPermissionsQuerySchema,\n listPermissionsResponseSchema,\n permissionIdParamSchema,\n permissionResponseSchema,\n seedPermissionsResponseSchema,\n} from './permissions.schema';\n\nexport const listPermissionsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Permissions'],\n summary: 'List permissions',\n request: {\n query: listPermissionsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listPermissionsResponseSchema,\n },\n },\n description: 'List of permissions',\n },\n },\n});\n\nexport const getPermissionRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Permissions'],\n summary: 'Get permission by ID',\n request: {\n params: permissionIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: permissionResponseSchema,\n },\n },\n description: 'Permission details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Permission not found',\n },\n },\n});\n\nexport const seedPermissionsRoute = createRoute({\n method: 'post',\n path: '/seed',\n tags: ['Permissions'],\n summary: 'Seed permissions from config',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: seedPermissionsResponseSchema,\n },\n },\n description: 'Seeded permissions',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid permission config',\n },\n },\n});\n\nconst IAM_ALL = 'iam:all:all';\n\nconst permissionRoutesBase = new OpenAPIHono<AuthEnv>().use('*', (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n}) as OpenAPIHono<AuthEnv>;\n\nconst permissionRoutes = permissionRoutesBase\n .openapi(listPermissionsRoute, listPermissionsHandler)\n .openapi(seedPermissionsRoute, seedPermissionsHandler)\n .openapi(getPermissionRoute, getPermissionHandler);\n\nexport default permissionRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { getPermissionEntries } from '@mesob/common';\nimport { eq } from 'drizzle-orm';\nimport { permissionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getPermissionRoute } from '../permissions.route';\n\nexport const getPermissionHandler: RouteHandler<\n typeof getPermissionRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const config = c.get('config');\n\n const [permission] = await database\n .select()\n .from(permissionsInIam)\n .where(eq(permissionsInIam.id, id))\n .limit(1);\n\n if (!permission) {\n const configuredPermission = getPermissionEntries(config.permissions).find(\n (entry) => entry.code === id,\n );\n\n if (!configuredPermission) {\n return c.json({ error: 'Permission not found' }, 404);\n }\n\n return c.json(\n {\n permission: {\n id: configuredPermission.code,\n description: null,\n activity: configuredPermission.activity,\n application: configuredPermission.application,\n feature: configuredPermission.feature,\n },\n },\n 200,\n );\n }\n\n return c.json({ permission }, 200);\n};\n","import type { PermissionTree } from '@mesob/common';\nimport { getPermissionEntries } from '@mesob/common';\nimport type { Database } from '../db';\nimport { permissionsInIam } from '../db/schema';\n\nexport type PermissionCatalogItem = {\n id: string;\n description: unknown;\n activity: string;\n application: string;\n feature: string;\n};\n\ntype PermissionListQuery = {\n search?: string;\n filter?: '' | 'application' | 'feature' | 'activity';\n sort?: 'id' | 'application' | 'feature' | 'activity';\n order?: 'asc' | 'desc';\n};\n\nconst collator = new Intl.Collator(undefined, {\n numeric: true,\n sensitivity: 'base',\n});\n\nconst sortValueMap = {\n id: (permission: PermissionCatalogItem) => permission.id,\n application: (permission: PermissionCatalogItem) => permission.application,\n feature: (permission: PermissionCatalogItem) => permission.feature,\n activity: (permission: PermissionCatalogItem) => permission.activity,\n} as const;\n\nexport async function getMergedPermissionCatalog({\n database,\n permissions,\n}: {\n database: Database;\n permissions?: PermissionTree | null;\n}) {\n const [databasePermissions, configuredPermissions] = await Promise.all([\n database.select().from(permissionsInIam),\n Promise.resolve(\n getPermissionEntries(permissions).map((entry) => ({\n id: entry.code,\n description: null,\n activity: entry.activity,\n application: entry.application,\n feature: entry.feature,\n })),\n ),\n ]);\n\n return [...databasePermissions, ...configuredPermissions].filter(\n (permission, index, permissionList) => {\n const key = [\n permission.application,\n permission.feature,\n permission.activity,\n ].join(':');\n\n return (\n permissionList.findIndex((candidate) => {\n return (\n [candidate.application, candidate.feature, candidate.activity].join(\n ':',\n ) === key\n );\n }) === index\n );\n },\n ) as PermissionCatalogItem[];\n}\n\nexport function filterAndSortPermissions(\n permissions: PermissionCatalogItem[],\n query: PermissionListQuery,\n) {\n const search = query.search?.trim().toLowerCase();\n const filteredPermissions = search\n ? permissions.filter((permission) => {\n let fields = [\n permission.id,\n permission.application,\n permission.feature,\n permission.activity,\n ];\n\n if (query.filter === 'application') {\n fields = [permission.application];\n } else if (query.filter === 'feature') {\n fields = [permission.feature];\n } else if (query.filter === 'activity') {\n fields = [permission.activity];\n }\n\n return fields.some((field) => field.toLowerCase().includes(search));\n })\n : permissions;\n\n const sortGetter = sortValueMap[query.sort || 'id'] ?? sortValueMap.id;\n\n return [...filteredPermissions].sort((a, b) => {\n const order =\n collator.compare(sortGetter(a), sortGetter(b)) ||\n collator.compare(a.id, b.id);\n\n return query.order === 'desc' ? -order : order;\n });\n}\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport {\n filterAndSortPermissions,\n getMergedPermissionCatalog,\n} from '../../../lib/permission-catalog';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listPermissionsRoute } from '../permissions.route';\n\nexport const listPermissionsHandler: RouteHandler<\n typeof listPermissionsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const config = c.get('config');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const mergedPermissions = await getMergedPermissionCatalog({\n database,\n permissions: config.permissions,\n });\n const sortedPermissions = filterAndSortPermissions(mergedPermissions, query);\n\n const total = sortedPermissions.length;\n const permissions = sortedPermissions.slice(offset, offset + limit);\n\n return c.json({ permissions, total, page, limit }, 200);\n};\n","import { randomUUID } from 'node:crypto';\nimport type { PermissionTree } from '@mesob/common';\nimport { getPermissionEntries, toTitleCase } from '@mesob/common';\nimport {\n and,\n eq,\n type InferInsertModel,\n inArray,\n notInArray,\n sql,\n} from 'drizzle-orm';\nimport { HTTPException } from 'hono/http-exception';\nimport type { Database } from '../db';\nimport {\n permissionsInIam,\n rolePermissionsInIam,\n rolesInIam,\n} from '../db/schema';\nimport type { TransactionClient } from '../db/transaction';\nimport type { SeedRole } from '../types';\n\ntype DatabaseClient = Database | TransactionClient;\n\nfunction buildPermissionDescription(code: string) {\n return {\n en: toTitleCase(code.replaceAll(':', ' ').replaceAll('_', ' ')),\n };\n}\n\nexport function buildPermissionSeedRows(\n permissions?: PermissionTree | null,\n): InferInsertModel<typeof permissionsInIam>[] {\n const entries = getPermissionEntries(permissions);\n const byId = new Map<string, InferInsertModel<typeof permissionsInIam>>();\n for (const entry of entries) {\n byId.set(entry.code, {\n id: entry.code,\n application: entry.application,\n feature: entry.feature,\n activity: entry.activity,\n description: buildPermissionDescription(entry.code),\n });\n }\n return [...byId.values()];\n}\n\nexport async function seedPermissions({\n database,\n permissions,\n}: {\n database: DatabaseClient;\n permissions?: PermissionTree | null;\n}) {\n const rows = buildPermissionSeedRows(permissions);\n if (!rows.length) {\n return [];\n }\n\n await database\n .insert(permissionsInIam)\n .values(rows)\n .onConflictDoUpdate({\n target: permissionsInIam.id,\n set: {\n application: sql`excluded.application`,\n feature: sql`excluded.feature`,\n activity: sql`excluded.activity`,\n description: sql`excluded.description`,\n },\n });\n\n return database\n .select()\n .from(permissionsInIam)\n .where(\n inArray(\n permissionsInIam.id,\n rows.map((row) => row.id),\n ),\n );\n}\n\nasync function assertPermissionsExist({\n database,\n permissionIds,\n}: {\n database: DatabaseClient;\n permissionIds: string[];\n}) {\n if (!permissionIds.length) {\n return;\n }\n\n const existing = await database\n .select({ id: permissionsInIam.id })\n .from(permissionsInIam)\n .where(inArray(permissionsInIam.id, permissionIds));\n\n const existingIds = new Set(existing.map((permission) => permission.id));\n const missingPermissionIds = permissionIds.filter(\n (id) => !existingIds.has(id),\n );\n\n if (missingPermissionIds.length) {\n throw new HTTPException(400, {\n message: `Unknown permissions: ${missingPermissionIds.join(', ')}`,\n });\n }\n}\n\nexport async function syncRolePermissions({\n database,\n tenantId,\n roleId,\n permissionIds,\n}: {\n database: DatabaseClient;\n tenantId: string;\n roleId: string;\n permissionIds: string[];\n}) {\n const uniquePermissionIds = [...new Set(permissionIds)];\n\n await assertPermissionsExist({\n database,\n permissionIds: uniquePermissionIds,\n });\n\n if (!uniquePermissionIds.length) {\n await database\n .delete(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.tenantId, tenantId),\n eq(rolePermissionsInIam.roleId, roleId),\n ),\n );\n\n return [];\n }\n\n await database\n .delete(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.tenantId, tenantId),\n eq(rolePermissionsInIam.roleId, roleId),\n notInArray(rolePermissionsInIam.permissionId, uniquePermissionIds),\n ),\n );\n\n await database\n .insert(rolePermissionsInIam)\n .values(\n uniquePermissionIds.map((permissionId) => ({\n id: randomUUID(),\n tenantId,\n roleId,\n permissionId,\n })),\n )\n .onConflictDoNothing({\n target: [\n rolePermissionsInIam.tenantId,\n rolePermissionsInIam.permissionId,\n rolePermissionsInIam.roleId,\n ],\n });\n\n return database\n .select()\n .from(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.tenantId, tenantId),\n eq(rolePermissionsInIam.roleId, roleId),\n ),\n );\n}\n\nexport async function seedRoles({\n database,\n tenantId,\n roles,\n}: {\n database: DatabaseClient;\n tenantId: string;\n roles: readonly SeedRole[];\n}) {\n if (!roles.length) {\n return [];\n }\n\n await database\n .insert(rolesInIam)\n .values(\n roles.map((role) => ({\n id: randomUUID(),\n tenantId,\n code: role.code,\n name: role.name,\n description: role.description ?? { en: role.code },\n isSystem: role.isSystem ?? false,\n isEditable: role.isEditable ?? true,\n isDeletable: role.isDeletable ?? true,\n })),\n )\n .onConflictDoUpdate({\n target: [rolesInIam.tenantId, rolesInIam.code],\n set: {\n name: sql`excluded.name`,\n description: sql`excluded.description`,\n isSystem: sql`excluded.is_system`,\n isEditable: sql`excluded.is_editable`,\n isDeletable: sql`excluded.is_deletable`,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n },\n });\n\n const seededRoles = await database\n .select()\n .from(rolesInIam)\n .where(\n and(\n eq(rolesInIam.tenantId, tenantId),\n inArray(\n rolesInIam.code,\n roles.map((role) => role.code),\n ),\n ),\n );\n\n const roleByCode = new Map(\n seededRoles.map((role) => [role.code, role] as const),\n );\n\n for (const role of roles) {\n const seededRole = roleByCode.get(role.code);\n if (!seededRole) {\n continue;\n }\n\n await syncRolePermissions({\n database,\n tenantId,\n roleId: seededRole.id,\n permissionIds: [...new Set(role.permissionIds ?? [])],\n });\n }\n\n return seededRoles;\n}\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { seedPermissions } from '../../../lib/iam-seed';\nimport type { AuthEnv } from '../../../types/context';\nimport type { seedPermissionsRoute } from '../permissions.route';\n\nexport const seedPermissionsHandler: RouteHandler<\n typeof seedPermissionsRoute,\n AuthEnv\n> = async (c) => {\n const config = c.get('config');\n const database = c.get('database');\n\n if (!config.permissions) {\n return c.json({ error: 'No permissions configured for seeding' }, 400);\n }\n\n const permissions = await seedPermissions({\n database,\n permissions: config.permissions,\n });\n\n return c.json(\n {\n permissions,\n total: permissions.length,\n },\n 200,\n );\n};\n","import { z } from 'zod';\n\nconst permissionFilterValues = [\n '',\n 'application',\n 'feature',\n 'activity',\n] as const;\nconst permissionSortValues = [\n 'id',\n 'application',\n 'feature',\n 'activity',\n] as const;\n\n// Query schemas\nexport const listPermissionsQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n search: z.string().optional(),\n filter: z.enum(permissionFilterValues).optional(),\n sort: z.enum(permissionSortValues).optional(),\n order: z.enum(['asc', 'desc']).optional(),\n});\n\n// Path parameter schemas\nexport const permissionIdParamSchema = z.object({\n id: z.string(),\n});\n\n// Response schemas\nexport const permissionSchema = z.object({\n id: z.string(),\n description: z.unknown(),\n activity: z.string(),\n application: z.string(),\n feature: z.string(),\n});\n\nexport const seedPermissionsResponseSchema = z.object({\n permissions: z.array(permissionSchema),\n total: z.number(),\n});\n\nexport const listPermissionsResponseSchema = z.object({\n permissions: z.array(permissionSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const permissionResponseSchema = z.object({\n permission: permissionSchema,\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport {\n authSuccessSchema,\n errorResponseSchema,\n messageWithVerificationIdSchema,\n phoneVerificationConfirmSchema,\n phoneVerificationRequestSchema,\n} from '../auth.schema';\nimport { phoneVerificationConfirmHandler } from './handler/verification-confirm';\nimport { phoneVerificationRequestHandler } from './handler/verification-request';\n\nexport const phoneVerificationRequestRoute = createRoute({\n method: 'post',\n path: '/verification/request',\n tags: ['Phone'],\n summary: 'Request phone OTP',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: phoneVerificationRequestSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: messageWithVerificationIdSchema,\n },\n },\n description: 'OTP sent',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid request',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const phoneVerificationConfirmRoute = createRoute({\n method: 'post',\n path: '/verification/confirm',\n tags: ['Phone'],\n summary: 'Confirm phone OTP',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: phoneVerificationConfirmSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Phone verified',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid verification',\n },\n },\n});\n\nconst phoneRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(phoneVerificationRequestRoute, phoneVerificationRequestHandler)\n .openapi(phoneVerificationConfirmRoute, phoneVerificationConfirmHandler);\n\nexport default phoneRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { fetchUserWithRoles } from '../../../db/orm';\nimport { usersInIam, verificationsInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { hashToken } from '../../../lib/crypto';\nimport {\n normalizeAuthSession,\n normalizeAuthUser,\n} from '../../../lib/normalize-auth-response';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { createSessionRecord } from '../../auth/helper/session';\nimport { shouldCreateSession } from '../helper/session';\nimport type { phoneVerificationConfirmRoute } from '../phone.route';\n\nconst getSessionAction = (context: string) =>\n context === 'sign-up'\n ? 'phone-verification-sign-up'\n : `phone-verification-${context}`;\n\nexport const phoneVerificationConfirmHandler: RouteHandler<\n typeof phoneVerificationConfirmRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code, context } = body;\n\n const result = await withTransaction(database, async (tx) => {\n const [verification] = await tx\n .select()\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.id, verificationId),\n eq(verificationsInIam.tenantId, resolvedTenantId),\n ),\n )\n .limit(1);\n\n const expectedType = `phone-otp-${context}`;\n if (!verification || verification.type !== expectedType) {\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_NOT_FOUND,\n };\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_EXPIRED,\n };\n }\n\n if ((verification.attempt || 0) >= config.phone.maxAttempts) {\n await tx\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.TOO_MANY_ATTEMPTS,\n };\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await tx\n .update(verificationsInIam)\n .set({ attempt: (verification.attempt || 0) + 1 })\n .where(eq(verificationsInIam.id, verificationId));\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_MISMATCH,\n };\n }\n\n await tx\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n\n if (shouldCreateSession(context) && verification.userId) {\n await tx\n .update(usersInIam)\n .set({\n phoneVerified: true,\n lastSignInAt: new Date().toISOString(),\n })\n .where(\n and(\n eq(usersInIam.id, verification.userId),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n );\n }\n\n if (!verification.userId) {\n return { status: 'error' as const, error: 'User not found' };\n }\n\n const user = await fetchUserWithRoles({\n database: tx,\n userId: verification.userId,\n tenantId: resolvedTenantId,\n });\n\n if (!user) {\n return { status: 'error' as const, error: 'User not found' };\n }\n\n if (!shouldCreateSession(context)) {\n return { status: 'ok' as const, user, session: null };\n }\n\n const { session, sessionToken, expiresAt } = await createSessionRecord({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n config,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n action: getSessionAction(context),\n expiresIn: config.session.expiresIn,\n });\n\n return {\n status: 'ok' as const,\n user,\n session,\n sessionToken,\n expiresAt,\n };\n });\n\n if (result.status === 'error') {\n return c.json({ error: result.error }, 400);\n }\n\n if (!result.session) {\n return c.json(\n {\n user: normalizeAuthUser(result.user),\n session: null,\n },\n 200,\n );\n }\n\n setSessionCookie(c, result.sessionToken, config, {\n expires: new Date(result.expiresAt),\n });\n\n return c.json(\n {\n user: normalizeAuthUser(result.user),\n session: normalizeAuthSession(result.session),\n sessionExpiresAt: result.session.expiresAt,\n },\n 200,\n );\n};\n","import { withTransaction } from '../../../db/transaction';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport {\n normalizeAuthSession,\n normalizeAuthUser,\n} from '../../../lib/normalize-auth-response';\nimport { createSessionRecord } from '../../auth/helper/session';\nimport type { CreateSessionResponseParams } from '../phone.types';\n\nexport const shouldCreateSession = (context: string) =>\n context === 'sign-in' || context === 'change-phone' || context === 'sign-up';\n\nconst getSessionAction = (context: string) =>\n context === 'sign-up'\n ? 'phone-verification-sign-up'\n : `phone-verification-${context}`;\n\nexport const createSessionResponse = async ({\n c,\n user,\n config,\n database,\n tenantId,\n context,\n}: CreateSessionResponseParams) => {\n const { session, sessionToken, expiresAt } = await withTransaction(\n database,\n async (tx) =>\n createSessionRecord({\n tx,\n tenantId,\n userId: user.id,\n config,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n action: getSessionAction(context),\n expiresIn: config.session.expiresIn,\n }),\n );\n\n setSessionCookie(c, sessionToken, config, {\n expires: new Date(expiresAt),\n });\n\n return c.json(\n {\n user: normalizeAuthUser(user),\n session: normalizeAuthSession(session),\n sessionExpiresAt: session.expiresAt,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport {\n accountChangesInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { hashToken } from '../../../lib/crypto';\nimport { createPhoneField } from '../../../lib/phone-validation';\nimport { addDuration, generateOtpCode } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { checkVerificationResend } from '../../auth/helper/verification';\nimport type { phoneVerificationRequestRoute } from '../phone.route';\n\nexport const phoneVerificationRequestHandler: RouteHandler<\n typeof phoneVerificationRequestRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const user = c.get('user');\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n if (!config.phone.enabled) {\n return c.json({ error: 'Phone authentication is disabled' }, 400);\n }\n\n const { phone, context } = body;\n\n if (!phone) {\n return c.json({ error: 'Phone required' }, 400);\n }\n\n const phoneValidator = createPhoneField(config);\n if (!phoneValidator.validate(phone)) {\n return c.json({ error: 'Invalid phone number format' }, 400);\n }\n\n const genericResponse = {\n message: 'If the account exists, a verification code was sent.',\n };\n\n let userId = user?.id;\n if (!userId) {\n const [result] = await database\n .select({ id: usersInIam.id })\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, resolvedTenantId),\n eq(usersInIam.phone, phone),\n ),\n )\n .limit(1);\n\n if (!result) {\n return c.json(genericResponse, 200);\n }\n\n userId = result.id;\n }\n\n const verificationType = `phone-otp-${context}`;\n const resendCheck = await checkVerificationResend({\n database,\n tenantId: resolvedTenantId,\n userId,\n type: verificationType,\n resendInterval: config.phone.resendInterval,\n });\n\n if (resendCheck.blocked) {\n return c.json(\n {\n message: 'Verification recently sent',\n verificationId: resendCheck.verificationId,\n },\n 200,\n );\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, verificationType),\n ),\n );\n\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId: resolvedTenantId,\n userId,\n type: verificationType,\n code: hashedCode,\n expiresAt,\n to: phone,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n\n if (context === 'change-phone' && user?.id) {\n await database\n .update(accountChangesInIam)\n .set({\n status: 'cancelled',\n cancelledAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n reason: 'replaced',\n })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, user.id),\n eq(accountChangesInIam.changeType, 'phone'),\n eq(accountChangesInIam.status, 'pending'),\n ),\n );\n\n await database.insert(accountChangesInIam).values({\n tenantId: resolvedTenantId,\n userId: user.id,\n changeType: 'phone',\n oldPhone: user.phone ?? '',\n newPhone: phone,\n oldEmail: null,\n newEmail: null,\n status: 'pending',\n expiresAt: verification.expiresAt,\n updatedAt: new Date().toISOString(),\n });\n }\n\n if (config.phone.sendVerificationOTP) {\n await config.phone.sendVerificationOTP({\n phone,\n code,\n hash: hashedCode,\n type: verificationType,\n });\n }\n\n return c.json(\n {\n message: 'Verification code sent',\n verificationId: verification.id,\n },\n 200,\n );\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { z } from 'zod';\nimport type { AuthEnv } from '../../types/context';\nimport {\n errorResponseSchema,\n pendingAccountChangeResponseSchema,\n profileResponseSchema,\n updateEmailSchema,\n updatePhoneSchema,\n updateProfileSchema,\n userSchema,\n} from '../auth.schema';\nimport { accountChangePendingHandler } from './handler/account-change-pending';\nimport { meHandler } from './handler/me';\nimport { sessionHandler } from './handler/session';\nimport { updateProfileHandler } from './handler/update';\nimport { updateEmailHandler } from './handler/update-email';\nimport { updatePhoneHandler } from './handler/update-phone';\n\nexport const meRoute = createRoute({\n method: 'get',\n path: '/me',\n tags: ['Profile'],\n summary: 'Get current user',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: z.object({ user: userSchema }),\n },\n },\n description: 'Current user',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n },\n});\n\nexport const sessionRoute = createRoute({\n method: 'get',\n path: '/session',\n tags: ['Profile'],\n summary: 'Get current session',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: z.object({\n user: userSchema.nullable(),\n session: z\n .object({\n id: z.string().uuid(),\n expiresAt: z.string().datetime(),\n createdAt: z.string().datetime(),\n })\n .nullable(),\n }),\n },\n },\n description: 'Session info (null if no cookie sent)',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid session (cookie sent but invalid/expired)',\n },\n 500: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Server error checking session',\n },\n },\n});\n\nexport const updateProfileRoute = createRoute({\n method: 'put',\n path: '/profile',\n tags: ['Profile'],\n summary: 'Update user profile',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updateProfileSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Profile updated',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const updateEmailRoute = createRoute({\n method: 'put',\n path: '/profile/email',\n tags: ['Profile'],\n summary: 'Update user email',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updateEmailSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Email updated',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const updatePhoneRoute = createRoute({\n method: 'put',\n path: '/profile/phone',\n tags: ['Profile'],\n summary: 'Update user phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updatePhoneSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Phone updated',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid request',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const accountChangePendingRoute = createRoute({\n method: 'get',\n path: '/account-change/pending',\n tags: ['Profile'],\n summary: 'Get pending account change (email/phone)',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: pendingAccountChangeResponseSchema,\n },\n },\n description: 'Pending account change',\n },\n 401: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Unauthorized',\n },\n },\n});\n\nconst profileRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(meRoute, meHandler)\n .openapi(sessionRoute, sessionHandler)\n .openapi(updateProfileRoute, updateProfileHandler)\n .openapi(updateEmailRoute, updateEmailHandler)\n .openapi(updatePhoneRoute, updatePhoneHandler)\n .openapi(accountChangePendingRoute, accountChangePendingHandler);\n\nexport default profileRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, gt, sql } from 'drizzle-orm';\nimport { accountChangesInIam, verificationsInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { accountChangePendingRoute } from '../profile.route';\n\nexport const accountChangePendingHandler: RouteHandler<\n typeof accountChangePendingRoute,\n AuthEnv\n> = async (c) => {\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n await database\n .update(accountChangesInIam)\n .set({ status: 'expired' })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, userId),\n sql`${accountChangesInIam.expiresAt} < CURRENT_TIMESTAMP`,\n ),\n );\n\n const [accountChange] = await database\n .select()\n .from(accountChangesInIam)\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.status, 'pending'),\n ),\n )\n .limit(1);\n\n if (!accountChange) {\n return c.json({ accountChange: null, verificationId: null }, 200);\n }\n\n let verification: { id: string; expiresAt: string } | null = null;\n if (accountChange.changeType === 'email' && accountChange.newEmail) {\n const [v] = await database\n .select({\n id: verificationsInIam.id,\n expiresAt: verificationsInIam.expiresAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, 'email-verification'),\n eq(verificationsInIam.to, accountChange.newEmail),\n gt(verificationsInIam.expiresAt, sql`CURRENT_TIMESTAMP`),\n ),\n )\n .limit(1);\n verification = v || null;\n }\n if (accountChange.changeType === 'phone' && accountChange.newPhone) {\n const [v] = await database\n .select({\n id: verificationsInIam.id,\n expiresAt: verificationsInIam.expiresAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, 'phone-otp-change-phone'),\n eq(verificationsInIam.to, accountChange.newPhone),\n gt(verificationsInIam.expiresAt, sql`CURRENT_TIMESTAMP`),\n ),\n )\n .limit(1);\n verification = v || null;\n }\n\n if (!verification) {\n return c.json({ accountChange: null, verificationId: null }, 200);\n }\n\n return c.json(\n {\n accountChange: {\n changeType: accountChange.changeType as 'email' | 'phone',\n newEmail: accountChange.newEmail,\n newPhone: accountChange.newPhone,\n expiresAt: accountChange.expiresAt,\n },\n verificationId: verification.id,\n },\n 200,\n );\n};\n","import type { User } from '../types';\n\nexport const normalizeUser = (user: User) => ({\n ...user,\n roles: user.roles ?? null,\n roleCodes: user.roleCodes ?? null,\n});\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { AuthEnv } from '../../../types/context';\nimport type { meRoute } from '../profile.route';\n\nexport const meHandler: RouteHandler<typeof meRoute, AuthEnv> = (c) => {\n const user = c.get('user');\n\n if (!user) {\n return c.json({ error: 'Unauthorized' }, 401);\n }\n\n return c.json({ user: normalizeUser(user) }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { AuthEnv } from '../../../types/context';\nimport type { sessionRoute } from '../profile.route';\n\nexport const sessionHandler: RouteHandler<typeof sessionRoute, AuthEnv> = (\n c,\n) => {\n const user = c.get('user');\n const session = c.get('session');\n const status = c.get('sessionStatus');\n\n // No cookie sent - return empty session (not an error, just no session)\n if (status === 'no_cookie') {\n return c.json({ user: null, session: null }, 200);\n }\n\n // Cookie sent but session invalid/expired - 401 (cookie was passed but invalid)\n if (status === 'invalid_session') {\n return c.json({ error: 'Invalid session', code: 'INVALID_SESSION' }, 401);\n }\n\n // User not found for session - 401\n if (status === 'user_not_found') {\n return c.json({ error: 'User not found', code: 'USER_NOT_FOUND' }, 401);\n }\n\n // Server error while checking session - 500\n if (status === 'error') {\n return c.json(\n { error: 'Session check error', code: 'SESSION_CHECK_ERROR' },\n 500,\n );\n }\n\n // Valid session\n if (user && session) {\n return c.json(\n {\n user: normalizeUser(user),\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n },\n },\n 200,\n );\n }\n\n // Fallback - no cookie case\n return c.json({ user: null, session: null }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateProfileRoute } from '../profile.route';\n\nexport const updateProfileHandler: RouteHandler<\n typeof updateProfileRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const updateData: Partial<typeof usersInIam.$inferInsert> = {};\n if (body.fullName !== undefined) {\n updateData.fullName = body.fullName;\n }\n\n const [updatedUser] = await database\n .update(usersInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(\n and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, resolvedTenantId)),\n )\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (!updatedUser) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n return c.json({ user: normalizeUser(updatedUser) }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, ne, sql } from 'drizzle-orm';\nimport {\n accountChangesInIam,\n accountsInIam,\n sessionsInIam,\n usersInIam,\n} from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateEmailRoute } from '../profile.route';\n\nexport const updateEmailHandler: RouteHandler<\n typeof updateEmailRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n const session = c.get('session');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n if (user.email && session?.id) {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, resolvedTenantId),\n eq(sessionsInIam.userId, userId),\n ne(sessionsInIam.id, session.id),\n ),\n );\n }\n\n const [updatedUser] = await database\n .update(usersInIam)\n .set({\n email: body.email,\n emailVerified: true,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(\n and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, resolvedTenantId)),\n )\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (!updatedUser) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n await database\n .update(accountChangesInIam)\n .set({ status: 'applied' })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.changeType, 'email'),\n eq(accountChangesInIam.newEmail, body.email),\n ),\n );\n\n await database\n .update(accountsInIam)\n .set({ providerAccountId: body.email })\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n\n return c.json({ user: normalizeUser(updatedUser) }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, ne, sql } from 'drizzle-orm';\nimport {\n accountChangesInIam,\n accountsInIam,\n sessionsInIam,\n usersInIam,\n} from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { createPhoneField } from '../../../lib/phone-validation';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updatePhoneRoute } from '../profile.route';\n\nexport const updatePhoneHandler: RouteHandler<\n typeof updatePhoneRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n const session = c.get('session');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const phoneValidator = createPhoneField(config);\n if (!phoneValidator.validate(body.phone)) {\n return c.json({ error: 'Invalid phone number format' }, 400);\n }\n\n if (user.phone && session?.id) {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, resolvedTenantId),\n eq(sessionsInIam.userId, userId),\n ne(sessionsInIam.id, session.id),\n ),\n );\n }\n\n const [updatedUser] = await database\n .update(usersInIam)\n .set({\n phone: body.phone,\n phoneVerified: true,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(\n and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, resolvedTenantId)),\n )\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (!updatedUser) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n await database\n .update(accountChangesInIam)\n .set({ status: 'applied' })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.changeType, 'phone'),\n eq(accountChangesInIam.newPhone, body.phone),\n ),\n );\n\n await database\n .update(accountsInIam)\n .set({ providerAccountId: body.phone })\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n\n return c.json({ user: normalizeUser(updatedUser) }, 200);\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport { assignRolePermissionHandler } from './handler/assign-role-permission';\nimport { listRolePermissionsHandler } from './handler/list-role-permissions';\nimport { revokeRolePermissionHandler } from './handler/revoke-role-permission';\nimport {\n assignRolePermissionSchema,\n errorResponseSchema,\n listRolePermissionsQuerySchema,\n listRolePermissionsResponseSchema,\n revokeRolePermissionResponseSchema,\n rolePermissionIdParamSchema,\n rolePermissionResponseSchema,\n} from './role-permissions.schema';\n\nexport const listRolePermissionsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Role Permissions'],\n summary: 'List role permissions',\n request: {\n query: listRolePermissionsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listRolePermissionsResponseSchema,\n },\n },\n description: 'List of role permissions',\n },\n },\n});\n\nexport const assignRolePermissionRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Role Permissions'],\n summary: 'Assign permission to role',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: assignRolePermissionSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: rolePermissionResponseSchema,\n },\n },\n description: 'Permission assigned to role',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Permission already assigned to role',\n },\n },\n});\n\nexport const revokeRolePermissionRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Role Permissions'],\n summary: 'Revoke permission from role',\n request: {\n params: rolePermissionIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: revokeRolePermissionResponseSchema,\n },\n },\n description: 'Permission revoked from role',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role permission not found',\n },\n },\n});\n\nconst IAM_ALL = 'iam:all:all';\n\nconst rolePermissionRoutesBase = new OpenAPIHono<AuthEnv>().use(\n '*',\n (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n },\n) as OpenAPIHono<AuthEnv>;\n\nconst rolePermissionRoutes = rolePermissionRoutesBase\n .openapi(listRolePermissionsRoute, listRolePermissionsHandler)\n .openapi(assignRolePermissionRoute, assignRolePermissionHandler)\n .openapi(revokeRolePermissionRoute, revokeRolePermissionHandler);\n\nexport default rolePermissionRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { rolePermissionsInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { assignRolePermissionRoute } from '../role-permissions.route';\n\nexport const assignRolePermissionHandler: RouteHandler<\n typeof assignRolePermissionRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n try {\n const [rolePermission] = await database\n .insert(rolePermissionsInIam)\n .values({\n tenantId: resolvedTenantId,\n roleId: body.roleId,\n permissionId: body.permissionId,\n })\n .returning();\n\n return c.json({ rolePermission }, 201);\n } catch (error: unknown) {\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n error.code === '23505'\n ) {\n return c.json({ error: 'Permission already assigned to role' }, 409);\n }\n throw error;\n }\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { rolePermissionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listRolePermissionsRoute } from '../role-permissions.route';\n\nexport const listRolePermissionsHandler: RouteHandler<\n typeof listRolePermissionsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const conditions = [eq(rolePermissionsInIam.tenantId, tenantId)];\n if (query.roleId) {\n conditions.push(eq(rolePermissionsInIam.roleId, query.roleId));\n }\n if (query.permissionId) {\n conditions.push(eq(rolePermissionsInIam.permissionId, query.permissionId));\n }\n\n const rolePermissions = await database\n .select()\n .from(rolePermissionsInIam)\n .where(and(...conditions));\n\n return c.json({ rolePermissions }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { rolePermissionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { revokeRolePermissionRoute } from '../role-permissions.route';\n\nexport const revokeRolePermissionHandler: RouteHandler<\n typeof revokeRolePermissionRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.id, id),\n eq(rolePermissionsInIam.tenantId, tenantId),\n ),\n )\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Role permission not found' }, 404);\n }\n\n await database\n .delete(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.id, id),\n eq(rolePermissionsInIam.tenantId, tenantId),\n ),\n );\n\n return c.json({ message: 'Permission revoked from role' }, 200);\n};\n","import { z } from 'zod';\n\n// Query schemas\nexport const listRolePermissionsQuerySchema = z.object({\n roleId: z.uuid().optional(),\n permissionId: z.string().optional(),\n});\n\n// Path parameter schemas\nexport const rolePermissionIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Request body schemas\nexport const assignRolePermissionSchema = z.object({\n roleId: z.uuid(),\n permissionId: z.string(),\n});\n\n// Response schemas\nexport const rolePermissionSchema = z.object({\n id: z.uuid(),\n tenantId: z.string(),\n roleId: z.uuid(),\n permissionId: z.string(),\n});\n\nexport const listRolePermissionsResponseSchema = z.object({\n rolePermissions: z.array(rolePermissionSchema),\n});\n\nexport const rolePermissionResponseSchema = z.object({\n rolePermission: rolePermissionSchema,\n});\n\nexport const revokeRolePermissionResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport { assignRolePermissionsHandler } from './handler/assign-role-permissions';\nimport { assignRoleUsersHandler } from './handler/assign-role-users';\nimport { createRoleHandler } from './handler/create-role';\nimport { deleteRoleHandler } from './handler/delete-role';\nimport { getRoleHandler } from './handler/get-role';\nimport { listRolePermissionsHandler } from './handler/list-role-permissions';\nimport { listRoleUsersHandler } from './handler/list-role-users';\nimport { listRolesHandler } from './handler/list-roles';\nimport { revokeRolePermissionHandler } from './handler/revoke-role-permission';\nimport { revokeRoleUserHandler } from './handler/revoke-role-user';\nimport { seedRolesHandler } from './handler/seed-roles';\nimport { updateRoleHandler } from './handler/update-role';\nimport {\n assignRolePermissionsResponseSchema,\n assignRolePermissionsSchema,\n assignRoleUsersResponseSchema,\n assignRoleUsersSchema,\n createRoleSchema,\n deleteRoleResponseSchema,\n errorResponseSchema,\n listRolePermissionsQuerySchema,\n listRolePermissionsResponseSchema,\n listRolesQuerySchema,\n listRolesResponseSchema,\n listRoleUsersQuerySchema,\n listRoleUsersResponseSchema,\n roleIdParamSchema,\n rolePermissionParamSchema,\n roleResponseSchema,\n roleUserParamSchema,\n seedRolesResponseSchema,\n updateRoleSchema,\n} from './roles.schema';\n\nexport const listRolesRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Roles'],\n summary: 'List roles',\n request: {\n query: listRolesQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listRolesResponseSchema,\n },\n },\n description: 'List of roles',\n },\n },\n});\n\nexport const getRoleRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Roles'],\n summary: 'Get role by ID',\n request: {\n params: roleIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: roleResponseSchema,\n },\n },\n description: 'Role details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nexport const createRoleRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Roles'],\n summary: 'Create role',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: createRoleSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: roleResponseSchema,\n },\n },\n description: 'Role created',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid permission assignment',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role code already exists',\n },\n },\n});\n\nexport const updateRoleRoute = createRoute({\n method: 'put',\n path: '/{id}',\n tags: ['Roles'],\n summary: 'Update role',\n request: {\n params: roleIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: updateRoleSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: roleResponseSchema,\n },\n },\n description: 'Role updated',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid permission assignment',\n },\n 403: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role is not editable',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nexport const deleteRoleRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Roles'],\n summary: 'Delete role',\n request: {\n params: roleIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: deleteRoleResponseSchema,\n },\n },\n description: 'Role deleted',\n },\n 403: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role is not deletable',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nexport const listRolePermissionsRoute = createRoute({\n method: 'get',\n path: '/{id}/permissions',\n tags: ['Roles'],\n summary: 'List permissions assigned to a role',\n request: {\n params: roleIdParamSchema,\n query: listRolePermissionsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listRolePermissionsResponseSchema,\n },\n },\n description: 'Role permissions',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nexport const assignRolePermissionsRoute = createRoute({\n method: 'post',\n path: '/{id}/permissions',\n tags: ['Roles'],\n summary: 'Assign permissions to a role',\n request: {\n params: roleIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: assignRolePermissionsSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: assignRolePermissionsResponseSchema,\n },\n },\n description: 'Permissions assigned',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid permissions',\n },\n 403: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role is not editable',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nexport const listRoleUsersRoute = createRoute({\n method: 'get',\n path: '/{id}/users',\n tags: ['Roles'],\n summary: 'List users assigned to a role',\n request: {\n params: roleIdParamSchema,\n query: listRoleUsersQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listRoleUsersResponseSchema,\n },\n },\n description: 'Role users',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nexport const assignRoleUsersRoute = createRoute({\n method: 'post',\n path: '/{id}/users',\n tags: ['Roles'],\n summary: 'Assign users to a role',\n request: {\n params: roleIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: assignRoleUsersSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: assignRoleUsersResponseSchema,\n },\n },\n description: 'Users assigned',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid users',\n },\n 403: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role is not editable',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nexport const revokeRolePermissionRoute = createRoute({\n method: 'delete',\n path: '/{id}/permissions/{permissionId}',\n tags: ['Roles'],\n summary: 'Revoke a permission from a role',\n request: {\n params: rolePermissionParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: deleteRoleResponseSchema,\n },\n },\n description: 'Permission revoked',\n },\n 403: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role is not editable',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role or permission not found',\n },\n },\n});\n\nexport const revokeRoleUserRoute = createRoute({\n method: 'delete',\n path: '/{id}/users/{userId}',\n tags: ['Roles'],\n summary: 'Remove a user from a role',\n request: {\n params: roleUserParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: deleteRoleResponseSchema,\n },\n },\n description: 'User removed',\n },\n 403: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role is not editable',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role or user not found',\n },\n },\n});\n\nexport const seedRolesRoute = createRoute({\n method: 'post',\n path: '/seed',\n tags: ['Roles'],\n summary: 'Seed tenant roles from config',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: seedRolesResponseSchema,\n },\n },\n description: 'Seeded roles',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid role config',\n },\n },\n});\n\nconst IAM_ALL = 'iam:all:all';\n\nconst roleRoutesBase = new OpenAPIHono<AuthEnv>().use('*', (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n}) as OpenAPIHono<AuthEnv>;\n\nconst roleRoutes = roleRoutesBase\n .openapi(listRolesRoute, listRolesHandler)\n .openapi(seedRolesRoute, seedRolesHandler)\n .openapi(getRoleRoute, getRoleHandler)\n .openapi(createRoleRoute, createRoleHandler)\n .openapi(updateRoleRoute, updateRoleHandler)\n .openapi(listRolePermissionsRoute, listRolePermissionsHandler)\n .openapi(assignRolePermissionsRoute, assignRolePermissionsHandler)\n .openapi(revokeRolePermissionRoute, revokeRolePermissionHandler)\n .openapi(listRoleUsersRoute, listRoleUsersHandler)\n .openapi(assignRoleUsersRoute, assignRoleUsersHandler)\n .openapi(revokeRoleUserRoute, revokeRoleUserHandler)\n .openapi(deleteRoleRoute, deleteRoleHandler);\n\nexport default roleRoutes;\n","import { randomUUID } from 'node:crypto';\nimport type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, inArray } from 'drizzle-orm';\nimport {\n permissionsInIam,\n rolePermissionsInIam,\n rolesInIam,\n} from '../../../db/schema';\nimport { seedPermissions } from '../../../lib/iam-seed';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { assignRolePermissionsRoute } from '../roles.route';\n\nexport const assignRolePermissionsHandler: RouteHandler<\n typeof assignRolePermissionsRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n const config = c.get('config');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const permissionIds = [...new Set(body.permissionIds)];\n\n const [role] = await database\n .select({\n id: rolesInIam.id,\n isEditable: rolesInIam.isEditable,\n })\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!role) {\n return c.json({ error: 'Role not found' }, 404);\n }\n if (!role.isEditable) {\n return c.json({ error: 'Role is not editable' }, 403);\n }\n\n await seedPermissions({\n database,\n permissions: config.permissions,\n });\n\n const existingPermissions = permissionIds.length\n ? await database\n .select({ id: permissionsInIam.id })\n .from(permissionsInIam)\n .where(inArray(permissionsInIam.id, permissionIds))\n : [];\n\n const existingPermissionIds = new Set(\n existingPermissions.map((permission) => permission.id),\n );\n const missingPermissionIds = permissionIds.filter(\n (permissionId) => !existingPermissionIds.has(permissionId),\n );\n\n if (missingPermissionIds.length) {\n return c.json(\n { error: `Unknown permissions: ${missingPermissionIds.join(', ')}` },\n 400,\n );\n }\n\n const created = permissionIds.length\n ? await database\n .insert(rolePermissionsInIam)\n .values(\n permissionIds.map((permissionId) => ({\n id: randomUUID(),\n tenantId: resolvedTenantId,\n roleId: id,\n permissionId,\n })),\n )\n .onConflictDoNothing({\n target: [\n rolePermissionsInIam.tenantId,\n rolePermissionsInIam.permissionId,\n rolePermissionsInIam.roleId,\n ],\n })\n .returning({ permissionId: rolePermissionsInIam.permissionId })\n : [];\n\n return c.json(\n {\n created: created.length,\n skipped: permissionIds.length - created.length,\n },\n 200,\n );\n};\n","import { randomUUID } from 'node:crypto';\nimport type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, inArray } from 'drizzle-orm';\nimport { rolesInIam, userRolesInIam, usersInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { assignRoleUsersRoute } from '../roles.route';\n\nexport const assignRoleUsersHandler: RouteHandler<\n typeof assignRoleUsersRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n const config = c.get('config');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const userIds = [...new Set(body.userIds)];\n\n const [role] = await database\n .select({\n id: rolesInIam.id,\n isEditable: rolesInIam.isEditable,\n })\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!role) {\n return c.json({ error: 'Role not found' }, 404);\n }\n if (!role.isEditable) {\n return c.json({ error: 'Role is not editable' }, 403);\n }\n\n const existingUsers = userIds.length\n ? await database\n .select({ id: usersInIam.id })\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, tenantId),\n inArray(usersInIam.id, userIds),\n ),\n )\n : [];\n\n const existingUserIds = new Set(existingUsers.map((user) => user.id));\n const missingUserIds = userIds.filter(\n (userId) => !existingUserIds.has(userId),\n );\n\n if (missingUserIds.length) {\n return c.json(\n { error: `Unknown users: ${missingUserIds.join(', ')}` },\n 400,\n );\n }\n\n const created = userIds.length\n ? await database\n .insert(userRolesInIam)\n .values(\n userIds.map((userId) => ({\n id: randomUUID(),\n tenantId: resolvedTenantId,\n roleId: id,\n userId,\n })),\n )\n .onConflictDoNothing({\n target: [\n userRolesInIam.tenantId,\n userRolesInIam.userId,\n userRolesInIam.roleId,\n ],\n })\n .returning({ userId: userRolesInIam.userId })\n : [];\n\n return c.json(\n {\n created: created.length,\n skipped: userIds.length - created.length,\n },\n 200,\n );\n};\n","import { randomUUID } from 'node:crypto';\nimport type { RouteHandler } from '@hono/zod-openapi';\nimport { rolesInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { seedPermissions, syncRolePermissions } from '../../../lib/iam-seed';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { createRoleRoute } from '../roles.route';\n\nexport const createRoleHandler: RouteHandler<\n typeof createRoleRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const permissionIds = [...new Set(body.permissionIds ?? [])];\n\n const role = await withTransaction(database, async (tx) => {\n await seedPermissions({\n database: tx,\n permissions: config.permissions,\n });\n\n const [createdRole] = await tx\n .insert(rolesInIam)\n .values({\n id: randomUUID(),\n tenantId: resolvedTenantId,\n name: body.name ?? { en: body.code },\n description: body.description ?? { en: body.code },\n code: body.code,\n isSystem: body.isSystem ?? false,\n isEditable: body.isEditable ?? true,\n isDeletable: body.isDeletable ?? true,\n })\n .returning();\n\n if (body.permissionIds !== undefined) {\n await syncRolePermissions({\n database: tx,\n tenantId: resolvedTenantId,\n roleId: createdRole.id,\n permissionIds,\n });\n }\n\n return createdRole;\n });\n\n return c.json(\n {\n role: {\n ...role,\n permissionIds,\n permissionCount: permissionIds.length,\n },\n },\n 201,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { rolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { deleteRoleRoute } from '../roles.route';\n\nexport const deleteRoleHandler: RouteHandler<\n typeof deleteRoleRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n if (!existing.isDeletable) {\n return c.json({ error: 'Role is not deletable' }, 403);\n }\n\n await database\n .delete(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)));\n\n return c.json({ message: 'Role deleted' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport {\n rolePermissionsInIam,\n rolesInIam,\n userRolesInIam,\n} from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getRoleRoute } from '../roles.route';\n\nexport const getRoleHandler: RouteHandler<\n typeof getRoleRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [role] = await database\n .select({\n id: rolesInIam.id,\n tenantId: rolesInIam.tenantId,\n createdAt: rolesInIam.createdAt,\n updatedAt: rolesInIam.updatedAt,\n name: rolesInIam.name,\n description: rolesInIam.description,\n code: rolesInIam.code,\n isSystem: rolesInIam.isSystem,\n isEditable: rolesInIam.isEditable,\n isDeletable: rolesInIam.isDeletable,\n permissionIds: sql<string[] | null>`COALESCE(\n (\n select array_to_json(array_agg(${rolePermissionsInIam.permissionId}))\n from ${rolePermissionsInIam}\n where ${and(\n eq(rolePermissionsInIam.tenantId, tenantId),\n eq(rolePermissionsInIam.roleId, rolesInIam.id),\n )}\n ),\n '[]'::json\n )`,\n permissionCount: sql<number>`(\n select count(*)::int\n from ${rolePermissionsInIam}\n where ${and(\n eq(rolePermissionsInIam.tenantId, tenantId),\n eq(rolePermissionsInIam.roleId, rolesInIam.id),\n )}\n )`,\n userCount: sql<number>`(\n select count(*)::int\n from ${userRolesInIam}\n where ${and(\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.roleId, rolesInIam.id),\n )}\n )`,\n })\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!role) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n return c.json(\n {\n role: {\n ...role,\n permissionIds: role.permissionIds ?? undefined,\n },\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { rolePermissionsInIam, rolesInIam } from '../../../db/schema';\nimport {\n filterAndSortPermissions,\n getMergedPermissionCatalog,\n} from '../../../lib/permission-catalog';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listRolePermissionsRoute } from '../roles.route';\n\nexport const listRolePermissionsHandler: RouteHandler<\n typeof listRolePermissionsRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const query = c.req.valid('query');\n const database = c.get('database');\n const config = c.get('config');\n const tenantId = c.get('tenantId');\n\n const [role] = await database\n .select({ id: rolesInIam.id })\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!role) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const [assignedPermissions, permissionCatalog] = await Promise.all([\n database\n .select({ permissionId: rolePermissionsInIam.permissionId })\n .from(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.tenantId, tenantId),\n eq(rolePermissionsInIam.roleId, id),\n ),\n )\n .then((rows) => new Set(rows.map((row) => row.permissionId))),\n getMergedPermissionCatalog({\n database,\n permissions: config.permissions,\n }),\n ]);\n\n const sortedPermissions = filterAndSortPermissions(\n permissionCatalog.filter((permission) =>\n assignedPermissions.has(permission.id),\n ),\n query,\n );\n\n const total = sortedPermissions.length;\n const permissions = sortedPermissions.slice(offset, offset + limit);\n\n return c.json({ permissions, total, page, limit }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, asc, desc, eq, ilike, or, sql } from 'drizzle-orm';\nimport { rolesInIam, userRolesInIam, usersInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listRoleUsersRoute } from '../roles.route';\n\nconst sortColumnMap = {\n createdAt: usersInIam.createdAt,\n updatedAt: usersInIam.updatedAt,\n fullName: usersInIam.fullName,\n handle: usersInIam.handle,\n lastSignInAt: usersInIam.lastSignInAt,\n} as const;\n\nfunction getRoleUserSearchCondition(\n search: string,\n filter?: '' | 'fullName' | 'email' | 'phone' | 'handle',\n) {\n const term = `%${search}%`;\n\n if (filter === 'fullName') {\n return ilike(usersInIam.fullName, term);\n }\n if (filter === 'email') {\n return ilike(usersInIam.email, term);\n }\n if (filter === 'phone') {\n return ilike(usersInIam.phone, term);\n }\n if (filter === 'handle') {\n return ilike(usersInIam.handle, term);\n }\n\n return or(\n ilike(usersInIam.fullName, term),\n ilike(usersInIam.email, term),\n ilike(usersInIam.phone, term),\n ilike(usersInIam.handle, term),\n );\n}\n\nasync function ensureRoleExists({\n database,\n id,\n tenantId,\n}: {\n database: AuthEnv['Variables']['database'];\n id: string;\n tenantId: string;\n}) {\n const [role] = await database\n .select({ id: rolesInIam.id })\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n return role;\n}\n\nexport const listRoleUsersHandler: RouteHandler<\n typeof listRoleUsersRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const role = await ensureRoleExists({ database, id, tenantId });\n if (!role) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.roleId, id),\n eq(usersInIam.tenantId, tenantId),\n ];\n\n if (query.search) {\n const searchCondition = getRoleUserSearchCondition(\n query.search,\n query.filter,\n );\n if (searchCondition) {\n conditions.push(searchCondition);\n }\n }\n\n const orderDir = query.order === 'asc' ? asc : desc;\n const sortCol =\n query.sort && sortColumnMap[query.sort]\n ? sortColumnMap[query.sort]\n : usersInIam.createdAt;\n\n const [users, totalResult] = await Promise.all([\n database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .from(userRolesInIam)\n .innerJoin(usersInIam, eq(usersInIam.id, userRolesInIam.userId))\n .where(and(...conditions))\n .orderBy(orderDir(sortCol))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(userRolesInIam)\n .innerJoin(usersInIam, eq(usersInIam.id, userRolesInIam.userId))\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json(\n {\n users: users.map((user) => ({\n ...user,\n roles: null,\n })),\n total,\n page,\n limit,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, asc, desc, eq, ilike, or, sql } from 'drizzle-orm';\nimport {\n rolePermissionsInIam,\n rolesInIam,\n userRolesInIam,\n} from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listRolesRoute } from '../roles.route';\n\nconst sortColumnMap = {\n createdAt: rolesInIam.createdAt,\n updatedAt: rolesInIam.updatedAt,\n code: rolesInIam.code,\n} as const;\n\nexport const listRolesHandler: RouteHandler<\n typeof listRolesRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [eq(rolesInIam.tenantId, tenantId)];\n if (query.search) {\n const term = `%${query.search}%`;\n const searchCondition =\n query.filter === 'code'\n ? ilike(rolesInIam.code, term)\n : or(\n ilike(rolesInIam.code, term),\n sql`cast(${rolesInIam.name} as text) ilike ${term}`,\n sql`cast(${rolesInIam.description} as text) ilike ${term}`,\n );\n\n if (searchCondition) {\n conditions.push(searchCondition);\n }\n }\n\n const orderDir = query.order === 'asc' ? asc : desc;\n const sortCol =\n query.sort && sortColumnMap[query.sort]\n ? sortColumnMap[query.sort]\n : rolesInIam.createdAt;\n\n const [roles, totalResult] = await Promise.all([\n database\n .select({\n id: rolesInIam.id,\n tenantId: rolesInIam.tenantId,\n createdAt: rolesInIam.createdAt,\n updatedAt: rolesInIam.updatedAt,\n name: rolesInIam.name,\n description: rolesInIam.description,\n code: rolesInIam.code,\n isSystem: rolesInIam.isSystem,\n isEditable: rolesInIam.isEditable,\n isDeletable: rolesInIam.isDeletable,\n permissionCount: sql<number>`(\n select count(*)::int\n from ${rolePermissionsInIam}\n where ${and(\n eq(rolePermissionsInIam.tenantId, tenantId),\n eq(rolePermissionsInIam.roleId, rolesInIam.id),\n )}\n )`,\n userCount: sql<number>`(\n select count(*)::int\n from ${userRolesInIam}\n where ${and(\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.roleId, rolesInIam.id),\n )}\n )`,\n })\n .from(rolesInIam)\n .where(and(...conditions))\n .orderBy(orderDir(sortCol))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(rolesInIam)\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ roles, total, page, limit });\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { rolePermissionsInIam, rolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { revokeRolePermissionRoute } from '../roles.route';\n\nexport const revokeRolePermissionHandler: RouteHandler<\n typeof revokeRolePermissionRoute,\n AuthEnv\n> = async (c) => {\n const { id, permissionId } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [role] = await database\n .select({\n id: rolesInIam.id,\n isEditable: rolesInIam.isEditable,\n })\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!role) {\n return c.json({ error: 'Role not found' }, 404);\n }\n if (!role.isEditable) {\n return c.json({ error: 'Role is not editable' }, 403);\n }\n\n const [deleted] = await database\n .delete(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.tenantId, tenantId),\n eq(rolePermissionsInIam.roleId, id),\n eq(rolePermissionsInIam.permissionId, permissionId),\n ),\n )\n .returning({ id: rolePermissionsInIam.id });\n\n if (!deleted) {\n return c.json({ error: 'Role permission not found' }, 404);\n }\n\n return c.json({ message: 'Permission revoked from role' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { rolesInIam, userRolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { revokeRoleUserRoute } from '../roles.route';\n\nexport const revokeRoleUserHandler: RouteHandler<\n typeof revokeRoleUserRoute,\n AuthEnv\n> = async (c) => {\n const { id, userId } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [role] = await database\n .select({\n id: rolesInIam.id,\n isEditable: rolesInIam.isEditable,\n })\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!role) {\n return c.json({ error: 'Role not found' }, 404);\n }\n if (!role.isEditable) {\n return c.json({ error: 'Role is not editable' }, 403);\n }\n\n const [deleted] = await database\n .delete(userRolesInIam)\n .where(\n and(\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.roleId, id),\n eq(userRolesInIam.userId, userId),\n ),\n )\n .returning({ id: userRolesInIam.id });\n\n if (!deleted) {\n return c.json({ error: 'Role user not found' }, 404);\n }\n\n return c.json({ message: 'User removed from role' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, inArray, sql } from 'drizzle-orm';\nimport { rolePermissionsInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { seedPermissions, seedRoles } from '../../../lib/iam-seed';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { seedRolesRoute } from '../roles.route';\n\nexport const seedRolesHandler: RouteHandler<\n typeof seedRolesRoute,\n AuthEnv\n> = async (c) => {\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n if (!config.roles?.length) {\n return c.json({ error: 'No roles configured for seeding' }, 400);\n }\n\n const rolesToSeed = config.roles;\n\n const seededRoles = await withTransaction(database, async (tx) => {\n await seedPermissions({\n database: tx,\n permissions: config.permissions,\n });\n\n return seedRoles({\n database: tx,\n tenantId: resolvedTenantId,\n roles: rolesToSeed,\n });\n });\n\n const permissionCountRows = seededRoles.length\n ? await database\n .select({\n roleId: rolePermissionsInIam.roleId,\n count: sql<number>`count(*)::int`,\n })\n .from(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.tenantId, resolvedTenantId),\n inArray(\n rolePermissionsInIam.roleId,\n seededRoles.map((role) => role.id),\n ),\n ),\n )\n .groupBy(rolePermissionsInIam.roleId)\n : [];\n\n const permissionCountByRoleId = new Map(\n permissionCountRows.map((row) => [row.roleId, row.count] as const),\n );\n\n const roles = seededRoles.map((role) => ({\n ...role,\n permissionCount: permissionCountByRoleId.get(role.id) ?? 0,\n }));\n\n return c.json(\n {\n roles,\n total: roles.length,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { rolesInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { seedPermissions, syncRolePermissions } from '../../../lib/iam-seed';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateRoleRoute } from '../roles.route';\n\nexport const updateRoleHandler: RouteHandler<\n typeof updateRoleRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n const config = c.get('config');\n const tenantId = c.get('tenantId');\n const permissionIds =\n body.permissionIds === undefined\n ? undefined\n : [...new Set(body.permissionIds)];\n\n const [existing] = await database\n .select()\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n if (!existing.isEditable) {\n return c.json({ error: 'Role is not editable' }, 403);\n }\n\n const updateData: Partial<typeof rolesInIam.$inferInsert> = {};\n\n if (body.name !== undefined) {\n updateData.name = body.name;\n }\n if (body.description !== undefined) {\n updateData.description = body.description;\n }\n if (body.code !== undefined) {\n updateData.code = body.code;\n }\n if (body.isSystem !== undefined) {\n updateData.isSystem = body.isSystem;\n }\n if (body.isEditable !== undefined) {\n updateData.isEditable = body.isEditable;\n }\n if (body.isDeletable !== undefined) {\n updateData.isDeletable = body.isDeletable;\n }\n\n const updated = await withTransaction(database, async (tx) => {\n await seedPermissions({\n database: tx,\n permissions: config.permissions,\n });\n\n const [role] = await tx\n .update(rolesInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .returning();\n\n if (!role) {\n return null;\n }\n\n if (permissionIds !== undefined) {\n await syncRolePermissions({\n database: tx,\n tenantId,\n roleId: role.id,\n permissionIds,\n });\n }\n\n return role;\n });\n\n if (!updated) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n return c.json(\n {\n role: {\n ...updated,\n permissionIds,\n permissionCount: permissionIds?.length,\n },\n },\n 200,\n );\n};\n","import { z } from 'zod';\nimport { userSchema } from '../auth.schema';\nimport {\n listPermissionsQuerySchema,\n permissionSchema,\n} from '../permissions/permissions.schema';\n\nconst roleFilterValues = ['', 'code'] as const;\nconst roleSortValues = ['createdAt', 'updatedAt', 'code'] as const;\n\n// Query schemas\nexport const listRolesQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n search: z.string().optional(),\n filter: z.enum(roleFilterValues).optional(),\n sort: z.enum(roleSortValues).optional(),\n order: z.enum(['asc', 'desc']).optional(),\n});\n\n// Path parameter schemas\nexport const roleIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Request body schemas\nexport const createRoleSchema = z.object({\n name: z.unknown().optional(),\n description: z.unknown().optional(),\n code: z.string(),\n permissionIds: z.array(z.string()).optional(),\n isSystem: z.boolean().optional(),\n isEditable: z.boolean().optional(),\n isDeletable: z.boolean().optional(),\n});\n\nexport const updateRoleSchema = z.object({\n name: z.unknown().optional(),\n description: z.unknown().optional(),\n code: z.string().optional(),\n permissionIds: z.array(z.string()).optional(),\n isSystem: z.boolean().optional(),\n isEditable: z.boolean().optional(),\n isDeletable: z.boolean().optional(),\n});\n\nexport const assignRolePermissionsSchema = z.object({\n permissionIds: z.array(z.string()).min(1),\n});\n\nexport const assignRoleUsersSchema = z.object({\n userIds: z.array(z.uuid()).min(1),\n});\n\nexport const rolePermissionParamSchema = z.object({\n id: z.uuid(),\n permissionId: z.string(),\n});\n\nexport const roleUserParamSchema = z.object({\n id: z.uuid(),\n userId: z.uuid(),\n});\n\n// Response schemas\nexport const roleSchema = z.object({\n id: z.uuid(),\n tenantId: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n name: z.unknown(),\n description: z.unknown(),\n code: z.string(),\n isSystem: z.boolean(),\n isEditable: z.boolean(),\n isDeletable: z.boolean(),\n permissionIds: z.array(z.string()).optional(),\n permissionCount: z.number().optional(),\n userCount: z.number().optional(),\n});\n\nexport const listRolesResponseSchema = z.object({\n roles: z.array(roleSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const roleResponseSchema = z.object({\n role: roleSchema,\n});\n\nexport const listRolePermissionsResponseSchema = z.object({\n permissions: z.array(permissionSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const assignRolePermissionsResponseSchema = z.object({\n created: z.number(),\n skipped: z.number(),\n});\n\nexport const listRoleUsersQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n search: z.string().optional(),\n filter: z.enum(['', 'fullName', 'email', 'phone', 'handle']).optional(),\n sort: z\n .enum(['createdAt', 'updatedAt', 'fullName', 'handle', 'lastSignInAt'])\n .optional(),\n order: z.enum(['asc', 'desc']).optional(),\n});\n\nexport const listRoleUsersResponseSchema = z.object({\n users: z.array(userSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const assignRoleUsersResponseSchema = z.object({\n created: z.number(),\n skipped: z.number(),\n});\n\nexport const deleteRoleResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const seedRolesResponseSchema = z.object({\n roles: z.array(roleSchema),\n total: z.number(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n\nexport const listRolePermissionsQuerySchema = listPermissionsQuerySchema;\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport { getSessionHandler } from './handler/get-session';\nimport { listSessionsHandler } from './handler/list-sessions';\nimport { revokeAllSessionsHandler } from './handler/revoke-all-sessions';\nimport { revokeSessionHandler } from './handler/revoke-session';\nimport {\n errorResponseSchema,\n listSessionsQuerySchema,\n listSessionsResponseSchema,\n revokeSessionResponseSchema,\n sessionIdParamSchema,\n sessionResponseSchema,\n userIdParamSchema,\n} from './sessions.schema';\n\nexport const listSessionsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Sessions'],\n summary: 'List sessions',\n request: {\n query: listSessionsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listSessionsResponseSchema,\n },\n },\n description: 'List of sessions',\n },\n },\n});\n\nexport const getSessionRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Sessions'],\n summary: 'Get session by ID',\n request: {\n params: sessionIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: sessionResponseSchema,\n },\n },\n description: 'Session details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Session not found',\n },\n },\n});\n\nexport const revokeSessionRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Sessions'],\n summary: 'Revoke session',\n request: {\n params: sessionIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: revokeSessionResponseSchema,\n },\n },\n description: 'Session revoked',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Session not found',\n },\n },\n});\n\nexport const revokeAllSessionsRoute = createRoute({\n method: 'delete',\n path: '/user/{userId}',\n tags: ['Sessions'],\n summary: 'Revoke all user sessions',\n request: {\n params: userIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: revokeSessionResponseSchema,\n },\n },\n description: 'All user sessions revoked',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nconst IAM_ALL = 'iam:all:all';\n\nconst sessionRoutesBase = new OpenAPIHono<AuthEnv>().use('*', (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n}) as OpenAPIHono<AuthEnv>;\n\nconst sessionRoutes = sessionRoutesBase\n .openapi(listSessionsRoute, listSessionsHandler)\n .openapi(getSessionRoute, getSessionHandler)\n .openapi(revokeSessionRoute, revokeSessionHandler)\n .openapi(revokeAllSessionsRoute, revokeAllSessionsHandler);\n\nexport default sessionRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { sessionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getSessionRoute } from '../sessions.route';\n\nexport const getSessionHandler: RouteHandler<\n typeof getSessionRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [session] = await database\n .select()\n .from(sessionsInIam)\n .where(and(eq(sessionsInIam.id, id), eq(sessionsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n return c.json({ session }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { sessionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listSessionsRoute } from '../sessions.route';\n\nexport const listSessionsHandler: RouteHandler<\n typeof listSessionsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [eq(sessionsInIam.tenantId, tenantId)];\n if (query.userId) {\n conditions.push(eq(sessionsInIam.userId, query.userId));\n }\n\n const [sessions, totalResult] = await Promise.all([\n database\n .select()\n .from(sessionsInIam)\n .where(and(...conditions))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(sessionsInIam)\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ sessions, total, page, limit }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { sessionsInIam, usersInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { revokeAllSessionsRoute } from '../sessions.route';\n\nexport const revokeAllSessionsHandler: RouteHandler<\n typeof revokeAllSessionsRoute,\n AuthEnv\n> = async (c) => {\n const { userId } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [user] = await database\n .select()\n .from(usersInIam)\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!user) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n ),\n );\n\n return c.json({ message: 'All user sessions revoked' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { sessionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { revokeSessionRoute } from '../sessions.route';\n\nexport const revokeSessionHandler: RouteHandler<\n typeof revokeSessionRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(sessionsInIam)\n .where(and(eq(sessionsInIam.id, id), eq(sessionsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n await database\n .delete(sessionsInIam)\n .where(and(eq(sessionsInIam.id, id), eq(sessionsInIam.tenantId, tenantId)));\n\n return c.json({ message: 'Session revoked' }, 200);\n};\n","import { z } from 'zod';\nimport { sessionSchema } from '../auth.schema';\n\n// Query schemas\nexport const listSessionsQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n userId: z.uuid().optional(),\n});\n\n// Path parameter schemas\nexport const sessionIdParamSchema = z.object({\n id: z.uuid(),\n});\n\nexport const userIdParamSchema = z.object({\n userId: z.uuid(),\n});\n\n// Response schemas\nexport const listSessionsResponseSchema = z.object({\n sessions: z.array(sessionSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const sessionResponseSchema = z.object({\n session: sessionSchema,\n});\n\nexport const revokeSessionResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { z } from 'zod';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport { errorResponseSchema } from '../auth.schema';\nimport { tenantHandler } from './handler/tenant';\n\nconst IAM_ALL = 'iam:all:all';\n\nexport const tenantRoute = createRoute({\n method: 'get',\n path: '/init',\n tags: ['System'],\n summary: 'Get tenant info',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: z.object({\n host: z.string().nullable(),\n tenantId: z.string().nullable(),\n tenant: z\n .object({\n id: z.string(),\n name: z.unknown(),\n description: z.unknown(),\n isActive: z.boolean(),\n })\n .nullable(),\n status: z.literal('ok'),\n }),\n },\n },\n description: 'Tenant info',\n },\n 500: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Server error',\n },\n },\n});\n\nconst tenantRoutesBase = new OpenAPIHono<AuthEnv>().use('*', (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n}) as OpenAPIHono<AuthEnv>;\n\nconst tenantRoutes = tenantRoutesBase.openapi(tenantRoute, tenantHandler);\n\nexport default tenantRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../../types/context';\nimport type { tenantRoute } from '../system.route';\n\nexport const tenantHandler: RouteHandler<typeof tenantRoute, AuthEnv> = (c) => {\n const tenantId = c.get('tenantId');\n const tenant = c.get('tenant');\n const host = c.get('host');\n\n return c.json(\n {\n host: host || null,\n tenantId: tenantId || null,\n tenant: tenant || null,\n status: 'ok' as const,\n },\n 200,\n );\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport { createTenantHandler } from './handler/create-tenant';\nimport { deleteTenantHandler } from './handler/delete-tenant';\nimport { getTenantHandler } from './handler/get-tenant';\nimport { listTenantsHandler } from './handler/list-tenants';\nimport { updateTenantHandler } from './handler/update-tenant';\nimport {\n createTenantSchema,\n deleteTenantResponseSchema,\n errorResponseSchema,\n listTenantsQuerySchema,\n listTenantsResponseSchema,\n tenantIdParamSchema,\n tenantResponseSchema,\n updateTenantSchema,\n} from './tenants.schema';\n\nexport const listTenantsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Tenants'],\n summary: 'List tenants',\n request: {\n query: listTenantsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listTenantsResponseSchema,\n },\n },\n description: 'List of tenants',\n },\n },\n});\n\nexport const getTenantRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Tenants'],\n summary: 'Get tenant by ID',\n request: {\n params: tenantIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: tenantResponseSchema,\n },\n },\n description: 'Tenant details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Tenant not found',\n },\n },\n});\n\nexport const createTenantRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Tenants'],\n summary: 'Create tenant',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: createTenantSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: tenantResponseSchema,\n },\n },\n description: 'Tenant created',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Tenant already exists',\n },\n },\n});\n\nexport const updateTenantRoute = createRoute({\n method: 'put',\n path: '/{id}',\n tags: ['Tenants'],\n summary: 'Update tenant',\n request: {\n params: tenantIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: updateTenantSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: tenantResponseSchema,\n },\n },\n description: 'Tenant updated',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Tenant not found',\n },\n },\n});\n\nexport const deleteTenantRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Tenants'],\n summary: 'Delete tenant',\n request: {\n params: tenantIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: deleteTenantResponseSchema,\n },\n },\n description: 'Tenant deleted',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Tenant not found',\n },\n },\n});\n\nconst IAM_ALL = 'iam:all:all';\n\nconst tenantRoutesBase = new OpenAPIHono<AuthEnv>().use('*', (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n}) as OpenAPIHono<AuthEnv>;\n\nconst tenantRoutes = tenantRoutesBase\n .openapi(listTenantsRoute, listTenantsHandler)\n .openapi(getTenantRoute, getTenantHandler)\n .openapi(createTenantRoute, createTenantHandler)\n .openapi(updateTenantRoute, updateTenantHandler)\n .openapi(deleteTenantRoute, deleteTenantHandler);\n\nexport default tenantRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { eq } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { createTenantRoute } from '../tenants.route';\n\nexport const createTenantHandler: RouteHandler<\n typeof createTenantRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const database = c.get('database');\n\n const [existing] = await database\n .select()\n .from(tenantsInIam)\n .where(eq(tenantsInIam.id, body.id))\n .limit(1);\n\n if (existing) {\n return c.json({ error: 'Tenant already exists' }, 409);\n }\n\n const [tenant] = await database\n .insert(tenantsInIam)\n .values({\n id: body.id,\n name: body.name,\n description: body.description || null,\n theme: body.theme || null,\n supportedLanguages: body.supportedLanguages || null,\n defaultLanguage: body.defaultLanguage || null,\n supportedCurrency: body.supportedCurrency || null,\n defaultCurrency: body.defaultCurrency || null,\n timezone: body.timezone || null,\n isActive: body.isActive ?? true,\n locale: body.locale || null,\n settings: body.settings || null,\n seo: body.seo || null,\n })\n .returning();\n\n return c.json({ tenant }, 201);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { eq } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { deleteTenantRoute } from '../tenants.route';\n\nexport const deleteTenantHandler: RouteHandler<\n typeof deleteTenantRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n\n const [existing] = await database\n .select()\n .from(tenantsInIam)\n .where(eq(tenantsInIam.id, id))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Tenant not found' }, 404);\n }\n\n await database.delete(tenantsInIam).where(eq(tenantsInIam.id, id));\n\n return c.json({ message: 'Tenant deleted' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { eq } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getTenantRoute } from '../tenants.route';\n\nexport const getTenantHandler: RouteHandler<\n typeof getTenantRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n\n const [tenant] = await database\n .select()\n .from(tenantsInIam)\n .where(eq(tenantsInIam.id, id))\n .limit(1);\n\n if (!tenant) {\n return c.json({ error: 'Tenant not found' }, 404);\n }\n\n return c.json({ tenant }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, asc, desc, eq, ilike, or, sql } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listTenantsRoute } from '../tenants.route';\n\nconst sortColumnMap = {\n createdAt: tenantsInIam.createdAt,\n updatedAt: tenantsInIam.updatedAt,\n name: sql`${tenantsInIam.name}::text`,\n} as const;\n\nexport const listTenantsHandler: RouteHandler<\n typeof listTenantsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [];\n if (query.isActive !== undefined) {\n conditions.push(eq(tenantsInIam.isActive, query.isActive));\n }\n if (query.filter === 'isActive:true') {\n conditions.push(eq(tenantsInIam.isActive, true));\n } else if (query.filter === 'isActive:false') {\n conditions.push(eq(tenantsInIam.isActive, false));\n }\n if (query.search?.trim()) {\n const term = `%${query.search.trim()}%`;\n const searchCond = or(\n ilike(tenantsInIam.id, term),\n ilike(sql`${tenantsInIam.name}::text`, term),\n );\n if (searchCond) {\n conditions.push(searchCond);\n }\n }\n\n const orderDir = query.order === 'asc' ? asc : desc;\n const sortCol =\n query.sort && sortColumnMap[query.sort]\n ? sortColumnMap[query.sort]\n : tenantsInIam.createdAt;\n const whereClause = conditions.length > 0 ? and(...conditions) : undefined;\n\n const [tenants, totalResult] = await Promise.all([\n database\n .select()\n .from(tenantsInIam)\n .where(whereClause)\n .orderBy(orderDir(sortCol))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(tenantsInIam)\n .where(whereClause),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ tenants, total, page, limit }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { eq, sql } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateTenantRoute } from '../tenants.route';\n\nexport const updateTenantHandler: RouteHandler<\n typeof updateTenantRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n\n const [existing] = await database\n .select()\n .from(tenantsInIam)\n .where(eq(tenantsInIam.id, id))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Tenant not found' }, 404);\n }\n\n const updateData: Partial<typeof tenantsInIam.$inferInsert> = {};\n\n if (body.name !== undefined) {\n updateData.name = body.name;\n }\n if (body.description !== undefined) {\n updateData.description = body.description;\n }\n if (body.theme !== undefined) {\n updateData.theme = body.theme;\n }\n if (body.supportedLanguages !== undefined) {\n updateData.supportedLanguages = body.supportedLanguages;\n }\n if (body.defaultLanguage !== undefined) {\n updateData.defaultLanguage = body.defaultLanguage;\n }\n if (body.supportedCurrency !== undefined) {\n updateData.supportedCurrency = body.supportedCurrency;\n }\n if (body.defaultCurrency !== undefined) {\n updateData.defaultCurrency = body.defaultCurrency;\n }\n if (body.timezone !== undefined) {\n updateData.timezone = body.timezone;\n }\n if (body.isActive !== undefined) {\n updateData.isActive = body.isActive;\n }\n if (body.locale !== undefined) {\n updateData.locale = body.locale;\n }\n if (body.settings !== undefined) {\n updateData.settings = body.settings;\n }\n if (body.seo !== undefined) {\n updateData.seo = body.seo;\n }\n\n const [updated] = await database\n .update(tenantsInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(eq(tenantsInIam.id, id))\n .returning();\n\n if (!updated) {\n return c.json({ error: 'Tenant not found' }, 404);\n }\n\n return c.json({ tenant: updated }, 200);\n};\n","import { z } from 'zod';\n\nconst tenantSortFields = ['createdAt', 'updatedAt', 'name'] as const;\nconst tenantFilterValues = ['', 'isActive:true', 'isActive:false'] as const;\n\n// Query schemas\nexport const listTenantsQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n isActive: z.coerce.boolean().optional(),\n search: z.string().optional(),\n filter: z.enum(tenantFilterValues).optional(),\n sort: z.enum(tenantSortFields).optional(),\n order: z.enum(['asc', 'desc']).optional(),\n});\n\n// Path parameter schemas\nexport const tenantIdParamSchema = z.object({\n id: z.string(),\n});\n\n// Request body schemas\nexport const createTenantSchema = z.object({\n id: z.string().max(30),\n name: z.unknown(),\n description: z.unknown().optional(),\n theme: z.unknown().optional(),\n supportedLanguages: z.unknown().optional(),\n defaultLanguage: z.string().optional(),\n supportedCurrency: z.unknown().optional(),\n defaultCurrency: z.string().optional(),\n timezone: z.string().optional(),\n isActive: z.boolean().default(true).optional(),\n locale: z.unknown().optional(),\n settings: z.unknown().optional(),\n seo: z.unknown().optional(),\n});\n\nexport const updateTenantSchema = z.object({\n name: z.unknown().optional(),\n description: z.unknown().nullable().optional(),\n theme: z.unknown().nullable().optional(),\n supportedLanguages: z.unknown().nullable().optional(),\n defaultLanguage: z.string().nullable().optional(),\n supportedCurrency: z.unknown().nullable().optional(),\n defaultCurrency: z.string().nullable().optional(),\n timezone: z.string().nullable().optional(),\n isActive: z.boolean().optional(),\n locale: z.unknown().nullable().optional(),\n settings: z.unknown().nullable().optional(),\n seo: z.unknown().nullable().optional(),\n});\n\n// Response schemas\nexport const tenantSchema = z.object({\n id: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n name: z.unknown(),\n description: z.unknown().nullable(),\n theme: z.unknown().nullable(),\n supportedLanguages: z.unknown().nullable(),\n defaultLanguage: z.string().nullable(),\n supportedCurrency: z.unknown().nullable(),\n defaultCurrency: z.string().nullable(),\n timezone: z.string().nullable(),\n isActive: z.boolean(),\n locale: z.unknown().nullable(),\n settings: z.unknown().nullable(),\n seo: z.unknown().nullable(),\n});\n\nexport const listTenantsResponseSchema = z.object({\n tenants: z.array(tenantSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const tenantResponseSchema = z.object({\n tenant: tenantSchema,\n});\n\nexport const deleteTenantResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport { assignUserRoleHandler } from './handler/assign-user-role';\nimport { listUserRolesHandler } from './handler/list-user-roles';\nimport { revokeUserRoleHandler } from './handler/revoke-user-role';\nimport {\n assignUserRoleSchema,\n errorResponseSchema,\n listUserRolesQuerySchema,\n listUserRolesResponseSchema,\n revokeUserRoleResponseSchema,\n userRoleIdParamSchema,\n userRoleResponseSchema,\n} from './user-roles.schema';\n\nexport const listUserRolesRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['User Roles'],\n summary: 'List user roles',\n request: {\n query: listUserRolesQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listUserRolesResponseSchema,\n },\n },\n description: 'List of user roles',\n },\n },\n});\n\nexport const assignUserRoleRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['User Roles'],\n summary: 'Assign role to user',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: assignUserRoleSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: userRoleResponseSchema,\n },\n },\n description: 'Role assigned to user',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role already assigned to user',\n },\n },\n});\n\nexport const revokeUserRoleRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['User Roles'],\n summary: 'Revoke role from user',\n request: {\n params: userRoleIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: revokeUserRoleResponseSchema,\n },\n },\n description: 'Role revoked from user',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User role not found',\n },\n },\n});\n\nconst IAM_ALL = 'iam:all:all';\n\nconst userRoleRoutesBase = new OpenAPIHono<AuthEnv>().use('*', (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n}) as OpenAPIHono<AuthEnv>;\n\nconst userRoleRoutes = userRoleRoutesBase\n .openapi(listUserRolesRoute, listUserRolesHandler)\n .openapi(assignUserRoleRoute, assignUserRoleHandler)\n .openapi(revokeUserRoleRoute, revokeUserRoleHandler);\n\nexport default userRoleRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { userRolesInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { assignUserRoleRoute } from '../user-roles.route';\n\nexport const assignUserRoleHandler: RouteHandler<\n typeof assignUserRoleRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n try {\n const [userRole] = await database\n .insert(userRolesInIam)\n .values({\n tenantId: resolvedTenantId,\n userId: body.userId,\n roleId: body.roleId,\n })\n .returning();\n\n return c.json({ userRole }, 201);\n } catch (error: unknown) {\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n error.code === '23505'\n ) {\n return c.json({ error: 'Role already assigned to user' }, 409);\n }\n throw error;\n }\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { userRolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listUserRolesRoute } from '../user-roles.route';\n\nexport const listUserRolesHandler: RouteHandler<\n typeof listUserRolesRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const conditions = [eq(userRolesInIam.tenantId, tenantId)];\n if (query.userId) {\n conditions.push(eq(userRolesInIam.userId, query.userId));\n }\n if (query.roleId) {\n conditions.push(eq(userRolesInIam.roleId, query.roleId));\n }\n\n const userRoles = await database\n .select()\n .from(userRolesInIam)\n .where(and(...conditions));\n\n return c.json({ userRoles }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { userRolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { revokeUserRoleRoute } from '../user-roles.route';\n\nexport const revokeUserRoleHandler: RouteHandler<\n typeof revokeUserRoleRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(userRolesInIam)\n .where(\n and(eq(userRolesInIam.id, id), eq(userRolesInIam.tenantId, tenantId)),\n )\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'User role not found' }, 404);\n }\n\n await database\n .delete(userRolesInIam)\n .where(\n and(eq(userRolesInIam.id, id), eq(userRolesInIam.tenantId, tenantId)),\n );\n\n return c.json({ message: 'Role revoked from user' }, 200);\n};\n","import { z } from 'zod';\n\n// Query schemas\nexport const listUserRolesQuerySchema = z.object({\n userId: z.uuid().optional(),\n roleId: z.uuid().optional(),\n});\n\n// Path parameter schemas\nexport const userRoleIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Request body schemas\nexport const assignUserRoleSchema = z.object({\n userId: z.uuid(),\n roleId: z.uuid(),\n});\n\n// Response schemas\nexport const userRoleSchema = z.object({\n id: z.uuid(),\n tenantId: z.string(),\n userId: z.uuid(),\n roleId: z.uuid(),\n});\n\nexport const listUserRolesResponseSchema = z.object({\n userRoles: z.array(userRoleSchema),\n});\n\nexport const userRoleResponseSchema = z.object({\n userRole: userRoleSchema,\n});\n\nexport const revokeUserRoleResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport { banUserHandler } from './handler/ban-user';\nimport { bulkInviteUsersHandler } from './handler/bulk-invite-users';\nimport { createUserHandler } from './handler/create-user';\nimport { deleteUserHandler } from './handler/delete-user';\nimport { getUserHandler } from './handler/get-user';\nimport { inviteUserHandler } from './handler/invite-user';\nimport { listUsersHandler } from './handler/list-users';\nimport { searchUsersHandler } from './handler/search-users';\nimport { updateUserHandler } from './handler/update-user';\nimport {\n banUserSchema,\n bulkInviteUsersResponseSchema,\n bulkInviteUsersSchema,\n createUserSchema,\n deleteUserResponseSchema,\n errorResponseSchema,\n inviteUserResultSchema,\n inviteUserSchema,\n listUsersQuerySchema,\n listUsersResponseSchema,\n searchUsersQuerySchema,\n searchUsersResponseSchema,\n updateUserSchema,\n userIdParamSchema,\n userResponseSchema,\n} from './users.schema';\n\nexport const listUsersRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Users'],\n summary: 'List users',\n request: {\n query: listUsersQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listUsersResponseSchema,\n },\n },\n description: 'List of users',\n },\n },\n});\n\nexport const getUserRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Users'],\n summary: 'Get user by ID',\n request: {\n params: userIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: userResponseSchema,\n },\n },\n description: 'User details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const createUserRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Users'],\n summary: 'Create user',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: createUserSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: userResponseSchema,\n },\n },\n description: 'User created',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User already exists',\n },\n },\n});\n\nexport const updateUserRoute = createRoute({\n method: 'put',\n path: '/{id}',\n tags: ['Users'],\n summary: 'Update user',\n request: {\n params: userIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: updateUserSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: userResponseSchema,\n },\n },\n description: 'User updated',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Handle already taken',\n },\n },\n});\n\nexport const deleteUserRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Users'],\n summary: 'Delete user',\n request: {\n params: userIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: deleteUserResponseSchema,\n },\n },\n description: 'User deleted',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const banUserRoute = createRoute({\n method: 'post',\n path: '/{id}/ban',\n tags: ['Users'],\n summary: 'Ban or unban user',\n request: {\n params: userIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: banUserSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: userResponseSchema,\n },\n },\n description: 'User ban status updated',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const searchUsersRoute = createRoute({\n method: 'get',\n path: '/search',\n tags: ['Users'],\n summary: 'Search users',\n request: {\n query: searchUsersQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: searchUsersResponseSchema,\n },\n },\n description: 'Search results',\n },\n },\n});\n\nexport const inviteUserRoute = createRoute({\n method: 'post',\n path: '/invite',\n tags: ['Users'],\n summary: 'Invite a single user',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: inviteUserSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: inviteUserResultSchema,\n },\n },\n description: 'User invited',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User or handle already exists',\n },\n },\n});\n\nexport const bulkInviteUsersRoute = createRoute({\n method: 'post',\n path: '/invite/bulk',\n tags: ['Users'],\n summary: 'Invite users in bulk',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: bulkInviteUsersSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: bulkInviteUsersResponseSchema,\n },\n },\n description: 'Bulk invite results',\n },\n },\n});\n\nconst IAM_ALL = 'iam:all:all';\n\nconst userRoutesBase = new OpenAPIHono<AuthEnv>().use('*', (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n}) as OpenAPIHono<AuthEnv>;\n\nconst userRoutes = userRoutesBase\n .openapi(listUsersRoute, listUsersHandler)\n .openapi(getUserRoute, getUserHandler)\n .openapi(createUserRoute, createUserHandler)\n .openapi(updateUserRoute, updateUserHandler)\n .openapi(deleteUserRoute, deleteUserHandler)\n .openapi(banUserRoute, banUserHandler)\n .openapi(searchUsersRoute, searchUsersHandler)\n .openapi(inviteUserRoute, inviteUserHandler)\n .openapi(bulkInviteUsersRoute, bulkInviteUsersHandler);\n\nexport default userRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { fetchUserWithRoles } from '../../../db/orm';\nimport { usersInIam } from '../../../db/schema';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { AuthEnv } from '../../../types/context';\nimport type { banUserRoute } from '../users.route';\n\nexport const banUserHandler: RouteHandler<\n typeof banUserRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(usersInIam)\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n await database\n .update(usersInIam)\n .set({\n bannedUntil: body.bannedUntil ?? null,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)));\n\n const userWithRoles = await fetchUserWithRoles({\n database,\n userId: id,\n tenantId,\n });\n if (!userWithRoles) {\n return c.json({ error: 'User not found' }, 404);\n }\n return c.json({ user: normalizeUser(userWithRoles) }, 200);\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport type {\n CheckHandleExistsParams,\n CheckUserExistsParams,\n} from '../users.types';\n\nexport const checkUserExists = async ({\n database,\n identifier,\n tenantId,\n isEmail,\n}: CheckUserExistsParams) => {\n const whereClause = isEmail\n ? and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n )\n : and(eq(usersInIam.tenantId, tenantId), eq(usersInIam.phone, identifier));\n\n const [user] = await database\n .select()\n .from(usersInIam)\n .where(whereClause)\n .limit(1);\n\n return user || null;\n};\n\nexport const checkHandleExists = async ({\n database,\n handle,\n tenantId,\n}: CheckHandleExistsParams) => {\n const [existingHandle] = await database\n .select()\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.handle}) = lower(${handle})`,\n ),\n )\n .limit(1);\n\n return existingHandle || null;\n};\n","import { accountsInIam, usersInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { hashPassword } from '../../../lib/crypto';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { createPhoneField } from '../../../lib/phone-validation';\nimport { generateHandle } from '../../../lib/session';\nimport type { AuthConfig, Database } from '../../../types';\nimport { checkHandleExists, checkUserExists } from './user';\n\ntype InvitePayload = {\n email?: string;\n phone?: string;\n fullName: string;\n handle?: string;\n image?: string;\n password?: string;\n emailVerified?: boolean;\n phoneVerified?: boolean;\n sendVia?: Array<'email' | 'sms'>;\n inviteUrl?: string;\n};\n\ntype InviteDelivery = {\n email?: 'sent' | 'skipped' | 'failed';\n sms?: 'sent' | 'skipped' | 'failed';\n};\n\nexport type InviteUserResult = {\n user: ReturnType<typeof normalizeUser>;\n delivery: InviteDelivery;\n inviteUrl: string | null;\n hasPassword: boolean;\n};\n\nconst resolveInviteUrl = ({\n inviteUrl,\n identifier,\n hasPassword,\n}: {\n inviteUrl?: string;\n identifier: string;\n hasPassword: boolean;\n}) => {\n if (inviteUrl) {\n return inviteUrl;\n }\n\n if (hasPassword) {\n return '/auth/sign-in';\n }\n\n return `/auth/set-password?identifier=${encodeURIComponent(identifier)}`;\n};\n\nexport const inviteUser =\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: invite flow mixes validation, persistence, and delivery reporting\n async function inviteUser({\n database,\n tenantId,\n config,\n payload,\n }: {\n database: Database;\n tenantId: string;\n config: AuthConfig;\n payload: InvitePayload;\n }): Promise<InviteUserResult> {\n const identifier = payload.email || payload.phone;\n if (!identifier) {\n throw new Error('Either email or phone is required');\n }\n\n const isEmail = identifier.includes('@');\n if (payload.phone) {\n const phoneValidator = createPhoneField(config);\n if (!phoneValidator.validate(payload.phone)) {\n throw new Error('Invalid phone number format');\n }\n }\n\n const existing = await checkUserExists({\n database,\n identifier,\n tenantId,\n isEmail,\n });\n if (existing) {\n throw new Error('User already exists');\n }\n\n const userHandle = payload.handle || generateHandle();\n const existingHandle = await checkHandleExists({\n database,\n handle: userHandle,\n tenantId,\n });\n if (existingHandle) {\n throw new Error('Handle already taken');\n }\n\n const passwordHash = payload.password\n ? await hashPassword(payload.password)\n : null;\n\n const user = await withTransaction(database, async (tx) => {\n const [createdUser] = await tx\n .insert(usersInIam)\n .values({\n tenantId,\n fullName: payload.fullName,\n handle: userHandle,\n email: payload.email || null,\n phone: payload.phone || null,\n image: payload.image || null,\n emailVerified: Boolean(payload.emailVerified),\n phoneVerified: Boolean(payload.phoneVerified),\n userType: [config.userType],\n })\n .returning();\n\n if (passwordHash) {\n await tx.insert(accountsInIam).values({\n tenantId,\n userId: createdUser.id,\n provider: 'credentials',\n providerAccountId: identifier,\n password: passwordHash,\n });\n }\n\n return createdUser;\n });\n\n const hasPassword = Boolean(passwordHash);\n const resolvedInviteUrl = resolveInviteUrl({\n inviteUrl: payload.inviteUrl,\n identifier,\n hasPassword,\n });\n\n const delivery: InviteDelivery = {};\n if (payload.sendVia?.includes('email')) {\n if (payload.email && config.email.sendInvitation) {\n try {\n await config.email.sendInvitation({\n email: payload.email,\n fullName: payload.fullName,\n identifier,\n inviteUrl: resolvedInviteUrl,\n tenantId,\n });\n delivery.email = 'sent';\n } catch {\n delivery.email = 'failed';\n }\n } else {\n delivery.email = 'skipped';\n }\n }\n\n if (payload.sendVia?.includes('sms')) {\n if (payload.phone && config.phone.sendInvitation) {\n try {\n await config.phone.sendInvitation({\n phone: payload.phone,\n fullName: payload.fullName,\n identifier,\n inviteUrl: resolvedInviteUrl,\n tenantId,\n });\n delivery.sms = 'sent';\n } catch {\n delivery.sms = 'failed';\n }\n } else {\n delivery.sms = 'skipped';\n }\n }\n\n return {\n user: normalizeUser(user),\n delivery,\n inviteUrl: resolvedInviteUrl,\n hasPassword,\n };\n };\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { inviteUser } from '../helper/invite';\nimport type { bulkInviteUsersRoute } from '../users.route';\n\nexport const bulkInviteUsersHandler: RouteHandler<\n typeof bulkInviteUsersRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const invited = [];\n const failed = [];\n\n for (const [index, payload] of body.users.entries()) {\n try {\n const result = await inviteUser({\n database,\n tenantId: resolvedTenantId,\n config,\n payload,\n });\n invited.push(result);\n } catch (error) {\n failed.push({\n index,\n identifier: payload.email || payload.phone || null,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n return c.json({ invited, failed }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { accountsInIam, usersInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { hashPassword } from '../../../lib/crypto';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { generateHandle } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { checkHandleExists, checkUserExists } from '../helper/user';\nimport type { createUserRoute } from '../users.route';\n\nexport const createUserHandler: RouteHandler<\n typeof createUserRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const identifier = body.email || body.phone;\n if (!identifier) {\n return c.json({ error: 'Either email or phone is required' }, 409);\n }\n const isEmail = identifier.includes('@');\n\n const existing = await checkUserExists({\n database,\n identifier,\n tenantId: resolvedTenantId,\n isEmail,\n });\n\n if (existing) {\n return c.json({ error: 'User already exists' }, 409);\n }\n\n const userHandle = body.handle || generateHandle();\n\n const existingHandle = await checkHandleExists({\n database,\n handle: userHandle,\n tenantId: resolvedTenantId,\n });\n\n if (existingHandle) {\n return c.json({ error: 'Handle already taken' }, 409);\n }\n\n const [user] = await withTransaction(database, async (tx) => {\n const [createdUser] = await tx\n .insert(usersInIam)\n .values({\n tenantId: resolvedTenantId,\n fullName: body.fullName,\n handle: userHandle,\n email: body.email || null,\n phone: body.phone || null,\n image: body.image || null,\n emailVerified: Boolean(body.emailVerified),\n phoneVerified: Boolean(body.phoneVerified),\n userType: [config.userType],\n })\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (body.password) {\n const passwordHash = await hashPassword(body.password);\n await tx.insert(accountsInIam).values({\n tenantId: resolvedTenantId,\n userId: createdUser.id,\n provider: 'credentials',\n providerAccountId: identifier,\n password: passwordHash,\n });\n }\n\n return [createdUser];\n });\n\n return c.json({ user: normalizeUser(user) }, 201);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { deleteUserRoute } from '../users.route';\n\nexport const deleteUserHandler: RouteHandler<\n typeof deleteUserRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(usersInIam)\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n await database\n .delete(usersInIam)\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)));\n\n return c.json({ message: 'User deleted' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { fetchUserWithRoles } from '../../../db/orm';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getUserRoute } from '../users.route';\n\nexport const getUserHandler: RouteHandler<\n typeof getUserRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const user = await fetchUserWithRoles({\n database,\n userId: id,\n tenantId,\n });\n\n if (!user) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n return c.json({ user: normalizeUser(user) }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { inviteUser } from '../helper/invite';\nimport type { inviteUserRoute } from '../users.route';\n\nexport const inviteUserHandler: RouteHandler<\n typeof inviteUserRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n try {\n const result = await inviteUser({\n database,\n tenantId: resolvedTenantId,\n config,\n payload: body,\n });\n return c.json(result, 201);\n } catch (error) {\n if (error instanceof Error) {\n return c.json({ error: error.message }, 409);\n }\n throw error;\n }\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, asc, desc, eq, gt, ilike, inArray, or, sql } from 'drizzle-orm';\nimport {\n rolesInIam,\n sessionsInIam,\n userRolesInIam,\n usersInIam,\n} from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listUsersRoute } from '../users.route';\n\nconst userSelect = {\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n createdAt: usersInIam.createdAt,\n userType: usersInIam.userType,\n roleCount:\n sql<number>`(select count(*)::int from ${userRolesInIam} where ${userRolesInIam.userId} = ${usersInIam.id} and ${userRolesInIam.tenantId} = ${usersInIam.tenantId})`.as(\n 'roleCount',\n ),\n};\n\nconst sortColumnMap = {\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n userType: sql`(${usersInIam.userType})[1]`,\n roleCount: sql`(select count(*)::int from ${userRolesInIam} where ${userRolesInIam.userId} = ${usersInIam.id} and ${userRolesInIam.tenantId} = ${usersInIam.tenantId})`,\n lastSignInAt: usersInIam.lastSignInAt,\n activeSessionCount: sql`(select count(*)::int from ${sessionsInIam} where ${sessionsInIam.userId} = ${usersInIam.id} and ${sessionsInIam.tenantId} = ${usersInIam.tenantId} and ${sessionsInIam.expiresAt} > now())`,\n createdAt: usersInIam.createdAt,\n} as const;\n\nfunction roleNameToLocaleRecord(\n name: unknown,\n code: string,\n): Record<string, string> {\n if (typeof name === 'string') {\n return { en: name };\n }\n if (name && typeof name === 'object' && !Array.isArray(name)) {\n const rec = name as Record<string, unknown>;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(rec)) {\n if (typeof v === 'string') {\n out[k] = v;\n }\n }\n return Object.keys(out).length > 0 ? out : { en: code };\n }\n return { en: code };\n}\n\nexport const listUsersHandler: RouteHandler<\n typeof listUsersRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const _config = c.get('config');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n const userTypeFilter =\n query.userType && query.userType !== 'all' ? query.userType : null;\n\n const conditions = [eq(usersInIam.tenantId, tenantId)];\n if (userTypeFilter) {\n conditions.push(\n sql`${usersInIam.userType} @> ARRAY[${userTypeFilter}]::text[]`,\n );\n }\n if (query.search?.trim()) {\n const term = `%${query.search.trim().replace(/[%_\\\\]/g, (ch) => `\\\\${ch}`)}%`;\n const searchCond = or(\n ilike(usersInIam.fullName, term),\n ilike(usersInIam.email, term),\n ilike(usersInIam.phone, term),\n );\n if (searchCond) {\n conditions.push(searchCond);\n }\n }\n if (query.email) {\n conditions.push(ilike(usersInIam.email, `%${query.email}%`));\n }\n if (query.phone) {\n conditions.push(ilike(usersInIam.phone, `%${query.phone}%`));\n }\n if (query.handle) {\n conditions.push(ilike(usersInIam.handle, `%${query.handle}%`));\n }\n if (query.filter === 'verified') {\n const verifiedCond = or(\n eq(usersInIam.emailVerified, true),\n eq(usersInIam.phoneVerified, true),\n );\n if (verifiedCond) {\n conditions.push(verifiedCond);\n }\n } else if (query.filter === 'unverified') {\n conditions.push(eq(usersInIam.emailVerified, false));\n conditions.push(eq(usersInIam.phoneVerified, false));\n }\n\n const orderDir = query.order === 'asc' ? asc : desc;\n const sortCol =\n query.sort && sortColumnMap[query.sort]\n ? sortColumnMap[query.sort]\n : usersInIam.fullName;\n\n const whereClause = and(...conditions);\n\n const [users, totalResult] = await Promise.all([\n database\n .select(userSelect)\n .from(usersInIam)\n .where(whereClause)\n .orderBy(orderDir(sortCol))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(usersInIam)\n .where(whereClause),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n const userIds = users.map((u) => u.id);\n\n const sessionCountRows =\n userIds.length > 0\n ? await database\n .select({\n userId: sessionsInIam.userId,\n count: sql<number>`count(*)::int`.as('count'),\n })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n inArray(sessionsInIam.userId, userIds),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .groupBy(sessionsInIam.userId)\n : [];\n const sessionCountByUser = new Map(\n sessionCountRows.map((r) => [r.userId, Number(r.count) ?? 0]),\n );\n\n const roleRows =\n userIds.length > 0\n ? await database\n .select({\n userId: userRolesInIam.userId,\n code: rolesInIam.code,\n name: rolesInIam.name,\n })\n .from(userRolesInIam)\n .innerJoin(\n rolesInIam,\n and(\n eq(rolesInIam.tenantId, userRolesInIam.tenantId),\n eq(rolesInIam.id, userRolesInIam.roleId),\n ),\n )\n .where(\n and(\n eq(userRolesInIam.tenantId, tenantId),\n inArray(userRolesInIam.userId, userIds),\n ),\n )\n : [];\n\n const userRolesMap = new Map<\n string,\n { code: string; name: Record<string, string> }[]\n >();\n for (const r of roleRows) {\n const list = userRolesMap.get(r.userId) ?? [];\n list.push({\n code: r.code,\n name: roleNameToLocaleRecord(r.name, r.code),\n });\n userRolesMap.set(r.userId, list);\n }\n\n return c.json(\n {\n users: users.map((u) => ({\n ...u,\n roles: null,\n userRoles: userRolesMap.get(u.id) ?? [],\n activeSessionCount: sessionCountByUser.get(u.id) ?? 0,\n })),\n total,\n page,\n limit,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, ilike, or } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { searchUsersRoute } from '../users.route';\n\nexport const searchUsersHandler: RouteHandler<\n typeof searchUsersRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const limit = query.limit || 20;\n const conditions = [eq(usersInIam.tenantId, tenantId)];\n\n if (query.search && query.search.trim().length > 0) {\n const searchCondition = or(\n ilike(usersInIam.fullName, `%${query.search}%`),\n ilike(usersInIam.email, `%${query.search}%`),\n ilike(usersInIam.handle, `%${query.search}%`),\n );\n if (searchCondition) {\n conditions.push(searchCondition);\n }\n }\n\n const users = await database\n .select({\n id: usersInIam.id,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n })\n .from(usersInIam)\n .where(and(...conditions))\n .limit(limit);\n\n return c.json({ users }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, inArray, sql } from 'drizzle-orm';\nimport { fetchUserWithRoles } from '../../../db/orm';\nimport { rolesInIam, userRolesInIam, usersInIam } from '../../../db/schema';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { User } from '../../../types';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateUserRoute } from '../users.route';\n\nexport const updateUserHandler: RouteHandler<\n typeof updateUserRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(usersInIam)\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n if (body.handle && body.handle !== existing.handle) {\n const [handleExists] = await database\n .select()\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.handle}) = lower(${body.handle})`,\n ),\n )\n .limit(1);\n if (handleExists) {\n return c.json({ error: 'Handle already taken' }, 409);\n }\n }\n\n const updateData: Partial<typeof usersInIam.$inferInsert> = {};\n\n if (body.fullName !== undefined) {\n updateData.fullName = body.fullName;\n }\n if (body.email !== undefined) {\n updateData.email = body.email;\n }\n if (body.phone !== undefined) {\n updateData.phone = body.phone;\n }\n if (body.handle !== undefined) {\n updateData.handle = body.handle;\n }\n if (body.image !== undefined) {\n updateData.image = body.image;\n }\n if (body.emailVerified !== undefined) {\n updateData.emailVerified = body.emailVerified;\n }\n if (body.phoneVerified !== undefined) {\n updateData.phoneVerified = body.phoneVerified;\n }\n\n const [updated] = await database\n .update(usersInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)))\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (!updated) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n if (body.roleIds !== undefined) {\n const roleIds = body.roleIds as string[];\n if (roleIds.length > 0) {\n const validRoles = await database\n .select({ id: rolesInIam.id, code: rolesInIam.code })\n .from(rolesInIam)\n .where(\n and(\n eq(rolesInIam.tenantId, tenantId),\n inArray(rolesInIam.id, roleIds),\n ),\n );\n const assignableIds = new Set(\n validRoles\n .filter((r) => (r.code ?? '').toLowerCase() !== 'owner')\n .map((r) => r.id),\n );\n const toInsert = roleIds.filter((rid) => assignableIds.has(rid));\n await database\n .delete(userRolesInIam)\n .where(\n and(\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.userId, id),\n ),\n );\n if (toInsert.length > 0) {\n await database.insert(userRolesInIam).values(\n toInsert.map((roleId) => ({\n tenantId,\n userId: id,\n roleId,\n })),\n );\n }\n } else {\n await database\n .delete(userRolesInIam)\n .where(\n and(\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.userId, id),\n ),\n );\n }\n }\n\n const userWithRoles = await fetchUserWithRoles({\n database,\n userId: id,\n tenantId,\n });\n return c.json(\n {\n user: normalizeUser((userWithRoles ?? updated) as User),\n },\n 200,\n );\n};\n","import { z } from 'zod';\nimport { userSchema } from '../auth.schema';\n\n// Query schemas\nconst sortableFields = [\n 'fullName',\n 'email',\n 'phone',\n 'userType',\n 'roleCount',\n 'lastSignInAt',\n 'activeSessionCount',\n 'createdAt',\n] as const;\nconst filterValues = ['', 'verified', 'unverified'] as const;\nconst userTypeValues = ['all', 'employee', 'candidate', 'admin'] as const;\n\nexport const listUsersQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n tenantId: z.string().optional(),\n search: z.string().optional(),\n email: z.string().optional(),\n phone: z.string().optional(),\n handle: z.string().optional(),\n filter: z.enum(filterValues).optional(),\n userType: z.enum(userTypeValues).optional(),\n sort: z.enum(sortableFields).optional(),\n order: z.enum(['asc', 'desc']).optional(),\n});\n\n// Path parameter schemas\nexport const userIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Request body schemas\nexport const createUserSchema = z.object({\n email: z.string().email().optional(),\n phone: z.string().optional(),\n fullName: z.string().min(1),\n handle: z.string().optional(),\n image: z.string().url().optional(),\n password: z.string().min(8).max(128).optional(),\n emailVerified: z.boolean().default(false).optional(),\n phoneVerified: z.boolean().default(false).optional(),\n});\n\nexport const updateUserSchema = z.object({\n fullName: z.string().min(1).optional(),\n email: z.string().email().nullable().optional(),\n phone: z.string().nullable().optional(),\n handle: z.string().optional(),\n image: z.string().url().nullable().optional(),\n emailVerified: z.boolean().optional(),\n phoneVerified: z.boolean().optional(),\n roleIds: z.array(z.string().uuid()).optional(),\n});\n\nexport const banUserSchema = z.object({\n bannedUntil: z.string().datetime().nullable().optional(),\n});\n\n// Response schemas\nexport const listUsersResponseSchema = z.object({\n users: z.array(userSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const userResponseSchema = z.object({\n user: userSchema,\n});\n\nexport const deleteUserResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n\nconst inviteChannelSchema = z.enum(['email', 'sms']);\n\nexport const inviteUserSchema = z\n .object({\n email: z.string().email().optional(),\n phone: z.string().optional(),\n fullName: z.string().min(1),\n handle: z.string().optional(),\n image: z.string().url().optional(),\n password: z.string().min(8).max(128).optional(),\n emailVerified: z.boolean().default(false).optional(),\n phoneVerified: z.boolean().default(false).optional(),\n sendVia: z.array(inviteChannelSchema).default([]).optional(),\n inviteUrl: z.string().url().optional(),\n })\n .refine((data) => data.email || data.phone, {\n message: 'Either email or phone is required',\n path: ['email'],\n });\n\nexport const bulkInviteUsersSchema = z.object({\n users: z.array(inviteUserSchema).min(1),\n});\n\nconst deliveryStateSchema = z.enum(['sent', 'skipped', 'failed']);\n\nexport const inviteDeliverySchema = z.object({\n email: deliveryStateSchema.optional(),\n sms: deliveryStateSchema.optional(),\n});\n\nexport const inviteUserResultSchema = z.object({\n user: userSchema,\n delivery: inviteDeliverySchema,\n inviteUrl: z.string().nullable(),\n hasPassword: z.boolean(),\n});\n\nexport const bulkInviteUsersResponseSchema = z.object({\n invited: z.array(inviteUserResultSchema),\n failed: z.array(\n z.object({\n index: z.number().int().nonnegative(),\n identifier: z.string().nullable(),\n error: z.string(),\n }),\n ),\n});\n\nexport const searchUsersQuerySchema = z.object({\n search: z.string().optional().describe('Search term'),\n limit: z.coerce\n .number()\n .int()\n .positive()\n .optional()\n .default(20)\n .describe('Limit'),\n});\n\nexport const userSearchResultSchema = z.object({\n id: z.string().uuid().describe('User ID'),\n fullName: z.string().describe('Full name'),\n email: z.string().nullable().describe('Email'),\n phone: z.string().nullable().describe('Phone'),\n handle: z.string().describe('Handle'),\n image: z.string().nullable().describe('Image URL'),\n});\n\nexport const searchUsersResponseSchema = z.object({\n users: z.array(userSearchResultSchema).describe('Users'),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport { invalidateVerificationHandler } from './handler/invalidate-verification';\nimport { listVerificationsHandler } from './handler/list-verifications';\nimport {\n errorResponseSchema,\n invalidateVerificationResponseSchema,\n listVerificationsQuerySchema,\n listVerificationsResponseSchema,\n verificationIdParamSchema,\n} from './verifications.schema';\n\nexport const listVerificationsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Verifications'],\n summary: 'List verifications',\n request: {\n query: listVerificationsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listVerificationsResponseSchema,\n },\n },\n description: 'List of verifications',\n },\n },\n});\n\nexport const invalidateVerificationRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Verifications'],\n summary: 'Invalidate verification',\n request: {\n params: verificationIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: invalidateVerificationResponseSchema,\n },\n },\n description: 'Verification invalidated',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Verification not found',\n },\n },\n});\n\nconst verificationRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(listVerificationsRoute, listVerificationsHandler)\n .openapi(invalidateVerificationRoute, invalidateVerificationHandler);\n\nexport default verificationRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { verificationsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { invalidateVerificationRoute } from '../verifications.route';\n\nexport const invalidateVerificationHandler: RouteHandler<\n typeof invalidateVerificationRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.id, id),\n eq(verificationsInIam.tenantId, tenantId),\n ),\n )\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Verification not found' }, 404);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.id, id),\n eq(verificationsInIam.tenantId, tenantId),\n ),\n );\n\n return c.json({ message: 'Verification invalidated' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { verificationsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listVerificationsRoute } from '../verifications.route';\n\nexport const listVerificationsHandler: RouteHandler<\n typeof listVerificationsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [eq(verificationsInIam.tenantId, tenantId)];\n if (query.userId) {\n conditions.push(eq(verificationsInIam.userId, query.userId));\n }\n if (query.type) {\n conditions.push(eq(verificationsInIam.type, query.type));\n }\n if (query.status) {\n if (query.status === 'active') {\n conditions.push(sql`${verificationsInIam.expiresAt} > CURRENT_TIMESTAMP`);\n } else if (query.status === 'expired') {\n conditions.push(\n sql`${verificationsInIam.expiresAt} <= CURRENT_TIMESTAMP`,\n );\n } else if (query.status === 'consumed') {\n conditions.push(sql`${verificationsInIam.attempt} >= 3`);\n }\n }\n\n const [verifications, totalResult] = await Promise.all([\n database\n .select()\n .from(verificationsInIam)\n .where(and(...conditions))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(verificationsInIam)\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ verifications, total, page, limit }, 200);\n};\n","import { z } from 'zod';\n\n// Query schemas\nexport const listVerificationsQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n userId: z.uuid().optional(),\n type: z.string().optional(),\n status: z.enum(['active', 'expired', 'consumed']).optional(),\n});\n\n// Path parameter schemas\nexport const verificationIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Response schemas\nexport const verificationSchema = z.object({\n id: z.uuid(),\n tenantId: z.string(),\n userId: z.uuid(),\n code: z.string(),\n expiresAt: z.string(),\n type: z.string().nullable(),\n attempt: z.number().nullable(),\n to: z.string().nullable(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nexport const listVerificationsResponseSchema = z.object({\n verifications: z.array(verificationSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const invalidateVerificationResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import type { AuthConfig, Database, Session, User } from '../types';\nimport type { AuthContext } from '../types/context';\n\nexport const setAuthContext = ({\n c,\n config,\n database,\n user,\n session,\n}: {\n c: AuthContext;\n config: AuthConfig;\n database: Database;\n user?: User;\n session?: Session;\n}): void => {\n c.set('config', config);\n c.set('database', database);\n c.set('tenantId', config.tenant?.tenantId || 'tenant');\n c.set('userId', user?.id);\n c.set('user', user);\n c.set('session', session);\n};\n","import { Scalar } from '@scalar/hono-api-reference';\n\nexport type DocsConfig = {\n title?: string;\n theme?:\n | 'default'\n | 'moon'\n | 'purple'\n | 'saturn'\n | 'bluePlanet'\n | 'kepler'\n | 'mars';\n openApiPath?: string;\n favicon?: string;\n};\n\nexport const createDocsHandler = (config: DocsConfig = {}) => {\n return Scalar({\n url: config.openApiPath || '/openapi.json',\n theme: config.theme || 'saturn',\n pageTitle: config.title || 'IAM API Reference',\n favicon: config.favicon || '/favicon.ico',\n });\n};\n","import type { AuthConfig } from '../types';\n\nexport const createOpenApiConfig = (config: AuthConfig) => {\n const basePath = config.basePath || '';\n const servers = config.docs?.servers || [\n {\n url: 'http://localhost:3000',\n description: 'Development server',\n },\n ];\n const serversWithBasePath = servers.map((server) => ({\n ...server,\n url: `${server.url.replace(/\\/$/, '')}${basePath}`,\n }));\n\n return {\n openapi: '3.0.0',\n info: {\n title: config.docs?.title || 'IAM API',\n version: config.docs?.version || '1.0.0',\n description: 'Complete Identity and Access Management API',\n },\n servers: serversWithBasePath,\n tags: [\n { name: 'Auth', description: 'Authentication endpoints' },\n { name: 'Profile', description: 'User profile management' },\n { name: 'Password', description: 'Password management' },\n { name: 'Email', description: 'Email verification' },\n { name: 'Phone', description: 'Phone verification' },\n { name: 'Users', description: 'User management (IAM)' },\n { name: 'Tenants', description: 'Tenant management (IAM)' },\n { name: 'Domains', description: 'Domain management (IAM)' },\n { name: 'Roles', description: 'Role management (IAM)' },\n { name: 'Permissions', description: 'Permission management (IAM)' },\n {\n name: 'Role Permissions',\n description: 'Role-permission mapping (IAM)',\n },\n { name: 'User Roles', description: 'User-role assignment (IAM)' },\n { name: 'Sessions', description: 'Session management (IAM)' },\n { name: 'Verifications', description: 'Verification management (IAM)' },\n { name: 'System', description: 'System initialization' },\n ],\n 'x-tagGroups': [\n {\n name: 'Authentication',\n tags: ['Auth', 'Profile', 'Password', 'Email', 'Phone'],\n },\n {\n name: 'System',\n tags: ['System'],\n },\n {\n name: 'IAM Management',\n tags: [\n 'Users',\n 'Tenants',\n 'Domains',\n 'Roles',\n 'Permissions',\n 'Role Permissions',\n 'User Roles',\n 'Sessions',\n 'Verifications',\n ],\n },\n ],\n };\n};\n","import { createMiddleware } from 'hono/factory';\n\nexport const createSessionMiddleware = () => {\n return createMiddleware(async (c, next) => {\n const authInstance = c.get('auth');\n if (!authInstance) {\n c.set('user', null);\n c.set('session', null);\n c.set('userId', null);\n c.set('sessionStatus', 'error');\n return await next();\n }\n const sessionData = await authInstance.getSession(c);\n\n const { session, user, status } = sessionData;\n c.set('sessionStatus', status);\n\n if (!(session && user)) {\n c.set('user', null);\n c.set('session', null);\n c.set('userId', null);\n await next();\n return;\n }\n\n c.set('user', user);\n c.set('session', session);\n c.set('userId', user.id);\n await next();\n });\n};\n","import { logger } from '@mesob/common';\n\nimport { createMiddleware } from 'hono/factory';\nimport { HTTPException } from 'hono/http-exception';\nimport type { Database } from '../db';\nimport {\n findTenantByDomain,\n findTenantById,\n type Tenant,\n} from '../db/orm/tenant';\nimport type { AuthConfig } from '../types';\n\nfunction resolveHost(\n hostHeader: string | undefined,\n forwardedHost: string | undefined,\n): string | null {\n const hostHeaderStr = hostHeader || '';\n const forwardedHostStr = forwardedHost || '';\n\n if (forwardedHostStr) {\n return forwardedHostStr;\n }\n\n if (hostHeaderStr) {\n return hostHeaderStr;\n }\n\n return null;\n}\n\nasync function resolveTenantId(\n database: Database,\n config: AuthConfig,\n host: string,\n): Promise<string | null> {\n // Prioritize config.tenant.tenantId if set\n if (config.tenant?.tenantId) {\n return config.tenant.tenantId;\n }\n\n const normalizedHost = host.toLowerCase().split(':')[0];\n if (\n normalizedHost === 'localhost' ||\n normalizedHost === '127.0.0.1' ||\n normalizedHost.includes('internal')\n ) {\n return 'tenant';\n }\n if (config.tenant?.tenantDomains?.includes(normalizedHost)) {\n return normalizedHost;\n }\n if (normalizedHost.endsWith('.lvh.me')) {\n return normalizedHost.replace('.lvh.me', '');\n }\n return await findTenantByDomain(database, normalizedHost);\n}\n\nasync function resolveTenant(\n database: Database,\n config: AuthConfig,\n host: string,\n): Promise<{ tenantId: string | null; tenant: Tenant | null }> {\n try {\n const tenantId = await resolveTenantId(database, config, host);\n if (!tenantId) {\n return { tenantId: null, tenant: null };\n }\n const tenant = await findTenantById(database, tenantId);\n if (!tenant) {\n return { tenantId: null, tenant: null };\n }\n return { tenantId, tenant };\n } catch (err) {\n logger.error('Tenant resolution error:', err);\n throw err;\n }\n}\n\nfunction validateTenant(\n tenantId: string | null,\n tenant: Tenant | null,\n): string | null {\n if (!tenantId) {\n return 'Unknown workspace domain';\n }\n if (!tenant) {\n return 'Tenant not found';\n }\n if (!tenant.isActive) {\n return 'Tenant inactive';\n }\n return null;\n}\n\nexport const createTenantMiddleware = (\n database: Database,\n config: AuthConfig,\n) => {\n return createMiddleware(async (c, next) => {\n const host = resolveHost(\n c.req.header('host'),\n c.req.header('x-forwarded-host'),\n );\n\n c.set('host', host);\n\n if (!host) {\n throw new HTTPException(400, { message: 'Missing Host header' });\n }\n\n let tenantId: string | null = null;\n let tenant: Tenant | null = null;\n\n try {\n const result = await resolveTenant(database, config, host);\n tenantId = result.tenantId;\n tenant = result.tenant;\n } catch {\n throw new HTTPException(500, { message: 'Tenant resolution failed' });\n }\n\n c.set('tenantId', tenantId);\n c.set('tenant', tenant);\n\n const error = validateTenant(tenantId, tenant);\n if (error) {\n throw new HTTPException(404, { message: error });\n }\n\n return await next();\n });\n};\n","import type { Context } from 'hono';\nimport { getCookie } from 'hono/cookie';\nimport type { Database } from './db';\nimport {\n deleteSession,\n fetchSessionByToken,\n fetchUserWithRoles,\n updateSessionExpiry,\n} from './db/orm';\nimport {\n deleteSessionCookie,\n getSessionCookieName,\n setSessionCookie,\n} from './lib/cookie';\nimport { hashToken } from './lib/crypto';\nimport {\n getRefreshedExpiresAt,\n getSessionUpdateAge,\n shouldRefreshSession,\n} from './lib/session';\nimport type { AuthConfig, Session, User } from './types';\n\nexport type SessionStatus =\n | 'valid'\n | 'no_cookie'\n | 'invalid_session'\n | 'user_not_found'\n | 'error';\n\nexport type GetSessionResult = {\n session: Session | null;\n user: User | null;\n sessionToken: string | null;\n status: SessionStatus;\n};\n\nexport const createGetSession = (database: Database, config: AuthConfig) => {\n return async (c: Context): Promise<GetSessionResult> => {\n const sessionToken = getCookie(c, getSessionCookieName(config));\n if (!sessionToken) {\n return {\n session: null,\n user: null,\n sessionToken: null,\n status: 'no_cookie',\n };\n }\n\n try {\n const hashedToken = await hashToken(sessionToken, config.secret);\n const session = await fetchSessionByToken({\n database,\n hashedToken,\n tenantId: config.tenant?.tenantId || 'tenant',\n });\n\n if (!session) {\n // Session not found or expired, clear cookie\n deleteSessionCookie(c, config);\n return {\n session: null,\n user: null,\n sessionToken: null,\n status: 'invalid_session',\n };\n }\n\n const user = await fetchUserWithRoles({\n database,\n userId: session.userId,\n tenantId: session.tenantId,\n });\n\n if (!user) {\n await deleteSession({\n database,\n sessionId: session.id,\n tenantId: session.tenantId,\n });\n deleteSessionCookie(c, config);\n return {\n session: null,\n user: null,\n sessionToken: null,\n status: 'user_not_found',\n };\n }\n\n // Check if session needs refresh\n const rememberMe = session.meta?.rememberMe !== false;\n const updateAge = getSessionUpdateAge({\n sessionConfig: config.session,\n rememberMe,\n });\n\n if (shouldRefreshSession({ expiresAt: session.expiresAt, updateAge })) {\n const newExpiresAt = getRefreshedExpiresAt({\n sessionConfig: config.session,\n rememberMe,\n });\n\n // Update session expiry in database\n await updateSessionExpiry({\n database,\n sessionId: session.id,\n tenantId: session.tenantId,\n expiresAt: newExpiresAt,\n });\n\n // Update cookie with new expiry\n setSessionCookie(c, sessionToken, config, {\n expires: new Date(newExpiresAt),\n });\n\n // Return updated session\n return {\n session: { ...session, expiresAt: newExpiresAt },\n user,\n sessionToken,\n status: 'valid',\n };\n }\n\n return { session, user, sessionToken, status: 'valid' };\n } catch {\n return { session: null, user: null, sessionToken: null, status: 'error' };\n }\n };\n};\n","import type { PermissionTree } from '@mesob/common';\nimport { logger } from '@mesob/common';\nimport type { Database } from '../db';\n\nexport type { Database } from '../db';\n\nexport type User = {\n id: string;\n tenantId: string;\n fullName: string;\n email: string | null;\n phone: string | null;\n handle: string;\n image: string | null;\n emailVerified: boolean;\n phoneVerified: boolean;\n lastSignInAt: string | null;\n bannedUntil?: string | null;\n loginAttempt?: number;\n /** Role IDs */\n roles?: string[] | null;\n /** Role codes for hasRole() checks (e.g. 'owner', 'tenant-admin') */\n roleCodes?: string[] | null;\n /** Permission IDs for hasPermission() checks */\n permissions?: string[] | null;\n};\n\nexport type SessionMeta = {\n action?: string;\n rememberMe?: boolean;\n};\n\nexport type Session = {\n id: string;\n tenantId: string;\n userId: string;\n expiresAt: string;\n createdAt: string;\n meta?: SessionMeta | null;\n};\n\nexport type Verification = {\n id: string;\n tenantId: string;\n userId: string;\n type: string;\n code: string;\n to: string | null;\n expiresAt: string;\n createdAt: string;\n attempt: number | null;\n};\n\nexport type Account = {\n id: string;\n tenantId: string;\n userId: string;\n provider: string;\n providerAccountId: string;\n password: string | null;\n};\n\nexport type SendVerificationOTPParams = {\n email?: string;\n phone?: string;\n code: string;\n hash: string;\n type: string;\n};\n\nexport type SendInvitationParams = {\n email?: string;\n phone?: string;\n fullName: string;\n identifier: string;\n inviteUrl?: string;\n tenantId: string;\n};\n\nexport type VerificationConfig = {\n enabled: boolean;\n required: boolean;\n otpLength: number;\n expiresIn: string;\n maxAttempts: number;\n resendInterval?: string;\n sendVerificationOTP?: (\n params: SendVerificationOTPParams,\n ) => Promise<void> | void;\n sendInvitation?: (params: SendInvitationParams) => Promise<void> | void;\n};\n\nexport type PhoneConfig = VerificationConfig & {\n phoneRegex?: RegExp | string;\n};\n\nexport type EmailConfig = VerificationConfig;\n\nexport type SessionConfig = {\n /** Default session duration (e.g., '7d', '30d'). Default: '7d' */\n expiresIn: string;\n /** Session duration when \"remember me\" is checked (e.g., '30d'). Default: '30d' */\n rememberMeExpiresIn: string;\n /** Session duration when \"remember me\" is unchecked (e.g., '1h'). Default: '1h' */\n shortSessionExpiresIn: string;\n /** Refresh session if remaining time is less than this (e.g., '1d'). Default: '1d' */\n updateAge: string;\n /** Refresh short session if remaining time is less than this (e.g., '15m'). Default: '15m' */\n shortSessionUpdateAge: string;\n /** Maximum concurrent sessions per user */\n maxPerUser?: number;\n};\n\nexport type SecurityConfig = {\n maxLoginAttempts: number;\n lockoutDuration: string;\n};\n\nexport type TenantConfig = {\n enabled?: boolean;\n tenantId?: string;\n tenantDomains?: string[];\n};\n\nexport type DocsConfig = {\n enabled?: boolean;\n title?: string;\n version?: string;\n theme?:\n | 'default'\n | 'moon'\n | 'purple'\n | 'saturn'\n | 'bluePlanet'\n | 'kepler'\n | 'mars';\n servers?: Array<{ url: string; description?: string }>;\n};\n\nexport type SeedRole = {\n code: string;\n name: unknown;\n description?: unknown;\n permissionIds?: readonly string[];\n isSystem?: boolean;\n isEditable?: boolean;\n isDeletable?: boolean;\n};\n\nexport type CookieConfig = {\n prefix?: string;\n};\n\nexport type SMSConfig = {\n baseUrl: string;\n identifierId: string;\n senderName: string;\n apiKey: string;\n templateVerification?: string;\n templateLogin?: string;\n};\n\nexport type ResendConfig = {\n apiKey: string;\n from: string;\n verificationSubject?: string;\n resetPasswordSubject?: string;\n};\n\nexport type AuthConfig = {\n connectionString: string;\n userType: string;\n secret: string;\n basePath?: string;\n tenant?: TenantConfig;\n docs?: DocsConfig;\n cookie?: CookieConfig;\n permissions?: PermissionTree;\n roles?: SeedRole[];\n session: SessionConfig;\n email: EmailConfig;\n phone: PhoneConfig;\n security?: SecurityConfig;\n};\n\nexport type { AuthContext, AuthEnv } from './context';\n\nexport type CreateAuthRoutesOptions = {\n config: AuthConfig;\n database: Database;\n};\n\nexport type MesobAuth = {\n routes: ReturnType<typeof import('../handler').createAuthRoutes>;\n getSession: (c: import('hono').Context) => Promise<{\n session: Session | null;\n user: User | null;\n sessionToken: string | null;\n }>;\n tenantMiddleware: import('hono').MiddlewareHandler;\n sessionMiddleware: import('hono').MiddlewareHandler;\n};\n\nconst createDefaultSendVerificationOTP = (expiresIn: string) => {\n return (params: SendVerificationOTPParams): void => {\n logger.log(\n `[Verification OTP] Code: ${params.code}, Hash: ${params.hash}, ExpiresIn: ${expiresIn}, Type: ${params.type}`,\n );\n };\n};\n\nconst defaultConfig = {\n enabled: true,\n required: true,\n otpLength: 6,\n expiresIn: '15m',\n maxAttempts: 5,\n resendInterval: '30s',\n sendVerificationOTP: createDefaultSendVerificationOTP('15m'),\n} satisfies VerificationConfig;\n\nconst defaultPhoneRegex = /^(\\+2519|\\+2517|2519|2517|09|07)\\d{8}$/;\n\ntype DefaultAuthConfig = {\n readonly tenant: {\n readonly enabled: true;\n readonly tenantId: 'tenant';\n };\n readonly docs: {\n readonly enabled: true;\n };\n readonly cookie: {\n readonly prefix: 'msb';\n };\n readonly session: {\n readonly expiresIn: '7d';\n readonly rememberMeExpiresIn: '30d';\n readonly shortSessionExpiresIn: '1h';\n readonly updateAge: '1d';\n readonly shortSessionUpdateAge: '15m';\n readonly maxPerUser: 5;\n };\n readonly email: typeof defaultConfig;\n readonly phone: typeof defaultConfig & {\n readonly phoneRegex: typeof defaultPhoneRegex;\n };\n readonly security: {\n readonly maxLoginAttempts: 5;\n readonly lockoutDuration: '15m';\n };\n};\n\nexport const defaultAuthConfig: DefaultAuthConfig = {\n tenant: {\n enabled: true,\n tenantId: 'tenant',\n },\n docs: {\n enabled: true,\n },\n cookie: {\n prefix: 'msb',\n },\n session: {\n expiresIn: '7d',\n rememberMeExpiresIn: '30d',\n shortSessionExpiresIn: '1h',\n updateAge: '1d',\n shortSessionUpdateAge: '15m',\n maxPerUser: 5,\n },\n email: defaultConfig,\n phone: {\n ...defaultConfig,\n phoneRegex: defaultPhoneRegex,\n },\n security: {\n maxLoginAttempts: 5,\n lockoutDuration: '15m',\n },\n} as const;\n","import { lt } from 'drizzle-orm';\nimport type { Database } from '../db';\nimport { sessionsInIam, verificationsInIam } from '../db/schema';\n\nexport const cleanupExpiredVerifications = async (database: Database) => {\n const now = new Date().toISOString();\n\n const result = await database\n .delete(verificationsInIam)\n .where(lt(verificationsInIam.expiresAt, now));\n\n return result;\n};\n\nexport const cleanupExpiredSessions = async (database: Database) => {\n const now = new Date().toISOString();\n\n const result = await database\n .delete(sessionsInIam)\n .where(lt(sessionsInIam.expiresAt, now));\n\n return result;\n};\n\nexport const cleanupExpiredData = async (database: Database) => {\n await Promise.all([\n cleanupExpiredVerifications(database),\n cleanupExpiredSessions(database),\n ]);\n};\n"],"mappings":"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","names":["OpenAPIHono","getCookie","and","eq","sql","and","sql","eq","and","eq","and","eq","sql","sql","and","eq","and","eq","isDatabaseError","OpenAPIHono","and","eq","sql","HTTPException","sql","and","eq","logger","and","eq","and","eq","gt","sql","sql","and","eq","gt","and","eq","gt","sql","and","eq","sql","gt","dayjs","and","eq","and","eq","dayjs","signInHandler","logger","and","eq","and","eq","gt","and","eq","gt","createRoute","OpenAPIHono","HTTPException","check","HTTPException","z","errorResponseSchema","and","eq","and","eq","and","eq","and","eq","and","eq","sql","eq","and","sql","and","eq","sql","and","eq","sql","and","eq","sql","and","eq","sql","createRoute","errorResponseSchema","OpenAPIHono","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","sql","and","eq","sql","createRoute","OpenAPIHono","createRoute","OpenAPIHono","and","eq","gt","getCookie","and","eq","getCookie","gt","and","eq","sql","sql","and","eq","and","eq","gt","and","eq","gt","and","eq","and","eq","and","eq","and","eq","createRoute","OpenAPIHono","createRoute","OpenAPIHono","eq","eq","getPermissionEntries","getPermissionEntries","index","getPermissionEntries","and","eq","inArray","sql","HTTPException","getPermissionEntries","sql","inArray","HTTPException","and","eq","z","errorResponseSchema","createRoute","errorResponseSchema","IAM_ALL","OpenAPIHono","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","and","eq","createRoute","OpenAPIHono","createRoute","OpenAPIHono","z","and","eq","gt","sql","and","eq","sql","gt","and","eq","sql","sql","and","eq","and","eq","ne","sql","and","eq","ne","sql","and","eq","ne","sql","and","eq","ne","sql","createRoute","z","OpenAPIHono","createRoute","OpenAPIHono","and","eq","eq","and","and","eq","and","eq","z","errorResponseSchema","createRoute","errorResponseSchema","IAM_ALL","OpenAPIHono","createRoute","OpenAPIHono","randomUUID","and","eq","inArray","and","eq","inArray","randomUUID","randomUUID","and","eq","inArray","and","eq","inArray","randomUUID","randomUUID","randomUUID","and","eq","and","eq","and","eq","sql","sql","and","eq","and","eq","listRolePermissionsHandler","and","eq","and","asc","desc","eq","sql","and","eq","asc","desc","sql","and","asc","desc","eq","ilike","or","sql","sortColumnMap","eq","ilike","or","sql","asc","desc","and","and","eq","revokeRolePermissionHandler","and","eq","and","eq","and","eq","and","eq","inArray","sql","sql","and","eq","inArray","and","eq","sql","and","eq","sql","z","z","listRolePermissionsResponseSchema","errorResponseSchema","listRolePermissionsQuerySchema","createRoute","errorResponseSchema","listRolePermissionsRoute","listRolePermissionsQuerySchema","listRolePermissionsResponseSchema","revokeRolePermissionRoute","IAM_ALL","OpenAPIHono","listRolePermissionsHandler","revokeRolePermissionHandler","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","sql","eq","and","sql","and","eq","and","eq","and","eq","and","eq","z","z","errorResponseSchema","createRoute","errorResponseSchema","IAM_ALL","OpenAPIHono","createRoute","OpenAPIHono","z","IAM_ALL","createRoute","z","OpenAPIHono","createRoute","OpenAPIHono","eq","eq","eq","eq","eq","eq","and","asc","desc","eq","ilike","or","sql","sortColumnMap","sql","eq","or","ilike","asc","desc","and","eq","sql","eq","sql","z","errorResponseSchema","createRoute","errorResponseSchema","IAM_ALL","tenantRoutesBase","OpenAPIHono","tenantRoutes","createRoute","OpenAPIHono","and","eq","eq","and","and","eq","and","eq","z","errorResponseSchema","createRoute","errorResponseSchema","IAM_ALL","OpenAPIHono","createRoute","OpenAPIHono","and","eq","sql","and","eq","sql","and","eq","sql","and","eq","sql","inviteUser","index","and","eq","and","eq","and","asc","desc","eq","gt","ilike","inArray","or","sql","sql","sortColumnMap","eq","or","ilike","asc","desc","and","inArray","gt","and","eq","ilike","or","eq","or","ilike","and","and","eq","inArray","sql","and","eq","sql","inArray","z","z","userIdParamSchema","errorResponseSchema","createRoute","userIdParamSchema","errorResponseSchema","IAM_ALL","OpenAPIHono","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","sql","eq","sql","and","z","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","OpenAPIHono","getCookie","OpenAPIHono","logger","createMiddleware","HTTPException","logger","createMiddleware","HTTPException","getCookie","getCookie","logger","routes"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/db/index.ts","../src/db/schema.ts","../src/handler.ts","../src/db/orm/session.ts","../src/db/orm/tenant.ts","../src/db/orm/user.ts","../src/lib/user-auth-select.ts","../src/lib/cookie.ts","../src/lib/crypto.ts","../src/lib/error-handler.ts","../src/routes/index.ts","../src/routes/auth/auth.route.ts","../src/routes/auth.schema.ts","../src/routes/auth/handler/check-account.ts","../src/lib/tenant.ts","../src/routes/auth/helper/verification.ts","../src/lib/normalize-auth-response.ts","../src/lib/session.ts","../src/routes/auth/handler/sign-in.ts","../src/errors.ts","../src/routes/auth/helper/session.ts","../src/routes/auth/helper/user.ts","../src/routes/auth/handler/sign-out.ts","../src/db/transaction.ts","../src/lib/phone-validation.ts","../src/routes/auth/handler/sign-up.ts","../src/routes/domains/domains.route.ts","../src/lib/has-role-permission.ts","../src/routes/domains/domains.schema.ts","../src/routes/domains/handler/create-domain.ts","../src/routes/domains/handler/delete-domain.ts","../src/routes/domains/handler/get-domain.ts","../src/routes/domains/handler/list-domains.ts","../src/routes/domains/handler/update-domain.ts","../src/routes/domains/handler/verify-domain.ts","../src/routes/email/email.route.ts","../src/routes/email/handler/verification-confirm.ts","../src/routes/email/handler/verification-request.ts","../src/routes/password/password.route.ts","../src/routes/password/handler/change.ts","../src/routes/password/handler/forgot.ts","../src/routes/password/handler/reset.ts","../src/routes/password/helper/session.ts","../src/routes/password/handler/set.ts","../src/routes/password/handler/verify.ts","../src/routes/permissions/permissions.route.ts","../src/routes/permissions/handler/get-permission.ts","../src/lib/permission-catalog.ts","../src/routes/permissions/handler/list-permissions.ts","../src/lib/iam-seed.ts","../src/routes/permissions/handler/seed-permissions.ts","../src/routes/permissions/permissions.schema.ts","../src/routes/phone/phone.route.ts","../src/routes/phone/handler/verification-confirm.ts","../src/routes/phone/helper/session.ts","../src/routes/phone/handler/verification-request.ts","../src/routes/profile/profile.route.ts","../src/routes/profile/handler/account-change-pending.ts","../src/lib/normalize-user.ts","../src/routes/profile/handler/me.ts","../src/routes/profile/handler/session.ts","../src/routes/profile/handler/update.ts","../src/routes/profile/handler/update-email.ts","../src/routes/profile/handler/update-phone.ts","../src/routes/role-permissions/role-permissions.route.ts","../src/routes/role-permissions/handler/assign-role-permission.ts","../src/routes/role-permissions/handler/list-role-permissions.ts","../src/routes/role-permissions/handler/revoke-role-permission.ts","../src/routes/role-permissions/role-permissions.schema.ts","../src/routes/roles/roles.route.ts","../src/routes/roles/handler/assign-role-permissions.ts","../src/routes/roles/handler/assign-role-users.ts","../src/routes/roles/handler/create-role.ts","../src/routes/roles/handler/delete-role.ts","../src/routes/roles/handler/get-role.ts","../src/routes/roles/handler/list-role-permissions.ts","../src/routes/roles/handler/list-role-users.ts","../src/routes/roles/handler/list-roles.ts","../src/routes/roles/handler/revoke-role-permission.ts","../src/routes/roles/handler/revoke-role-user.ts","../src/routes/roles/handler/seed-roles.ts","../src/routes/roles/handler/update-role.ts","../src/routes/roles/roles.schema.ts","../src/routes/sessions/sessions.route.ts","../src/routes/sessions/handler/get-session.ts","../src/routes/sessions/handler/list-sessions.ts","../src/routes/sessions/handler/revoke-all-sessions.ts","../src/routes/sessions/handler/revoke-session.ts","../src/routes/sessions/sessions.schema.ts","../src/routes/system/system.route.ts","../src/routes/system/handler/tenant.ts","../src/routes/tenants/tenants.route.ts","../src/routes/tenants/handler/create-tenant.ts","../src/routes/tenants/handler/delete-tenant.ts","../src/routes/tenants/handler/get-tenant.ts","../src/routes/tenants/handler/list-tenants.ts","../src/routes/tenants/handler/update-tenant.ts","../src/routes/tenants/tenants.schema.ts","../src/routes/user-roles/user-roles.route.ts","../src/routes/user-roles/handler/assign-user-role.ts","../src/routes/user-roles/handler/list-user-roles.ts","../src/routes/user-roles/handler/revoke-user-role.ts","../src/routes/user-roles/user-roles.schema.ts","../src/routes/users/users.route.ts","../src/routes/users/handler/ban-user.ts","../src/routes/users/helper/invite.ts","../src/routes/users/helper/user.ts","../src/routes/users/handler/bulk-invite-users.ts","../src/routes/users/handler/create-user.ts","../src/routes/users/handler/delete-user.ts","../src/routes/users/handler/get-user.ts","../src/routes/users/handler/invite-user.ts","../src/routes/users/handler/list-users.ts","../src/routes/users/handler/search-users.ts","../src/routes/users/handler/update-user.ts","../src/routes/users/users.schema.ts","../src/routes/verifications/verifications.route.ts","../src/routes/verifications/handler/invalidate-verification.ts","../src/routes/verifications/handler/list-verifications.ts","../src/routes/verifications/verifications.schema.ts","../src/utility/set-auth-context.ts","../src/lib/docs.ts","../src/lib/openapi-config.ts","../src/middlewares/session-middleware.ts","../src/middlewares/tenant-middleware.ts","../src/session.ts","../src/types/index.ts","../src/lib/cleanup.ts"],"sourcesContent":["import { deepmerge } from 'deepmerge-ts';\nimport { createDatabase } from './db';\nimport { createAuthRoutes } from './handler';\nimport { createDocsHandler } from './lib/docs';\nimport { createOpenApiConfig } from './lib/openapi-config';\nimport { createSessionMiddleware } from './middlewares/session-middleware';\nimport { createTenantMiddleware } from './middlewares/tenant-middleware';\nimport { createGetSession } from './session';\nimport { type AuthConfig, defaultAuthConfig, type MesobAuth } from './types';\n\nexport { createDatabase, type Database } from './db';\nexport type { Tenant } from './db/orm/tenant';\nexport {\n cleanupExpiredData,\n cleanupExpiredSessions,\n cleanupExpiredVerifications,\n} from './lib/cleanup';\nexport {\n hasPermission,\n hasPermissionThrow,\n} from './lib/has-role-permission';\nexport { createSessionMiddleware } from './middlewares/session-middleware';\nexport { createTenantMiddleware } from './middlewares/tenant-middleware';\nexport type { SessionStatus } from './session';\nexport type {\n AuthConfig,\n MesobAuth,\n SendInvitationParams,\n SendVerificationOTPParams,\n Session,\n User,\n} from './types';\n\nexport const createMesobAuth = (authConfig: AuthConfig): MesobAuth => {\n const config = deepmerge(\n { ...defaultAuthConfig } as Partial<AuthConfig>,\n authConfig,\n ) as AuthConfig;\n\n if (!config.secret || config.secret.length === 0) {\n throw new Error(\n 'AUTH_SECRET is required and must be a non-empty string. Please set AUTH_SECRET environment variable.',\n );\n }\n\n const database = createDatabase(config.connectionString);\n const routesApp = createAuthRoutes({ config, database });\n\n const basePath = config.basePath || '';\n const openApiPath = `${basePath}/openapi.json`;\n const enableDocs = config.docs?.enabled ?? true;\n\n // Add OpenAPI docs endpoints to routes if enabled\n if (enableDocs) {\n routesApp.doc('/openapi.json', createOpenApiConfig(config));\n routesApp.get(\n '/docs',\n createDocsHandler({\n title: config.docs?.title || 'Mesob IAM API Reference',\n theme: config.docs?.theme || 'saturn',\n openApiPath,\n }),\n );\n }\n\n const getSession = createGetSession(database, config);\n const tenantMiddleware = createTenantMiddleware(database, config);\n const sessionMiddleware = createSessionMiddleware();\n\n // Simple wrapper - no basePath stripping needed since it's handled by the mounting app\n const routes = routesApp;\n\n return {\n routes: routes as typeof routesApp,\n getSession,\n tenantMiddleware,\n sessionMiddleware,\n };\n};\n","import { drizzle } from 'drizzle-orm/node-postgres';\nimport { Pool } from 'pg';\nimport * as schema from './schema';\n\nconst schemaConfig = { schema: { ...schema } };\n\nexport const createDatabase = (connectionString: string) => {\n const pool = new Pool({ connectionString });\n return drizzle({ client: pool, ...schemaConfig });\n};\n\nexport type Database = ReturnType<typeof createDatabase>;\n","import { pgTable, pgSchema, index, foreignKey, pgPolicy, check, uuid, varchar, timestamp, text, smallint, unique, inet, jsonb, boolean, uniqueIndex } from \"drizzle-orm/pg-core\"\nimport { sql } from \"drizzle-orm\"\n\nexport const iam = pgSchema(\"iam\");\n\n\nexport const verificationsInIam = iam.table(\"verifications\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\tcode: text().notNull(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }).notNull(),\n\ttype: text(),\n\tattempt: smallint().default(0),\n\tto: text(),\n}, (table) => [\n\tindex(\"verifications_expires_at_idx\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"timestamptz_ops\")),\n\tindex(\"verifications_lookup_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.userId.asc().nullsLast().op(\"text_ops\"), table.type.asc().nullsLast().op(\"uuid_ops\"), table.to.asc().nullsLast().op(\"text_ops\"), table.code.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"verifications_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"verifications_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"verifications_attempt_nonnegative_check\", sql`attempt >= 0`),\n\tcheck(\"verifications_expires_after_created_check\", sql`expires_at > created_at`),\n]);\n\nexport const sessionsInIam = iam.table(\"sessions\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }).notNull(),\n\tuserAgent: text(\"user_agent\"),\n\tip: inet(),\n\tmeta: jsonb(),\n\ttoken: text().notNull(),\n\trotatedAt: timestamp(\"rotated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),\n}, (table) => [\n\tindex(\"sessions_expires_at_idx\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"timestamptz_ops\")),\n\tindex(\"sessions_tenant_user_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"uuid_ops\"), table.userId.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"sessions_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"sessions_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"sessions_token_key\").on(table.token),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"sessions_expires_after_created_check\", sql`expires_at > created_at`),\n]);\n\nexport const accountChangesInIam = iam.table(\"account_changes\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tchangeType: text(\"change_type\").notNull(),\n\toldEmail: varchar(\"old_email\"),\n\tnewEmail: varchar(\"new_email\"),\n\toldPhone: text(\"old_phone\"),\n\tnewPhone: text(\"new_phone\"),\n\tstatus: varchar().notNull(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }).notNull(),\n\tconfirmedAt: timestamp(\"confirmed_at\", { withTimezone: true, mode: 'string' }),\n\tcancelledAt: timestamp(\"cancelled_at\", { withTimezone: true, mode: 'string' }),\n\treason: text(),\n}, (table) => [\n\tindex(\"account_changes_expires_at_idx\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"timestamptz_ops\")),\n\tindex(\"account_changes_tenant_user_status_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"uuid_ops\"), table.userId.asc().nullsLast().op(\"text_ops\"), table.status.asc().nullsLast().op(\"uuid_ops\")),\n\tindex(\"idx_account_changes_expired\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"text_ops\"), table.status.asc().nullsLast().op(\"text_ops\")).where(sql`((status)::text = 'pending'::text)`),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"account_changes_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"account_changes_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"account_changes_expires_after_created_check\", sql`expires_at > created_at`),\n\tcheck(\"account_changes_change_type_check\", sql`((change_type = 'EMAIL'::text) AND (old_email IS NOT NULL) AND (new_email IS NOT NULL) AND (old_phone IS NULL) AND (new_phone IS NULL)) OR ((change_type = 'PHONE'::text) AND (old_phone IS NOT NULL) AND (new_phone IS NOT NULL) AND (old_email IS NULL) AND (new_email IS NULL))`),\n\tcheck(\"account_changes_status_check\", sql`(status)::text = ANY (ARRAY[('PENDING'::character varying)::text, ('APPLIED'::character varying)::text, ('CANCELLED'::character varying)::text, ('EXPIRED'::character varying)::text])`),\n]);\n\nexport const tenantsInIam = iam.table(\"tenants\", {\n\tid: varchar({ length: 30 }).primaryKey().notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tname: jsonb().notNull(),\n\tdescription: jsonb(),\n\ttheme: jsonb(),\n\tsupportedLanguages: jsonb(\"supported_languages\"),\n\tdefaultLanguage: text(\"default_language\"),\n\tsupportedCurrency: jsonb(\"supported_currency\"),\n\tdefaultCurrency: text(\"default_currency\"),\n\ttimezone: text(),\n\tisActive: boolean(\"is_active\").default(true).notNull(),\n\tlocale: jsonb(),\n\tsettings: jsonb(),\n\tseo: jsonb(),\n}, (table) => [\n\tindex(\"tenants_is_active_idx\").using(\"btree\", table.isActive.asc().nullsLast().op(\"bool_ops\")),\n]);\n\nexport const rolePermissionsInIam = iam.table(\"role_permissions\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tpermissionId: text(\"permission_id\").notNull(),\n\troleId: uuid(\"role_id\").notNull(),\n}, (table) => [\n\tindex(\"idx_role_permissions_permission_id\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.permissionId.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"role_permissions_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.permissionId],\n\t\t\tforeignColumns: [permissionsInIam.id],\n\t\t\tname: \"role_permissions_permission_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId, table.roleId],\n\t\t\tforeignColumns: [rolesInIam.tenantId, rolesInIam.id],\n\t\t\tname: \"role_permissions_tenant_role_fkey\"\n\t\t}).onDelete(\"cascade\"),\n\tunique(\"role_permissions_tenant_role_permission_unique\").on(table.tenantId, table.permissionId, table.roleId),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const permissionsInIam = iam.table(\"permissions\", {\n\tid: text().primaryKey().notNull(),\n\tdescription: jsonb().notNull(),\n\tactivity: text().notNull(),\n\tapplication: text().notNull(),\n\tfeature: text().notNull(),\n}, (table) => [\n\tunique(\"permissions_activity_application_feature_key\").on(table.activity, table.application, table.feature),\n]);\n\nexport const accountsInIam = iam.table(\"accounts\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\tprovider: text().notNull(),\n\tproviderAccountId: text(\"provider_account_id\").notNull(),\n\tpassword: text(),\n\tpasswordLastChangedAt: timestamp(\"password_last_changed_at\", { withTimezone: true, mode: 'string' }),\n\tidToken: text(\"id_token\"),\n\taccessToken: text(\"access_token\"),\n\taccessTokenExpiresAt: timestamp(\"access_token_expires_at\", { withTimezone: true, mode: 'string' }),\n\trefreshToken: text(\"refresh_token\"),\n\trefreshTokenExpiresAt: timestamp(\"refresh_token_expires_at\", { withTimezone: true, mode: 'string' }),\n\tscope: text(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }),\n\tmeta: jsonb(),\n}, (table) => [\n\tindex(\"idx_accounts_provider_lookup\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.provider.asc().nullsLast().op(\"text_ops\"), table.providerAccountId.asc().nullsLast().op(\"text_ops\")),\n\tindex(\"idx_accounts_user_id\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.userId.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"accounts_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"accounts_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"accounts_tenant_provider_account_unique\").on(table.tenantId, table.provider, table.providerAccountId),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const usersInIam = iam.table(\"users\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tfullName: text(\"full_name\").notNull(),\n\timage: text(),\n\tphone: text(),\n\temail: text(),\n\thandle: text().notNull(),\n\temailVerified: boolean(\"email_verified\").default(false).notNull(),\n\tphoneVerified: boolean(\"phone_verified\").default(false).notNull(),\n\tbannedUntil: timestamp(\"banned_until\", { withTimezone: true, mode: 'string' }),\n\tlastSignInAt: timestamp(\"last_sign_in_at\", { withTimezone: true, mode: 'string' }),\n\tloginAttempt: smallint(\"login_attempt\").default(0).notNull(),\n\tuserType: text(\"user_type\").array().default([\"RAY\"]).notNull(),\n}, (table) => [\n\tindex(\"idx_users_auth_lookup\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"bool_ops\"), table.email.asc().nullsLast().op(\"bool_ops\"), table.id.asc().nullsLast().op(\"timestamptz_ops\"), table.emailVerified.asc().nullsLast().op(\"timestamptz_ops\"), table.bannedUntil.asc().nullsLast().op(\"uuid_ops\")).where(sql`(email IS NOT NULL)`),\n\tindex(\"idx_users_email_lookup\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.email.asc().nullsLast().op(\"text_ops\")).where(sql`(email IS NOT NULL)`),\n\tindex(\"idx_users_handle_lookup\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.handle.asc().nullsLast().op(\"text_ops\")),\n\tindex(\"idx_users_phone_lookup\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.phone.asc().nullsLast().op(\"text_ops\")).where(sql`(phone IS NOT NULL)`),\n\tindex(\"idx_users_tenant_email_unique\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.email.asc().nullsLast().op(\"text_ops\")).where(sql`(email IS NOT NULL)`),\n\tindex(\"idx_users_tenant_is_admin\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\")).where(sql`(user_type @> ARRAY['admin'::text])`),\n\tindex(\"idx_users_tenant_is_candidate\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\")).where(sql`(user_type @> ARRAY['candidate'::text])`),\n\tindex(\"idx_users_tenant_is_employee\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\")).where(sql`(user_type @> ARRAY['employee'::text])`),\n\tindex(\"idx_users_user_types_gin\").using(\"gin\", table.userType.asc().nullsLast().op(\"array_ops\")),\n\tuniqueIndex(\"users_tenant_lower_email_idx\").using(\"btree\", sql`tenant_id`, sql`lower(email)`),\n\tuniqueIndex(\"users_tenant_lower_handle_idx\").using(\"btree\", sql`tenant_id`, sql`lower(handle)`),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"users_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"users_tenant_phone_key\").on(table.tenantId, table.phone),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"users_login_attempt_nonnegative_check\", sql`login_attempt >= 0`),\n\tcheck(\"users_contact_required_check\", sql`(email IS NOT NULL) OR (phone IS NOT NULL)`),\n\tcheck(\"users_user_type_check\", sql`user_type <@ ARRAY['candidate'::text, 'employee'::text, 'admin'::text]`),\n]);\n\nexport const rolesInIam = iam.table(\"roles\", {\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tname: jsonb().notNull(),\n\tdescription: jsonb().notNull(),\n\tcode: text().notNull(),\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\tisSystem: boolean(\"is_system\").default(false).notNull(),\n\tisEditable: boolean(\"is_editable\").default(true).notNull(),\n\tisDeletable: boolean(\"is_deletable\").default(true).notNull(),\n}, (table) => [\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"roles_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"roles_tenant_code_unique\").on(table.tenantId, table.code),\n\tunique(\"roles_tenant_id_unique\").on(table.tenantId, table.id),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const userRolesInIam = iam.table(\"user_roles\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\troleId: uuid(\"role_id\").notNull(),\n}, (table) => [\n\tindex(\"idx_user_roles_tenant_user\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.userId.asc().nullsLast().op(\"uuid_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"user_roles_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"user_roles_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId, table.roleId],\n\t\t\tforeignColumns: [rolesInIam.tenantId, rolesInIam.id],\n\t\t\tname: \"user_roles_tenant_role_fkey\"\n\t\t}).onDelete(\"cascade\"),\n\tunique(\"user_roles_tenant_user_role_unique\").on(table.tenantId, table.userId, table.roleId),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const domainsInIam = iam.table(\"domains\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tdomain: text().notNull(),\n\tstatus: text().default('pending').notNull(),\n\tmeta: jsonb(),\n\tisPrimary: boolean(\"is_primary\").default(false).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n}, (table) => [\n\tuniqueIndex(\"domains_domain_unique_idx\").using(\"btree\", sql`lower(domain)`),\n\tuniqueIndex(\"domains_primary_per_tenant_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\")).where(sql`(is_primary = true)`),\n\tindex(\"domains_tenant_status_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.status.asc().nullsLast().op(\"text_ops\")),\n\tindex(\"idx_domains_tenant_domain_status\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.domain.asc().nullsLast().op(\"text_ops\"), table.status.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"domains_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"domains_domain_format_check\", sql`domain ~ '^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)+$'::text`),\n\tcheck(\"domains_status_check\", sql`status = ANY (ARRAY['PENDING'::text, 'ACTIVE'::text, 'DISABLED'::text, 'DELETED'::text])`),\n]);\n","import { OpenAPIHono } from '@hono/zod-openapi';\nimport { getCookie } from 'hono/cookie';\nimport { fetchSessionByToken, fetchUserWithRoles } from './db/orm';\nimport { getSessionCookieName } from './lib/cookie';\nimport { hashToken } from './lib/crypto';\nimport { handleError } from './lib/error-handler';\nimport routes from './routes';\nimport type { AuthConfig, CreateAuthRoutesOptions, Database } from './types';\nimport type { AuthContext, AuthEnv } from './types/context';\nimport { setAuthContext } from './utility/set-auth-context';\n\nconst loadSession = async ({\n c,\n sessionToken,\n database,\n config,\n}: {\n c: AuthContext;\n sessionToken: string;\n database: Database;\n config: AuthConfig;\n}): Promise<void> => {\n try {\n const hashedToken = await hashToken(sessionToken, config.secret);\n const session = await fetchSessionByToken({\n database,\n hashedToken,\n tenantId: config.tenant?.tenantId || 'tenant',\n });\n if (!session) {\n return;\n }\n const user = await fetchUserWithRoles({\n database,\n userId: session.userId,\n tenantId: session.tenantId,\n });\n if (user) {\n setAuthContext({\n c,\n config,\n database,\n user,\n session,\n });\n }\n } catch {\n // Invalid session, continue without user\n }\n};\n\nconst createAuthMiddleware = ({\n config,\n database,\n}: {\n config: AuthConfig;\n database: Database;\n}) => {\n return async (c: AuthContext, next: () => Promise<void>) => {\n const path = c.req.path;\n const isDocsEndpoint = path === '/docs' || path === '/openapi.json';\n\n if (isDocsEndpoint) {\n setAuthContext({ c, config, database });\n return await next();\n }\n\n setAuthContext({ c, config, database });\n\n const sessionToken = getCookie(c, getSessionCookieName(config));\n if (sessionToken) {\n await loadSession({\n c,\n sessionToken,\n database,\n config,\n });\n }\n\n await next();\n };\n};\n\nexport const createAuthRoutes = ({\n config,\n database,\n}: CreateAuthRoutesOptions) => {\n const app = new OpenAPIHono<AuthEnv>();\n\n app.onError((error, c) => {\n return handleError(error, c);\n });\n\n app.use(\n '*',\n createAuthMiddleware({\n config,\n database,\n }),\n );\n\n app.route('/', routes);\n return app;\n};\n","import { and, eq, gt } from 'drizzle-orm';\nimport type { Session, SessionMeta } from '../../types';\nimport { sessionsInIam } from '../schema';\nimport type {\n DeleteSessionByTokenParams,\n DeleteSessionParams,\n DeleteUserSessionsParams,\n FetchSessionByTokenParams,\n UpdateSessionExpiryParams,\n} from './types';\n\nexport const fetchSessionByToken = async ({\n database,\n hashedToken,\n tenantId,\n}: FetchSessionByTokenParams): Promise<Session | null> => {\n const [sessionResult] = await database\n .select({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n meta: sessionsInIam.meta,\n })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.token, hashedToken),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n eq(sessionsInIam.tenantId, tenantId),\n ),\n )\n .limit(1);\n\n if (!sessionResult) {\n return null;\n }\n\n return {\n ...sessionResult,\n meta: sessionResult.meta as SessionMeta | null,\n };\n};\n\n/**\n * Update session expiry time (for session refresh)\n */\nexport const updateSessionExpiry = async ({\n database,\n sessionId,\n tenantId,\n expiresAt,\n}: UpdateSessionExpiryParams): Promise<void> => {\n await database\n .update(sessionsInIam)\n .set({\n expiresAt,\n updatedAt: new Date().toISOString(),\n })\n .where(\n and(\n eq(sessionsInIam.id, sessionId),\n eq(sessionsInIam.tenantId, tenantId),\n ),\n );\n};\n\n/**\n * Delete a session by ID\n */\nexport const deleteSession = async ({\n database,\n sessionId,\n tenantId,\n}: DeleteSessionParams): Promise<void> => {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.id, sessionId),\n eq(sessionsInIam.tenantId, tenantId),\n ),\n );\n};\n\n/**\n * Delete a session by hashed token\n */\nexport const deleteSessionByToken = async ({\n database,\n hashedToken,\n tenantId,\n}: DeleteSessionByTokenParams): Promise<void> => {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.token, hashedToken),\n eq(sessionsInIam.tenantId, tenantId),\n ),\n );\n};\n\n/**\n * Delete all sessions for a user\n */\nexport const deleteUserSessions = async ({\n database,\n userId,\n tenantId,\n}: DeleteUserSessionsParams): Promise<void> => {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.userId, userId),\n eq(sessionsInIam.tenantId, tenantId),\n ),\n );\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database } from '../index';\nimport { domainsInIam, tenantsInIam } from '../schema';\n\nexport const findTenantByDomain = async (\n database: Database,\n hostname: string,\n): Promise<string | null> => {\n const lowerHostname = hostname.toLowerCase();\n const [domain] = await database\n .select({\n tenantId: domainsInIam.tenantId,\n })\n .from(domainsInIam)\n .where(\n and(\n sql`lower(${domainsInIam.domain}) = ${lowerHostname}`,\n eq(domainsInIam.status, 'active'),\n ),\n )\n .limit(1);\n\n return domain?.tenantId || null;\n};\n\nexport type Tenant = {\n id: string;\n name: unknown;\n description: unknown;\n isActive: boolean;\n};\n\nexport const findTenantById = async (\n database: Database,\n tenantId: string,\n): Promise<Tenant | null> => {\n const [tenant] = await database\n .select({\n id: tenantsInIam.id,\n name: tenantsInIam.name,\n description: tenantsInIam.description,\n isActive: tenantsInIam.isActive,\n })\n .from(tenantsInIam)\n .where(eq(tenantsInIam.id, tenantId))\n .limit(1);\n\n return tenant || null;\n};\n","import { and, eq } from 'drizzle-orm';\nimport { getUserAuthSelect } from '../../lib/user-auth-select';\nimport type { User } from '../../types';\nimport { usersInIam } from '../schema';\nimport type { FetchUserWithRolesParams } from './types';\n\nexport const fetchUserWithRoles = async ({\n database,\n userId,\n tenantId,\n}: FetchUserWithRolesParams): Promise<User | null> => {\n const [userResult] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n bannedUntil: usersInIam.bannedUntil,\n ...getUserAuthSelect(tenantId),\n })\n .from(usersInIam)\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .limit(1);\n return (userResult as User) || null;\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport {\n permissionsInIam,\n rolePermissionsInIam,\n rolesInIam,\n userRolesInIam,\n usersInIam,\n} from '../db/schema';\n\nexport function getUserAuthSelect(tenantId: string) {\n return {\n roles: sql<string[] | null>`COALESCE(\n (\n select array_to_json(array_agg(distinct \"iam\".\"roles\".\"id\"))\n from ${userRolesInIam}\n inner join ${rolesInIam}\n on ${and(\n eq(rolesInIam.tenantId, userRolesInIam.tenantId),\n eq(rolesInIam.id, userRolesInIam.roleId),\n )}\n where ${and(\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.userId, usersInIam.id),\n )}\n ),\n '[]'::json\n )`,\n roleCodes: sql<string[] | null>`COALESCE(\n (\n select array_to_json(array_agg(distinct ${rolesInIam.code}))\n from ${userRolesInIam}\n inner join ${rolesInIam}\n on ${and(\n eq(rolesInIam.tenantId, userRolesInIam.tenantId),\n eq(rolesInIam.id, userRolesInIam.roleId),\n )}\n where ${and(\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.userId, usersInIam.id),\n )}\n ),\n '[]'::json\n )`,\n permissions: sql<string[] | null>`COALESCE(\n (\n select array_to_json(array_agg(distinct \"iam\".\"permissions\".\"id\"))\n from ${userRolesInIam}\n inner join ${rolePermissionsInIam}\n on ${and(\n eq(rolePermissionsInIam.tenantId, userRolesInIam.tenantId),\n eq(rolePermissionsInIam.roleId, userRolesInIam.roleId),\n )}\n inner join ${permissionsInIam}\n on ${eq(permissionsInIam.id, rolePermissionsInIam.permissionId)}\n where ${and(\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.userId, usersInIam.id),\n )}\n ),\n '[]'::json\n )`,\n };\n}\n","import type { Context } from 'hono';\nimport { deleteCookie as honoDel, setCookie as honoSet } from 'hono/cookie';\nimport type { AuthConfig } from '../types';\n\nconst isProduction = process.env.NODE_ENV === 'production';\n\nexport const getSessionCookieName = (config: AuthConfig): string => {\n const prefix = config.cookie?.prefix || '';\n const baseName = 'session_token';\n if (prefix) {\n return `${prefix}_${baseName}`;\n }\n return isProduction ? '__Host-session_token' : baseName;\n};\n\nexport type CookieOptions = {\n expires?: Date;\n path?: string;\n};\n\nexport const setSessionCookie = (\n c: Context,\n token: string,\n config: AuthConfig,\n options: CookieOptions,\n) => {\n const cookieName = getSessionCookieName(config);\n const cookieOptions = {\n httpOnly: true,\n secure: isProduction,\n sameSite: 'Lax' as const,\n path: options.path || '/',\n expires: options.expires,\n ...(isProduction && { domain: undefined }), // __Host- requires no domain\n };\n\n honoSet(c, cookieName, token, cookieOptions);\n};\n\nexport const deleteSessionCookie = (c: Context, config: AuthConfig) => {\n const cookieName = getSessionCookieName(config);\n honoDel(c, cookieName, {\n httpOnly: true,\n secure: isProduction,\n sameSite: 'Lax' as const,\n path: '/',\n expires: new Date(0),\n });\n};\n","import { scrypt } from '@noble/hashes/scrypt.js';\nimport { randomBytes } from '@noble/hashes/utils.js';\n\nconst encoder = new TextEncoder();\n\nconst randomHex = (bytes: number) => {\n const arr = randomBytes(bytes);\n return Array.from(arr, (b: number) => b.toString(16).padStart(2, '0')).join(\n '',\n );\n};\n\nconst toHex = (buffer: Uint8Array) => {\n return Array.from(buffer, (b: number) =>\n b.toString(16).padStart(2, '0'),\n ).join('');\n};\n\nconst hexToBytes = (hex: string): Uint8Array => {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = Number.parseInt(hex.slice(i, i + 2), 16);\n }\n return bytes;\n};\n\nconst SCRYPT_KEYLEN = 64;\nconst SCRYPT_COST = 16384;\nconst SCRYPT_BLOCK_SIZE = 8;\nconst SCRYPT_PARALLELISM = 1;\n\nexport const hashPassword = async (password: string) => {\n const salt = randomBytes(16);\n const saltHex = toHex(salt);\n const passwordBytes = encoder.encode(password);\n const derivedKey = await Promise.resolve(\n scrypt(passwordBytes, salt, {\n N: SCRYPT_COST,\n r: SCRYPT_BLOCK_SIZE,\n p: SCRYPT_PARALLELISM,\n dkLen: SCRYPT_KEYLEN,\n }),\n );\n return `${saltHex}:${toHex(derivedKey)}`;\n};\n\nexport const verifyPassword = async (\n password: string,\n hashed?: string | null,\n) => {\n if (!hashed) {\n return false;\n }\n const [saltHex, keyHex] = hashed.split(':');\n if (!(saltHex && keyHex)) {\n return false;\n }\n\n const salt = hexToBytes(saltHex);\n const passwordBytes = encoder.encode(password);\n const derivedKey = await Promise.resolve(\n scrypt(passwordBytes, salt, {\n N: SCRYPT_COST,\n r: SCRYPT_BLOCK_SIZE,\n p: SCRYPT_PARALLELISM,\n dkLen: SCRYPT_KEYLEN,\n }),\n );\n const derived = toHex(derivedKey);\n\n if (derived.length !== keyHex.length) {\n return false;\n }\n let result = 0;\n for (let i = 0; i < derived.length; i++) {\n result |= derived.charCodeAt(i) ^ keyHex.charCodeAt(i);\n }\n return result === 0;\n};\n\nexport const hashToken = async (token: string, secret: string) => {\n if (!secret || secret.length === 0) {\n throw new Error(\n 'AUTH_SECRET is required and must be a non-empty string. Please set AUTH_SECRET environment variable.',\n );\n }\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const signature = await crypto.subtle.sign(\n 'HMAC',\n key,\n encoder.encode(token),\n );\n return toHex(new Uint8Array(signature));\n};\n\nexport const generateToken = (bytes = 48) => randomHex(bytes);\n\nexport const hashVerificationCode = (code: string, secret: string) =>\n hashToken(code, secret);\n","import { logger } from '@mesob/common';\nimport type { Context } from 'hono';\nimport { HTTPException } from 'hono/http-exception';\n\ntype DatabaseError = {\n code?: string;\n message?: string;\n detail?: string;\n query?: string;\n parameters?: unknown[];\n};\n\nconst isDatabaseError = (error: unknown): error is DatabaseError => {\n if (typeof error !== 'object' || error === null) {\n return false;\n }\n\n if ('code' in error || 'query' in error || 'detail' in error) {\n return true;\n }\n\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('failed query') ||\n message.includes('relation') ||\n message.includes('column') ||\n message.includes('syntax error') ||\n message.includes('duplicate key') ||\n message.includes('foreign key') ||\n message.includes('null value')\n );\n }\n\n return false;\n};\n\nconst sanitizeDatabaseError = (error: DatabaseError): string => {\n const code = error.code;\n\n if (code === '23505') {\n return 'Resource already exists';\n }\n\n if (code === '23503') {\n return 'Referenced resource not found';\n }\n\n if (code === '23502') {\n return 'Required field is missing';\n }\n\n if (code === '42P01') {\n return 'Resource not found';\n }\n\n if (code === '42703') {\n return 'Invalid request';\n }\n\n if (code === '23514') {\n return 'Validation failed';\n }\n\n return 'An error occurred while processing your request';\n};\n\nconst isDatabaseErrorMessage = (message: string): boolean => {\n const lowerMessage = message.toLowerCase();\n return (\n lowerMessage.includes('failed query') ||\n lowerMessage.includes('select') ||\n lowerMessage.includes('insert') ||\n lowerMessage.includes('update') ||\n lowerMessage.includes('delete') ||\n lowerMessage.includes('from') ||\n lowerMessage.includes('where') ||\n lowerMessage.includes('limit') ||\n lowerMessage.includes('params:') ||\n lowerMessage.includes('query') ||\n message.includes('\"iam\".') ||\n message.includes('\"tenants\"') ||\n message.includes('\"users\"') ||\n message.includes('\"sessions\"') ||\n message.includes('\"accounts\"') ||\n lowerMessage.includes('relation') ||\n lowerMessage.includes('column') ||\n lowerMessage.includes('syntax error') ||\n lowerMessage.includes('database') ||\n lowerMessage.includes('postgres') ||\n lowerMessage.includes('sql')\n );\n};\n\nexport const handleError = (error: unknown, c: Context): Response => {\n logger.error('API Error:', {\n error,\n path: c.req.path,\n method: c.req.method,\n url: c.req.url,\n });\n\n if (error instanceof HTTPException) {\n const message = isDatabaseErrorMessage(error.message)\n ? 'An error occurred while processing your request'\n : error.message;\n return c.json({ error: message }, error.status);\n }\n\n if (isDatabaseError(error)) {\n const userMessage = sanitizeDatabaseError(error);\n logger.error('Database error details:', {\n code: error.code,\n message: error.message,\n detail: error.detail,\n query: error.query,\n parameters: error.parameters,\n });\n return c.json({ error: userMessage }, 500);\n }\n\n if (error instanceof Error) {\n const message = error.message;\n const lowerMessage = message.toLowerCase();\n\n // Check for any database/SQL related content\n const isDatabaseError =\n lowerMessage.includes('failed query') ||\n lowerMessage.includes('select') ||\n lowerMessage.includes('insert') ||\n lowerMessage.includes('update') ||\n lowerMessage.includes('delete') ||\n lowerMessage.includes('from') ||\n lowerMessage.includes('where') ||\n lowerMessage.includes('limit') ||\n lowerMessage.includes('params:') ||\n lowerMessage.includes('query') ||\n message.includes('\"iam\".') ||\n message.includes('\"tenants\"') ||\n message.includes('\"users\"') ||\n message.includes('\"sessions\"') ||\n message.includes('\"accounts\"') ||\n lowerMessage.includes('relation') ||\n lowerMessage.includes('column') ||\n lowerMessage.includes('syntax error') ||\n lowerMessage.includes('duplicate key') ||\n lowerMessage.includes('foreign key') ||\n lowerMessage.includes('null value') ||\n lowerMessage.includes('database') ||\n lowerMessage.includes('postgres') ||\n lowerMessage.includes('sql');\n\n if (isDatabaseError) {\n logger.error('SQL/database error detected:', {\n message: error.message,\n stack: error.stack,\n name: error.name,\n });\n return c.json(\n { error: 'An error occurred while processing your request' },\n 500,\n );\n }\n\n logger.error('Error details:', {\n message: error.message,\n stack: error.stack,\n name: error.name,\n });\n return c.json(\n { error: 'An error occurred while processing your request' },\n 500,\n );\n }\n\n logger.error('Unknown error:', error);\n return c.json(\n { error: 'An error occurred while processing your request' },\n 500,\n );\n};\n","import { OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../types/context';\nimport authRoutes from './auth/auth.route';\nimport domainRoutes from './domains/domains.route';\nimport emailRoutes from './email/email.route';\nimport passwordRoutes from './password/password.route';\nimport permissionRoutes from './permissions/permissions.route';\nimport phoneRoutes from './phone/phone.route';\nimport profileRoutes from './profile/profile.route';\nimport rolePermissionRoutes from './role-permissions/role-permissions.route';\nimport roleRoutes from './roles/roles.route';\nimport sessionRoutes from './sessions/sessions.route';\nimport tenantRoutes from './system/system.route';\nimport tenantsRoutes from './tenants/tenants.route';\nimport userRoleRoutes from './user-roles/user-roles.route';\nimport userRoutes from './users/users.route';\nimport verificationRoutes from './verifications/verifications.route';\n\nconst routes = new OpenAPIHono<AuthEnv>()\n .route('/', authRoutes)\n .route('/', profileRoutes)\n .route('/password', passwordRoutes)\n .route('/email', emailRoutes)\n .route('/phone', phoneRoutes)\n .route('/users', userRoutes)\n .route('/system', tenantRoutes)\n .route('/tenants', tenantsRoutes)\n .route('/domains', domainRoutes)\n .route('/roles', roleRoutes)\n .route('/permissions', permissionRoutes)\n .route('/role-permissions', rolePermissionRoutes)\n .route('/user-roles', userRoleRoutes)\n .route('/sessions', sessionRoutes)\n .route('/verifications', verificationRoutes);\n\nexport default routes;\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport {\n checkAccountResponseSchema,\n checkAccountSchema,\n errorResponseSchema,\n messageSchema,\n signInResponseSchema,\n signInSchema,\n signUpResponseSchema,\n signUpSchema,\n} from '../auth.schema';\nimport { checkAccountHandler } from './handler/check-account';\nimport { signInHandler } from './handler/sign-in';\nimport { signOutHandler } from './handler/sign-out';\nimport { signUpHandler } from './handler/sign-up';\n\nexport const signUpRoute = createRoute({\n method: 'post',\n path: '/sign-up',\n tags: ['Auth'],\n summary: 'Sign up with email or phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: signUpSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: signUpResponseSchema,\n },\n },\n description: 'Account created',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid request',\n },\n 403: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Authentication method disabled',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User already exists',\n },\n },\n});\n\nexport const signInRoute = createRoute({\n method: 'post',\n path: '/sign-in',\n tags: ['Auth'],\n summary: 'Sign in with email or phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: signInSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: signInResponseSchema,\n },\n },\n description: 'Signed in',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid credentials',\n },\n },\n});\n\nexport const checkAccountRoute = createRoute({\n method: 'post',\n path: '/check-account',\n tags: ['Auth'],\n summary: 'Check if account exists',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: checkAccountSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: checkAccountResponseSchema,\n },\n },\n description: 'Account check result',\n },\n },\n});\n\nexport const signOutRoute = createRoute({\n method: 'post',\n path: '/sign-out',\n tags: ['Auth'],\n summary: 'Sign out current session',\n responses: {\n 200: {\n content: { 'application/json': { schema: messageSchema } },\n description: 'Signed out',\n },\n },\n});\n\nconst authRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(signUpRoute, signUpHandler)\n .openapi(signInRoute, signInHandler)\n .openapi(checkAccountRoute, checkAccountHandler)\n .openapi(signOutRoute, signOutHandler);\n\nexport default authRoutes;\n","import { z } from 'zod';\n\nconst emailField = z\n .string()\n .trim()\n .email('Invalid email address')\n .max(255, 'Email too long');\n\nconst phoneField = z\n .string()\n .trim()\n .min(6, 'Phone too short')\n .max(30, 'Phone too long')\n .regex(/^[+()\\d\\s-]+$/, 'Invalid phone number format');\n\nconst passwordField = z\n .string()\n .min(8, 'Password must be at least 8 characters')\n .max(128, 'Password too long');\n\nconst identifierField = z.string().trim().min(1, 'Identifier is required');\n\nexport const userSchema = z.object({\n id: z.string().uuid(),\n tenantId: z.string(),\n fullName: z.string(),\n email: z.string().email().nullable(),\n phone: z.string().nullable(),\n handle: z.string(),\n image: z.string().nullable(),\n emailVerified: z.boolean(),\n phoneVerified: z.boolean(),\n lastSignInAt: z.string().datetime().nullable(),\n bannedUntil: z.string().datetime().nullable().optional(),\n createdAt: z.string().datetime().nullable().optional(),\n userType: z.array(z.string()).optional(),\n roles: z.array(z.string()).nullable().optional(),\n roleCodes: z.array(z.string()).nullable().optional(),\n userRoles: z\n .array(\n z.object({\n code: z.string(),\n name: z.record(z.string(), z.string()),\n }),\n )\n .nullable()\n .optional(),\n activeSessionCount: z.number().int().min(0).optional(),\n permissions: z.array(z.string()).nullable().optional(),\n});\n\nexport const sessionSchema = z.object({\n id: z.string().uuid(),\n expiresAt: z.string().datetime(),\n createdAt: z.string().datetime().optional(),\n userAgent: z.string().nullable().optional(),\n ip: z.string().nullable().optional(),\n});\n\nexport const authUserSchema = z.object({\n id: z.string().uuid(),\n tenantId: z.string(),\n fullName: z.string(),\n email: z.string().email().nullable(),\n phone: z.string().nullable(),\n image: z.string().nullable(),\n emailVerified: z.boolean(),\n phoneVerified: z.boolean(),\n});\n\nexport const authSessionSchema = z.object({\n id: z.string().uuid(),\n expiresAt: z.string().datetime(),\n});\n\nexport const authSuccessSchema = z.object({\n user: authUserSchema,\n session: authSessionSchema.nullable(),\n sessionToken: z.string().optional(),\n sessionExpiresAt: z.string().datetime().optional(),\n});\n\nexport const authAccountSchema = z.object({\n fullName: z.string(),\n email: z.string().email().nullable(),\n phone: z.string().nullable(),\n verified: z.boolean(),\n hasPassword: z.boolean(),\n requiresPasswordSetup: z.boolean(),\n});\n\nexport const messageSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string().describe('Error message'),\n code: z.string().optional().describe('Error code'),\n details: z.record(z.string(), z.any()).optional(),\n});\n\nexport const signUpSchema = z\n .object({\n email: emailField.optional(),\n phone: phoneField.optional(),\n password: passwordField,\n fullName: z.string().min(2),\n image: z.string().url().optional(),\n /** Keep me signed in for longer. Default: true */\n rememberMe: z.boolean().default(true),\n })\n .refine((data) => data.email || data.phone, {\n message: 'Either email or phone is required',\n path: ['email'],\n });\n\nexport const signInSchema = z.object({\n identifier: identifierField,\n password: passwordField,\n /** Keep me signed in for longer. Default: true */\n rememberMe: z.boolean().default(true),\n});\n\nexport const setPasswordSchema = z.object({\n identifier: identifierField,\n password: passwordField,\n /** Keep me signed in for longer. Default: true */\n rememberMe: z.boolean().default(true),\n});\n\nexport const signUpResponseSchema = authSuccessSchema.extend({\n verificationId: z.string().uuid().optional(),\n requiresVerification: z.boolean().optional(),\n debugCode: z.string().optional(),\n});\n\nexport const signInResponseSchema = authSuccessSchema.extend({\n verificationId: z.string().uuid().optional(),\n requiresVerification: z.boolean().optional(),\n});\n\nexport const emailVerificationRequestSchema = z.object({\n email: emailField.optional(),\n});\n\nexport const emailVerificationConfirmSchema = z.object({\n verificationId: z.string().uuid(),\n code: z.string().length(6),\n});\n\nexport const phoneVerificationRequestSchema = z.object({\n phone: phoneField,\n context: z.enum(['sign-up', 'sign-in', 'change-phone']),\n});\n\nexport const phoneVerificationConfirmSchema = z.object({\n verificationId: z.string().uuid(),\n code: z.string(),\n context: z.enum(['sign-up', 'sign-in', 'change-phone']),\n});\n\nexport const forgotPasswordSchema = z.object({\n identifier: z.string(),\n});\n\nexport const resetPasswordSchema = z.object({\n verificationId: z.string().uuid(),\n code: z.string(),\n password: passwordField,\n});\n\nexport const changePasswordSchema = z.object({\n currentPassword: passwordField,\n newPassword: passwordField,\n});\n\nexport const verifyPasswordSchema = z.object({\n password: passwordField,\n});\n\nexport const messageWithVerificationIdSchema = messageSchema.extend({\n verificationId: z.string().uuid().optional(),\n});\n\nexport const checkAccountSchema = z.object({\n username: identifierField,\n});\n\nexport const checkAccountResponseSchema = z.object({\n exists: z.boolean(),\n verified: z.boolean(),\n hasPassword: z.boolean(),\n requiresPasswordSetup: z.boolean(),\n needsVerification: z.boolean().optional(),\n verificationId: z.string().uuid().optional(),\n account: authAccountSchema.nullable(),\n});\n\nexport const updateProfileSchema = z.object({\n fullName: z.string().min(1).max(255).optional().describe('User full name'),\n});\n\nexport const updateEmailSchema = z.object({\n email: z.string().email().describe('New email address'),\n});\n\nexport const updatePhoneSchema = z.object({\n phone: z.string().min(6).max(30).describe('New phone number'),\n});\n\nexport const profileResponseSchema = z.object({\n user: userSchema.describe('Updated user'),\n});\n\nexport const pendingAccountChangeSchema = z.object({\n changeType: z.enum(['email', 'phone']),\n newEmail: z.string().email().nullable(),\n newPhone: z.string().nullable(),\n expiresAt: z.string().datetime(),\n});\n\nexport const pendingAccountChangeResponseSchema = z.object({\n accountChange: pendingAccountChangeSchema.nullable(),\n verificationId: z.string().uuid().nullable(),\n});\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { accountsInIam, usersInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { checkAccountRoute } from '../auth.route';\nimport { ensureVerificationForCheckAccount } from '../helper/verification';\n\nexport const checkAccountHandler: RouteHandler<\n typeof checkAccountRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { username } = body;\n\n const isEmail = username.includes('@');\n const disabledChannelResponse = {\n exists: false,\n verified: false,\n hasPassword: false,\n requiresPasswordSetup: false,\n account: null,\n };\n if (isEmail && !config.email.enabled) {\n return c.json(disabledChannelResponse, 200);\n }\n if (!(isEmail || config.phone.enabled)) {\n return c.json(disabledChannelResponse, 200);\n }\n const userTypeFilter = sql`${usersInIam.userType} @> ARRAY[${config.userType}]::text[]`;\n const whereClause = isEmail\n ? and(\n eq(usersInIam.tenantId, resolvedTenantId),\n userTypeFilter,\n sql`lower(${usersInIam.email}) = lower(${username})`,\n )\n : and(\n eq(usersInIam.tenantId, resolvedTenantId),\n userTypeFilter,\n eq(usersInIam.phone, username),\n );\n\n const [result] = await database\n .select({\n id: usersInIam.id,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n verified: isEmail ? usersInIam.emailVerified : usersInIam.phoneVerified,\n hasPassword: sql<boolean>`exists(\n select 1\n from ${accountsInIam}\n where ${eq(accountsInIam.tenantId, resolvedTenantId)}\n and ${eq(accountsInIam.userId, usersInIam.id)}\n and ${eq(accountsInIam.provider, 'credentials')}\n and ${sql`${accountsInIam.password} is not null`}\n )`,\n })\n .from(usersInIam)\n .where(whereClause)\n .limit(1);\n\n const verified = result?.verified ?? false;\n const hasPassword = result?.hasPassword ?? false;\n\n let needsVerification = false;\n let verificationId: string | undefined;\n if (result && !verified) {\n const type = isEmail ? 'email-verification' : 'phone-otp';\n const to = isEmail\n ? (result.email ?? username)\n : (result.phone ?? username);\n if (to) {\n const { verificationId: vid } = await ensureVerificationForCheckAccount({\n database,\n tenantId: resolvedTenantId,\n userId: result.id,\n type,\n to,\n config,\n });\n needsVerification = true;\n verificationId = vid;\n }\n }\n\n return c.json(\n {\n exists: !!result,\n verified,\n hasPassword,\n requiresPasswordSetup: !!result && verified && !hasPassword,\n ...(needsVerification && verificationId\n ? { needsVerification: true, verificationId }\n : {}),\n account: result\n ? {\n fullName: result.fullName,\n email: result.email,\n phone: result.phone,\n verified,\n hasPassword,\n requiresPasswordSetup: verified && !hasPassword,\n }\n : null,\n },\n 200,\n );\n};\n","import { HTTPException } from 'hono/http-exception';\nimport type { AuthConfig } from '../types';\n\nexport const ensureTenantId = (\n config: AuthConfig,\n tenantId: string | undefined,\n): string => {\n const enableTenant = config.tenant?.enabled ?? true;\n if (enableTenant) {\n if (!tenantId) {\n throw new HTTPException(400, {\n message: 'Missing tenantId. Tenant isolation is enabled.',\n });\n }\n return tenantId;\n }\n\n // When tenant is disabled, use tenantId from config\n if (!config.tenant?.tenantId) {\n throw new HTTPException(500, {\n message:\n 'tenantId must be provided in config.tenant when tenant.enabled is false.',\n });\n }\n return config.tenant.tenantId;\n};\n","import { dayjs } from '@mesob/common';\nimport { and, desc, eq, gt } from 'drizzle-orm';\nimport type { Database } from '../../../db';\nimport { verificationsInIam } from '../../../db/schema';\nimport { hashToken } from '../../../lib/crypto';\nimport { normalizeAuthUser } from '../../../lib/normalize-auth-response';\nimport {\n addDuration,\n generateOtpCode,\n parseDuration,\n} from '../../../lib/session';\nimport type { AuthConfig } from '../../../types';\nimport type {\n CreateVerificationParams,\n HandleVerificationParams,\n SendVerificationParams,\n} from '../auth.types';\n\nexport const createVerification = async ({\n tx,\n tenantId,\n userId,\n type,\n to,\n config,\n}: CreateVerificationParams): Promise<{\n verificationId: string;\n code: string;\n hash: string;\n}> => {\n const isPhone = type === 'phone-otp-sign-up';\n const code = generateOtpCode(\n isPhone ? config.phone.otpLength : config.email.otpLength,\n );\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(\n isPhone ? config.phone.expiresIn : config.email.expiresIn,\n );\n\n const [verification] = await tx\n .insert(verificationsInIam)\n .values({\n tenantId,\n userId,\n type,\n code: hashedCode,\n expiresAt,\n to,\n attempt: 0,\n })\n .returning();\n\n return { verificationId: verification.id, code, hash: hashedCode };\n};\n\nexport const sendVerification = async ({\n channel,\n to,\n code,\n config,\n hash,\n type,\n}: SendVerificationParams & { hash: string; type: string }) => {\n if (channel === 'phone' && config.phone.sendVerificationOTP) {\n await config.phone.sendVerificationOTP({\n phone: to,\n code,\n hash,\n type,\n });\n } else if (config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email: to,\n code,\n hash,\n type,\n });\n }\n};\n\ntype VerificationResendCheckParams = {\n database: Database;\n tenantId: string;\n userId: string;\n type: string;\n resendInterval?: string;\n};\n\ntype VerificationResendCheckResult = {\n blocked: boolean;\n verificationId?: string;\n};\n\nexport const checkVerificationResend = async ({\n database,\n tenantId,\n userId,\n type,\n resendInterval,\n}: VerificationResendCheckParams): Promise<VerificationResendCheckResult> => {\n if (!resendInterval) {\n return { blocked: false };\n }\n\n const [verification] = await database\n .select({\n id: verificationsInIam.id,\n createdAt: verificationsInIam.createdAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, type),\n ),\n )\n .orderBy(desc(verificationsInIam.createdAt))\n .limit(1);\n\n if (!verification) {\n return { blocked: false };\n }\n\n const cooldownSeconds = parseDuration(resendInterval);\n const createdAt = dayjs(verification.createdAt);\n const blocked = dayjs().diff(createdAt, 'second') < cooldownSeconds;\n return { blocked, verificationId: verification.id };\n};\n\nexport type EnsureVerificationForCheckAccountParams = {\n database: Database;\n tenantId: string;\n userId: string;\n type: 'email-verification' | 'phone-otp';\n to: string;\n config: AuthConfig;\n};\n\n/** Returns existing non-expired verification id, or creates/sends new and returns it. */\nexport const ensureVerificationForCheckAccount = async ({\n database,\n tenantId,\n userId,\n type,\n to,\n config,\n}: EnsureVerificationForCheckAccountParams): Promise<{\n verificationId: string;\n}> => {\n const now = new Date().toISOString();\n const [existing] = await database\n .select({\n id: verificationsInIam.id,\n expiresAt: verificationsInIam.expiresAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, type),\n gt(verificationsInIam.expiresAt, now),\n ),\n )\n .orderBy(desc(verificationsInIam.createdAt))\n .limit(1);\n\n if (existing) {\n return { verificationId: existing.id };\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, type),\n ),\n );\n\n const isPhone = type === 'phone-otp';\n const code = generateOtpCode(\n isPhone ? config.phone.otpLength : config.email.otpLength,\n );\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(\n isPhone ? config.phone.expiresIn : config.email.expiresIn,\n );\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId,\n userId,\n type,\n code: hashedCode,\n expiresAt,\n to,\n attempt: 0,\n })\n .returning();\n\n if (isPhone && config.phone.sendVerificationOTP) {\n await config.phone.sendVerificationOTP({\n phone: to,\n code,\n hash: hashedCode,\n type,\n });\n } else if (!isPhone && config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email: to,\n code,\n hash: hashedCode,\n type,\n });\n }\n\n return { verificationId: verification.id };\n};\n\nexport const handleEmailVerification = async ({\n c,\n user,\n config,\n database,\n tenantId,\n}: HandleVerificationParams) => {\n if (!user.email) {\n return c.json({ error: 'User email not found' }, 401);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, user.id),\n eq(verificationsInIam.type, 'email-verification'),\n ),\n );\n\n const code = generateOtpCode(config.email.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId,\n userId: user.id,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: user.email,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n\n if (config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email: user.email,\n code,\n hash: hashedCode,\n type: 'email-verification',\n });\n }\n\n return c.json(\n {\n user: normalizeAuthUser(user),\n session: null,\n verificationId: verification.id,\n requiresVerification: true,\n },\n 200,\n );\n};\n\nexport const handlePhoneVerification = async ({\n c,\n user,\n config,\n database,\n tenantId,\n}: HandleVerificationParams) => {\n if (!user.phone) {\n return c.json({ error: 'User phone not found' }, 401);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, user.id),\n eq(verificationsInIam.type, 'phone-otp'),\n ),\n );\n\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId,\n userId: user.id,\n type: 'phone-otp',\n code: hashedCode,\n expiresAt,\n to: user.phone,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n\n if (config.phone.sendVerificationOTP) {\n await config.phone.sendVerificationOTP({\n phone: user.phone,\n code,\n hash: hashedCode,\n type: 'phone-otp',\n });\n }\n\n return c.json(\n {\n user: normalizeAuthUser(user),\n session: null,\n verificationId: verification.id,\n requiresVerification: true,\n },\n 200,\n );\n};\n","import type { Session, User } from '../types';\n\nexport const normalizeAuthUser = (\n user: Pick<\n User,\n | 'id'\n | 'tenantId'\n | 'fullName'\n | 'email'\n | 'phone'\n | 'image'\n | 'emailVerified'\n | 'phoneVerified'\n >,\n) => ({\n id: user.id,\n tenantId: user.tenantId,\n fullName: user.fullName,\n email: user.email,\n phone: user.phone,\n image: user.image,\n emailVerified: user.emailVerified,\n phoneVerified: user.phoneVerified,\n});\n\nexport const normalizeAuthSession = (\n session: Pick<Session, 'id' | 'expiresAt'> | null,\n) =>\n session\n ? {\n id: session.id,\n expiresAt: session.expiresAt,\n }\n : null;\n","import { dayjs } from '@mesob/common';\nimport { nanoid } from 'nanoid';\nimport type { SessionConfig } from '../types';\n\nexport const generateHandle = (): string => {\n return nanoid(10);\n};\n\nexport const getSessionExpiresAt = (days = 30) =>\n dayjs().add(days, 'day').toISOString();\n\nexport const parseDuration = (duration: string): number => {\n const match = duration.match(/^(\\d+)([smhd])$/);\n if (!(match?.[1] && match[2])) {\n throw new Error(`Invalid duration format: ${duration}`);\n }\n const value = Number.parseInt(match[1], 10);\n const unit = match[2];\n const multipliers: Record<string, number> = {\n s: 1,\n m: 60,\n h: 3600,\n d: 86400,\n };\n return value * (multipliers[unit] || 1);\n};\n\nexport const addDuration = (duration: string): string => {\n const seconds = parseDuration(duration);\n return dayjs().add(seconds, 'second').toISOString();\n};\n\nexport const generateOtpCode = (length = 6): string => {\n const digits = '0123456789';\n const maxValid = 250; // largest multiple of 10 <= 255 to avoid modulo bias\n let code = '';\n\n while (code.length < length) {\n const randomValues = new Uint8Array(length - code.length);\n crypto.getRandomValues(randomValues);\n for (const val of randomValues) {\n if (val < maxValid && code.length < length) {\n code += digits[val % 10];\n }\n }\n }\n return code;\n};\n\n/**\n * Get session expiration duration based on rememberMe option\n */\nexport const getSessionDuration = ({\n sessionConfig,\n rememberMe,\n}: {\n sessionConfig: SessionConfig;\n rememberMe: boolean;\n}): string => {\n if (rememberMe) {\n return sessionConfig.rememberMeExpiresIn;\n }\n return sessionConfig.shortSessionExpiresIn;\n};\n\n/**\n * Get the update age threshold based on session type\n */\nexport const getSessionUpdateAge = ({\n sessionConfig,\n rememberMe,\n}: {\n sessionConfig: SessionConfig;\n rememberMe: boolean;\n}): string => {\n if (rememberMe) {\n return sessionConfig.updateAge;\n }\n return sessionConfig.shortSessionUpdateAge;\n};\n\n/**\n * Check if session needs refresh based on remaining time\n */\nexport const shouldRefreshSession = ({\n expiresAt,\n updateAge,\n}: {\n expiresAt: string;\n updateAge: string;\n}): boolean => {\n const updateAgeSeconds = parseDuration(updateAge);\n const now = dayjs();\n const expires = dayjs(expiresAt);\n const remainingSeconds = expires.diff(now, 'second');\n\n return remainingSeconds > 0 && remainingSeconds <= updateAgeSeconds;\n};\n\n/**\n * Get new expiration time for session refresh\n */\nexport const getRefreshedExpiresAt = ({\n sessionConfig,\n rememberMe,\n}: {\n sessionConfig: SessionConfig;\n rememberMe: boolean;\n}): string => {\n const duration = getSessionDuration({ sessionConfig, rememberMe });\n return addDuration(duration);\n};\n\n/**\n * Check if session is expired\n */\nexport const isSessionExpired = (expiresAt: string): boolean => {\n return dayjs(expiresAt).isBefore(dayjs());\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { logger } from '@mesob/common';\nimport { and, eq } from 'drizzle-orm';\nimport { accountsInIam, sessionsInIam, usersInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { generateToken, hashToken, verifyPassword } from '../../../lib/crypto';\nimport {\n normalizeAuthSession,\n normalizeAuthUser,\n} from '../../../lib/normalize-auth-response';\nimport { addDuration, getSessionDuration } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { signInRoute } from '../auth.route';\nimport { cleanupOldSessions } from '../helper/session';\nimport { fetchUserByIdWithRoles, fetchUserForLogin } from '../helper/user';\nimport {\n handleEmailVerification,\n handlePhoneVerification,\n} from '../helper/verification';\n\nexport const signInHandler: RouteHandler<typeof signInRoute, AuthEnv> =\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: auth flow combines lockout, verification, and session creation\n async function signInHandler(c) {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { identifier, password, rememberMe = true } = body;\n\n const isEmail = identifier.includes('@');\n\n if (isEmail && !config.email.enabled) {\n return c.json({ error: 'Email authentication is disabled' }, 401);\n }\n\n if (!(isEmail || config.phone.enabled)) {\n return c.json({ error: 'Phone authentication is disabled' }, 401);\n }\n const user = await fetchUserForLogin({\n database,\n identifier,\n tenantId: resolvedTenantId,\n isEmail,\n userType: config.userType,\n });\n\n if (!user) {\n logger.log('[sign-in] 401: user not found', {\n identifier,\n tenantId: resolvedTenantId,\n userType: config.userType,\n });\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n if (user.bannedUntil && new Date(user.bannedUntil) > new Date()) {\n logger.log('[sign-in] 401: account banned', {\n userId: user.id,\n bannedUntil: user.bannedUntil,\n });\n return c.json(\n {\n error: 'Account locked. Try again later.',\n bannedUntil: user.bannedUntil,\n },\n 401,\n );\n }\n\n const [account] = await database\n .select({\n id: accountsInIam.id,\n tenantId: accountsInIam.tenantId,\n userId: accountsInIam.userId,\n provider: accountsInIam.provider,\n providerAccountId: accountsInIam.providerAccountId,\n password: accountsInIam.password,\n })\n .from(accountsInIam)\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, user.id),\n eq(accountsInIam.provider, 'credentials'),\n ),\n )\n .limit(1);\n\n if (!account?.password) {\n logger.log('[sign-in] 401: no credentials account', { userId: user.id });\n return c.json({ error: AUTH_ERRORS.HAS_NO_PASSWORD }, 401);\n }\n\n const passwordValid = await verifyPassword(password, account.password);\n if (!passwordValid) {\n const newAttempt = (user.loginAttempt || 0) + 1;\n const updateData: {\n loginAttempt: number;\n bannedUntil?: string | null;\n } = {\n loginAttempt: newAttempt,\n };\n\n if (config.security && newAttempt >= config.security.maxLoginAttempts) {\n updateData.bannedUntil = addDuration(config.security.lockoutDuration);\n }\n\n await database\n .update(usersInIam)\n .set(updateData)\n .where(\n and(\n eq(usersInIam.id, user.id),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n );\n\n logger.log('[sign-in] 401: invalid password', {\n userId: user.id,\n loginAttempt: newAttempt,\n });\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const isVerified = isEmail ? user.emailVerified : user.phoneVerified;\n\n if (isEmail && config.email.required && !isVerified) {\n return handleEmailVerification({\n c,\n user: { ...user, roles: [] },\n config,\n database,\n tenantId: resolvedTenantId,\n });\n }\n\n if (!isEmail && config.phone.required && !isVerified) {\n return handlePhoneVerification({\n c,\n user: { ...user, roles: [] },\n config,\n database,\n tenantId: resolvedTenantId,\n });\n }\n\n if (config.session.maxPerUser) {\n await cleanupOldSessions({\n database,\n userId: user.id,\n tenantId: resolvedTenantId,\n maxSessions: config.session.maxPerUser,\n });\n }\n\n await database\n .update(usersInIam)\n .set({ lastSignInAt: new Date().toISOString(), loginAttempt: 0 })\n .where(\n and(\n eq(usersInIam.id, user.id),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n );\n\n const sessionToken = generateToken();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const sessionDuration = getSessionDuration({\n sessionConfig: config.session,\n rememberMe,\n });\n const expiresAt = addDuration(sessionDuration);\n\n const [session] = await database\n .insert(sessionsInIam)\n .values({\n tenantId: resolvedTenantId,\n userId: user.id,\n token: hashedToken,\n expiresAt,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n meta: { action: 'sign-in', rememberMe },\n })\n .returning({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n meta: sessionsInIam.meta,\n });\n setSessionCookie(c, sessionToken, config, {\n expires: new Date(expiresAt),\n });\n\n const fullUser = await fetchUserByIdWithRoles({\n database,\n userId: user.id,\n tenantId: resolvedTenantId,\n });\n\n return c.json(\n {\n user: normalizeAuthUser(fullUser ?? { ...user, roles: [] }),\n session: normalizeAuthSession({\n id: session.id,\n expiresAt: session.expiresAt,\n }),\n sessionExpiresAt: session.expiresAt,\n },\n 200,\n );\n };\n","export const AUTH_ERRORS = {\n USER_NOT_FOUND: 'USER_NOT_FOUND',\n INVALID_PASSWORD: 'INVALID_PASSWORD',\n USER_EXISTS: 'USER_EXISTS',\n VERIFICATION_EXPIRED: 'VERIFICATION_EXPIRED',\n VERIFICATION_MISMATCH: 'VERIFICATION_MISMATCH',\n VERIFICATION_NOT_FOUND: 'VERIFICATION_NOT_FOUND',\n TOO_MANY_ATTEMPTS: 'TOO_MANY_ATTEMPTS',\n REQUIRES_VERIFICATION: 'REQUIRES_VERIFICATION',\n UNAUTHORIZED: 'UNAUTHORIZED',\n ACCESS_DENIED: 'ACCESS_DENIED',\n HAS_NO_PASSWORD: 'HAS_NO_PASSWORD',\n PASSWORD_ALREADY_SET: 'PASSWORD_ALREADY_SET',\n} as const;\n\nexport type AuthError = (typeof AUTH_ERRORS)[keyof typeof AUTH_ERRORS];\n","import { and, asc, eq, gt, inArray, sql } from 'drizzle-orm';\nimport { sessionsInIam } from '../../../db/schema';\nimport type { TransactionClient } from '../../../db/transaction';\nimport { generateToken, hashToken } from '../../../lib/crypto';\nimport { addDuration, getSessionDuration } from '../../../lib/session';\nimport type { AuthConfig, SessionMeta } from '../../../types';\nimport type {\n CleanupOldSessionsParams,\n CreateSessionParams,\n} from '../auth.types';\n\ntype CreateSessionRecordParams = {\n tx: TransactionClient;\n tenantId: string;\n userId: string;\n config: AuthConfig;\n userAgent: string | null;\n ip: string | null;\n action: string;\n rememberMe?: boolean;\n expiresIn?: string;\n};\n\nexport const createSessionRecord = async ({\n tx,\n tenantId,\n userId,\n config,\n userAgent,\n ip,\n action,\n rememberMe,\n expiresIn,\n}: CreateSessionRecordParams): Promise<{\n session: {\n id: string;\n expiresAt: string;\n createdAt: string;\n updatedAt: string;\n userAgent: string | null;\n ip: string | null;\n };\n sessionToken: string;\n expiresAt: string;\n}> => {\n const sessionToken = generateToken();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const sessionDuration =\n expiresIn ||\n getSessionDuration({\n sessionConfig: config.session,\n rememberMe: rememberMe ?? true,\n });\n const expiresAt = addDuration(sessionDuration);\n const meta: SessionMeta = { action };\n\n if (rememberMe !== undefined) {\n meta.rememberMe = rememberMe;\n }\n\n const [session] = await tx\n .insert(sessionsInIam)\n .values({\n tenantId,\n userId,\n token: hashedToken,\n expiresAt,\n userAgent,\n ip,\n meta,\n })\n .returning({\n id: sessionsInIam.id,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n });\n\n return { session, sessionToken, expiresAt };\n};\n\nexport const createSession = async ({\n tx,\n tenantId,\n userId,\n config,\n userAgent,\n ip,\n rememberMe = true,\n}: CreateSessionParams): Promise<{\n sessionId: string;\n sessionToken: string;\n expiresAt: string;\n}> => {\n const { session, sessionToken, expiresAt } = await createSessionRecord({\n tx,\n tenantId,\n userId,\n config,\n userAgent,\n ip,\n rememberMe,\n action: 'sign-up',\n });\n\n return { sessionId: session.id, sessionToken, expiresAt };\n};\n\nexport const cleanupOldSessions = async ({\n database,\n userId,\n tenantId,\n maxSessions,\n}: CleanupOldSessionsParams) => {\n const [{ count }] = await database\n .select({ count: sql<number>`count(*)` })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n );\n\n if (count <= maxSessions) {\n return;\n }\n\n const toDeleteCount = count - maxSessions;\n const idsToDelete = await database\n .select({ id: sessionsInIam.id })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .orderBy(asc(sessionsInIam.createdAt))\n .limit(toDeleteCount);\n\n if (!idsToDelete.length) {\n return;\n }\n\n await database.delete(sessionsInIam).where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n inArray(\n sessionsInIam.id,\n idsToDelete.map((s) => s.id),\n ),\n ),\n );\n};\n","import { and, eq, gt, sql } from 'drizzle-orm';\nimport {\n accountsInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { hashPassword } from '../../../lib/crypto';\nimport { getUserAuthSelect } from '../../../lib/user-auth-select';\nimport type { User } from '../../../types';\nimport type {\n AuthAccountLookup,\n CheckExistingUserStatusParams,\n CreateUserWithAccountParams,\n DeleteUnverifiedUserParams,\n FetchUserByIdentifierParams,\n FetchUserByIdWithRolesParams,\n FetchUserForLoginParams,\n UserRecord,\n} from '../auth.types';\n\nexport const checkExistingUserStatus = async ({\n tx,\n identifier,\n tenantId,\n isEmail,\n}: CheckExistingUserStatusParams): Promise<\n | { action: 'proceed' }\n | { action: 'error'; code: string }\n | { action: 'pending'; verificationId: string; user: UserRecord }\n> => {\n const whereClause = isEmail\n ? and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n )\n : and(eq(usersInIam.tenantId, tenantId), eq(usersInIam.phone, identifier));\n\n const [existingUser] = await tx\n .select()\n .from(usersInIam)\n .where(whereClause)\n .limit(1);\n\n if (!existingUser) {\n return { action: 'proceed' };\n }\n\n const isVerified = isEmail\n ? existingUser.emailVerified\n : existingUser.phoneVerified;\n\n if (isVerified) {\n return { action: 'error', code: AUTH_ERRORS.USER_EXISTS };\n }\n\n // Check for valid pending verification\n const [pendingVerification] = await tx\n .select()\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.userId, existingUser.id),\n eq(verificationsInIam.tenantId, tenantId),\n gt(verificationsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .limit(1);\n\n if (pendingVerification) {\n return {\n action: 'pending',\n verificationId: pendingVerification.id,\n user: existingUser,\n };\n }\n\n // Delete expired unverified user\n await deleteUnverifiedUser({ tx, userId: existingUser.id, tenantId });\n return { action: 'proceed' };\n};\n\nexport const deleteUnverifiedUser = async ({\n tx,\n userId,\n tenantId,\n}: DeleteUnverifiedUserParams) => {\n await tx\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.tenantId, tenantId),\n ),\n );\n await tx\n .delete(accountsInIam)\n .where(\n and(\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.tenantId, tenantId),\n ),\n );\n await tx\n .delete(usersInIam)\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)));\n};\n\nexport const createUserWithAccount = async ({\n tx,\n tenantId,\n email,\n phone,\n password,\n fullName,\n handle,\n config,\n}: CreateUserWithAccountParams): Promise<UserRecord> => {\n const [user] = await tx\n .insert(usersInIam)\n .values({\n tenantId,\n fullName,\n handle,\n email: email || null,\n phone: phone || null,\n emailVerified: email ? !config.email.required : false,\n phoneVerified: phone ? !config.phone.required : false,\n userType: [config.userType],\n })\n .returning();\n\n const passwordHash = await hashPassword(password);\n\n await tx.insert(accountsInIam).values({\n tenantId,\n userId: user.id,\n provider: 'credentials',\n providerAccountId: email || phone || user.id,\n password: passwordHash,\n });\n\n return user;\n};\n\nexport const fetchUserForLogin = async ({\n database,\n identifier,\n tenantId,\n isEmail,\n userType,\n}: FetchUserForLoginParams): Promise<AuthAccountLookup | null> => {\n const userTypeFilter = sql`${usersInIam.userType} @> ARRAY[${userType}]::text[]`;\n const whereClause = isEmail\n ? and(\n eq(usersInIam.tenantId, tenantId),\n userTypeFilter,\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n )\n : and(\n eq(usersInIam.tenantId, tenantId),\n userTypeFilter,\n eq(usersInIam.phone, identifier),\n );\n const [row] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n bannedUntil: usersInIam.bannedUntil,\n loginAttempt: usersInIam.loginAttempt,\n hasPassword: sql<boolean>`exists(\n select 1\n from ${accountsInIam}\n where ${eq(accountsInIam.tenantId, tenantId)}\n and ${eq(accountsInIam.userId, usersInIam.id)}\n and ${eq(accountsInIam.provider, 'credentials')}\n and ${sql`${accountsInIam.password} is not null`}\n )`,\n })\n .from(usersInIam)\n .where(whereClause)\n .limit(1);\n return row || null;\n};\n\nexport const fetchUserByIdWithRoles = async ({\n database,\n userId,\n tenantId,\n}: FetchUserByIdWithRolesParams): Promise<User | null> => {\n const [result] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n bannedUntil: usersInIam.bannedUntil,\n loginAttempt: usersInIam.loginAttempt,\n ...getUserAuthSelect(tenantId),\n })\n .from(usersInIam)\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .limit(1);\n return (result as User) || null;\n};\n\nexport const fetchUserByIdentifier = async ({\n database,\n identifier,\n tenantId,\n isEmail,\n userType,\n}: FetchUserByIdentifierParams): Promise<User | null> => {\n const baseWhere = isEmail\n ? and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n )\n : and(eq(usersInIam.tenantId, tenantId), eq(usersInIam.phone, identifier));\n const whereClause = userType\n ? and(baseWhere, sql`${usersInIam.userType} @> ARRAY[${userType}]::text[]`)\n : baseWhere;\n\n const [result] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n bannedUntil: usersInIam.bannedUntil,\n loginAttempt: usersInIam.loginAttempt,\n ...getUserAuthSelect(tenantId),\n })\n .from(usersInIam)\n .where(whereClause)\n .limit(1);\n return (result as User) || null;\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, gt } from 'drizzle-orm';\nimport { getCookie } from 'hono/cookie';\nimport { sessionsInIam } from '../../../db/schema';\nimport { deleteSessionCookie, getSessionCookieName } from '../../../lib/cookie';\nimport { hashToken } from '../../../lib/crypto';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { signOutRoute } from '../auth.route';\n\nexport const signOutHandler: RouteHandler<\n typeof signOutRoute,\n AuthEnv\n> = async (c) => {\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n ensureTenantId(config, tenantId);\n\n const sessionToken = getCookie(c, getSessionCookieName(config));\n\n if (!sessionToken) {\n return c.json({ message: 'Signed out' }, 200);\n }\n\n const hashedToken = await hashToken(sessionToken, config.secret);\n const [session] = await database\n .select({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.token, hashedToken),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .limit(1);\n\n if (session) {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.id, session.id),\n eq(sessionsInIam.tenantId, session.tenantId),\n ),\n );\n }\n deleteSessionCookie(c, config);\n\n return c.json({ message: 'Signed out' }, 200);\n};\n","import type { ExtractTablesWithRelations } from 'drizzle-orm';\nimport type { PgQueryResultHKT, PgTransaction } from 'drizzle-orm/pg-core';\nimport type { Database } from './index';\nimport type * as schema from './schema';\n\nexport type TransactionClient = PgTransaction<\n PgQueryResultHKT,\n typeof schema,\n ExtractTablesWithRelations<typeof schema>\n>;\n\nexport function withTransaction<T>(\n database: Database,\n callback: (tx: TransactionClient) => Promise<T>,\n): Promise<T> {\n return database.transaction(async (tx) => callback(tx));\n}\n","import type { AuthConfig } from '../types';\n\nexport const createPhoneField = (config: AuthConfig) => {\n const phoneRegex =\n config.phone.phoneRegex || /^(\\+2519|\\+2517|2519|2517|09|07)\\d{8}$/;\n const regex =\n typeof phoneRegex === 'string' ? new RegExp(phoneRegex) : phoneRegex;\n\n return {\n validate: (phone: string): boolean => {\n return regex.test(phone.trim());\n },\n regex,\n };\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { withTransaction } from '../../../db/transaction';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport {\n normalizeAuthSession,\n normalizeAuthUser,\n} from '../../../lib/normalize-auth-response';\nimport { createPhoneField } from '../../../lib/phone-validation';\nimport { generateHandle } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { User } from '../../../types';\nimport type { AuthEnv } from '../../../types/context';\nimport type { signUpRoute } from '../auth.route';\nimport type { SignUpResult } from '../auth.types';\nimport { createSession } from '../helper/session';\nimport { checkExistingUserStatus, createUserWithAccount } from '../helper/user';\nimport { createVerification, sendVerification } from '../helper/verification';\n\nclass SignUpError extends Error {\n constructor(\n message: string,\n public status: number,\n ) {\n super(message);\n }\n}\n\nconst normalizeSignupDomain = (value: string) => {\n return value.trim().toLowerCase().replace(/^@/, '');\n};\n\nconst isAllowedSignupEmail = (\n email: string,\n allowedDomains: readonly string[],\n) => {\n const domain = email.split('@')[1]?.toLowerCase();\n if (!domain) {\n return false;\n }\n const normalizedDomains = allowedDomains\n .map(normalizeSignupDomain)\n .filter(Boolean);\n if (normalizedDomains.length === 0) {\n return true;\n }\n return normalizedDomains.includes(domain);\n};\n\nexport const signUpHandler: RouteHandler<typeof signUpRoute, AuthEnv> = async (\n c,\n) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { email, phone, password, fullName, rememberMe = true } = body;\n const identifier = email || phone;\n\n if (!identifier) {\n return c.json({ error: 'Either email or phone is required' }, 409);\n }\n if (config.signUp && !config.signUp.enabled) {\n return c.json({ error: 'Sign up is disabled' }, 403);\n }\n\n const isEmail = identifier.includes('@');\n\n if (isEmail && config.signUp && !config.signUp.emailEnabled) {\n return c.json({ error: 'Email sign up is disabled' }, 403);\n }\n\n if (!isEmail && config.signUp && !config.signUp.phoneEnabled) {\n return c.json({ error: 'Phone sign up is disabled' }, 403);\n }\n\n if (\n isEmail &&\n config.signUp?.allowedEmailDomains &&\n !isAllowedSignupEmail(identifier, config.signUp.allowedEmailDomains)\n ) {\n return c.json({ error: 'Email domain is not allowed for sign up' }, 403);\n }\n\n if (phone) {\n const phoneValidator = createPhoneField(config);\n if (!phoneValidator.validate(phone)) {\n return c.json({ error: 'Invalid phone number format' }, 400);\n }\n }\n\n if (isEmail && !config.email.enabled) {\n return c.json({ error: 'Email authentication is disabled' }, 403);\n }\n\n if (!(isEmail || config.phone.enabled)) {\n return c.json({ error: 'Phone authentication is disabled' }, 403);\n }\n const userAgent = c.req.header('user-agent') || null;\n const ip =\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || null;\n\n let result: SignUpResult;\n\n try {\n result = await withTransaction(database, async (tx) => {\n const status = await checkExistingUserStatus({\n tx,\n identifier,\n tenantId: resolvedTenantId,\n isEmail,\n });\n\n if (status.action === 'error') {\n throw new SignUpError(status.code, 409);\n }\n\n if (status.action === 'pending') {\n return {\n type: 'pending' as const,\n verificationId: status.verificationId,\n user: status.user,\n };\n }\n\n const handle = generateHandle();\n\n const user = await createUserWithAccount({\n tx,\n tenantId: resolvedTenantId,\n email,\n phone,\n password,\n fullName,\n handle,\n config,\n });\n\n if (phone && config.phone.required) {\n const { verificationId, code, hash } = await createVerification({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'phone-otp-sign-up',\n to: phone,\n config,\n });\n return {\n type: 'verification' as const,\n user,\n verificationId,\n code,\n hash,\n to: phone,\n channel: 'phone' as const,\n };\n }\n\n if (email && config.email.required) {\n const { verificationId, code, hash } = await createVerification({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'email-verification',\n to: email,\n config,\n });\n return {\n type: 'verification' as const,\n user,\n verificationId,\n code,\n hash,\n to: email,\n channel: 'email' as const,\n };\n }\n\n const { sessionId, sessionToken, expiresAt } = await createSession({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n config,\n userAgent,\n ip,\n rememberMe,\n });\n\n return {\n type: 'session' as const,\n user,\n sessionToken,\n expiresAt,\n sessionId,\n };\n });\n } catch (error) {\n if (error instanceof SignUpError) {\n return c.json({ error: error.message }, error.status as 409);\n }\n throw error;\n }\n\n if (result.type === 'pending') {\n return c.json(\n {\n user: normalizeAuthUser(result.user as unknown as User),\n session: null,\n verificationId: result.verificationId,\n requiresVerification: true,\n },\n 201,\n );\n }\n\n if (result.type === 'verification') {\n await sendVerification({\n channel: result.channel,\n to: result.to,\n code: result.code,\n hash: result.hash,\n type:\n result.channel === 'phone' ? 'phone-otp-sign-up' : 'email-verification',\n config,\n });\n\n return c.json(\n {\n user: normalizeAuthUser(result.user),\n session: null,\n verificationId: result.verificationId,\n requiresVerification: true,\n },\n 201,\n );\n }\n\n setSessionCookie(c, result.sessionToken, config, {\n expires: new Date(result.expiresAt),\n });\n\n return c.json(\n {\n user: normalizeAuthUser(result.user),\n session: normalizeAuthSession({\n id: result.sessionId,\n expiresAt: result.expiresAt,\n }),\n sessionExpiresAt: result.expiresAt,\n },\n 201,\n );\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport {\n createDomainSchema,\n deleteDomainResponseSchema,\n domainIdParamSchema,\n domainResponseSchema,\n errorResponseSchema,\n listDomainsQuerySchema,\n listDomainsResponseSchema,\n updateDomainSchema,\n} from './domains.schema';\nimport { createDomainHandler } from './handler/create-domain';\nimport { deleteDomainHandler } from './handler/delete-domain';\nimport { getDomainHandler } from './handler/get-domain';\nimport { listDomainsHandler } from './handler/list-domains';\nimport { updateDomainHandler } from './handler/update-domain';\nimport { verifyDomainHandler } from './handler/verify-domain';\n\nexport const listDomainsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Domains'],\n summary: 'List domains',\n request: {\n query: listDomainsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listDomainsResponseSchema,\n },\n },\n description: 'List of domains',\n },\n },\n});\n\nexport const getDomainRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Domains'],\n summary: 'Get domain by ID',\n request: {\n params: domainIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: domainResponseSchema,\n },\n },\n description: 'Domain details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Domain not found',\n },\n },\n});\n\nexport const createDomainRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Domains'],\n summary: 'Create domain',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: createDomainSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: domainResponseSchema,\n },\n },\n description: 'Domain created',\n },\n },\n});\n\nexport const updateDomainRoute = createRoute({\n method: 'put',\n path: '/{id}',\n tags: ['Domains'],\n summary: 'Update domain',\n request: {\n params: domainIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: updateDomainSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: domainResponseSchema,\n },\n },\n description: 'Domain updated',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Domain not found',\n },\n },\n});\n\nexport const deleteDomainRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Domains'],\n summary: 'Delete domain',\n request: {\n params: domainIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: deleteDomainResponseSchema,\n },\n },\n description: 'Domain deleted',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Domain not found',\n },\n },\n});\n\nexport const verifyDomainRoute = createRoute({\n method: 'post',\n path: '/{id}/verify',\n tags: ['Domains'],\n summary: 'Verify domain',\n request: {\n params: domainIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: domainResponseSchema,\n },\n },\n description: 'Domain verified',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Domain not found',\n },\n },\n});\n\nconst IAM_ALL = 'iam:all:all';\n\nconst domainRoutesBase = new OpenAPIHono<AuthEnv>().use('*', (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n}) as OpenAPIHono<AuthEnv>;\n\nconst domainRoutes = domainRoutesBase\n .openapi(listDomainsRoute, listDomainsHandler)\n .openapi(getDomainRoute, getDomainHandler)\n .openapi(createDomainRoute, createDomainHandler)\n .openapi(updateDomainRoute, updateDomainHandler)\n .openapi(deleteDomainRoute, deleteDomainHandler)\n .openapi(verifyDomainRoute, verifyDomainHandler);\n\nexport default domainRoutes;\n","import { grant } from '@mesob/common';\nimport { HTTPException } from 'hono/http-exception';\nimport type { User } from '../types';\n\ntype ContextWithUser = { get: (key: 'user') => User | undefined };\n\nconst toArray = <T>(v: T | T[]): T[] => {\n return Array.isArray(v) ? v : [v];\n};\n\nexport const hasRole = (\n c: ContextWithUser,\n role: string | string[],\n): boolean => {\n const user = c.get('user');\n const codes = user?.roleCodes;\n if (!codes?.length) {\n return false;\n }\n const check = toArray(role);\n return check.some((r) => codes.includes(r));\n};\n\nexport const hasRoleThrow = (\n c: ContextWithUser,\n role: string | string[],\n): void => {\n if (!hasRole(c, role)) {\n throw new HTTPException(401, { message: 'Unauthorized' });\n }\n};\n\nexport const hasPermission = (\n c: ContextWithUser,\n permission: string | string[],\n): boolean => {\n const user = c.get('user');\n const perms = user?.permissions;\n const check = toArray(permission);\n return grant(check, perms);\n};\n\nexport const hasPermissionThrow = (\n c: ContextWithUser,\n permission: string | string[],\n): void => {\n if (!hasPermission(c, permission)) {\n throw new HTTPException(401, { message: 'Unauthorized' });\n }\n};\n","import { z } from 'zod';\n\n// Query schemas\nexport const listDomainsQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n status: z.enum(['pending', 'active', 'disabled', 'deleted']).optional(),\n});\n\n// Path parameter schemas\nexport const domainIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Request body schemas\nexport const createDomainSchema = z.object({\n domain: z\n .string()\n .regex(\n /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)+$/,\n ),\n status: z\n .enum(['pending', 'active', 'disabled', 'deleted'])\n .default('pending')\n .optional(),\n meta: z.unknown().optional(),\n isPrimary: z.boolean().default(false).optional(),\n});\n\nexport const updateDomainSchema = z.object({\n domain: z\n .string()\n .regex(\n /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)+$/,\n )\n .optional(),\n status: z.enum(['pending', 'active', 'disabled', 'deleted']).optional(),\n meta: z.unknown().nullable().optional(),\n isPrimary: z.boolean().optional(),\n});\n\n// Response schemas\nexport const domainSchema = z.object({\n id: z.uuid(),\n tenantId: z.string(),\n domain: z.string(),\n status: z.string(),\n meta: z.unknown().nullable(),\n isPrimary: z.boolean(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nexport const listDomainsResponseSchema = z.object({\n domains: z.array(domainSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const domainResponseSchema = z.object({\n domain: domainSchema,\n});\n\nexport const deleteDomainResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { domainsInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { createDomainRoute } from '../domains.route';\n\nexport const createDomainHandler: RouteHandler<\n typeof createDomainRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const status = (body.status || 'pending').toUpperCase();\n const [domain] = await database\n .insert(domainsInIam)\n .values({\n tenantId: resolvedTenantId,\n domain: body.domain,\n status,\n meta: body.meta || null,\n isPrimary: body.isPrimary,\n })\n .returning();\n\n return c.json({ domain }, 201);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { domainsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { deleteDomainRoute } from '../domains.route';\n\nexport const deleteDomainHandler: RouteHandler<\n typeof deleteDomainRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(domainsInIam)\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n await database\n .delete(domainsInIam)\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)));\n\n return c.json({ message: 'Domain deleted' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { domainsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getDomainRoute } from '../domains.route';\n\nexport const getDomainHandler: RouteHandler<\n typeof getDomainRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [domain] = await database\n .select()\n .from(domainsInIam)\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!domain) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n return c.json({ domain }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { domainsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listDomainsRoute } from '../domains.route';\n\nexport const listDomainsHandler: RouteHandler<\n typeof listDomainsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [eq(domainsInIam.tenantId, tenantId)];\n if (query.status) {\n conditions.push(eq(domainsInIam.status, query.status.toUpperCase()));\n }\n\n const [domains, totalResult] = await Promise.all([\n database\n .select()\n .from(domainsInIam)\n .where(and(...conditions))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(domainsInIam)\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ domains, total, page, limit });\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { domainsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateDomainRoute } from '../domains.route';\n\nexport const updateDomainHandler: RouteHandler<\n typeof updateDomainRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(domainsInIam)\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n const updateData: Partial<typeof domainsInIam.$inferInsert> = {};\n\n if (body.domain !== undefined) {\n updateData.domain = body.domain;\n }\n if (body.status !== undefined) {\n updateData.status = body.status.toUpperCase();\n }\n if (body.meta !== undefined) {\n updateData.meta = body.meta;\n }\n if (body.isPrimary !== undefined) {\n updateData.isPrimary = body.isPrimary;\n }\n\n const [updated] = await database\n .update(domainsInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .returning();\n\n if (!updated) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n return c.json({ domain: updated }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { domainsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { verifyDomainRoute } from '../domains.route';\n\nexport const verifyDomainHandler: RouteHandler<\n typeof verifyDomainRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(domainsInIam)\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n const [updated] = await database\n .update(domainsInIam)\n .set({\n status: 'active',\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .returning();\n\n if (!updated) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n return c.json({ domain: updated }, 200);\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport {\n authSuccessSchema,\n emailVerificationConfirmSchema,\n emailVerificationRequestSchema,\n errorResponseSchema,\n messageWithVerificationIdSchema,\n} from '../auth.schema';\nimport { emailVerificationConfirmHandler } from './handler/verification-confirm';\nimport { emailVerificationRequestHandler } from './handler/verification-request';\n\nexport const emailVerificationRequestRoute = createRoute({\n method: 'post',\n path: '/verification/request',\n tags: ['Email'],\n summary: 'Request email verification',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: emailVerificationRequestSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: messageWithVerificationIdSchema,\n },\n },\n description: 'Verification code sent',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid request',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const emailVerificationConfirmRoute = createRoute({\n method: 'post',\n path: '/verification/confirm',\n tags: ['Email'],\n summary: 'Confirm email verification',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: emailVerificationConfirmSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Email verified',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid verification',\n },\n },\n});\n\nconst emailRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(emailVerificationRequestRoute, emailVerificationRequestHandler)\n .openapi(emailVerificationConfirmRoute, emailVerificationConfirmHandler);\n\nexport default emailRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { fetchUserWithRoles } from '../../../db/orm';\nimport { usersInIam, verificationsInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { hashToken } from '../../../lib/crypto';\nimport {\n normalizeAuthSession,\n normalizeAuthUser,\n} from '../../../lib/normalize-auth-response';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { createSessionRecord } from '../../auth/helper/session';\nimport type { emailVerificationConfirmRoute } from '../email.route';\n\nexport const emailVerificationConfirmHandler: RouteHandler<\n typeof emailVerificationConfirmRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code } = body;\n\n const result = await withTransaction(database, async (tx) => {\n const [verification] = await tx\n .select()\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.id, verificationId),\n eq(verificationsInIam.tenantId, resolvedTenantId),\n ),\n )\n .limit(1);\n\n if (!verification || verification.type !== 'email-verification') {\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_NOT_FOUND,\n };\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_EXPIRED,\n };\n }\n\n if ((verification.attempt || 0) >= config.email.maxAttempts) {\n await tx\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.TOO_MANY_ATTEMPTS,\n };\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await tx\n .update(verificationsInIam)\n .set({ attempt: (verification.attempt || 0) + 1 })\n .where(eq(verificationsInIam.id, verificationId));\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_MISMATCH,\n };\n }\n\n await tx\n .update(usersInIam)\n .set({\n emailVerified: true,\n lastSignInAt: new Date().toISOString(),\n })\n .where(\n and(\n eq(usersInIam.id, verification.userId),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n );\n\n await tx\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n\n const user = await fetchUserWithRoles({\n database: tx,\n userId: verification.userId,\n tenantId: resolvedTenantId,\n });\n\n if (!user) {\n return { status: 'error' as const, error: 'User not found' };\n }\n\n const { session, sessionToken, expiresAt } = await createSessionRecord({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n config,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n action: 'email-verification',\n expiresIn: config.session.expiresIn,\n });\n\n return {\n status: 'ok' as const,\n user,\n session,\n sessionToken,\n expiresAt,\n };\n });\n\n if (result.status === 'error') {\n return c.json({ error: result.error }, 400);\n }\n\n setSessionCookie(c, result.sessionToken, config, {\n expires: new Date(result.expiresAt),\n });\n\n return c.json(\n {\n user: normalizeAuthUser(result.user),\n session: normalizeAuthSession(result.session),\n sessionExpiresAt: result.session.expiresAt,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport {\n accountChangesInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { hashToken } from '../../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { checkVerificationResend } from '../../auth/helper/verification';\nimport type { emailVerificationRequestRoute } from '../email.route';\n\nexport const emailVerificationRequestHandler: RouteHandler<\n typeof emailVerificationRequestRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const user = c.get('user');\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n if (!config.email.enabled) {\n return c.json({ error: 'Email authentication is disabled' }, 400);\n }\n\n const email = body.email || user?.email;\n\n if (!email) {\n return c.json({ error: 'Email required' }, 400);\n }\n\n const genericResponse = {\n message: 'If the account exists, a verification code was sent.',\n };\n\n let userId = user?.id;\n if (!userId) {\n const [result] = await database\n .select({ id: usersInIam.id })\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, resolvedTenantId),\n sql`lower(${usersInIam.email}) = lower(${email})`,\n ),\n )\n .limit(1);\n\n if (!result) {\n return c.json(genericResponse, 200);\n }\n\n userId = result.id;\n }\n\n const resendCheck = await checkVerificationResend({\n database,\n tenantId: resolvedTenantId,\n userId,\n type: 'email-verification',\n resendInterval: config.email.resendInterval,\n });\n\n if (resendCheck.blocked) {\n return c.json(\n {\n message: 'Verification recently sent',\n verificationId: resendCheck.verificationId,\n },\n 200,\n );\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, 'email-verification'),\n ),\n );\n\n const code = generateOtpCode(config.email.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId: resolvedTenantId,\n userId,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: email,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n\n if (user?.id && body.email) {\n await database\n .update(accountChangesInIam)\n .set({\n status: 'cancelled',\n cancelledAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n reason: 'replaced',\n })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, user.id),\n eq(accountChangesInIam.changeType, 'email'),\n eq(accountChangesInIam.status, 'pending'),\n ),\n );\n\n await database.insert(accountChangesInIam).values({\n tenantId: resolvedTenantId,\n userId: user.id,\n changeType: 'email',\n oldEmail: user.email ?? '',\n newEmail: body.email,\n oldPhone: null,\n newPhone: null,\n status: 'pending',\n expiresAt: verification.expiresAt,\n updatedAt: new Date().toISOString(),\n });\n }\n\n if (config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email,\n code,\n hash: hashedCode,\n type: 'email-verification',\n });\n }\n\n return c.json(\n {\n message: 'Verification code sent',\n verificationId: verification.id,\n },\n 200,\n );\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport {\n authSuccessSchema,\n changePasswordSchema,\n errorResponseSchema,\n forgotPasswordSchema,\n messageSchema,\n messageWithVerificationIdSchema,\n resetPasswordSchema,\n setPasswordSchema,\n verifyPasswordSchema,\n} from '../auth.schema';\nimport { changePasswordHandler } from './handler/change';\nimport { forgotPasswordHandler } from './handler/forgot';\nimport { resetPasswordHandler } from './handler/reset';\nimport { setPasswordHandler } from './handler/set';\nimport { verifyPasswordHandler } from './handler/verify';\n\nexport const forgotPasswordRoute = createRoute({\n method: 'post',\n path: '/forgot',\n tags: ['Password'],\n summary: 'Request password reset',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: forgotPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: messageWithVerificationIdSchema,\n },\n },\n description: 'Reset code sent if account exists',\n },\n },\n});\n\nexport const resetPasswordRoute = createRoute({\n method: 'post',\n path: '/reset',\n tags: ['Password'],\n summary: 'Reset password',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: resetPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Password reset and new session',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid verification',\n },\n },\n});\n\nexport const verifyPasswordRoute = createRoute({\n method: 'post',\n path: '/verify',\n tags: ['Password'],\n summary: 'Verify password',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: verifyPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: { 'application/json': { schema: messageSchema } },\n description: 'Password verified',\n },\n 401: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Invalid password',\n },\n },\n});\n\nexport const changePasswordRoute = createRoute({\n method: 'post',\n path: '/change',\n tags: ['Password'],\n summary: 'Change password',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: changePasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: { 'application/json': { schema: messageSchema } },\n description: 'Password updated',\n },\n 401: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Invalid password',\n },\n },\n});\n\nexport const setPasswordRoute = createRoute({\n method: 'post',\n path: '/set',\n tags: ['Password'],\n summary: 'Set password for an existing verified account',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: setPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Password set and user signed in',\n },\n 400: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Account not found',\n },\n 409: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Password already exists or verification required',\n },\n },\n});\n\nconst passwordRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(forgotPasswordRoute, forgotPasswordHandler)\n .openapi(resetPasswordRoute, resetPasswordHandler)\n .openapi(verifyPasswordRoute, verifyPasswordHandler)\n .openapi(changePasswordRoute, changePasswordHandler)\n .openapi(setPasswordRoute, setPasswordHandler);\n\nexport default passwordRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, gt, ne } from 'drizzle-orm';\nimport { getCookie } from 'hono/cookie';\nimport { accountsInIam, sessionsInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { getSessionCookieName } from '../../../lib/cookie';\nimport { hashPassword, hashToken, verifyPassword } from '../../../lib/crypto';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { changePasswordRoute } from '../password.route';\n\nexport const changePasswordHandler: RouteHandler<\n typeof changePasswordRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { currentPassword, newPassword } = body;\n\n const [account] = await database\n .select()\n .from(accountsInIam)\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n )\n .limit(1);\n\n if (!account?.password) {\n return c.json({ error: AUTH_ERRORS.HAS_NO_PASSWORD }, 401);\n }\n\n const passwordValid = await verifyPassword(currentPassword, account.password);\n if (!passwordValid) {\n return c.json({ error: AUTH_ERRORS.INVALID_PASSWORD }, 401);\n }\n\n const passwordHash = await hashPassword(newPassword);\n await database\n .update(accountsInIam)\n .set({ password: passwordHash })\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n\n const currentSessionToken = getCookie(c, getSessionCookieName(config));\n if (currentSessionToken) {\n const hashedToken = await hashToken(currentSessionToken, config.secret);\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, resolvedTenantId),\n eq(sessionsInIam.userId, userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ne(sessionsInIam.token, hashedToken),\n ),\n );\n }\n\n return c.json({ message: 'Password updated' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport {\n rolesInIam,\n userRolesInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { hashToken } from '../../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { User } from '../../../types';\nimport type { AuthEnv } from '../../../types/context';\nimport type { forgotPasswordRoute } from '../password.route';\n\nexport const forgotPasswordHandler: RouteHandler<\n typeof forgotPasswordRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { identifier } = body;\n\n const isEmail = identifier.includes('@');\n\n if (isEmail && !config.email.enabled) {\n return c.json({ message: 'If account exists, reset code sent' }, 200);\n }\n\n if (!(isEmail || config.phone.enabled)) {\n return c.json({ message: 'If account exists, reset code sent' }, 200);\n }\n\n let user: User | null = null;\n\n if (isEmail) {\n const [result] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n roles: sql<string[] | null>`COALESCE(\n array_to_json(array_agg(${rolesInIam.id}) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL)),\n '[]'::json\n )`,\n })\n .from(usersInIam)\n .leftJoin(\n userRolesInIam,\n and(\n eq(userRolesInIam.userId, usersInIam.id),\n eq(userRolesInIam.tenantId, resolvedTenantId),\n ),\n )\n .leftJoin(\n rolesInIam,\n and(\n eq(userRolesInIam.roleId, rolesInIam.id),\n eq(rolesInIam.tenantId, resolvedTenantId),\n ),\n )\n .where(\n and(\n eq(usersInIam.tenantId, resolvedTenantId),\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n ),\n )\n .groupBy(usersInIam.id)\n .limit(1);\n user = (result as User) || null;\n } else {\n const [result] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n roles: sql<string[] | null>`COALESCE(\n array_to_json(array_agg(${rolesInIam.id}) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL)),\n '[]'::json\n )`,\n })\n .from(usersInIam)\n .leftJoin(\n userRolesInIam,\n and(\n eq(userRolesInIam.userId, usersInIam.id),\n eq(userRolesInIam.tenantId, resolvedTenantId),\n ),\n )\n .leftJoin(\n rolesInIam,\n and(\n eq(userRolesInIam.roleId, rolesInIam.id),\n eq(rolesInIam.tenantId, resolvedTenantId),\n ),\n )\n .where(\n and(\n eq(usersInIam.tenantId, resolvedTenantId),\n eq(usersInIam.phone, identifier),\n ),\n )\n .groupBy(usersInIam.id)\n .limit(1);\n user = (result as User) || null;\n }\n\n if (!user) {\n return c.json({ message: 'If account exists, reset code sent' }, 200);\n }\n\n let verificationId: string | undefined;\n\n if (isEmail) {\n if (!user.email) {\n return c.json({ message: 'If account exists, reset code sent' }, 200);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, user.id),\n eq(verificationsInIam.type, 'password-reset'),\n ),\n );\n\n const code = generateOtpCode(config.email.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'password-reset',\n code: hashedCode,\n expiresAt,\n to: user.email,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n verificationId = verification.id;\n\n if (config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email: user.email,\n code,\n hash: hashedCode,\n type: 'password-reset',\n });\n }\n } else {\n if (!user.phone) {\n return c.json({ message: 'If account exists, reset code sent' }, 200);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, user.id),\n eq(verificationsInIam.type, 'password-reset-otp'),\n ),\n );\n\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'password-reset-otp',\n code: hashedCode,\n expiresAt,\n to: user.phone,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n verificationId = verification.id;\n\n if (config.phone.sendVerificationOTP) {\n await config.phone.sendVerificationOTP({\n phone: user.phone,\n code,\n hash: hashedCode,\n type: 'password-reset-otp',\n });\n }\n }\n\n return c.json(\n {\n message: 'If account exists, reset code sent',\n // Only return verificationId for UX - security note: this reveals account existence\n // For stricter security, remove verificationId and use email/sms link with token\n verificationId,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, gt } from 'drizzle-orm';\nimport {\n accountsInIam,\n sessionsInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { hashPassword, hashToken } from '../../../lib/crypto';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { createPasswordResetSession } from '../helper/session';\nimport type { resetPasswordRoute } from '../password.route';\n\nexport const resetPasswordHandler: RouteHandler<\n typeof resetPasswordRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code, password } = body;\n\n const [verification] = await database\n .select()\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.id, verificationId),\n eq(verificationsInIam.tenantId, resolvedTenantId),\n ),\n )\n .limit(1);\n\n if (!verification) {\n return c.json({ error: AUTH_ERRORS.VERIFICATION_NOT_FOUND }, 400);\n }\n\n if (\n verification.type !== 'password-reset' &&\n verification.type !== 'password-reset-otp'\n ) {\n return c.json({ error: AUTH_ERRORS.VERIFICATION_NOT_FOUND }, 400);\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n return c.json({ error: AUTH_ERRORS.VERIFICATION_EXPIRED }, 400);\n }\n\n const maxAttempts =\n verification.type === 'password-reset'\n ? config.email.maxAttempts\n : config.phone.maxAttempts;\n if ((verification.attempt || 0) >= maxAttempts) {\n await database\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n return c.json({ error: AUTH_ERRORS.TOO_MANY_ATTEMPTS }, 400);\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await database\n .update(verificationsInIam)\n .set({ attempt: (verification.attempt || 0) + 1 })\n .where(eq(verificationsInIam.id, verificationId));\n return c.json({ error: AUTH_ERRORS.VERIFICATION_MISMATCH }, 400);\n }\n\n const passwordHash = await hashPassword(password);\n await database\n .update(accountsInIam)\n .set({ password: passwordHash })\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, verification.userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, resolvedTenantId),\n eq(sessionsInIam.userId, verification.userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n );\n\n await database\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n\n const [user] = await database\n .select()\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.id, verification.userId),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n )\n .limit(1);\n\n if (!user) {\n return c.json({ error: 'User not found' }, 400);\n }\n\n return createPasswordResetSession({\n c,\n user,\n config,\n database,\n tenantId: resolvedTenantId,\n });\n};\n","import { sessionsInIam } from '../../../db/schema';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { generateToken, hashToken } from '../../../lib/crypto';\nimport {\n normalizeAuthSession,\n normalizeAuthUser,\n} from '../../../lib/normalize-auth-response';\nimport { addDuration } from '../../../lib/session';\nimport type { CreatePasswordResetSessionParams } from '../password.types';\n\nexport const createPasswordResetSession = async ({\n c,\n user,\n config,\n database,\n tenantId,\n}: CreatePasswordResetSessionParams) => {\n const sessionToken = generateToken();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const [session] = await database\n .insert(sessionsInIam)\n .values({\n tenantId,\n userId: user.id,\n token: hashedToken,\n expiresAt,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n meta: { action: 'password-reset' },\n })\n .returning();\n\n setSessionCookie(c, sessionToken, config, {\n expires: new Date(expiresAt),\n });\n\n return c.json(\n {\n user: normalizeAuthUser(user),\n session: normalizeAuthSession(session),\n sessionExpiresAt: session.expiresAt,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { accountsInIam, usersInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { hashPassword } from '../../../lib/crypto';\nimport {\n normalizeAuthSession,\n normalizeAuthUser,\n} from '../../../lib/normalize-auth-response';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { createSessionRecord } from '../../auth/helper/session';\nimport {\n fetchUserByIdWithRoles,\n fetchUserForLogin,\n} from '../../auth/helper/user';\nimport type { setPasswordRoute } from '../password.route';\n\nexport const setPasswordHandler: RouteHandler<\n typeof setPasswordRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { identifier, password, rememberMe = true } = body;\n const isEmail = identifier.includes('@');\n\n const user = await fetchUserForLogin({\n database,\n identifier,\n tenantId: resolvedTenantId,\n isEmail,\n userType: config.userType,\n });\n\n if (!user) {\n return c.json({ error: AUTH_ERRORS.USER_NOT_FOUND }, 400);\n }\n\n const isVerified = isEmail ? user.emailVerified : user.phoneVerified;\n if (!isVerified) {\n return c.json({ error: AUTH_ERRORS.REQUIRES_VERIFICATION }, 409);\n }\n\n if (user.hasPassword) {\n return c.json({ error: AUTH_ERRORS.PASSWORD_ALREADY_SET }, 409);\n }\n\n const userAgent = c.req.header('user-agent') || null;\n const ip =\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || null;\n\n const result = await withTransaction(database, async (tx) => {\n const passwordHash = await hashPassword(password);\n\n const [account] = await tx\n .select({\n id: accountsInIam.id,\n })\n .from(accountsInIam)\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, user.id),\n eq(accountsInIam.provider, 'credentials'),\n ),\n )\n .limit(1);\n\n if (account) {\n await tx\n .update(accountsInIam)\n .set({\n password: passwordHash,\n providerAccountId: identifier,\n })\n .where(eq(accountsInIam.id, account.id));\n } else {\n await tx.insert(accountsInIam).values({\n tenantId: resolvedTenantId,\n userId: user.id,\n provider: 'credentials',\n providerAccountId: identifier,\n password: passwordHash,\n });\n }\n\n await tx\n .update(usersInIam)\n .set({ lastSignInAt: new Date().toISOString(), loginAttempt: 0 })\n .where(\n and(\n eq(usersInIam.id, user.id),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n );\n\n return createSessionRecord({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n config,\n userAgent,\n ip,\n action: 'set-password',\n rememberMe,\n });\n });\n\n setSessionCookie(c, result.sessionToken, config, {\n expires: new Date(result.expiresAt),\n });\n\n const fullUser = await fetchUserByIdWithRoles({\n database,\n userId: user.id,\n tenantId: resolvedTenantId,\n });\n\n return c.json(\n {\n user: normalizeAuthUser(fullUser ?? { ...user, roles: [] }),\n session: normalizeAuthSession(result.session),\n sessionExpiresAt: result.session.expiresAt,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { accountsInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { verifyPassword } from '../../../lib/crypto';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { verifyPasswordRoute } from '../password.route';\n\nexport const verifyPasswordHandler: RouteHandler<\n typeof verifyPasswordRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { password } = body;\n\n const [account] = await database\n .select()\n .from(accountsInIam)\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n )\n .limit(1);\n\n if (!account?.password) {\n return c.json({ error: AUTH_ERRORS.HAS_NO_PASSWORD }, 401);\n }\n\n const passwordValid = await verifyPassword(password, account.password);\n if (!passwordValid) {\n return c.json({ error: AUTH_ERRORS.INVALID_PASSWORD }, 401);\n }\n\n return c.json({ message: 'Password verified' }, 200);\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport { getPermissionHandler } from './handler/get-permission';\nimport { listPermissionsHandler } from './handler/list-permissions';\nimport { seedPermissionsHandler } from './handler/seed-permissions';\nimport {\n errorResponseSchema,\n listPermissionsQuerySchema,\n listPermissionsResponseSchema,\n permissionIdParamSchema,\n permissionResponseSchema,\n seedPermissionsResponseSchema,\n} from './permissions.schema';\n\nexport const listPermissionsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Permissions'],\n summary: 'List permissions',\n request: {\n query: listPermissionsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listPermissionsResponseSchema,\n },\n },\n description: 'List of permissions',\n },\n },\n});\n\nexport const getPermissionRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Permissions'],\n summary: 'Get permission by ID',\n request: {\n params: permissionIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: permissionResponseSchema,\n },\n },\n description: 'Permission details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Permission not found',\n },\n },\n});\n\nexport const seedPermissionsRoute = createRoute({\n method: 'post',\n path: '/seed',\n tags: ['Permissions'],\n summary: 'Seed permissions from config',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: seedPermissionsResponseSchema,\n },\n },\n description: 'Seeded permissions',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid permission config',\n },\n },\n});\n\nconst IAM_ALL = 'iam:all:all';\n\nconst permissionRoutesBase = new OpenAPIHono<AuthEnv>().use('*', (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n}) as OpenAPIHono<AuthEnv>;\n\nconst permissionRoutes = permissionRoutesBase\n .openapi(listPermissionsRoute, listPermissionsHandler)\n .openapi(seedPermissionsRoute, seedPermissionsHandler)\n .openapi(getPermissionRoute, getPermissionHandler);\n\nexport default permissionRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { getPermissionEntries } from '@mesob/common';\nimport { eq } from 'drizzle-orm';\nimport { permissionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getPermissionRoute } from '../permissions.route';\n\nexport const getPermissionHandler: RouteHandler<\n typeof getPermissionRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const config = c.get('config');\n\n const [permission] = await database\n .select()\n .from(permissionsInIam)\n .where(eq(permissionsInIam.id, id))\n .limit(1);\n\n if (!permission) {\n const configuredPermission = getPermissionEntries(config.permissions).find(\n (entry) => entry.code === id,\n );\n\n if (!configuredPermission) {\n return c.json({ error: 'Permission not found' }, 404);\n }\n\n return c.json(\n {\n permission: {\n id: configuredPermission.code,\n description: null,\n activity: configuredPermission.activity,\n application: configuredPermission.application,\n feature: configuredPermission.feature,\n },\n },\n 200,\n );\n }\n\n return c.json({ permission }, 200);\n};\n","import type { PermissionTree } from '@mesob/common';\nimport { getPermissionEntries } from '@mesob/common';\nimport type { Database } from '../db';\nimport { permissionsInIam } from '../db/schema';\n\nexport type PermissionCatalogItem = {\n id: string;\n description: unknown;\n activity: string;\n application: string;\n feature: string;\n};\n\ntype PermissionListQuery = {\n search?: string;\n filter?: '' | 'application' | 'feature' | 'activity';\n sort?: 'id' | 'application' | 'feature' | 'activity';\n order?: 'asc' | 'desc';\n};\n\nconst collator = new Intl.Collator(undefined, {\n numeric: true,\n sensitivity: 'base',\n});\n\nconst sortValueMap = {\n id: (permission: PermissionCatalogItem) => permission.id,\n application: (permission: PermissionCatalogItem) => permission.application,\n feature: (permission: PermissionCatalogItem) => permission.feature,\n activity: (permission: PermissionCatalogItem) => permission.activity,\n} as const;\n\nexport async function getMergedPermissionCatalog({\n database,\n permissions,\n}: {\n database: Database;\n permissions?: PermissionTree | null;\n}) {\n const [databasePermissions, configuredPermissions] = await Promise.all([\n database.select().from(permissionsInIam),\n Promise.resolve(\n getPermissionEntries(permissions).map((entry) => ({\n id: entry.code,\n description: null,\n activity: entry.activity,\n application: entry.application,\n feature: entry.feature,\n })),\n ),\n ]);\n\n return [...databasePermissions, ...configuredPermissions].filter(\n (permission, index, permissionList) => {\n const key = [\n permission.application,\n permission.feature,\n permission.activity,\n ].join(':');\n\n return (\n permissionList.findIndex((candidate) => {\n return (\n [candidate.application, candidate.feature, candidate.activity].join(\n ':',\n ) === key\n );\n }) === index\n );\n },\n ) as PermissionCatalogItem[];\n}\n\nexport function filterAndSortPermissions(\n permissions: PermissionCatalogItem[],\n query: PermissionListQuery,\n) {\n const search = query.search?.trim().toLowerCase();\n const filteredPermissions = search\n ? permissions.filter((permission) => {\n let fields = [\n permission.id,\n permission.application,\n permission.feature,\n permission.activity,\n ];\n\n if (query.filter === 'application') {\n fields = [permission.application];\n } else if (query.filter === 'feature') {\n fields = [permission.feature];\n } else if (query.filter === 'activity') {\n fields = [permission.activity];\n }\n\n return fields.some((field) => field.toLowerCase().includes(search));\n })\n : permissions;\n\n const sortGetter = sortValueMap[query.sort || 'id'] ?? sortValueMap.id;\n\n return [...filteredPermissions].sort((a, b) => {\n const order =\n collator.compare(sortGetter(a), sortGetter(b)) ||\n collator.compare(a.id, b.id);\n\n return query.order === 'desc' ? -order : order;\n });\n}\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport {\n filterAndSortPermissions,\n getMergedPermissionCatalog,\n} from '../../../lib/permission-catalog';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listPermissionsRoute } from '../permissions.route';\n\nexport const listPermissionsHandler: RouteHandler<\n typeof listPermissionsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const config = c.get('config');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const mergedPermissions = await getMergedPermissionCatalog({\n database,\n permissions: config.permissions,\n });\n const sortedPermissions = filterAndSortPermissions(mergedPermissions, query);\n\n const total = sortedPermissions.length;\n const permissions = sortedPermissions.slice(offset, offset + limit);\n\n return c.json({ permissions, total, page, limit }, 200);\n};\n","import { randomUUID } from 'node:crypto';\nimport type { PermissionTree } from '@mesob/common';\nimport { getPermissionEntries, toTitleCase } from '@mesob/common';\nimport {\n and,\n eq,\n type InferInsertModel,\n inArray,\n notInArray,\n sql,\n} from 'drizzle-orm';\nimport { HTTPException } from 'hono/http-exception';\nimport type { Database } from '../db';\nimport {\n permissionsInIam,\n rolePermissionsInIam,\n rolesInIam,\n} from '../db/schema';\nimport type { TransactionClient } from '../db/transaction';\nimport type { SeedRole } from '../types';\n\ntype DatabaseClient = Database | TransactionClient;\n\nfunction buildPermissionDescription(code: string) {\n return {\n en: toTitleCase(code.replaceAll(':', ' ').replaceAll('_', ' ')),\n };\n}\n\nexport function buildPermissionSeedRows(\n permissions?: PermissionTree | null,\n): InferInsertModel<typeof permissionsInIam>[] {\n const entries = getPermissionEntries(permissions);\n const byId = new Map<string, InferInsertModel<typeof permissionsInIam>>();\n for (const entry of entries) {\n byId.set(entry.code, {\n id: entry.code,\n application: entry.application,\n feature: entry.feature,\n activity: entry.activity,\n description: buildPermissionDescription(entry.code),\n });\n }\n return [...byId.values()];\n}\n\nexport async function seedPermissions({\n database,\n permissions,\n}: {\n database: DatabaseClient;\n permissions?: PermissionTree | null;\n}) {\n const rows = buildPermissionSeedRows(permissions);\n if (!rows.length) {\n return [];\n }\n\n await database\n .insert(permissionsInIam)\n .values(rows)\n .onConflictDoUpdate({\n target: permissionsInIam.id,\n set: {\n application: sql`excluded.application`,\n feature: sql`excluded.feature`,\n activity: sql`excluded.activity`,\n description: sql`excluded.description`,\n },\n });\n\n return database\n .select()\n .from(permissionsInIam)\n .where(\n inArray(\n permissionsInIam.id,\n rows.map((row) => row.id),\n ),\n );\n}\n\nasync function assertPermissionsExist({\n database,\n permissionIds,\n}: {\n database: DatabaseClient;\n permissionIds: string[];\n}) {\n if (!permissionIds.length) {\n return;\n }\n\n const existing = await database\n .select({ id: permissionsInIam.id })\n .from(permissionsInIam)\n .where(inArray(permissionsInIam.id, permissionIds));\n\n const existingIds = new Set(existing.map((permission) => permission.id));\n const missingPermissionIds = permissionIds.filter(\n (id) => !existingIds.has(id),\n );\n\n if (missingPermissionIds.length) {\n throw new HTTPException(400, {\n message: `Unknown permissions: ${missingPermissionIds.join(', ')}`,\n });\n }\n}\n\nexport async function syncRolePermissions({\n database,\n tenantId,\n roleId,\n permissionIds,\n}: {\n database: DatabaseClient;\n tenantId: string;\n roleId: string;\n permissionIds: string[];\n}) {\n const uniquePermissionIds = [...new Set(permissionIds)];\n\n await assertPermissionsExist({\n database,\n permissionIds: uniquePermissionIds,\n });\n\n if (!uniquePermissionIds.length) {\n await database\n .delete(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.tenantId, tenantId),\n eq(rolePermissionsInIam.roleId, roleId),\n ),\n );\n\n return [];\n }\n\n await database\n .delete(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.tenantId, tenantId),\n eq(rolePermissionsInIam.roleId, roleId),\n notInArray(rolePermissionsInIam.permissionId, uniquePermissionIds),\n ),\n );\n\n await database\n .insert(rolePermissionsInIam)\n .values(\n uniquePermissionIds.map((permissionId) => ({\n id: randomUUID(),\n tenantId,\n roleId,\n permissionId,\n })),\n )\n .onConflictDoNothing({\n target: [\n rolePermissionsInIam.tenantId,\n rolePermissionsInIam.permissionId,\n rolePermissionsInIam.roleId,\n ],\n });\n\n return database\n .select()\n .from(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.tenantId, tenantId),\n eq(rolePermissionsInIam.roleId, roleId),\n ),\n );\n}\n\nexport async function seedRoles({\n database,\n tenantId,\n roles,\n}: {\n database: DatabaseClient;\n tenantId: string;\n roles: readonly SeedRole[];\n}) {\n if (!roles.length) {\n return [];\n }\n\n await database\n .insert(rolesInIam)\n .values(\n roles.map((role) => ({\n id: randomUUID(),\n tenantId,\n code: role.code,\n name: role.name,\n description: role.description ?? { en: role.code },\n isSystem: role.isSystem ?? false,\n isEditable: role.isEditable ?? true,\n isDeletable: role.isDeletable ?? true,\n })),\n )\n .onConflictDoUpdate({\n target: [rolesInIam.tenantId, rolesInIam.code],\n set: {\n name: sql`excluded.name`,\n description: sql`excluded.description`,\n isSystem: sql`excluded.is_system`,\n isEditable: sql`excluded.is_editable`,\n isDeletable: sql`excluded.is_deletable`,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n },\n });\n\n const seededRoles = await database\n .select()\n .from(rolesInIam)\n .where(\n and(\n eq(rolesInIam.tenantId, tenantId),\n inArray(\n rolesInIam.code,\n roles.map((role) => role.code),\n ),\n ),\n );\n\n const roleByCode = new Map(\n seededRoles.map((role) => [role.code, role] as const),\n );\n\n for (const role of roles) {\n const seededRole = roleByCode.get(role.code);\n if (!seededRole) {\n continue;\n }\n\n await syncRolePermissions({\n database,\n tenantId,\n roleId: seededRole.id,\n permissionIds: [...new Set(role.permissionIds ?? [])],\n });\n }\n\n return seededRoles;\n}\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { seedPermissions } from '../../../lib/iam-seed';\nimport type { AuthEnv } from '../../../types/context';\nimport type { seedPermissionsRoute } from '../permissions.route';\n\nexport const seedPermissionsHandler: RouteHandler<\n typeof seedPermissionsRoute,\n AuthEnv\n> = async (c) => {\n const config = c.get('config');\n const database = c.get('database');\n\n if (!config.permissions) {\n return c.json({ error: 'No permissions configured for seeding' }, 400);\n }\n\n const permissions = await seedPermissions({\n database,\n permissions: config.permissions,\n });\n\n return c.json(\n {\n permissions,\n total: permissions.length,\n },\n 200,\n );\n};\n","import { z } from 'zod';\n\nconst permissionFilterValues = [\n '',\n 'application',\n 'feature',\n 'activity',\n] as const;\nconst permissionSortValues = [\n 'id',\n 'application',\n 'feature',\n 'activity',\n] as const;\n\n// Query schemas\nexport const listPermissionsQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n search: z.string().optional(),\n filter: z.enum(permissionFilterValues).optional(),\n sort: z.enum(permissionSortValues).optional(),\n order: z.enum(['asc', 'desc']).optional(),\n});\n\n// Path parameter schemas\nexport const permissionIdParamSchema = z.object({\n id: z.string(),\n});\n\n// Response schemas\nexport const permissionSchema = z.object({\n id: z.string(),\n description: z.unknown(),\n activity: z.string(),\n application: z.string(),\n feature: z.string(),\n});\n\nexport const seedPermissionsResponseSchema = z.object({\n permissions: z.array(permissionSchema),\n total: z.number(),\n});\n\nexport const listPermissionsResponseSchema = z.object({\n permissions: z.array(permissionSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const permissionResponseSchema = z.object({\n permission: permissionSchema,\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport {\n authSuccessSchema,\n errorResponseSchema,\n messageWithVerificationIdSchema,\n phoneVerificationConfirmSchema,\n phoneVerificationRequestSchema,\n} from '../auth.schema';\nimport { phoneVerificationConfirmHandler } from './handler/verification-confirm';\nimport { phoneVerificationRequestHandler } from './handler/verification-request';\n\nexport const phoneVerificationRequestRoute = createRoute({\n method: 'post',\n path: '/verification/request',\n tags: ['Phone'],\n summary: 'Request phone OTP',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: phoneVerificationRequestSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: messageWithVerificationIdSchema,\n },\n },\n description: 'OTP sent',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid request',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const phoneVerificationConfirmRoute = createRoute({\n method: 'post',\n path: '/verification/confirm',\n tags: ['Phone'],\n summary: 'Confirm phone OTP',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: phoneVerificationConfirmSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Phone verified',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid verification',\n },\n },\n});\n\nconst phoneRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(phoneVerificationRequestRoute, phoneVerificationRequestHandler)\n .openapi(phoneVerificationConfirmRoute, phoneVerificationConfirmHandler);\n\nexport default phoneRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { fetchUserWithRoles } from '../../../db/orm';\nimport { usersInIam, verificationsInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { hashToken } from '../../../lib/crypto';\nimport {\n normalizeAuthSession,\n normalizeAuthUser,\n} from '../../../lib/normalize-auth-response';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { createSessionRecord } from '../../auth/helper/session';\nimport { shouldCreateSession } from '../helper/session';\nimport type { phoneVerificationConfirmRoute } from '../phone.route';\n\nconst getSessionAction = (context: string) =>\n context === 'sign-up'\n ? 'phone-verification-sign-up'\n : `phone-verification-${context}`;\n\nexport const phoneVerificationConfirmHandler: RouteHandler<\n typeof phoneVerificationConfirmRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code, context } = body;\n\n const result = await withTransaction(database, async (tx) => {\n const [verification] = await tx\n .select()\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.id, verificationId),\n eq(verificationsInIam.tenantId, resolvedTenantId),\n ),\n )\n .limit(1);\n\n const expectedType = `phone-otp-${context}`;\n if (!verification || verification.type !== expectedType) {\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_NOT_FOUND,\n };\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_EXPIRED,\n };\n }\n\n if ((verification.attempt || 0) >= config.phone.maxAttempts) {\n await tx\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.TOO_MANY_ATTEMPTS,\n };\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await tx\n .update(verificationsInIam)\n .set({ attempt: (verification.attempt || 0) + 1 })\n .where(eq(verificationsInIam.id, verificationId));\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_MISMATCH,\n };\n }\n\n await tx\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n\n if (shouldCreateSession(context) && verification.userId) {\n await tx\n .update(usersInIam)\n .set({\n phoneVerified: true,\n lastSignInAt: new Date().toISOString(),\n })\n .where(\n and(\n eq(usersInIam.id, verification.userId),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n );\n }\n\n if (!verification.userId) {\n return { status: 'error' as const, error: 'User not found' };\n }\n\n const user = await fetchUserWithRoles({\n database: tx,\n userId: verification.userId,\n tenantId: resolvedTenantId,\n });\n\n if (!user) {\n return { status: 'error' as const, error: 'User not found' };\n }\n\n if (!shouldCreateSession(context)) {\n return { status: 'ok' as const, user, session: null };\n }\n\n const { session, sessionToken, expiresAt } = await createSessionRecord({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n config,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n action: getSessionAction(context),\n expiresIn: config.session.expiresIn,\n });\n\n return {\n status: 'ok' as const,\n user,\n session,\n sessionToken,\n expiresAt,\n };\n });\n\n if (result.status === 'error') {\n return c.json({ error: result.error }, 400);\n }\n\n if (!result.session) {\n return c.json(\n {\n user: normalizeAuthUser(result.user),\n session: null,\n },\n 200,\n );\n }\n\n setSessionCookie(c, result.sessionToken, config, {\n expires: new Date(result.expiresAt),\n });\n\n return c.json(\n {\n user: normalizeAuthUser(result.user),\n session: normalizeAuthSession(result.session),\n sessionExpiresAt: result.session.expiresAt,\n },\n 200,\n );\n};\n","import { withTransaction } from '../../../db/transaction';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport {\n normalizeAuthSession,\n normalizeAuthUser,\n} from '../../../lib/normalize-auth-response';\nimport { createSessionRecord } from '../../auth/helper/session';\nimport type { CreateSessionResponseParams } from '../phone.types';\n\nexport const shouldCreateSession = (context: string) =>\n context === 'sign-in' || context === 'change-phone' || context === 'sign-up';\n\nconst getSessionAction = (context: string) =>\n context === 'sign-up'\n ? 'phone-verification-sign-up'\n : `phone-verification-${context}`;\n\nexport const createSessionResponse = async ({\n c,\n user,\n config,\n database,\n tenantId,\n context,\n}: CreateSessionResponseParams) => {\n const { session, sessionToken, expiresAt } = await withTransaction(\n database,\n async (tx) =>\n createSessionRecord({\n tx,\n tenantId,\n userId: user.id,\n config,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n action: getSessionAction(context),\n expiresIn: config.session.expiresIn,\n }),\n );\n\n setSessionCookie(c, sessionToken, config, {\n expires: new Date(expiresAt),\n });\n\n return c.json(\n {\n user: normalizeAuthUser(user),\n session: normalizeAuthSession(session),\n sessionExpiresAt: session.expiresAt,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport {\n accountChangesInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { hashToken } from '../../../lib/crypto';\nimport { createPhoneField } from '../../../lib/phone-validation';\nimport { addDuration, generateOtpCode } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { checkVerificationResend } from '../../auth/helper/verification';\nimport type { phoneVerificationRequestRoute } from '../phone.route';\n\nexport const phoneVerificationRequestHandler: RouteHandler<\n typeof phoneVerificationRequestRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const user = c.get('user');\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n if (!config.phone.enabled) {\n return c.json({ error: 'Phone authentication is disabled' }, 400);\n }\n\n const { phone, context } = body;\n\n if (context === 'sign-up' && config.signUp) {\n if (!config.signUp.enabled) {\n return c.json({ error: 'Sign up is disabled' }, 400);\n }\n if (!config.signUp.phoneEnabled) {\n return c.json({ error: 'Phone sign up is disabled' }, 400);\n }\n }\n\n if (!phone) {\n return c.json({ error: 'Phone required' }, 400);\n }\n\n const phoneValidator = createPhoneField(config);\n if (!phoneValidator.validate(phone)) {\n return c.json({ error: 'Invalid phone number format' }, 400);\n }\n\n const genericResponse = {\n message: 'If the account exists, a verification code was sent.',\n };\n\n let userId = user?.id;\n if (!userId) {\n const [result] = await database\n .select({ id: usersInIam.id })\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, resolvedTenantId),\n eq(usersInIam.phone, phone),\n ),\n )\n .limit(1);\n\n if (!result) {\n return c.json(genericResponse, 200);\n }\n\n userId = result.id;\n }\n\n const verificationType = `phone-otp-${context}`;\n const resendCheck = await checkVerificationResend({\n database,\n tenantId: resolvedTenantId,\n userId,\n type: verificationType,\n resendInterval: config.phone.resendInterval,\n });\n\n if (resendCheck.blocked) {\n return c.json(\n {\n message: 'Verification recently sent',\n verificationId: resendCheck.verificationId,\n },\n 200,\n );\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, verificationType),\n ),\n );\n\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId: resolvedTenantId,\n userId,\n type: verificationType,\n code: hashedCode,\n expiresAt,\n to: phone,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n\n if (context === 'change-phone' && user?.id) {\n await database\n .update(accountChangesInIam)\n .set({\n status: 'cancelled',\n cancelledAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n reason: 'replaced',\n })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, user.id),\n eq(accountChangesInIam.changeType, 'phone'),\n eq(accountChangesInIam.status, 'pending'),\n ),\n );\n\n await database.insert(accountChangesInIam).values({\n tenantId: resolvedTenantId,\n userId: user.id,\n changeType: 'phone',\n oldPhone: user.phone ?? '',\n newPhone: phone,\n oldEmail: null,\n newEmail: null,\n status: 'pending',\n expiresAt: verification.expiresAt,\n updatedAt: new Date().toISOString(),\n });\n }\n\n if (config.phone.sendVerificationOTP) {\n await config.phone.sendVerificationOTP({\n phone,\n code,\n hash: hashedCode,\n type: verificationType,\n });\n }\n\n return c.json(\n {\n message: 'Verification code sent',\n verificationId: verification.id,\n },\n 200,\n );\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { z } from 'zod';\nimport type { AuthEnv } from '../../types/context';\nimport {\n errorResponseSchema,\n pendingAccountChangeResponseSchema,\n profileResponseSchema,\n updateEmailSchema,\n updatePhoneSchema,\n updateProfileSchema,\n userSchema,\n} from '../auth.schema';\nimport { accountChangePendingHandler } from './handler/account-change-pending';\nimport { meHandler } from './handler/me';\nimport { sessionHandler } from './handler/session';\nimport { updateProfileHandler } from './handler/update';\nimport { updateEmailHandler } from './handler/update-email';\nimport { updatePhoneHandler } from './handler/update-phone';\n\nexport const meRoute = createRoute({\n method: 'get',\n path: '/me',\n tags: ['Profile'],\n summary: 'Get current user',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: z.object({ user: userSchema }),\n },\n },\n description: 'Current user',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n },\n});\n\nexport const sessionRoute = createRoute({\n method: 'get',\n path: '/session',\n tags: ['Profile'],\n summary: 'Get current session',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: z.object({\n user: userSchema.nullable(),\n session: z\n .object({\n id: z.string().uuid(),\n expiresAt: z.string().datetime(),\n createdAt: z.string().datetime(),\n })\n .nullable(),\n }),\n },\n },\n description: 'Session info (null if no cookie sent)',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid session (cookie sent but invalid/expired)',\n },\n 500: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Server error checking session',\n },\n },\n});\n\nexport const updateProfileRoute = createRoute({\n method: 'put',\n path: '/profile',\n tags: ['Profile'],\n summary: 'Update user profile',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updateProfileSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Profile updated',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const updateEmailRoute = createRoute({\n method: 'put',\n path: '/profile/email',\n tags: ['Profile'],\n summary: 'Update user email',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updateEmailSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Email updated',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const updatePhoneRoute = createRoute({\n method: 'put',\n path: '/profile/phone',\n tags: ['Profile'],\n summary: 'Update user phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updatePhoneSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Phone updated',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid request',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const accountChangePendingRoute = createRoute({\n method: 'get',\n path: '/account-change/pending',\n tags: ['Profile'],\n summary: 'Get pending account change (email/phone)',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: pendingAccountChangeResponseSchema,\n },\n },\n description: 'Pending account change',\n },\n 401: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Unauthorized',\n },\n },\n});\n\nconst profileRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(meRoute, meHandler)\n .openapi(sessionRoute, sessionHandler)\n .openapi(updateProfileRoute, updateProfileHandler)\n .openapi(updateEmailRoute, updateEmailHandler)\n .openapi(updatePhoneRoute, updatePhoneHandler)\n .openapi(accountChangePendingRoute, accountChangePendingHandler);\n\nexport default profileRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, gt, sql } from 'drizzle-orm';\nimport { accountChangesInIam, verificationsInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { accountChangePendingRoute } from '../profile.route';\n\nexport const accountChangePendingHandler: RouteHandler<\n typeof accountChangePendingRoute,\n AuthEnv\n> = async (c) => {\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n await database\n .update(accountChangesInIam)\n .set({ status: 'expired' })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, userId),\n sql`${accountChangesInIam.expiresAt} < CURRENT_TIMESTAMP`,\n ),\n );\n\n const [accountChange] = await database\n .select()\n .from(accountChangesInIam)\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.status, 'pending'),\n ),\n )\n .limit(1);\n\n if (!accountChange) {\n return c.json({ accountChange: null, verificationId: null }, 200);\n }\n\n let verification: { id: string; expiresAt: string } | null = null;\n if (accountChange.changeType === 'email' && accountChange.newEmail) {\n const [v] = await database\n .select({\n id: verificationsInIam.id,\n expiresAt: verificationsInIam.expiresAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, 'email-verification'),\n eq(verificationsInIam.to, accountChange.newEmail),\n gt(verificationsInIam.expiresAt, sql`CURRENT_TIMESTAMP`),\n ),\n )\n .limit(1);\n verification = v || null;\n }\n if (accountChange.changeType === 'phone' && accountChange.newPhone) {\n const [v] = await database\n .select({\n id: verificationsInIam.id,\n expiresAt: verificationsInIam.expiresAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, 'phone-otp-change-phone'),\n eq(verificationsInIam.to, accountChange.newPhone),\n gt(verificationsInIam.expiresAt, sql`CURRENT_TIMESTAMP`),\n ),\n )\n .limit(1);\n verification = v || null;\n }\n\n if (!verification) {\n return c.json({ accountChange: null, verificationId: null }, 200);\n }\n\n return c.json(\n {\n accountChange: {\n changeType: accountChange.changeType as 'email' | 'phone',\n newEmail: accountChange.newEmail,\n newPhone: accountChange.newPhone,\n expiresAt: accountChange.expiresAt,\n },\n verificationId: verification.id,\n },\n 200,\n );\n};\n","import type { User } from '../types';\n\nexport const normalizeUser = (user: User) => ({\n ...user,\n roles: user.roles ?? null,\n roleCodes: user.roleCodes ?? null,\n});\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { AuthEnv } from '../../../types/context';\nimport type { meRoute } from '../profile.route';\n\nexport const meHandler: RouteHandler<typeof meRoute, AuthEnv> = (c) => {\n const user = c.get('user');\n\n if (!user) {\n return c.json({ error: 'Unauthorized' }, 401);\n }\n\n return c.json({ user: normalizeUser(user) }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { AuthEnv } from '../../../types/context';\nimport type { sessionRoute } from '../profile.route';\n\nexport const sessionHandler: RouteHandler<typeof sessionRoute, AuthEnv> = (\n c,\n) => {\n const user = c.get('user');\n const session = c.get('session');\n const status = c.get('sessionStatus');\n\n // No cookie sent - return empty session (not an error, just no session)\n if (status === 'no_cookie') {\n return c.json({ user: null, session: null }, 200);\n }\n\n // Cookie sent but session invalid/expired - 401 (cookie was passed but invalid)\n if (status === 'invalid_session') {\n return c.json({ error: 'Invalid session', code: 'INVALID_SESSION' }, 401);\n }\n\n // User not found for session - 401\n if (status === 'user_not_found') {\n return c.json({ error: 'User not found', code: 'USER_NOT_FOUND' }, 401);\n }\n\n // Server error while checking session - 500\n if (status === 'error') {\n return c.json(\n { error: 'Session check error', code: 'SESSION_CHECK_ERROR' },\n 500,\n );\n }\n\n // Valid session\n if (user && session) {\n return c.json(\n {\n user: normalizeUser(user),\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n },\n },\n 200,\n );\n }\n\n // Fallback - no cookie case\n return c.json({ user: null, session: null }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateProfileRoute } from '../profile.route';\n\nexport const updateProfileHandler: RouteHandler<\n typeof updateProfileRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const updateData: Partial<typeof usersInIam.$inferInsert> = {};\n if (body.fullName !== undefined) {\n updateData.fullName = body.fullName;\n }\n\n const [updatedUser] = await database\n .update(usersInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(\n and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, resolvedTenantId)),\n )\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (!updatedUser) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n return c.json({ user: normalizeUser(updatedUser) }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, ne, sql } from 'drizzle-orm';\nimport {\n accountChangesInIam,\n accountsInIam,\n sessionsInIam,\n usersInIam,\n} from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateEmailRoute } from '../profile.route';\n\nexport const updateEmailHandler: RouteHandler<\n typeof updateEmailRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n const session = c.get('session');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n if (user.email && session?.id) {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, resolvedTenantId),\n eq(sessionsInIam.userId, userId),\n ne(sessionsInIam.id, session.id),\n ),\n );\n }\n\n const [updatedUser] = await database\n .update(usersInIam)\n .set({\n email: body.email,\n emailVerified: true,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(\n and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, resolvedTenantId)),\n )\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (!updatedUser) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n await database\n .update(accountChangesInIam)\n .set({ status: 'applied' })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.changeType, 'email'),\n eq(accountChangesInIam.newEmail, body.email),\n ),\n );\n\n await database\n .update(accountsInIam)\n .set({ providerAccountId: body.email })\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n\n return c.json({ user: normalizeUser(updatedUser) }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, ne, sql } from 'drizzle-orm';\nimport {\n accountChangesInIam,\n accountsInIam,\n sessionsInIam,\n usersInIam,\n} from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { createPhoneField } from '../../../lib/phone-validation';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updatePhoneRoute } from '../profile.route';\n\nexport const updatePhoneHandler: RouteHandler<\n typeof updatePhoneRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n const session = c.get('session');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const phoneValidator = createPhoneField(config);\n if (!phoneValidator.validate(body.phone)) {\n return c.json({ error: 'Invalid phone number format' }, 400);\n }\n\n if (user.phone && session?.id) {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, resolvedTenantId),\n eq(sessionsInIam.userId, userId),\n ne(sessionsInIam.id, session.id),\n ),\n );\n }\n\n const [updatedUser] = await database\n .update(usersInIam)\n .set({\n phone: body.phone,\n phoneVerified: true,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(\n and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, resolvedTenantId)),\n )\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (!updatedUser) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n await database\n .update(accountChangesInIam)\n .set({ status: 'applied' })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.changeType, 'phone'),\n eq(accountChangesInIam.newPhone, body.phone),\n ),\n );\n\n await database\n .update(accountsInIam)\n .set({ providerAccountId: body.phone })\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n\n return c.json({ user: normalizeUser(updatedUser) }, 200);\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport { assignRolePermissionHandler } from './handler/assign-role-permission';\nimport { listRolePermissionsHandler } from './handler/list-role-permissions';\nimport { revokeRolePermissionHandler } from './handler/revoke-role-permission';\nimport {\n assignRolePermissionSchema,\n errorResponseSchema,\n listRolePermissionsQuerySchema,\n listRolePermissionsResponseSchema,\n revokeRolePermissionResponseSchema,\n rolePermissionIdParamSchema,\n rolePermissionResponseSchema,\n} from './role-permissions.schema';\n\nexport const listRolePermissionsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Role Permissions'],\n summary: 'List role permissions',\n request: {\n query: listRolePermissionsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listRolePermissionsResponseSchema,\n },\n },\n description: 'List of role permissions',\n },\n },\n});\n\nexport const assignRolePermissionRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Role Permissions'],\n summary: 'Assign permission to role',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: assignRolePermissionSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: rolePermissionResponseSchema,\n },\n },\n description: 'Permission assigned to role',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Permission already assigned to role',\n },\n },\n});\n\nexport const revokeRolePermissionRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Role Permissions'],\n summary: 'Revoke permission from role',\n request: {\n params: rolePermissionIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: revokeRolePermissionResponseSchema,\n },\n },\n description: 'Permission revoked from role',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role permission not found',\n },\n },\n});\n\nconst IAM_ALL = 'iam:all:all';\n\nconst rolePermissionRoutesBase = new OpenAPIHono<AuthEnv>().use(\n '*',\n (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n },\n) as OpenAPIHono<AuthEnv>;\n\nconst rolePermissionRoutes = rolePermissionRoutesBase\n .openapi(listRolePermissionsRoute, listRolePermissionsHandler)\n .openapi(assignRolePermissionRoute, assignRolePermissionHandler)\n .openapi(revokeRolePermissionRoute, revokeRolePermissionHandler);\n\nexport default rolePermissionRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { rolePermissionsInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { assignRolePermissionRoute } from '../role-permissions.route';\n\nexport const assignRolePermissionHandler: RouteHandler<\n typeof assignRolePermissionRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n try {\n const [rolePermission] = await database\n .insert(rolePermissionsInIam)\n .values({\n tenantId: resolvedTenantId,\n roleId: body.roleId,\n permissionId: body.permissionId,\n })\n .returning();\n\n return c.json({ rolePermission }, 201);\n } catch (error: unknown) {\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n error.code === '23505'\n ) {\n return c.json({ error: 'Permission already assigned to role' }, 409);\n }\n throw error;\n }\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { rolePermissionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listRolePermissionsRoute } from '../role-permissions.route';\n\nexport const listRolePermissionsHandler: RouteHandler<\n typeof listRolePermissionsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const conditions = [eq(rolePermissionsInIam.tenantId, tenantId)];\n if (query.roleId) {\n conditions.push(eq(rolePermissionsInIam.roleId, query.roleId));\n }\n if (query.permissionId) {\n conditions.push(eq(rolePermissionsInIam.permissionId, query.permissionId));\n }\n\n const rolePermissions = await database\n .select()\n .from(rolePermissionsInIam)\n .where(and(...conditions));\n\n return c.json({ rolePermissions }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { rolePermissionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { revokeRolePermissionRoute } from '../role-permissions.route';\n\nexport const revokeRolePermissionHandler: RouteHandler<\n typeof revokeRolePermissionRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.id, id),\n eq(rolePermissionsInIam.tenantId, tenantId),\n ),\n )\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Role permission not found' }, 404);\n }\n\n await database\n .delete(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.id, id),\n eq(rolePermissionsInIam.tenantId, tenantId),\n ),\n );\n\n return c.json({ message: 'Permission revoked from role' }, 200);\n};\n","import { z } from 'zod';\n\n// Query schemas\nexport const listRolePermissionsQuerySchema = z.object({\n roleId: z.uuid().optional(),\n permissionId: z.string().optional(),\n});\n\n// Path parameter schemas\nexport const rolePermissionIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Request body schemas\nexport const assignRolePermissionSchema = z.object({\n roleId: z.uuid(),\n permissionId: z.string(),\n});\n\n// Response schemas\nexport const rolePermissionSchema = z.object({\n id: z.uuid(),\n tenantId: z.string(),\n roleId: z.uuid(),\n permissionId: z.string(),\n});\n\nexport const listRolePermissionsResponseSchema = z.object({\n rolePermissions: z.array(rolePermissionSchema),\n});\n\nexport const rolePermissionResponseSchema = z.object({\n rolePermission: rolePermissionSchema,\n});\n\nexport const revokeRolePermissionResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport { assignRolePermissionsHandler } from './handler/assign-role-permissions';\nimport { assignRoleUsersHandler } from './handler/assign-role-users';\nimport { createRoleHandler } from './handler/create-role';\nimport { deleteRoleHandler } from './handler/delete-role';\nimport { getRoleHandler } from './handler/get-role';\nimport { listRolePermissionsHandler } from './handler/list-role-permissions';\nimport { listRoleUsersHandler } from './handler/list-role-users';\nimport { listRolesHandler } from './handler/list-roles';\nimport { revokeRolePermissionHandler } from './handler/revoke-role-permission';\nimport { revokeRoleUserHandler } from './handler/revoke-role-user';\nimport { seedRolesHandler } from './handler/seed-roles';\nimport { updateRoleHandler } from './handler/update-role';\nimport {\n assignRolePermissionsResponseSchema,\n assignRolePermissionsSchema,\n assignRoleUsersResponseSchema,\n assignRoleUsersSchema,\n createRoleSchema,\n deleteRoleResponseSchema,\n errorResponseSchema,\n listRolePermissionsQuerySchema,\n listRolePermissionsResponseSchema,\n listRolesQuerySchema,\n listRolesResponseSchema,\n listRoleUsersQuerySchema,\n listRoleUsersResponseSchema,\n roleIdParamSchema,\n rolePermissionParamSchema,\n roleResponseSchema,\n roleUserParamSchema,\n seedRolesResponseSchema,\n updateRoleSchema,\n} from './roles.schema';\n\nexport const listRolesRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Roles'],\n summary: 'List roles',\n request: {\n query: listRolesQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listRolesResponseSchema,\n },\n },\n description: 'List of roles',\n },\n },\n});\n\nexport const getRoleRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Roles'],\n summary: 'Get role by ID',\n request: {\n params: roleIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: roleResponseSchema,\n },\n },\n description: 'Role details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nexport const createRoleRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Roles'],\n summary: 'Create role',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: createRoleSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: roleResponseSchema,\n },\n },\n description: 'Role created',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid permission assignment',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role code already exists',\n },\n },\n});\n\nexport const updateRoleRoute = createRoute({\n method: 'put',\n path: '/{id}',\n tags: ['Roles'],\n summary: 'Update role',\n request: {\n params: roleIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: updateRoleSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: roleResponseSchema,\n },\n },\n description: 'Role updated',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid permission assignment',\n },\n 403: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role is not editable',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nexport const deleteRoleRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Roles'],\n summary: 'Delete role',\n request: {\n params: roleIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: deleteRoleResponseSchema,\n },\n },\n description: 'Role deleted',\n },\n 403: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role is not deletable',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nexport const listRolePermissionsRoute = createRoute({\n method: 'get',\n path: '/{id}/permissions',\n tags: ['Roles'],\n summary: 'List permissions assigned to a role',\n request: {\n params: roleIdParamSchema,\n query: listRolePermissionsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listRolePermissionsResponseSchema,\n },\n },\n description: 'Role permissions',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nexport const assignRolePermissionsRoute = createRoute({\n method: 'post',\n path: '/{id}/permissions',\n tags: ['Roles'],\n summary: 'Assign permissions to a role',\n request: {\n params: roleIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: assignRolePermissionsSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: assignRolePermissionsResponseSchema,\n },\n },\n description: 'Permissions assigned',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid permissions',\n },\n 403: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role is not editable',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nexport const listRoleUsersRoute = createRoute({\n method: 'get',\n path: '/{id}/users',\n tags: ['Roles'],\n summary: 'List users assigned to a role',\n request: {\n params: roleIdParamSchema,\n query: listRoleUsersQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listRoleUsersResponseSchema,\n },\n },\n description: 'Role users',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nexport const assignRoleUsersRoute = createRoute({\n method: 'post',\n path: '/{id}/users',\n tags: ['Roles'],\n summary: 'Assign users to a role',\n request: {\n params: roleIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: assignRoleUsersSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: assignRoleUsersResponseSchema,\n },\n },\n description: 'Users assigned',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid users',\n },\n 403: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role is not editable',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nexport const revokeRolePermissionRoute = createRoute({\n method: 'delete',\n path: '/{id}/permissions/{permissionId}',\n tags: ['Roles'],\n summary: 'Revoke a permission from a role',\n request: {\n params: rolePermissionParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: deleteRoleResponseSchema,\n },\n },\n description: 'Permission revoked',\n },\n 403: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role is not editable',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role or permission not found',\n },\n },\n});\n\nexport const revokeRoleUserRoute = createRoute({\n method: 'delete',\n path: '/{id}/users/{userId}',\n tags: ['Roles'],\n summary: 'Remove a user from a role',\n request: {\n params: roleUserParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: deleteRoleResponseSchema,\n },\n },\n description: 'User removed',\n },\n 403: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role is not editable',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role or user not found',\n },\n },\n});\n\nexport const seedRolesRoute = createRoute({\n method: 'post',\n path: '/seed',\n tags: ['Roles'],\n summary: 'Seed tenant roles from config',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: seedRolesResponseSchema,\n },\n },\n description: 'Seeded roles',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid role config',\n },\n },\n});\n\nconst IAM_ALL = 'iam:all:all';\n\nconst roleRoutesBase = new OpenAPIHono<AuthEnv>().use('*', (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n}) as OpenAPIHono<AuthEnv>;\n\nconst roleRoutes = roleRoutesBase\n .openapi(listRolesRoute, listRolesHandler)\n .openapi(seedRolesRoute, seedRolesHandler)\n .openapi(getRoleRoute, getRoleHandler)\n .openapi(createRoleRoute, createRoleHandler)\n .openapi(updateRoleRoute, updateRoleHandler)\n .openapi(listRolePermissionsRoute, listRolePermissionsHandler)\n .openapi(assignRolePermissionsRoute, assignRolePermissionsHandler)\n .openapi(revokeRolePermissionRoute, revokeRolePermissionHandler)\n .openapi(listRoleUsersRoute, listRoleUsersHandler)\n .openapi(assignRoleUsersRoute, assignRoleUsersHandler)\n .openapi(revokeRoleUserRoute, revokeRoleUserHandler)\n .openapi(deleteRoleRoute, deleteRoleHandler);\n\nexport default roleRoutes;\n","import { randomUUID } from 'node:crypto';\nimport type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, inArray } from 'drizzle-orm';\nimport {\n permissionsInIam,\n rolePermissionsInIam,\n rolesInIam,\n} from '../../../db/schema';\nimport { seedPermissions } from '../../../lib/iam-seed';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { assignRolePermissionsRoute } from '../roles.route';\n\nexport const assignRolePermissionsHandler: RouteHandler<\n typeof assignRolePermissionsRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n const config = c.get('config');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const permissionIds = [...new Set(body.permissionIds)];\n\n const [role] = await database\n .select({\n id: rolesInIam.id,\n isEditable: rolesInIam.isEditable,\n })\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!role) {\n return c.json({ error: 'Role not found' }, 404);\n }\n if (!role.isEditable) {\n return c.json({ error: 'Role is not editable' }, 403);\n }\n\n await seedPermissions({\n database,\n permissions: config.permissions,\n });\n\n const existingPermissions = permissionIds.length\n ? await database\n .select({ id: permissionsInIam.id })\n .from(permissionsInIam)\n .where(inArray(permissionsInIam.id, permissionIds))\n : [];\n\n const existingPermissionIds = new Set(\n existingPermissions.map((permission) => permission.id),\n );\n const missingPermissionIds = permissionIds.filter(\n (permissionId) => !existingPermissionIds.has(permissionId),\n );\n\n if (missingPermissionIds.length) {\n return c.json(\n { error: `Unknown permissions: ${missingPermissionIds.join(', ')}` },\n 400,\n );\n }\n\n const created = permissionIds.length\n ? await database\n .insert(rolePermissionsInIam)\n .values(\n permissionIds.map((permissionId) => ({\n id: randomUUID(),\n tenantId: resolvedTenantId,\n roleId: id,\n permissionId,\n })),\n )\n .onConflictDoNothing({\n target: [\n rolePermissionsInIam.tenantId,\n rolePermissionsInIam.permissionId,\n rolePermissionsInIam.roleId,\n ],\n })\n .returning({ permissionId: rolePermissionsInIam.permissionId })\n : [];\n\n return c.json(\n {\n created: created.length,\n skipped: permissionIds.length - created.length,\n },\n 200,\n );\n};\n","import { randomUUID } from 'node:crypto';\nimport type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, inArray } from 'drizzle-orm';\nimport { rolesInIam, userRolesInIam, usersInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { assignRoleUsersRoute } from '../roles.route';\n\nexport const assignRoleUsersHandler: RouteHandler<\n typeof assignRoleUsersRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n const config = c.get('config');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const userIds = [...new Set(body.userIds)];\n\n const [role] = await database\n .select({\n id: rolesInIam.id,\n isEditable: rolesInIam.isEditable,\n })\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!role) {\n return c.json({ error: 'Role not found' }, 404);\n }\n if (!role.isEditable) {\n return c.json({ error: 'Role is not editable' }, 403);\n }\n\n const existingUsers = userIds.length\n ? await database\n .select({ id: usersInIam.id })\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, tenantId),\n inArray(usersInIam.id, userIds),\n ),\n )\n : [];\n\n const existingUserIds = new Set(existingUsers.map((user) => user.id));\n const missingUserIds = userIds.filter(\n (userId) => !existingUserIds.has(userId),\n );\n\n if (missingUserIds.length) {\n return c.json(\n { error: `Unknown users: ${missingUserIds.join(', ')}` },\n 400,\n );\n }\n\n const created = userIds.length\n ? await database\n .insert(userRolesInIam)\n .values(\n userIds.map((userId) => ({\n id: randomUUID(),\n tenantId: resolvedTenantId,\n roleId: id,\n userId,\n })),\n )\n .onConflictDoNothing({\n target: [\n userRolesInIam.tenantId,\n userRolesInIam.userId,\n userRolesInIam.roleId,\n ],\n })\n .returning({ userId: userRolesInIam.userId })\n : [];\n\n return c.json(\n {\n created: created.length,\n skipped: userIds.length - created.length,\n },\n 200,\n );\n};\n","import { randomUUID } from 'node:crypto';\nimport type { RouteHandler } from '@hono/zod-openapi';\nimport { rolesInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { seedPermissions, syncRolePermissions } from '../../../lib/iam-seed';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { createRoleRoute } from '../roles.route';\n\nexport const createRoleHandler: RouteHandler<\n typeof createRoleRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const permissionIds = [...new Set(body.permissionIds ?? [])];\n\n const role = await withTransaction(database, async (tx) => {\n await seedPermissions({\n database: tx,\n permissions: config.permissions,\n });\n\n const [createdRole] = await tx\n .insert(rolesInIam)\n .values({\n id: randomUUID(),\n tenantId: resolvedTenantId,\n name: body.name ?? { en: body.code },\n description: body.description ?? { en: body.code },\n code: body.code,\n isSystem: body.isSystem ?? false,\n isEditable: body.isEditable ?? true,\n isDeletable: body.isDeletable ?? true,\n })\n .returning();\n\n if (body.permissionIds !== undefined) {\n await syncRolePermissions({\n database: tx,\n tenantId: resolvedTenantId,\n roleId: createdRole.id,\n permissionIds,\n });\n }\n\n return createdRole;\n });\n\n return c.json(\n {\n role: {\n ...role,\n permissionIds,\n permissionCount: permissionIds.length,\n },\n },\n 201,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { rolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { deleteRoleRoute } from '../roles.route';\n\nexport const deleteRoleHandler: RouteHandler<\n typeof deleteRoleRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n if (!existing.isDeletable) {\n return c.json({ error: 'Role is not deletable' }, 403);\n }\n\n await database\n .delete(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)));\n\n return c.json({ message: 'Role deleted' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport {\n rolePermissionsInIam,\n rolesInIam,\n userRolesInIam,\n} from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getRoleRoute } from '../roles.route';\n\nexport const getRoleHandler: RouteHandler<\n typeof getRoleRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [role] = await database\n .select({\n id: rolesInIam.id,\n tenantId: rolesInIam.tenantId,\n createdAt: rolesInIam.createdAt,\n updatedAt: rolesInIam.updatedAt,\n name: rolesInIam.name,\n description: rolesInIam.description,\n code: rolesInIam.code,\n isSystem: rolesInIam.isSystem,\n isEditable: rolesInIam.isEditable,\n isDeletable: rolesInIam.isDeletable,\n permissionIds: sql<string[] | null>`COALESCE(\n (\n select array_to_json(array_agg(${rolePermissionsInIam.permissionId}))\n from ${rolePermissionsInIam}\n where ${and(\n eq(rolePermissionsInIam.tenantId, tenantId),\n eq(rolePermissionsInIam.roleId, rolesInIam.id),\n )}\n ),\n '[]'::json\n )`,\n permissionCount: sql<number>`(\n select count(*)::int\n from ${rolePermissionsInIam}\n where ${and(\n eq(rolePermissionsInIam.tenantId, tenantId),\n eq(rolePermissionsInIam.roleId, rolesInIam.id),\n )}\n )`,\n userCount: sql<number>`(\n select count(*)::int\n from ${userRolesInIam}\n where ${and(\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.roleId, rolesInIam.id),\n )}\n )`,\n })\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!role) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n return c.json(\n {\n role: {\n ...role,\n permissionIds: role.permissionIds ?? undefined,\n },\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { rolePermissionsInIam, rolesInIam } from '../../../db/schema';\nimport {\n filterAndSortPermissions,\n getMergedPermissionCatalog,\n} from '../../../lib/permission-catalog';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listRolePermissionsRoute } from '../roles.route';\n\nexport const listRolePermissionsHandler: RouteHandler<\n typeof listRolePermissionsRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const query = c.req.valid('query');\n const database = c.get('database');\n const config = c.get('config');\n const tenantId = c.get('tenantId');\n\n const [role] = await database\n .select({ id: rolesInIam.id })\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!role) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const [assignedPermissions, permissionCatalog] = await Promise.all([\n database\n .select({ permissionId: rolePermissionsInIam.permissionId })\n .from(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.tenantId, tenantId),\n eq(rolePermissionsInIam.roleId, id),\n ),\n )\n .then((rows) => new Set(rows.map((row) => row.permissionId))),\n getMergedPermissionCatalog({\n database,\n permissions: config.permissions,\n }),\n ]);\n\n const sortedPermissions = filterAndSortPermissions(\n permissionCatalog.filter((permission) =>\n assignedPermissions.has(permission.id),\n ),\n query,\n );\n\n const total = sortedPermissions.length;\n const permissions = sortedPermissions.slice(offset, offset + limit);\n\n return c.json({ permissions, total, page, limit }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, asc, desc, eq, ilike, or, sql } from 'drizzle-orm';\nimport { rolesInIam, userRolesInIam, usersInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listRoleUsersRoute } from '../roles.route';\n\nconst sortColumnMap = {\n createdAt: usersInIam.createdAt,\n updatedAt: usersInIam.updatedAt,\n fullName: usersInIam.fullName,\n handle: usersInIam.handle,\n lastSignInAt: usersInIam.lastSignInAt,\n} as const;\n\nfunction getRoleUserSearchCondition(\n search: string,\n filter?: '' | 'fullName' | 'email' | 'phone' | 'handle',\n) {\n const term = `%${search}%`;\n\n if (filter === 'fullName') {\n return ilike(usersInIam.fullName, term);\n }\n if (filter === 'email') {\n return ilike(usersInIam.email, term);\n }\n if (filter === 'phone') {\n return ilike(usersInIam.phone, term);\n }\n if (filter === 'handle') {\n return ilike(usersInIam.handle, term);\n }\n\n return or(\n ilike(usersInIam.fullName, term),\n ilike(usersInIam.email, term),\n ilike(usersInIam.phone, term),\n ilike(usersInIam.handle, term),\n );\n}\n\nasync function ensureRoleExists({\n database,\n id,\n tenantId,\n}: {\n database: AuthEnv['Variables']['database'];\n id: string;\n tenantId: string;\n}) {\n const [role] = await database\n .select({ id: rolesInIam.id })\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n return role;\n}\n\nexport const listRoleUsersHandler: RouteHandler<\n typeof listRoleUsersRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const role = await ensureRoleExists({ database, id, tenantId });\n if (!role) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.roleId, id),\n eq(usersInIam.tenantId, tenantId),\n ];\n\n if (query.search) {\n const searchCondition = getRoleUserSearchCondition(\n query.search,\n query.filter,\n );\n if (searchCondition) {\n conditions.push(searchCondition);\n }\n }\n\n const orderDir = query.order === 'asc' ? asc : desc;\n const sortCol =\n query.sort && sortColumnMap[query.sort]\n ? sortColumnMap[query.sort]\n : usersInIam.createdAt;\n\n const [users, totalResult] = await Promise.all([\n database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .from(userRolesInIam)\n .innerJoin(usersInIam, eq(usersInIam.id, userRolesInIam.userId))\n .where(and(...conditions))\n .orderBy(orderDir(sortCol))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(userRolesInIam)\n .innerJoin(usersInIam, eq(usersInIam.id, userRolesInIam.userId))\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json(\n {\n users: users.map((user) => ({\n ...user,\n roles: null,\n })),\n total,\n page,\n limit,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, asc, desc, eq, ilike, or, sql } from 'drizzle-orm';\nimport {\n rolePermissionsInIam,\n rolesInIam,\n userRolesInIam,\n} from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listRolesRoute } from '../roles.route';\n\nconst sortColumnMap = {\n createdAt: rolesInIam.createdAt,\n updatedAt: rolesInIam.updatedAt,\n code: rolesInIam.code,\n} as const;\n\nexport const listRolesHandler: RouteHandler<\n typeof listRolesRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [eq(rolesInIam.tenantId, tenantId)];\n if (query.search) {\n const term = `%${query.search}%`;\n const searchCondition =\n query.filter === 'code'\n ? ilike(rolesInIam.code, term)\n : or(\n ilike(rolesInIam.code, term),\n sql`cast(${rolesInIam.name} as text) ilike ${term}`,\n sql`cast(${rolesInIam.description} as text) ilike ${term}`,\n );\n\n if (searchCondition) {\n conditions.push(searchCondition);\n }\n }\n\n const orderDir = query.order === 'asc' ? asc : desc;\n const sortCol =\n query.sort && sortColumnMap[query.sort]\n ? sortColumnMap[query.sort]\n : rolesInIam.createdAt;\n\n const [roles, totalResult] = await Promise.all([\n database\n .select({\n id: rolesInIam.id,\n tenantId: rolesInIam.tenantId,\n createdAt: rolesInIam.createdAt,\n updatedAt: rolesInIam.updatedAt,\n name: rolesInIam.name,\n description: rolesInIam.description,\n code: rolesInIam.code,\n isSystem: rolesInIam.isSystem,\n isEditable: rolesInIam.isEditable,\n isDeletable: rolesInIam.isDeletable,\n permissionCount: sql<number>`(\n select count(*)::int\n from ${rolePermissionsInIam}\n where ${and(\n eq(rolePermissionsInIam.tenantId, tenantId),\n eq(rolePermissionsInIam.roleId, rolesInIam.id),\n )}\n )`,\n userCount: sql<number>`(\n select count(*)::int\n from ${userRolesInIam}\n where ${and(\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.roleId, rolesInIam.id),\n )}\n )`,\n })\n .from(rolesInIam)\n .where(and(...conditions))\n .orderBy(orderDir(sortCol))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(rolesInIam)\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ roles, total, page, limit });\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { rolePermissionsInIam, rolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { revokeRolePermissionRoute } from '../roles.route';\n\nexport const revokeRolePermissionHandler: RouteHandler<\n typeof revokeRolePermissionRoute,\n AuthEnv\n> = async (c) => {\n const { id, permissionId } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [role] = await database\n .select({\n id: rolesInIam.id,\n isEditable: rolesInIam.isEditable,\n })\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!role) {\n return c.json({ error: 'Role not found' }, 404);\n }\n if (!role.isEditable) {\n return c.json({ error: 'Role is not editable' }, 403);\n }\n\n const [deleted] = await database\n .delete(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.tenantId, tenantId),\n eq(rolePermissionsInIam.roleId, id),\n eq(rolePermissionsInIam.permissionId, permissionId),\n ),\n )\n .returning({ id: rolePermissionsInIam.id });\n\n if (!deleted) {\n return c.json({ error: 'Role permission not found' }, 404);\n }\n\n return c.json({ message: 'Permission revoked from role' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { rolesInIam, userRolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { revokeRoleUserRoute } from '../roles.route';\n\nexport const revokeRoleUserHandler: RouteHandler<\n typeof revokeRoleUserRoute,\n AuthEnv\n> = async (c) => {\n const { id, userId } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [role] = await database\n .select({\n id: rolesInIam.id,\n isEditable: rolesInIam.isEditable,\n })\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!role) {\n return c.json({ error: 'Role not found' }, 404);\n }\n if (!role.isEditable) {\n return c.json({ error: 'Role is not editable' }, 403);\n }\n\n const [deleted] = await database\n .delete(userRolesInIam)\n .where(\n and(\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.roleId, id),\n eq(userRolesInIam.userId, userId),\n ),\n )\n .returning({ id: userRolesInIam.id });\n\n if (!deleted) {\n return c.json({ error: 'Role user not found' }, 404);\n }\n\n return c.json({ message: 'User removed from role' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, inArray, sql } from 'drizzle-orm';\nimport { rolePermissionsInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { seedPermissions, seedRoles } from '../../../lib/iam-seed';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { seedRolesRoute } from '../roles.route';\n\nexport const seedRolesHandler: RouteHandler<\n typeof seedRolesRoute,\n AuthEnv\n> = async (c) => {\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n if (!config.roles?.length) {\n return c.json({ error: 'No roles configured for seeding' }, 400);\n }\n\n const rolesToSeed = config.roles;\n\n const seededRoles = await withTransaction(database, async (tx) => {\n await seedPermissions({\n database: tx,\n permissions: config.permissions,\n });\n\n return seedRoles({\n database: tx,\n tenantId: resolvedTenantId,\n roles: rolesToSeed,\n });\n });\n\n const permissionCountRows = seededRoles.length\n ? await database\n .select({\n roleId: rolePermissionsInIam.roleId,\n count: sql<number>`count(*)::int`,\n })\n .from(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.tenantId, resolvedTenantId),\n inArray(\n rolePermissionsInIam.roleId,\n seededRoles.map((role) => role.id),\n ),\n ),\n )\n .groupBy(rolePermissionsInIam.roleId)\n : [];\n\n const permissionCountByRoleId = new Map(\n permissionCountRows.map((row) => [row.roleId, row.count] as const),\n );\n\n const roles = seededRoles.map((role) => ({\n ...role,\n permissionCount: permissionCountByRoleId.get(role.id) ?? 0,\n }));\n\n return c.json(\n {\n roles,\n total: roles.length,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { rolesInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { seedPermissions, syncRolePermissions } from '../../../lib/iam-seed';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateRoleRoute } from '../roles.route';\n\nexport const updateRoleHandler: RouteHandler<\n typeof updateRoleRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n const config = c.get('config');\n const tenantId = c.get('tenantId');\n const permissionIds =\n body.permissionIds === undefined\n ? undefined\n : [...new Set(body.permissionIds)];\n\n const [existing] = await database\n .select()\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n if (!existing.isEditable) {\n return c.json({ error: 'Role is not editable' }, 403);\n }\n\n const updateData: Partial<typeof rolesInIam.$inferInsert> = {};\n\n if (body.name !== undefined) {\n updateData.name = body.name;\n }\n if (body.description !== undefined) {\n updateData.description = body.description;\n }\n if (body.code !== undefined) {\n updateData.code = body.code;\n }\n if (body.isSystem !== undefined) {\n updateData.isSystem = body.isSystem;\n }\n if (body.isEditable !== undefined) {\n updateData.isEditable = body.isEditable;\n }\n if (body.isDeletable !== undefined) {\n updateData.isDeletable = body.isDeletable;\n }\n\n const updated = await withTransaction(database, async (tx) => {\n await seedPermissions({\n database: tx,\n permissions: config.permissions,\n });\n\n const [role] = await tx\n .update(rolesInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .returning();\n\n if (!role) {\n return null;\n }\n\n if (permissionIds !== undefined) {\n await syncRolePermissions({\n database: tx,\n tenantId,\n roleId: role.id,\n permissionIds,\n });\n }\n\n return role;\n });\n\n if (!updated) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n return c.json(\n {\n role: {\n ...updated,\n permissionIds,\n permissionCount: permissionIds?.length,\n },\n },\n 200,\n );\n};\n","import { z } from 'zod';\nimport { userSchema } from '../auth.schema';\nimport {\n listPermissionsQuerySchema,\n permissionSchema,\n} from '../permissions/permissions.schema';\n\nconst roleFilterValues = ['', 'code'] as const;\nconst roleSortValues = ['createdAt', 'updatedAt', 'code'] as const;\n\n// Query schemas\nexport const listRolesQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n search: z.string().optional(),\n filter: z.enum(roleFilterValues).optional(),\n sort: z.enum(roleSortValues).optional(),\n order: z.enum(['asc', 'desc']).optional(),\n});\n\n// Path parameter schemas\nexport const roleIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Request body schemas\nexport const createRoleSchema = z.object({\n name: z.unknown().optional(),\n description: z.unknown().optional(),\n code: z.string(),\n permissionIds: z.array(z.string()).optional(),\n isSystem: z.boolean().optional(),\n isEditable: z.boolean().optional(),\n isDeletable: z.boolean().optional(),\n});\n\nexport const updateRoleSchema = z.object({\n name: z.unknown().optional(),\n description: z.unknown().optional(),\n code: z.string().optional(),\n permissionIds: z.array(z.string()).optional(),\n isSystem: z.boolean().optional(),\n isEditable: z.boolean().optional(),\n isDeletable: z.boolean().optional(),\n});\n\nexport const assignRolePermissionsSchema = z.object({\n permissionIds: z.array(z.string()).min(1),\n});\n\nexport const assignRoleUsersSchema = z.object({\n userIds: z.array(z.uuid()).min(1),\n});\n\nexport const rolePermissionParamSchema = z.object({\n id: z.uuid(),\n permissionId: z.string(),\n});\n\nexport const roleUserParamSchema = z.object({\n id: z.uuid(),\n userId: z.uuid(),\n});\n\n// Response schemas\nexport const roleSchema = z.object({\n id: z.uuid(),\n tenantId: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n name: z.unknown(),\n description: z.unknown(),\n code: z.string(),\n isSystem: z.boolean(),\n isEditable: z.boolean(),\n isDeletable: z.boolean(),\n permissionIds: z.array(z.string()).optional(),\n permissionCount: z.number().optional(),\n userCount: z.number().optional(),\n});\n\nexport const listRolesResponseSchema = z.object({\n roles: z.array(roleSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const roleResponseSchema = z.object({\n role: roleSchema,\n});\n\nexport const listRolePermissionsResponseSchema = z.object({\n permissions: z.array(permissionSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const assignRolePermissionsResponseSchema = z.object({\n created: z.number(),\n skipped: z.number(),\n});\n\nexport const listRoleUsersQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n search: z.string().optional(),\n filter: z.enum(['', 'fullName', 'email', 'phone', 'handle']).optional(),\n sort: z\n .enum(['createdAt', 'updatedAt', 'fullName', 'handle', 'lastSignInAt'])\n .optional(),\n order: z.enum(['asc', 'desc']).optional(),\n});\n\nexport const listRoleUsersResponseSchema = z.object({\n users: z.array(userSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const assignRoleUsersResponseSchema = z.object({\n created: z.number(),\n skipped: z.number(),\n});\n\nexport const deleteRoleResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const seedRolesResponseSchema = z.object({\n roles: z.array(roleSchema),\n total: z.number(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n\nexport const listRolePermissionsQuerySchema = listPermissionsQuerySchema;\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport { getSessionHandler } from './handler/get-session';\nimport { listSessionsHandler } from './handler/list-sessions';\nimport { revokeAllSessionsHandler } from './handler/revoke-all-sessions';\nimport { revokeSessionHandler } from './handler/revoke-session';\nimport {\n errorResponseSchema,\n listSessionsQuerySchema,\n listSessionsResponseSchema,\n revokeSessionResponseSchema,\n sessionIdParamSchema,\n sessionResponseSchema,\n userIdParamSchema,\n} from './sessions.schema';\n\nexport const listSessionsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Sessions'],\n summary: 'List sessions',\n request: {\n query: listSessionsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listSessionsResponseSchema,\n },\n },\n description: 'List of sessions',\n },\n },\n});\n\nexport const getSessionRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Sessions'],\n summary: 'Get session by ID',\n request: {\n params: sessionIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: sessionResponseSchema,\n },\n },\n description: 'Session details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Session not found',\n },\n },\n});\n\nexport const revokeSessionRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Sessions'],\n summary: 'Revoke session',\n request: {\n params: sessionIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: revokeSessionResponseSchema,\n },\n },\n description: 'Session revoked',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Session not found',\n },\n },\n});\n\nexport const revokeAllSessionsRoute = createRoute({\n method: 'delete',\n path: '/user/{userId}',\n tags: ['Sessions'],\n summary: 'Revoke all user sessions',\n request: {\n params: userIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: revokeSessionResponseSchema,\n },\n },\n description: 'All user sessions revoked',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nconst IAM_ALL = 'iam:all:all';\n\nconst sessionRoutesBase = new OpenAPIHono<AuthEnv>().use('*', (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n}) as OpenAPIHono<AuthEnv>;\n\nconst sessionRoutes = sessionRoutesBase\n .openapi(listSessionsRoute, listSessionsHandler)\n .openapi(getSessionRoute, getSessionHandler)\n .openapi(revokeSessionRoute, revokeSessionHandler)\n .openapi(revokeAllSessionsRoute, revokeAllSessionsHandler);\n\nexport default sessionRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { sessionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getSessionRoute } from '../sessions.route';\n\nexport const getSessionHandler: RouteHandler<\n typeof getSessionRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [session] = await database\n .select()\n .from(sessionsInIam)\n .where(and(eq(sessionsInIam.id, id), eq(sessionsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n return c.json({ session }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { sessionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listSessionsRoute } from '../sessions.route';\n\nexport const listSessionsHandler: RouteHandler<\n typeof listSessionsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [eq(sessionsInIam.tenantId, tenantId)];\n if (query.userId) {\n conditions.push(eq(sessionsInIam.userId, query.userId));\n }\n\n const [sessions, totalResult] = await Promise.all([\n database\n .select()\n .from(sessionsInIam)\n .where(and(...conditions))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(sessionsInIam)\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ sessions, total, page, limit }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { sessionsInIam, usersInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { revokeAllSessionsRoute } from '../sessions.route';\n\nexport const revokeAllSessionsHandler: RouteHandler<\n typeof revokeAllSessionsRoute,\n AuthEnv\n> = async (c) => {\n const { userId } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [user] = await database\n .select()\n .from(usersInIam)\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!user) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n ),\n );\n\n return c.json({ message: 'All user sessions revoked' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { sessionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { revokeSessionRoute } from '../sessions.route';\n\nexport const revokeSessionHandler: RouteHandler<\n typeof revokeSessionRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(sessionsInIam)\n .where(and(eq(sessionsInIam.id, id), eq(sessionsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n await database\n .delete(sessionsInIam)\n .where(and(eq(sessionsInIam.id, id), eq(sessionsInIam.tenantId, tenantId)));\n\n return c.json({ message: 'Session revoked' }, 200);\n};\n","import { z } from 'zod';\nimport { sessionSchema } from '../auth.schema';\n\n// Query schemas\nexport const listSessionsQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n userId: z.uuid().optional(),\n});\n\n// Path parameter schemas\nexport const sessionIdParamSchema = z.object({\n id: z.uuid(),\n});\n\nexport const userIdParamSchema = z.object({\n userId: z.uuid(),\n});\n\n// Response schemas\nexport const listSessionsResponseSchema = z.object({\n sessions: z.array(sessionSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const sessionResponseSchema = z.object({\n session: sessionSchema,\n});\n\nexport const revokeSessionResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { z } from 'zod';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport { errorResponseSchema } from '../auth.schema';\nimport { tenantHandler } from './handler/tenant';\n\nconst IAM_ALL = 'iam:all:all';\n\nexport const tenantRoute = createRoute({\n method: 'get',\n path: '/init',\n tags: ['System'],\n summary: 'Get tenant info',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: z.object({\n host: z.string().nullable(),\n tenantId: z.string().nullable(),\n tenant: z\n .object({\n id: z.string(),\n name: z.unknown(),\n description: z.unknown(),\n isActive: z.boolean(),\n })\n .nullable(),\n status: z.literal('ok'),\n }),\n },\n },\n description: 'Tenant info',\n },\n 500: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Server error',\n },\n },\n});\n\nconst tenantRoutesBase = new OpenAPIHono<AuthEnv>().use('*', (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n}) as OpenAPIHono<AuthEnv>;\n\nconst tenantRoutes = tenantRoutesBase.openapi(tenantRoute, tenantHandler);\n\nexport default tenantRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../../types/context';\nimport type { tenantRoute } from '../system.route';\n\nexport const tenantHandler: RouteHandler<typeof tenantRoute, AuthEnv> = (c) => {\n const tenantId = c.get('tenantId');\n const tenant = c.get('tenant');\n const host = c.get('host');\n\n return c.json(\n {\n host: host || null,\n tenantId: tenantId || null,\n tenant: tenant || null,\n status: 'ok' as const,\n },\n 200,\n );\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport { createTenantHandler } from './handler/create-tenant';\nimport { deleteTenantHandler } from './handler/delete-tenant';\nimport { getTenantHandler } from './handler/get-tenant';\nimport { listTenantsHandler } from './handler/list-tenants';\nimport { updateTenantHandler } from './handler/update-tenant';\nimport {\n createTenantSchema,\n deleteTenantResponseSchema,\n errorResponseSchema,\n listTenantsQuerySchema,\n listTenantsResponseSchema,\n tenantIdParamSchema,\n tenantResponseSchema,\n updateTenantSchema,\n} from './tenants.schema';\n\nexport const listTenantsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Tenants'],\n summary: 'List tenants',\n request: {\n query: listTenantsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listTenantsResponseSchema,\n },\n },\n description: 'List of tenants',\n },\n },\n});\n\nexport const getTenantRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Tenants'],\n summary: 'Get tenant by ID',\n request: {\n params: tenantIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: tenantResponseSchema,\n },\n },\n description: 'Tenant details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Tenant not found',\n },\n },\n});\n\nexport const createTenantRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Tenants'],\n summary: 'Create tenant',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: createTenantSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: tenantResponseSchema,\n },\n },\n description: 'Tenant created',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Tenant already exists',\n },\n },\n});\n\nexport const updateTenantRoute = createRoute({\n method: 'put',\n path: '/{id}',\n tags: ['Tenants'],\n summary: 'Update tenant',\n request: {\n params: tenantIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: updateTenantSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: tenantResponseSchema,\n },\n },\n description: 'Tenant updated',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Tenant not found',\n },\n },\n});\n\nexport const deleteTenantRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Tenants'],\n summary: 'Delete tenant',\n request: {\n params: tenantIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: deleteTenantResponseSchema,\n },\n },\n description: 'Tenant deleted',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Tenant not found',\n },\n },\n});\n\nconst IAM_ALL = 'iam:all:all';\n\nconst tenantRoutesBase = new OpenAPIHono<AuthEnv>().use('*', (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n}) as OpenAPIHono<AuthEnv>;\n\nconst tenantRoutes = tenantRoutesBase\n .openapi(listTenantsRoute, listTenantsHandler)\n .openapi(getTenantRoute, getTenantHandler)\n .openapi(createTenantRoute, createTenantHandler)\n .openapi(updateTenantRoute, updateTenantHandler)\n .openapi(deleteTenantRoute, deleteTenantHandler);\n\nexport default tenantRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { eq } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { createTenantRoute } from '../tenants.route';\n\nexport const createTenantHandler: RouteHandler<\n typeof createTenantRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const database = c.get('database');\n\n const [existing] = await database\n .select()\n .from(tenantsInIam)\n .where(eq(tenantsInIam.id, body.id))\n .limit(1);\n\n if (existing) {\n return c.json({ error: 'Tenant already exists' }, 409);\n }\n\n const [tenant] = await database\n .insert(tenantsInIam)\n .values({\n id: body.id,\n name: body.name,\n description: body.description || null,\n theme: body.theme || null,\n supportedLanguages: body.supportedLanguages || null,\n defaultLanguage: body.defaultLanguage || null,\n supportedCurrency: body.supportedCurrency || null,\n defaultCurrency: body.defaultCurrency || null,\n timezone: body.timezone || null,\n isActive: body.isActive ?? true,\n locale: body.locale || null,\n settings: body.settings || null,\n seo: body.seo || null,\n })\n .returning();\n\n return c.json({ tenant }, 201);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { eq } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { deleteTenantRoute } from '../tenants.route';\n\nexport const deleteTenantHandler: RouteHandler<\n typeof deleteTenantRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n\n const [existing] = await database\n .select()\n .from(tenantsInIam)\n .where(eq(tenantsInIam.id, id))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Tenant not found' }, 404);\n }\n\n await database.delete(tenantsInIam).where(eq(tenantsInIam.id, id));\n\n return c.json({ message: 'Tenant deleted' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { eq } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getTenantRoute } from '../tenants.route';\n\nexport const getTenantHandler: RouteHandler<\n typeof getTenantRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n\n const [tenant] = await database\n .select()\n .from(tenantsInIam)\n .where(eq(tenantsInIam.id, id))\n .limit(1);\n\n if (!tenant) {\n return c.json({ error: 'Tenant not found' }, 404);\n }\n\n return c.json({ tenant }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, asc, desc, eq, ilike, or, sql } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listTenantsRoute } from '../tenants.route';\n\nconst sortColumnMap = {\n createdAt: tenantsInIam.createdAt,\n updatedAt: tenantsInIam.updatedAt,\n name: sql`${tenantsInIam.name}::text`,\n} as const;\n\nexport const listTenantsHandler: RouteHandler<\n typeof listTenantsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [];\n if (query.isActive !== undefined) {\n conditions.push(eq(tenantsInIam.isActive, query.isActive));\n }\n if (query.filter === 'isActive:true') {\n conditions.push(eq(tenantsInIam.isActive, true));\n } else if (query.filter === 'isActive:false') {\n conditions.push(eq(tenantsInIam.isActive, false));\n }\n if (query.search?.trim()) {\n const term = `%${query.search.trim()}%`;\n const searchCond = or(\n ilike(tenantsInIam.id, term),\n ilike(sql`${tenantsInIam.name}::text`, term),\n );\n if (searchCond) {\n conditions.push(searchCond);\n }\n }\n\n const orderDir = query.order === 'asc' ? asc : desc;\n const sortCol =\n query.sort && sortColumnMap[query.sort]\n ? sortColumnMap[query.sort]\n : tenantsInIam.createdAt;\n const whereClause = conditions.length > 0 ? and(...conditions) : undefined;\n\n const [tenants, totalResult] = await Promise.all([\n database\n .select()\n .from(tenantsInIam)\n .where(whereClause)\n .orderBy(orderDir(sortCol))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(tenantsInIam)\n .where(whereClause),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ tenants, total, page, limit }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { eq, sql } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateTenantRoute } from '../tenants.route';\n\nexport const updateTenantHandler: RouteHandler<\n typeof updateTenantRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n\n const [existing] = await database\n .select()\n .from(tenantsInIam)\n .where(eq(tenantsInIam.id, id))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Tenant not found' }, 404);\n }\n\n const updateData: Partial<typeof tenantsInIam.$inferInsert> = {};\n\n if (body.name !== undefined) {\n updateData.name = body.name;\n }\n if (body.description !== undefined) {\n updateData.description = body.description;\n }\n if (body.theme !== undefined) {\n updateData.theme = body.theme;\n }\n if (body.supportedLanguages !== undefined) {\n updateData.supportedLanguages = body.supportedLanguages;\n }\n if (body.defaultLanguage !== undefined) {\n updateData.defaultLanguage = body.defaultLanguage;\n }\n if (body.supportedCurrency !== undefined) {\n updateData.supportedCurrency = body.supportedCurrency;\n }\n if (body.defaultCurrency !== undefined) {\n updateData.defaultCurrency = body.defaultCurrency;\n }\n if (body.timezone !== undefined) {\n updateData.timezone = body.timezone;\n }\n if (body.isActive !== undefined) {\n updateData.isActive = body.isActive;\n }\n if (body.locale !== undefined) {\n updateData.locale = body.locale;\n }\n if (body.settings !== undefined) {\n updateData.settings = body.settings;\n }\n if (body.seo !== undefined) {\n updateData.seo = body.seo;\n }\n\n const [updated] = await database\n .update(tenantsInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(eq(tenantsInIam.id, id))\n .returning();\n\n if (!updated) {\n return c.json({ error: 'Tenant not found' }, 404);\n }\n\n return c.json({ tenant: updated }, 200);\n};\n","import { z } from 'zod';\n\nconst tenantSortFields = ['createdAt', 'updatedAt', 'name'] as const;\nconst tenantFilterValues = ['', 'isActive:true', 'isActive:false'] as const;\n\n// Query schemas\nexport const listTenantsQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n isActive: z.coerce.boolean().optional(),\n search: z.string().optional(),\n filter: z.enum(tenantFilterValues).optional(),\n sort: z.enum(tenantSortFields).optional(),\n order: z.enum(['asc', 'desc']).optional(),\n});\n\n// Path parameter schemas\nexport const tenantIdParamSchema = z.object({\n id: z.string(),\n});\n\n// Request body schemas\nexport const createTenantSchema = z.object({\n id: z.string().max(30),\n name: z.unknown(),\n description: z.unknown().optional(),\n theme: z.unknown().optional(),\n supportedLanguages: z.unknown().optional(),\n defaultLanguage: z.string().optional(),\n supportedCurrency: z.unknown().optional(),\n defaultCurrency: z.string().optional(),\n timezone: z.string().optional(),\n isActive: z.boolean().default(true).optional(),\n locale: z.unknown().optional(),\n settings: z.unknown().optional(),\n seo: z.unknown().optional(),\n});\n\nexport const updateTenantSchema = z.object({\n name: z.unknown().optional(),\n description: z.unknown().nullable().optional(),\n theme: z.unknown().nullable().optional(),\n supportedLanguages: z.unknown().nullable().optional(),\n defaultLanguage: z.string().nullable().optional(),\n supportedCurrency: z.unknown().nullable().optional(),\n defaultCurrency: z.string().nullable().optional(),\n timezone: z.string().nullable().optional(),\n isActive: z.boolean().optional(),\n locale: z.unknown().nullable().optional(),\n settings: z.unknown().nullable().optional(),\n seo: z.unknown().nullable().optional(),\n});\n\n// Response schemas\nexport const tenantSchema = z.object({\n id: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n name: z.unknown(),\n description: z.unknown().nullable(),\n theme: z.unknown().nullable(),\n supportedLanguages: z.unknown().nullable(),\n defaultLanguage: z.string().nullable(),\n supportedCurrency: z.unknown().nullable(),\n defaultCurrency: z.string().nullable(),\n timezone: z.string().nullable(),\n isActive: z.boolean(),\n locale: z.unknown().nullable(),\n settings: z.unknown().nullable(),\n seo: z.unknown().nullable(),\n});\n\nexport const listTenantsResponseSchema = z.object({\n tenants: z.array(tenantSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const tenantResponseSchema = z.object({\n tenant: tenantSchema,\n});\n\nexport const deleteTenantResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport { assignUserRoleHandler } from './handler/assign-user-role';\nimport { listUserRolesHandler } from './handler/list-user-roles';\nimport { revokeUserRoleHandler } from './handler/revoke-user-role';\nimport {\n assignUserRoleSchema,\n errorResponseSchema,\n listUserRolesQuerySchema,\n listUserRolesResponseSchema,\n revokeUserRoleResponseSchema,\n userRoleIdParamSchema,\n userRoleResponseSchema,\n} from './user-roles.schema';\n\nexport const listUserRolesRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['User Roles'],\n summary: 'List user roles',\n request: {\n query: listUserRolesQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listUserRolesResponseSchema,\n },\n },\n description: 'List of user roles',\n },\n },\n});\n\nexport const assignUserRoleRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['User Roles'],\n summary: 'Assign role to user',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: assignUserRoleSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: userRoleResponseSchema,\n },\n },\n description: 'Role assigned to user',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role already assigned to user',\n },\n },\n});\n\nexport const revokeUserRoleRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['User Roles'],\n summary: 'Revoke role from user',\n request: {\n params: userRoleIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: revokeUserRoleResponseSchema,\n },\n },\n description: 'Role revoked from user',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User role not found',\n },\n },\n});\n\nconst IAM_ALL = 'iam:all:all';\n\nconst userRoleRoutesBase = new OpenAPIHono<AuthEnv>().use('*', (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n}) as OpenAPIHono<AuthEnv>;\n\nconst userRoleRoutes = userRoleRoutesBase\n .openapi(listUserRolesRoute, listUserRolesHandler)\n .openapi(assignUserRoleRoute, assignUserRoleHandler)\n .openapi(revokeUserRoleRoute, revokeUserRoleHandler);\n\nexport default userRoleRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { userRolesInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { assignUserRoleRoute } from '../user-roles.route';\n\nexport const assignUserRoleHandler: RouteHandler<\n typeof assignUserRoleRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n try {\n const [userRole] = await database\n .insert(userRolesInIam)\n .values({\n tenantId: resolvedTenantId,\n userId: body.userId,\n roleId: body.roleId,\n })\n .returning();\n\n return c.json({ userRole }, 201);\n } catch (error: unknown) {\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n error.code === '23505'\n ) {\n return c.json({ error: 'Role already assigned to user' }, 409);\n }\n throw error;\n }\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { userRolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listUserRolesRoute } from '../user-roles.route';\n\nexport const listUserRolesHandler: RouteHandler<\n typeof listUserRolesRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const conditions = [eq(userRolesInIam.tenantId, tenantId)];\n if (query.userId) {\n conditions.push(eq(userRolesInIam.userId, query.userId));\n }\n if (query.roleId) {\n conditions.push(eq(userRolesInIam.roleId, query.roleId));\n }\n\n const userRoles = await database\n .select()\n .from(userRolesInIam)\n .where(and(...conditions));\n\n return c.json({ userRoles }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { userRolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { revokeUserRoleRoute } from '../user-roles.route';\n\nexport const revokeUserRoleHandler: RouteHandler<\n typeof revokeUserRoleRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(userRolesInIam)\n .where(\n and(eq(userRolesInIam.id, id), eq(userRolesInIam.tenantId, tenantId)),\n )\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'User role not found' }, 404);\n }\n\n await database\n .delete(userRolesInIam)\n .where(\n and(eq(userRolesInIam.id, id), eq(userRolesInIam.tenantId, tenantId)),\n );\n\n return c.json({ message: 'Role revoked from user' }, 200);\n};\n","import { z } from 'zod';\n\n// Query schemas\nexport const listUserRolesQuerySchema = z.object({\n userId: z.uuid().optional(),\n roleId: z.uuid().optional(),\n});\n\n// Path parameter schemas\nexport const userRoleIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Request body schemas\nexport const assignUserRoleSchema = z.object({\n userId: z.uuid(),\n roleId: z.uuid(),\n});\n\n// Response schemas\nexport const userRoleSchema = z.object({\n id: z.uuid(),\n tenantId: z.string(),\n userId: z.uuid(),\n roleId: z.uuid(),\n});\n\nexport const listUserRolesResponseSchema = z.object({\n userRoles: z.array(userRoleSchema),\n});\n\nexport const userRoleResponseSchema = z.object({\n userRole: userRoleSchema,\n});\n\nexport const revokeUserRoleResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { hasPermissionThrow } from '../../lib/has-role-permission';\nimport type { AuthEnv } from '../../types/context';\nimport { banUserHandler } from './handler/ban-user';\nimport { bulkInviteUsersHandler } from './handler/bulk-invite-users';\nimport { createUserHandler } from './handler/create-user';\nimport { deleteUserHandler } from './handler/delete-user';\nimport { getUserHandler } from './handler/get-user';\nimport { inviteUserHandler } from './handler/invite-user';\nimport { listUsersHandler } from './handler/list-users';\nimport { searchUsersHandler } from './handler/search-users';\nimport { updateUserHandler } from './handler/update-user';\nimport {\n banUserSchema,\n bulkInviteUsersResponseSchema,\n bulkInviteUsersSchema,\n createUserSchema,\n deleteUserResponseSchema,\n errorResponseSchema,\n inviteUserResultSchema,\n inviteUserSchema,\n listUsersQuerySchema,\n listUsersResponseSchema,\n searchUsersQuerySchema,\n searchUsersResponseSchema,\n updateUserSchema,\n userIdParamSchema,\n userResponseSchema,\n} from './users.schema';\n\nexport const listUsersRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Users'],\n summary: 'List users',\n request: {\n query: listUsersQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listUsersResponseSchema,\n },\n },\n description: 'List of users',\n },\n },\n});\n\nexport const getUserRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Users'],\n summary: 'Get user by ID',\n request: {\n params: userIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: userResponseSchema,\n },\n },\n description: 'User details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const createUserRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Users'],\n summary: 'Create user',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: createUserSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: userResponseSchema,\n },\n },\n description: 'User created',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User already exists',\n },\n },\n});\n\nexport const updateUserRoute = createRoute({\n method: 'put',\n path: '/{id}',\n tags: ['Users'],\n summary: 'Update user',\n request: {\n params: userIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: updateUserSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: userResponseSchema,\n },\n },\n description: 'User updated',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Handle already taken',\n },\n },\n});\n\nexport const deleteUserRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Users'],\n summary: 'Delete user',\n request: {\n params: userIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: deleteUserResponseSchema,\n },\n },\n description: 'User deleted',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const banUserRoute = createRoute({\n method: 'post',\n path: '/{id}/ban',\n tags: ['Users'],\n summary: 'Ban or unban user',\n request: {\n params: userIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: banUserSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: userResponseSchema,\n },\n },\n description: 'User ban status updated',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const searchUsersRoute = createRoute({\n method: 'get',\n path: '/search',\n tags: ['Users'],\n summary: 'Search users',\n request: {\n query: searchUsersQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: searchUsersResponseSchema,\n },\n },\n description: 'Search results',\n },\n },\n});\n\nexport const inviteUserRoute = createRoute({\n method: 'post',\n path: '/invite',\n tags: ['Users'],\n summary: 'Invite a single user',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: inviteUserSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: inviteUserResultSchema,\n },\n },\n description: 'User invited',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User or handle already exists',\n },\n },\n});\n\nexport const bulkInviteUsersRoute = createRoute({\n method: 'post',\n path: '/invite/bulk',\n tags: ['Users'],\n summary: 'Invite users in bulk',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: bulkInviteUsersSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: bulkInviteUsersResponseSchema,\n },\n },\n description: 'Bulk invite results',\n },\n },\n});\n\nconst IAM_ALL = 'iam:all:all';\n\nconst userRoutesBase = new OpenAPIHono<AuthEnv>().use('*', (c, next) => {\n hasPermissionThrow(c, IAM_ALL);\n return next();\n}) as OpenAPIHono<AuthEnv>;\n\nconst userRoutes = userRoutesBase\n .openapi(listUsersRoute, listUsersHandler)\n .openapi(getUserRoute, getUserHandler)\n .openapi(createUserRoute, createUserHandler)\n .openapi(updateUserRoute, updateUserHandler)\n .openapi(deleteUserRoute, deleteUserHandler)\n .openapi(banUserRoute, banUserHandler)\n .openapi(searchUsersRoute, searchUsersHandler)\n .openapi(inviteUserRoute, inviteUserHandler)\n .openapi(bulkInviteUsersRoute, bulkInviteUsersHandler);\n\nexport default userRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { fetchUserWithRoles } from '../../../db/orm';\nimport { usersInIam } from '../../../db/schema';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { AuthEnv } from '../../../types/context';\nimport type { banUserRoute } from '../users.route';\n\nexport const banUserHandler: RouteHandler<\n typeof banUserRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(usersInIam)\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n await database\n .update(usersInIam)\n .set({\n bannedUntil: body.bannedUntil ?? null,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)));\n\n const userWithRoles = await fetchUserWithRoles({\n database,\n userId: id,\n tenantId,\n });\n if (!userWithRoles) {\n return c.json({ error: 'User not found' }, 404);\n }\n return c.json({ user: normalizeUser(userWithRoles) }, 200);\n};\n","import { and, eq } from 'drizzle-orm';\nimport { accountsInIam, usersInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { hashPassword } from '../../../lib/crypto';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { createPhoneField } from '../../../lib/phone-validation';\nimport { generateHandle } from '../../../lib/session';\nimport type { AuthConfig, Database } from '../../../types';\nimport { checkHandleExists, checkUserExists } from './user';\n\ntype InvitePayload = {\n email?: string;\n phone?: string;\n fullName: string;\n handle?: string;\n image?: string;\n password?: string;\n emailVerified?: boolean;\n phoneVerified?: boolean;\n sendVia?: Array<'email' | 'sms'>;\n inviteUrl?: string;\n};\n\ntype InviteDelivery = {\n email?: 'sent' | 'skipped' | 'failed';\n sms?: 'sent' | 'skipped' | 'failed';\n};\n\nexport type InviteUserResult = {\n user: ReturnType<typeof normalizeUser>;\n delivery: InviteDelivery;\n inviteUrl: string | null;\n hasPassword: boolean;\n};\n\nconst resolveInviteUrl = ({\n inviteUrl,\n identifier,\n hasPassword,\n}: {\n inviteUrl?: string;\n identifier: string;\n hasPassword: boolean;\n}) => {\n if (inviteUrl) {\n return inviteUrl;\n }\n\n if (hasPassword) {\n return '/auth/sign-in';\n }\n\n return `/auth/set-password?identifier=${encodeURIComponent(identifier)}`;\n};\n\nexport const inviteUser =\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: invite flow mixes validation, persistence, and delivery reporting\n async function inviteUser({\n database,\n tenantId,\n config,\n payload,\n }: {\n database: Database;\n tenantId: string;\n config: AuthConfig;\n payload: InvitePayload;\n }): Promise<InviteUserResult> {\n const identifier = payload.email || payload.phone;\n if (!identifier) {\n throw new Error('Either email or phone is required');\n }\n\n const isEmail = identifier.includes('@');\n if (payload.phone) {\n const phoneValidator = createPhoneField(config);\n if (!phoneValidator.validate(payload.phone)) {\n throw new Error('Invalid phone number format');\n }\n }\n\n const existing = await checkUserExists({\n database,\n identifier,\n tenantId,\n isEmail,\n });\n if (existing) {\n const identifierVerified = isEmail\n ? existing.emailVerified\n : existing.phoneVerified;\n const hasInviteType =\n Array.isArray(existing.userType) &&\n existing.userType.includes(config.userType);\n if (identifierVerified && hasInviteType) {\n throw new Error('User already exists');\n }\n const updates: {\n userType?: string[];\n emailVerified?: boolean;\n phoneVerified?: boolean;\n } = {};\n if (!identifierVerified) {\n if (payload.emailVerified !== undefined && payload.email) {\n updates.emailVerified = Boolean(payload.emailVerified);\n }\n if (payload.phoneVerified !== undefined && payload.phone) {\n updates.phoneVerified = Boolean(payload.phoneVerified);\n }\n }\n if (!hasInviteType) {\n updates.userType = [config.userType];\n }\n let user: typeof existing;\n if (Object.keys(updates).length > 0) {\n const [updated] = await database\n .update(usersInIam)\n .set(updates)\n .where(eq(usersInIam.id, existing.id))\n .returning();\n if (!updated) {\n throw new Error('User update failed');\n }\n user = updated;\n } else {\n user = existing;\n }\n const [credAccount] = await database\n .select()\n .from(accountsInIam)\n .where(\n and(\n eq(accountsInIam.tenantId, tenantId),\n eq(accountsInIam.userId, user.id),\n eq(accountsInIam.provider, 'credentials'),\n ),\n )\n .limit(1);\n const hasPassword = Boolean(credAccount?.password);\n const resolvedInviteUrl = resolveInviteUrl({\n inviteUrl: payload.inviteUrl,\n identifier,\n hasPassword,\n });\n const delivery: InviteDelivery = {};\n if (payload.sendVia?.includes('email')) {\n if (payload.email && config.email.sendInvitation) {\n try {\n await config.email.sendInvitation({\n email: payload.email,\n fullName: user.fullName,\n identifier,\n inviteUrl: resolvedInviteUrl,\n tenantId,\n });\n delivery.email = 'sent';\n } catch {\n delivery.email = 'failed';\n }\n } else {\n delivery.email = 'skipped';\n }\n }\n if (payload.sendVia?.includes('sms')) {\n if (payload.phone && config.phone.sendInvitation) {\n try {\n await config.phone.sendInvitation({\n phone: payload.phone,\n fullName: user.fullName,\n identifier,\n inviteUrl: resolvedInviteUrl,\n tenantId,\n });\n delivery.sms = 'sent';\n } catch {\n delivery.sms = 'failed';\n }\n } else {\n delivery.sms = 'skipped';\n }\n }\n return {\n user: normalizeUser(user),\n delivery,\n inviteUrl: resolvedInviteUrl,\n hasPassword,\n };\n }\n\n const userHandle = payload.handle || generateHandle();\n const existingHandle = await checkHandleExists({\n database,\n handle: userHandle,\n tenantId,\n });\n if (existingHandle) {\n throw new Error('Handle already taken');\n }\n\n const passwordHash = payload.password\n ? await hashPassword(payload.password)\n : null;\n\n const user = await withTransaction(database, async (tx) => {\n const [createdUser] = await tx\n .insert(usersInIam)\n .values({\n tenantId,\n fullName: payload.fullName,\n handle: userHandle,\n email: payload.email || null,\n phone: payload.phone || null,\n image: payload.image || null,\n emailVerified: Boolean(payload.emailVerified),\n phoneVerified: Boolean(payload.phoneVerified),\n userType: [config.userType],\n })\n .returning();\n\n if (passwordHash) {\n await tx.insert(accountsInIam).values({\n tenantId,\n userId: createdUser.id,\n provider: 'credentials',\n providerAccountId: identifier,\n password: passwordHash,\n });\n }\n\n return createdUser;\n });\n\n const hasPassword = Boolean(passwordHash);\n const resolvedInviteUrl = resolveInviteUrl({\n inviteUrl: payload.inviteUrl,\n identifier,\n hasPassword,\n });\n\n const delivery: InviteDelivery = {};\n if (payload.sendVia?.includes('email')) {\n if (payload.email && config.email.sendInvitation) {\n try {\n await config.email.sendInvitation({\n email: payload.email,\n fullName: payload.fullName,\n identifier,\n inviteUrl: resolvedInviteUrl,\n tenantId,\n });\n delivery.email = 'sent';\n } catch {\n delivery.email = 'failed';\n }\n } else {\n delivery.email = 'skipped';\n }\n }\n\n if (payload.sendVia?.includes('sms')) {\n if (payload.phone && config.phone.sendInvitation) {\n try {\n await config.phone.sendInvitation({\n phone: payload.phone,\n fullName: payload.fullName,\n identifier,\n inviteUrl: resolvedInviteUrl,\n tenantId,\n });\n delivery.sms = 'sent';\n } catch {\n delivery.sms = 'failed';\n }\n } else {\n delivery.sms = 'skipped';\n }\n }\n\n return {\n user: normalizeUser(user),\n delivery,\n inviteUrl: resolvedInviteUrl,\n hasPassword,\n };\n };\n","import { and, eq, sql } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport type {\n CheckHandleExistsParams,\n CheckUserExistsParams,\n} from '../users.types';\n\nexport const checkUserExists = async ({\n database,\n identifier,\n tenantId,\n isEmail,\n}: CheckUserExistsParams) => {\n const whereClause = isEmail\n ? and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n )\n : and(eq(usersInIam.tenantId, tenantId), eq(usersInIam.phone, identifier));\n\n const [user] = await database\n .select()\n .from(usersInIam)\n .where(whereClause)\n .limit(1);\n\n return user || null;\n};\n\nexport const checkHandleExists = async ({\n database,\n handle,\n tenantId,\n}: CheckHandleExistsParams) => {\n const [existingHandle] = await database\n .select()\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.handle}) = lower(${handle})`,\n ),\n )\n .limit(1);\n\n return existingHandle || null;\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { inviteUser } from '../helper/invite';\nimport type { bulkInviteUsersRoute } from '../users.route';\n\nexport const bulkInviteUsersHandler: RouteHandler<\n typeof bulkInviteUsersRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const invited = [];\n const failed = [];\n\n for (const [index, payload] of body.users.entries()) {\n try {\n const result = await inviteUser({\n database,\n tenantId: resolvedTenantId,\n config,\n payload,\n });\n invited.push(result);\n } catch (error) {\n failed.push({\n index,\n identifier: payload.email || payload.phone || null,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n\n return c.json({ invited, failed }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { accountsInIam, usersInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { hashPassword } from '../../../lib/crypto';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { generateHandle } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { checkHandleExists, checkUserExists } from '../helper/user';\nimport type { createUserRoute } from '../users.route';\n\nexport const createUserHandler: RouteHandler<\n typeof createUserRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const identifier = body.email || body.phone;\n if (!identifier) {\n return c.json({ error: 'Either email or phone is required' }, 409);\n }\n const isEmail = identifier.includes('@');\n\n const existing = await checkUserExists({\n database,\n identifier,\n tenantId: resolvedTenantId,\n isEmail,\n });\n\n if (existing) {\n return c.json({ error: 'User already exists' }, 409);\n }\n\n const userHandle = body.handle || generateHandle();\n\n const existingHandle = await checkHandleExists({\n database,\n handle: userHandle,\n tenantId: resolvedTenantId,\n });\n\n if (existingHandle) {\n return c.json({ error: 'Handle already taken' }, 409);\n }\n\n const [user] = await withTransaction(database, async (tx) => {\n const [createdUser] = await tx\n .insert(usersInIam)\n .values({\n tenantId: resolvedTenantId,\n fullName: body.fullName,\n handle: userHandle,\n email: body.email || null,\n phone: body.phone || null,\n image: body.image || null,\n emailVerified: Boolean(body.emailVerified),\n phoneVerified: Boolean(body.phoneVerified),\n userType: [config.userType],\n })\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (body.password) {\n const passwordHash = await hashPassword(body.password);\n await tx.insert(accountsInIam).values({\n tenantId: resolvedTenantId,\n userId: createdUser.id,\n provider: 'credentials',\n providerAccountId: identifier,\n password: passwordHash,\n });\n }\n\n return [createdUser];\n });\n\n return c.json({ user: normalizeUser(user) }, 201);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { deleteUserRoute } from '../users.route';\n\nexport const deleteUserHandler: RouteHandler<\n typeof deleteUserRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(usersInIam)\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n await database\n .delete(usersInIam)\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)));\n\n return c.json({ message: 'User deleted' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { fetchUserWithRoles } from '../../../db/orm';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getUserRoute } from '../users.route';\n\nexport const getUserHandler: RouteHandler<\n typeof getUserRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const user = await fetchUserWithRoles({\n database,\n userId: id,\n tenantId,\n });\n\n if (!user) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n return c.json({ user: normalizeUser(user) }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { inviteUser } from '../helper/invite';\nimport type { inviteUserRoute } from '../users.route';\n\nexport const inviteUserHandler: RouteHandler<\n typeof inviteUserRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n try {\n const result = await inviteUser({\n database,\n tenantId: resolvedTenantId,\n config,\n payload: body,\n });\n return c.json(result, 201);\n } catch (error) {\n if (error instanceof Error) {\n return c.json({ error: error.message }, 409);\n }\n throw error;\n }\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, asc, desc, eq, gt, ilike, inArray, or, sql } from 'drizzle-orm';\nimport {\n rolesInIam,\n sessionsInIam,\n userRolesInIam,\n usersInIam,\n} from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listUsersRoute } from '../users.route';\n\nconst userSelect = {\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n createdAt: usersInIam.createdAt,\n userType: usersInIam.userType,\n roleCount:\n sql<number>`(select count(*)::int from ${userRolesInIam} where ${userRolesInIam.userId} = ${usersInIam.id} and ${userRolesInIam.tenantId} = ${usersInIam.tenantId})`.as(\n 'roleCount',\n ),\n};\n\nconst sortColumnMap = {\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n userType: sql`(${usersInIam.userType})[1]`,\n roleCount: sql`(select count(*)::int from ${userRolesInIam} where ${userRolesInIam.userId} = ${usersInIam.id} and ${userRolesInIam.tenantId} = ${usersInIam.tenantId})`,\n lastSignInAt: usersInIam.lastSignInAt,\n activeSessionCount: sql`(select count(*)::int from ${sessionsInIam} where ${sessionsInIam.userId} = ${usersInIam.id} and ${sessionsInIam.tenantId} = ${usersInIam.tenantId} and ${sessionsInIam.expiresAt} > now())`,\n createdAt: usersInIam.createdAt,\n} as const;\n\nfunction roleNameToLocaleRecord(\n name: unknown,\n code: string,\n): Record<string, string> {\n if (typeof name === 'string') {\n return { en: name };\n }\n if (name && typeof name === 'object' && !Array.isArray(name)) {\n const rec = name as Record<string, unknown>;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(rec)) {\n if (typeof v === 'string') {\n out[k] = v;\n }\n }\n return Object.keys(out).length > 0 ? out : { en: code };\n }\n return { en: code };\n}\n\nexport const listUsersHandler: RouteHandler<\n typeof listUsersRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const _config = c.get('config');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n const userTypeFilter =\n query.userType && query.userType !== 'all' ? query.userType : null;\n\n const conditions = [eq(usersInIam.tenantId, tenantId)];\n if (userTypeFilter) {\n conditions.push(\n sql`${usersInIam.userType} @> ARRAY[${userTypeFilter}]::text[]`,\n );\n }\n if (query.search?.trim()) {\n const term = `%${query.search.trim().replace(/[%_\\\\]/g, (ch) => `\\\\${ch}`)}%`;\n const searchCond = or(\n ilike(usersInIam.fullName, term),\n ilike(usersInIam.email, term),\n ilike(usersInIam.phone, term),\n );\n if (searchCond) {\n conditions.push(searchCond);\n }\n }\n if (query.email) {\n conditions.push(ilike(usersInIam.email, `%${query.email}%`));\n }\n if (query.phone) {\n conditions.push(ilike(usersInIam.phone, `%${query.phone}%`));\n }\n if (query.handle) {\n conditions.push(ilike(usersInIam.handle, `%${query.handle}%`));\n }\n if (query.filter === 'verified') {\n const verifiedCond = or(\n eq(usersInIam.emailVerified, true),\n eq(usersInIam.phoneVerified, true),\n );\n if (verifiedCond) {\n conditions.push(verifiedCond);\n }\n } else if (query.filter === 'unverified') {\n conditions.push(eq(usersInIam.emailVerified, false));\n conditions.push(eq(usersInIam.phoneVerified, false));\n }\n\n const orderDir = query.order === 'asc' ? asc : desc;\n const sortCol =\n query.sort && sortColumnMap[query.sort]\n ? sortColumnMap[query.sort]\n : usersInIam.fullName;\n\n const whereClause = and(...conditions);\n\n const [users, totalResult] = await Promise.all([\n database\n .select(userSelect)\n .from(usersInIam)\n .where(whereClause)\n .orderBy(orderDir(sortCol))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(usersInIam)\n .where(whereClause),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n const userIds = users.map((u) => u.id);\n\n const sessionCountRows =\n userIds.length > 0\n ? await database\n .select({\n userId: sessionsInIam.userId,\n count: sql<number>`count(*)::int`.as('count'),\n })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n inArray(sessionsInIam.userId, userIds),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .groupBy(sessionsInIam.userId)\n : [];\n const sessionCountByUser = new Map(\n sessionCountRows.map((r) => [r.userId, Number(r.count) ?? 0]),\n );\n\n const roleRows =\n userIds.length > 0\n ? await database\n .select({\n userId: userRolesInIam.userId,\n code: rolesInIam.code,\n name: rolesInIam.name,\n })\n .from(userRolesInIam)\n .innerJoin(\n rolesInIam,\n and(\n eq(rolesInIam.tenantId, userRolesInIam.tenantId),\n eq(rolesInIam.id, userRolesInIam.roleId),\n ),\n )\n .where(\n and(\n eq(userRolesInIam.tenantId, tenantId),\n inArray(userRolesInIam.userId, userIds),\n ),\n )\n : [];\n\n const userRolesMap = new Map<\n string,\n { code: string; name: Record<string, string> }[]\n >();\n for (const r of roleRows) {\n const list = userRolesMap.get(r.userId) ?? [];\n list.push({\n code: r.code,\n name: roleNameToLocaleRecord(r.name, r.code),\n });\n userRolesMap.set(r.userId, list);\n }\n\n return c.json(\n {\n users: users.map((u) => ({\n ...u,\n roles: null,\n userRoles: userRolesMap.get(u.id) ?? [],\n activeSessionCount: sessionCountByUser.get(u.id) ?? 0,\n })),\n total,\n page,\n limit,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, ilike, or } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { searchUsersRoute } from '../users.route';\n\nexport const searchUsersHandler: RouteHandler<\n typeof searchUsersRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const limit = query.limit || 20;\n const conditions = [eq(usersInIam.tenantId, tenantId)];\n\n if (query.search && query.search.trim().length > 0) {\n const searchCondition = or(\n ilike(usersInIam.fullName, `%${query.search}%`),\n ilike(usersInIam.email, `%${query.search}%`),\n ilike(usersInIam.handle, `%${query.search}%`),\n );\n if (searchCondition) {\n conditions.push(searchCondition);\n }\n }\n\n const users = await database\n .select({\n id: usersInIam.id,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n })\n .from(usersInIam)\n .where(and(...conditions))\n .limit(limit);\n\n return c.json({ users }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, inArray, sql } from 'drizzle-orm';\nimport { fetchUserWithRoles } from '../../../db/orm';\nimport { rolesInIam, userRolesInIam, usersInIam } from '../../../db/schema';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { User } from '../../../types';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateUserRoute } from '../users.route';\n\nexport const updateUserHandler: RouteHandler<\n typeof updateUserRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(usersInIam)\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n if (body.handle && body.handle !== existing.handle) {\n const [handleExists] = await database\n .select()\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.handle}) = lower(${body.handle})`,\n ),\n )\n .limit(1);\n if (handleExists) {\n return c.json({ error: 'Handle already taken' }, 409);\n }\n }\n\n const updateData: Partial<typeof usersInIam.$inferInsert> = {};\n\n if (body.fullName !== undefined) {\n updateData.fullName = body.fullName;\n }\n if (body.email !== undefined) {\n updateData.email = body.email;\n }\n if (body.phone !== undefined) {\n updateData.phone = body.phone;\n }\n if (body.handle !== undefined) {\n updateData.handle = body.handle;\n }\n if (body.image !== undefined) {\n updateData.image = body.image;\n }\n if (body.emailVerified !== undefined) {\n updateData.emailVerified = body.emailVerified;\n }\n if (body.phoneVerified !== undefined) {\n updateData.phoneVerified = body.phoneVerified;\n }\n\n const [updated] = await database\n .update(usersInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)))\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (!updated) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n if (body.roleIds !== undefined) {\n const roleIds = body.roleIds as string[];\n if (roleIds.length > 0) {\n const validRoles = await database\n .select({ id: rolesInIam.id, code: rolesInIam.code })\n .from(rolesInIam)\n .where(\n and(\n eq(rolesInIam.tenantId, tenantId),\n inArray(rolesInIam.id, roleIds),\n ),\n );\n const assignableIds = new Set(\n validRoles\n .filter((r) => (r.code ?? '').toLowerCase() !== 'owner')\n .map((r) => r.id),\n );\n const toInsert = roleIds.filter((rid) => assignableIds.has(rid));\n await database\n .delete(userRolesInIam)\n .where(\n and(\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.userId, id),\n ),\n );\n if (toInsert.length > 0) {\n await database.insert(userRolesInIam).values(\n toInsert.map((roleId) => ({\n tenantId,\n userId: id,\n roleId,\n })),\n );\n }\n } else {\n await database\n .delete(userRolesInIam)\n .where(\n and(\n eq(userRolesInIam.tenantId, tenantId),\n eq(userRolesInIam.userId, id),\n ),\n );\n }\n }\n\n const userWithRoles = await fetchUserWithRoles({\n database,\n userId: id,\n tenantId,\n });\n return c.json(\n {\n user: normalizeUser((userWithRoles ?? updated) as User),\n },\n 200,\n );\n};\n","import { z } from 'zod';\nimport { userSchema } from '../auth.schema';\n\n// Query schemas\nconst sortableFields = [\n 'fullName',\n 'email',\n 'phone',\n 'userType',\n 'roleCount',\n 'lastSignInAt',\n 'activeSessionCount',\n 'createdAt',\n] as const;\nconst filterValues = ['', 'verified', 'unverified'] as const;\nconst userTypeValues = ['all', 'employee', 'candidate', 'admin'] as const;\n\nexport const listUsersQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n tenantId: z.string().optional(),\n search: z.string().optional(),\n email: z.string().optional(),\n phone: z.string().optional(),\n handle: z.string().optional(),\n filter: z.enum(filterValues).optional(),\n userType: z.enum(userTypeValues).optional(),\n sort: z.enum(sortableFields).optional(),\n order: z.enum(['asc', 'desc']).optional(),\n});\n\n// Path parameter schemas\nexport const userIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Request body schemas\nexport const createUserSchema = z.object({\n email: z.string().email().optional(),\n phone: z.string().optional(),\n fullName: z.string().min(1),\n handle: z.string().optional(),\n image: z.string().url().optional(),\n password: z.string().min(8).max(128).optional(),\n emailVerified: z.boolean().default(false).optional(),\n phoneVerified: z.boolean().default(false).optional(),\n});\n\nexport const updateUserSchema = z.object({\n fullName: z.string().min(1).optional(),\n email: z.string().email().nullable().optional(),\n phone: z.string().nullable().optional(),\n handle: z.string().optional(),\n image: z.string().url().nullable().optional(),\n emailVerified: z.boolean().optional(),\n phoneVerified: z.boolean().optional(),\n roleIds: z.array(z.string().uuid()).optional(),\n});\n\nexport const banUserSchema = z.object({\n bannedUntil: z.string().datetime().nullable().optional(),\n});\n\n// Response schemas\nexport const listUsersResponseSchema = z.object({\n users: z.array(userSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const userResponseSchema = z.object({\n user: userSchema,\n});\n\nexport const deleteUserResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n\nconst inviteChannelSchema = z.enum(['email', 'sms']);\n\nexport const inviteUserSchema = z\n .object({\n email: z.string().email().optional(),\n phone: z.string().optional(),\n fullName: z.string().min(1),\n handle: z.string().optional(),\n image: z.string().url().optional(),\n password: z.string().min(8).max(128).optional(),\n emailVerified: z.boolean().default(false).optional(),\n phoneVerified: z.boolean().default(false).optional(),\n sendVia: z.array(inviteChannelSchema).default([]).optional(),\n inviteUrl: z.string().url().optional(),\n })\n .refine((data) => data.email || data.phone, {\n message: 'Either email or phone is required',\n path: ['email'],\n });\n\nexport const bulkInviteUsersSchema = z.object({\n users: z.array(inviteUserSchema).min(1),\n});\n\nconst deliveryStateSchema = z.enum(['sent', 'skipped', 'failed']);\n\nexport const inviteDeliverySchema = z.object({\n email: deliveryStateSchema.optional(),\n sms: deliveryStateSchema.optional(),\n});\n\nexport const inviteUserResultSchema = z.object({\n user: userSchema,\n delivery: inviteDeliverySchema,\n inviteUrl: z.string().nullable(),\n hasPassword: z.boolean(),\n});\n\nexport const bulkInviteUsersResponseSchema = z.object({\n invited: z.array(inviteUserResultSchema),\n failed: z.array(\n z.object({\n index: z.number().int().nonnegative(),\n identifier: z.string().nullable(),\n error: z.string(),\n }),\n ),\n});\n\nexport const searchUsersQuerySchema = z.object({\n search: z.string().optional().describe('Search term'),\n limit: z.coerce\n .number()\n .int()\n .positive()\n .optional()\n .default(20)\n .describe('Limit'),\n});\n\nexport const userSearchResultSchema = z.object({\n id: z.string().uuid().describe('User ID'),\n fullName: z.string().describe('Full name'),\n email: z.string().nullable().describe('Email'),\n phone: z.string().nullable().describe('Phone'),\n handle: z.string().describe('Handle'),\n image: z.string().nullable().describe('Image URL'),\n});\n\nexport const searchUsersResponseSchema = z.object({\n users: z.array(userSearchResultSchema).describe('Users'),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport { invalidateVerificationHandler } from './handler/invalidate-verification';\nimport { listVerificationsHandler } from './handler/list-verifications';\nimport {\n errorResponseSchema,\n invalidateVerificationResponseSchema,\n listVerificationsQuerySchema,\n listVerificationsResponseSchema,\n verificationIdParamSchema,\n} from './verifications.schema';\n\nexport const listVerificationsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Verifications'],\n summary: 'List verifications',\n request: {\n query: listVerificationsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listVerificationsResponseSchema,\n },\n },\n description: 'List of verifications',\n },\n },\n});\n\nexport const invalidateVerificationRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Verifications'],\n summary: 'Invalidate verification',\n request: {\n params: verificationIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: invalidateVerificationResponseSchema,\n },\n },\n description: 'Verification invalidated',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Verification not found',\n },\n },\n});\n\nconst verificationRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(listVerificationsRoute, listVerificationsHandler)\n .openapi(invalidateVerificationRoute, invalidateVerificationHandler);\n\nexport default verificationRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { verificationsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { invalidateVerificationRoute } from '../verifications.route';\n\nexport const invalidateVerificationHandler: RouteHandler<\n typeof invalidateVerificationRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.id, id),\n eq(verificationsInIam.tenantId, tenantId),\n ),\n )\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Verification not found' }, 404);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.id, id),\n eq(verificationsInIam.tenantId, tenantId),\n ),\n );\n\n return c.json({ message: 'Verification invalidated' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { verificationsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listVerificationsRoute } from '../verifications.route';\n\nexport const listVerificationsHandler: RouteHandler<\n typeof listVerificationsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [eq(verificationsInIam.tenantId, tenantId)];\n if (query.userId) {\n conditions.push(eq(verificationsInIam.userId, query.userId));\n }\n if (query.type) {\n conditions.push(eq(verificationsInIam.type, query.type));\n }\n if (query.status) {\n if (query.status === 'active') {\n conditions.push(sql`${verificationsInIam.expiresAt} > CURRENT_TIMESTAMP`);\n } else if (query.status === 'expired') {\n conditions.push(\n sql`${verificationsInIam.expiresAt} <= CURRENT_TIMESTAMP`,\n );\n } else if (query.status === 'consumed') {\n conditions.push(sql`${verificationsInIam.attempt} >= 3`);\n }\n }\n\n const [verifications, totalResult] = await Promise.all([\n database\n .select()\n .from(verificationsInIam)\n .where(and(...conditions))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(verificationsInIam)\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ verifications, total, page, limit }, 200);\n};\n","import { z } from 'zod';\n\n// Query schemas\nexport const listVerificationsQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n userId: z.uuid().optional(),\n type: z.string().optional(),\n status: z.enum(['active', 'expired', 'consumed']).optional(),\n});\n\n// Path parameter schemas\nexport const verificationIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Response schemas\nexport const verificationSchema = z.object({\n id: z.uuid(),\n tenantId: z.string(),\n userId: z.uuid(),\n code: z.string(),\n expiresAt: z.string(),\n type: z.string().nullable(),\n attempt: z.number().nullable(),\n to: z.string().nullable(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nexport const listVerificationsResponseSchema = z.object({\n verifications: z.array(verificationSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const invalidateVerificationResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import type { AuthConfig, Database, Session, User } from '../types';\nimport type { AuthContext } from '../types/context';\n\nexport const setAuthContext = ({\n c,\n config,\n database,\n user,\n session,\n}: {\n c: AuthContext;\n config: AuthConfig;\n database: Database;\n user?: User;\n session?: Session;\n}): void => {\n c.set('config', config);\n c.set('database', database);\n c.set('tenantId', config.tenant?.tenantId || 'tenant');\n c.set('userId', user?.id);\n c.set('user', user);\n c.set('session', session);\n};\n","import { Scalar } from '@scalar/hono-api-reference';\n\nexport type DocsConfig = {\n title?: string;\n theme?:\n | 'default'\n | 'moon'\n | 'purple'\n | 'saturn'\n | 'bluePlanet'\n | 'kepler'\n | 'mars';\n openApiPath?: string;\n favicon?: string;\n};\n\nexport const createDocsHandler = (config: DocsConfig = {}) => {\n return Scalar({\n url: config.openApiPath || '/openapi.json',\n theme: config.theme || 'saturn',\n pageTitle: config.title || 'IAM API Reference',\n favicon: config.favicon || '/favicon.ico',\n });\n};\n","import type { AuthConfig } from '../types';\n\nexport const createOpenApiConfig = (config: AuthConfig) => {\n const basePath = config.basePath || '';\n const servers = config.docs?.servers || [\n {\n url: 'http://localhost:3000',\n description: 'Development server',\n },\n ];\n const serversWithBasePath = servers.map((server) => ({\n ...server,\n url: `${server.url.replace(/\\/$/, '')}${basePath}`,\n }));\n\n return {\n openapi: '3.0.0',\n info: {\n title: config.docs?.title || 'IAM API',\n version: config.docs?.version || '1.0.0',\n description: 'Complete Identity and Access Management API',\n },\n servers: serversWithBasePath,\n tags: [\n { name: 'Auth', description: 'Authentication endpoints' },\n { name: 'Profile', description: 'User profile management' },\n { name: 'Password', description: 'Password management' },\n { name: 'Email', description: 'Email verification' },\n { name: 'Phone', description: 'Phone verification' },\n { name: 'Users', description: 'User management (IAM)' },\n { name: 'Tenants', description: 'Tenant management (IAM)' },\n { name: 'Domains', description: 'Domain management (IAM)' },\n { name: 'Roles', description: 'Role management (IAM)' },\n { name: 'Permissions', description: 'Permission management (IAM)' },\n {\n name: 'Role Permissions',\n description: 'Role-permission mapping (IAM)',\n },\n { name: 'User Roles', description: 'User-role assignment (IAM)' },\n { name: 'Sessions', description: 'Session management (IAM)' },\n { name: 'Verifications', description: 'Verification management (IAM)' },\n { name: 'System', description: 'System initialization' },\n ],\n 'x-tagGroups': [\n {\n name: 'Authentication',\n tags: ['Auth', 'Profile', 'Password', 'Email', 'Phone'],\n },\n {\n name: 'System',\n tags: ['System'],\n },\n {\n name: 'IAM Management',\n tags: [\n 'Users',\n 'Tenants',\n 'Domains',\n 'Roles',\n 'Permissions',\n 'Role Permissions',\n 'User Roles',\n 'Sessions',\n 'Verifications',\n ],\n },\n ],\n };\n};\n","import { createMiddleware } from 'hono/factory';\n\nexport const createSessionMiddleware = () => {\n return createMiddleware(async (c, next) => {\n const authInstance = c.get('auth');\n if (!authInstance) {\n c.set('user', null);\n c.set('session', null);\n c.set('userId', null);\n c.set('sessionStatus', 'error');\n return await next();\n }\n const sessionData = await authInstance.getSession(c);\n\n const { session, user, status } = sessionData;\n c.set('sessionStatus', status);\n\n if (!(session && user)) {\n c.set('user', null);\n c.set('session', null);\n c.set('userId', null);\n await next();\n return;\n }\n\n c.set('user', user);\n c.set('session', session);\n c.set('userId', user.id);\n await next();\n });\n};\n","import { logger } from '@mesob/common';\n\nimport { createMiddleware } from 'hono/factory';\nimport { HTTPException } from 'hono/http-exception';\nimport type { Database } from '../db';\nimport {\n findTenantByDomain,\n findTenantById,\n type Tenant,\n} from '../db/orm/tenant';\nimport type { AuthConfig } from '../types';\n\nfunction resolveHost(\n hostHeader: string | undefined,\n forwardedHost: string | undefined,\n): string | null {\n const hostHeaderStr = hostHeader || '';\n const forwardedHostStr = forwardedHost || '';\n\n if (forwardedHostStr) {\n return forwardedHostStr;\n }\n\n if (hostHeaderStr) {\n return hostHeaderStr;\n }\n\n return null;\n}\n\nasync function resolveTenantId(\n database: Database,\n config: AuthConfig,\n host: string,\n): Promise<string | null> {\n // Prioritize config.tenant.tenantId if set\n if (config.tenant?.tenantId) {\n return config.tenant.tenantId;\n }\n\n const normalizedHost = host.toLowerCase().split(':')[0];\n if (\n normalizedHost === 'localhost' ||\n normalizedHost === '127.0.0.1' ||\n normalizedHost.includes('internal')\n ) {\n return 'tenant';\n }\n if (config.tenant?.tenantDomains?.includes(normalizedHost)) {\n return normalizedHost;\n }\n if (normalizedHost.endsWith('.lvh.me')) {\n return normalizedHost.replace('.lvh.me', '');\n }\n return await findTenantByDomain(database, normalizedHost);\n}\n\nasync function resolveTenant(\n database: Database,\n config: AuthConfig,\n host: string,\n): Promise<{ tenantId: string | null; tenant: Tenant | null }> {\n try {\n const tenantId = await resolveTenantId(database, config, host);\n if (!tenantId) {\n return { tenantId: null, tenant: null };\n }\n const tenant = await findTenantById(database, tenantId);\n if (!tenant) {\n return { tenantId: null, tenant: null };\n }\n return { tenantId, tenant };\n } catch (err) {\n logger.error('Tenant resolution error:', err);\n throw err;\n }\n}\n\nfunction validateTenant(\n tenantId: string | null,\n tenant: Tenant | null,\n): string | null {\n if (!tenantId) {\n return 'Unknown workspace domain';\n }\n if (!tenant) {\n return 'Tenant not found';\n }\n if (!tenant.isActive) {\n return 'Tenant inactive';\n }\n return null;\n}\n\nexport const createTenantMiddleware = (\n database: Database,\n config: AuthConfig,\n) => {\n return createMiddleware(async (c, next) => {\n const host = resolveHost(\n c.req.header('host'),\n c.req.header('x-forwarded-host'),\n );\n\n c.set('host', host);\n\n if (!host) {\n throw new HTTPException(400, { message: 'Missing Host header' });\n }\n\n let tenantId: string | null = null;\n let tenant: Tenant | null = null;\n\n try {\n const result = await resolveTenant(database, config, host);\n tenantId = result.tenantId;\n tenant = result.tenant;\n } catch {\n throw new HTTPException(500, { message: 'Tenant resolution failed' });\n }\n\n c.set('tenantId', tenantId);\n c.set('tenant', tenant);\n\n const error = validateTenant(tenantId, tenant);\n if (error) {\n throw new HTTPException(404, { message: error });\n }\n\n return await next();\n });\n};\n","import type { Context } from 'hono';\nimport { getCookie } from 'hono/cookie';\nimport type { Database } from './db';\nimport {\n deleteSession,\n fetchSessionByToken,\n fetchUserWithRoles,\n updateSessionExpiry,\n} from './db/orm';\nimport {\n deleteSessionCookie,\n getSessionCookieName,\n setSessionCookie,\n} from './lib/cookie';\nimport { hashToken } from './lib/crypto';\nimport {\n getRefreshedExpiresAt,\n getSessionUpdateAge,\n shouldRefreshSession,\n} from './lib/session';\nimport type { AuthConfig, Session, User } from './types';\n\nexport type SessionStatus =\n | 'valid'\n | 'no_cookie'\n | 'invalid_session'\n | 'user_not_found'\n | 'error';\n\nexport type GetSessionResult = {\n session: Session | null;\n user: User | null;\n sessionToken: string | null;\n status: SessionStatus;\n};\n\nexport const createGetSession = (database: Database, config: AuthConfig) => {\n return async (c: Context): Promise<GetSessionResult> => {\n const sessionToken = getCookie(c, getSessionCookieName(config));\n if (!sessionToken) {\n return {\n session: null,\n user: null,\n sessionToken: null,\n status: 'no_cookie',\n };\n }\n\n try {\n const hashedToken = await hashToken(sessionToken, config.secret);\n const session = await fetchSessionByToken({\n database,\n hashedToken,\n tenantId: config.tenant?.tenantId || 'tenant',\n });\n\n if (!session) {\n // Session not found or expired, clear cookie\n deleteSessionCookie(c, config);\n return {\n session: null,\n user: null,\n sessionToken: null,\n status: 'invalid_session',\n };\n }\n\n const user = await fetchUserWithRoles({\n database,\n userId: session.userId,\n tenantId: session.tenantId,\n });\n\n if (!user) {\n await deleteSession({\n database,\n sessionId: session.id,\n tenantId: session.tenantId,\n });\n deleteSessionCookie(c, config);\n return {\n session: null,\n user: null,\n sessionToken: null,\n status: 'user_not_found',\n };\n }\n\n // Check if session needs refresh\n const rememberMe = session.meta?.rememberMe !== false;\n const updateAge = getSessionUpdateAge({\n sessionConfig: config.session,\n rememberMe,\n });\n\n if (shouldRefreshSession({ expiresAt: session.expiresAt, updateAge })) {\n const newExpiresAt = getRefreshedExpiresAt({\n sessionConfig: config.session,\n rememberMe,\n });\n\n // Update session expiry in database\n await updateSessionExpiry({\n database,\n sessionId: session.id,\n tenantId: session.tenantId,\n expiresAt: newExpiresAt,\n });\n\n // Update cookie with new expiry\n setSessionCookie(c, sessionToken, config, {\n expires: new Date(newExpiresAt),\n });\n\n // Return updated session\n return {\n session: { ...session, expiresAt: newExpiresAt },\n user,\n sessionToken,\n status: 'valid',\n };\n }\n\n return { session, user, sessionToken, status: 'valid' };\n } catch {\n return { session: null, user: null, sessionToken: null, status: 'error' };\n }\n };\n};\n","import type { PermissionTree } from '@mesob/common';\nimport { logger } from '@mesob/common';\nimport type { Database } from '../db';\n\nexport type { Database } from '../db';\n\nexport type User = {\n id: string;\n tenantId: string;\n fullName: string;\n email: string | null;\n phone: string | null;\n handle: string;\n image: string | null;\n emailVerified: boolean;\n phoneVerified: boolean;\n lastSignInAt: string | null;\n bannedUntil?: string | null;\n loginAttempt?: number;\n /** Role IDs */\n roles?: string[] | null;\n /** Role codes for hasRole() checks (e.g. 'owner', 'tenant-admin') */\n roleCodes?: string[] | null;\n /** Permission IDs for hasPermission() checks */\n permissions?: string[] | null;\n};\n\nexport type SessionMeta = {\n action?: string;\n rememberMe?: boolean;\n};\n\nexport type Session = {\n id: string;\n tenantId: string;\n userId: string;\n expiresAt: string;\n createdAt: string;\n meta?: SessionMeta | null;\n};\n\nexport type Verification = {\n id: string;\n tenantId: string;\n userId: string;\n type: string;\n code: string;\n to: string | null;\n expiresAt: string;\n createdAt: string;\n attempt: number | null;\n};\n\nexport type Account = {\n id: string;\n tenantId: string;\n userId: string;\n provider: string;\n providerAccountId: string;\n password: string | null;\n};\n\nexport type SendVerificationOTPParams = {\n email?: string;\n phone?: string;\n code: string;\n hash: string;\n type: string;\n};\n\nexport type SendInvitationParams = {\n email?: string;\n phone?: string;\n fullName: string;\n identifier: string;\n inviteUrl?: string;\n tenantId: string;\n};\n\nexport type VerificationConfig = {\n enabled: boolean;\n required: boolean;\n otpLength: number;\n expiresIn: string;\n maxAttempts: number;\n resendInterval?: string;\n sendVerificationOTP?: (\n params: SendVerificationOTPParams,\n ) => Promise<void> | void;\n sendInvitation?: (params: SendInvitationParams) => Promise<void> | void;\n};\n\nexport type PhoneConfig = VerificationConfig & {\n phoneRegex?: RegExp | string;\n};\n\nexport type EmailConfig = VerificationConfig;\n\nexport type SignUpConfig = {\n enabled: boolean;\n emailEnabled: boolean;\n phoneEnabled: boolean;\n allowedEmailDomains?: readonly string[];\n};\n\nexport type SessionConfig = {\n /** Default session duration (e.g., '7d', '30d'). Default: '7d' */\n expiresIn: string;\n /** Session duration when \"remember me\" is checked (e.g., '30d'). Default: '30d' */\n rememberMeExpiresIn: string;\n /** Session duration when \"remember me\" is unchecked (e.g., '1h'). Default: '1h' */\n shortSessionExpiresIn: string;\n /** Refresh session if remaining time is less than this (e.g., '1d'). Default: '1d' */\n updateAge: string;\n /** Refresh short session if remaining time is less than this (e.g., '15m'). Default: '15m' */\n shortSessionUpdateAge: string;\n /** Maximum concurrent sessions per user */\n maxPerUser?: number;\n};\n\nexport type SecurityConfig = {\n maxLoginAttempts: number;\n lockoutDuration: string;\n};\n\nexport type TenantConfig = {\n enabled?: boolean;\n tenantId?: string;\n tenantDomains?: string[];\n};\n\nexport type DocsConfig = {\n enabled?: boolean;\n title?: string;\n version?: string;\n theme?:\n | 'default'\n | 'moon'\n | 'purple'\n | 'saturn'\n | 'bluePlanet'\n | 'kepler'\n | 'mars';\n servers?: Array<{ url: string; description?: string }>;\n};\n\nexport type SeedRole = {\n code: string;\n name: unknown;\n description?: unknown;\n permissionIds?: readonly string[];\n isSystem?: boolean;\n isEditable?: boolean;\n isDeletable?: boolean;\n};\n\nexport type CookieConfig = {\n prefix?: string;\n};\n\nexport type SMSConfig = {\n baseUrl: string;\n identifierId: string;\n senderName: string;\n apiKey: string;\n templateVerification?: string;\n templateLogin?: string;\n};\n\nexport type ResendConfig = {\n apiKey: string;\n from: string;\n verificationSubject?: string;\n resetPasswordSubject?: string;\n};\n\nexport type AuthConfig = {\n connectionString: string;\n userType: string;\n secret: string;\n basePath?: string;\n tenant?: TenantConfig;\n docs?: DocsConfig;\n cookie?: CookieConfig;\n permissions?: PermissionTree;\n roles?: SeedRole[];\n session: SessionConfig;\n email: EmailConfig;\n phone: PhoneConfig;\n signUp?: SignUpConfig;\n security?: SecurityConfig;\n};\n\nexport type { AuthContext, AuthEnv } from './context';\n\nexport type CreateAuthRoutesOptions = {\n config: AuthConfig;\n database: Database;\n};\n\nexport type MesobAuth = {\n routes: ReturnType<typeof import('../handler').createAuthRoutes>;\n getSession: (c: import('hono').Context) => Promise<{\n session: Session | null;\n user: User | null;\n sessionToken: string | null;\n }>;\n tenantMiddleware: import('hono').MiddlewareHandler;\n sessionMiddleware: import('hono').MiddlewareHandler;\n};\n\nconst createDefaultSendVerificationOTP = (expiresIn: string) => {\n return (params: SendVerificationOTPParams): void => {\n logger.log(\n `[Verification OTP] Code: ${params.code}, Hash: ${params.hash}, ExpiresIn: ${expiresIn}, Type: ${params.type}`,\n );\n };\n};\n\nconst defaultConfig = {\n enabled: true,\n required: true,\n otpLength: 6,\n expiresIn: '15m',\n maxAttempts: 5,\n resendInterval: '30s',\n sendVerificationOTP: createDefaultSendVerificationOTP('15m'),\n} satisfies VerificationConfig;\n\nconst defaultPhoneRegex = /^(\\+2519|\\+2517|2519|2517|09|07)\\d{8}$/;\n\ntype DefaultAuthConfig = {\n readonly tenant: {\n readonly enabled: true;\n readonly tenantId: 'tenant';\n };\n readonly docs: {\n readonly enabled: true;\n };\n readonly cookie: {\n readonly prefix: 'msb';\n };\n readonly session: {\n readonly expiresIn: '7d';\n readonly rememberMeExpiresIn: '30d';\n readonly shortSessionExpiresIn: '1h';\n readonly updateAge: '1d';\n readonly shortSessionUpdateAge: '15m';\n readonly maxPerUser: 5;\n };\n readonly email: typeof defaultConfig;\n readonly phone: typeof defaultConfig & {\n readonly phoneRegex: typeof defaultPhoneRegex;\n };\n readonly signUp: {\n readonly enabled: true;\n readonly emailEnabled: true;\n readonly phoneEnabled: true;\n readonly allowedEmailDomains: readonly [];\n };\n readonly security: {\n readonly maxLoginAttempts: 5;\n readonly lockoutDuration: '15m';\n };\n};\n\nexport const defaultAuthConfig: DefaultAuthConfig = {\n tenant: {\n enabled: true,\n tenantId: 'tenant',\n },\n docs: {\n enabled: true,\n },\n cookie: {\n prefix: 'msb',\n },\n session: {\n expiresIn: '7d',\n rememberMeExpiresIn: '30d',\n shortSessionExpiresIn: '1h',\n updateAge: '1d',\n shortSessionUpdateAge: '15m',\n maxPerUser: 5,\n },\n email: defaultConfig,\n phone: {\n ...defaultConfig,\n phoneRegex: defaultPhoneRegex,\n },\n signUp: {\n enabled: true,\n emailEnabled: true,\n phoneEnabled: true,\n allowedEmailDomains: [],\n },\n security: {\n maxLoginAttempts: 5,\n lockoutDuration: '15m',\n },\n} as const;\n","import { lt } from 'drizzle-orm';\nimport type { Database } from '../db';\nimport { sessionsInIam, verificationsInIam } from '../db/schema';\n\nexport const cleanupExpiredVerifications = async (database: Database) => {\n const now = new Date().toISOString();\n\n const result = await database\n .delete(verificationsInIam)\n .where(lt(verificationsInIam.expiresAt, now));\n\n return result;\n};\n\nexport const cleanupExpiredSessions = async (database: Database) => {\n const now = new Date().toISOString();\n\n const result = await database\n .delete(sessionsInIam)\n .where(lt(sessionsInIam.expiresAt, now));\n\n return result;\n};\n\nexport const cleanupExpiredData = async (database: Database) => {\n await Promise.all([\n cleanupExpiredVerifications(database),\n cleanupExpiredSessions(database),\n ]);\n};\n"],"mappings":"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","names":["OpenAPIHono","getCookie","and","eq","sql","and","sql","eq","and","eq","and","eq","sql","sql","and","eq","and","eq","isDatabaseError","OpenAPIHono","and","eq","sql","HTTPException","dayjs","and","eq","gt","and","eq","dayjs","gt","sql","and","eq","logger","and","eq","and","eq","gt","sql","sql","and","eq","gt","and","eq","gt","sql","and","eq","sql","gt","signInHandler","logger","and","eq","and","eq","gt","and","eq","gt","createRoute","OpenAPIHono","HTTPException","check","HTTPException","z","errorResponseSchema","and","eq","and","eq","and","eq","and","eq","and","eq","sql","eq","and","sql","and","eq","sql","and","eq","sql","and","eq","sql","and","eq","sql","createRoute","errorResponseSchema","OpenAPIHono","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","sql","and","eq","sql","createRoute","OpenAPIHono","createRoute","OpenAPIHono","and","eq","gt","getCookie","and","eq","getCookie","gt","and","eq","sql","sql","and","eq","and","eq","gt","and","eq","gt","and","eq","and","eq","and","eq","and","eq","createRoute","OpenAPIHono","createRoute","OpenAPIHono","eq","eq","getPermissionEntries","getPermissionEntries","index","getPermissionEntries","and","eq","inArray","sql","HTTPException","getPermissionEntries","sql","inArray","HTTPException","and","eq","z","errorResponseSchema","createRoute","errorResponseSchema","IAM_ALL","OpenAPIHono","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","and","eq","createRoute","OpenAPIHono","createRoute","OpenAPIHono","z","and","eq","gt","sql","and","eq","sql","gt","and","eq","sql","sql","and","eq","and","eq","ne","sql","and","eq","ne","sql","and","eq","ne","sql","and","eq","ne","sql","createRoute","z","OpenAPIHono","createRoute","OpenAPIHono","and","eq","eq","and","and","eq","and","eq","z","errorResponseSchema","createRoute","errorResponseSchema","IAM_ALL","OpenAPIHono","createRoute","OpenAPIHono","randomUUID","and","eq","inArray","and","eq","inArray","randomUUID","randomUUID","and","eq","inArray","and","eq","inArray","randomUUID","randomUUID","randomUUID","and","eq","and","eq","and","eq","sql","sql","and","eq","and","eq","listRolePermissionsHandler","and","eq","and","asc","desc","eq","sql","and","eq","asc","desc","sql","and","asc","desc","eq","ilike","or","sql","sortColumnMap","eq","ilike","or","sql","asc","desc","and","and","eq","revokeRolePermissionHandler","and","eq","and","eq","and","eq","and","eq","inArray","sql","sql","and","eq","inArray","and","eq","sql","and","eq","sql","z","z","listRolePermissionsResponseSchema","errorResponseSchema","listRolePermissionsQuerySchema","createRoute","errorResponseSchema","listRolePermissionsRoute","listRolePermissionsQuerySchema","listRolePermissionsResponseSchema","revokeRolePermissionRoute","IAM_ALL","OpenAPIHono","listRolePermissionsHandler","revokeRolePermissionHandler","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","sql","eq","and","sql","and","eq","and","eq","and","eq","and","eq","z","z","errorResponseSchema","createRoute","errorResponseSchema","IAM_ALL","OpenAPIHono","createRoute","OpenAPIHono","z","IAM_ALL","createRoute","z","OpenAPIHono","createRoute","OpenAPIHono","eq","eq","eq","eq","eq","eq","and","asc","desc","eq","ilike","or","sql","sortColumnMap","sql","eq","or","ilike","asc","desc","and","eq","sql","eq","sql","z","errorResponseSchema","createRoute","errorResponseSchema","IAM_ALL","tenantRoutesBase","OpenAPIHono","tenantRoutes","createRoute","OpenAPIHono","and","eq","eq","and","and","eq","and","eq","z","errorResponseSchema","createRoute","errorResponseSchema","IAM_ALL","OpenAPIHono","createRoute","OpenAPIHono","and","eq","sql","and","eq","sql","and","eq","and","eq","sql","and","eq","sql","inviteUser","user","eq","and","hasPassword","resolvedInviteUrl","delivery","index","and","eq","and","eq","and","asc","desc","eq","gt","ilike","inArray","or","sql","sql","sortColumnMap","eq","or","ilike","asc","desc","and","inArray","gt","and","eq","ilike","or","eq","or","ilike","and","and","eq","inArray","sql","and","eq","sql","inArray","z","z","userIdParamSchema","errorResponseSchema","createRoute","userIdParamSchema","errorResponseSchema","IAM_ALL","OpenAPIHono","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","sql","eq","sql","and","z","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","OpenAPIHono","getCookie","OpenAPIHono","logger","createMiddleware","HTTPException","logger","createMiddleware","HTTPException","getCookie","getCookie","logger","routes"]}
|