@mesob/auth-hono 0.1.1 → 0.2.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, 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"]}
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/lib/error-handler.ts","../src/routes/index.ts","../src/routes/auth/auth.route.ts","../src/routes/auth.schema.ts","../src/routes/auth/handler/check-account.ts","../src/lib/tenant.ts","../src/routes/auth/handler/sign-in.ts","../src/errors.ts","../src/lib/normalize-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/lib/phone-validation.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/system/system.route.ts","../src/routes/system/handler/tenant.ts","../src/routes/tenants/tenants.route.ts","../src/routes/tenants/handler/create-tenant.ts","../src/routes/tenants/handler/delete-tenant.ts","../src/routes/tenants/handler/get-tenant.ts","../src/routes/tenants/handler/list-tenants.ts","../src/routes/tenants/handler/update-tenant.ts","../src/routes/tenants/tenants.schema.ts","../src/routes/user-roles/user-roles.route.ts","../src/routes/user-roles/handler/assign-user-role.ts","../src/routes/user-roles/handler/list-user-roles.ts","../src/routes/user-roles/handler/revoke-user-role.ts","../src/routes/user-roles/user-roles.schema.ts","../src/routes/users/users.route.ts","../src/routes/users/handler/ban-user.ts","../src/routes/users/helper/user.ts","../src/routes/users/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 { SessionStatus } from './session';\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 // Simple wrapper - no basePath stripping needed since it's handled by the mounting app\n const routes = routesApp;\n\n return {\n routes: routes as typeof routesApp,\n getSession,\n tenantMiddleware,\n sessionMiddleware,\n };\n};\n","import { drizzle } from 'drizzle-orm/node-postgres';\nimport { Pool } from 'pg';\nimport * as relations from './relations';\nimport * as schema from './schema';\n\nconst schemaConfig = { schema: { ...schema, ...relations } };\n\nexport const createDatabase = (connectionString: string) => {\n const pool = new Pool({ connectionString });\n return drizzle({ client: pool, ...schemaConfig });\n};\n\nexport type Database = ReturnType<typeof createDatabase>;\n","import { relations } from \"drizzle-orm/relations\";\nimport { tenantsInIam, 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 { handleError } from './lib/error-handler';\nimport routes from './routes';\nimport type { AuthConfig, CreateAuthRoutesOptions, Database } from './types';\nimport type { AuthContext, AuthEnv } from './types/context';\nimport { setAuthContext } from './utility/set-auth-context';\n\nconst loadSession = async ({\n c,\n sessionToken,\n database,\n config,\n}: {\n c: AuthContext;\n sessionToken: string;\n database: Database;\n config: AuthConfig;\n}): Promise<void> => {\n try {\n const hashedToken = await hashToken(sessionToken, config.secret);\n const session = await fetchSessionByToken({\n database,\n hashedToken,\n tenantId: config.tenant?.tenantId || 'tenant',\n });\n if (!session) {\n return;\n }\n const user = await fetchUserWithRoles({\n database,\n userId: session.userId,\n tenantId: session.tenantId,\n });\n if (user) {\n setAuthContext({\n c,\n config,\n database,\n user,\n session,\n });\n }\n } catch {\n // Invalid session, continue without user\n }\n};\n\nconst createAuthMiddleware = ({\n config,\n database,\n}: {\n config: AuthConfig;\n database: Database;\n}) => {\n return async (c: AuthContext, next: () => Promise<void>) => {\n const path = c.req.path;\n const isDocsEndpoint = path === '/docs' || path === '/openapi.json';\n\n if (isDocsEndpoint) {\n setAuthContext({ c, config, database });\n return await next();\n }\n\n setAuthContext({ c, config, database });\n\n const sessionToken = getCookie(c, getSessionCookieName(config));\n if (sessionToken) {\n await loadSession({\n c,\n sessionToken,\n database,\n config,\n });\n }\n\n await next();\n };\n};\n\nexport const createAuthRoutes = ({\n config,\n database,\n}: CreateAuthRoutesOptions) => {\n const app = new OpenAPIHono<AuthEnv>();\n\n app.onError((error, c) => {\n return handleError(error, c);\n });\n\n app.use(\n '*',\n createAuthMiddleware({\n config,\n database,\n }),\n );\n\n app.route('/', routes);\n return app;\n};\n","import { and, eq, gt } from 'drizzle-orm';\nimport type { Session, SessionMeta } from '../../types';\nimport { sessionsInIam } from '../schema';\nimport type {\n DeleteSessionByTokenParams,\n DeleteSessionParams,\n DeleteUserSessionsParams,\n FetchSessionByTokenParams,\n UpdateSessionExpiryParams,\n} from './types';\n\nexport const fetchSessionByToken = async ({\n database,\n hashedToken,\n tenantId,\n}: FetchSessionByTokenParams): Promise<Session | null> => {\n const [sessionResult] = await database\n .select({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n 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 { logger } from '@mesob/common';\nimport type { Context } from 'hono';\nimport { HTTPException } from 'hono/http-exception';\n\ntype DatabaseError = {\n code?: string;\n message?: string;\n detail?: string;\n query?: string;\n parameters?: unknown[];\n};\n\nconst isDatabaseError = (error: unknown): error is DatabaseError => {\n if (typeof error !== 'object' || error === null) {\n return false;\n }\n\n if ('code' in error || 'query' in error || 'detail' in error) {\n return true;\n }\n\n if (error instanceof Error) {\n const message = error.message.toLowerCase();\n return (\n message.includes('failed query') ||\n message.includes('relation') ||\n message.includes('column') ||\n message.includes('syntax error') ||\n message.includes('duplicate key') ||\n message.includes('foreign key') ||\n message.includes('null value')\n );\n }\n\n return false;\n};\n\nconst sanitizeDatabaseError = (error: DatabaseError): string => {\n const code = error.code;\n\n if (code === '23505') {\n return 'Resource already exists';\n }\n\n if (code === '23503') {\n return 'Referenced resource not found';\n }\n\n if (code === '23502') {\n return 'Required field is missing';\n }\n\n if (code === '42P01') {\n return 'Resource not found';\n }\n\n if (code === '42703') {\n return 'Invalid request';\n }\n\n if (code === '23514') {\n return 'Validation failed';\n }\n\n return 'An error occurred while processing your request';\n};\n\nconst isDatabaseErrorMessage = (message: string): boolean => {\n const lowerMessage = message.toLowerCase();\n return (\n lowerMessage.includes('failed query') ||\n lowerMessage.includes('select') ||\n lowerMessage.includes('insert') ||\n lowerMessage.includes('update') ||\n lowerMessage.includes('delete') ||\n lowerMessage.includes('from') ||\n lowerMessage.includes('where') ||\n lowerMessage.includes('limit') ||\n lowerMessage.includes('params:') ||\n lowerMessage.includes('query') ||\n message.includes('\"iam\".') ||\n message.includes('\"tenants\"') ||\n message.includes('\"users\"') ||\n message.includes('\"sessions\"') ||\n message.includes('\"accounts\"') ||\n lowerMessage.includes('relation') ||\n lowerMessage.includes('column') ||\n lowerMessage.includes('syntax error') ||\n lowerMessage.includes('database') ||\n lowerMessage.includes('postgres') ||\n lowerMessage.includes('sql')\n );\n};\n\nexport const handleError = (error: unknown, c: Context): Response => {\n logger.error('API Error:', {\n error,\n path: c.req.path,\n method: c.req.method,\n url: c.req.url,\n });\n\n if (error instanceof HTTPException) {\n const message = isDatabaseErrorMessage(error.message)\n ? 'An error occurred while processing your request'\n : error.message;\n return c.json({ error: message }, error.status);\n }\n\n if (isDatabaseError(error)) {\n const userMessage = sanitizeDatabaseError(error);\n logger.error('Database error details:', {\n code: error.code,\n message: error.message,\n detail: error.detail,\n query: error.query,\n parameters: error.parameters,\n });\n return c.json({ error: userMessage }, 500);\n }\n\n if (error instanceof Error) {\n const message = error.message;\n const lowerMessage = message.toLowerCase();\n\n // Check for any database/SQL related content\n const isDatabaseError =\n lowerMessage.includes('failed query') ||\n lowerMessage.includes('select') ||\n lowerMessage.includes('insert') ||\n lowerMessage.includes('update') ||\n lowerMessage.includes('delete') ||\n lowerMessage.includes('from') ||\n lowerMessage.includes('where') ||\n lowerMessage.includes('limit') ||\n lowerMessage.includes('params:') ||\n lowerMessage.includes('query') ||\n message.includes('\"iam\".') ||\n message.includes('\"tenants\"') ||\n message.includes('\"users\"') ||\n message.includes('\"sessions\"') ||\n message.includes('\"accounts\"') ||\n lowerMessage.includes('relation') ||\n lowerMessage.includes('column') ||\n lowerMessage.includes('syntax error') ||\n lowerMessage.includes('duplicate key') ||\n lowerMessage.includes('foreign key') ||\n lowerMessage.includes('null value') ||\n lowerMessage.includes('database') ||\n lowerMessage.includes('postgres') ||\n lowerMessage.includes('sql');\n\n if (isDatabaseError) {\n logger.error('SQL/database error detected:', {\n message: error.message,\n stack: error.stack,\n name: error.name,\n });\n return c.json(\n { error: 'An error occurred while processing your request' },\n 500,\n );\n }\n\n logger.error('Error details:', {\n message: error.message,\n stack: error.stack,\n name: error.name,\n });\n return c.json(\n { error: 'An error occurred while processing your request' },\n 500,\n );\n }\n\n logger.error('Unknown error:', error);\n return c.json(\n { error: 'An error occurred while processing your request' },\n 500,\n );\n};\n","import { OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../types/context';\nimport authRoutes from './auth/auth.route';\nimport domainRoutes from './domains/domains.route';\nimport emailRoutes from './email/email.route';\nimport passwordRoutes from './password/password.route';\nimport permissionRoutes from './permissions/permissions.route';\nimport phoneRoutes from './phone/phone.route';\nimport profileRoutes from './profile/profile.route';\nimport rolePermissionRoutes from './role-permissions/role-permissions.route';\nimport roleRoutes from './roles/roles.route';\nimport sessionRoutes from './sessions/sessions.route';\nimport tenantRoutes from './system/system.route';\nimport tenantsRoutes from './tenants/tenants.route';\nimport userRoleRoutes from './user-roles/user-roles.route';\nimport userRoutes from './users/users.route';\nimport verificationRoutes from './verifications/verifications.route';\n\nconst routes = new OpenAPIHono<AuthEnv>()\n .route('/', authRoutes)\n .route('/', profileRoutes)\n .route('/password', passwordRoutes)\n .route('/email', emailRoutes)\n .route('/phone', phoneRoutes)\n .route('/users', userRoutes)\n .route('/system', tenantRoutes)\n .route('/tenants', tenantsRoutes)\n .route('/domains', domainRoutes)\n .route('/roles', roleRoutes)\n .route('/permissions', permissionRoutes)\n .route('/role-permissions', rolePermissionRoutes)\n .route('/user-roles', userRoleRoutes)\n .route('/sessions', sessionRoutes)\n .route('/verifications', verificationRoutes);\n\nexport default routes;\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport {\n checkAccountResponseSchema,\n checkAccountSchema,\n errorResponseSchema,\n messageSchema,\n signInResponseSchema,\n signInSchema,\n signUpResponseSchema,\n signUpSchema,\n} from '../auth.schema';\nimport { checkAccountHandler } from './handler/check-account';\nimport { signInHandler } from './handler/sign-in';\nimport { signOutHandler } from './handler/sign-out';\nimport { signUpHandler } from './handler/sign-up';\n\nexport const signUpRoute = createRoute({\n method: 'post',\n path: '/sign-up',\n tags: ['Auth'],\n summary: 'Sign up with email or phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: signUpSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: signUpResponseSchema,\n },\n },\n description: 'Account created',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid request',\n },\n 403: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Authentication method disabled',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User already exists',\n },\n },\n});\n\nexport const signInRoute = createRoute({\n method: 'post',\n path: '/sign-in',\n tags: ['Auth'],\n summary: 'Sign in with email or phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: signInSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: signInResponseSchema,\n },\n },\n description: 'Signed in',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid credentials',\n },\n },\n});\n\nexport const checkAccountRoute = createRoute({\n method: 'post',\n path: '/check-account',\n tags: ['Auth'],\n summary: 'Check if account exists',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: checkAccountSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: checkAccountResponseSchema,\n },\n },\n description: 'Account check result',\n },\n },\n});\n\nexport const signOutRoute = createRoute({\n method: 'post',\n path: '/sign-out',\n tags: ['Auth'],\n summary: 'Sign out current session',\n responses: {\n 200: {\n content: { 'application/json': { schema: messageSchema } },\n description: 'Signed out',\n },\n },\n});\n\nconst authRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(signUpRoute, signUpHandler)\n .openapi(signInRoute, signInHandler)\n .openapi(checkAccountRoute, checkAccountHandler)\n .openapi(signOutRoute, signOutHandler);\n\nexport default authRoutes;\n","import { z } from 'zod';\n\nconst emailField = z\n .string()\n .trim()\n .email('Invalid email address')\n .max(255, 'Email too long');\n\nconst phoneField = z\n .string()\n .trim()\n .min(6, 'Phone too short')\n .max(30, 'Phone too long')\n .regex(/^[+()\\d\\s-]+$/, 'Invalid phone number format');\n\nconst passwordField = z\n .string()\n .min(8, 'Password must be at least 8 characters')\n .max(128, 'Password too long');\n\nconst 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 checkAccountSchema = z.object({\n username: z.string(),\n});\n\nexport const checkAccountResponseSchema = z.object({\n exists: z.boolean(),\n verified: 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 { usersInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { checkAccountRoute } from '../auth.route';\n\nexport const checkAccountHandler: RouteHandler<\n typeof checkAccountRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { username } = body;\n\n const isEmail = username.includes('@');\n const whereClause = isEmail\n ? and(\n eq(usersInIam.tenantId, resolvedTenantId),\n sql`lower(${usersInIam.email}) = lower(${username})`,\n )\n : and(\n eq(usersInIam.tenantId, resolvedTenantId),\n eq(usersInIam.phone, username),\n );\n\n const [result] = await database\n .select({\n verified: isEmail ? usersInIam.emailVerified : usersInIam.phoneVerified,\n })\n .from(usersInIam)\n .where(whereClause)\n .limit(1);\n\n return c.json(\n {\n exists: !!result,\n verified: result?.verified ?? false,\n },\n 200,\n );\n};\n","import { HTTPException } from 'hono/http-exception';\nimport type { AuthConfig } from '../types';\n\nexport const ensureTenantId = (\n config: AuthConfig,\n tenantId: string | undefined,\n): string => {\n const enableTenant = config.tenant?.enabled ?? true;\n if (enableTenant) {\n if (!tenantId) {\n throw new HTTPException(400, {\n message: 'Missing tenantId. Tenant isolation is enabled.',\n });\n }\n return tenantId;\n }\n\n // When tenant is disabled, use tenantId from config\n if (!config.tenant?.tenantId) {\n throw new HTTPException(500, {\n message:\n 'tenantId must be provided in config.tenant when tenant.enabled is false.',\n });\n }\n return config.tenant.tenantId;\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { 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 { AuthConfig } from '../types';\n\nexport const createPhoneField = (config: AuthConfig) => {\n const phoneRegex =\n config.phone.phoneRegex || /^(\\+2519|\\+2517|2519|2517|09|07)\\d{8}$/;\n const regex =\n typeof phoneRegex === 'string' ? new RegExp(phoneRegex) : phoneRegex;\n\n return {\n validate: (phone: string): boolean => {\n return regex.test(phone.trim());\n },\n regex,\n };\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { withTransaction } from '../../../db/transaction';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { createPhoneField } from '../../../lib/phone-validation';\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 (phone) {\n const phoneValidator = createPhoneField(config);\n if (!phoneValidator.validate(phone)) {\n return c.json({ error: 'Invalid phone number format' }, 400);\n }\n }\n\n if (isEmail && !config.email.enabled) {\n return c.json({ error: 'Email authentication is disabled' }, 403);\n }\n\n if (!(isEmail || config.phone.enabled)) {\n return c.json({ error: 'Phone authentication is disabled' }, 403);\n }\n const userAgent = c.req.header('user-agent') || null;\n const ip =\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || null;\n\n let result: SignUpResult;\n\n try {\n result = await withTransaction(database, async (tx) => {\n const status = await checkExistingUserStatus({\n tx,\n identifier,\n tenantId: resolvedTenantId,\n isEmail,\n });\n\n if (status.action === 'error') {\n throw new SignUpError(status.code, 409);\n }\n\n if (status.action === 'pending') {\n return {\n type: 'pending' as const,\n verificationId: status.verificationId,\n };\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 { createPhoneField } from '../../../lib/phone-validation';\nimport { addDuration, generateOtpCode } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { checkVerificationResend } from '../../auth/helper/verification';\nimport type { phoneVerificationRequestRoute } from '../phone.route';\n\nexport const phoneVerificationRequestHandler: RouteHandler<\n typeof phoneVerificationRequestRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const user = c.get('user');\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n if (!config.phone.enabled) {\n return c.json({ error: 'Phone authentication is disabled' }, 400);\n }\n\n const { phone, context } = body;\n\n if (!phone) {\n return c.json({ error: 'Phone required' }, 400);\n }\n\n const phoneValidator = createPhoneField(config);\n if (!phoneValidator.validate(phone)) {\n return c.json({ error: 'Invalid phone number format' }, 400);\n }\n\n const genericResponse = {\n message: 'If the account exists, a verification code was sent.',\n };\n\n let userId = user?.id;\n if (!userId) {\n const [result] = await database\n .select({ id: usersInIam.id })\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, resolvedTenantId),\n eq(usersInIam.phone, phone),\n ),\n )\n .limit(1);\n\n if (!result) {\n return c.json(genericResponse, 200);\n }\n\n userId = result.id;\n }\n\n const verificationType = `phone-otp-${context}`;\n const resendCheck = await checkVerificationResend({\n database,\n tenantId: resolvedTenantId,\n userId,\n type: verificationType,\n resendInterval: config.phone.resendInterval,\n });\n\n if (resendCheck.blocked) {\n return c.json(\n {\n message: 'Verification recently sent',\n verificationId: resendCheck.verificationId,\n },\n 200,\n );\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, verificationType),\n ),\n );\n\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId: resolvedTenantId,\n userId,\n type: verificationType,\n code: hashedCode,\n expiresAt,\n to: phone,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n\n if (context === 'change-phone' && user?.id) {\n await database\n .update(accountChangesInIam)\n .set({\n status: 'cancelled',\n cancelledAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n reason: 'replaced',\n })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, user.id),\n eq(accountChangesInIam.changeType, 'phone'),\n eq(accountChangesInIam.status, 'pending'),\n ),\n );\n\n await database.insert(accountChangesInIam).values({\n tenantId: resolvedTenantId,\n userId: user.id,\n changeType: 'phone',\n oldPhone: user.phone ?? '',\n newPhone: phone,\n oldEmail: null,\n newEmail: null,\n status: 'pending',\n expiresAt: verification.expiresAt,\n updatedAt: new Date().toISOString(),\n });\n }\n\n if (config.phone.sendVerificationOTP) {\n await config.phone.sendVerificationOTP({\n phone,\n code,\n hash: hashedCode,\n type: verificationType,\n });\n }\n\n return c.json(\n {\n message: 'Verification code sent',\n verificationId: verification.id,\n },\n 200,\n );\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { z } from 'zod';\nimport type { AuthEnv } from '../../types/context';\nimport {\n errorResponseSchema,\n pendingAccountChangeResponseSchema,\n profileResponseSchema,\n updateEmailSchema,\n updatePhoneSchema,\n updateProfileSchema,\n userSchema,\n} from '../auth.schema';\nimport { accountChangePendingHandler } from './handler/account-change-pending';\nimport { meHandler } from './handler/me';\nimport { sessionHandler } from './handler/session';\nimport { updateProfileHandler } from './handler/update';\nimport { updateEmailHandler } from './handler/update-email';\nimport { updatePhoneHandler } from './handler/update-phone';\n\nexport const meRoute = createRoute({\n method: 'get',\n path: '/me',\n tags: ['Profile'],\n summary: 'Get current user',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: z.object({ user: userSchema }),\n },\n },\n description: 'Current user',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n },\n});\n\nexport const sessionRoute = createRoute({\n method: 'get',\n path: '/session',\n tags: ['Profile'],\n summary: 'Get current session',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: z.object({\n user: userSchema.nullable(),\n session: z\n .object({\n id: z.string().uuid(),\n expiresAt: z.string().datetime(),\n createdAt: z.string().datetime(),\n userAgent: z.string().nullable(),\n ip: z.string().nullable(),\n })\n .nullable(),\n }),\n },\n },\n description: 'Session info (null if no cookie sent)',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid session (cookie sent but invalid/expired)',\n },\n 500: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Server error checking session',\n },\n },\n});\n\nexport const updateProfileRoute = createRoute({\n method: 'put',\n path: '/profile',\n tags: ['Profile'],\n summary: 'Update user profile',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updateProfileSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Profile updated',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const updateEmailRoute = createRoute({\n method: 'put',\n path: '/profile/email',\n tags: ['Profile'],\n summary: 'Update user email',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updateEmailSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Email updated',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const updatePhoneRoute = createRoute({\n method: 'put',\n path: '/profile/phone',\n tags: ['Profile'],\n summary: 'Update user phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updatePhoneSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Phone updated',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid request',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const accountChangePendingRoute = createRoute({\n method: 'get',\n path: '/account-change/pending',\n tags: ['Profile'],\n summary: 'Get pending account change (email/phone)',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: pendingAccountChangeResponseSchema,\n },\n },\n description: 'Pending account change',\n },\n 401: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Unauthorized',\n },\n },\n});\n\nconst profileRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(meRoute, meHandler)\n .openapi(sessionRoute, sessionHandler)\n .openapi(updateProfileRoute, updateProfileHandler)\n .openapi(updateEmailRoute, updateEmailHandler)\n .openapi(updatePhoneRoute, updatePhoneHandler)\n .openapi(accountChangePendingRoute, accountChangePendingHandler);\n\nexport default profileRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, gt, sql } from 'drizzle-orm';\nimport { accountChangesInIam, verificationsInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { accountChangePendingRoute } from '../profile.route';\n\nexport const accountChangePendingHandler: RouteHandler<\n typeof accountChangePendingRoute,\n AuthEnv\n> = async (c) => {\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n await database\n .update(accountChangesInIam)\n .set({ status: 'expired' })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, userId),\n sql`${accountChangesInIam.expiresAt} < CURRENT_TIMESTAMP`,\n ),\n );\n\n const [accountChange] = await database\n .select()\n .from(accountChangesInIam)\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.status, 'pending'),\n ),\n )\n .limit(1);\n\n if (!accountChange) {\n return c.json({ accountChange: null, verificationId: null }, 200);\n }\n\n let verification: { id: string; expiresAt: string } | null = null;\n if (accountChange.changeType === 'email' && accountChange.newEmail) {\n const [v] = await database\n .select({\n id: verificationsInIam.id,\n expiresAt: verificationsInIam.expiresAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, 'email-verification'),\n eq(verificationsInIam.to, accountChange.newEmail),\n gt(verificationsInIam.expiresAt, sql`CURRENT_TIMESTAMP`),\n ),\n )\n .limit(1);\n verification = v || null;\n }\n if (accountChange.changeType === 'phone' && accountChange.newPhone) {\n const [v] = await database\n .select({\n id: verificationsInIam.id,\n expiresAt: verificationsInIam.expiresAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, 'phone-otp-change-phone'),\n eq(verificationsInIam.to, accountChange.newPhone),\n gt(verificationsInIam.expiresAt, sql`CURRENT_TIMESTAMP`),\n ),\n )\n .limit(1);\n verification = v || null;\n }\n\n if (!verification) {\n return c.json({ accountChange: null, verificationId: null }, 200);\n }\n\n return c.json(\n {\n accountChange: {\n changeType: accountChange.changeType as 'email' | 'phone',\n newEmail: accountChange.newEmail,\n newPhone: accountChange.newPhone,\n expiresAt: accountChange.expiresAt,\n },\n verificationId: verification.id,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { AuthEnv } from '../../../types/context';\nimport type { meRoute } from '../profile.route';\n\nexport const meHandler: RouteHandler<typeof meRoute, AuthEnv> = (c) => {\n const user = c.get('user');\n\n if (!user) {\n return c.json({ error: 'Unauthorized' }, 401);\n }\n\n return c.json({ user: normalizeUser(user) }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { AuthEnv } from '../../../types/context';\nimport type { sessionRoute } from '../profile.route';\n\nexport const sessionHandler: RouteHandler<typeof sessionRoute, AuthEnv> = (\n c,\n) => {\n const user = c.get('user');\n const session = c.get('session');\n const status = c.get('sessionStatus');\n\n // No cookie sent - return empty session (not an error, just no session)\n if (status === 'no_cookie') {\n return c.json({ user: null, session: null }, 200);\n }\n\n // Cookie sent but session invalid/expired - 401 (cookie was passed but invalid)\n if (status === 'invalid_session') {\n return c.json({ error: 'Invalid session', code: 'INVALID_SESSION' }, 401);\n }\n\n // User not found for session - 401\n if (status === 'user_not_found') {\n return c.json({ error: 'User not found', code: 'USER_NOT_FOUND' }, 401);\n }\n\n // Server error while checking session - 500\n if (status === 'error') {\n return c.json(\n { error: 'Session check error', code: 'SESSION_CHECK_ERROR' },\n 500,\n );\n }\n\n // Valid session\n if (user && session) {\n return c.json(\n {\n user: normalizeUser(user),\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\n },\n 200,\n );\n }\n\n // Fallback - no cookie case\n return c.json({ user: null, session: null }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateProfileRoute } from '../profile.route';\n\nexport const updateProfileHandler: RouteHandler<\n typeof updateProfileRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const updateData: Partial<typeof usersInIam.$inferInsert> = {};\n if (body.fullName !== undefined) {\n updateData.fullName = body.fullName;\n }\n\n const [updatedUser] = await database\n .update(usersInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(\n and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, resolvedTenantId)),\n )\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (!updatedUser) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n return c.json({ user: normalizeUser(updatedUser) }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, ne, sql } from 'drizzle-orm';\nimport {\n accountChangesInIam,\n accountsInIam,\n sessionsInIam,\n usersInIam,\n} from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateEmailRoute } from '../profile.route';\n\nexport const updateEmailHandler: RouteHandler<\n typeof updateEmailRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n const session = c.get('session');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n if (user.email && session?.id) {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, resolvedTenantId),\n eq(sessionsInIam.userId, userId),\n ne(sessionsInIam.id, session.id),\n ),\n );\n }\n\n const [updatedUser] = await database\n .update(usersInIam)\n .set({\n email: body.email,\n emailVerified: true,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(\n and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, resolvedTenantId)),\n )\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (!updatedUser) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n await database\n .update(accountChangesInIam)\n .set({ status: 'applied' })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.changeType, 'email'),\n eq(accountChangesInIam.newEmail, body.email),\n ),\n );\n\n await database\n .update(accountsInIam)\n .set({ providerAccountId: body.email })\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n\n return c.json({ user: normalizeUser(updatedUser) }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, ne, sql } from 'drizzle-orm';\nimport {\n accountChangesInIam,\n accountsInIam,\n sessionsInIam,\n usersInIam,\n} from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { createPhoneField } from '../../../lib/phone-validation';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updatePhoneRoute } from '../profile.route';\n\nexport const updatePhoneHandler: RouteHandler<\n typeof updatePhoneRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n const session = c.get('session');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const phoneValidator = createPhoneField(config);\n if (!phoneValidator.validate(body.phone)) {\n return c.json({ error: 'Invalid phone number format' }, 400);\n }\n\n if (user.phone && session?.id) {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, resolvedTenantId),\n eq(sessionsInIam.userId, userId),\n ne(sessionsInIam.id, session.id),\n ),\n );\n }\n\n const [updatedUser] = await database\n .update(usersInIam)\n .set({\n phone: body.phone,\n phoneVerified: true,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(\n and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, resolvedTenantId)),\n )\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (!updatedUser) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n await database\n .update(accountChangesInIam)\n .set({ status: 'applied' })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.changeType, 'phone'),\n eq(accountChangesInIam.newPhone, body.phone),\n ),\n );\n\n await database\n .update(accountsInIam)\n .set({ providerAccountId: body.phone })\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n\n return c.json({ user: normalizeUser(updatedUser) }, 200);\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport 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 { z } from 'zod';\nimport type { AuthEnv } from '../../types/context';\nimport { errorResponseSchema } from '../auth.schema';\nimport { tenantHandler } from './handler/tenant';\n\nexport const tenantRoute = createRoute({\n method: 'get',\n path: '/init',\n tags: ['System'],\n summary: 'Get tenant info',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: z.object({\n host: z.string().nullable(),\n tenantId: z.string().nullable(),\n tenant: z\n .object({\n id: z.string(),\n name: z.unknown(),\n description: z.unknown(),\n isActive: z.boolean(),\n })\n .nullable(),\n status: z.literal('ok'),\n }),\n },\n },\n description: 'Tenant info',\n },\n 500: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Server error',\n },\n },\n});\n\nconst tenantRoutes = new OpenAPIHono<AuthEnv>().openapi(\n tenantRoute,\n tenantHandler,\n);\n\nexport default tenantRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../../types/context';\nimport type { tenantRoute } from '../system.route';\n\nexport const tenantHandler: RouteHandler<typeof tenantRoute, AuthEnv> = (c) => {\n const tenantId = c.get('tenantId');\n const tenant = (c as any).get('tenant');\n const host = (c as any).get('host');\n\n return c.json(\n {\n host: host || null,\n tenantId: tenantId || null,\n tenant: tenant || null,\n status: 'ok' as const,\n },\n 200,\n );\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport 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 { name: 'System', description: 'System initialization' },\n ],\n 'x-tagGroups': [\n {\n name: 'Authentication',\n tags: ['Auth', 'Profile', 'Password', 'Email', 'Phone'],\n },\n {\n name: 'System',\n tags: ['System'],\n },\n {\n name: 'IAM Management',\n tags: [\n 'Users',\n 'Tenants',\n 'Domains',\n 'Roles',\n 'Permissions',\n 'Role Permissions',\n 'User Roles',\n 'Sessions',\n 'Verifications',\n ],\n },\n ],\n };\n};\n","import { createMiddleware } from 'hono/factory';\n\nexport const createSessionMiddleware = () => {\n return createMiddleware(async (c, next) => {\n const authInstance = c.get('auth');\n if (!authInstance) {\n c.set('user', null);\n c.set('session', null);\n c.set('userId', null);\n c.set('sessionStatus', 'error');\n return await next();\n }\n const sessionData = await authInstance.getSession(c);\n\n const { session, user, status } = sessionData;\n c.set('sessionStatus', status);\n\n if (!(session && user)) {\n c.set('user', null);\n c.set('session', null);\n c.set('userId', null);\n await next();\n return;\n }\n\n c.set('user', user);\n c.set('session', session);\n c.set('userId', user.id);\n await next();\n });\n};\n","import { logger } from '@mesob/common';\n\nimport { createMiddleware } from 'hono/factory';\nimport { HTTPException } from 'hono/http-exception';\nimport type { Database } from '../db';\nimport {\n findTenantByDomain,\n findTenantById,\n type Tenant,\n} from '../db/orm/tenant';\nimport type { AuthConfig } from '../types';\n\nfunction resolveHost(\n hostHeader: string | undefined,\n forwardedHost: string | undefined,\n): string | null {\n const hostHeaderStr = hostHeader || '';\n const forwardedHostStr = forwardedHost || '';\n\n if (forwardedHostStr) {\n return forwardedHostStr;\n }\n\n if (hostHeaderStr) {\n return hostHeaderStr;\n }\n\n return null;\n}\n\nasync function resolveTenantId(\n database: Database,\n config: AuthConfig,\n host: string,\n): Promise<string | null> {\n // Prioritize config.tenant.tenantId if set\n if (config.tenant?.tenantId) {\n return config.tenant.tenantId;\n }\n\n const normalizedHost = host.toLowerCase().split(':')[0];\n if (\n normalizedHost === 'localhost' ||\n normalizedHost === '127.0.0.1' ||\n normalizedHost.includes('internal')\n ) {\n return 'tenant';\n }\n if (config.tenant?.tenantDomains?.includes(normalizedHost)) {\n return normalizedHost;\n }\n if (normalizedHost.endsWith('.lvh.me')) {\n return normalizedHost.replace('.lvh.me', '');\n }\n return await findTenantByDomain(database, normalizedHost);\n}\n\nasync function resolveTenant(\n database: Database,\n config: AuthConfig,\n host: string,\n): Promise<{ tenantId: string | null; tenant: Tenant | null }> {\n try {\n const tenantId = await resolveTenantId(database, config, host);\n if (!tenantId) {\n return { tenantId: null, tenant: null };\n }\n const tenant = await findTenantById(database, tenantId);\n if (!tenant) {\n return { tenantId: null, tenant: null };\n }\n return { tenantId, tenant };\n } catch (err) {\n logger.error('Tenant resolution error:', err);\n throw err;\n }\n}\n\nfunction validateTenant(\n tenantId: string | null,\n tenant: Tenant | null,\n): string | null {\n if (!tenantId) {\n return 'Unknown workspace domain';\n }\n if (!tenant) {\n return 'Tenant not found';\n }\n if (!tenant.isActive) {\n return 'Tenant inactive';\n }\n return null;\n}\n\nexport const createTenantMiddleware = (\n database: Database,\n config: AuthConfig,\n) => {\n return createMiddleware(async (c, next) => {\n const host = resolveHost(\n c.req.header('host'),\n c.req.header('x-forwarded-host'),\n );\n\n c.set('host', host);\n\n if (!host) {\n throw new HTTPException(400, { message: 'Missing Host header' });\n }\n\n let tenantId: string | null = null;\n let tenant: Tenant | null = null;\n\n try {\n const result = await resolveTenant(database, config, host);\n tenantId = result.tenantId;\n tenant = result.tenant;\n } catch {\n throw new HTTPException(500, { message: 'Tenant resolution failed' });\n }\n\n c.set('tenantId', tenantId);\n c.set('tenant', tenant);\n\n const error = validateTenant(tenantId, tenant);\n if (error) {\n throw new HTTPException(404, { message: error });\n }\n\n return await next();\n });\n};\n","import type { Context } from 'hono';\nimport { getCookie } from 'hono/cookie';\nimport type { Database } from './db';\nimport {\n deleteSession,\n fetchSessionByToken,\n fetchUserWithRoles,\n updateSessionExpiry,\n} from './db/orm';\nimport {\n deleteSessionCookie,\n getSessionCookieName,\n setSessionCookie,\n} from './lib/cookie';\nimport { hashToken } from './lib/crypto';\nimport {\n getRefreshedExpiresAt,\n getSessionUpdateAge,\n shouldRefreshSession,\n} from './lib/session';\nimport type { AuthConfig, Session, User } from './types';\n\nexport type SessionStatus =\n | 'valid'\n | 'no_cookie'\n | 'invalid_session'\n | 'user_not_found'\n | 'error';\n\nexport type GetSessionResult = {\n session: Session | null;\n user: User | null;\n sessionToken: string | null;\n status: SessionStatus;\n};\n\nexport const createGetSession = (database: Database, config: AuthConfig) => {\n return async (c: Context): Promise<GetSessionResult> => {\n const sessionToken = getCookie(c, getSessionCookieName(config));\n if (!sessionToken) {\n return {\n session: null,\n user: null,\n sessionToken: null,\n status: 'no_cookie',\n };\n }\n\n try {\n const hashedToken = await hashToken(sessionToken, config.secret);\n const session = await fetchSessionByToken({\n database,\n hashedToken,\n tenantId: config.tenant?.tenantId || 'tenant',\n });\n\n if (!session) {\n // Session not found or expired, clear cookie\n deleteSessionCookie(c, config);\n return {\n session: null,\n user: null,\n sessionToken: null,\n status: 'invalid_session',\n };\n }\n\n const user = await fetchUserWithRoles({\n database,\n userId: session.userId,\n tenantId: session.tenantId,\n });\n\n if (!user) {\n await deleteSession({\n database,\n sessionId: session.id,\n tenantId: session.tenantId,\n });\n deleteSessionCookie(c, config);\n return {\n session: null,\n user: null,\n sessionToken: null,\n status: 'user_not_found',\n };\n }\n\n // Check if session needs refresh\n const rememberMe = session.meta?.rememberMe !== false;\n const updateAge = getSessionUpdateAge({\n sessionConfig: config.session,\n rememberMe,\n });\n\n if (shouldRefreshSession({ expiresAt: session.expiresAt, updateAge })) {\n const newExpiresAt = getRefreshedExpiresAt({\n sessionConfig: config.session,\n rememberMe,\n });\n\n // Update session expiry in database\n await updateSessionExpiry({\n database,\n sessionId: session.id,\n tenantId: session.tenantId,\n expiresAt: newExpiresAt,\n });\n\n // Update cookie with new expiry\n setSessionCookie(c, sessionToken, config, {\n expires: new Date(newExpiresAt),\n });\n\n // Return updated session\n return {\n session: { ...session, expiresAt: newExpiresAt },\n user,\n sessionToken,\n status: 'valid',\n };\n }\n\n return { session, user, sessionToken, status: 'valid' };\n } catch {\n return { session: null, user: null, sessionToken: null, status: 'error' };\n }\n };\n};\n","import { 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 PhoneConfig = VerificationConfig & {\n phoneRegex?: RegExp | string;\n};\n\nexport type EmailConfig = VerificationConfig;\n\nexport type SessionConfig = {\n /** Default session duration (e.g., '7d', '30d'). Default: '7d' */\n expiresIn: string;\n /** Session duration when \"remember me\" is checked (e.g., '30d'). Default: '30d' */\n rememberMeExpiresIn: string;\n /** Session duration when \"remember me\" is unchecked (e.g., '1h'). Default: '1h' */\n shortSessionExpiresIn: string;\n /** Refresh session if remaining time is less than this (e.g., '1d'). Default: '1d' */\n updateAge: string;\n /** Refresh short session if remaining time is less than this (e.g., '15m'). Default: '15m' */\n shortSessionUpdateAge: string;\n /** Maximum concurrent sessions per user */\n maxPerUser?: number;\n};\n\nexport type SecurityConfig = {\n maxLoginAttempts: number;\n lockoutDuration: string;\n};\n\nexport type TenantConfig = {\n enabled?: boolean;\n tenantId?: string;\n tenantDomains?: string[];\n};\n\nexport type DocsConfig = {\n enabled?: boolean;\n title?: string;\n version?: string;\n theme?:\n | 'default'\n | 'moon'\n | 'purple'\n | 'saturn'\n | 'bluePlanet'\n | 'kepler'\n | 'mars';\n servers?: Array<{ url: string; description?: string }>;\n};\n\nexport type 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\nconst defaultPhoneRegex = /^(\\+2519|\\+2517|2519|2517|09|07)\\d{8}$/;\n\ntype DefaultAuthConfig = {\n readonly tenant: {\n readonly enabled: true;\n readonly tenantId: 'tenant';\n };\n readonly docs: {\n readonly enabled: true;\n };\n readonly cookie: {\n readonly prefix: 'msb';\n };\n readonly session: {\n readonly expiresIn: '7d';\n readonly rememberMeExpiresIn: '30d';\n readonly shortSessionExpiresIn: '1h';\n readonly updateAge: '1d';\n readonly shortSessionUpdateAge: '15m';\n readonly maxPerUser: 5;\n };\n readonly email: typeof defaultConfig;\n readonly phone: typeof defaultConfig & {\n readonly phoneRegex: typeof defaultPhoneRegex;\n };\n readonly security: {\n readonly maxLoginAttempts: 5;\n readonly lockoutDuration: '15m';\n };\n};\n\nexport const defaultAuthConfig: DefaultAuthConfig = {\n tenant: {\n enabled: true,\n tenantId: 'tenant',\n },\n docs: {\n enabled: true,\n },\n cookie: {\n prefix: 'msb',\n },\n session: {\n expiresIn: '7d',\n rememberMeExpiresIn: '30d',\n shortSessionExpiresIn: '1h',\n updateAge: '1d',\n shortSessionUpdateAge: '15m',\n maxPerUser: 5,\n },\n email: defaultConfig,\n phone: {\n ...defaultConfig,\n phoneRegex: defaultPhoneRegex,\n },\n security: {\n maxLoginAttempts: 5,\n lockoutDuration: '15m',\n },\n} as const;\n","import { lt } from 'drizzle-orm';\nimport type { Database } from '../db';\nimport { sessionsInIam, verificationsInIam } from '../db/schema';\n\nexport const cleanupExpiredVerifications = async (database: Database) => {\n const now = new Date().toISOString();\n\n const result = await database\n .delete(verificationsInIam)\n .where(lt(verificationsInIam.expiresAt, now));\n\n return result;\n};\n\nexport const cleanupExpiredSessions = async (database: Database) => {\n const now = new Date().toISOString();\n\n const result = await database\n .delete(sessionsInIam)\n .where(lt(sessionsInIam.expiresAt, now));\n\n return result;\n};\n\nexport const cleanupExpiredData = async (database: Database) => {\n await Promise.all([\n cleanupExpiredVerifications(database),\n cleanupExpiredSessions(database),\n ]);\n};\n"],"mappings":"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","names":["OpenAPIHono","getCookie","and","eq","sql","and","sql","eq","and","eq","sql","sql","and","eq","isDatabaseError","OpenAPIHono","and","eq","sql","HTTPException","and","eq","sql","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","z","createRoute","z","OpenAPIHono","createRoute","OpenAPIHono","eq","eq","eq","eq","eq","eq","and","eq","sql","eq","and","sql","eq","sql","eq","sql","z","errorResponseSchema","createRoute","errorResponseSchema","tenantRoutes","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","logger","createMiddleware","HTTPException","logger","createMiddleware","HTTPException","getCookie","getCookie","logger","routes"]}