@mesob/auth-hono 0.1.0 → 0.1.1

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/relations.ts","../src/db/schema.ts","../src/handler.ts","../src/db/orm/session.ts","../src/db/orm/tenant.ts","../src/db/orm/user.ts","../src/lib/cookie.ts","../src/lib/crypto.ts","../src/routes/index.ts","../src/routes/auth/auth.route.ts","../src/routes/auth.schema.ts","../src/routes/auth/handler/check-user.ts","../src/lib/tenant.ts","../src/routes/auth/handler/sign-in.ts","../src/errors.ts","../src/lib/normalize-user.ts","../src/lib/session.ts","../src/routes/auth/helper/session.ts","../src/routes/auth/helper/user.ts","../src/routes/auth/helper/verification.ts","../src/routes/auth/handler/sign-out.ts","../src/db/transaction.ts","../src/routes/auth/handler/sign-up.ts","../src/routes/domains/domains.route.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/verify.ts","../src/routes/permissions/permissions.route.ts","../src/routes/permissions/handler/get-permission.ts","../src/routes/permissions/handler/list-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/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/create-role.ts","../src/routes/roles/handler/delete-role.ts","../src/routes/roles/handler/get-role.ts","../src/routes/roles/handler/list-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/tenants/tenants.route.ts","../src/routes/tenants/handler/create-tenant.ts","../src/routes/tenants/handler/delete-tenant.ts","../src/routes/tenants/handler/get-tenant.ts","../src/routes/tenants/handler/list-tenants.ts","../src/routes/tenants/handler/update-tenant.ts","../src/routes/tenants/tenants.schema.ts","../src/routes/user-roles/user-roles.route.ts","../src/routes/user-roles/handler/assign-user-role.ts","../src/routes/user-roles/handler/list-user-roles.ts","../src/routes/user-roles/handler/revoke-user-role.ts","../src/routes/user-roles/user-roles.schema.ts","../src/routes/users/users.route.ts","../src/routes/users/handler/ban-user.ts","../src/routes/users/helper/user.ts","../src/routes/users/handler/create-user.ts","../src/routes/users/handler/delete-user.ts","../src/routes/users/handler/get-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 { createSessionMiddleware } from './middlewares/session-middleware';\nexport { createTenantMiddleware } from './middlewares/tenant-middleware';\nexport type {\n AuthConfig,\n MesobAuth,\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 // Wrap routes app to handle basePath stripping\n const routes = {\n ...routesApp,\n fetch: async (request: Request, env?: unknown) => {\n // Strip basePath from request URL if it exists\n if (basePath && request.url) {\n const url = new URL(request.url);\n if (url.pathname.startsWith(basePath)) {\n url.pathname = url.pathname.slice(basePath.length) || '/';\n const modifiedRequest = new Request(url, request);\n return await routesApp.fetch(modifiedRequest, env);\n }\n }\n return await routesApp.fetch(request, env);\n },\n };\n\n return {\n routes: routes as typeof routesApp,\n getSession,\n tenantMiddleware,\n sessionMiddleware,\n };\n};\n","import { drizzle } from 'drizzle-orm/node-postgres';\nimport { Pool } from 'pg';\nimport * as relations from './relations';\nimport * as schema from './schema';\n\nconst schemaConfig = { schema: { ...schema, ...relations } };\n\nexport const createDatabase = (connectionString: string) => {\n const pool = new Pool({ connectionString });\n return drizzle({ client: pool, ...schemaConfig });\n};\n\nexport type Database = ReturnType<typeof createDatabase>;\n","import { relations } from \"drizzle-orm/relations\";\nimport { tenantsInIam, usersInIam, sessionsInIam, verificationsInIam, accountChangesInIam, rolesInIam, permissionsInIam, rolePermissionsInIam, userRolesInIam, accountsInIam, domainsInIam } from \"./schema\";\n\nexport const usersInIamRelations = relations(usersInIam, ({one, many}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [usersInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tsessionsInIam: many(sessionsInIam),\n\tverificationsInIam: many(verificationsInIam),\n\taccountChangesInIam: many(accountChangesInIam),\n\tuserRolesInIam: many(userRolesInIam),\n\taccountsInIam: many(accountsInIam),\n}));\n\nexport const tenantsInIamRelations = relations(tenantsInIam, ({many}) => ({\n\tusersInIam: many(usersInIam),\n\tsessionsInIam: many(sessionsInIam),\n\tverificationsInIam: many(verificationsInIam),\n\taccountChangesInIam: many(accountChangesInIam),\n\trolesInIam: many(rolesInIam),\n\trolePermissionsInIam: many(rolePermissionsInIam),\n\tuserRolesInIam: many(userRolesInIam),\n\taccountsInIam: many(accountsInIam),\n\tdomainsInIam: many(domainsInIam),\n}));\n\nexport const sessionsInIamRelations = relations(sessionsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [sessionsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [sessionsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const verificationsInIamRelations = relations(verificationsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [verificationsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [verificationsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const accountChangesInIamRelations = relations(accountChangesInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [accountChangesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [accountChangesInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const rolesInIamRelations = relations(rolesInIam, ({one, many}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [rolesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\trolePermissionsInIam: many(rolePermissionsInIam),\n\tuserRolesInIam: many(userRolesInIam),\n}));\n\nexport const rolePermissionsInIamRelations = relations(rolePermissionsInIam, ({one}) => ({\n\tpermissionsInIam: one(permissionsInIam, {\n\t\tfields: [rolePermissionsInIam.permissionId],\n\t\treferences: [permissionsInIam.id]\n\t}),\n\trolesInIam: one(rolesInIam, {\n\t\tfields: [rolePermissionsInIam.roleId],\n\t\treferences: [rolesInIam.id]\n\t}),\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [rolePermissionsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n}));\n\nexport const permissionsInIamRelations = relations(permissionsInIam, ({many}) => ({\n\trolePermissionsInIam: many(rolePermissionsInIam),\n}));\n\nexport const userRolesInIamRelations = relations(userRolesInIam, ({one}) => ({\n\trolesInIam: one(rolesInIam, {\n\t\tfields: [userRolesInIam.roleId],\n\t\treferences: [rolesInIam.id]\n\t}),\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [userRolesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [userRolesInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const accountsInIamRelations = relations(accountsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [accountsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [accountsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const domainsInIamRelations = relations(domainsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [domainsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n}));","import { pgTable, pgSchema, uniqueIndex, foreignKey, unique, pgPolicy, check, uuid, varchar, timestamp, text, boolean, smallint, index, inet, jsonb } from \"drizzle-orm/pg-core\"\nimport { sql } from \"drizzle-orm\"\n\nexport const iam = pgSchema(\"iam\");\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}, (table) => [\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_contact_required_check\", sql`(email IS NOT NULL) OR (phone IS NOT NULL)`),\n\tcheck(\"users_login_attempt_nonnegative_check\", sql`login_attempt >= 0`),\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(\"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: \"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 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 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(\"text_ops\")),\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_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_expires_after_created_check\", sql`expires_at > created_at`),\n\tcheck(\"account_changes_status_check\", sql`(status)::text = ANY ((ARRAY['pending'::character varying, 'applied'::character varying, 'cancelled'::character varying, '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 rolesInIam = iam.table(\"roles\", {\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\tname: jsonb().notNull(),\n\tdescription: jsonb().notNull(),\n\tcode: text().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\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 rolePermissionsInIam = iam.table(\"role_permissions\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\troleId: uuid(\"role_id\").notNull(),\n\tpermissionId: text(\"permission_id\").notNull(),\n}, (table) => [\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.roleId],\n\t\t\tforeignColumns: [rolesInIam.id],\n\t\t\tname: \"role_permissions_role_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\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\tunique(\"role_permissions_unique\").on(table.roleId, table.permissionId),\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\tforeignKey({\n\t\t\tcolumns: [table.roleId],\n\t\t\tforeignColumns: [rolesInIam.id],\n\t\t\tname: \"user_roles_role_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\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\tunique(\"user_roles_unique\").on(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 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\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 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_id_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\")),\n\tindex(\"domains_tenant_status_idx\").using(\"btree\", table.tenantId.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 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.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 userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\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, sql } from 'drizzle-orm';\nimport type { User } from '../../types';\nimport { rolesInIam, userRolesInIam, 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 userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\n `,\n })\n .from(usersInIam)\n .leftJoin(\n userRolesInIam,\n and(\n eq(userRolesInIam.userId, usersInIam.id),\n eq(userRolesInIam.tenantId, tenantId),\n ),\n )\n .leftJoin(\n rolesInIam,\n and(\n eq(userRolesInIam.roleId, rolesInIam.id),\n eq(rolesInIam.tenantId, tenantId),\n ),\n )\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .groupBy(usersInIam.id)\n .limit(1);\n return (userResult as User) || null;\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 { 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 './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('/tenants', tenantRoutes)\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 checkUserResponseSchema,\n checkUserSchema,\n errorResponseSchema,\n messageSchema,\n signInResponseSchema,\n signInSchema,\n signUpResponseSchema,\n signUpSchema,\n} from '../auth.schema';\nimport { checkUserHandler } from './handler/check-user';\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 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 checkUserRoute = createRoute({\n method: 'post',\n path: '/check-user',\n tags: ['Auth'],\n summary: 'Check if user exists',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: checkUserSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: checkUserResponseSchema,\n },\n },\n description: 'User 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(checkUserRoute, checkUserHandler)\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 userRoleSchema = z.object({\n id: z.string().uuid(),\n roleId: z.string().uuid(),\n code: z.string(),\n name: z.string(),\n description: z.string(),\n});\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 userRoles: z.array(userRoleSchema).nullable(),\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 authSuccessSchema = z.object({\n user: userSchema,\n session: sessionSchema.nullable(),\n sessionToken: z.string().optional(),\n sessionExpiresAt: z.string().datetime().optional(),\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: z.string(),\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 checkUserSchema = z.object({\n identifier: z.string(),\n});\n\nexport const checkUserResponseSchema = z.object({\n exists: z.boolean(),\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 { rolesInIam, userRolesInIam, usersInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { User } from '../../../types';\nimport type { AuthEnv } from '../../../types/context';\nimport type { checkUserRoute } from '../auth.route';\n\nexport const checkUserHandler: RouteHandler<\n typeof checkUserRoute,\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 { identifier } = body;\n\n const isEmail = identifier.includes('@');\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 userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\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 userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\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 return c.json({ exists: !!user }, 200);\n};\n","import { HTTPException } from 'hono/http-exception';\nimport type { AuthConfig } from '../types';\n\nexport const ensureTenantId = (\n config: AuthConfig,\n tenantId: string | undefined,\n): string => {\n const enableTenant = config.tenant?.enabled ?? true;\n if (enableTenant) {\n if (!tenantId) {\n throw new HTTPException(400, {\n message: 'Missing tenantId. Tenant isolation is enabled.',\n });\n }\n return tenantId;\n }\n\n // When tenant is disabled, use tenantId from config\n if (!config.tenant?.tenantId) {\n throw new HTTPException(500, {\n message:\n 'tenantId must be provided in config.tenant when tenant.enabled is false.',\n });\n }\n return config.tenant.tenantId;\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { 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 { normalizeUser } from '../../../lib/normalize-user';\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 { fetchUserByIdentifier } from '../helper/user';\nimport {\n handleEmailVerification,\n handlePhoneVerification,\n} from '../helper/verification';\n\nexport const signInHandler: RouteHandler<typeof signInRoute, 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 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 fetchUserByIdentifier({\n database,\n identifier,\n tenantId: resolvedTenantId,\n isEmail,\n });\n\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n if (user.bannedUntil && new Date(user.bannedUntil) > new Date()) {\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 return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 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 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,\n config,\n database,\n tenantId: resolvedTenantId,\n });\n }\n\n if (!isEmail && config.phone.required && !isVerified) {\n return handlePhoneVerification({\n c,\n user,\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 updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n });\n setSessionCookie(c, sessionToken, config, {\n expires: new Date(expiresAt),\n });\n\n return c.json(\n {\n user: normalizeUser(user),\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\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} as const;\n\nexport type AuthError = (typeof AUTH_ERRORS)[keyof typeof AUTH_ERRORS];\n","import type { User } from '../types';\n\nexport const normalizeUser = (user: User) => {\n return {\n ...user,\n userRoles: user.userRoles\n ? user.userRoles.map((role) => ({\n ...role,\n name: typeof role.name === 'string' ? role.name : '',\n description:\n typeof role.description === 'string' ? role.description : '',\n }))\n : null,\n };\n};\n","import { dayjs } from '@mesob/common';\nimport { nanoid } from 'nanoid';\nimport type { SessionConfig } from '../types';\n\nexport const generateHandle = (): string => {\n return nanoid(10);\n};\n\nexport const getSessionExpiresAt = (days = 30) =>\n dayjs().add(days, 'day').toISOString();\n\nexport const parseDuration = (duration: string): number => {\n const match = duration.match(/^(\\d+)([smhd])$/);\n if (!(match?.[1] && match[2])) {\n throw new Error(`Invalid duration format: ${duration}`);\n }\n const value = Number.parseInt(match[1], 10);\n const unit = match[2];\n const multipliers: Record<string, number> = {\n s: 1,\n m: 60,\n h: 3600,\n d: 86400,\n };\n return value * (multipliers[unit] || 1);\n};\n\nexport const addDuration = (duration: string): string => {\n const seconds = parseDuration(duration);\n return dayjs().add(seconds, 'second').toISOString();\n};\n\nexport const generateOtpCode = (length = 6): string => {\n const digits = '0123456789';\n const maxValid = 250; // largest multiple of 10 <= 255 to avoid modulo bias\n let code = '';\n\n while (code.length < length) {\n const randomValues = new Uint8Array(length - code.length);\n crypto.getRandomValues(randomValues);\n for (const val of randomValues) {\n if (val < maxValid && code.length < length) {\n code += digits[val % 10];\n }\n }\n }\n return code;\n};\n\n/**\n * Get session expiration duration based on rememberMe option\n */\nexport const getSessionDuration = ({\n sessionConfig,\n rememberMe,\n}: {\n sessionConfig: SessionConfig;\n rememberMe: boolean;\n}): string => {\n if (rememberMe) {\n return sessionConfig.rememberMeExpiresIn;\n }\n return sessionConfig.shortSessionExpiresIn;\n};\n\n/**\n * Get the update age threshold based on session type\n */\nexport const getSessionUpdateAge = ({\n sessionConfig,\n rememberMe,\n}: {\n sessionConfig: SessionConfig;\n rememberMe: boolean;\n}): string => {\n if (rememberMe) {\n return sessionConfig.updateAge;\n }\n return sessionConfig.shortSessionUpdateAge;\n};\n\n/**\n * Check if session needs refresh based on remaining time\n */\nexport const shouldRefreshSession = ({\n expiresAt,\n updateAge,\n}: {\n expiresAt: string;\n updateAge: string;\n}): boolean => {\n const updateAgeSeconds = parseDuration(updateAge);\n const now = dayjs();\n const expires = dayjs(expiresAt);\n const remainingSeconds = expires.diff(now, 'second');\n\n return remainingSeconds > 0 && remainingSeconds <= updateAgeSeconds;\n};\n\n/**\n * Get new expiration time for session refresh\n */\nexport const getRefreshedExpiresAt = ({\n sessionConfig,\n rememberMe,\n}: {\n sessionConfig: SessionConfig;\n rememberMe: boolean;\n}): string => {\n const duration = getSessionDuration({ sessionConfig, rememberMe });\n return addDuration(duration);\n};\n\n/**\n * Check if session is expired\n */\nexport const isSessionExpired = (expiresAt: string): boolean => {\n return dayjs(expiresAt).isBefore(dayjs());\n};\n","import { and, asc, eq, gt, 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\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n sql`${sessionsInIam.id} = ANY(${idsToDelete.map((s) => s.id)})`,\n ),\n );\n};\n","import { and, eq, gt, sql } from 'drizzle-orm';\nimport {\n accountsInIam,\n rolesInIam,\n userRolesInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { hashPassword } from '../../../lib/crypto';\nimport type { User } from '../../../types';\nimport type {\n CheckExistingUserStatusParams,\n CreateUserWithAccountParams,\n DeleteUnverifiedUserParams,\n FetchUserByIdentifierParams,\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 }\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 { action: 'pending', verificationId: pendingVerification.id };\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 })\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 fetchUserByIdentifier = async ({\n database,\n identifier,\n tenantId,\n isEmail,\n}: FetchUserByIdentifierParams): Promise<User | null> => {\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 [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 userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\n `,\n })\n .from(usersInIam)\n .leftJoin(\n userRolesInIam,\n and(\n eq(userRolesInIam.userId, usersInIam.id),\n eq(userRolesInIam.tenantId, tenantId),\n ),\n )\n .leftJoin(\n rolesInIam,\n and(\n eq(userRolesInIam.roleId, rolesInIam.id),\n eq(rolesInIam.tenantId, tenantId),\n ),\n )\n .where(whereClause)\n .groupBy(usersInIam.id)\n .limit(1);\n return (result as User) || null;\n};\n","import { dayjs } from '@mesob/common';\nimport { and, desc, eq } from 'drizzle-orm';\nimport type { Database } from '../../../db';\nimport { verificationsInIam } from '../../../db/schema';\nimport { hashToken } from '../../../lib/crypto';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport {\n addDuration,\n generateOtpCode,\n parseDuration,\n} from '../../../lib/session';\nimport type {\n CreateVerificationParams,\n HandleVerificationParams,\n SendVerificationParams,\n} from '../auth.types';\n\nexport const createVerification = async ({\n tx,\n tenantId,\n userId,\n type,\n to,\n config,\n}: CreateVerificationParams): Promise<{\n verificationId: string;\n code: string;\n hash: string;\n}> => {\n const isPhone = type === 'phone-otp-sign-up';\n const code = generateOtpCode(\n isPhone ? config.phone.otpLength : config.email.otpLength,\n );\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(\n isPhone ? config.phone.expiresIn : config.email.expiresIn,\n );\n\n const [verification] = await tx\n .insert(verificationsInIam)\n .values({\n tenantId,\n userId,\n type,\n code: hashedCode,\n expiresAt,\n to,\n attempt: 0,\n })\n .returning();\n\n return { verificationId: verification.id, code, hash: hashedCode };\n};\n\nexport const sendVerification = async ({\n channel,\n to,\n code,\n config,\n hash,\n type,\n}: SendVerificationParams & { hash: string; type: string }) => {\n if (channel === 'phone' && config.phone.sendVerificationOTP) {\n await config.phone.sendVerificationOTP({\n phone: to,\n code,\n hash,\n type,\n });\n } else if (config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email: to,\n code,\n hash,\n type,\n });\n }\n};\n\ntype VerificationResendCheckParams = {\n database: Database;\n tenantId: string;\n userId: string;\n type: string;\n resendInterval?: string;\n};\n\ntype VerificationResendCheckResult = {\n blocked: boolean;\n verificationId?: string;\n};\n\nexport const checkVerificationResend = async ({\n database,\n tenantId,\n userId,\n type,\n resendInterval,\n}: VerificationResendCheckParams): Promise<VerificationResendCheckResult> => {\n if (!resendInterval) {\n return { blocked: false };\n }\n\n const [verification] = await database\n .select({\n id: verificationsInIam.id,\n createdAt: verificationsInIam.createdAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, type),\n ),\n )\n .orderBy(desc(verificationsInIam.createdAt))\n .limit(1);\n\n if (!verification) {\n return { blocked: false };\n }\n\n const cooldownSeconds = parseDuration(resendInterval);\n const createdAt = dayjs(verification.createdAt);\n const blocked = dayjs().diff(createdAt, 'second') < cooldownSeconds;\n return { blocked, verificationId: verification.id };\n};\n\nexport const handleEmailVerification = async ({\n c,\n user,\n config,\n database,\n tenantId,\n}: HandleVerificationParams) => {\n if (!user.email) {\n return c.json({ error: 'User email not found' }, 401);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, user.id),\n eq(verificationsInIam.type, 'email-verification'),\n ),\n );\n\n const code = generateOtpCode(config.email.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId,\n userId: user.id,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: user.email,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n\n if (config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email: user.email,\n code,\n hash: hashedCode,\n type: 'email-verification',\n });\n }\n\n return c.json(\n {\n user: normalizeUser(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: normalizeUser(user),\n session: null,\n verificationId: verification.id,\n requiresVerification: true,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, gt } from 'drizzle-orm';\nimport { getCookie } from 'hono/cookie';\nimport { sessionsInIam } from '../../../db/schema';\nimport { deleteSessionCookie, getSessionCookieName } from '../../../lib/cookie';\nimport { hashToken } from '../../../lib/crypto';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { signOutRoute } from '../auth.route';\n\nexport const signOutHandler: RouteHandler<\n typeof signOutRoute,\n AuthEnv\n> = async (c) => {\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n ensureTenantId(config, tenantId);\n\n const sessionToken = getCookie(c, getSessionCookieName(config));\n\n if (!sessionToken) {\n return c.json({ message: 'Signed out' }, 200);\n }\n\n const hashedToken = await hashToken(sessionToken, config.secret);\n const [session] = await database\n .select({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.token, hashedToken),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .limit(1);\n\n if (session) {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.id, session.id),\n eq(sessionsInIam.tenantId, session.tenantId),\n ),\n );\n }\n deleteSessionCookie(c, config);\n\n return c.json({ message: 'Signed out' }, 200);\n};\n","import type { ExtractTablesWithRelations } from 'drizzle-orm';\nimport type { PgQueryResultHKT, PgTransaction } from 'drizzle-orm/pg-core';\nimport type { Database } from './index';\nimport type * as relations from './relations';\nimport type * as schema from './schema';\n\nexport type TransactionClient = PgTransaction<\n PgQueryResultHKT,\n typeof schema & typeof relations,\n ExtractTablesWithRelations<typeof schema & typeof relations>\n>;\n\nexport function withTransaction<T>(\n database: Database,\n callback: (tx: TransactionClient) => Promise<T>,\n): Promise<T> {\n return database.transaction(async (tx) => callback(tx));\n}\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { withTransaction } from '../../../db/transaction';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { generateHandle } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\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 (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 };\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 error: 'Verification pending. Please verify or request a new code.',\n verificationId: result.verificationId,\n requiresVerification: true,\n },\n 409,\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: normalizeUser(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: normalizeUser(result.user),\n session: { id: result.sessionId, expiresAt: result.expiresAt },\n sessionExpiresAt: result.expiresAt,\n },\n 201,\n );\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\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 domainRoutes = new OpenAPIHono<AuthEnv>()\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 { 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 [domain] = await database\n .insert(domainsInIam)\n .values({\n tenantId: resolvedTenantId,\n domain: body.domain,\n status: body.status || 'pending',\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));\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;\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 { normalizeUser } from '../../../lib/normalize-user';\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: normalizeUser(result.user),\n session: {\n id: result.session.id,\n expiresAt: result.session.expiresAt,\n createdAt: result.session.createdAt,\n userAgent: result.session.userAgent,\n ip: result.session.ip,\n },\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 verifyPasswordSchema,\n} from '../auth.schema';\nimport { changePasswordHandler } from './handler/change';\nimport { forgotPasswordHandler } from './handler/forgot';\nimport { resetPasswordHandler } from './handler/reset';\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\nconst passwordRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(forgotPasswordRoute, forgotPasswordHandler)\n .openapi(resetPasswordRoute, resetPasswordHandler)\n .openapi(verifyPasswordRoute, verifyPasswordHandler)\n .openapi(changePasswordRoute, changePasswordHandler);\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 userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\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 userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\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 { normalizeUser } from '../../../lib/normalize-user';\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: normalizeUser(user),\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\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 } 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 type { AuthEnv } from '../../types/context';\nimport { getPermissionHandler } from './handler/get-permission';\nimport { listPermissionsHandler } from './handler/list-permissions';\nimport {\n errorResponseSchema,\n listPermissionsQuerySchema,\n listPermissionsResponseSchema,\n permissionIdParamSchema,\n permissionResponseSchema,\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\nconst permissionRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(listPermissionsRoute, listPermissionsHandler)\n .openapi(getPermissionRoute, getPermissionHandler);\n\nexport default permissionRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\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\n const [permission] = await database\n .select()\n .from(permissionsInIam)\n .where(eq(permissionsInIam.id, id))\n .limit(1);\n\n if (!permission) {\n return c.json({ error: 'Permission not found' }, 404);\n }\n\n return c.json({ permission }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, ilike, sql } from 'drizzle-orm';\nimport { permissionsInIam } from '../../../db/schema';\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\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.application) {\n conditions.push(\n ilike(permissionsInIam.application, `%${query.application}%`),\n );\n }\n if (query.feature) {\n conditions.push(ilike(permissionsInIam.feature, `%${query.feature}%`));\n }\n\n const [permissions, totalResult] = await Promise.all([\n database\n .select()\n .from(permissionsInIam)\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(permissionsInIam)\n .where(conditions.length > 0 ? and(...conditions) : undefined),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ permissions, total, page, limit }, 200);\n};\n","import { z } from 'zod';\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 application: z.string().optional(),\n feature: z.string().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 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 { normalizeUser } from '../../../lib/normalize-user';\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: normalizeUser(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: normalizeUser(result.user),\n session: {\n id: result.session.id,\n expiresAt: result.session.expiresAt,\n createdAt: result.session.createdAt,\n userAgent: result.session.userAgent,\n ip: result.session.ip,\n },\n sessionExpiresAt: result.session.expiresAt,\n },\n 200,\n );\n};\n","import { withTransaction } from '../../../db/transaction';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { normalizeUser } from '../../../lib/normalize-user';\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: normalizeUser(user),\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\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 { 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 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 userAgent: z.string().nullable(),\n ip: z.string().nullable(),\n })\n .nullable(),\n }),\n },\n },\n description: 'Current 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 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 { 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\n return c.json(\n {\n user: user ? normalizeUser(user) : null,\n session: session\n ? {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n }\n : null,\n },\n 200,\n );\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 { 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 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 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 rolePermissionRoutes = new OpenAPIHono<AuthEnv>()\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 type { AuthEnv } from '../../types/context';\nimport { createRoleHandler } from './handler/create-role';\nimport { deleteRoleHandler } from './handler/delete-role';\nimport { getRoleHandler } from './handler/get-role';\nimport { listRolesHandler } from './handler/list-roles';\nimport { updateRoleHandler } from './handler/update-role';\nimport {\n createRoleSchema,\n deleteRoleResponseSchema,\n errorResponseSchema,\n listRolesQuerySchema,\n listRolesResponseSchema,\n roleIdParamSchema,\n roleResponseSchema,\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 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 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 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nconst roleRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(listRolesRoute, listRolesHandler)\n .openapi(getRoleRoute, getRoleHandler)\n .openapi(createRoleRoute, createRoleHandler)\n .openapi(updateRoleRoute, updateRoleHandler)\n .openapi(deleteRoleRoute, deleteRoleHandler);\n\nexport default roleRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { rolesInIam } from '../../../db/schema';\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\n const [role] = await database\n .insert(rolesInIam)\n .values({\n tenantId: resolvedTenantId,\n name: body.name,\n description: body.description,\n code: body.code,\n })\n .returning();\n\n return c.json({ role }, 201);\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 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 } from 'drizzle-orm';\nimport { rolesInIam } 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 .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({ role }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { rolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listRolesRoute } from '../roles.route';\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\n const [roles, totalResult] = await Promise.all([\n database\n .select()\n .from(rolesInIam)\n .where(and(...conditions))\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, sql } from 'drizzle-orm';\nimport { rolesInIam } from '../../../db/schema';\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 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 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\n const [updated] = await database\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 (!updated) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n return c.json({ role: updated }, 200);\n};\n","import { z } from 'zod';\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});\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(),\n description: z.unknown(),\n code: z.string(),\n});\n\nexport const updateRoleSchema = z.object({\n name: z.unknown().optional(),\n description: z.unknown().optional(),\n code: z.string().optional(),\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});\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 deleteRoleResponseSchema = 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 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 sessionRoutes = new OpenAPIHono<AuthEnv>()\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 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 tenantRoutes = new OpenAPIHono<AuthEnv>()\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, eq, sql } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listTenantsRoute } from '../tenants.route';\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\n const [tenants, totalResult] = await Promise.all([\n database\n .select()\n .from(tenantsInIam)\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(tenantsInIam)\n .where(conditions.length > 0 ? and(...conditions) : undefined),\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\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});\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 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 userRoleRoutes = new OpenAPIHono<AuthEnv>()\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 type { AuthEnv } from '../../types/context';\nimport { banUserHandler } from './handler/ban-user';\nimport { createUserHandler } from './handler/create-user';\nimport { deleteUserHandler } from './handler/delete-user';\nimport { getUserHandler } from './handler/get-user';\nimport { listUsersHandler } from './handler/list-users';\nimport { searchUsersHandler } from './handler/search-users';\nimport { updateUserHandler } from './handler/update-user';\nimport {\n banUserSchema,\n createUserSchema,\n deleteUserResponseSchema,\n errorResponseSchema,\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\nconst userRoutes = new OpenAPIHono<AuthEnv>()\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\nexport default userRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { User } from '../../../types';\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 const [updated] = 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 .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 return c.json({ user: normalizeUser(updated as User) }, 200);\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport type {\n CheckHandleExistsParams,\n CheckUserExistsParams,\n} from '../users.types';\n\nexport const checkUserExists = async ({\n database,\n identifier,\n tenantId,\n isEmail,\n}: CheckUserExistsParams) => {\n const whereClause = isEmail\n ? and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n )\n : and(eq(usersInIam.tenantId, tenantId), eq(usersInIam.phone, identifier));\n\n const [user] = await database\n .select()\n .from(usersInIam)\n .where(whereClause)\n .limit(1);\n\n return user || null;\n};\n\nexport const checkHandleExists = async ({\n database,\n handle,\n tenantId,\n}: CheckHandleExistsParams) => {\n const [existingHandle] = await database\n .select()\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.handle}) = lower(${handle})`,\n ),\n )\n .limit(1);\n\n return existingHandle || null;\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { usersInIam } from '../../../db/schema';\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 database\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 })\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 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 { and, eq, ilike, sql } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listUsersRoute } from '../users.route';\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\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [eq(usersInIam.tenantId, tenantId)];\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\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(usersInIam)\n .where(and(...conditions))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(usersInIam)\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json(\n {\n users: users.map((u) => ({\n ...u,\n userRoles: null,\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, sql } from 'drizzle-orm';\nimport { 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 return c.json({ user: normalizeUser(updated as User) }, 200);\n};\n","import { z } from 'zod';\nimport { userSchema } from '../auth.schema';\n\n// Query schemas\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 email: z.string().optional(),\n phone: z.string().optional(),\n handle: z.string().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 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});\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\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 ],\n 'x-tagGroups': [\n {\n name: 'Authentication',\n tags: ['Auth', 'Profile', 'Password', 'Email', 'Phone'],\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 return await next();\n }\n const sessionData = await authInstance.getSession(c);\n\n const { session, user } = sessionData;\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\nconst TENANT_TEST_PATH = '/api/health/tenant-test';\nconst AUTH_DOCS_PATHS = [\n '/api/auth/docs',\n '/api/auth/openapi.json',\n '/api/docs',\n '/api/openapi.json',\n];\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 pathname = new URL(c.req.url).pathname;\n const isTenantTest = pathname === TENANT_TEST_PATH;\n const isAuthDocs = AUTH_DOCS_PATHS.includes(pathname);\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 if (isTenantTest || isAuthDocs) {\n return await next();\n }\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 if (!isTenantTest) {\n throw new HTTPException(500, { message: 'Tenant resolution failed' });\n }\n }\n\n c.set('tenantId', tenantId);\n c.set('tenant', tenant);\n\n const error = validateTenant(tenantId, tenant);\n if (error && !isTenantTest && !isAuthDocs) {\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 GetSessionResult = {\n session: Session | null;\n user: User | null;\n sessionToken: string | null;\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 { session: null, user: null, sessionToken: null };\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 { session: null, user: null, sessionToken: null };\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 { session: null, user: null, sessionToken: null };\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 };\n }\n\n return { session, user, sessionToken };\n } catch {\n return { session: null, user: null, sessionToken: null };\n }\n };\n};\n","import { logger } from '@mesob/common';\nimport type { Database } from '../db';\n\nexport type { Database } from '../db';\n\nexport type UserRole = {\n id: string;\n roleId: string;\n code: string;\n name: unknown; // jsonb\n description: unknown; // jsonb\n};\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 userRoles?: UserRole[];\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 updatedAt?: string;\n userAgent: string | null;\n ip: string | null;\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 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};\n\nexport type EmailConfig = VerificationConfig;\nexport type PhoneConfig = 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 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 secret: string;\n basePath?: string;\n tenant?: TenantConfig;\n docs?: DocsConfig;\n cookie?: CookieConfig;\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\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 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: defaultConfig,\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","sql","sql","and","eq","OpenAPIHono","and","eq","sql","sql","and","eq","and","eq","and","eq","gt","sql","sql","and","eq","gt","and","eq","gt","sql","and","eq","sql","gt","dayjs","and","eq","and","eq","dayjs","and","eq","and","eq","gt","and","eq","gt","createRoute","OpenAPIHono","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","createRoute","OpenAPIHono","createRoute","OpenAPIHono","eq","eq","and","sql","and","sql","z","errorResponseSchema","createRoute","errorResponseSchema","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","OpenAPIHono","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","and","eq","and","eq","sql","eq","and","sql","and","eq","sql","and","eq","sql","z","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","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","OpenAPIHono","createRoute","OpenAPIHono","eq","eq","eq","eq","eq","eq","and","eq","sql","eq","and","sql","eq","sql","eq","sql","z","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","createRoute","OpenAPIHono","and","eq","eq","and","and","eq","and","eq","z","userRoleSchema","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","createRoute","OpenAPIHono","and","eq","sql","and","eq","sql","and","eq","sql","and","eq","sql","and","eq","and","eq","and","eq","ilike","sql","eq","ilike","and","sql","and","eq","ilike","eq","ilike","and","and","eq","sql","and","eq","sql","z","z","userIdParamSchema","errorResponseSchema","createRoute","userIdParamSchema","errorResponseSchema","OpenAPIHono","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","sql","eq","sql","and","z","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","OpenAPIHono","getCookie","OpenAPIHono","createMiddleware","HTTPException","createMiddleware","HTTPException","getCookie","getCookie","logger","routes"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/db/index.ts","../src/db/relations.ts","../src/db/schema.ts","../src/handler.ts","../src/db/orm/session.ts","../src/db/orm/tenant.ts","../src/db/orm/user.ts","../src/lib/cookie.ts","../src/lib/crypto.ts","../src/routes/index.ts","../src/routes/auth/auth.route.ts","../src/routes/auth.schema.ts","../src/routes/auth/handler/check-user.ts","../src/lib/tenant.ts","../src/routes/auth/handler/sign-in.ts","../src/errors.ts","../src/lib/normalize-user.ts","../src/lib/session.ts","../src/routes/auth/helper/session.ts","../src/routes/auth/helper/user.ts","../src/routes/auth/helper/verification.ts","../src/routes/auth/handler/sign-out.ts","../src/db/transaction.ts","../src/routes/auth/handler/sign-up.ts","../src/routes/domains/domains.route.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/verify.ts","../src/routes/permissions/permissions.route.ts","../src/routes/permissions/handler/get-permission.ts","../src/routes/permissions/handler/list-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/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/create-role.ts","../src/routes/roles/handler/delete-role.ts","../src/routes/roles/handler/get-role.ts","../src/routes/roles/handler/list-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/tenants/tenants.route.ts","../src/routes/tenants/handler/create-tenant.ts","../src/routes/tenants/handler/delete-tenant.ts","../src/routes/tenants/handler/get-tenant.ts","../src/routes/tenants/handler/list-tenants.ts","../src/routes/tenants/handler/update-tenant.ts","../src/routes/tenants/tenants.schema.ts","../src/routes/user-roles/user-roles.route.ts","../src/routes/user-roles/handler/assign-user-role.ts","../src/routes/user-roles/handler/list-user-roles.ts","../src/routes/user-roles/handler/revoke-user-role.ts","../src/routes/user-roles/user-roles.schema.ts","../src/routes/users/users.route.ts","../src/routes/users/handler/ban-user.ts","../src/routes/users/helper/user.ts","../src/routes/users/handler/create-user.ts","../src/routes/users/handler/delete-user.ts","../src/routes/users/handler/get-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 { createSessionMiddleware } from './middlewares/session-middleware';\nexport { createTenantMiddleware } from './middlewares/tenant-middleware';\nexport type {\n AuthConfig,\n MesobAuth,\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 // Wrap routes app to handle basePath stripping\n const routes = {\n ...routesApp,\n fetch: async (request: Request, env?: unknown) => {\n // Strip basePath from request URL if it exists\n if (basePath && request.url) {\n const url = new URL(request.url);\n if (url.pathname.startsWith(basePath)) {\n url.pathname = url.pathname.slice(basePath.length) || '/';\n const modifiedRequest = new Request(url, request);\n return await routesApp.fetch(modifiedRequest, env);\n }\n }\n return await routesApp.fetch(request, env);\n },\n };\n\n return {\n routes: routes as typeof routesApp,\n getSession,\n tenantMiddleware,\n sessionMiddleware,\n };\n};\n","import { drizzle } from 'drizzle-orm/node-postgres';\nimport { Pool } from 'pg';\nimport * as relations from './relations';\nimport * as schema from './schema';\n\nconst schemaConfig = { schema: { ...schema, ...relations } };\n\nexport const createDatabase = (connectionString: string) => {\n const pool = new Pool({ connectionString });\n return drizzle({ client: pool, ...schemaConfig });\n};\n\nexport type Database = ReturnType<typeof createDatabase>;\n","import { relations } from \"drizzle-orm/relations\";\nimport { tenantsInIam, usersInIam, sessionsInIam, verificationsInIam, accountChangesInIam, rolesInIam, permissionsInIam, rolePermissionsInIam, userRolesInIam, accountsInIam, domainsInIam } from \"./schema\";\n\nexport const usersInIamRelations = relations(usersInIam, ({one, many}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [usersInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tsessionsInIam: many(sessionsInIam),\n\tverificationsInIam: many(verificationsInIam),\n\taccountChangesInIam: many(accountChangesInIam),\n\tuserRolesInIam: many(userRolesInIam),\n\taccountsInIam: many(accountsInIam),\n}));\n\nexport const tenantsInIamRelations = relations(tenantsInIam, ({many}) => ({\n\tusersInIam: many(usersInIam),\n\tsessionsInIam: many(sessionsInIam),\n\tverificationsInIam: many(verificationsInIam),\n\taccountChangesInIam: many(accountChangesInIam),\n\trolesInIam: many(rolesInIam),\n\trolePermissionsInIam: many(rolePermissionsInIam),\n\tuserRolesInIam: many(userRolesInIam),\n\taccountsInIam: many(accountsInIam),\n\tdomainsInIam: many(domainsInIam),\n}));\n\nexport const sessionsInIamRelations = relations(sessionsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [sessionsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [sessionsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const verificationsInIamRelations = relations(verificationsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [verificationsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [verificationsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const accountChangesInIamRelations = relations(accountChangesInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [accountChangesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [accountChangesInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const rolesInIamRelations = relations(rolesInIam, ({one, many}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [rolesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\trolePermissionsInIam: many(rolePermissionsInIam),\n\tuserRolesInIam: many(userRolesInIam),\n}));\n\nexport const rolePermissionsInIamRelations = relations(rolePermissionsInIam, ({one}) => ({\n\tpermissionsInIam: one(permissionsInIam, {\n\t\tfields: [rolePermissionsInIam.permissionId],\n\t\treferences: [permissionsInIam.id]\n\t}),\n\trolesInIam: one(rolesInIam, {\n\t\tfields: [rolePermissionsInIam.roleId],\n\t\treferences: [rolesInIam.id]\n\t}),\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [rolePermissionsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n}));\n\nexport const permissionsInIamRelations = relations(permissionsInIam, ({many}) => ({\n\trolePermissionsInIam: many(rolePermissionsInIam),\n}));\n\nexport const userRolesInIamRelations = relations(userRolesInIam, ({one}) => ({\n\trolesInIam: one(rolesInIam, {\n\t\tfields: [userRolesInIam.roleId],\n\t\treferences: [rolesInIam.id]\n\t}),\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [userRolesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [userRolesInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const accountsInIamRelations = relations(accountsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [accountsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [accountsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const domainsInIamRelations = relations(domainsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [domainsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n}));","import { pgTable, pgSchema, uniqueIndex, foreignKey, unique, pgPolicy, check, uuid, varchar, timestamp, text, boolean, smallint, index, inet, jsonb } from \"drizzle-orm/pg-core\"\nimport { sql } from \"drizzle-orm\"\n\nexport const iam = pgSchema(\"iam\");\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}, (table) => [\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_contact_required_check\", sql`(email IS NOT NULL) OR (phone IS NOT NULL)`),\n\tcheck(\"users_login_attempt_nonnegative_check\", sql`login_attempt >= 0`),\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(\"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: \"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 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 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(\"text_ops\")),\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_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_expires_after_created_check\", sql`expires_at > created_at`),\n\tcheck(\"account_changes_status_check\", sql`(status)::text = ANY ((ARRAY['pending'::character varying, 'applied'::character varying, 'cancelled'::character varying, '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 rolesInIam = iam.table(\"roles\", {\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\tname: jsonb().notNull(),\n\tdescription: jsonb().notNull(),\n\tcode: text().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\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 rolePermissionsInIam = iam.table(\"role_permissions\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\troleId: uuid(\"role_id\").notNull(),\n\tpermissionId: text(\"permission_id\").notNull(),\n}, (table) => [\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.roleId],\n\t\t\tforeignColumns: [rolesInIam.id],\n\t\t\tname: \"role_permissions_role_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\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\tunique(\"role_permissions_unique\").on(table.roleId, table.permissionId),\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\tforeignKey({\n\t\t\tcolumns: [table.roleId],\n\t\t\tforeignColumns: [rolesInIam.id],\n\t\t\tname: \"user_roles_role_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\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\tunique(\"user_roles_unique\").on(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 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\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 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_id_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\")),\n\tindex(\"domains_tenant_status_idx\").using(\"btree\", table.tenantId.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 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.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 userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\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, sql } from 'drizzle-orm';\nimport type { User } from '../../types';\nimport { rolesInIam, userRolesInIam, 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 userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\n `,\n })\n .from(usersInIam)\n .leftJoin(\n userRolesInIam,\n and(\n eq(userRolesInIam.userId, usersInIam.id),\n eq(userRolesInIam.tenantId, tenantId),\n ),\n )\n .leftJoin(\n rolesInIam,\n and(\n eq(userRolesInIam.roleId, rolesInIam.id),\n eq(rolesInIam.tenantId, tenantId),\n ),\n )\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .groupBy(usersInIam.id)\n .limit(1);\n return (userResult as User) || null;\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 { 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 './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('/tenants', tenantRoutes)\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 checkUserResponseSchema,\n checkUserSchema,\n errorResponseSchema,\n messageSchema,\n signInResponseSchema,\n signInSchema,\n signUpResponseSchema,\n signUpSchema,\n} from '../auth.schema';\nimport { checkUserHandler } from './handler/check-user';\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 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 checkUserRoute = createRoute({\n method: 'post',\n path: '/check-user',\n tags: ['Auth'],\n summary: 'Check if user exists',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: checkUserSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: checkUserResponseSchema,\n },\n },\n description: 'User 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(checkUserRoute, checkUserHandler)\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 userRoleSchema = z.object({\n id: z.string().uuid(),\n roleId: z.string().uuid(),\n code: z.string(),\n name: z.string(),\n description: z.string(),\n});\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 userRoles: z.array(userRoleSchema).nullable(),\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 authSuccessSchema = z.object({\n user: userSchema,\n session: sessionSchema.nullable(),\n sessionToken: z.string().optional(),\n sessionExpiresAt: z.string().datetime().optional(),\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: z.string(),\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 checkUserSchema = z.object({\n identifier: z.string(),\n});\n\nexport const checkUserResponseSchema = z.object({\n exists: z.boolean(),\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 { rolesInIam, userRolesInIam, usersInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { User } from '../../../types';\nimport type { AuthEnv } from '../../../types/context';\nimport type { checkUserRoute } from '../auth.route';\n\nexport const checkUserHandler: RouteHandler<\n typeof checkUserRoute,\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 { identifier } = body;\n\n const isEmail = identifier.includes('@');\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 userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\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 userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\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 return c.json({ exists: !!user }, 200);\n};\n","import { HTTPException } from 'hono/http-exception';\nimport type { AuthConfig } from '../types';\n\nexport const ensureTenantId = (\n config: AuthConfig,\n tenantId: string | undefined,\n): string => {\n const enableTenant = config.tenant?.enabled ?? true;\n if (enableTenant) {\n if (!tenantId) {\n throw new HTTPException(400, {\n message: 'Missing tenantId. Tenant isolation is enabled.',\n });\n }\n return tenantId;\n }\n\n // When tenant is disabled, use tenantId from config\n if (!config.tenant?.tenantId) {\n throw new HTTPException(500, {\n message:\n 'tenantId must be provided in config.tenant when tenant.enabled is false.',\n });\n }\n return config.tenant.tenantId;\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { 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 { normalizeUser } from '../../../lib/normalize-user';\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 { fetchUserByIdentifier } from '../helper/user';\nimport {\n handleEmailVerification,\n handlePhoneVerification,\n} from '../helper/verification';\n\nexport const signInHandler: RouteHandler<typeof signInRoute, 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 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 fetchUserByIdentifier({\n database,\n identifier,\n tenantId: resolvedTenantId,\n isEmail,\n });\n\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n if (user.bannedUntil && new Date(user.bannedUntil) > new Date()) {\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 return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 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 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,\n config,\n database,\n tenantId: resolvedTenantId,\n });\n }\n\n if (!isEmail && config.phone.required && !isVerified) {\n return handlePhoneVerification({\n c,\n user,\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 updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n });\n setSessionCookie(c, sessionToken, config, {\n expires: new Date(expiresAt),\n });\n\n return c.json(\n {\n user: normalizeUser(user),\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\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} as const;\n\nexport type AuthError = (typeof AUTH_ERRORS)[keyof typeof AUTH_ERRORS];\n","import type { User } from '../types';\n\nexport const normalizeUser = (user: User) => {\n return {\n ...user,\n userRoles: user.userRoles\n ? user.userRoles.map((role) => ({\n ...role,\n name: typeof role.name === 'string' ? role.name : '',\n description:\n typeof role.description === 'string' ? role.description : '',\n }))\n : null,\n };\n};\n","import { dayjs } from '@mesob/common';\nimport { nanoid } from 'nanoid';\nimport type { SessionConfig } from '../types';\n\nexport const generateHandle = (): string => {\n return nanoid(10);\n};\n\nexport const getSessionExpiresAt = (days = 30) =>\n dayjs().add(days, 'day').toISOString();\n\nexport const parseDuration = (duration: string): number => {\n const match = duration.match(/^(\\d+)([smhd])$/);\n if (!(match?.[1] && match[2])) {\n throw new Error(`Invalid duration format: ${duration}`);\n }\n const value = Number.parseInt(match[1], 10);\n const unit = match[2];\n const multipliers: Record<string, number> = {\n s: 1,\n m: 60,\n h: 3600,\n d: 86400,\n };\n return value * (multipliers[unit] || 1);\n};\n\nexport const addDuration = (duration: string): string => {\n const seconds = parseDuration(duration);\n return dayjs().add(seconds, 'second').toISOString();\n};\n\nexport const generateOtpCode = (length = 6): string => {\n const digits = '0123456789';\n const maxValid = 250; // largest multiple of 10 <= 255 to avoid modulo bias\n let code = '';\n\n while (code.length < length) {\n const randomValues = new Uint8Array(length - code.length);\n crypto.getRandomValues(randomValues);\n for (const val of randomValues) {\n if (val < maxValid && code.length < length) {\n code += digits[val % 10];\n }\n }\n }\n return code;\n};\n\n/**\n * Get session expiration duration based on rememberMe option\n */\nexport const getSessionDuration = ({\n sessionConfig,\n rememberMe,\n}: {\n sessionConfig: SessionConfig;\n rememberMe: boolean;\n}): string => {\n if (rememberMe) {\n return sessionConfig.rememberMeExpiresIn;\n }\n return sessionConfig.shortSessionExpiresIn;\n};\n\n/**\n * Get the update age threshold based on session type\n */\nexport const getSessionUpdateAge = ({\n sessionConfig,\n rememberMe,\n}: {\n sessionConfig: SessionConfig;\n rememberMe: boolean;\n}): string => {\n if (rememberMe) {\n return sessionConfig.updateAge;\n }\n return sessionConfig.shortSessionUpdateAge;\n};\n\n/**\n * Check if session needs refresh based on remaining time\n */\nexport const shouldRefreshSession = ({\n expiresAt,\n updateAge,\n}: {\n expiresAt: string;\n updateAge: string;\n}): boolean => {\n const updateAgeSeconds = parseDuration(updateAge);\n const now = dayjs();\n const expires = dayjs(expiresAt);\n const remainingSeconds = expires.diff(now, 'second');\n\n return remainingSeconds > 0 && remainingSeconds <= updateAgeSeconds;\n};\n\n/**\n * Get new expiration time for session refresh\n */\nexport const getRefreshedExpiresAt = ({\n sessionConfig,\n rememberMe,\n}: {\n sessionConfig: SessionConfig;\n rememberMe: boolean;\n}): string => {\n const duration = getSessionDuration({ sessionConfig, rememberMe });\n return addDuration(duration);\n};\n\n/**\n * Check if session is expired\n */\nexport const isSessionExpired = (expiresAt: string): boolean => {\n return dayjs(expiresAt).isBefore(dayjs());\n};\n","import { and, asc, eq, gt, inArray, sql } from 'drizzle-orm';\nimport { sessionsInIam } from '../../../db/schema';\nimport type { TransactionClient } from '../../../db/transaction';\nimport { generateToken, hashToken } from '../../../lib/crypto';\nimport { addDuration, getSessionDuration } from '../../../lib/session';\nimport type { AuthConfig, SessionMeta } from '../../../types';\nimport type {\n CleanupOldSessionsParams,\n CreateSessionParams,\n} from '../auth.types';\n\ntype CreateSessionRecordParams = {\n tx: TransactionClient;\n tenantId: string;\n userId: string;\n config: AuthConfig;\n userAgent: string | null;\n ip: string | null;\n action: string;\n rememberMe?: boolean;\n expiresIn?: string;\n};\n\nexport const createSessionRecord = async ({\n tx,\n tenantId,\n userId,\n config,\n userAgent,\n ip,\n action,\n rememberMe,\n expiresIn,\n}: CreateSessionRecordParams): Promise<{\n session: {\n id: string;\n expiresAt: string;\n createdAt: string;\n updatedAt: string;\n userAgent: string | null;\n ip: string | null;\n };\n sessionToken: string;\n expiresAt: string;\n}> => {\n const sessionToken = generateToken();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const sessionDuration =\n expiresIn ||\n getSessionDuration({\n sessionConfig: config.session,\n rememberMe: rememberMe ?? true,\n });\n const expiresAt = addDuration(sessionDuration);\n const meta: SessionMeta = { action };\n\n if (rememberMe !== undefined) {\n meta.rememberMe = rememberMe;\n }\n\n const [session] = await tx\n .insert(sessionsInIam)\n .values({\n tenantId,\n userId,\n token: hashedToken,\n expiresAt,\n userAgent,\n ip,\n meta,\n })\n .returning({\n id: sessionsInIam.id,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n });\n\n return { session, sessionToken, expiresAt };\n};\n\nexport const createSession = async ({\n tx,\n tenantId,\n userId,\n config,\n userAgent,\n ip,\n rememberMe = true,\n}: CreateSessionParams): Promise<{\n sessionId: string;\n sessionToken: string;\n expiresAt: string;\n}> => {\n const { session, sessionToken, expiresAt } = await createSessionRecord({\n tx,\n tenantId,\n userId,\n config,\n userAgent,\n ip,\n rememberMe,\n action: 'sign-up',\n });\n\n return { sessionId: session.id, sessionToken, expiresAt };\n};\n\nexport const cleanupOldSessions = async ({\n database,\n userId,\n tenantId,\n maxSessions,\n}: CleanupOldSessionsParams) => {\n const [{ count }] = await database\n .select({ count: sql<number>`count(*)` })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n );\n\n if (count <= maxSessions) {\n return;\n }\n\n const toDeleteCount = count - maxSessions;\n const idsToDelete = await database\n .select({ id: sessionsInIam.id })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .orderBy(asc(sessionsInIam.createdAt))\n .limit(toDeleteCount);\n\n if (!idsToDelete.length) {\n return;\n }\n\n await database.delete(sessionsInIam).where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n inArray(\n sessionsInIam.id,\n idsToDelete.map((s) => s.id),\n ),\n ),\n );\n};\n","import { and, eq, gt, sql } from 'drizzle-orm';\nimport {\n accountsInIam,\n rolesInIam,\n userRolesInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { hashPassword } from '../../../lib/crypto';\nimport type { User } from '../../../types';\nimport type {\n CheckExistingUserStatusParams,\n CreateUserWithAccountParams,\n DeleteUnverifiedUserParams,\n FetchUserByIdentifierParams,\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 }\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 { action: 'pending', verificationId: pendingVerification.id };\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 })\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 fetchUserByIdentifier = async ({\n database,\n identifier,\n tenantId,\n isEmail,\n}: FetchUserByIdentifierParams): Promise<User | null> => {\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 [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 userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\n `,\n })\n .from(usersInIam)\n .leftJoin(\n userRolesInIam,\n and(\n eq(userRolesInIam.userId, usersInIam.id),\n eq(userRolesInIam.tenantId, tenantId),\n ),\n )\n .leftJoin(\n rolesInIam,\n and(\n eq(userRolesInIam.roleId, rolesInIam.id),\n eq(rolesInIam.tenantId, tenantId),\n ),\n )\n .where(whereClause)\n .groupBy(usersInIam.id)\n .limit(1);\n return (result as User) || null;\n};\n","import { dayjs } from '@mesob/common';\nimport { and, desc, eq } from 'drizzle-orm';\nimport type { Database } from '../../../db';\nimport { verificationsInIam } from '../../../db/schema';\nimport { hashToken } from '../../../lib/crypto';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport {\n addDuration,\n generateOtpCode,\n parseDuration,\n} from '../../../lib/session';\nimport type {\n CreateVerificationParams,\n HandleVerificationParams,\n SendVerificationParams,\n} from '../auth.types';\n\nexport const createVerification = async ({\n tx,\n tenantId,\n userId,\n type,\n to,\n config,\n}: CreateVerificationParams): Promise<{\n verificationId: string;\n code: string;\n hash: string;\n}> => {\n const isPhone = type === 'phone-otp-sign-up';\n const code = generateOtpCode(\n isPhone ? config.phone.otpLength : config.email.otpLength,\n );\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(\n isPhone ? config.phone.expiresIn : config.email.expiresIn,\n );\n\n const [verification] = await tx\n .insert(verificationsInIam)\n .values({\n tenantId,\n userId,\n type,\n code: hashedCode,\n expiresAt,\n to,\n attempt: 0,\n })\n .returning();\n\n return { verificationId: verification.id, code, hash: hashedCode };\n};\n\nexport const sendVerification = async ({\n channel,\n to,\n code,\n config,\n hash,\n type,\n}: SendVerificationParams & { hash: string; type: string }) => {\n if (channel === 'phone' && config.phone.sendVerificationOTP) {\n await config.phone.sendVerificationOTP({\n phone: to,\n code,\n hash,\n type,\n });\n } else if (config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email: to,\n code,\n hash,\n type,\n });\n }\n};\n\ntype VerificationResendCheckParams = {\n database: Database;\n tenantId: string;\n userId: string;\n type: string;\n resendInterval?: string;\n};\n\ntype VerificationResendCheckResult = {\n blocked: boolean;\n verificationId?: string;\n};\n\nexport const checkVerificationResend = async ({\n database,\n tenantId,\n userId,\n type,\n resendInterval,\n}: VerificationResendCheckParams): Promise<VerificationResendCheckResult> => {\n if (!resendInterval) {\n return { blocked: false };\n }\n\n const [verification] = await database\n .select({\n id: verificationsInIam.id,\n createdAt: verificationsInIam.createdAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, type),\n ),\n )\n .orderBy(desc(verificationsInIam.createdAt))\n .limit(1);\n\n if (!verification) {\n return { blocked: false };\n }\n\n const cooldownSeconds = parseDuration(resendInterval);\n const createdAt = dayjs(verification.createdAt);\n const blocked = dayjs().diff(createdAt, 'second') < cooldownSeconds;\n return { blocked, verificationId: verification.id };\n};\n\nexport const handleEmailVerification = async ({\n c,\n user,\n config,\n database,\n tenantId,\n}: HandleVerificationParams) => {\n if (!user.email) {\n return c.json({ error: 'User email not found' }, 401);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, user.id),\n eq(verificationsInIam.type, 'email-verification'),\n ),\n );\n\n const code = generateOtpCode(config.email.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId,\n userId: user.id,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: user.email,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n\n if (config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email: user.email,\n code,\n hash: hashedCode,\n type: 'email-verification',\n });\n }\n\n return c.json(\n {\n user: normalizeUser(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: normalizeUser(user),\n session: null,\n verificationId: verification.id,\n requiresVerification: true,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, gt } from 'drizzle-orm';\nimport { getCookie } from 'hono/cookie';\nimport { sessionsInIam } from '../../../db/schema';\nimport { deleteSessionCookie, getSessionCookieName } from '../../../lib/cookie';\nimport { hashToken } from '../../../lib/crypto';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { signOutRoute } from '../auth.route';\n\nexport const signOutHandler: RouteHandler<\n typeof signOutRoute,\n AuthEnv\n> = async (c) => {\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n ensureTenantId(config, tenantId);\n\n const sessionToken = getCookie(c, getSessionCookieName(config));\n\n if (!sessionToken) {\n return c.json({ message: 'Signed out' }, 200);\n }\n\n const hashedToken = await hashToken(sessionToken, config.secret);\n const [session] = await database\n .select({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.token, hashedToken),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .limit(1);\n\n if (session) {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.id, session.id),\n eq(sessionsInIam.tenantId, session.tenantId),\n ),\n );\n }\n deleteSessionCookie(c, config);\n\n return c.json({ message: 'Signed out' }, 200);\n};\n","import type { ExtractTablesWithRelations } from 'drizzle-orm';\nimport type { PgQueryResultHKT, PgTransaction } from 'drizzle-orm/pg-core';\nimport type { Database } from './index';\nimport type * as relations from './relations';\nimport type * as schema from './schema';\n\nexport type TransactionClient = PgTransaction<\n PgQueryResultHKT,\n typeof schema & typeof relations,\n ExtractTablesWithRelations<typeof schema & typeof relations>\n>;\n\nexport function withTransaction<T>(\n database: Database,\n callback: (tx: TransactionClient) => Promise<T>,\n): Promise<T> {\n return database.transaction(async (tx) => callback(tx));\n}\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { withTransaction } from '../../../db/transaction';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { generateHandle } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\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 (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 };\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 error: 'Verification pending. Please verify or request a new code.',\n verificationId: result.verificationId,\n requiresVerification: true,\n },\n 409,\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: normalizeUser(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: normalizeUser(result.user),\n session: { id: result.sessionId, expiresAt: result.expiresAt },\n sessionExpiresAt: result.expiresAt,\n },\n 201,\n );\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\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 domainRoutes = new OpenAPIHono<AuthEnv>()\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 { 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 [domain] = await database\n .insert(domainsInIam)\n .values({\n tenantId: resolvedTenantId,\n domain: body.domain,\n status: body.status || 'pending',\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));\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;\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 { normalizeUser } from '../../../lib/normalize-user';\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: normalizeUser(result.user),\n session: {\n id: result.session.id,\n expiresAt: result.session.expiresAt,\n createdAt: result.session.createdAt,\n userAgent: result.session.userAgent,\n ip: result.session.ip,\n },\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 verifyPasswordSchema,\n} from '../auth.schema';\nimport { changePasswordHandler } from './handler/change';\nimport { forgotPasswordHandler } from './handler/forgot';\nimport { resetPasswordHandler } from './handler/reset';\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\nconst passwordRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(forgotPasswordRoute, forgotPasswordHandler)\n .openapi(resetPasswordRoute, resetPasswordHandler)\n .openapi(verifyPasswordRoute, verifyPasswordHandler)\n .openapi(changePasswordRoute, changePasswordHandler);\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 userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\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 userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\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 { normalizeUser } from '../../../lib/normalize-user';\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: normalizeUser(user),\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\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 } 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 type { AuthEnv } from '../../types/context';\nimport { getPermissionHandler } from './handler/get-permission';\nimport { listPermissionsHandler } from './handler/list-permissions';\nimport {\n errorResponseSchema,\n listPermissionsQuerySchema,\n listPermissionsResponseSchema,\n permissionIdParamSchema,\n permissionResponseSchema,\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\nconst permissionRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(listPermissionsRoute, listPermissionsHandler)\n .openapi(getPermissionRoute, getPermissionHandler);\n\nexport default permissionRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\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\n const [permission] = await database\n .select()\n .from(permissionsInIam)\n .where(eq(permissionsInIam.id, id))\n .limit(1);\n\n if (!permission) {\n return c.json({ error: 'Permission not found' }, 404);\n }\n\n return c.json({ permission }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, ilike, sql } from 'drizzle-orm';\nimport { permissionsInIam } from '../../../db/schema';\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\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.application) {\n conditions.push(\n ilike(permissionsInIam.application, `%${query.application}%`),\n );\n }\n if (query.feature) {\n conditions.push(ilike(permissionsInIam.feature, `%${query.feature}%`));\n }\n\n const [permissions, totalResult] = await Promise.all([\n database\n .select()\n .from(permissionsInIam)\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(permissionsInIam)\n .where(conditions.length > 0 ? and(...conditions) : undefined),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ permissions, total, page, limit }, 200);\n};\n","import { z } from 'zod';\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 application: z.string().optional(),\n feature: z.string().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 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 { normalizeUser } from '../../../lib/normalize-user';\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: normalizeUser(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: normalizeUser(result.user),\n session: {\n id: result.session.id,\n expiresAt: result.session.expiresAt,\n createdAt: result.session.createdAt,\n userAgent: result.session.userAgent,\n ip: result.session.ip,\n },\n sessionExpiresAt: result.session.expiresAt,\n },\n 200,\n );\n};\n","import { withTransaction } from '../../../db/transaction';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { normalizeUser } from '../../../lib/normalize-user';\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: normalizeUser(user),\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\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 { 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 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 userAgent: z.string().nullable(),\n ip: z.string().nullable(),\n })\n .nullable(),\n }),\n },\n },\n description: 'Current 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 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 { 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\n return c.json(\n {\n user: user ? normalizeUser(user) : null,\n session: session\n ? {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n }\n : null,\n },\n 200,\n );\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 { 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 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 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 rolePermissionRoutes = new OpenAPIHono<AuthEnv>()\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 type { AuthEnv } from '../../types/context';\nimport { createRoleHandler } from './handler/create-role';\nimport { deleteRoleHandler } from './handler/delete-role';\nimport { getRoleHandler } from './handler/get-role';\nimport { listRolesHandler } from './handler/list-roles';\nimport { updateRoleHandler } from './handler/update-role';\nimport {\n createRoleSchema,\n deleteRoleResponseSchema,\n errorResponseSchema,\n listRolesQuerySchema,\n listRolesResponseSchema,\n roleIdParamSchema,\n roleResponseSchema,\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 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 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 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nconst roleRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(listRolesRoute, listRolesHandler)\n .openapi(getRoleRoute, getRoleHandler)\n .openapi(createRoleRoute, createRoleHandler)\n .openapi(updateRoleRoute, updateRoleHandler)\n .openapi(deleteRoleRoute, deleteRoleHandler);\n\nexport default roleRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { rolesInIam } from '../../../db/schema';\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\n const [role] = await database\n .insert(rolesInIam)\n .values({\n tenantId: resolvedTenantId,\n name: body.name,\n description: body.description,\n code: body.code,\n })\n .returning();\n\n return c.json({ role }, 201);\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 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 } from 'drizzle-orm';\nimport { rolesInIam } 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 .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({ role }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { rolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listRolesRoute } from '../roles.route';\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\n const [roles, totalResult] = await Promise.all([\n database\n .select()\n .from(rolesInIam)\n .where(and(...conditions))\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, sql } from 'drizzle-orm';\nimport { rolesInIam } from '../../../db/schema';\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 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 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\n const [updated] = await database\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 (!updated) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n return c.json({ role: updated }, 200);\n};\n","import { z } from 'zod';\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});\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(),\n description: z.unknown(),\n code: z.string(),\n});\n\nexport const updateRoleSchema = z.object({\n name: z.unknown().optional(),\n description: z.unknown().optional(),\n code: z.string().optional(),\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});\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 deleteRoleResponseSchema = 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 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 sessionRoutes = new OpenAPIHono<AuthEnv>()\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 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 tenantRoutes = new OpenAPIHono<AuthEnv>()\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, eq, sql } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listTenantsRoute } from '../tenants.route';\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\n const [tenants, totalResult] = await Promise.all([\n database\n .select()\n .from(tenantsInIam)\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(tenantsInIam)\n .where(conditions.length > 0 ? and(...conditions) : undefined),\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\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});\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 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 userRoleRoutes = new OpenAPIHono<AuthEnv>()\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 type { AuthEnv } from '../../types/context';\nimport { banUserHandler } from './handler/ban-user';\nimport { createUserHandler } from './handler/create-user';\nimport { deleteUserHandler } from './handler/delete-user';\nimport { getUserHandler } from './handler/get-user';\nimport { listUsersHandler } from './handler/list-users';\nimport { searchUsersHandler } from './handler/search-users';\nimport { updateUserHandler } from './handler/update-user';\nimport {\n banUserSchema,\n createUserSchema,\n deleteUserResponseSchema,\n errorResponseSchema,\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\nconst userRoutes = new OpenAPIHono<AuthEnv>()\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\nexport default userRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { User } from '../../../types';\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 const [updated] = 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 .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 return c.json({ user: normalizeUser(updated as User) }, 200);\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport type {\n CheckHandleExistsParams,\n CheckUserExistsParams,\n} from '../users.types';\n\nexport const checkUserExists = async ({\n database,\n identifier,\n tenantId,\n isEmail,\n}: CheckUserExistsParams) => {\n const whereClause = isEmail\n ? and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n )\n : and(eq(usersInIam.tenantId, tenantId), eq(usersInIam.phone, identifier));\n\n const [user] = await database\n .select()\n .from(usersInIam)\n .where(whereClause)\n .limit(1);\n\n return user || null;\n};\n\nexport const checkHandleExists = async ({\n database,\n handle,\n tenantId,\n}: CheckHandleExistsParams) => {\n const [existingHandle] = await database\n .select()\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.handle}) = lower(${handle})`,\n ),\n )\n .limit(1);\n\n return existingHandle || null;\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { usersInIam } from '../../../db/schema';\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 database\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 })\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 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 { and, eq, ilike, sql } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listUsersRoute } from '../users.route';\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\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [eq(usersInIam.tenantId, tenantId)];\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\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(usersInIam)\n .where(and(...conditions))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(usersInIam)\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json(\n {\n users: users.map((u) => ({\n ...u,\n userRoles: null,\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, sql } from 'drizzle-orm';\nimport { 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 return c.json({ user: normalizeUser(updated as User) }, 200);\n};\n","import { z } from 'zod';\nimport { userSchema } from '../auth.schema';\n\n// Query schemas\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 email: z.string().optional(),\n phone: z.string().optional(),\n handle: z.string().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 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});\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\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 ],\n 'x-tagGroups': [\n {\n name: 'Authentication',\n tags: ['Auth', 'Profile', 'Password', 'Email', 'Phone'],\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 return await next();\n }\n const sessionData = await authInstance.getSession(c);\n\n const { session, user } = sessionData;\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\nconst TENANT_TEST_PATH = '/api/health/tenant-test';\nconst AUTH_DOCS_PATHS = [\n '/api/auth/docs',\n '/api/auth/openapi.json',\n '/api/docs',\n '/api/openapi.json',\n];\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 pathname = new URL(c.req.url).pathname;\n const isTenantTest = pathname === TENANT_TEST_PATH;\n const isAuthDocs = AUTH_DOCS_PATHS.includes(pathname);\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 if (isTenantTest || isAuthDocs) {\n return await next();\n }\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 if (!isTenantTest) {\n throw new HTTPException(500, { message: 'Tenant resolution failed' });\n }\n }\n\n c.set('tenantId', tenantId);\n c.set('tenant', tenant);\n\n const error = validateTenant(tenantId, tenant);\n if (error && !isTenantTest && !isAuthDocs) {\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 GetSessionResult = {\n session: Session | null;\n user: User | null;\n sessionToken: string | null;\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 { session: null, user: null, sessionToken: null };\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 { session: null, user: null, sessionToken: null };\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 { session: null, user: null, sessionToken: null };\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 };\n }\n\n return { session, user, sessionToken };\n } catch {\n return { session: null, user: null, sessionToken: null };\n }\n };\n};\n","import { logger } from '@mesob/common';\nimport type { Database } from '../db';\n\nexport type { Database } from '../db';\n\nexport type UserRole = {\n id: string;\n roleId: string;\n code: string;\n name: unknown; // jsonb\n description: unknown; // jsonb\n};\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 userRoles?: UserRole[];\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 updatedAt?: string;\n userAgent: string | null;\n ip: string | null;\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 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};\n\nexport type EmailConfig = VerificationConfig;\nexport type PhoneConfig = 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 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 secret: string;\n basePath?: string;\n tenant?: TenantConfig;\n docs?: DocsConfig;\n cookie?: CookieConfig;\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\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 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: defaultConfig,\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","sql","sql","and","eq","OpenAPIHono","and","eq","sql","sql","and","eq","and","eq","and","eq","gt","sql","sql","and","eq","gt","and","eq","gt","sql","and","eq","sql","gt","dayjs","and","eq","and","eq","dayjs","and","eq","and","eq","gt","and","eq","gt","createRoute","OpenAPIHono","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","createRoute","OpenAPIHono","createRoute","OpenAPIHono","eq","eq","and","sql","and","sql","z","errorResponseSchema","createRoute","errorResponseSchema","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","OpenAPIHono","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","and","eq","and","eq","sql","eq","and","sql","and","eq","sql","and","eq","sql","z","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","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","OpenAPIHono","createRoute","OpenAPIHono","eq","eq","eq","eq","eq","eq","and","eq","sql","eq","and","sql","eq","sql","eq","sql","z","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","createRoute","OpenAPIHono","and","eq","eq","and","and","eq","and","eq","z","userRoleSchema","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","createRoute","OpenAPIHono","and","eq","sql","and","eq","sql","and","eq","sql","and","eq","sql","and","eq","and","eq","and","eq","ilike","sql","eq","ilike","and","sql","and","eq","ilike","eq","ilike","and","and","eq","sql","and","eq","sql","z","z","userIdParamSchema","errorResponseSchema","createRoute","userIdParamSchema","errorResponseSchema","OpenAPIHono","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","sql","eq","sql","and","z","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","OpenAPIHono","getCookie","OpenAPIHono","createMiddleware","HTTPException","createMiddleware","HTTPException","getCookie","getCookie","logger","routes"]}