@mesob/auth-hono 0.5.0 → 0.5.3

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.js.map CHANGED
@@ -1 +1 @@
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 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 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\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 } 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 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","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"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/db/index.ts","../src/db/schema.ts","../src/handler.ts","../src/lib/cookie.ts","../src/lib/crypto.ts","../src/lib/error-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/session-cache.ts","../src/lib/load-session-pair.ts","../src/lib/normalize-rate-limit-ip.ts","../src/lib/auth-rate-limit.ts","../src/middlewares/auth-rate-limit-middleware.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 { AUTH_RATE_LIMIT_POST_PATHS } from './lib/auth-rate-limit';\nexport {\n cleanupExpiredData,\n cleanupExpiredSessions,\n cleanupExpiredVerifications,\n} from './lib/cleanup';\nexport {\n getSessionCookieName,\n getSessionKeyNamespace,\n} from './lib/cookie';\nexport {\n hasPermission,\n hasPermissionThrow,\n} from './lib/has-role-permission';\nexport { rateLimitClientKey } from './lib/normalize-rate-limit-ip';\nexport {\n deleteSessionCacheKeys,\n invalidateSessionCacheForHashedToken,\n invalidateSessionCacheForUser,\n sessionCacheKey,\n} from './lib/session-cache';\nexport { createAuthRateLimitMiddleware } from './middlewares/auth-rate-limit-middleware';\nexport { createSessionMiddleware } from './middlewares/session-middleware';\nexport { createTenantMiddleware } from './middlewares/tenant-middleware';\nexport type { SessionStatus } from './session';\nexport type {\n AuthConfig,\n AuthKvStorage,\n AuthRateLimitConfig,\n MesobAuth,\n SendInvitationParams,\n SendVerificationOTPParams,\n Session,\n SessionCacheConfig,\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 if (config.sessionCache?.enabled && !config.sessionCache.kv) {\n throw new Error('sessionCache.kv is required when sessionCache.enabled');\n }\n if (config.rateLimit?.enabled) {\n if (!config.rateLimit.kv) {\n throw new Error('rateLimit.kv is required when rateLimit.enabled');\n }\n if (config.rateLimit.window < 1 || config.rateLimit.max < 1) {\n throw new Error('rateLimit.window and rateLimit.max must be >= 1');\n }\n const ipv6s = config.rateLimit.ipv6Subnet;\n if (\n ipv6s !== undefined &&\n (!Number.isFinite(ipv6s) || ipv6s < 1 || ipv6s > 128)\n ) {\n throw new Error('rateLimit.ipv6Subnet must be between 1 and 128');\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 { getSessionCookieName } from './lib/cookie';\nimport { hashToken } from './lib/crypto';\nimport { handleError } from './lib/error-handler';\nimport { loadSessionPair } from './lib/load-session-pair';\nimport { createAuthRateLimitMiddleware } from './middlewares/auth-rate-limit-middleware';\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 pair = await loadSessionPair(database, config, hashedToken);\n if (pair) {\n setAuthContext({\n c,\n config,\n database,\n user: pair.user,\n session: pair.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 if (config.rateLimit?.enabled) {\n app.use('*', createAuthRateLimitMiddleware(config));\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 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\n/** Namespace for session cookie + session KV cache (`{ns}:sc:v1:…`). */\nexport const getSessionKeyNamespace = (config: AuthConfig): string => {\n const p = config.prefix?.trim();\n return p && p.length > 0 ? p : 'msb';\n};\n\nexport const getSessionCookieName = (config: AuthConfig): string => {\n const prefix = config.prefix?.trim() || '';\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 { 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\nexport const listHashedTokensForUser = async ({\n database,\n userId,\n tenantId,\n}: DeleteUserSessionsParams): Promise<string[]> => {\n const rows = await database\n .select({ token: sessionsInIam.token })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.userId, userId),\n eq(sessionsInIam.tenantId, tenantId),\n ),\n );\n return rows.map((r) => r.token);\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 { Database } from '../db';\nimport { listHashedTokensForUser } from '../db/orm';\nimport type { AuthConfig, Session, User } from '../types';\nimport { getSessionKeyNamespace } from './cookie';\n\nexport type SessionCachePayload = {\n session: Session;\n user: User;\n};\n\nexport const sessionCacheKey = (\n config: AuthConfig,\n hashedToken: string,\n): string => `${getSessionKeyNamespace(config)}:sc:v1:${hashedToken}`;\n\nexport async function readSessionCache(\n config: AuthConfig,\n hashedToken: string,\n): Promise<SessionCachePayload | null> {\n const sc = config.sessionCache;\n if (!sc?.enabled) {\n return null;\n }\n const raw = await sc.kv.get(sessionCacheKey(config, hashedToken));\n if (!raw) {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as SessionCachePayload;\n if (\n !parsed?.session?.expiresAt ||\n new Date(parsed.session.expiresAt) <= new Date()\n ) {\n await sc.kv.delete(sessionCacheKey(config, hashedToken));\n return null;\n }\n return parsed;\n } catch {\n await sc.kv.delete(sessionCacheKey(config, hashedToken));\n return null;\n }\n}\n\nexport async function writeSessionCache(\n config: AuthConfig,\n hashedToken: string,\n payload: SessionCachePayload,\n): Promise<void> {\n const sc = config.sessionCache;\n if (!sc?.enabled) {\n return;\n }\n const ttl =\n sc.ttlSeconds ??\n Math.max(\n 60,\n Math.ceil(\n (new Date(payload.session.expiresAt).getTime() - Date.now()) / 1000,\n ),\n );\n await sc.kv.put(\n sessionCacheKey(config, hashedToken),\n JSON.stringify(payload),\n {\n expirationTtl: Math.min(Math.max(ttl, 60), 2_147_483_647),\n },\n );\n}\n\nexport async function deleteSessionCacheKeys(\n config: AuthConfig,\n hashedTokens: string[],\n): Promise<void> {\n const sc = config.sessionCache;\n if (!sc?.enabled || hashedTokens.length === 0) {\n return;\n }\n await Promise.all(\n hashedTokens.map((t) => sc.kv.delete(sessionCacheKey(config, t))),\n );\n}\n\nexport async function invalidateSessionCacheForHashedToken(\n config: AuthConfig,\n hashedToken: string,\n): Promise<void> {\n await deleteSessionCacheKeys(config, [hashedToken]);\n}\n\nexport async function invalidateSessionCacheForUser(\n config: AuthConfig,\n database: Database,\n userId: string,\n tenantId: string,\n): Promise<void> {\n const tokens = await listHashedTokensForUser({\n database,\n userId,\n tenantId,\n });\n await deleteSessionCacheKeys(config, tokens);\n}\n","import type { Database } from '../db';\nimport {\n deleteSession,\n fetchSessionByToken,\n fetchUserWithRoles,\n} from '../db/orm';\nimport type { AuthConfig, Session, User } from '../types';\nimport { readSessionCache, writeSessionCache } from './session-cache';\n\nexport async function loadSessionPair(\n database: Database,\n config: AuthConfig,\n hashedToken: string,\n): Promise<{ session: Session; user: User } | null> {\n const cached = await readSessionCache(config, hashedToken);\n if (cached) {\n return { session: cached.session, user: cached.user };\n }\n\n const session = await fetchSessionByToken({\n database,\n hashedToken,\n tenantId: config.tenant?.tenantId || 'tenant',\n });\n if (!session) {\n return null;\n }\n\n const user = await fetchUserWithRoles({\n database,\n userId: session.userId,\n tenantId: session.tenantId,\n });\n if (!user) {\n await deleteSession({\n database,\n sessionId: session.id,\n tenantId: session.tenantId,\n });\n return null;\n }\n\n await writeSessionCache(config, hashedToken, { session, user });\n return { session, user };\n}\n","/** Stable client key for auth rate limits (IPv6 canonical + optional prefix). */\n\nfunction parseIpv4Dotted(s: string): Uint8Array | null {\n const p = s.split('.');\n if (p.length !== 4) {\n return null;\n }\n const b = new Uint8Array(4);\n for (let i = 0; i < 4; i++) {\n if (!/^\\d{1,3}$/.test(p[i])) {\n return null;\n }\n const n = Number(p[i]);\n if (!Number.isInteger(n) || n < 0 || n > 255) {\n return null;\n }\n b[i] = n;\n }\n return b;\n}\n\nfunction ipv4Key(bytes: Uint8Array): string {\n return `4:${bytes[0]}.${bytes[1]}.${bytes[2]}.${bytes[3]}`;\n}\n\nfunction maskIpv6InPlace(bytes: Uint8Array, prefixBits: number): void {\n if (prefixBits >= 128) {\n return;\n }\n const whole = Math.floor(prefixBits / 8);\n const rem = prefixBits % 8;\n if (rem === 0) {\n for (let i = whole; i < 16; i++) {\n bytes[i] = 0;\n }\n } else {\n for (let i = whole + 1; i < 16; i++) {\n bytes[i] = 0;\n }\n const keep = (0xff << (8 - rem)) & 0xff;\n bytes[whole] &= keep;\n }\n}\n\nfunction isIpv4MappedIpv6(bytes: Uint8Array): boolean {\n for (let i = 0; i < 10; i++) {\n if (bytes[i] !== 0) {\n return false;\n }\n }\n return bytes[10] === 0xff && bytes[11] === 0xff;\n}\n\nfunction parseIpv6HextetsToBytes(s: string): Uint8Array | null {\n const buf = new Uint8Array(16);\n if (s === '') {\n return buf;\n }\n const double = s.includes('::');\n if (double && s.split('::').length > 2) {\n return null;\n }\n const [leftRaw, rightRaw] = double ? s.split('::', 2) : [s, ''];\n const left = leftRaw ? leftRaw.split(':').filter(Boolean) : [];\n const right = rightRaw ? rightRaw.split(':').filter(Boolean) : [];\n const partsLen = left.length + right.length;\n if (double) {\n if (partsLen > 8) {\n return null;\n }\n } else if (partsLen !== 8) {\n return null;\n }\n const pad = double ? 8 - partsLen : 0;\n const all = [...left, ...Array(pad).fill('0'), ...right];\n if (all.length !== 8) {\n return null;\n }\n for (let i = 0; i < 8; i++) {\n const h = all[i];\n if (!h || h.includes('.')) {\n return null;\n }\n const v = Number.parseInt(h, 16);\n if (v > 0xffff || Number.isNaN(v)) {\n return null;\n }\n buf[i * 2] = v >> 8;\n buf[i * 2 + 1] = v & 0xff;\n }\n return buf;\n}\n\nfunction parseIpv6ToBytes(address: string): Uint8Array | null {\n let a = address.trim().toLowerCase();\n if (a.startsWith('[') && a.endsWith(']')) {\n a = a.slice(1, -1);\n }\n const zi = a.indexOf('%');\n if (zi >= 0) {\n a = a.slice(0, zi);\n }\n if (a === '') {\n return null;\n }\n\n if (!a.includes(':')) {\n const v4 = parseIpv4Dotted(a);\n return v4 ? v4 : null;\n }\n\n const lastColon = a.lastIndexOf(':');\n if (lastColon > 0) {\n const maybeV4 = a.slice(lastColon + 1);\n if (/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(maybeV4)) {\n const v4b = parseIpv4Dotted(maybeV4);\n if (!v4b) {\n return null;\n }\n const prefix = a.slice(0, lastColon);\n const w1 = (v4b[0] << 8) | v4b[1];\n const w2 = (v4b[2] << 8) | v4b[3];\n const tailHex = `${w1.toString(16)}:${w2.toString(16)}`;\n let merged: string;\n if (!prefix) {\n merged = tailHex;\n } else if (prefix.endsWith(':')) {\n merged = `${prefix}${tailHex}`;\n } else {\n merged = `${prefix}:${tailHex}`;\n }\n return parseIpv6HextetsToBytes(merged);\n }\n }\n\n return parseIpv6HextetsToBytes(a);\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n let o = '';\n for (let i = 0; i < bytes.length; i++) {\n o += bytes[i].toString(16).padStart(2, '0');\n }\n return o;\n}\n\n/** IPv4 full address; IPv6 masked to prefixBits (1–128), default subnet /64. */\nexport function rateLimitClientKey(\n raw: string,\n ipv6SubnetBits: number,\n): string {\n const s = raw.trim();\n if (!s || s === 'unknown') {\n return 'unknown';\n }\n\n const prefixBits =\n Number.isFinite(ipv6SubnetBits) &&\n ipv6SubnetBits >= 1 &&\n ipv6SubnetBits <= 128\n ? Math.floor(ipv6SubnetBits)\n : 64;\n\n if (!s.includes(':')) {\n const v4 = parseIpv4Dotted(s);\n return v4 ? ipv4Key(v4) : `raw:${s}`;\n }\n\n const bytes = parseIpv6ToBytes(s);\n if (!bytes) {\n return `raw:${s}`;\n }\n\n if (isIpv4MappedIpv6(bytes)) {\n return ipv4Key(bytes.subarray(12, 16));\n }\n\n maskIpv6InPlace(bytes, prefixBits);\n return `6:${bytesToHex(bytes)}`;\n}\n","import type { Context } from 'hono';\nimport type { AuthConfig } from '../types';\nimport { rateLimitClientKey } from './normalize-rate-limit-ip';\n\n/** POST paths relative to mounted auth app root */\nexport const AUTH_RATE_LIMIT_POST_PATHS = new Set([\n '/check-account',\n '/sign-in',\n '/sign-up',\n '/password/forgot',\n '/password/reset',\n '/password/set',\n '/email/verification/request',\n '/email/verification/confirm',\n '/phone/verification/request',\n '/phone/verification/confirm',\n]);\n\nconst DEFAULT_MESSAGE = 'Too many requests. Please wait before trying again.';\n\nconst RL_PREFIX = 'msb:rl:v1:';\n\nexport function getClientIp(c: Context, headerName: string): string {\n const primary = c.req.header(headerName)?.trim();\n if (primary) {\n return primary;\n }\n const forwarded = c.req.header('x-forwarded-for')?.split(',')[0]?.trim();\n if (forwarded) {\n return forwarded;\n }\n return c.req.header('x-real-ip')?.trim() || 'unknown';\n}\n\nfunction rateLimitKey(path: string, windowStart: number, ip: string): string {\n const bucket = path.replaceAll(/[^a-z0-9/-]/gi, '_');\n return `${RL_PREFIX}${bucket}:${ip}:${windowStart}`;\n}\n\nexport async function checkAuthRateLimit(\n c: Context,\n config: AuthConfig,\n): Promise<{ limited: false } | { limited: true; message: string }> {\n const rl = config.rateLimit;\n if (!rl?.enabled) {\n return { limited: false };\n }\n if (c.req.method !== 'POST') {\n return { limited: false };\n }\n const path = c.req.path;\n if (!AUTH_RATE_LIMIT_POST_PATHS.has(path)) {\n return { limited: false };\n }\n\n const rawIp = getClientIp(c, rl.ipHeader ?? 'cf-connecting-ip');\n const ipKey = rateLimitClientKey(rawIp, rl.ipv6Subnet ?? 64);\n const now = Math.floor(Date.now() / 1000);\n const windowStart = Math.floor(now / rl.window) * rl.window;\n const key = rateLimitKey(path, windowStart, ipKey);\n const msg = rl.message ?? DEFAULT_MESSAGE;\n\n const raw = await rl.kv.get(key);\n let count = 0;\n if (raw) {\n try {\n const parsed = JSON.parse(raw) as { n?: number };\n count = typeof parsed.n === 'number' ? parsed.n : 0;\n } catch {\n count = 0;\n }\n }\n\n if (count >= rl.max) {\n return { limited: true, message: msg };\n }\n\n await rl.kv.put(key, JSON.stringify({ n: count + 1 }), {\n expirationTtl: Math.min(rl.window * 2, 2_147_483_647),\n });\n\n return { limited: false };\n}\n","import type { MiddlewareHandler } from 'hono';\nimport { checkAuthRateLimit } from '../lib/auth-rate-limit';\nimport type { AuthConfig } from '../types';\nimport type { AuthEnv } from '../types/context';\n\nexport const createAuthRateLimitMiddleware = (\n config: AuthConfig,\n): MiddlewareHandler<AuthEnv> => {\n return async (c, next) => {\n const result = await checkAuthRateLimit(c, config);\n if (result.limited) {\n return c.json(\n { error: result.message, code: 'RATE_LIMITED' as const },\n 429,\n );\n }\n await next();\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 { invalidateSessionCacheForHashedToken } from '../../../lib/session-cache';\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 await invalidateSessionCacheForHashedToken(config, hashedToken);\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 { invalidateSessionCacheForUser } from '../../../lib/session-cache';\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 await invalidateSessionCacheForUser(\n config,\n database,\n result.user.id,\n resolvedTenantId,\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 { invalidateSessionCacheForUser } from '../../../lib/session-cache';\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 await invalidateSessionCacheForUser(\n config,\n database,\n userId,\n resolvedTenantId,\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 { invalidateSessionCacheForUser } from '../../../lib/session-cache';\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 invalidateSessionCacheForUser(\n config,\n database,\n verification.userId,\n resolvedTenantId,\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 { invalidateSessionCacheForUser } from '../../../lib/session-cache';\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 await invalidateSessionCacheForUser(\n config,\n database,\n result.user.id,\n resolvedTenantId,\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 { invalidateSessionCacheForUser } from '../../../lib/session-cache';\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 await invalidateSessionCacheForUser(\n config,\n database,\n userId,\n resolvedTenantId,\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 { invalidateSessionCacheForUser } from '../../../lib/session-cache';\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 await invalidateSessionCacheForUser(\n config,\n database,\n userId,\n resolvedTenantId,\n );\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 { invalidateSessionCacheForUser } from '../../../lib/session-cache';\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 await invalidateSessionCacheForUser(\n config,\n database,\n userId,\n resolvedTenantId,\n );\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 { invalidateSessionCacheForUser } from '../../../lib/session-cache';\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 config = c.get('config');\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 invalidateSessionCacheForUser(config, database, userId, tenantId);\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 { deleteSessionCacheKeys } from '../../../lib/session-cache';\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 const config = c.get('config');\n await deleteSessionCacheKeys(config, [existing.token]);\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 { invalidateSessionCacheForUser } from '../../../lib/session-cache';\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 await invalidateSessionCacheForUser(\n config,\n database,\n body.userId,\n resolvedTenantId,\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 { invalidateSessionCacheForUser } from '../../../lib/session-cache';\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 config = c.get('config');\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 await invalidateSessionCacheForUser(\n config,\n database,\n existing.userId,\n tenantId,\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 { invalidateSessionCacheForUser } from '../../../lib/session-cache';\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 config = c.get('config');\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 await invalidateSessionCacheForUser(config, database, id, tenantId);\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 { invalidateSessionCacheForUser } from '../../../lib/session-cache';\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 config = c.get('config');\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 await invalidateSessionCacheForUser(config, database, id, tenantId);\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 { updateSessionExpiry } from './db/orm';\nimport {\n deleteSessionCookie,\n getSessionCookieName,\n setSessionCookie,\n} from './lib/cookie';\nimport { hashToken } from './lib/crypto';\nimport { loadSessionPair } from './lib/load-session-pair';\nimport {\n getRefreshedExpiresAt,\n getSessionUpdateAge,\n shouldRefreshSession,\n} from './lib/session';\nimport {\n invalidateSessionCacheForHashedToken,\n writeSessionCache,\n} from './lib/session-cache';\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 pair = await loadSessionPair(database, config, hashedToken);\n\n if (!pair) {\n await invalidateSessionCacheForHashedToken(config, hashedToken);\n deleteSessionCookie(c, config);\n return {\n session: null,\n user: null,\n sessionToken: null,\n status: 'invalid_session',\n };\n }\n\n let { session, user } = pair;\n\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 await updateSessionExpiry({\n database,\n sessionId: session.id,\n tenantId: session.tenantId,\n expiresAt: newExpiresAt,\n });\n\n setSessionCookie(c, sessionToken, config, {\n expires: new Date(newExpiresAt),\n });\n\n session = { ...session, expiresAt: newExpiresAt };\n await writeSessionCache(config, hashedToken, { session, user });\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\n/** KV subset for session cache + rate limits (e.g. Cloudflare KVNamespace). */\nexport type AuthKvStorage = {\n get(key: string): Promise<string | null | undefined>;\n put(\n key: string,\n value: string,\n options?: { expirationTtl?: number },\n ): Promise<void>;\n delete(key: string): Promise<void>;\n};\n\nexport type SessionCacheConfig =\n | { enabled: false }\n | {\n enabled: true;\n kv: AuthKvStorage;\n /** Cache entry TTL in seconds */\n ttlSeconds?: number;\n };\n\nexport type AuthRateLimitConfig =\n | { enabled: false }\n | {\n enabled: true;\n kv: AuthKvStorage;\n /** Window length in seconds */\n window: number;\n /** Max requests per window per IP (and per route bucket in impl) */\n max: number;\n /** Shown on 429 for auth-react */\n message?: string;\n /** Default cf-connecting-ip; impl may fall back to x-forwarded-for */\n ipHeader?: string;\n /**\n * IPv6 rate-limit bucket: mask to this prefix length (1–128).\n * 128 = full address; 64 = typical LAN; 48 / 32 = larger nets. Default 64.\n * IPv4 always uses the full address. IPv4-mapped IPv6 → IPv4 key.\n */\n ipv6Subnet?: number;\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 /**\n * Session cookie name + KV session cache key namespace (`{prefix}_session_token`, `{prefix}:sc:v1:…`).\n * Default `msb`. Align with auth-react `prefix`.\n */\n prefix?: string;\n tenant?: TenantConfig;\n docs?: DocsConfig;\n permissions?: PermissionTree;\n roles?: SeedRole[];\n session: SessionConfig;\n email: EmailConfig;\n phone: PhoneConfig;\n signUp?: SignUpConfig;\n security?: SecurityConfig;\n /** Session+user cache in KV; DB remains source of truth when disabled */\n sessionCache?: SessionCacheConfig;\n /** Abuse guard on unauthenticated auth routes; separate KV from sessionCache */\n rateLimit?: AuthRateLimitConfig;\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 prefix: 'msb';\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 readonly sessionCache: { readonly enabled: false };\n readonly rateLimit: { readonly enabled: false };\n};\n\nexport const defaultAuthConfig: DefaultAuthConfig = {\n tenant: {\n enabled: true,\n tenantId: 'tenant',\n },\n docs: {\n enabled: true,\n },\n prefix: 'msb',\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 sessionCache: { enabled: false },\n rateLimit: { enabled: false },\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","isDatabaseError","and","eq","sql","and","sql","eq","and","eq","and","eq","sql","sql","and","eq","and","eq","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"]}