@mesob/auth-hono 0.0.8 → 0.1.0
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/README.md +172 -0
- package/dist/index-CScADcDn.d.ts +137 -0
- package/dist/index-ULpI-i0z.d.ts +2008 -0
- package/dist/index.d.ts +23 -15
- package/dist/index.js +5225 -1895
- package/dist/index.js.map +1 -1
- package/dist/lib/cleanup.d.ts +11 -0
- package/dist/lib/cleanup.js +296 -0
- package/dist/lib/cleanup.js.map +1 -0
- package/dist/lib/cookie.d.ts +18 -0
- package/dist/lib/cookie.js +40 -0
- package/dist/lib/cookie.js.map +1 -0
- package/dist/lib/crypto.js +5 -0
- package/dist/lib/crypto.js.map +1 -1
- package/dist/lib/docs.d.ts +11 -0
- package/dist/lib/docs.js +14 -0
- package/dist/lib/docs.js.map +1 -0
- package/dist/lib/normalize-user.d.ts +32 -0
- package/dist/lib/normalize-user.js +15 -0
- package/dist/lib/normalize-user.js.map +1 -0
- package/dist/lib/openapi-config.d.ts +31 -0
- package/dist/lib/openapi-config.js +66 -0
- package/dist/lib/openapi-config.js.map +1 -0
- package/dist/lib/session.d.ts +43 -18
- package/dist/lib/session.js +57 -23
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/tenant.d.ts +8 -1
- package/dist/lib/tenant.js +5 -4
- package/dist/lib/tenant.js.map +1 -1
- package/package.json +7 -4
- package/dist/index-J2ZbOnZO.d.ts +0 -76
- package/dist/lib/jwt.d.ts +0 -15
- package/dist/lib/jwt.js +0 -25
- package/dist/lib/jwt.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/db/index.ts","../src/db/relations.ts","../src/db/schema.ts","../src/db/orm/iam/sessions/find-session-by-token.ts","../src/db/orm/iam/users/find-user-by-id.ts","../src/handler.ts","../src/lib/crypto.ts","../src/routes/auth.route.ts","../src/routes/auth.schema.ts","../src/routes/handler/account-change-pending.ts","../src/db/orm/iam/account-changes/expire-pending-account-changes.ts","../src/db/orm/iam/account-changes/find-pending-account-change.ts","../src/db/orm/iam/verifications/find-active-verification-id.ts","../src/errors.ts","../src/lib/tenant.ts","../src/db/orm/iam/users/find-user-by-email.ts","../src/db/orm/iam/users/find-user-by-phone.ts","../src/db/orm/iam/users/find-user-by-identifier.ts","../src/routes/handler/check-user.ts","../src/routes/handler/email-verification-confirm.ts","../src/db/orm/iam/sessions/insert-session.ts","../src/db/orm/iam/users/update-user-verified.ts","../src/db/orm/iam/verifications/consume-verification.ts","../src/db/orm/iam/verifications/find-verification-by-id.ts","../src/db/orm/iam/verifications/update-verification-attempt.ts","../src/lib/session.ts","../src/routes/handler/email-verification-request.ts","../src/db/orm/iam/account-changes/cancel-pending-account-changes.ts","../src/db/orm/iam/account-changes/insert-pending-email-change.ts","../src/db/orm/iam/verifications/delete-verifications-by-user-and-type.ts","../src/db/orm/iam/verifications/insert-verification.ts","../src/lib/send-email.ts","../src/providers/resend-email.ts","../src/routes/handler/me.ts","../src/routes/handler/password-change.ts","../src/db/orm/iam/accounts/find-account-by-provider.ts","../src/db/orm/iam/accounts/update-account-password.ts","../src/db/orm/iam/sessions/delete-session-by-id.ts","../src/db/orm/iam/sessions/list-sessions-for-user.ts","../src/providers/afro-sms.ts","../src/routes/handler/password-forgot.ts","../src/routes/handler/password-reset.ts","../src/routes/handler/password-verify.ts","../src/routes/handler/phone-verification-confirm.ts","../src/routes/handler/phone-verification-request.ts","../src/db/orm/iam/account-changes/insert-pending-phone-change.ts","../src/routes/handler/session.ts","../src/routes/handler/sign-in.ts","../src/db/orm/iam/sessions/delete-oldest-sessions.ts","../src/db/orm/iam/users/update-last-sign-in.ts","../src/routes/handler/sign-out.ts","../src/routes/handler/sign-up.ts","../src/db/orm/iam/accounts/insert-credentials-account.ts","../src/db/orm/iam/users/find-user-by-handle.ts","../src/db/orm/iam/users/insert-user.ts","../src/routes/handler/update-email.ts","../src/db/orm/iam/account-changes/mark-pending-account-change-applied.ts","../src/db/orm/iam/accounts/update-credentials-provider-account-id.ts","../src/db/orm/iam/sessions/delete-other-sessions.ts","../src/db/orm/iam/users/update-user-email.ts","../src/routes/handler/update-phone.ts","../src/db/orm/iam/users/update-user-phone.ts","../src/routes/handler/update-profile.ts","../src/db/orm/iam/users/update-user-profile.ts","../src/index.ts"],"sourcesContent":["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, rolePermissionsInIam, permissionsInIam, 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\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [rolePermissionsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\trolesInIam: one(rolesInIam, {\n\t\tfields: [rolePermissionsInIam.roleId],\n\t\treferences: [rolesInIam.id]\n\t}),\n\tpermissionsInIam: one(permissionsInIam, {\n\t\tfields: [rolePermissionsInIam.permissionId],\n\t\treferences: [permissionsInIam.id]\n\t}),\n}));\n\nexport const permissionsInIamRelations = relations(permissionsInIam, ({many}) => ({\n\trolePermissionsInIam: many(rolePermissionsInIam),\n}));\n\nexport const userRolesInIamRelations = relations(userRolesInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [userRolesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [userRolesInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n\trolesInIam: one(rolesInIam, {\n\t\tfields: [userRolesInIam.roleId],\n\t\treferences: [rolesInIam.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_login_attempt_nonnegative_check\", sql`login_attempt >= 0`),\n\tcheck(\"users_contact_required_check\", sql`(email IS NOT NULL) OR (phone IS NOT NULL)`),\n]);\n\nexport const sessionsInIam = iam.table(\"sessions\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }).notNull(),\n\tuserAgent: text(\"user_agent\"),\n\tip: inet(),\n\tmeta: jsonb(),\n\ttoken: text().notNull(),\n\trotatedAt: timestamp(\"rotated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),\n}, (table) => [\n\tindex(\"sessions_expires_at_idx\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"timestamptz_ops\")),\n\tindex(\"sessions_tenant_user_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"uuid_ops\"), table.userId.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"sessions_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"sessions_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"sessions_token_key\").on(table.token),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"sessions_expires_after_created_check\", sql`expires_at > created_at`),\n]);\n\nexport const 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_status_check\", sql`(status)::text = ANY ((ARRAY['pending'::character varying, 'applied'::character varying, 'cancelled'::character varying, 'expired'::character varying])::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]);\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.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"role_permissions_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.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.permissionId],\n\t\t\tforeignColumns: [permissionsInIam.id],\n\t\t\tname: \"role_permissions_permission_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.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"user_roles_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"user_roles_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.roleId],\n\t\t\tforeignColumns: [rolesInIam.id],\n\t\t\tname: \"user_roles_role_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_provider_account_unique\").on(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\tcreatedBy: uuid(\"created_by\"),\n\tupdatedBy: uuid(\"updated_by\"),\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_status_check\", sql`status = ANY (ARRAY['pending'::text, 'active'::text, 'disabled'::text, 'deleted'::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]);\n","import { and, eq, gt } from 'drizzle-orm';\nimport type { Database, Session } from '../../../../types';\nimport { sessionsInIam } from '../../../schema';\n\nexport const findSessionByToken = (db: Database, hashedToken: string) => {\n return db\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 .then(([session]) => (session as Session) || null);\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { rolesInIam, userRolesInIam, usersInIam } from '../../../schema';\n\nexport const findUserById = async (\n db: Database,\n tenantId: string,\n userId: string,\n) => {\n return await db\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 .then(([user]) => (user as User) || null);\n};\n","import { OpenAPIHono } from '@hono/zod-openapi';\nimport { getCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { createDatabase } from './db';\nimport { findSessionByToken } from './db/orm/iam/sessions/find-session-by-token';\nimport { findUserById } from './db/orm/iam/users/find-user-by-id';\nimport { hashToken } from './lib/crypto';\nimport { createAuthRoutes as createRoutes } from './routes/auth.route';\nimport type { AuthConfig } from './types';\n\nconst createAuthMiddleware = (\n config: AuthConfig,\n database: ReturnType<typeof createDatabase>,\n getTenantId: (c: any) => string | undefined,\n) => {\n const enableTenant = config.enableTenant ?? true;\n\n return async (c: any, next: () => Promise<void>) => {\n const sessionToken = getCookie(c, 'session_token') || undefined;\n let tenantId = getTenantId(c);\n\n if (enableTenant) {\n if (!tenantId) {\n throw new HTTPException(400, {\n message: 'Missing tenantId. Tenant isolation is enabled.',\n });\n }\n } else {\n tenantId = config.tenantId;\n if (!tenantId) {\n throw new HTTPException(500, {\n message:\n 'tenantId must be provided in config when enableTenant is false.',\n });\n }\n }\n\n c.set('config', config);\n c.set('database', database);\n c.set('tenantId', tenantId);\n c.set('userId', undefined);\n c.set('user', undefined);\n c.set('session', undefined);\n\n if (sessionToken) {\n try {\n const hashedToken = await hashToken(sessionToken, config.secret);\n const session = await findSessionByToken(database, hashedToken);\n\n if (session) {\n const user = await findUserById(\n database,\n session.tenantId,\n session.userId,\n );\n if (user) {\n c.set('tenantId', enableTenant ? session.tenantId : tenantId);\n c.set('userId', user.id);\n c.set('user', user);\n c.set('session', session);\n }\n }\n } catch {\n // Invalid session, continue without user\n }\n }\n\n await next();\n };\n};\n\n// For fetch-based usage (standalone handler)\nexport const createAuthHandler = (config: AuthConfig) => {\n // biome-ignore lint/suspicious/noExplicitAny: OpenAPIHono context type\n const app = new OpenAPIHono<any>();\n const database = createDatabase(config.connectionString);\n\n // Get tenantId from x-tenant-id header\n app.use(\n '*',\n createAuthMiddleware(\n config,\n database,\n (c) => c.req.header('x-tenant-id') || config.tenantId,\n ),\n );\n\n app.route('/', createRoutes());\n return app;\n};\n\n// For route-based usage (mounted as sub-route, shares parent context)\nexport const createAuthRoutes = (config: AuthConfig) => {\n // biome-ignore lint/suspicious/noExplicitAny: OpenAPIHono context type\n const app = new OpenAPIHono<any>();\n const database = createDatabase(config.connectionString);\n\n // Get tenantId from parent context\n app.use(\n '*',\n createAuthMiddleware(\n config,\n database,\n (c) => c.get('tenantId') || config.tenantId,\n ),\n );\n\n app.route('/', createRoutes());\n return app;\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 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 { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { z } from 'zod';\nimport {\n authSuccessSchema,\n changePasswordSchema,\n checkUserResponseSchema,\n checkUserSchema,\n emailVerificationConfirmSchema,\n emailVerificationRequestSchema,\n errorResponseSchema,\n forgotPasswordSchema,\n messageSchema,\n messageWithVerificationIdSchema,\n pendingAccountChangeResponseSchema,\n phoneVerificationConfirmSchema,\n phoneVerificationRequestSchema,\n profileResponseSchema,\n resetPasswordSchema,\n signInResponseSchema,\n signInSchema,\n signUpResponseSchema,\n signUpSchema,\n updateEmailSchema,\n updatePhoneSchema,\n updateProfileSchema,\n userSchema,\n verifyPasswordSchema,\n} from './auth.schema';\nimport { accountChangePendingHandler } from './handler/account-change-pending';\nimport { checkUserHandler } from './handler/check-user';\nimport { emailVerificationConfirmHandler } from './handler/email-verification-confirm';\nimport { emailVerificationRequestHandler } from './handler/email-verification-request';\nimport { meHandler } from './handler/me';\nimport { changePasswordHandler } from './handler/password-change';\nimport { forgotPasswordHandler } from './handler/password-forgot';\nimport { resetPasswordHandler } from './handler/password-reset';\nimport { verifyPasswordHandler } from './handler/password-verify';\nimport { phoneVerificationConfirmHandler } from './handler/phone-verification-confirm';\nimport { phoneVerificationRequestHandler } from './handler/phone-verification-request';\nimport { sessionHandler } from './handler/session';\nimport { signInHandler } from './handler/sign-in';\nimport { signOutHandler } from './handler/sign-out';\nimport { signUpHandler } from './handler/sign-up';\nimport { updateEmailHandler } from './handler/update-email';\nimport { updatePhoneHandler } from './handler/update-phone';\nimport { updateProfileHandler } from './handler/update-profile';\n\nconst 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 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User already exists',\n },\n },\n});\n\nconst 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\nconst 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\nconst 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 meRoute = createRoute({\n method: 'get',\n path: '/me',\n tags: ['Auth'],\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 },\n});\n\nconst sessionRoute = createRoute({\n method: 'get',\n path: '/session',\n tags: ['Auth'],\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\nconst 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 emailVerificationRequestRoute = createRoute({\n method: 'post',\n path: '/email/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 },\n});\n\nconst emailVerificationConfirmRoute = createRoute({\n method: 'post',\n path: '/email/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 },\n});\n\nconst phoneVerificationRequestRoute = createRoute({\n method: 'post',\n path: '/phone/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 },\n});\n\nconst phoneVerificationConfirmRoute = createRoute({\n method: 'post',\n path: '/phone/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 },\n});\n\nconst forgotPasswordRoute = createRoute({\n method: 'post',\n path: '/password/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\nconst resetPasswordRoute = createRoute({\n method: 'post',\n path: '/password/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 },\n});\n\nconst verifyPasswordRoute = createRoute({\n method: 'post',\n path: '/password/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\nconst changePasswordRoute = createRoute({\n method: 'post',\n path: '/password/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 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\nconst 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\nconst 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 createAuthRoutes = () => {\n const authRoutes = new OpenAPIHono()\n .openapi(signUpRoute, signUpHandler)\n .openapi(signInRoute, signInHandler)\n .openapi(checkUserRoute, checkUserHandler)\n .openapi(signOutRoute, signOutHandler)\n .openapi(meRoute, meHandler)\n .openapi(sessionRoute, sessionHandler)\n .openapi(accountChangePendingRoute, accountChangePendingHandler)\n .openapi(emailVerificationRequestRoute, emailVerificationRequestHandler)\n .openapi(emailVerificationConfirmRoute, emailVerificationConfirmHandler)\n .openapi(phoneVerificationRequestRoute, phoneVerificationRequestHandler)\n .openapi(phoneVerificationConfirmRoute, phoneVerificationConfirmHandler)\n .openapi(forgotPasswordRoute, forgotPasswordHandler)\n .openapi(resetPasswordRoute, resetPasswordHandler)\n .openapi(verifyPasswordRoute, verifyPasswordHandler)\n .openapi(changePasswordRoute, changePasswordHandler)\n .openapi(updateProfileRoute, updateProfileHandler)\n .openapi(updateEmailRoute, updateEmailHandler)\n .openapi(updatePhoneRoute, updatePhoneHandler);\n\n return authRoutes;\n};\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,\n sessionToken: z.string(),\n sessionExpiresAt: z.string().datetime(),\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 handle: z.string().optional(),\n image: z.string().url().optional(),\n })\n .refine((data) => data.email || data.phone, {\n message: 'Either email or phone is required',\n path: ['email'],\n });\n\nexport const signInSchema = z.object({\n identifier: z.string(),\n password: passwordField,\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 { HTTPException } from 'hono/http-exception';\nimport { expirePendingAccountChanges } from '../../db/orm/iam/account-changes/expire-pending-account-changes';\nimport {\n findPendingAccountChange,\n type PendingAccountChange,\n} from '../../db/orm/iam/account-changes/find-pending-account-change';\nimport { findActiveVerificationId } from '../../db/orm/iam/verifications/find-active-verification-id';\nimport { AUTH_ERRORS } from '../../errors';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const accountChangePendingHandler = async (c: any) => {\n const { config, database, tenantId, userId } = c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n await expirePendingAccountChanges(database, resolvedTenantId, userId);\n const accountChange: PendingAccountChange | null =\n await findPendingAccountChange(database, resolvedTenantId, userId);\n\n if (!accountChange) {\n return c.json({ accountChange: null, verificationId: null });\n }\n\n let verification: { verificationId: string; expiresAt: string } | null = null;\n if (accountChange.changeType === 'email' && accountChange.newEmail) {\n verification = await findActiveVerificationId(\n database,\n resolvedTenantId,\n userId,\n 'email-verification',\n accountChange.newEmail,\n );\n }\n if (accountChange.changeType === 'phone' && accountChange.newPhone) {\n verification = await findActiveVerificationId(\n database,\n resolvedTenantId,\n userId,\n 'phone-otp-change-phone',\n accountChange.newPhone,\n );\n }\n\n if (!verification) {\n return c.json({ accountChange: null, verificationId: null });\n }\n\n return c.json({\n accountChange,\n verificationId: verification.verificationId,\n });\n};\n","import { and, eq, lte } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport const expirePendingAccountChanges = (\n db: Database,\n tenantId: string,\n userId: string,\n) => {\n const now = new Date().toISOString();\n return db\n .update(accountChangesInIam)\n .set({\n status: 'expired',\n updatedAt: now,\n })\n .where(\n and(\n eq(accountChangesInIam.tenantId, tenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.status, 'pending'),\n lte(accountChangesInIam.expiresAt, now),\n ),\n );\n};\n","import { and, desc, eq, gt } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport type PendingAccountChange = {\n changeType: 'email' | 'phone';\n newEmail: string | null;\n newPhone: string | null;\n expiresAt: string;\n};\n\nexport const findPendingAccountChange = async (\n db: Database,\n tenantId: string,\n userId: string,\n): Promise<PendingAccountChange | null> => {\n const now = new Date().toISOString();\n return await db\n .select({\n changeType: accountChangesInIam.changeType,\n newEmail: accountChangesInIam.newEmail,\n newPhone: accountChangesInIam.newPhone,\n expiresAt: accountChangesInIam.expiresAt,\n })\n .from(accountChangesInIam)\n .where(\n and(\n eq(accountChangesInIam.tenantId, tenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.status, 'pending'),\n gt(accountChangesInIam.expiresAt, now),\n ),\n )\n .orderBy(desc(accountChangesInIam.createdAt))\n .limit(1)\n .then(([row]) => {\n if (!row) {\n return null;\n }\n if (row.changeType !== 'email' && row.changeType !== 'phone') {\n return null;\n }\n return {\n changeType: row.changeType,\n newEmail: row.newEmail ?? null,\n newPhone: row.newPhone ?? null,\n expiresAt: row.expiresAt,\n };\n });\n};\n","import { and, desc, eq, gt } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\n\nexport type ActiveVerification = {\n verificationId: string;\n expiresAt: string;\n};\n\nexport const findActiveVerificationId = async (\n db: Database,\n tenantId: string,\n userId: string,\n type: string,\n to: string,\n): Promise<ActiveVerification | null> => {\n const now = new Date().toISOString();\n return await db\n .select({\n verificationId: verificationsInIam.id,\n expiresAt: verificationsInIam.expiresAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, type),\n eq(verificationsInIam.to, to),\n gt(verificationsInIam.expiresAt, now),\n ),\n )\n .orderBy(desc(verificationsInIam.createdAt))\n .limit(1)\n .then(([row]) => (row ? row : null));\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 { HTTPException } from 'hono/http-exception';\nimport type { AuthConfig } from '../types';\n\nexport const ensureTenantId = (\n config: AuthConfig,\n tenantId: string | undefined,\n): string => {\n if (config.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.tenantId) {\n throw new HTTPException(500, {\n message:\n 'tenantId must be provided in config when enableTenant is false.',\n });\n }\n return config.tenantId;\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { rolesInIam, userRolesInIam, usersInIam } from '../../../schema';\n\nexport const findUserByEmail = async (\n db: Database,\n tenantId: string,\n email: string,\n) => {\n const result = await db\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(\n and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.email}) = lower(${email})`,\n ),\n )\n .groupBy(usersInIam.id)\n .limit(1)\n .then(([u]) => u || null);\n\n return result as User | null;\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { rolesInIam, userRolesInIam, usersInIam } from '../../../schema';\n\nexport const findUserByPhone = async (\n db: Database,\n tenantId: string,\n phone: string,\n) => {\n const result = await db\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.tenantId, tenantId), eq(usersInIam.phone, phone)))\n .groupBy(usersInIam.id)\n .limit(1)\n .then(([u]) => u || null);\n\n return result as User | null;\n};\n","import type { Database, User } from '../../../../types';\nimport { findUserByEmail } from './find-user-by-email';\nimport { findUserByPhone } from './find-user-by-phone';\n\nexport const findUserByIdentifier = async (\n db: Database,\n tenantId: string,\n identifier: string,\n): Promise<{ user: User | null; type: 'email' | 'phone' }> => {\n const isEmail = identifier.includes('@');\n\n if (isEmail) {\n const user = await findUserByEmail(db, tenantId, identifier);\n return { user, type: 'email' };\n }\n\n const user = await findUserByPhone(db, tenantId, identifier);\n return { user, type: 'phone' };\n};\n","import { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\nexport const checkUserHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { identifier } = body;\n\n const lookup = await findUserByIdentifier(\n database,\n resolvedTenantId,\n identifier,\n );\n\n return c.json({ exists: !!lookup.user });\n};\n","import { setCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { insertSession } from '../../db/orm/iam/sessions/insert-session';\nimport { findUserById } from '../../db/orm/iam/users/find-user-by-id';\nimport { updateUserVerified } from '../../db/orm/iam/users/update-user-verified';\nimport { consumeVerification } from '../../db/orm/iam/verifications/consume-verification';\nimport { findVerificationById } from '../../db/orm/iam/verifications/find-verification-by-id';\nimport { updateVerificationAttempt } from '../../db/orm/iam/verifications/update-verification-attempt';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashToken } from '../../lib/crypto';\nimport { addDuration } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\nexport const emailVerificationConfirmHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code } = body;\n\n const verification = await findVerificationById(database, verificationId);\n\n if (!verification) {\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_NOT_FOUND,\n });\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_EXPIRED,\n });\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await updateVerificationAttempt(database, verificationId);\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_MISMATCH,\n });\n }\n\n // Mark email as verified\n await updateUserVerified(\n database,\n resolvedTenantId,\n verification.userId,\n 'email',\n );\n\n // Consume verification\n await consumeVerification(database, verificationId);\n\n // Create session if user doesn't have one\n const user = await findUserById(\n database,\n resolvedTenantId,\n verification.userId,\n );\n\n if (!user) {\n throw new HTTPException(500, { message: 'User not found' });\n }\n\n const sessionToken = crypto.randomUUID();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const session = await insertSession(database, {\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: 'email-verification' },\n });\n\n // Set cookie\n setCookie(c, 'session_token', sessionToken, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(expiresAt),\n });\n\n return c.json({\n 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 sessionToken,\n sessionExpiresAt: session.expiresAt,\n });\n};\n","import type { Database, Session } from '../../../../types';\nimport { sessionsInIam } from '../../../schema';\n\nexport const insertSession = (\n db: Database,\n data: {\n tenantId: string;\n userId: string;\n token: string;\n expiresAt: string;\n userAgent?: string | null;\n ip?: string | null;\n meta?: Record<string, unknown> | null;\n },\n) => {\n return db\n .insert(sessionsInIam)\n .values({\n tenantId: data.tenantId,\n userId: data.userId,\n token: data.token,\n expiresAt: data.expiresAt,\n userAgent: data.userAgent || null,\n ip: data.ip || null,\n meta: data.meta || null,\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 .then(([session]) => session as Session);\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const updateUserVerified = (\n db: Database,\n tenantId: string,\n userId: string,\n type: 'email' | 'phone',\n) => {\n return db\n .update(usersInIam)\n .set({\n [type === 'email' ? 'emailVerified' : 'phoneVerified']: true,\n lastSignInAt: new Date().toISOString(),\n })\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)));\n};\n","import { eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\n\nexport const consumeVerification = (db: Database, verificationId: string) => {\n return db\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n};\n","import { eq } from 'drizzle-orm';\nimport type { Database, Verification } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\n\nexport const findVerificationById = (db: Database, verificationId: string) => {\n return db\n .select({\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 .from(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId))\n .limit(1)\n .then(([verification]) => (verification as Verification) || null);\n};\n","import { eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\nimport { findVerificationById } from './find-verification-by-id';\n\nexport const updateVerificationAttempt = async (\n db: Database,\n verificationId: string,\n): Promise<void> => {\n const verification = await findVerificationById(db, verificationId);\n if (!verification) {\n return;\n }\n\n await db\n .update(verificationsInIam)\n .set({ attempt: (verification.attempt || 0) + 1 })\n .where(eq(verificationsInIam.id, verificationId));\n};\n","import { dayjs } from '@mesob/common';\n\nexport const SESSION_COOKIE_NAME = 'session_token';\n\nexport type SessionMeta = Record<string, unknown>;\n\nexport type BuildSessionPayloadOptions = {\n id: string;\n expiresAt: string;\n createdAt?: string;\n userAgent?: string | null;\n ip?: string | null;\n};\n\nexport const buildSessionPayload = ({\n id,\n expiresAt,\n createdAt,\n userAgent,\n ip,\n}: BuildSessionPayloadOptions) => ({\n id,\n expiresAt,\n createdAt,\n userAgent: userAgent || null,\n ip: ip || null,\n});\n\nexport const generateHandle = (seed?: string | null) => {\n const base =\n seed?.replace(/[^a-zA-Z0-9]/g, '').toLowerCase() ||\n `user${Math.random().toString(36).slice(2, 8)}`;\n return `${base}-${Math.random().toString(36).slice(2, 6)}`;\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) {\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 let code = '';\n for (let i = 0; i < length; i++) {\n code += digits[Math.floor(Math.random() * digits.length)]!;\n }\n return code;\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { cancelPendingAccountChanges } from '../../db/orm/iam/account-changes/cancel-pending-account-changes';\nimport { insertPendingEmailChange } from '../../db/orm/iam/account-changes/insert-pending-email-change';\nimport { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { deleteVerificationsByUserAndType } from '../../db/orm/iam/verifications/delete-verifications-by-user-and-type';\nimport { insertVerification } from '../../db/orm/iam/verifications/insert-verification';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashToken } from '../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport { ResendEmailProvider } from '../../providers/resend-email';\nimport type { AuthContext } from '../../types';\n\nexport const emailVerificationRequestHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, user } = c.var as AuthContext;\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const email = body.email || user?.email;\n\n if (!email) {\n throw new HTTPException(400, { message: 'Email required' });\n }\n\n // Try to get userId from session first, otherwise find by email\n let userId = user?.id;\n if (!userId) {\n const lookup = await findUserByIdentifier(\n database,\n resolvedTenantId,\n email,\n );\n if (!lookup.user) {\n throw new HTTPException(404, { message: AUTH_ERRORS.USER_NOT_FOUND });\n }\n userId = lookup.user.id;\n }\n\n // Delete any existing email verifications for this user\n await deleteVerificationsByUserAndType(\n database,\n resolvedTenantId,\n userId,\n 'email-verification',\n );\n\n const code = generateOtpCode(6);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.verificationExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: email,\n });\n\n if (user?.id && body.email) {\n await cancelPendingAccountChanges(\n database,\n resolvedTenantId,\n user.id,\n 'email',\n );\n await insertPendingEmailChange(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n oldEmail: user.email ?? '',\n newEmail: body.email,\n expiresAt: verification.expiresAt,\n });\n }\n\n const emailProvider = new ResendEmailProvider(config.email.resend);\n await emailProvider.sendVerificationEmail(email, code);\n\n return c.json({ verificationId: verification.id });\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport const cancelPendingAccountChanges = (\n db: Database,\n tenantId: string,\n userId: string,\n changeType: 'email' | 'phone',\n) => {\n const now = new Date().toISOString();\n return db\n .update(accountChangesInIam)\n .set({\n status: 'cancelled',\n cancelledAt: now,\n updatedAt: now,\n reason: 'replaced',\n })\n .where(\n and(\n eq(accountChangesInIam.tenantId, tenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.changeType, changeType),\n eq(accountChangesInIam.status, 'pending'),\n ),\n );\n};\n","import type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport const insertPendingEmailChange = (\n db: Database,\n data: {\n tenantId: string;\n userId: string;\n oldEmail: string;\n newEmail: string;\n expiresAt: string;\n },\n) => {\n const now = new Date().toISOString();\n return db.insert(accountChangesInIam).values({\n tenantId: data.tenantId,\n userId: data.userId,\n changeType: 'email',\n oldEmail: data.oldEmail,\n newEmail: data.newEmail,\n oldPhone: null,\n newPhone: null,\n status: 'pending',\n expiresAt: data.expiresAt,\n updatedAt: now,\n });\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\n\nexport const deleteVerificationsByUserAndType = (\n db: Database,\n tenantId: string,\n userId: string,\n type: string,\n) => {\n return db\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, type),\n ),\n );\n};\n","import type { Database, Verification } from '../../../../types';\nimport { verificationsInIam } from '../../../schema';\n\nexport const insertVerification = async (\n db: Database,\n data: {\n tenantId: string;\n userId: string;\n type: string;\n code: string;\n expiresAt: string;\n to?: string | null;\n },\n) => {\n return await db\n .insert(verificationsInIam)\n .values({\n tenantId: data.tenantId,\n userId: data.userId,\n type: data.type,\n code: data.code,\n expiresAt: data.expiresAt,\n to: data.to || null,\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 .then(([verification]) => verification as Verification);\n};\n","import { Resend } from 'resend';\n\ntype SendEmailProps = {\n key: string;\n provider: 'resend';\n to: string[];\n subject: string;\n html: string;\n text: string;\n from: string;\n};\n\nexport const SendEmail = async ({\n key,\n provider,\n to,\n subject,\n html,\n text,\n from,\n}: SendEmailProps) => {\n switch (provider) {\n case 'resend':\n return await sendEmailWithResend(key, to, subject, html, text, from);\n default:\n throw new Error(`Unsupported email provider: ${provider}`);\n }\n};\n\nconst sendEmailWithResend = async (\n key: string,\n to: string[],\n subject: string,\n html: string,\n text: string,\n from: string,\n) => {\n const resend = new Resend(key);\n\n return await resend.emails.send({\n from,\n to,\n subject,\n html,\n text,\n });\n};\n","import { SendEmail } from '../lib/send-email';\nimport type { ResendConfig } from '../types';\n\nexport class ResendEmailProvider {\n private config: ResendConfig;\n\n constructor(config: ResendConfig) {\n this.config = config;\n }\n\n async sendVerificationEmail(\n email: string,\n code: string,\n tenantName?: string,\n ): Promise<void> {\n const subject =\n this.config.verificationSubject ||\n `Verify your email${tenantName ? ` for ${tenantName}` : ''}`;\n\n const html = `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${subject}</title>\n </head>\n <body style=\"font-family: Arial, sans-serif; line-height: 1.6; color: #333;\">\n <div style=\"max-width: 600px; margin: 0 auto; padding: 20px;\">\n <h1 style=\"color: #2563eb;\">Verify Your Email</h1>\n <p>Your verification code is:</p>\n <div style=\"background: #f3f4f6; padding: 20px; text-align: center; font-size: 32px; font-weight: bold; letter-spacing: 8px; margin: 20px 0;\">\n ${code}\n </div>\n\n <p style=\"color: #6b7280; font-size: 14px; margin-top: 30px;\">\n This code will expire in 1 hour. If you didn't request this, please ignore this email.\n </p>\n </div>\n </body>\n </html>\n `;\n\n const text = `Your verification code is: ${code}\\n\\nThis code will expire in 1 hour.`;\n\n await this.sendEmail({\n to: [email],\n subject,\n html,\n text,\n });\n }\n\n async sendPasswordResetEmail(\n email: string,\n code: string,\n tenantName?: string,\n ): Promise<void> {\n const subject =\n this.config.resetPasswordSubject ||\n `Reset your password${tenantName ? ` for ${tenantName}` : ''}`;\n\n const html = `\n <!DOCTYPE html>\n <html>\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${subject}</title>\n </head>\n <body style=\"font-family: Arial, sans-serif; line-height: 1.6; color: #333;\">\n <div style=\"max-width: 600px; margin: 0 auto; padding: 20px;\">\n <h1 style=\"color: #2563eb;\">Reset Your Password</h1>\n <p>Your password reset code is:</p>\n <div style=\"background: #f3f4f6; padding: 20px; text-align: center; font-size: 32px; font-weight: bold; letter-spacing: 8px; margin: 20px 0;\">\n ${code}\n </div>\n <p style=\"color: #6b7280; font-size: 14px; margin-top: 30px;\">\n This code will expire in 1 hour. If you didn't request this, please ignore this email.\n </p>\n </div>\n </body>\n </html>\n `;\n\n const text = `Your password reset code is: ${code}\\n\\nThis code will expire in 1 hour.`;\n\n await this.sendEmail({\n to: [email],\n subject,\n html,\n text,\n });\n }\n\n private async sendEmail(data: {\n to: string[];\n subject: string;\n html: string;\n text: string;\n }): Promise<void> {\n const res = await SendEmail({\n key: this.config.apiKey,\n provider: 'resend',\n to: data.to,\n subject: data.subject,\n html: data.html,\n text: data.text,\n from: this.config.from,\n });\n\n if (res.error) {\n throw new Error(res.error.message);\n }\n }\n}\n","import { HTTPException } from 'hono/http-exception';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const meHandler = (c: any) => {\n const { user } = c.var as AuthContext;\n\n if (!user) {\n throw new HTTPException(401, { message: 'Unauthorized' });\n }\n\n return c.json({ user });\n};\n","import { getCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { findAccountByProvider } from '../../db/orm/iam/accounts/find-account-by-provider';\nimport { updateAccountPassword } from '../../db/orm/iam/accounts/update-account-password';\nimport { deleteSessionById } from '../../db/orm/iam/sessions/delete-session-by-id';\nimport { findSessionByToken } from '../../db/orm/iam/sessions/find-session-by-token';\nimport { listSessionsForUser } from '../../db/orm/iam/sessions/list-sessions-for-user';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashPassword, hashToken, verifyPassword } from '../../lib/crypto';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const changePasswordHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, userId, user } = c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n if (!user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { currentPassword, newPassword } = body;\n\n const account = await findAccountByProvider(\n database,\n resolvedTenantId,\n userId,\n 'credentials',\n );\n\n if (!account?.password) {\n throw new HTTPException(401, { message: AUTH_ERRORS.HAS_NO_PASSWORD });\n }\n\n const passwordValid = await verifyPassword(currentPassword, account.password);\n if (!passwordValid) {\n throw new HTTPException(401, { message: AUTH_ERRORS.INVALID_PASSWORD });\n }\n\n // Update password\n const passwordHash = await hashPassword(newPassword);\n await updateAccountPassword(database, resolvedTenantId, userId, passwordHash);\n\n // Optionally revoke other sessions (keep current)\n const sessions = await listSessionsForUser(\n database,\n resolvedTenantId,\n userId,\n );\n const currentSessionToken = getCookie(c, 'session_token');\n if (currentSessionToken) {\n const hashedToken = await hashToken(currentSessionToken, config.secret);\n const currentSession = await findSessionByToken(database, hashedToken);\n if (currentSession) {\n // Delete all sessions except current\n for (const session of sessions) {\n if (session.id !== currentSession.id) {\n await deleteSessionById(database, session.id);\n }\n }\n }\n }\n\n return c.json({ message: 'Password updated' });\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Account, Database } from '../../../../types';\nimport { accountsInIam } from '../../../schema';\n\nexport const findAccountByProvider = (\n db: Database,\n tenantId: string,\n userId: string,\n provider: string,\n) => {\n return db\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, tenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, provider),\n ),\n )\n .limit(1)\n .then(([account]) => (account as Account) || null);\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountsInIam } from '../../../schema';\n\nexport const updateAccountPassword = (\n db: Database,\n tenantId: string,\n userId: string,\n password: string,\n) => {\n return db\n .update(accountsInIam)\n .set({ password })\n .where(\n and(\n eq(accountsInIam.tenantId, tenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n};\n","import { eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { sessionsInIam } from '../../../schema';\n\nexport const deleteSessionById = (db: Database, sessionId: string) => {\n return db.delete(sessionsInIam).where(eq(sessionsInIam.id, sessionId));\n};\n","import { and, asc, eq, gt } from 'drizzle-orm';\nimport type { Database, Session } from '../../../../types';\nimport { sessionsInIam } from '../../../schema';\n\nexport const listSessionsForUser = (\n db: Database,\n tenantId: string,\n userId: string,\n) => {\n return db\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.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .orderBy(asc(sessionsInIam.createdAt))\n .then((sessions) => sessions as Session[]);\n};\n","import type { SMSConfig } from '../types';\n\ntype SMSInput = {\n to: string;\n message: string;\n callback?: string;\n};\n\ntype SMSRequest = {\n from: string;\n sender: string;\n to: string;\n message: string;\n callback?: string;\n};\nexport class AfroSmsProvider {\n private config: SMSConfig;\n\n constructor(config: SMSConfig) {\n this.config = config;\n }\n\n async sendVerificationSms(phone: string, code: string): Promise<void> {\n const template =\n this.config.templateVerification || 'Your verification code is {{code}}';\n const message = template.replace('{{code}}', code);\n const sms = {\n to: phone,\n message,\n };\n\n await this.sendSms(this.config, sms);\n }\n\n async sendLoginSms(phone: string, code: string): Promise<void> {\n const template = this.config.templateLogin || 'Your login code is {{code}}';\n const message = template.replace('{{code}}', code);\n const sms = {\n to: phone,\n message,\n };\n\n await this.sendSms(this.config, sms);\n }\n\n private async sendSms(config: SMSConfig, sms: SMSInput): Promise<Response> {\n const baseUrl = `${config.baseUrl}/send`;\n\n const identifierId = config?.identifierId;\n\n const senderName = config?.senderName;\n\n const key = config?.apiKey;\n\n if (!(baseUrl && identifierId && senderName && key)) {\n throw new Error('SMS configuration is not set');\n }\n\n const myHeaders = new Headers();\n myHeaders.append('Authorization', `Bearer ${key}`);\n myHeaders.append('Content-Type', 'application/json');\n\n const sendSMS: SMSRequest = {\n from: identifierId,\n sender: '',\n to: sms.to,\n message: sms.message,\n callback: sms?.callback,\n };\n\n const requestOptions = {\n method: 'POST',\n headers: myHeaders,\n body: JSON.stringify(sendSMS),\n };\n\n const response = await fetch(baseUrl, requestOptions);\n if (!response.ok) {\n throw new Error(`Failed to send SMS: ${response.statusText}`);\n }\n return response;\n }\n}\n","import { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { insertVerification } from '../../db/orm/iam/verifications/insert-verification';\nimport { hashToken } from '../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport { AfroSmsProvider } from '../../providers/afro-sms';\nimport { ResendEmailProvider } from '../../providers/resend-email';\nimport type { AuthContext } from '../../types';\n\nexport const forgotPasswordHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { identifier } = body;\n\n const lookup = await findUserByIdentifier(\n database,\n resolvedTenantId,\n identifier,\n );\n\n // Always return 200 to prevent user enumeration\n if (!lookup.user) {\n return c.json({ message: 'If account exists, reset code sent' });\n }\n\n const isEmail = lookup.type === 'email';\n\n let verificationId: string | undefined;\n\n if (isEmail) {\n const code = generateOtpCode(6);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.resetPasswordExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: lookup.user.id,\n type: 'password-reset',\n code: hashedCode,\n expiresAt,\n to: lookup.user.email!,\n });\n verificationId = verification.id;\n\n const emailProvider = new ResendEmailProvider(config.email.resend);\n await emailProvider.sendPasswordResetEmail(lookup.user.email!, code);\n } else {\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.otpExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: lookup.user.id,\n type: 'password-reset-otp',\n code: hashedCode,\n expiresAt,\n to: lookup.user.phone!,\n });\n verificationId = verification.id;\n\n const smsProvider = new AfroSmsProvider(config.phone.smsConfig);\n await smsProvider.sendVerificationSms(lookup.user.phone!, code);\n }\n\n return c.json({\n message: 'If account exists, reset code sent',\n verificationId,\n });\n};\n","import { setCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { updateAccountPassword } from '../../db/orm/iam/accounts/update-account-password';\nimport { deleteSessionById } from '../../db/orm/iam/sessions/delete-session-by-id';\nimport { insertSession } from '../../db/orm/iam/sessions/insert-session';\nimport { listSessionsForUser } from '../../db/orm/iam/sessions/list-sessions-for-user';\nimport { findUserById } from '../../db/orm/iam/users/find-user-by-id';\nimport { consumeVerification } from '../../db/orm/iam/verifications/consume-verification';\nimport { findVerificationById } from '../../db/orm/iam/verifications/find-verification-by-id';\nimport { updateVerificationAttempt } from '../../db/orm/iam/verifications/update-verification-attempt';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashPassword, hashToken } from '../../lib/crypto';\nimport { addDuration } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\nexport const resetPasswordHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code, password } = body;\n\n const verification = await findVerificationById(database, verificationId);\n\n if (!verification) {\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_NOT_FOUND,\n });\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n throw new HTTPException(400, { message: AUTH_ERRORS.VERIFICATION_EXPIRED });\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await updateVerificationAttempt(database, verificationId);\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_MISMATCH,\n });\n }\n\n // Update password\n const passwordHash = await hashPassword(password);\n await updateAccountPassword(\n database,\n resolvedTenantId,\n verification.userId,\n passwordHash,\n );\n\n // Revoke all sessions\n const sessions = await listSessionsForUser(\n database,\n resolvedTenantId,\n verification.userId,\n );\n for (const session of sessions) {\n await deleteSessionById(database, session.id);\n }\n\n // Consume verification\n await consumeVerification(database, verificationId);\n\n // Create new session\n const sessionToken = crypto.randomUUID();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const session = await insertSession(database, {\n tenantId: resolvedTenantId,\n userId: verification.userId,\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\n const user = await findUserById(\n database,\n resolvedTenantId,\n verification.userId,\n );\n\n if (!user) {\n throw new HTTPException(500, { message: 'User not found' });\n }\n\n // Set cookie\n setCookie(c, 'session_token', sessionToken, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(expiresAt),\n });\n\n return c.json({\n 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 sessionToken,\n sessionExpiresAt: session.expiresAt,\n });\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { findAccountByProvider } from '../../db/orm/iam/accounts/find-account-by-provider';\nimport { AUTH_ERRORS } from '../../errors';\nimport { verifyPassword } from '../../lib/crypto';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const verifyPasswordHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, userId, user } = c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n if (!user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { password } = body;\n\n const account = await findAccountByProvider(\n database,\n resolvedTenantId,\n userId,\n 'credentials',\n );\n\n if (!account?.password) {\n throw new HTTPException(401, { message: AUTH_ERRORS.HAS_NO_PASSWORD });\n }\n\n const passwordValid = await verifyPassword(password, account.password);\n if (!passwordValid) {\n throw new HTTPException(401, { message: AUTH_ERRORS.INVALID_PASSWORD });\n }\n\n return c.json({ message: 'Password verified' });\n};\n","import { setCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { insertSession } from '../../db/orm/iam/sessions/insert-session';\nimport { findUserById } from '../../db/orm/iam/users/find-user-by-id';\nimport { updateUserVerified } from '../../db/orm/iam/users/update-user-verified';\nimport { consumeVerification } from '../../db/orm/iam/verifications/consume-verification';\nimport { findVerificationById } from '../../db/orm/iam/verifications/find-verification-by-id';\nimport { updateVerificationAttempt } from '../../db/orm/iam/verifications/update-verification-attempt';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashToken } from '../../lib/crypto';\nimport { addDuration } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\nexport const phoneVerificationConfirmHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code, context } = body;\n\n const verification = await findVerificationById(database, verificationId);\n\n if (!verification) {\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_NOT_FOUND,\n });\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n throw new HTTPException(400, { message: AUTH_ERRORS.VERIFICATION_EXPIRED });\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await updateVerificationAttempt(database, verificationId);\n throw new HTTPException(400, {\n message: AUTH_ERRORS.VERIFICATION_MISMATCH,\n });\n }\n\n // Consume verification\n await consumeVerification(database, verificationId);\n\n // Handle by context\n if (context === 'change-phone' && verification.userId) {\n await updateUserVerified(\n database,\n resolvedTenantId,\n verification.userId,\n 'phone',\n );\n } else if (context === 'sign-in' && verification.userId) {\n await updateUserVerified(\n database,\n resolvedTenantId,\n verification.userId,\n 'phone',\n );\n } else if (context === 'sign-up' && verification.userId) {\n await updateUserVerified(\n database,\n resolvedTenantId,\n verification.userId,\n 'phone',\n );\n }\n\n const user = verification.userId\n ? await findUserById(database, resolvedTenantId, verification.userId)\n : null;\n\n if (!user) {\n throw new HTTPException(500, { message: 'User not found' });\n }\n\n // Create session if applicable\n if (\n context === 'sign-in' ||\n context === 'change-phone' ||\n context === 'sign-up'\n ) {\n const sessionToken = crypto.randomUUID();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const session = await insertSession(database, {\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: {\n action:\n context === 'sign-up'\n ? 'phone-verification-sign-up'\n : `phone-verification-${context}`,\n },\n });\n\n // Set cookie\n setCookie(c, 'session_token', sessionToken, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(expiresAt),\n });\n\n return c.json({\n 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 sessionToken,\n sessionExpiresAt: session.expiresAt,\n });\n }\n\n return c.json({\n user: user || null,\n session: null,\n verified: true,\n });\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { cancelPendingAccountChanges } from '../../db/orm/iam/account-changes/cancel-pending-account-changes';\nimport { insertPendingPhoneChange } from '../../db/orm/iam/account-changes/insert-pending-phone-change';\nimport { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { deleteVerificationsByUserAndType } from '../../db/orm/iam/verifications/delete-verifications-by-user-and-type';\nimport { insertVerification } from '../../db/orm/iam/verifications/insert-verification';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashToken } from '../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport { AfroSmsProvider } from '../../providers/afro-sms';\nimport type { AuthContext } from '../../types';\n\nexport const phoneVerificationRequestHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, user } = c.var as AuthContext;\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { phone, context } = body;\n\n if (!phone) {\n throw new HTTPException(400, { message: 'Phone required' });\n }\n\n // Try to get userId from session first, otherwise find by phone\n let userId: string | undefined = user?.id;\n if (!userId) {\n const lookup = await findUserByIdentifier(\n database,\n resolvedTenantId,\n phone,\n );\n if (!lookup.user) {\n // For sign-up, user should exist (created during sign-up flow)\n // For other contexts, user must exist\n throw new HTTPException(404, { message: AUTH_ERRORS.USER_NOT_FOUND });\n }\n userId = lookup.user.id;\n }\n\n if (!userId) {\n throw new HTTPException(404, { message: AUTH_ERRORS.USER_NOT_FOUND });\n }\n\n // Delete any existing phone verifications for this user and context\n await deleteVerificationsByUserAndType(\n database,\n resolvedTenantId,\n userId,\n `phone-otp-${context}`,\n );\n\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.otpExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId,\n type: `phone-otp-${context}`,\n code: hashedCode,\n expiresAt,\n to: phone,\n });\n\n if (context === 'change-phone' && user?.id) {\n await cancelPendingAccountChanges(\n database,\n resolvedTenantId,\n user.id,\n 'phone',\n );\n await insertPendingPhoneChange(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n oldPhone: user.phone ?? '',\n newPhone: phone,\n expiresAt: verification.expiresAt,\n });\n }\n\n const smsProvider = new AfroSmsProvider(config.phone.smsConfig);\n await smsProvider.sendVerificationSms(phone, code);\n\n return c.json({ verificationId: verification.id });\n};\n","import type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport const insertPendingPhoneChange = (\n db: Database,\n data: {\n tenantId: string;\n userId: string;\n oldPhone: string;\n newPhone: string;\n expiresAt: string;\n },\n) => {\n const now = new Date().toISOString();\n return db.insert(accountChangesInIam).values({\n tenantId: data.tenantId,\n userId: data.userId,\n changeType: 'phone',\n oldPhone: data.oldPhone,\n newPhone: data.newPhone,\n oldEmail: null,\n newEmail: null,\n status: 'pending',\n expiresAt: data.expiresAt,\n updatedAt: now,\n });\n};\n","import type { AuthContext } from '../../types';\n\nexport const sessionHandler = (c: any) => {\n const { user, session } = c.var as AuthContext;\n\n return c.json({\n user: 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};\n","import { setCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { findAccountByProvider } from '../../db/orm/iam/accounts/find-account-by-provider';\nimport { deleteOldestSessions } from '../../db/orm/iam/sessions/delete-oldest-sessions';\nimport { insertSession } from '../../db/orm/iam/sessions/insert-session';\nimport { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { updateLastSignIn } from '../../db/orm/iam/users/update-last-sign-in';\nimport { insertVerification } from '../../db/orm/iam/verifications/insert-verification';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashToken, verifyPassword } from '../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport { AfroSmsProvider } from '../../providers/afro-sms';\nimport { ResendEmailProvider } from '../../providers/resend-email';\nimport type { AuthContext } from '../../types';\n\nexport const signInHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { identifier, password } = body;\n\n const lookup = await findUserByIdentifier(\n database,\n resolvedTenantId,\n identifier,\n );\n\n if (!lookup.user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.USER_NOT_FOUND });\n }\n\n const account = await findAccountByProvider(\n database,\n resolvedTenantId,\n lookup.user.id,\n 'credentials',\n );\n\n if (!account?.password) {\n throw new HTTPException(401, { message: AUTH_ERRORS.HAS_NO_PASSWORD });\n }\n\n const passwordValid = await verifyPassword(password, account.password);\n\n if (!passwordValid) {\n throw new HTTPException(401, { message: AUTH_ERRORS.INVALID_PASSWORD });\n }\n\n // Check verification status\n const isEmail = lookup.type === 'email';\n const isPhone = lookup.type === 'phone';\n const isVerified = isEmail\n ? lookup.user.emailVerified\n : lookup.user.phoneVerified;\n\n if (isEmail && config.email.verificationRequired && !isVerified) {\n // Send verification code\n const code = generateOtpCode(6);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.verificationExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: lookup.user.id,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: lookup.user.email!,\n });\n\n const emailProvider = new ResendEmailProvider(config.email.resend);\n await emailProvider.sendVerificationEmail(lookup.user.email!, code);\n\n return c.json({\n verificationId: verification.id,\n requiresVerification: true,\n });\n }\n\n if (isPhone && config.phone.verificationRequired && !isVerified) {\n // Send OTP\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.otpExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: lookup.user.id,\n type: 'phone-otp',\n code: hashedCode,\n expiresAt,\n to: lookup.user.phone!,\n });\n\n const smsProvider = new AfroSmsProvider(config.phone.smsConfig);\n await smsProvider.sendVerificationSms(lookup.user.phone!, code);\n\n return c.json({\n verificationId: verification.id,\n requiresVerification: true,\n });\n }\n\n // Enforce session limit\n if (config.session.maxPerUser) {\n await deleteOldestSessions(\n database,\n resolvedTenantId,\n lookup.user.id,\n config.session.maxPerUser,\n );\n }\n\n // Update last sign in\n await updateLastSignIn(database, resolvedTenantId, lookup.user.id);\n\n // Create session\n const sessionToken = crypto.randomUUID();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const session = await insertSession(database, {\n tenantId: resolvedTenantId,\n userId: lookup.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' },\n });\n // Set cookie\n setCookie(c, 'session_token', sessionToken, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(expiresAt),\n });\n\n return c.json({\n user: lookup.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 sessionToken,\n sessionExpiresAt: session.expiresAt,\n });\n};\n","import type { Database } from '../../../../types';\nimport { deleteSessionById } from './delete-session-by-id';\nimport { listSessionsForUser } from './list-sessions-for-user';\n\nexport const deleteOldestSessions = async (\n db: Database,\n tenantId: string,\n userId: string,\n keepCount: number,\n): Promise<void> => {\n const sessions = await listSessionsForUser(db, tenantId, userId);\n\n if (sessions.length <= keepCount) {\n return;\n }\n\n const toDelete = sessions.slice(0, sessions.length - keepCount);\n\n for (const session of toDelete) {\n await deleteSessionById(db, session.id);\n }\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const updateLastSignIn = (\n db: Database,\n tenantId: string,\n userId: string,\n) => {\n return db\n .update(usersInIam)\n .set({ lastSignInAt: new Date().toISOString(), loginAttempt: 0 })\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)));\n};\n","import { deleteCookie, getCookie } from 'hono/cookie';\nimport { deleteSessionById } from '../../db/orm/iam/sessions/delete-session-by-id';\nimport { findSessionByToken } from '../../db/orm/iam/sessions/find-session-by-token';\nimport { hashToken } from '../../lib/crypto';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\nexport const signOutHandler = async (c: any) => {\n const { config, database, tenantId } = c.var as AuthContext;\n ensureTenantId(config, tenantId); // Ensure tenantId is valid, but not used in this handler\n\n const sessionToken = getCookie(c, 'session_token');\n\n if (!sessionToken) {\n return c.json({ message: 'Signed out' });\n }\n\n const hashedToken = await hashToken(sessionToken, config.secret);\n const session = await findSessionByToken(database, hashedToken);\n\n if (session) {\n await deleteSessionById(database, session.id);\n }\n // Clear cookie\n deleteCookie(c, 'session_token', {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(0),\n });\n\n return c.json({ message: 'Signed out' });\n};\n","import { setCookie } from 'hono/cookie';\nimport { HTTPException } from 'hono/http-exception';\nimport { insertCredentialsAccount } from '../../db/orm/iam/accounts/insert-credentials-account';\nimport { insertSession } from '../../db/orm/iam/sessions/insert-session';\nimport { findUserByHandle } from '../../db/orm/iam/users/find-user-by-handle';\nimport { findUserByIdentifier } from '../../db/orm/iam/users/find-user-by-identifier';\nimport { insertUser } from '../../db/orm/iam/users/insert-user';\nimport { insertVerification } from '../../db/orm/iam/verifications/insert-verification';\nimport { AUTH_ERRORS } from '../../errors';\nimport { hashPassword, hashToken } from '../../lib/crypto';\nimport {\n addDuration,\n generateHandle,\n generateOtpCode,\n} from '../../lib/session';\nimport { ensureTenantId } from '../../lib/tenant';\nimport { AfroSmsProvider } from '../../providers/afro-sms';\nimport { ResendEmailProvider } from '../../providers/resend-email';\nimport type { AuthContext } from '../../types';\n\nexport const signUpHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId } = c.var as AuthContext;\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { email, phone, password, fullName, handle } = body;\n\n if (!(email || phone)) {\n throw new HTTPException(400, {\n message: 'Either email or phone is required',\n });\n }\n\n const identifier = email || phone!;\n const existing = await findUserByIdentifier(\n database,\n resolvedTenantId,\n identifier,\n );\n\n if (existing.user) {\n throw new HTTPException(409, { message: AUTH_ERRORS.USER_EXISTS });\n }\n // Create user\n const userHandle = handle || generateHandle(email || phone!);\n\n // Check handle uniqueness\n const existingHandle = await findUserByHandle(\n database,\n resolvedTenantId,\n userHandle,\n );\n if (existingHandle) {\n throw new HTTPException(409, { message: 'Handle already taken' });\n }\n\n const user = await insertUser(database, {\n tenantId: resolvedTenantId,\n fullName,\n handle: userHandle,\n email: email || null,\n phone: phone || null,\n emailVerified: email ? !config.email.verificationRequired : false,\n phoneVerified: phone ? !config.phone.verificationRequired : false,\n });\n\n // Create credentials account\n const passwordHash = await hashPassword(password);\n await insertCredentialsAccount(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n providerAccountId: identifier,\n password: passwordHash,\n });\n\n // Phone mode: send verification if required\n if (phone && config.phone.verificationRequired) {\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.otpExpiresIn);\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'phone-otp-sign-up',\n code: hashedCode,\n expiresAt,\n to: phone,\n });\n\n const smsProvider = new AfroSmsProvider(config.phone.smsConfig);\n await smsProvider.sendVerificationSms(phone, code);\n\n return c.json({\n user: { id: user.id, phone: phone },\n session: null,\n verificationId: verification.id,\n requiresVerification: true,\n });\n }\n\n // Email mode: send verification if required\n if (email && config.email.verificationRequired) {\n const code = generateOtpCode(6);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.verificationExpiresIn);\n\n const verification = await insertVerification(database, {\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: email,\n });\n\n const emailProvider = new ResendEmailProvider(config.email.resend);\n await emailProvider.sendVerificationEmail(email, code);\n\n return c.json({\n user: { id: user.id, email: email },\n session: null,\n verificationId: verification.id,\n requiresVerification: true,\n });\n }\n\n // Create session if verification not required\n const sessionToken = crypto.randomUUID();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const session = await insertSession(database, {\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-up' },\n });\n\n // Set cookie\n setCookie(c, 'session_token', sessionToken, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'Lax',\n path: '/',\n expires: new Date(expiresAt),\n });\n\n return c.json({\n 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 sessionToken,\n sessionExpiresAt: session.expiresAt,\n });\n};\n","import type { Database } from '../../../../types';\nimport { accountsInIam } from '../../../schema';\n\nexport const insertCredentialsAccount = (\n db: Database,\n data: {\n tenantId: string;\n userId: string;\n providerAccountId: string;\n password: string;\n },\n) => {\n return db.insert(accountsInIam).values({\n tenantId: data.tenantId,\n userId: data.userId,\n provider: 'credentials',\n providerAccountId: data.providerAccountId,\n password: data.password,\n });\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const findUserByHandle = (\n db: Database,\n tenantId: string,\n handle: string,\n) => {\n return db\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(\n and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.handle}) = lower(${handle})`,\n ),\n )\n .limit(1)\n .then(([user]) => (user as User) || null);\n};\n","import type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const insertUser = (\n db: Database,\n data: {\n tenantId: string;\n fullName: string;\n handle: string;\n email?: string | null;\n phone?: string | null;\n image?: string | null;\n emailVerified?: boolean;\n phoneVerified?: boolean;\n },\n) => {\n return db\n .insert(usersInIam)\n .values({\n tenantId: data.tenantId,\n fullName: data.fullName,\n handle: data.handle,\n email: data.email || null,\n phone: data.phone || null,\n image: data.image || null,\n emailVerified: Boolean(data.emailVerified),\n phoneVerified: Boolean(data.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 .then(([user]) => user as User);\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { markPendingAccountChangeApplied } from '../../db/orm/iam/account-changes/mark-pending-account-change-applied';\nimport { updateCredentialsProviderAccountId } from '../../db/orm/iam/accounts/update-credentials-provider-account-id';\nimport { deleteOtherSessions } from '../../db/orm/iam/sessions/delete-other-sessions';\nimport { updateUserEmail } from '../../db/orm/iam/users/update-user-email';\nimport { AUTH_ERRORS } from '../../errors';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const updateEmailHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, userId, user, session } =\n c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n if (!user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n // If user is changing (has existing email) and we have a session, delete other sessions\n if (user.email && session?.id) {\n await deleteOtherSessions(database, resolvedTenantId, userId, session.id);\n }\n\n const updatedUser = await updateUserEmail(\n database,\n resolvedTenantId,\n userId,\n body.email,\n );\n\n if (!updatedUser) {\n throw new HTTPException(404, { message: 'User not found' });\n }\n\n await markPendingAccountChangeApplied(\n database,\n resolvedTenantId,\n userId,\n 'email',\n body.email,\n );\n\n await updateCredentialsProviderAccountId(\n database,\n resolvedTenantId,\n userId,\n body.email,\n );\n\n return c.json({ user: updatedUser }, 200);\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountChangesInIam } from '../../../schema';\n\nexport const markPendingAccountChangeApplied = (\n db: Database,\n tenantId: string,\n userId: string,\n changeType: 'email' | 'phone',\n newValue: string,\n) => {\n const now = new Date().toISOString();\n const valueCondition =\n changeType === 'email'\n ? eq(accountChangesInIam.newEmail, newValue)\n : eq(accountChangesInIam.newPhone, newValue);\n\n return db\n .update(accountChangesInIam)\n .set({\n status: 'applied',\n confirmedAt: now,\n updatedAt: now,\n })\n .where(\n and(\n eq(accountChangesInIam.tenantId, tenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.changeType, changeType),\n eq(accountChangesInIam.status, 'pending'),\n valueCondition,\n ),\n );\n};\n","import { and, eq } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { accountsInIam } from '../../../schema';\n\nexport const updateCredentialsProviderAccountId = async (\n db: Database,\n tenantId: string,\n userId: string,\n providerAccountId: string,\n): Promise<boolean> => {\n const updated = await db\n .update(accountsInIam)\n .set({ providerAccountId })\n .where(\n and(\n eq(accountsInIam.tenantId, tenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n )\n .returning({ id: accountsInIam.id })\n .then(([row]) => row?.id);\n\n return Boolean(updated);\n};\n","import { and, eq, ne } from 'drizzle-orm';\nimport type { Database } from '../../../../types';\nimport { sessionsInIam } from '../../../schema';\n\nexport const deleteOtherSessions = (\n db: Database,\n tenantId: string,\n userId: string,\n currentSessionId: string,\n) => {\n return db\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n ne(sessionsInIam.id, currentSessionId),\n ),\n );\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const updateUserEmail = (\n db: Database,\n tenantId: string,\n userId: string,\n email: string,\n) => {\n return db\n .update(usersInIam)\n .set({\n email,\n emailVerified: true,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(usersInIam.id, userId), 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 .then(([user]) => (user as User) || null);\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { markPendingAccountChangeApplied } from '../../db/orm/iam/account-changes/mark-pending-account-change-applied';\nimport { updateCredentialsProviderAccountId } from '../../db/orm/iam/accounts/update-credentials-provider-account-id';\nimport { deleteOtherSessions } from '../../db/orm/iam/sessions/delete-other-sessions';\nimport { updateUserPhone } from '../../db/orm/iam/users/update-user-phone';\nimport { AUTH_ERRORS } from '../../errors';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const updatePhoneHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, userId, user, session } =\n c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n if (!user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n // If user is changing (has existing phone) and we have a session, delete other sessions\n if (user.phone && session?.id) {\n await deleteOtherSessions(database, resolvedTenantId, userId, session.id);\n }\n\n const updatedUser = await updateUserPhone(\n database,\n resolvedTenantId,\n userId,\n body.phone,\n );\n\n if (!updatedUser) {\n throw new HTTPException(404, { message: 'User not found' });\n }\n\n await markPendingAccountChangeApplied(\n database,\n resolvedTenantId,\n userId,\n 'phone',\n body.phone,\n );\n\n await updateCredentialsProviderAccountId(\n database,\n resolvedTenantId,\n userId,\n body.phone,\n );\n\n return c.json({ user: updatedUser }, 200);\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\nexport const updateUserPhone = (\n db: Database,\n tenantId: string,\n userId: string,\n phone: string,\n) => {\n return db\n .update(usersInIam)\n .set({\n phone,\n phoneVerified: true,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(usersInIam.id, userId), 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 .then(([user]) => (user as User) || null);\n};\n","import { HTTPException } from 'hono/http-exception';\nimport { updateUserProfile } from '../../db/orm/iam/users/update-user-profile';\nimport { AUTH_ERRORS } from '../../errors';\nimport { ensureTenantId } from '../../lib/tenant';\nimport type { AuthContext } from '../../types';\n\n// biome-ignore lint/suspicious/noExplicitAny: Hono context type\nexport const updateProfileHandler = async (c: any) => {\n const body = c.req.valid('json');\n const { config, database, tenantId, userId, user } = c.var as AuthContext;\n\n if (!userId) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n if (!user) {\n throw new HTTPException(401, { message: AUTH_ERRORS.UNAUTHORIZED });\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const updatedUser = await updateUserProfile(\n database,\n resolvedTenantId,\n userId,\n body,\n );\n\n if (!updatedUser) {\n throw new HTTPException(404, { message: 'User not found' });\n }\n\n return c.json({ user: updatedUser }, 200);\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database, User } from '../../../../types';\nimport { usersInIam } from '../../../schema';\n\ntype UpdateUserProfileData = {\n fullName?: string;\n};\n\nexport const updateUserProfile = async (\n db: Database,\n tenantId: string,\n userId: string,\n data: UpdateUserProfileData,\n) => {\n const updateData: Partial<typeof usersInIam.$inferInsert> = {};\n\n if (data.fullName !== undefined) {\n updateData.fullName = data.fullName;\n }\n\n return await db\n .update(usersInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(usersInIam.id, userId), 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 .then(([user]) => (user as User) || null);\n};\n","import { createDatabase } from './db';\nimport { findSessionByToken } from './db/orm/iam/sessions/find-session-by-token';\nimport { findUserById } from './db/orm/iam/users/find-user-by-id';\nimport { createAuthHandler, createAuthRoutes } from './handler';\nimport { hashToken } from './lib/crypto';\nimport type { AuthConfig, Session, User } from './types';\n\nexport type { AuthConfig, Session, User } from './types';\n\nexport type JiretAuth = {\n handler: ReturnType<typeof createAuthHandler>;\n routes: ReturnType<typeof createAuthRoutes>;\n getSession: (headers: Headers) => Promise<{\n session: Session | null;\n user: User | null;\n sessionToken: string | null;\n }>;\n};\n\nexport const jiretAuth = (config: AuthConfig): JiretAuth => {\n const handler = createAuthHandler(config);\n const routes = createAuthRoutes(config);\n const database = createDatabase(config.connectionString);\n\n const getSession = async (\n headers: Headers,\n ): Promise<{\n session: Session | null;\n user: User | null;\n sessionToken: string | null;\n }> => {\n const cookieHeader = headers.get('cookie');\n if (!cookieHeader) {\n return { session: null, user: null, sessionToken: null };\n }\n\n const cookies = Object.fromEntries(\n cookieHeader.split('; ').map((c) => {\n const [key, ...rest] = c.split('=');\n return [key, rest.join('=')];\n }),\n );\n\n const sessionToken = cookies.session_token;\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 findSessionByToken(database, hashedToken);\n\n if (!session) {\n return { session: null, user: null, sessionToken: null };\n }\n\n const user = await findUserById(\n database,\n session.tenantId,\n session.userId,\n );\n\n if (!user) {\n return { session: null, user: null, sessionToken: null };\n }\n\n return { session, user, sessionToken };\n } catch {\n return { session: null, user: null, sessionToken: null };\n }\n };\n\n return {\n handler,\n routes,\n getSession,\n };\n};\n"],"mappings":"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","names":["and","eq","sql","sql","and","eq","OpenAPIHono","getCookie","HTTPException","z","HTTPException","and","eq","and","eq","and","eq","gt","and","eq","gt","and","desc","eq","gt","and","eq","gt","desc","HTTPException","and","eq","sql","sql","and","eq","and","eq","sql","sql","and","eq","user","HTTPException","and","eq","and","eq","eq","eq","eq","eq","eq","eq","HTTPException","HTTPException","and","eq","and","eq","and","eq","and","eq","text","text","HTTPException","HTTPException","HTTPException","and","eq","and","eq","and","eq","and","eq","eq","eq","and","eq","gt","and","eq","gt","HTTPException","setCookie","HTTPException","HTTPException","session","setCookie","HTTPException","HTTPException","setCookie","HTTPException","HTTPException","setCookie","HTTPException","HTTPException","setCookie","HTTPException","and","eq","and","eq","HTTPException","expiresAt","setCookie","getCookie","getCookie","setCookie","HTTPException","and","eq","sql","and","eq","sql","HTTPException","expiresAt","setCookie","HTTPException","and","eq","eq","and","and","eq","and","eq","and","eq","and","eq","and","eq","sql","sql","and","eq","HTTPException","HTTPException","and","eq","sql","sql","and","eq","HTTPException","HTTPException","and","eq","sql","sql","and","eq","HTTPException","z","getCookie","HTTPException","OpenAPIHono","createAuthRoutes","createAuthRoutes"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/db/index.ts","../src/db/relations.ts","../src/db/schema.ts","../src/handler.ts","../src/db/orm/session.ts","../src/db/orm/tenant.ts","../src/db/orm/user.ts","../src/lib/cookie.ts","../src/lib/crypto.ts","../src/routes/index.ts","../src/routes/auth/auth.route.ts","../src/routes/auth.schema.ts","../src/routes/auth/handler/check-user.ts","../src/lib/tenant.ts","../src/routes/auth/handler/sign-in.ts","../src/errors.ts","../src/lib/normalize-user.ts","../src/lib/session.ts","../src/routes/auth/helper/session.ts","../src/routes/auth/helper/user.ts","../src/routes/auth/helper/verification.ts","../src/routes/auth/handler/sign-out.ts","../src/db/transaction.ts","../src/routes/auth/handler/sign-up.ts","../src/routes/domains/domains.route.ts","../src/routes/domains/domains.schema.ts","../src/routes/domains/handler/create-domain.ts","../src/routes/domains/handler/delete-domain.ts","../src/routes/domains/handler/get-domain.ts","../src/routes/domains/handler/list-domains.ts","../src/routes/domains/handler/update-domain.ts","../src/routes/domains/handler/verify-domain.ts","../src/routes/email/email.route.ts","../src/routes/email/handler/verification-confirm.ts","../src/routes/email/handler/verification-request.ts","../src/routes/password/password.route.ts","../src/routes/password/handler/change.ts","../src/routes/password/handler/forgot.ts","../src/routes/password/handler/reset.ts","../src/routes/password/helper/session.ts","../src/routes/password/handler/verify.ts","../src/routes/permissions/permissions.route.ts","../src/routes/permissions/handler/get-permission.ts","../src/routes/permissions/handler/list-permissions.ts","../src/routes/permissions/permissions.schema.ts","../src/routes/phone/phone.route.ts","../src/routes/phone/handler/verification-confirm.ts","../src/routes/phone/helper/session.ts","../src/routes/phone/handler/verification-request.ts","../src/routes/profile/profile.route.ts","../src/routes/profile/handler/account-change-pending.ts","../src/routes/profile/handler/me.ts","../src/routes/profile/handler/session.ts","../src/routes/profile/handler/update.ts","../src/routes/profile/handler/update-email.ts","../src/routes/profile/handler/update-phone.ts","../src/routes/role-permissions/role-permissions.route.ts","../src/routes/role-permissions/handler/assign-role-permission.ts","../src/routes/role-permissions/handler/list-role-permissions.ts","../src/routes/role-permissions/handler/revoke-role-permission.ts","../src/routes/role-permissions/role-permissions.schema.ts","../src/routes/roles/roles.route.ts","../src/routes/roles/handler/create-role.ts","../src/routes/roles/handler/delete-role.ts","../src/routes/roles/handler/get-role.ts","../src/routes/roles/handler/list-roles.ts","../src/routes/roles/handler/update-role.ts","../src/routes/roles/roles.schema.ts","../src/routes/sessions/sessions.route.ts","../src/routes/sessions/handler/get-session.ts","../src/routes/sessions/handler/list-sessions.ts","../src/routes/sessions/handler/revoke-all-sessions.ts","../src/routes/sessions/handler/revoke-session.ts","../src/routes/sessions/sessions.schema.ts","../src/routes/tenants/tenants.route.ts","../src/routes/tenants/handler/create-tenant.ts","../src/routes/tenants/handler/delete-tenant.ts","../src/routes/tenants/handler/get-tenant.ts","../src/routes/tenants/handler/list-tenants.ts","../src/routes/tenants/handler/update-tenant.ts","../src/routes/tenants/tenants.schema.ts","../src/routes/user-roles/user-roles.route.ts","../src/routes/user-roles/handler/assign-user-role.ts","../src/routes/user-roles/handler/list-user-roles.ts","../src/routes/user-roles/handler/revoke-user-role.ts","../src/routes/user-roles/user-roles.schema.ts","../src/routes/users/users.route.ts","../src/routes/users/handler/ban-user.ts","../src/routes/users/helper/user.ts","../src/routes/users/handler/create-user.ts","../src/routes/users/handler/delete-user.ts","../src/routes/users/handler/get-user.ts","../src/routes/users/handler/list-users.ts","../src/routes/users/handler/search-users.ts","../src/routes/users/handler/update-user.ts","../src/routes/users/users.schema.ts","../src/routes/verifications/verifications.route.ts","../src/routes/verifications/handler/invalidate-verification.ts","../src/routes/verifications/handler/list-verifications.ts","../src/routes/verifications/verifications.schema.ts","../src/utility/set-auth-context.ts","../src/lib/docs.ts","../src/lib/openapi-config.ts","../src/middlewares/session-middleware.ts","../src/middlewares/tenant-middleware.ts","../src/session.ts","../src/types/index.ts","../src/lib/cleanup.ts"],"sourcesContent":["import { deepmerge } from 'deepmerge-ts';\nimport { createDatabase } from './db';\nimport { createAuthRoutes } from './handler';\nimport { createDocsHandler } from './lib/docs';\nimport { createOpenApiConfig } from './lib/openapi-config';\nimport { createSessionMiddleware } from './middlewares/session-middleware';\nimport { createTenantMiddleware } from './middlewares/tenant-middleware';\nimport { createGetSession } from './session';\nimport { type AuthConfig, defaultAuthConfig, type MesobAuth } from './types';\n\nexport { createDatabase, type Database } from './db';\nexport type { Tenant } from './db/orm/tenant';\nexport {\n cleanupExpiredData,\n cleanupExpiredSessions,\n cleanupExpiredVerifications,\n} from './lib/cleanup';\nexport { createSessionMiddleware } from './middlewares/session-middleware';\nexport { createTenantMiddleware } from './middlewares/tenant-middleware';\nexport type {\n AuthConfig,\n MesobAuth,\n SendVerificationOTPParams,\n Session,\n User,\n} from './types';\n\nexport const createMesobAuth = (authConfig: AuthConfig): MesobAuth => {\n const config = deepmerge(\n { ...defaultAuthConfig } as AuthConfig,\n authConfig,\n ) as AuthConfig;\n\n if (!config.secret || config.secret.length === 0) {\n throw new Error(\n 'AUTH_SECRET is required and must be a non-empty string. Please set AUTH_SECRET environment variable.',\n );\n }\n\n const database = createDatabase(config.connectionString);\n const routesApp = createAuthRoutes({ config, database });\n\n const basePath = config.basePath || '';\n const openApiPath = `${basePath}/openapi.json`;\n const enableDocs = config.docs?.enabled ?? true;\n\n // Add OpenAPI docs endpoints to routes if enabled\n if (enableDocs) {\n routesApp.doc('/openapi.json', createOpenApiConfig(config));\n routesApp.get(\n '/docs',\n createDocsHandler({\n title: config.docs?.title || 'Mesob IAM API Reference',\n theme: config.docs?.theme || 'saturn',\n openApiPath,\n }),\n );\n }\n\n const getSession = createGetSession(database, config);\n const tenantMiddleware = createTenantMiddleware(database, config);\n const sessionMiddleware = createSessionMiddleware();\n\n // Wrap routes app to handle basePath stripping\n const routes = {\n ...routesApp,\n fetch: async (request: Request, env?: unknown) => {\n // Strip basePath from request URL if it exists\n if (basePath && request.url) {\n const url = new URL(request.url);\n if (url.pathname.startsWith(basePath)) {\n url.pathname = url.pathname.slice(basePath.length) || '/';\n const modifiedRequest = new Request(url, request);\n return await routesApp.fetch(modifiedRequest, env);\n }\n }\n return await routesApp.fetch(request, env);\n },\n };\n\n return {\n routes: routes as typeof routesApp,\n getSession,\n tenantMiddleware,\n sessionMiddleware,\n };\n};\n","import { drizzle } from 'drizzle-orm/node-postgres';\nimport { Pool } from 'pg';\nimport * as relations from './relations';\nimport * as schema from './schema';\n\nconst schemaConfig = { schema: { ...schema, ...relations } };\n\nexport const createDatabase = (connectionString: string) => {\n const pool = new Pool({ connectionString });\n return drizzle({ client: pool, ...schemaConfig });\n};\n\nexport type Database = ReturnType<typeof createDatabase>;\n","import { relations } from \"drizzle-orm/relations\";\nimport { tenantsInIam, usersInIam, sessionsInIam, verificationsInIam, accountChangesInIam, rolesInIam, permissionsInIam, rolePermissionsInIam, userRolesInIam, accountsInIam, domainsInIam } from \"./schema\";\n\nexport const usersInIamRelations = relations(usersInIam, ({one, many}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [usersInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tsessionsInIam: many(sessionsInIam),\n\tverificationsInIam: many(verificationsInIam),\n\taccountChangesInIam: many(accountChangesInIam),\n\tuserRolesInIam: many(userRolesInIam),\n\taccountsInIam: many(accountsInIam),\n}));\n\nexport const tenantsInIamRelations = relations(tenantsInIam, ({many}) => ({\n\tusersInIam: many(usersInIam),\n\tsessionsInIam: many(sessionsInIam),\n\tverificationsInIam: many(verificationsInIam),\n\taccountChangesInIam: many(accountChangesInIam),\n\trolesInIam: many(rolesInIam),\n\trolePermissionsInIam: many(rolePermissionsInIam),\n\tuserRolesInIam: many(userRolesInIam),\n\taccountsInIam: many(accountsInIam),\n\tdomainsInIam: many(domainsInIam),\n}));\n\nexport const sessionsInIamRelations = relations(sessionsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [sessionsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [sessionsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const verificationsInIamRelations = relations(verificationsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [verificationsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [verificationsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const accountChangesInIamRelations = relations(accountChangesInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [accountChangesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [accountChangesInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const rolesInIamRelations = relations(rolesInIam, ({one, many}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [rolesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\trolePermissionsInIam: many(rolePermissionsInIam),\n\tuserRolesInIam: many(userRolesInIam),\n}));\n\nexport const rolePermissionsInIamRelations = relations(rolePermissionsInIam, ({one}) => ({\n\tpermissionsInIam: one(permissionsInIam, {\n\t\tfields: [rolePermissionsInIam.permissionId],\n\t\treferences: [permissionsInIam.id]\n\t}),\n\trolesInIam: one(rolesInIam, {\n\t\tfields: [rolePermissionsInIam.roleId],\n\t\treferences: [rolesInIam.id]\n\t}),\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [rolePermissionsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n}));\n\nexport const permissionsInIamRelations = relations(permissionsInIam, ({many}) => ({\n\trolePermissionsInIam: many(rolePermissionsInIam),\n}));\n\nexport const userRolesInIamRelations = relations(userRolesInIam, ({one}) => ({\n\trolesInIam: one(rolesInIam, {\n\t\tfields: [userRolesInIam.roleId],\n\t\treferences: [rolesInIam.id]\n\t}),\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [userRolesInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [userRolesInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const accountsInIamRelations = relations(accountsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [accountsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n\tusersInIam: one(usersInIam, {\n\t\tfields: [accountsInIam.userId],\n\t\treferences: [usersInIam.id]\n\t}),\n}));\n\nexport const domainsInIamRelations = relations(domainsInIam, ({one}) => ({\n\ttenantsInIam: one(tenantsInIam, {\n\t\tfields: [domainsInIam.tenantId],\n\t\treferences: [tenantsInIam.id]\n\t}),\n}));","import { pgTable, pgSchema, uniqueIndex, foreignKey, unique, pgPolicy, check, uuid, varchar, timestamp, text, boolean, smallint, index, inet, jsonb } from \"drizzle-orm/pg-core\"\nimport { sql } from \"drizzle-orm\"\n\nexport const iam = pgSchema(\"iam\");\n\n\nexport const usersInIam = iam.table(\"users\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tfullName: text(\"full_name\").notNull(),\n\timage: text(),\n\tphone: text(),\n\temail: text(),\n\thandle: text().notNull(),\n\temailVerified: boolean(\"email_verified\").default(false).notNull(),\n\tphoneVerified: boolean(\"phone_verified\").default(false).notNull(),\n\tbannedUntil: timestamp(\"banned_until\", { withTimezone: true, mode: 'string' }),\n\tlastSignInAt: timestamp(\"last_sign_in_at\", { withTimezone: true, mode: 'string' }),\n\tloginAttempt: smallint(\"login_attempt\").default(0).notNull(),\n}, (table) => [\n\tuniqueIndex(\"users_tenant_lower_email_idx\").using(\"btree\", sql`tenant_id`, sql`lower(email)`),\n\tuniqueIndex(\"users_tenant_lower_handle_idx\").using(\"btree\", sql`tenant_id`, sql`lower(handle)`),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"users_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"users_tenant_phone_key\").on(table.tenantId, table.phone),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"users_contact_required_check\", sql`(email IS NOT NULL) OR (phone IS NOT NULL)`),\n\tcheck(\"users_login_attempt_nonnegative_check\", sql`login_attempt >= 0`),\n]);\n\nexport const sessionsInIam = iam.table(\"sessions\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }).notNull(),\n\tuserAgent: text(\"user_agent\"),\n\tip: inet(),\n\tmeta: jsonb(),\n\ttoken: text().notNull(),\n\trotatedAt: timestamp(\"rotated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`),\n}, (table) => [\n\tindex(\"sessions_expires_at_idx\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"timestamptz_ops\")),\n\tindex(\"sessions_tenant_user_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.userId.asc().nullsLast().op(\"uuid_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"sessions_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"sessions_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"sessions_token_key\").on(table.token),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"sessions_expires_after_created_check\", sql`expires_at > created_at`),\n]);\n\nexport const verificationsInIam = iam.table(\"verifications\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\tcode: text().notNull(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }).notNull(),\n\ttype: text(),\n\tattempt: smallint().default(0),\n\tto: text(),\n}, (table) => [\n\tindex(\"verifications_expires_at_idx\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"timestamptz_ops\")),\n\tindex(\"verifications_lookup_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.userId.asc().nullsLast().op(\"text_ops\"), table.type.asc().nullsLast().op(\"uuid_ops\"), table.to.asc().nullsLast().op(\"text_ops\"), table.code.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"verifications_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"verifications_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"verifications_attempt_nonnegative_check\", sql`attempt >= 0`),\n\tcheck(\"verifications_expires_after_created_check\", sql`expires_at > created_at`),\n]);\n\nexport const accountChangesInIam = iam.table(\"account_changes\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tchangeType: text(\"change_type\").notNull(),\n\toldEmail: varchar(\"old_email\"),\n\tnewEmail: varchar(\"new_email\"),\n\toldPhone: text(\"old_phone\"),\n\tnewPhone: text(\"new_phone\"),\n\tstatus: varchar().notNull(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }).notNull(),\n\tconfirmedAt: timestamp(\"confirmed_at\", { withTimezone: true, mode: 'string' }),\n\tcancelledAt: timestamp(\"cancelled_at\", { withTimezone: true, mode: 'string' }),\n\treason: text(),\n}, (table) => [\n\tindex(\"account_changes_expires_at_idx\").using(\"btree\", table.expiresAt.asc().nullsLast().op(\"timestamptz_ops\")),\n\tindex(\"account_changes_tenant_user_status_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"uuid_ops\"), table.userId.asc().nullsLast().op(\"text_ops\"), table.status.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"account_changes_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"account_changes_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"account_changes_change_type_check\", sql`((change_type = 'email'::text) AND (old_email IS NOT NULL) AND (new_email IS NOT NULL) AND (old_phone IS NULL) AND (new_phone IS NULL)) OR ((change_type = 'phone'::text) AND (old_phone IS NOT NULL) AND (new_phone IS NOT NULL) AND (old_email IS NULL) AND (new_email IS NULL))`),\n\tcheck(\"account_changes_expires_after_created_check\", sql`expires_at > created_at`),\n\tcheck(\"account_changes_status_check\", sql`(status)::text = ANY ((ARRAY['pending'::character varying, 'applied'::character varying, 'cancelled'::character varying, 'expired'::character varying])::text[])`),\n]);\n\nexport const tenantsInIam = iam.table(\"tenants\", {\n\tid: varchar({ length: 30 }).primaryKey().notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tname: jsonb().notNull(),\n\tdescription: jsonb(),\n\ttheme: jsonb(),\n\tsupportedLanguages: jsonb(\"supported_languages\"),\n\tdefaultLanguage: text(\"default_language\"),\n\tsupportedCurrency: jsonb(\"supported_currency\"),\n\tdefaultCurrency: text(\"default_currency\"),\n\ttimezone: text(),\n\tisActive: boolean(\"is_active\").default(true).notNull(),\n\tlocale: jsonb(),\n\tsettings: jsonb(),\n\tseo: jsonb(),\n}, (table) => [\n\tindex(\"tenants_is_active_idx\").using(\"btree\", table.isActive.asc().nullsLast().op(\"bool_ops\")),\n]);\n\nexport const rolesInIam = iam.table(\"roles\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tname: jsonb().notNull(),\n\tdescription: jsonb().notNull(),\n\tcode: text().notNull(),\n}, (table) => [\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"roles_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"roles_tenant_code_unique\").on(table.tenantId, table.code),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const permissionsInIam = iam.table(\"permissions\", {\n\tid: text().primaryKey().notNull(),\n\tdescription: jsonb().notNull(),\n\tactivity: text().notNull(),\n\tapplication: text().notNull(),\n\tfeature: text().notNull(),\n}, (table) => [\n\tunique(\"permissions_activity_application_feature_key\").on(table.activity, table.application, table.feature),\n]);\n\nexport const rolePermissionsInIam = iam.table(\"role_permissions\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\troleId: uuid(\"role_id\").notNull(),\n\tpermissionId: text(\"permission_id\").notNull(),\n}, (table) => [\n\tforeignKey({\n\t\t\tcolumns: [table.permissionId],\n\t\t\tforeignColumns: [permissionsInIam.id],\n\t\t\tname: \"role_permissions_permission_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.roleId],\n\t\t\tforeignColumns: [rolesInIam.id],\n\t\t\tname: \"role_permissions_role_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"role_permissions_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"role_permissions_unique\").on(table.roleId, table.permissionId),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const userRolesInIam = iam.table(\"user_roles\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\troleId: uuid(\"role_id\").notNull(),\n}, (table) => [\n\tforeignKey({\n\t\t\tcolumns: [table.roleId],\n\t\t\tforeignColumns: [rolesInIam.id],\n\t\t\tname: \"user_roles_role_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"user_roles_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"user_roles_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"user_roles_unique\").on(table.userId, table.roleId),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const accountsInIam = iam.table(\"accounts\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tuserId: uuid(\"user_id\").notNull(),\n\tprovider: text().notNull(),\n\tproviderAccountId: text(\"provider_account_id\").notNull(),\n\tpassword: text(),\n\tpasswordLastChangedAt: timestamp(\"password_last_changed_at\", { withTimezone: true, mode: 'string' }),\n\tidToken: text(\"id_token\"),\n\taccessToken: text(\"access_token\"),\n\taccessTokenExpiresAt: timestamp(\"access_token_expires_at\", { withTimezone: true, mode: 'string' }),\n\trefreshToken: text(\"refresh_token\"),\n\trefreshTokenExpiresAt: timestamp(\"refresh_token_expires_at\", { withTimezone: true, mode: 'string' }),\n\tscope: text(),\n\texpiresAt: timestamp(\"expires_at\", { withTimezone: true, mode: 'string' }),\n\tmeta: jsonb(),\n}, (table) => [\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"accounts_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tforeignKey({\n\t\t\tcolumns: [table.userId],\n\t\t\tforeignColumns: [usersInIam.id],\n\t\t\tname: \"accounts_user_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tunique(\"accounts_tenant_provider_account_unique\").on(table.tenantId, table.provider, table.providerAccountId),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n]);\n\nexport const domainsInIam = iam.table(\"domains\", {\n\tid: uuid().default(sql`uuid_generate_v7()`).primaryKey().notNull(),\n\ttenantId: varchar(\"tenant_id\", { length: 30 }).notNull(),\n\tdomain: text().notNull(),\n\tstatus: text().default('pending').notNull(),\n\tmeta: jsonb(),\n\tisPrimary: boolean(\"is_primary\").default(false).notNull(),\n\tcreatedAt: timestamp(\"created_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n\tupdatedAt: timestamp(\"updated_at\", { withTimezone: true, mode: 'string' }).default(sql`CURRENT_TIMESTAMP`).notNull(),\n}, (table) => [\n\tuniqueIndex(\"domains_domain_unique_idx\").using(\"btree\", sql`lower(domain)`),\n\tuniqueIndex(\"domains_primary_per_tenant_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\")).where(sql`(is_primary = true)`),\n\tindex(\"domains_tenant_id_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\")),\n\tindex(\"domains_tenant_status_idx\").using(\"btree\", table.tenantId.asc().nullsLast().op(\"text_ops\"), table.status.asc().nullsLast().op(\"text_ops\")),\n\tforeignKey({\n\t\t\tcolumns: [table.tenantId],\n\t\t\tforeignColumns: [tenantsInIam.id],\n\t\t\tname: \"domains_tenant_id_fkey\"\n\t\t}).onUpdate(\"cascade\").onDelete(\"cascade\"),\n\tpgPolicy(\"tenant_isolation\", { as: \"permissive\", for: \"all\", to: [\"public\"], using: sql`((tenant_id)::text = (iam.current_tenant_id())::text)`, withCheck: sql`((tenant_id)::text = (iam.current_tenant_id())::text)` }),\n\tcheck(\"domains_domain_format_check\", sql`domain ~ '^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)+$'::text`),\n\tcheck(\"domains_status_check\", sql`status = ANY (ARRAY['pending'::text, 'active'::text, 'disabled'::text, 'deleted'::text])`),\n]);\n","import { OpenAPIHono } from '@hono/zod-openapi';\nimport { getCookie } from 'hono/cookie';\nimport { fetchSessionByToken, fetchUserWithRoles } from './db/orm';\nimport { getSessionCookieName } from './lib/cookie';\nimport { hashToken } from './lib/crypto';\nimport routes from './routes';\nimport type { AuthConfig, CreateAuthRoutesOptions, Database } from './types';\nimport type { AuthContext, AuthEnv } from './types/context';\nimport { setAuthContext } from './utility/set-auth-context';\n\nconst loadSession = async ({\n c,\n sessionToken,\n database,\n config,\n}: {\n c: AuthContext;\n sessionToken: string;\n database: Database;\n config: AuthConfig;\n}): Promise<void> => {\n try {\n const hashedToken = await hashToken(sessionToken, config.secret);\n const session = await fetchSessionByToken({\n database,\n hashedToken,\n tenantId: config.tenant?.tenantId || 'tenant',\n });\n if (!session) {\n return;\n }\n const user = await fetchUserWithRoles({\n database,\n userId: session.userId,\n tenantId: session.tenantId,\n });\n if (user) {\n setAuthContext({\n c,\n config,\n database,\n user,\n session,\n });\n }\n } catch {\n // Invalid session, continue without user\n }\n};\n\nconst createAuthMiddleware = ({\n config,\n database,\n}: {\n config: AuthConfig;\n database: Database;\n}) => {\n return async (c: AuthContext, next: () => Promise<void>) => {\n const path = c.req.path;\n const isDocsEndpoint = path === '/docs' || path === '/openapi.json';\n\n if (isDocsEndpoint) {\n setAuthContext({ c, config, database });\n return await next();\n }\n\n setAuthContext({ c, config, database });\n\n const sessionToken = getCookie(c, getSessionCookieName(config));\n if (sessionToken) {\n await loadSession({\n c,\n sessionToken,\n database,\n config,\n });\n }\n\n await next();\n };\n};\n\nexport const createAuthRoutes = ({\n config,\n database,\n}: CreateAuthRoutesOptions) => {\n const app = new OpenAPIHono<AuthEnv>();\n\n app.use(\n '*',\n createAuthMiddleware({\n config,\n database,\n }),\n );\n\n app.route('/', routes);\n return app;\n};\n","import { and, eq, gt } from 'drizzle-orm';\nimport type { Session, SessionMeta } from '../../types';\nimport { sessionsInIam } from '../schema';\nimport type {\n DeleteSessionByTokenParams,\n DeleteSessionParams,\n DeleteUserSessionsParams,\n FetchSessionByTokenParams,\n UpdateSessionExpiryParams,\n} from './types';\n\nexport const fetchSessionByToken = async ({\n database,\n hashedToken,\n tenantId,\n}: FetchSessionByTokenParams): Promise<Session | null> => {\n const [sessionResult] = await database\n .select({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n meta: sessionsInIam.meta,\n })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.token, hashedToken),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n eq(sessionsInIam.tenantId, tenantId),\n ),\n )\n .limit(1);\n\n if (!sessionResult) {\n return null;\n }\n\n return {\n ...sessionResult,\n meta: sessionResult.meta as SessionMeta | null,\n };\n};\n\n/**\n * Update session expiry time (for session refresh)\n */\nexport const updateSessionExpiry = async ({\n database,\n sessionId,\n tenantId,\n expiresAt,\n}: UpdateSessionExpiryParams): Promise<void> => {\n await database\n .update(sessionsInIam)\n .set({\n expiresAt,\n updatedAt: new Date().toISOString(),\n })\n .where(\n and(\n eq(sessionsInIam.id, sessionId),\n eq(sessionsInIam.tenantId, tenantId),\n ),\n );\n};\n\n/**\n * Delete a session by ID\n */\nexport const deleteSession = async ({\n database,\n sessionId,\n tenantId,\n}: DeleteSessionParams): Promise<void> => {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.id, sessionId),\n eq(sessionsInIam.tenantId, tenantId),\n ),\n );\n};\n\n/**\n * Delete a session by hashed token\n */\nexport const deleteSessionByToken = async ({\n database,\n hashedToken,\n tenantId,\n}: DeleteSessionByTokenParams): Promise<void> => {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.token, hashedToken),\n eq(sessionsInIam.tenantId, tenantId),\n ),\n );\n};\n\n/**\n * Delete all sessions for a user\n */\nexport const deleteUserSessions = async ({\n database,\n userId,\n tenantId,\n}: DeleteUserSessionsParams): Promise<void> => {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.userId, userId),\n eq(sessionsInIam.tenantId, tenantId),\n ),\n );\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { Database } from '../index';\nimport { domainsInIam, tenantsInIam } from '../schema';\n\nexport const findTenantByDomain = async (\n database: Database,\n hostname: string,\n): Promise<string | null> => {\n const lowerHostname = hostname.toLowerCase();\n const [domain] = await database\n .select({\n tenantId: domainsInIam.tenantId,\n })\n .from(domainsInIam)\n .where(\n and(\n sql`lower(${domainsInIam.domain}) = ${lowerHostname}`,\n eq(domainsInIam.status, 'active'),\n ),\n )\n .limit(1);\n\n return domain?.tenantId || null;\n};\n\nexport type Tenant = {\n id: string;\n name: unknown;\n description: unknown;\n isActive: boolean;\n};\n\nexport const findTenantById = async (\n database: Database,\n tenantId: string,\n): Promise<Tenant | null> => {\n const [tenant] = await database\n .select({\n id: tenantsInIam.id,\n name: tenantsInIam.name,\n description: tenantsInIam.description,\n isActive: tenantsInIam.isActive,\n })\n .from(tenantsInIam)\n .where(eq(tenantsInIam.id, tenantId))\n .limit(1);\n\n return tenant || null;\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport type { User } from '../../types';\nimport { rolesInIam, userRolesInIam, usersInIam } from '../schema';\nimport type { FetchUserWithRolesParams } from './types';\n\nexport const fetchUserWithRoles = async ({\n database,\n userId,\n tenantId,\n}: FetchUserWithRolesParams): Promise<User | null> => {\n const [userResult] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\n `,\n })\n .from(usersInIam)\n .leftJoin(\n userRolesInIam,\n and(\n eq(userRolesInIam.userId, usersInIam.id),\n eq(userRolesInIam.tenantId, tenantId),\n ),\n )\n .leftJoin(\n rolesInIam,\n and(\n eq(userRolesInIam.roleId, rolesInIam.id),\n eq(rolesInIam.tenantId, tenantId),\n ),\n )\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .groupBy(usersInIam.id)\n .limit(1);\n return (userResult as User) || null;\n};\n","import type { Context } from 'hono';\nimport { deleteCookie as honoDel, setCookie as honoSet } from 'hono/cookie';\nimport type { AuthConfig } from '../types';\n\nconst isProduction = process.env.NODE_ENV === 'production';\n\nexport const getSessionCookieName = (config: AuthConfig): string => {\n const prefix = config.cookie?.prefix || '';\n const baseName = 'session_token';\n if (prefix) {\n return `${prefix}_${baseName}`;\n }\n return isProduction ? '__Host-session_token' : baseName;\n};\n\nexport type CookieOptions = {\n expires?: Date;\n path?: string;\n};\n\nexport const setSessionCookie = (\n c: Context,\n token: string,\n config: AuthConfig,\n options: CookieOptions,\n) => {\n const cookieName = getSessionCookieName(config);\n const cookieOptions = {\n httpOnly: true,\n secure: isProduction,\n sameSite: 'Lax' as const,\n path: options.path || '/',\n expires: options.expires,\n ...(isProduction && { domain: undefined }), // __Host- requires no domain\n };\n\n honoSet(c, cookieName, token, cookieOptions);\n};\n\nexport const deleteSessionCookie = (c: Context, config: AuthConfig) => {\n const cookieName = getSessionCookieName(config);\n honoDel(c, cookieName, {\n httpOnly: true,\n secure: isProduction,\n sameSite: 'Lax' as const,\n path: '/',\n expires: new Date(0),\n });\n};\n","import { scrypt } from '@noble/hashes/scrypt.js';\nimport { randomBytes } from '@noble/hashes/utils.js';\n\nconst encoder = new TextEncoder();\n\nconst randomHex = (bytes: number) => {\n const arr = randomBytes(bytes);\n return Array.from(arr, (b: number) => b.toString(16).padStart(2, '0')).join(\n '',\n );\n};\n\nconst toHex = (buffer: Uint8Array) => {\n return Array.from(buffer, (b: number) =>\n b.toString(16).padStart(2, '0'),\n ).join('');\n};\n\nconst hexToBytes = (hex: string): Uint8Array => {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = Number.parseInt(hex.slice(i, i + 2), 16);\n }\n return bytes;\n};\n\nconst SCRYPT_KEYLEN = 64;\nconst SCRYPT_COST = 16384;\nconst SCRYPT_BLOCK_SIZE = 8;\nconst SCRYPT_PARALLELISM = 1;\n\nexport const hashPassword = async (password: string) => {\n const salt = randomBytes(16);\n const saltHex = toHex(salt);\n const passwordBytes = encoder.encode(password);\n const derivedKey = await Promise.resolve(\n scrypt(passwordBytes, salt, {\n N: SCRYPT_COST,\n r: SCRYPT_BLOCK_SIZE,\n p: SCRYPT_PARALLELISM,\n dkLen: SCRYPT_KEYLEN,\n }),\n );\n return `${saltHex}:${toHex(derivedKey)}`;\n};\n\nexport const verifyPassword = async (\n password: string,\n hashed?: string | null,\n) => {\n if (!hashed) {\n return false;\n }\n const [saltHex, keyHex] = hashed.split(':');\n if (!(saltHex && keyHex)) {\n return false;\n }\n\n const salt = hexToBytes(saltHex);\n const passwordBytes = encoder.encode(password);\n const derivedKey = await Promise.resolve(\n scrypt(passwordBytes, salt, {\n N: SCRYPT_COST,\n r: SCRYPT_BLOCK_SIZE,\n p: SCRYPT_PARALLELISM,\n dkLen: SCRYPT_KEYLEN,\n }),\n );\n const derived = toHex(derivedKey);\n\n if (derived.length !== keyHex.length) {\n return false;\n }\n let result = 0;\n for (let i = 0; i < derived.length; i++) {\n result |= derived.charCodeAt(i) ^ keyHex.charCodeAt(i);\n }\n return result === 0;\n};\n\nexport const hashToken = async (token: string, secret: string) => {\n if (!secret || secret.length === 0) {\n throw new Error(\n 'AUTH_SECRET is required and must be a non-empty string. Please set AUTH_SECRET environment variable.',\n );\n }\n const key = await crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign'],\n );\n const signature = await crypto.subtle.sign(\n 'HMAC',\n key,\n encoder.encode(token),\n );\n return toHex(new Uint8Array(signature));\n};\n\nexport const generateToken = (bytes = 48) => randomHex(bytes);\n\nexport const hashVerificationCode = (code: string, secret: string) =>\n hashToken(code, secret);\n","import { OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../types/context';\nimport authRoutes from './auth/auth.route';\nimport domainRoutes from './domains/domains.route';\nimport emailRoutes from './email/email.route';\nimport passwordRoutes from './password/password.route';\nimport permissionRoutes from './permissions/permissions.route';\nimport phoneRoutes from './phone/phone.route';\nimport profileRoutes from './profile/profile.route';\nimport rolePermissionRoutes from './role-permissions/role-permissions.route';\nimport roleRoutes from './roles/roles.route';\nimport sessionRoutes from './sessions/sessions.route';\nimport tenantRoutes from './tenants/tenants.route';\nimport userRoleRoutes from './user-roles/user-roles.route';\nimport userRoutes from './users/users.route';\nimport verificationRoutes from './verifications/verifications.route';\n\nconst routes = new OpenAPIHono<AuthEnv>()\n .route('/', authRoutes)\n .route('/', profileRoutes)\n .route('/password', passwordRoutes)\n .route('/email', emailRoutes)\n .route('/phone', phoneRoutes)\n .route('/users', userRoutes)\n .route('/tenants', tenantRoutes)\n .route('/domains', domainRoutes)\n .route('/roles', roleRoutes)\n .route('/permissions', permissionRoutes)\n .route('/role-permissions', rolePermissionRoutes)\n .route('/user-roles', userRoleRoutes)\n .route('/sessions', sessionRoutes)\n .route('/verifications', verificationRoutes);\n\nexport default routes;\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport {\n checkUserResponseSchema,\n checkUserSchema,\n errorResponseSchema,\n messageSchema,\n signInResponseSchema,\n signInSchema,\n signUpResponseSchema,\n signUpSchema,\n} from '../auth.schema';\nimport { checkUserHandler } from './handler/check-user';\nimport { signInHandler } from './handler/sign-in';\nimport { signOutHandler } from './handler/sign-out';\nimport { signUpHandler } from './handler/sign-up';\n\nexport const signUpRoute = createRoute({\n method: 'post',\n path: '/sign-up',\n tags: ['Auth'],\n summary: 'Sign up with email or phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: signUpSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: signUpResponseSchema,\n },\n },\n description: 'Account created',\n },\n 403: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Authentication method disabled',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User already exists',\n },\n },\n});\n\nexport const signInRoute = createRoute({\n method: 'post',\n path: '/sign-in',\n tags: ['Auth'],\n summary: 'Sign in with email or phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: signInSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: signInResponseSchema,\n },\n },\n description: 'Signed in',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid credentials',\n },\n },\n});\n\nexport const checkUserRoute = createRoute({\n method: 'post',\n path: '/check-user',\n tags: ['Auth'],\n summary: 'Check if user exists',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: checkUserSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: checkUserResponseSchema,\n },\n },\n description: 'User check result',\n },\n },\n});\n\nexport const signOutRoute = createRoute({\n method: 'post',\n path: '/sign-out',\n tags: ['Auth'],\n summary: 'Sign out current session',\n responses: {\n 200: {\n content: { 'application/json': { schema: messageSchema } },\n description: 'Signed out',\n },\n },\n});\n\nconst authRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(signUpRoute, signUpHandler)\n .openapi(signInRoute, signInHandler)\n .openapi(checkUserRoute, checkUserHandler)\n .openapi(signOutRoute, signOutHandler);\n\nexport default authRoutes;\n","import { z } from 'zod';\n\nconst emailField = z\n .string()\n .trim()\n .email('Invalid email address')\n .max(255, 'Email too long');\n\nconst phoneField = z\n .string()\n .trim()\n .min(6, 'Phone too short')\n .max(30, 'Phone too long')\n .regex(/^[+()\\d\\s-]+$/, 'Invalid phone number format');\n\nconst passwordField = z\n .string()\n .min(8, 'Password must be at least 8 characters')\n .max(128, 'Password too long');\n\nconst userRoleSchema = z.object({\n id: z.string().uuid(),\n roleId: z.string().uuid(),\n code: z.string(),\n name: z.string(),\n description: z.string(),\n});\n\nexport const userSchema = z.object({\n id: z.string().uuid(),\n tenantId: z.string(),\n fullName: z.string(),\n email: z.string().email().nullable(),\n phone: z.string().nullable(),\n handle: z.string(),\n image: z.string().nullable(),\n emailVerified: z.boolean(),\n phoneVerified: z.boolean(),\n lastSignInAt: z.string().datetime().nullable(),\n userRoles: z.array(userRoleSchema).nullable(),\n});\n\nexport const sessionSchema = z.object({\n id: z.string().uuid(),\n expiresAt: z.string().datetime(),\n createdAt: z.string().datetime().optional(),\n userAgent: z.string().nullable().optional(),\n ip: z.string().nullable().optional(),\n});\n\nexport const authSuccessSchema = z.object({\n user: userSchema,\n session: sessionSchema.nullable(),\n sessionToken: z.string().optional(),\n sessionExpiresAt: z.string().datetime().optional(),\n});\n\nexport const messageSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string().describe('Error message'),\n code: z.string().optional().describe('Error code'),\n details: z.record(z.string(), z.any()).optional(),\n});\n\nexport const signUpSchema = z\n .object({\n email: emailField.optional(),\n phone: phoneField.optional(),\n password: passwordField,\n fullName: z.string().min(2),\n image: z.string().url().optional(),\n /** Keep me signed in for longer. Default: true */\n rememberMe: z.boolean().default(true),\n })\n .refine((data) => data.email || data.phone, {\n message: 'Either email or phone is required',\n path: ['email'],\n });\n\nexport const signInSchema = z.object({\n identifier: z.string(),\n password: passwordField,\n /** Keep me signed in for longer. Default: true */\n rememberMe: z.boolean().default(true),\n});\n\nexport const signUpResponseSchema = authSuccessSchema.extend({\n verificationId: z.string().uuid().optional(),\n requiresVerification: z.boolean().optional(),\n debugCode: z.string().optional(),\n});\n\nexport const signInResponseSchema = authSuccessSchema.extend({\n verificationId: z.string().uuid().optional(),\n requiresVerification: z.boolean().optional(),\n});\n\nexport const emailVerificationRequestSchema = z.object({\n email: emailField.optional(),\n});\n\nexport const emailVerificationConfirmSchema = z.object({\n verificationId: z.string().uuid(),\n code: z.string().length(6),\n});\n\nexport const phoneVerificationRequestSchema = z.object({\n phone: phoneField,\n context: z.enum(['sign-up', 'sign-in', 'change-phone']),\n});\n\nexport const phoneVerificationConfirmSchema = z.object({\n verificationId: z.string().uuid(),\n code: z.string(),\n context: z.enum(['sign-up', 'sign-in', 'change-phone']),\n});\n\nexport const forgotPasswordSchema = z.object({\n identifier: z.string(),\n});\n\nexport const resetPasswordSchema = z.object({\n verificationId: z.string().uuid(),\n code: z.string(),\n password: passwordField,\n});\n\nexport const changePasswordSchema = z.object({\n currentPassword: passwordField,\n newPassword: passwordField,\n});\n\nexport const verifyPasswordSchema = z.object({\n password: passwordField,\n});\n\nexport const messageWithVerificationIdSchema = messageSchema.extend({\n verificationId: z.string().uuid().optional(),\n});\n\nexport const checkUserSchema = z.object({\n identifier: z.string(),\n});\n\nexport const checkUserResponseSchema = z.object({\n exists: z.boolean(),\n});\n\nexport const updateProfileSchema = z.object({\n fullName: z.string().min(1).max(255).optional().describe('User full name'),\n});\n\nexport const updateEmailSchema = z.object({\n email: z.string().email().describe('New email address'),\n});\n\nexport const updatePhoneSchema = z.object({\n phone: z.string().min(6).max(30).describe('New phone number'),\n});\n\nexport const profileResponseSchema = z.object({\n user: userSchema.describe('Updated user'),\n});\n\nexport const pendingAccountChangeSchema = z.object({\n changeType: z.enum(['email', 'phone']),\n newEmail: z.string().email().nullable(),\n newPhone: z.string().nullable(),\n expiresAt: z.string().datetime(),\n});\n\nexport const pendingAccountChangeResponseSchema = z.object({\n accountChange: pendingAccountChangeSchema.nullable(),\n verificationId: z.string().uuid().nullable(),\n});\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { rolesInIam, userRolesInIam, usersInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { User } from '../../../types';\nimport type { AuthEnv } from '../../../types/context';\nimport type { checkUserRoute } from '../auth.route';\n\nexport const checkUserHandler: RouteHandler<\n typeof checkUserRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { identifier } = body;\n\n const isEmail = identifier.includes('@');\n let user: User | null = null;\n\n if (isEmail) {\n const [result] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\n `,\n })\n .from(usersInIam)\n .leftJoin(\n userRolesInIam,\n and(\n eq(userRolesInIam.userId, usersInIam.id),\n eq(userRolesInIam.tenantId, resolvedTenantId),\n ),\n )\n .leftJoin(\n rolesInIam,\n and(\n eq(userRolesInIam.roleId, rolesInIam.id),\n eq(rolesInIam.tenantId, resolvedTenantId),\n ),\n )\n .where(\n and(\n eq(usersInIam.tenantId, resolvedTenantId),\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n ),\n )\n .groupBy(usersInIam.id)\n .limit(1);\n user = (result as User) || null;\n } else {\n const [result] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\n `,\n })\n .from(usersInIam)\n .leftJoin(\n userRolesInIam,\n and(\n eq(userRolesInIam.userId, usersInIam.id),\n eq(userRolesInIam.tenantId, resolvedTenantId),\n ),\n )\n .leftJoin(\n rolesInIam,\n and(\n eq(userRolesInIam.roleId, rolesInIam.id),\n eq(rolesInIam.tenantId, resolvedTenantId),\n ),\n )\n .where(\n and(\n eq(usersInIam.tenantId, resolvedTenantId),\n eq(usersInIam.phone, identifier),\n ),\n )\n .groupBy(usersInIam.id)\n .limit(1);\n user = (result as User) || null;\n }\n\n return c.json({ exists: !!user }, 200);\n};\n","import { HTTPException } from 'hono/http-exception';\nimport type { AuthConfig } from '../types';\n\nexport const ensureTenantId = (\n config: AuthConfig,\n tenantId: string | undefined,\n): string => {\n const enableTenant = config.tenant?.enabled ?? true;\n if (enableTenant) {\n if (!tenantId) {\n throw new HTTPException(400, {\n message: 'Missing tenantId. Tenant isolation is enabled.',\n });\n }\n return tenantId;\n }\n\n // When tenant is disabled, use tenantId from config\n if (!config.tenant?.tenantId) {\n throw new HTTPException(500, {\n message:\n 'tenantId must be provided in config.tenant when tenant.enabled is false.',\n });\n }\n return config.tenant.tenantId;\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { accountsInIam, sessionsInIam, usersInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { generateToken, hashToken, verifyPassword } from '../../../lib/crypto';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { addDuration, getSessionDuration } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { signInRoute } from '../auth.route';\nimport { cleanupOldSessions } from '../helper/session';\nimport { fetchUserByIdentifier } from '../helper/user';\nimport {\n handleEmailVerification,\n handlePhoneVerification,\n} from '../helper/verification';\n\nexport const signInHandler: RouteHandler<typeof signInRoute, AuthEnv> = async (\n c,\n) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { identifier, password, rememberMe = true } = body;\n\n const isEmail = identifier.includes('@');\n\n if (isEmail && !config.email.enabled) {\n return c.json({ error: 'Email authentication is disabled' }, 401);\n }\n\n if (!(isEmail || config.phone.enabled)) {\n return c.json({ error: 'Phone authentication is disabled' }, 401);\n }\n const user = await fetchUserByIdentifier({\n database,\n identifier,\n tenantId: resolvedTenantId,\n isEmail,\n });\n\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n if (user.bannedUntil && new Date(user.bannedUntil) > new Date()) {\n return c.json(\n {\n error: 'Account locked. Try again later.',\n bannedUntil: user.bannedUntil,\n },\n 401,\n );\n }\n\n const [account] = await database\n .select({\n id: accountsInIam.id,\n tenantId: accountsInIam.tenantId,\n userId: accountsInIam.userId,\n provider: accountsInIam.provider,\n providerAccountId: accountsInIam.providerAccountId,\n password: accountsInIam.password,\n })\n .from(accountsInIam)\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, user.id),\n eq(accountsInIam.provider, 'credentials'),\n ),\n )\n .limit(1);\n\n if (!account?.password) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const passwordValid = await verifyPassword(password, account.password);\n if (!passwordValid) {\n const newAttempt = (user.loginAttempt || 0) + 1;\n const updateData: {\n loginAttempt: number;\n bannedUntil?: string | null;\n } = {\n loginAttempt: newAttempt,\n };\n\n if (config.security && newAttempt >= config.security.maxLoginAttempts) {\n updateData.bannedUntil = addDuration(config.security.lockoutDuration);\n }\n\n await database\n .update(usersInIam)\n .set(updateData)\n .where(\n and(\n eq(usersInIam.id, user.id),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n );\n\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const isVerified = isEmail ? user.emailVerified : user.phoneVerified;\n\n if (isEmail && config.email.required && !isVerified) {\n return handleEmailVerification({\n c,\n user,\n config,\n database,\n tenantId: resolvedTenantId,\n });\n }\n\n if (!isEmail && config.phone.required && !isVerified) {\n return handlePhoneVerification({\n c,\n user,\n config,\n database,\n tenantId: resolvedTenantId,\n });\n }\n\n if (config.session.maxPerUser) {\n await cleanupOldSessions({\n database,\n userId: user.id,\n tenantId: resolvedTenantId,\n maxSessions: config.session.maxPerUser,\n });\n }\n\n await database\n .update(usersInIam)\n .set({ lastSignInAt: new Date().toISOString(), loginAttempt: 0 })\n .where(\n and(\n eq(usersInIam.id, user.id),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n );\n\n const sessionToken = generateToken();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const sessionDuration = getSessionDuration({\n sessionConfig: config.session,\n rememberMe,\n });\n const expiresAt = addDuration(sessionDuration);\n\n const [session] = await database\n .insert(sessionsInIam)\n .values({\n tenantId: resolvedTenantId,\n userId: user.id,\n token: hashedToken,\n expiresAt,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n meta: { action: 'sign-in', rememberMe },\n })\n .returning({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n });\n setSessionCookie(c, sessionToken, config, {\n expires: new Date(expiresAt),\n });\n\n return c.json(\n {\n user: normalizeUser(user),\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\n sessionExpiresAt: session.expiresAt,\n },\n 200,\n );\n};\n","export const AUTH_ERRORS = {\n USER_NOT_FOUND: 'USER_NOT_FOUND',\n INVALID_PASSWORD: 'INVALID_PASSWORD',\n USER_EXISTS: 'USER_EXISTS',\n VERIFICATION_EXPIRED: 'VERIFICATION_EXPIRED',\n VERIFICATION_MISMATCH: 'VERIFICATION_MISMATCH',\n VERIFICATION_NOT_FOUND: 'VERIFICATION_NOT_FOUND',\n TOO_MANY_ATTEMPTS: 'TOO_MANY_ATTEMPTS',\n REQUIRES_VERIFICATION: 'REQUIRES_VERIFICATION',\n UNAUTHORIZED: 'UNAUTHORIZED',\n ACCESS_DENIED: 'ACCESS_DENIED',\n HAS_NO_PASSWORD: 'HAS_NO_PASSWORD',\n} as const;\n\nexport type AuthError = (typeof AUTH_ERRORS)[keyof typeof AUTH_ERRORS];\n","import type { User } from '../types';\n\nexport const normalizeUser = (user: User) => {\n return {\n ...user,\n userRoles: user.userRoles\n ? user.userRoles.map((role) => ({\n ...role,\n name: typeof role.name === 'string' ? role.name : '',\n description:\n typeof role.description === 'string' ? role.description : '',\n }))\n : null,\n };\n};\n","import { dayjs } from '@mesob/common';\nimport { nanoid } from 'nanoid';\nimport type { SessionConfig } from '../types';\n\nexport const generateHandle = (): string => {\n return nanoid(10);\n};\n\nexport const getSessionExpiresAt = (days = 30) =>\n dayjs().add(days, 'day').toISOString();\n\nexport const parseDuration = (duration: string): number => {\n const match = duration.match(/^(\\d+)([smhd])$/);\n if (!(match?.[1] && match[2])) {\n throw new Error(`Invalid duration format: ${duration}`);\n }\n const value = Number.parseInt(match[1], 10);\n const unit = match[2];\n const multipliers: Record<string, number> = {\n s: 1,\n m: 60,\n h: 3600,\n d: 86400,\n };\n return value * (multipliers[unit] || 1);\n};\n\nexport const addDuration = (duration: string): string => {\n const seconds = parseDuration(duration);\n return dayjs().add(seconds, 'second').toISOString();\n};\n\nexport const generateOtpCode = (length = 6): string => {\n const digits = '0123456789';\n const maxValid = 250; // largest multiple of 10 <= 255 to avoid modulo bias\n let code = '';\n\n while (code.length < length) {\n const randomValues = new Uint8Array(length - code.length);\n crypto.getRandomValues(randomValues);\n for (const val of randomValues) {\n if (val < maxValid && code.length < length) {\n code += digits[val % 10];\n }\n }\n }\n return code;\n};\n\n/**\n * Get session expiration duration based on rememberMe option\n */\nexport const getSessionDuration = ({\n sessionConfig,\n rememberMe,\n}: {\n sessionConfig: SessionConfig;\n rememberMe: boolean;\n}): string => {\n if (rememberMe) {\n return sessionConfig.rememberMeExpiresIn;\n }\n return sessionConfig.shortSessionExpiresIn;\n};\n\n/**\n * Get the update age threshold based on session type\n */\nexport const getSessionUpdateAge = ({\n sessionConfig,\n rememberMe,\n}: {\n sessionConfig: SessionConfig;\n rememberMe: boolean;\n}): string => {\n if (rememberMe) {\n return sessionConfig.updateAge;\n }\n return sessionConfig.shortSessionUpdateAge;\n};\n\n/**\n * Check if session needs refresh based on remaining time\n */\nexport const shouldRefreshSession = ({\n expiresAt,\n updateAge,\n}: {\n expiresAt: string;\n updateAge: string;\n}): boolean => {\n const updateAgeSeconds = parseDuration(updateAge);\n const now = dayjs();\n const expires = dayjs(expiresAt);\n const remainingSeconds = expires.diff(now, 'second');\n\n return remainingSeconds > 0 && remainingSeconds <= updateAgeSeconds;\n};\n\n/**\n * Get new expiration time for session refresh\n */\nexport const getRefreshedExpiresAt = ({\n sessionConfig,\n rememberMe,\n}: {\n sessionConfig: SessionConfig;\n rememberMe: boolean;\n}): string => {\n const duration = getSessionDuration({ sessionConfig, rememberMe });\n return addDuration(duration);\n};\n\n/**\n * Check if session is expired\n */\nexport const isSessionExpired = (expiresAt: string): boolean => {\n return dayjs(expiresAt).isBefore(dayjs());\n};\n","import { and, asc, eq, gt, sql } from 'drizzle-orm';\nimport { sessionsInIam } from '../../../db/schema';\nimport type { TransactionClient } from '../../../db/transaction';\nimport { generateToken, hashToken } from '../../../lib/crypto';\nimport { addDuration, getSessionDuration } from '../../../lib/session';\nimport type { AuthConfig, SessionMeta } from '../../../types';\nimport type {\n CleanupOldSessionsParams,\n CreateSessionParams,\n} from '../auth.types';\n\ntype CreateSessionRecordParams = {\n tx: TransactionClient;\n tenantId: string;\n userId: string;\n config: AuthConfig;\n userAgent: string | null;\n ip: string | null;\n action: string;\n rememberMe?: boolean;\n expiresIn?: string;\n};\n\nexport const createSessionRecord = async ({\n tx,\n tenantId,\n userId,\n config,\n userAgent,\n ip,\n action,\n rememberMe,\n expiresIn,\n}: CreateSessionRecordParams): Promise<{\n session: {\n id: string;\n expiresAt: string;\n createdAt: string;\n updatedAt: string;\n userAgent: string | null;\n ip: string | null;\n };\n sessionToken: string;\n expiresAt: string;\n}> => {\n const sessionToken = generateToken();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const sessionDuration =\n expiresIn ||\n getSessionDuration({\n sessionConfig: config.session,\n rememberMe: rememberMe ?? true,\n });\n const expiresAt = addDuration(sessionDuration);\n const meta: SessionMeta = { action };\n\n if (rememberMe !== undefined) {\n meta.rememberMe = rememberMe;\n }\n\n const [session] = await tx\n .insert(sessionsInIam)\n .values({\n tenantId,\n userId,\n token: hashedToken,\n expiresAt,\n userAgent,\n ip,\n meta,\n })\n .returning({\n id: sessionsInIam.id,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n });\n\n return { session, sessionToken, expiresAt };\n};\n\nexport const createSession = async ({\n tx,\n tenantId,\n userId,\n config,\n userAgent,\n ip,\n rememberMe = true,\n}: CreateSessionParams): Promise<{\n sessionId: string;\n sessionToken: string;\n expiresAt: string;\n}> => {\n const { session, sessionToken, expiresAt } = await createSessionRecord({\n tx,\n tenantId,\n userId,\n config,\n userAgent,\n ip,\n rememberMe,\n action: 'sign-up',\n });\n\n return { sessionId: session.id, sessionToken, expiresAt };\n};\n\nexport const cleanupOldSessions = async ({\n database,\n userId,\n tenantId,\n maxSessions,\n}: CleanupOldSessionsParams) => {\n const [{ count }] = await database\n .select({ count: sql<number>`count(*)` })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n );\n\n if (count <= maxSessions) {\n return;\n }\n\n const toDeleteCount = count - maxSessions;\n const idsToDelete = await database\n .select({ id: sessionsInIam.id })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .orderBy(asc(sessionsInIam.createdAt))\n .limit(toDeleteCount);\n\n if (!idsToDelete.length) {\n return;\n }\n\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n sql`${sessionsInIam.id} = ANY(${idsToDelete.map((s) => s.id)})`,\n ),\n );\n};\n","import { and, eq, gt, sql } from 'drizzle-orm';\nimport {\n accountsInIam,\n rolesInIam,\n userRolesInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { hashPassword } from '../../../lib/crypto';\nimport type { User } from '../../../types';\nimport type {\n CheckExistingUserStatusParams,\n CreateUserWithAccountParams,\n DeleteUnverifiedUserParams,\n FetchUserByIdentifierParams,\n UserRecord,\n} from '../auth.types';\n\nexport const checkExistingUserStatus = async ({\n tx,\n identifier,\n tenantId,\n isEmail,\n}: CheckExistingUserStatusParams): Promise<\n | { action: 'proceed' }\n | { action: 'error'; code: string }\n | { action: 'pending'; verificationId: string }\n> => {\n const whereClause = isEmail\n ? and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n )\n : and(eq(usersInIam.tenantId, tenantId), eq(usersInIam.phone, identifier));\n\n const [existingUser] = await tx\n .select()\n .from(usersInIam)\n .where(whereClause)\n .limit(1);\n\n if (!existingUser) {\n return { action: 'proceed' };\n }\n\n const isVerified = isEmail\n ? existingUser.emailVerified\n : existingUser.phoneVerified;\n\n if (isVerified) {\n return { action: 'error', code: AUTH_ERRORS.USER_EXISTS };\n }\n\n // Check for valid pending verification\n const [pendingVerification] = await tx\n .select()\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.userId, existingUser.id),\n eq(verificationsInIam.tenantId, tenantId),\n gt(verificationsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .limit(1);\n\n if (pendingVerification) {\n return { action: 'pending', verificationId: pendingVerification.id };\n }\n\n // Delete expired unverified user\n await deleteUnverifiedUser({ tx, userId: existingUser.id, tenantId });\n return { action: 'proceed' };\n};\n\nexport const deleteUnverifiedUser = async ({\n tx,\n userId,\n tenantId,\n}: DeleteUnverifiedUserParams) => {\n await tx\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.tenantId, tenantId),\n ),\n );\n await tx\n .delete(accountsInIam)\n .where(\n and(\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.tenantId, tenantId),\n ),\n );\n await tx\n .delete(usersInIam)\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)));\n};\n\nexport const createUserWithAccount = async ({\n tx,\n tenantId,\n email,\n phone,\n password,\n fullName,\n handle,\n config,\n}: CreateUserWithAccountParams): Promise<UserRecord> => {\n const [user] = await tx\n .insert(usersInIam)\n .values({\n tenantId,\n fullName,\n handle,\n email: email || null,\n phone: phone || null,\n emailVerified: email ? !config.email.required : false,\n phoneVerified: phone ? !config.phone.required : false,\n })\n .returning();\n\n const passwordHash = await hashPassword(password);\n\n await tx.insert(accountsInIam).values({\n tenantId,\n userId: user.id,\n provider: 'credentials',\n providerAccountId: email || phone || user.id,\n password: passwordHash,\n });\n\n return user;\n};\n\nexport const fetchUserByIdentifier = async ({\n database,\n identifier,\n tenantId,\n isEmail,\n}: FetchUserByIdentifierParams): Promise<User | null> => {\n const whereClause = isEmail\n ? and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n )\n : and(eq(usersInIam.tenantId, tenantId), eq(usersInIam.phone, identifier));\n\n const [result] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n bannedUntil: usersInIam.bannedUntil,\n loginAttempt: usersInIam.loginAttempt,\n userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\n `,\n })\n .from(usersInIam)\n .leftJoin(\n userRolesInIam,\n and(\n eq(userRolesInIam.userId, usersInIam.id),\n eq(userRolesInIam.tenantId, tenantId),\n ),\n )\n .leftJoin(\n rolesInIam,\n and(\n eq(userRolesInIam.roleId, rolesInIam.id),\n eq(rolesInIam.tenantId, tenantId),\n ),\n )\n .where(whereClause)\n .groupBy(usersInIam.id)\n .limit(1);\n return (result as User) || null;\n};\n","import { dayjs } from '@mesob/common';\nimport { and, desc, eq } from 'drizzle-orm';\nimport type { Database } from '../../../db';\nimport { verificationsInIam } from '../../../db/schema';\nimport { hashToken } from '../../../lib/crypto';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport {\n addDuration,\n generateOtpCode,\n parseDuration,\n} from '../../../lib/session';\nimport type {\n CreateVerificationParams,\n HandleVerificationParams,\n SendVerificationParams,\n} from '../auth.types';\n\nexport const createVerification = async ({\n tx,\n tenantId,\n userId,\n type,\n to,\n config,\n}: CreateVerificationParams): Promise<{\n verificationId: string;\n code: string;\n hash: string;\n}> => {\n const isPhone = type === 'phone-otp-sign-up';\n const code = generateOtpCode(\n isPhone ? config.phone.otpLength : config.email.otpLength,\n );\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(\n isPhone ? config.phone.expiresIn : config.email.expiresIn,\n );\n\n const [verification] = await tx\n .insert(verificationsInIam)\n .values({\n tenantId,\n userId,\n type,\n code: hashedCode,\n expiresAt,\n to,\n attempt: 0,\n })\n .returning();\n\n return { verificationId: verification.id, code, hash: hashedCode };\n};\n\nexport const sendVerification = async ({\n channel,\n to,\n code,\n config,\n hash,\n type,\n}: SendVerificationParams & { hash: string; type: string }) => {\n if (channel === 'phone' && config.phone.sendVerificationOTP) {\n await config.phone.sendVerificationOTP({\n phone: to,\n code,\n hash,\n type,\n });\n } else if (config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email: to,\n code,\n hash,\n type,\n });\n }\n};\n\ntype VerificationResendCheckParams = {\n database: Database;\n tenantId: string;\n userId: string;\n type: string;\n resendInterval?: string;\n};\n\ntype VerificationResendCheckResult = {\n blocked: boolean;\n verificationId?: string;\n};\n\nexport const checkVerificationResend = async ({\n database,\n tenantId,\n userId,\n type,\n resendInterval,\n}: VerificationResendCheckParams): Promise<VerificationResendCheckResult> => {\n if (!resendInterval) {\n return { blocked: false };\n }\n\n const [verification] = await database\n .select({\n id: verificationsInIam.id,\n createdAt: verificationsInIam.createdAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, type),\n ),\n )\n .orderBy(desc(verificationsInIam.createdAt))\n .limit(1);\n\n if (!verification) {\n return { blocked: false };\n }\n\n const cooldownSeconds = parseDuration(resendInterval);\n const createdAt = dayjs(verification.createdAt);\n const blocked = dayjs().diff(createdAt, 'second') < cooldownSeconds;\n return { blocked, verificationId: verification.id };\n};\n\nexport const handleEmailVerification = async ({\n c,\n user,\n config,\n database,\n tenantId,\n}: HandleVerificationParams) => {\n if (!user.email) {\n return c.json({ error: 'User email not found' }, 401);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, user.id),\n eq(verificationsInIam.type, 'email-verification'),\n ),\n );\n\n const code = generateOtpCode(config.email.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId,\n userId: user.id,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: user.email,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n\n if (config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email: user.email,\n code,\n hash: hashedCode,\n type: 'email-verification',\n });\n }\n\n return c.json(\n {\n user: normalizeUser(user),\n session: null,\n verificationId: verification.id,\n requiresVerification: true,\n },\n 200,\n );\n};\n\nexport const handlePhoneVerification = async ({\n c,\n user,\n config,\n database,\n tenantId,\n}: HandleVerificationParams) => {\n if (!user.phone) {\n return c.json({ error: 'User phone not found' }, 401);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, tenantId),\n eq(verificationsInIam.userId, user.id),\n eq(verificationsInIam.type, 'phone-otp'),\n ),\n );\n\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId,\n userId: user.id,\n type: 'phone-otp',\n code: hashedCode,\n expiresAt,\n to: user.phone,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n\n if (config.phone.sendVerificationOTP) {\n await config.phone.sendVerificationOTP({\n phone: user.phone,\n code,\n hash: hashedCode,\n type: 'phone-otp',\n });\n }\n\n return c.json(\n {\n user: normalizeUser(user),\n session: null,\n verificationId: verification.id,\n requiresVerification: true,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, gt } from 'drizzle-orm';\nimport { getCookie } from 'hono/cookie';\nimport { sessionsInIam } from '../../../db/schema';\nimport { deleteSessionCookie, getSessionCookieName } from '../../../lib/cookie';\nimport { hashToken } from '../../../lib/crypto';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { signOutRoute } from '../auth.route';\n\nexport const signOutHandler: RouteHandler<\n typeof signOutRoute,\n AuthEnv\n> = async (c) => {\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n ensureTenantId(config, tenantId);\n\n const sessionToken = getCookie(c, getSessionCookieName(config));\n\n if (!sessionToken) {\n return c.json({ message: 'Signed out' }, 200);\n }\n\n const hashedToken = await hashToken(sessionToken, config.secret);\n const [session] = await database\n .select({\n id: sessionsInIam.id,\n tenantId: sessionsInIam.tenantId,\n userId: sessionsInIam.userId,\n expiresAt: sessionsInIam.expiresAt,\n createdAt: sessionsInIam.createdAt,\n updatedAt: sessionsInIam.updatedAt,\n userAgent: sessionsInIam.userAgent,\n ip: sessionsInIam.ip,\n })\n .from(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.token, hashedToken),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n )\n .limit(1);\n\n if (session) {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.id, session.id),\n eq(sessionsInIam.tenantId, session.tenantId),\n ),\n );\n }\n deleteSessionCookie(c, config);\n\n return c.json({ message: 'Signed out' }, 200);\n};\n","import type { ExtractTablesWithRelations } from 'drizzle-orm';\nimport type { PgQueryResultHKT, PgTransaction } from 'drizzle-orm/pg-core';\nimport type { Database } from './index';\nimport type * as relations from './relations';\nimport type * as schema from './schema';\n\nexport type TransactionClient = PgTransaction<\n PgQueryResultHKT,\n typeof schema & typeof relations,\n ExtractTablesWithRelations<typeof schema & typeof relations>\n>;\n\nexport function withTransaction<T>(\n database: Database,\n callback: (tx: TransactionClient) => Promise<T>,\n): Promise<T> {\n return database.transaction(async (tx) => callback(tx));\n}\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { withTransaction } from '../../../db/transaction';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { generateHandle } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { signUpRoute } from '../auth.route';\nimport type { SignUpResult } from '../auth.types';\nimport { createSession } from '../helper/session';\nimport { checkExistingUserStatus, createUserWithAccount } from '../helper/user';\nimport { createVerification, sendVerification } from '../helper/verification';\n\nclass SignUpError extends Error {\n constructor(\n message: string,\n public status: number,\n ) {\n super(message);\n }\n}\n\nexport const signUpHandler: RouteHandler<typeof signUpRoute, AuthEnv> = async (\n c,\n) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { email, phone, password, fullName, rememberMe = true } = body;\n const identifier = email || phone;\n\n if (!identifier) {\n return c.json({ error: 'Either email or phone is required' }, 409);\n }\n\n const isEmail = identifier.includes('@');\n\n if (isEmail && !config.email.enabled) {\n return c.json({ error: 'Email authentication is disabled' }, 403);\n }\n\n if (!(isEmail || config.phone.enabled)) {\n return c.json({ error: 'Phone authentication is disabled' }, 403);\n }\n const userAgent = c.req.header('user-agent') || null;\n const ip =\n c.req.header('cf-connecting-ip') || c.req.header('x-forwarded-for') || null;\n\n let result: SignUpResult;\n\n try {\n result = await withTransaction(database, async (tx) => {\n const status = await checkExistingUserStatus({\n tx,\n identifier,\n tenantId: resolvedTenantId,\n isEmail,\n });\n\n if (status.action === 'error') {\n throw new SignUpError(status.code, 409);\n }\n\n if (status.action === 'pending') {\n return {\n type: 'pending' as const,\n verificationId: status.verificationId,\n };\n }\n\n const handle = generateHandle();\n\n const user = await createUserWithAccount({\n tx,\n tenantId: resolvedTenantId,\n email,\n phone,\n password,\n fullName,\n handle,\n config,\n });\n\n if (phone && config.phone.required) {\n const { verificationId, code, hash } = await createVerification({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'phone-otp-sign-up',\n to: phone,\n config,\n });\n return {\n type: 'verification' as const,\n user,\n verificationId,\n code,\n hash,\n to: phone,\n channel: 'phone' as const,\n };\n }\n\n if (email && config.email.required) {\n const { verificationId, code, hash } = await createVerification({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'email-verification',\n to: email,\n config,\n });\n return {\n type: 'verification' as const,\n user,\n verificationId,\n code,\n hash,\n to: email,\n channel: 'email' as const,\n };\n }\n\n const { sessionId, sessionToken, expiresAt } = await createSession({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n config,\n userAgent,\n ip,\n rememberMe,\n });\n\n return {\n type: 'session' as const,\n user,\n sessionToken,\n expiresAt,\n sessionId,\n };\n });\n } catch (error) {\n if (error instanceof SignUpError) {\n return c.json({ error: error.message }, error.status as 409);\n }\n throw error;\n }\n\n if (result.type === 'pending') {\n return c.json(\n {\n error: 'Verification pending. Please verify or request a new code.',\n verificationId: result.verificationId,\n requiresVerification: true,\n },\n 409,\n );\n }\n\n if (result.type === 'verification') {\n await sendVerification({\n channel: result.channel,\n to: result.to,\n code: result.code,\n hash: result.hash,\n type:\n result.channel === 'phone' ? 'phone-otp-sign-up' : 'email-verification',\n config,\n });\n\n return c.json(\n {\n user: normalizeUser(result.user),\n session: null,\n verificationId: result.verificationId,\n requiresVerification: true,\n },\n 201,\n );\n }\n\n setSessionCookie(c, result.sessionToken, config, {\n expires: new Date(result.expiresAt),\n });\n\n return c.json(\n {\n user: normalizeUser(result.user),\n session: { id: result.sessionId, expiresAt: result.expiresAt },\n sessionExpiresAt: result.expiresAt,\n },\n 201,\n );\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport {\n createDomainSchema,\n deleteDomainResponseSchema,\n domainIdParamSchema,\n domainResponseSchema,\n errorResponseSchema,\n listDomainsQuerySchema,\n listDomainsResponseSchema,\n updateDomainSchema,\n} from './domains.schema';\nimport { createDomainHandler } from './handler/create-domain';\nimport { deleteDomainHandler } from './handler/delete-domain';\nimport { getDomainHandler } from './handler/get-domain';\nimport { listDomainsHandler } from './handler/list-domains';\nimport { updateDomainHandler } from './handler/update-domain';\nimport { verifyDomainHandler } from './handler/verify-domain';\n\nexport const listDomainsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Domains'],\n summary: 'List domains',\n request: {\n query: listDomainsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listDomainsResponseSchema,\n },\n },\n description: 'List of domains',\n },\n },\n});\n\nexport const getDomainRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Domains'],\n summary: 'Get domain by ID',\n request: {\n params: domainIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: domainResponseSchema,\n },\n },\n description: 'Domain details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Domain not found',\n },\n },\n});\n\nexport const createDomainRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Domains'],\n summary: 'Create domain',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: createDomainSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: domainResponseSchema,\n },\n },\n description: 'Domain created',\n },\n },\n});\n\nexport const updateDomainRoute = createRoute({\n method: 'put',\n path: '/{id}',\n tags: ['Domains'],\n summary: 'Update domain',\n request: {\n params: domainIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: updateDomainSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: domainResponseSchema,\n },\n },\n description: 'Domain updated',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Domain not found',\n },\n },\n});\n\nexport const deleteDomainRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Domains'],\n summary: 'Delete domain',\n request: {\n params: domainIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: deleteDomainResponseSchema,\n },\n },\n description: 'Domain deleted',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Domain not found',\n },\n },\n});\n\nexport const verifyDomainRoute = createRoute({\n method: 'post',\n path: '/{id}/verify',\n tags: ['Domains'],\n summary: 'Verify domain',\n request: {\n params: domainIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: domainResponseSchema,\n },\n },\n description: 'Domain verified',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Domain not found',\n },\n },\n});\n\nconst domainRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(listDomainsRoute, listDomainsHandler)\n .openapi(getDomainRoute, getDomainHandler)\n .openapi(createDomainRoute, createDomainHandler)\n .openapi(updateDomainRoute, updateDomainHandler)\n .openapi(deleteDomainRoute, deleteDomainHandler)\n .openapi(verifyDomainRoute, verifyDomainHandler);\n\nexport default domainRoutes;\n","import { z } from 'zod';\n\n// Query schemas\nexport const listDomainsQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n status: z.enum(['pending', 'active', 'disabled', 'deleted']).optional(),\n});\n\n// Path parameter schemas\nexport const domainIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Request body schemas\nexport const createDomainSchema = z.object({\n domain: z\n .string()\n .regex(\n /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)+$/,\n ),\n status: z\n .enum(['pending', 'active', 'disabled', 'deleted'])\n .default('pending')\n .optional(),\n meta: z.unknown().optional(),\n isPrimary: z.boolean().default(false).optional(),\n});\n\nexport const updateDomainSchema = z.object({\n domain: z\n .string()\n .regex(\n /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)+$/,\n )\n .optional(),\n status: z.enum(['pending', 'active', 'disabled', 'deleted']).optional(),\n meta: z.unknown().nullable().optional(),\n isPrimary: z.boolean().optional(),\n});\n\n// Response schemas\nexport const domainSchema = z.object({\n id: z.uuid(),\n tenantId: z.string(),\n domain: z.string(),\n status: z.string(),\n meta: z.unknown().nullable(),\n isPrimary: z.boolean(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nexport const listDomainsResponseSchema = z.object({\n domains: z.array(domainSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const domainResponseSchema = z.object({\n domain: domainSchema,\n});\n\nexport const deleteDomainResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { domainsInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { createDomainRoute } from '../domains.route';\n\nexport const createDomainHandler: RouteHandler<\n typeof createDomainRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const [domain] = await database\n .insert(domainsInIam)\n .values({\n tenantId: resolvedTenantId,\n domain: body.domain,\n status: body.status || 'pending',\n meta: body.meta || null,\n isPrimary: body.isPrimary,\n })\n .returning();\n\n return c.json({ domain }, 201);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { domainsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { deleteDomainRoute } from '../domains.route';\n\nexport const deleteDomainHandler: RouteHandler<\n typeof deleteDomainRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(domainsInIam)\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n await database\n .delete(domainsInIam)\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)));\n\n return c.json({ message: 'Domain deleted' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { domainsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getDomainRoute } from '../domains.route';\n\nexport const getDomainHandler: RouteHandler<\n typeof getDomainRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [domain] = await database\n .select()\n .from(domainsInIam)\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!domain) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n return c.json({ domain }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { domainsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listDomainsRoute } from '../domains.route';\n\nexport const listDomainsHandler: RouteHandler<\n typeof listDomainsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [eq(domainsInIam.tenantId, tenantId)];\n if (query.status) {\n conditions.push(eq(domainsInIam.status, query.status));\n }\n\n const [domains, totalResult] = await Promise.all([\n database\n .select()\n .from(domainsInIam)\n .where(and(...conditions))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(domainsInIam)\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ domains, total, page, limit });\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { domainsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateDomainRoute } from '../domains.route';\n\nexport const updateDomainHandler: RouteHandler<\n typeof updateDomainRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(domainsInIam)\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n const updateData: Partial<typeof domainsInIam.$inferInsert> = {};\n\n if (body.domain !== undefined) {\n updateData.domain = body.domain;\n }\n if (body.status !== undefined) {\n updateData.status = body.status;\n }\n if (body.meta !== undefined) {\n updateData.meta = body.meta;\n }\n if (body.isPrimary !== undefined) {\n updateData.isPrimary = body.isPrimary;\n }\n\n const [updated] = await database\n .update(domainsInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .returning();\n\n if (!updated) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n return c.json({ domain: updated }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { domainsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { verifyDomainRoute } from '../domains.route';\n\nexport const verifyDomainHandler: RouteHandler<\n typeof verifyDomainRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(domainsInIam)\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n const [updated] = await database\n .update(domainsInIam)\n .set({\n status: 'active',\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(domainsInIam.id, id), eq(domainsInIam.tenantId, tenantId)))\n .returning();\n\n if (!updated) {\n return c.json({ error: 'Domain not found' }, 404);\n }\n\n return c.json({ domain: updated }, 200);\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport {\n authSuccessSchema,\n emailVerificationConfirmSchema,\n emailVerificationRequestSchema,\n errorResponseSchema,\n messageWithVerificationIdSchema,\n} from '../auth.schema';\nimport { emailVerificationConfirmHandler } from './handler/verification-confirm';\nimport { emailVerificationRequestHandler } from './handler/verification-request';\n\nexport const emailVerificationRequestRoute = createRoute({\n method: 'post',\n path: '/verification/request',\n tags: ['Email'],\n summary: 'Request email verification',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: emailVerificationRequestSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: messageWithVerificationIdSchema,\n },\n },\n description: 'Verification code sent',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid request',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const emailVerificationConfirmRoute = createRoute({\n method: 'post',\n path: '/verification/confirm',\n tags: ['Email'],\n summary: 'Confirm email verification',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: emailVerificationConfirmSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Email verified',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid verification',\n },\n },\n});\n\nconst emailRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(emailVerificationRequestRoute, emailVerificationRequestHandler)\n .openapi(emailVerificationConfirmRoute, emailVerificationConfirmHandler);\n\nexport default emailRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { fetchUserWithRoles } from '../../../db/orm';\nimport { usersInIam, verificationsInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { hashToken } from '../../../lib/crypto';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { createSessionRecord } from '../../auth/helper/session';\nimport type { emailVerificationConfirmRoute } from '../email.route';\n\nexport const emailVerificationConfirmHandler: RouteHandler<\n typeof emailVerificationConfirmRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code } = body;\n\n const result = await withTransaction(database, async (tx) => {\n const [verification] = await tx\n .select()\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.id, verificationId),\n eq(verificationsInIam.tenantId, resolvedTenantId),\n ),\n )\n .limit(1);\n\n if (!verification || verification.type !== 'email-verification') {\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_NOT_FOUND,\n };\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_EXPIRED,\n };\n }\n\n if ((verification.attempt || 0) >= config.email.maxAttempts) {\n await tx\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.TOO_MANY_ATTEMPTS,\n };\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await tx\n .update(verificationsInIam)\n .set({ attempt: (verification.attempt || 0) + 1 })\n .where(eq(verificationsInIam.id, verificationId));\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_MISMATCH,\n };\n }\n\n await tx\n .update(usersInIam)\n .set({\n emailVerified: true,\n lastSignInAt: new Date().toISOString(),\n })\n .where(\n and(\n eq(usersInIam.id, verification.userId),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n );\n\n await tx\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n\n const user = await fetchUserWithRoles({\n database: tx,\n userId: verification.userId,\n tenantId: resolvedTenantId,\n });\n\n if (!user) {\n return { status: 'error' as const, error: 'User not found' };\n }\n\n const { session, sessionToken, expiresAt } = await createSessionRecord({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n config,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n action: 'email-verification',\n expiresIn: config.session.expiresIn,\n });\n\n return {\n status: 'ok' as const,\n user,\n session,\n sessionToken,\n expiresAt,\n };\n });\n\n if (result.status === 'error') {\n return c.json({ error: result.error }, 400);\n }\n\n setSessionCookie(c, result.sessionToken, config, {\n expires: new Date(result.expiresAt),\n });\n\n return c.json(\n {\n user: normalizeUser(result.user),\n session: {\n id: result.session.id,\n expiresAt: result.session.expiresAt,\n createdAt: result.session.createdAt,\n userAgent: result.session.userAgent,\n ip: result.session.ip,\n },\n sessionExpiresAt: result.session.expiresAt,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport {\n accountChangesInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { hashToken } from '../../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { checkVerificationResend } from '../../auth/helper/verification';\nimport type { emailVerificationRequestRoute } from '../email.route';\n\nexport const emailVerificationRequestHandler: RouteHandler<\n typeof emailVerificationRequestRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const user = c.get('user');\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n if (!config.email.enabled) {\n return c.json({ error: 'Email authentication is disabled' }, 400);\n }\n\n const email = body.email || user?.email;\n\n if (!email) {\n return c.json({ error: 'Email required' }, 400);\n }\n\n const genericResponse = {\n message: 'If the account exists, a verification code was sent.',\n };\n\n let userId = user?.id;\n if (!userId) {\n const [result] = await database\n .select({ id: usersInIam.id })\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, resolvedTenantId),\n sql`lower(${usersInIam.email}) = lower(${email})`,\n ),\n )\n .limit(1);\n\n if (!result) {\n return c.json(genericResponse, 200);\n }\n\n userId = result.id;\n }\n\n const resendCheck = await checkVerificationResend({\n database,\n tenantId: resolvedTenantId,\n userId,\n type: 'email-verification',\n resendInterval: config.email.resendInterval,\n });\n\n if (resendCheck.blocked) {\n return c.json(\n {\n message: 'Verification recently sent',\n verificationId: resendCheck.verificationId,\n },\n 200,\n );\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, 'email-verification'),\n ),\n );\n\n const code = generateOtpCode(config.email.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId: resolvedTenantId,\n userId,\n type: 'email-verification',\n code: hashedCode,\n expiresAt,\n to: email,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n\n if (user?.id && body.email) {\n await database\n .update(accountChangesInIam)\n .set({\n status: 'cancelled',\n cancelledAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n reason: 'replaced',\n })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, user.id),\n eq(accountChangesInIam.changeType, 'email'),\n eq(accountChangesInIam.status, 'pending'),\n ),\n );\n\n await database.insert(accountChangesInIam).values({\n tenantId: resolvedTenantId,\n userId: user.id,\n changeType: 'email',\n oldEmail: user.email ?? '',\n newEmail: body.email,\n oldPhone: null,\n newPhone: null,\n status: 'pending',\n expiresAt: verification.expiresAt,\n updatedAt: new Date().toISOString(),\n });\n }\n\n if (config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email,\n code,\n hash: hashedCode,\n type: 'email-verification',\n });\n }\n\n return c.json(\n {\n message: 'Verification code sent',\n verificationId: verification.id,\n },\n 200,\n );\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport {\n authSuccessSchema,\n changePasswordSchema,\n errorResponseSchema,\n forgotPasswordSchema,\n messageSchema,\n messageWithVerificationIdSchema,\n resetPasswordSchema,\n verifyPasswordSchema,\n} from '../auth.schema';\nimport { changePasswordHandler } from './handler/change';\nimport { forgotPasswordHandler } from './handler/forgot';\nimport { resetPasswordHandler } from './handler/reset';\nimport { verifyPasswordHandler } from './handler/verify';\n\nexport const forgotPasswordRoute = createRoute({\n method: 'post',\n path: '/forgot',\n tags: ['Password'],\n summary: 'Request password reset',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: forgotPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: messageWithVerificationIdSchema,\n },\n },\n description: 'Reset code sent if account exists',\n },\n },\n});\n\nexport const resetPasswordRoute = createRoute({\n method: 'post',\n path: '/reset',\n tags: ['Password'],\n summary: 'Reset password',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: resetPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Password reset and new session',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid verification',\n },\n },\n});\n\nexport const verifyPasswordRoute = createRoute({\n method: 'post',\n path: '/verify',\n tags: ['Password'],\n summary: 'Verify password',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: verifyPasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: { 'application/json': { schema: messageSchema } },\n description: 'Password verified',\n },\n 401: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Invalid password',\n },\n },\n});\n\nexport const changePasswordRoute = createRoute({\n method: 'post',\n path: '/change',\n tags: ['Password'],\n summary: 'Change password',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: changePasswordSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: { 'application/json': { schema: messageSchema } },\n description: 'Password updated',\n },\n 401: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Invalid password',\n },\n },\n});\n\nconst passwordRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(forgotPasswordRoute, forgotPasswordHandler)\n .openapi(resetPasswordRoute, resetPasswordHandler)\n .openapi(verifyPasswordRoute, verifyPasswordHandler)\n .openapi(changePasswordRoute, changePasswordHandler);\n\nexport default passwordRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, gt, ne } from 'drizzle-orm';\nimport { getCookie } from 'hono/cookie';\nimport { accountsInIam, sessionsInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { getSessionCookieName } from '../../../lib/cookie';\nimport { hashPassword, hashToken, verifyPassword } from '../../../lib/crypto';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { changePasswordRoute } from '../password.route';\n\nexport const changePasswordHandler: RouteHandler<\n typeof changePasswordRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { currentPassword, newPassword } = body;\n\n const [account] = await database\n .select()\n .from(accountsInIam)\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n )\n .limit(1);\n\n if (!account?.password) {\n return c.json({ error: AUTH_ERRORS.HAS_NO_PASSWORD }, 401);\n }\n\n const passwordValid = await verifyPassword(currentPassword, account.password);\n if (!passwordValid) {\n return c.json({ error: AUTH_ERRORS.INVALID_PASSWORD }, 401);\n }\n\n const passwordHash = await hashPassword(newPassword);\n await database\n .update(accountsInIam)\n .set({ password: passwordHash })\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n\n const currentSessionToken = getCookie(c, getSessionCookieName(config));\n if (currentSessionToken) {\n const hashedToken = await hashToken(currentSessionToken, config.secret);\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, resolvedTenantId),\n eq(sessionsInIam.userId, userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ne(sessionsInIam.token, hashedToken),\n ),\n );\n }\n\n return c.json({ message: 'Password updated' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport {\n rolesInIam,\n userRolesInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { hashToken } from '../../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { User } from '../../../types';\nimport type { AuthEnv } from '../../../types/context';\nimport type { forgotPasswordRoute } from '../password.route';\n\nexport const forgotPasswordHandler: RouteHandler<\n typeof forgotPasswordRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { identifier } = body;\n\n const isEmail = identifier.includes('@');\n\n if (isEmail && !config.email.enabled) {\n return c.json({ message: 'If account exists, reset code sent' }, 200);\n }\n\n if (!(isEmail || config.phone.enabled)) {\n return c.json({ message: 'If account exists, reset code sent' }, 200);\n }\n\n let user: User | null = null;\n\n if (isEmail) {\n const [result] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\n `,\n })\n .from(usersInIam)\n .leftJoin(\n userRolesInIam,\n and(\n eq(userRolesInIam.userId, usersInIam.id),\n eq(userRolesInIam.tenantId, resolvedTenantId),\n ),\n )\n .leftJoin(\n rolesInIam,\n and(\n eq(userRolesInIam.roleId, rolesInIam.id),\n eq(rolesInIam.tenantId, resolvedTenantId),\n ),\n )\n .where(\n and(\n eq(usersInIam.tenantId, resolvedTenantId),\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n ),\n )\n .groupBy(usersInIam.id)\n .limit(1);\n user = (result as User) || null;\n } else {\n const [result] = await database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n userRoles: sql<User['userRoles']>`\n COALESCE(\n json_agg(\n json_build_object(\n 'id', ${userRolesInIam.id},\n 'roleId', ${rolesInIam.id},\n 'code', ${rolesInIam.code},\n 'name', ${rolesInIam.name},\n 'description', ${rolesInIam.description}\n )\n ) FILTER (WHERE ${userRolesInIam.id} IS NOT NULL),\n '[]'::json\n )\n `,\n })\n .from(usersInIam)\n .leftJoin(\n userRolesInIam,\n and(\n eq(userRolesInIam.userId, usersInIam.id),\n eq(userRolesInIam.tenantId, resolvedTenantId),\n ),\n )\n .leftJoin(\n rolesInIam,\n and(\n eq(userRolesInIam.roleId, rolesInIam.id),\n eq(rolesInIam.tenantId, resolvedTenantId),\n ),\n )\n .where(\n and(\n eq(usersInIam.tenantId, resolvedTenantId),\n eq(usersInIam.phone, identifier),\n ),\n )\n .groupBy(usersInIam.id)\n .limit(1);\n user = (result as User) || null;\n }\n\n if (!user) {\n return c.json({ message: 'If account exists, reset code sent' }, 200);\n }\n\n let verificationId: string | undefined;\n\n if (isEmail) {\n if (!user.email) {\n return c.json({ message: 'If account exists, reset code sent' }, 200);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, user.id),\n eq(verificationsInIam.type, 'password-reset'),\n ),\n );\n\n const code = generateOtpCode(config.email.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.email.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'password-reset',\n code: hashedCode,\n expiresAt,\n to: user.email,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n verificationId = verification.id;\n\n if (config.email.sendVerificationOTP) {\n await config.email.sendVerificationOTP({\n email: user.email,\n code,\n hash: hashedCode,\n type: 'password-reset',\n });\n }\n } else {\n if (!user.phone) {\n return c.json({ message: 'If account exists, reset code sent' }, 200);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, user.id),\n eq(verificationsInIam.type, 'password-reset-otp'),\n ),\n );\n\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId: resolvedTenantId,\n userId: user.id,\n type: 'password-reset-otp',\n code: hashedCode,\n expiresAt,\n to: user.phone,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n verificationId = verification.id;\n\n if (config.phone.sendVerificationOTP) {\n await config.phone.sendVerificationOTP({\n phone: user.phone,\n code,\n hash: hashedCode,\n type: 'password-reset-otp',\n });\n }\n }\n\n return c.json(\n {\n message: 'If account exists, reset code sent',\n // Only return verificationId for UX - security note: this reveals account existence\n // For stricter security, remove verificationId and use email/sms link with token\n verificationId,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, gt } from 'drizzle-orm';\nimport {\n accountsInIam,\n sessionsInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { hashPassword, hashToken } from '../../../lib/crypto';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { createPasswordResetSession } from '../helper/session';\nimport type { resetPasswordRoute } from '../password.route';\n\nexport const resetPasswordHandler: RouteHandler<\n typeof resetPasswordRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code, password } = body;\n\n const [verification] = await database\n .select()\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.id, verificationId),\n eq(verificationsInIam.tenantId, resolvedTenantId),\n ),\n )\n .limit(1);\n\n if (!verification) {\n return c.json({ error: AUTH_ERRORS.VERIFICATION_NOT_FOUND }, 400);\n }\n\n if (\n verification.type !== 'password-reset' &&\n verification.type !== 'password-reset-otp'\n ) {\n return c.json({ error: AUTH_ERRORS.VERIFICATION_NOT_FOUND }, 400);\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n return c.json({ error: AUTH_ERRORS.VERIFICATION_EXPIRED }, 400);\n }\n\n const maxAttempts =\n verification.type === 'password-reset'\n ? config.email.maxAttempts\n : config.phone.maxAttempts;\n if ((verification.attempt || 0) >= maxAttempts) {\n await database\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n return c.json({ error: AUTH_ERRORS.TOO_MANY_ATTEMPTS }, 400);\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await database\n .update(verificationsInIam)\n .set({ attempt: (verification.attempt || 0) + 1 })\n .where(eq(verificationsInIam.id, verificationId));\n return c.json({ error: AUTH_ERRORS.VERIFICATION_MISMATCH }, 400);\n }\n\n const passwordHash = await hashPassword(password);\n await database\n .update(accountsInIam)\n .set({ password: passwordHash })\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, verification.userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, resolvedTenantId),\n eq(sessionsInIam.userId, verification.userId),\n gt(sessionsInIam.expiresAt, new Date().toISOString()),\n ),\n );\n\n await database\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n\n const [user] = await database\n .select()\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.id, verification.userId),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n )\n .limit(1);\n\n if (!user) {\n return c.json({ error: 'User not found' }, 400);\n }\n\n return createPasswordResetSession({\n c,\n user,\n config,\n database,\n tenantId: resolvedTenantId,\n });\n};\n","import { sessionsInIam } from '../../../db/schema';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { generateToken, hashToken } from '../../../lib/crypto';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { addDuration } from '../../../lib/session';\nimport type { CreatePasswordResetSessionParams } from '../password.types';\n\nexport const createPasswordResetSession = async ({\n c,\n user,\n config,\n database,\n tenantId,\n}: CreatePasswordResetSessionParams) => {\n const sessionToken = generateToken();\n const hashedToken = await hashToken(sessionToken, config.secret);\n const expiresAt = addDuration(config.session.expiresIn);\n\n const [session] = await database\n .insert(sessionsInIam)\n .values({\n tenantId,\n userId: user.id,\n token: hashedToken,\n expiresAt,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n meta: { action: 'password-reset' },\n })\n .returning();\n\n setSessionCookie(c, sessionToken, config, {\n expires: new Date(expiresAt),\n });\n\n return c.json(\n {\n user: normalizeUser(user),\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\n sessionExpiresAt: session.expiresAt,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { accountsInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { verifyPassword } from '../../../lib/crypto';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { verifyPasswordRoute } from '../password.route';\n\nexport const verifyPasswordHandler: RouteHandler<\n typeof verifyPasswordRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n const { password } = body;\n\n const [account] = await database\n .select()\n .from(accountsInIam)\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n )\n .limit(1);\n\n if (!account?.password) {\n return c.json({ error: AUTH_ERRORS.HAS_NO_PASSWORD }, 401);\n }\n\n const passwordValid = await verifyPassword(password, account.password);\n if (!passwordValid) {\n return c.json({ error: AUTH_ERRORS.INVALID_PASSWORD }, 401);\n }\n\n return c.json({ message: 'Password verified' }, 200);\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport { getPermissionHandler } from './handler/get-permission';\nimport { listPermissionsHandler } from './handler/list-permissions';\nimport {\n errorResponseSchema,\n listPermissionsQuerySchema,\n listPermissionsResponseSchema,\n permissionIdParamSchema,\n permissionResponseSchema,\n} from './permissions.schema';\n\nexport const listPermissionsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Permissions'],\n summary: 'List permissions',\n request: {\n query: listPermissionsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listPermissionsResponseSchema,\n },\n },\n description: 'List of permissions',\n },\n },\n});\n\nexport const getPermissionRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Permissions'],\n summary: 'Get permission by ID',\n request: {\n params: permissionIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: permissionResponseSchema,\n },\n },\n description: 'Permission details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Permission not found',\n },\n },\n});\n\nconst permissionRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(listPermissionsRoute, listPermissionsHandler)\n .openapi(getPermissionRoute, getPermissionHandler);\n\nexport default permissionRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { eq } from 'drizzle-orm';\nimport { permissionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getPermissionRoute } from '../permissions.route';\n\nexport const getPermissionHandler: RouteHandler<\n typeof getPermissionRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n\n const [permission] = await database\n .select()\n .from(permissionsInIam)\n .where(eq(permissionsInIam.id, id))\n .limit(1);\n\n if (!permission) {\n return c.json({ error: 'Permission not found' }, 404);\n }\n\n return c.json({ permission }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, ilike, sql } from 'drizzle-orm';\nimport { permissionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listPermissionsRoute } from '../permissions.route';\n\nexport const listPermissionsHandler: RouteHandler<\n typeof listPermissionsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [];\n if (query.application) {\n conditions.push(\n ilike(permissionsInIam.application, `%${query.application}%`),\n );\n }\n if (query.feature) {\n conditions.push(ilike(permissionsInIam.feature, `%${query.feature}%`));\n }\n\n const [permissions, totalResult] = await Promise.all([\n database\n .select()\n .from(permissionsInIam)\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(permissionsInIam)\n .where(conditions.length > 0 ? and(...conditions) : undefined),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ permissions, total, page, limit }, 200);\n};\n","import { z } from 'zod';\n\n// Query schemas\nexport const listPermissionsQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n application: z.string().optional(),\n feature: z.string().optional(),\n});\n\n// Path parameter schemas\nexport const permissionIdParamSchema = z.object({\n id: z.string(),\n});\n\n// Response schemas\nexport const permissionSchema = z.object({\n id: z.string(),\n description: z.unknown(),\n activity: z.string(),\n application: z.string(),\n feature: z.string(),\n});\n\nexport const listPermissionsResponseSchema = z.object({\n permissions: z.array(permissionSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const permissionResponseSchema = z.object({\n permission: permissionSchema,\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport {\n authSuccessSchema,\n errorResponseSchema,\n messageWithVerificationIdSchema,\n phoneVerificationConfirmSchema,\n phoneVerificationRequestSchema,\n} from '../auth.schema';\nimport { phoneVerificationConfirmHandler } from './handler/verification-confirm';\nimport { phoneVerificationRequestHandler } from './handler/verification-request';\n\nexport const phoneVerificationRequestRoute = createRoute({\n method: 'post',\n path: '/verification/request',\n tags: ['Phone'],\n summary: 'Request phone OTP',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: phoneVerificationRequestSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: messageWithVerificationIdSchema,\n },\n },\n description: 'OTP sent',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid request',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const phoneVerificationConfirmRoute = createRoute({\n method: 'post',\n path: '/verification/confirm',\n tags: ['Phone'],\n summary: 'Confirm phone OTP',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: phoneVerificationConfirmSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: authSuccessSchema,\n },\n },\n description: 'Phone verified',\n },\n 400: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Invalid verification',\n },\n },\n});\n\nconst phoneRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(phoneVerificationRequestRoute, phoneVerificationRequestHandler)\n .openapi(phoneVerificationConfirmRoute, phoneVerificationConfirmHandler);\n\nexport default phoneRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { fetchUserWithRoles } from '../../../db/orm';\nimport { usersInIam, verificationsInIam } from '../../../db/schema';\nimport { withTransaction } from '../../../db/transaction';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { hashToken } from '../../../lib/crypto';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { createSessionRecord } from '../../auth/helper/session';\nimport { shouldCreateSession } from '../helper/session';\nimport type { phoneVerificationConfirmRoute } from '../phone.route';\n\nconst getSessionAction = (context: string) =>\n context === 'sign-up'\n ? 'phone-verification-sign-up'\n : `phone-verification-${context}`;\n\nexport const phoneVerificationConfirmHandler: RouteHandler<\n typeof phoneVerificationConfirmRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const { verificationId, code, context } = body;\n\n const result = await withTransaction(database, async (tx) => {\n const [verification] = await tx\n .select()\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.id, verificationId),\n eq(verificationsInIam.tenantId, resolvedTenantId),\n ),\n )\n .limit(1);\n\n const expectedType = `phone-otp-${context}`;\n if (!verification || verification.type !== expectedType) {\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_NOT_FOUND,\n };\n }\n\n if (new Date(verification.expiresAt) < new Date()) {\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_EXPIRED,\n };\n }\n\n if ((verification.attempt || 0) >= config.phone.maxAttempts) {\n await tx\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.TOO_MANY_ATTEMPTS,\n };\n }\n\n const hashedCode = await hashToken(code, config.secret);\n if (verification.code !== hashedCode) {\n await tx\n .update(verificationsInIam)\n .set({ attempt: (verification.attempt || 0) + 1 })\n .where(eq(verificationsInIam.id, verificationId));\n return {\n status: 'error' as const,\n error: AUTH_ERRORS.VERIFICATION_MISMATCH,\n };\n }\n\n await tx\n .delete(verificationsInIam)\n .where(eq(verificationsInIam.id, verificationId));\n\n if (shouldCreateSession(context) && verification.userId) {\n await tx\n .update(usersInIam)\n .set({\n phoneVerified: true,\n lastSignInAt: new Date().toISOString(),\n })\n .where(\n and(\n eq(usersInIam.id, verification.userId),\n eq(usersInIam.tenantId, resolvedTenantId),\n ),\n );\n }\n\n if (!verification.userId) {\n return { status: 'error' as const, error: 'User not found' };\n }\n\n const user = await fetchUserWithRoles({\n database: tx,\n userId: verification.userId,\n tenantId: resolvedTenantId,\n });\n\n if (!user) {\n return { status: 'error' as const, error: 'User not found' };\n }\n\n if (!shouldCreateSession(context)) {\n return { status: 'ok' as const, user, session: null };\n }\n\n const { session, sessionToken, expiresAt } = await createSessionRecord({\n tx,\n tenantId: resolvedTenantId,\n userId: user.id,\n config,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n action: getSessionAction(context),\n expiresIn: config.session.expiresIn,\n });\n\n return {\n status: 'ok' as const,\n user,\n session,\n sessionToken,\n expiresAt,\n };\n });\n\n if (result.status === 'error') {\n return c.json({ error: result.error }, 400);\n }\n\n if (!result.session) {\n return c.json(\n {\n user: normalizeUser(result.user),\n session: null,\n },\n 200,\n );\n }\n\n setSessionCookie(c, result.sessionToken, config, {\n expires: new Date(result.expiresAt),\n });\n\n return c.json(\n {\n user: normalizeUser(result.user),\n session: {\n id: result.session.id,\n expiresAt: result.session.expiresAt,\n createdAt: result.session.createdAt,\n userAgent: result.session.userAgent,\n ip: result.session.ip,\n },\n sessionExpiresAt: result.session.expiresAt,\n },\n 200,\n );\n};\n","import { withTransaction } from '../../../db/transaction';\nimport { setSessionCookie } from '../../../lib/cookie';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { createSessionRecord } from '../../auth/helper/session';\nimport type { CreateSessionResponseParams } from '../phone.types';\n\nexport const shouldCreateSession = (context: string) =>\n context === 'sign-in' || context === 'change-phone' || context === 'sign-up';\n\nconst getSessionAction = (context: string) =>\n context === 'sign-up'\n ? 'phone-verification-sign-up'\n : `phone-verification-${context}`;\n\nexport const createSessionResponse = async ({\n c,\n user,\n config,\n database,\n tenantId,\n context,\n}: CreateSessionResponseParams) => {\n const { session, sessionToken, expiresAt } = await withTransaction(\n database,\n async (tx) =>\n createSessionRecord({\n tx,\n tenantId,\n userId: user.id,\n config,\n userAgent: c.req.header('user-agent') || null,\n ip:\n c.req.header('cf-connecting-ip') ||\n c.req.header('x-forwarded-for') ||\n null,\n action: getSessionAction(context),\n expiresIn: config.session.expiresIn,\n }),\n );\n\n setSessionCookie(c, sessionToken, config, {\n expires: new Date(expiresAt),\n });\n\n return c.json(\n {\n user: normalizeUser(user),\n session: {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n },\n sessionExpiresAt: session.expiresAt,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport {\n accountChangesInIam,\n usersInIam,\n verificationsInIam,\n} from '../../../db/schema';\nimport { hashToken } from '../../../lib/crypto';\nimport { addDuration, generateOtpCode } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { checkVerificationResend } from '../../auth/helper/verification';\nimport type { phoneVerificationRequestRoute } from '../phone.route';\n\nexport const phoneVerificationRequestHandler: RouteHandler<\n typeof phoneVerificationRequestRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const user = c.get('user');\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n if (!config.phone.enabled) {\n return c.json({ error: 'Phone authentication is disabled' }, 400);\n }\n\n const { phone, context } = body;\n\n if (!phone) {\n return c.json({ error: 'Phone required' }, 400);\n }\n\n const genericResponse = {\n message: 'If the account exists, a verification code was sent.',\n };\n\n let userId = user?.id;\n if (!userId) {\n const [result] = await database\n .select({ id: usersInIam.id })\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, resolvedTenantId),\n eq(usersInIam.phone, phone),\n ),\n )\n .limit(1);\n\n if (!result) {\n return c.json(genericResponse, 200);\n }\n\n userId = result.id;\n }\n\n const verificationType = `phone-otp-${context}`;\n const resendCheck = await checkVerificationResend({\n database,\n tenantId: resolvedTenantId,\n userId,\n type: verificationType,\n resendInterval: config.phone.resendInterval,\n });\n\n if (resendCheck.blocked) {\n return c.json(\n {\n message: 'Verification recently sent',\n verificationId: resendCheck.verificationId,\n },\n 200,\n );\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, verificationType),\n ),\n );\n\n const code = generateOtpCode(config.phone.otpLength);\n const hashedCode = await hashToken(code, config.secret);\n const expiresAt = addDuration(config.phone.expiresIn);\n\n const [verification] = await database\n .insert(verificationsInIam)\n .values({\n tenantId: resolvedTenantId,\n userId,\n type: verificationType,\n code: hashedCode,\n expiresAt,\n to: phone,\n attempt: 0,\n })\n .returning({\n id: verificationsInIam.id,\n tenantId: verificationsInIam.tenantId,\n userId: verificationsInIam.userId,\n type: verificationsInIam.type,\n code: verificationsInIam.code,\n to: verificationsInIam.to,\n expiresAt: verificationsInIam.expiresAt,\n createdAt: verificationsInIam.createdAt,\n attempt: verificationsInIam.attempt,\n });\n\n if (context === 'change-phone' && user?.id) {\n await database\n .update(accountChangesInIam)\n .set({\n status: 'cancelled',\n cancelledAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n reason: 'replaced',\n })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, user.id),\n eq(accountChangesInIam.changeType, 'phone'),\n eq(accountChangesInIam.status, 'pending'),\n ),\n );\n\n await database.insert(accountChangesInIam).values({\n tenantId: resolvedTenantId,\n userId: user.id,\n changeType: 'phone',\n oldPhone: user.phone ?? '',\n newPhone: phone,\n oldEmail: null,\n newEmail: null,\n status: 'pending',\n expiresAt: verification.expiresAt,\n updatedAt: new Date().toISOString(),\n });\n }\n\n if (config.phone.sendVerificationOTP) {\n await config.phone.sendVerificationOTP({\n phone,\n code,\n hash: hashedCode,\n type: verificationType,\n });\n }\n\n return c.json(\n {\n message: 'Verification code sent',\n verificationId: verification.id,\n },\n 200,\n );\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport { z } from 'zod';\nimport type { AuthEnv } from '../../types/context';\nimport {\n errorResponseSchema,\n pendingAccountChangeResponseSchema,\n profileResponseSchema,\n updateEmailSchema,\n updatePhoneSchema,\n updateProfileSchema,\n userSchema,\n} from '../auth.schema';\nimport { accountChangePendingHandler } from './handler/account-change-pending';\nimport { meHandler } from './handler/me';\nimport { sessionHandler } from './handler/session';\nimport { updateProfileHandler } from './handler/update';\nimport { updateEmailHandler } from './handler/update-email';\nimport { updatePhoneHandler } from './handler/update-phone';\n\nexport const meRoute = createRoute({\n method: 'get',\n path: '/me',\n tags: ['Profile'],\n summary: 'Get current user',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: z.object({ user: userSchema }),\n },\n },\n description: 'Current user',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n },\n});\n\nexport const sessionRoute = createRoute({\n method: 'get',\n path: '/session',\n tags: ['Profile'],\n summary: 'Get current session',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: z.object({\n user: userSchema.nullable(),\n session: z\n .object({\n id: z.string().uuid(),\n expiresAt: z.string().datetime(),\n createdAt: z.string().datetime(),\n userAgent: z.string().nullable(),\n ip: z.string().nullable(),\n })\n .nullable(),\n }),\n },\n },\n description: 'Current session',\n },\n },\n});\n\nexport const updateProfileRoute = createRoute({\n method: 'put',\n path: '/profile',\n tags: ['Profile'],\n summary: 'Update user profile',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updateProfileSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Profile updated',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const updateEmailRoute = createRoute({\n method: 'put',\n path: '/profile/email',\n tags: ['Profile'],\n summary: 'Update user email',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updateEmailSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Email updated',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const updatePhoneRoute = createRoute({\n method: 'put',\n path: '/profile/phone',\n tags: ['Profile'],\n summary: 'Update user phone',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: updatePhoneSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: profileResponseSchema,\n },\n },\n description: 'Phone updated',\n },\n 401: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Unauthorized',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const accountChangePendingRoute = createRoute({\n method: 'get',\n path: '/account-change/pending',\n tags: ['Profile'],\n summary: 'Get pending account change (email/phone)',\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: pendingAccountChangeResponseSchema,\n },\n },\n description: 'Pending account change',\n },\n 401: {\n content: { 'application/json': { schema: errorResponseSchema } },\n description: 'Unauthorized',\n },\n },\n});\n\nconst profileRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(meRoute, meHandler)\n .openapi(sessionRoute, sessionHandler)\n .openapi(updateProfileRoute, updateProfileHandler)\n .openapi(updateEmailRoute, updateEmailHandler)\n .openapi(updatePhoneRoute, updatePhoneHandler)\n .openapi(accountChangePendingRoute, accountChangePendingHandler);\n\nexport default profileRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, gt, sql } from 'drizzle-orm';\nimport { accountChangesInIam, verificationsInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { accountChangePendingRoute } from '../profile.route';\n\nexport const accountChangePendingHandler: RouteHandler<\n typeof accountChangePendingRoute,\n AuthEnv\n> = async (c) => {\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n await database\n .update(accountChangesInIam)\n .set({ status: 'expired' })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, userId),\n sql`${accountChangesInIam.expiresAt} < CURRENT_TIMESTAMP`,\n ),\n );\n\n const [accountChange] = await database\n .select()\n .from(accountChangesInIam)\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.status, 'pending'),\n ),\n )\n .limit(1);\n\n if (!accountChange) {\n return c.json({ accountChange: null, verificationId: null }, 200);\n }\n\n let verification: { id: string; expiresAt: string } | null = null;\n if (accountChange.changeType === 'email' && accountChange.newEmail) {\n const [v] = await database\n .select({\n id: verificationsInIam.id,\n expiresAt: verificationsInIam.expiresAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, 'email-verification'),\n eq(verificationsInIam.to, accountChange.newEmail),\n gt(verificationsInIam.expiresAt, sql`CURRENT_TIMESTAMP`),\n ),\n )\n .limit(1);\n verification = v || null;\n }\n if (accountChange.changeType === 'phone' && accountChange.newPhone) {\n const [v] = await database\n .select({\n id: verificationsInIam.id,\n expiresAt: verificationsInIam.expiresAt,\n })\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.tenantId, resolvedTenantId),\n eq(verificationsInIam.userId, userId),\n eq(verificationsInIam.type, 'phone-otp-change-phone'),\n eq(verificationsInIam.to, accountChange.newPhone),\n gt(verificationsInIam.expiresAt, sql`CURRENT_TIMESTAMP`),\n ),\n )\n .limit(1);\n verification = v || null;\n }\n\n if (!verification) {\n return c.json({ accountChange: null, verificationId: null }, 200);\n }\n\n return c.json(\n {\n accountChange: {\n changeType: accountChange.changeType as 'email' | 'phone',\n newEmail: accountChange.newEmail,\n newPhone: accountChange.newPhone,\n expiresAt: accountChange.expiresAt,\n },\n verificationId: verification.id,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { AuthEnv } from '../../../types/context';\nimport type { meRoute } from '../profile.route';\n\nexport const meHandler: RouteHandler<typeof meRoute, AuthEnv> = (c) => {\n const user = c.get('user');\n\n if (!user) {\n return c.json({ error: 'Unauthorized' }, 401);\n }\n\n return c.json({ user: normalizeUser(user) }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { AuthEnv } from '../../../types/context';\nimport type { sessionRoute } from '../profile.route';\n\nexport const sessionHandler: RouteHandler<typeof sessionRoute, AuthEnv> = (\n c,\n) => {\n const user = c.get('user');\n const session = c.get('session');\n\n return c.json(\n {\n user: user ? normalizeUser(user) : null,\n session: session\n ? {\n id: session.id,\n expiresAt: session.expiresAt,\n createdAt: session.createdAt,\n userAgent: session.userAgent,\n ip: session.ip,\n }\n : null,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateProfileRoute } from '../profile.route';\n\nexport const updateProfileHandler: RouteHandler<\n typeof updateProfileRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const updateData: Partial<typeof usersInIam.$inferInsert> = {};\n if (body.fullName !== undefined) {\n updateData.fullName = body.fullName;\n }\n\n const [updatedUser] = await database\n .update(usersInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(\n and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, resolvedTenantId)),\n )\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (!updatedUser) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n return c.json({ user: normalizeUser(updatedUser) }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, ne, sql } from 'drizzle-orm';\nimport {\n accountChangesInIam,\n accountsInIam,\n sessionsInIam,\n usersInIam,\n} from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateEmailRoute } from '../profile.route';\n\nexport const updateEmailHandler: RouteHandler<\n typeof updateEmailRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n const session = c.get('session');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n if (user.email && session?.id) {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, resolvedTenantId),\n eq(sessionsInIam.userId, userId),\n ne(sessionsInIam.id, session.id),\n ),\n );\n }\n\n const [updatedUser] = await database\n .update(usersInIam)\n .set({\n email: body.email,\n emailVerified: true,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(\n and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, resolvedTenantId)),\n )\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (!updatedUser) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n await database\n .update(accountChangesInIam)\n .set({ status: 'applied' })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.changeType, 'email'),\n eq(accountChangesInIam.newEmail, body.email),\n ),\n );\n\n await database\n .update(accountsInIam)\n .set({ providerAccountId: body.email })\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n\n return c.json({ user: normalizeUser(updatedUser) }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, ne, sql } from 'drizzle-orm';\nimport {\n accountChangesInIam,\n accountsInIam,\n sessionsInIam,\n usersInIam,\n} from '../../../db/schema';\nimport { AUTH_ERRORS } from '../../../errors';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updatePhoneRoute } from '../profile.route';\n\nexport const updatePhoneHandler: RouteHandler<\n typeof updatePhoneRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const userId = c.get('userId');\n const user = c.get('user');\n const session = c.get('session');\n\n if (!userId) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n if (!user) {\n return c.json({ error: AUTH_ERRORS.UNAUTHORIZED }, 401);\n }\n\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n if (user.phone && session?.id) {\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, resolvedTenantId),\n eq(sessionsInIam.userId, userId),\n ne(sessionsInIam.id, session.id),\n ),\n );\n }\n\n const [updatedUser] = await database\n .update(usersInIam)\n .set({\n phone: body.phone,\n phoneVerified: true,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(\n and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, resolvedTenantId)),\n )\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (!updatedUser) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n await database\n .update(accountChangesInIam)\n .set({ status: 'applied' })\n .where(\n and(\n eq(accountChangesInIam.tenantId, resolvedTenantId),\n eq(accountChangesInIam.userId, userId),\n eq(accountChangesInIam.changeType, 'phone'),\n eq(accountChangesInIam.newPhone, body.phone),\n ),\n );\n\n await database\n .update(accountsInIam)\n .set({ providerAccountId: body.phone })\n .where(\n and(\n eq(accountsInIam.tenantId, resolvedTenantId),\n eq(accountsInIam.userId, userId),\n eq(accountsInIam.provider, 'credentials'),\n ),\n );\n\n return c.json({ user: normalizeUser(updatedUser) }, 200);\n};\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport { assignRolePermissionHandler } from './handler/assign-role-permission';\nimport { listRolePermissionsHandler } from './handler/list-role-permissions';\nimport { revokeRolePermissionHandler } from './handler/revoke-role-permission';\nimport {\n assignRolePermissionSchema,\n errorResponseSchema,\n listRolePermissionsQuerySchema,\n listRolePermissionsResponseSchema,\n revokeRolePermissionResponseSchema,\n rolePermissionIdParamSchema,\n rolePermissionResponseSchema,\n} from './role-permissions.schema';\n\nexport const listRolePermissionsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Role Permissions'],\n summary: 'List role permissions',\n request: {\n query: listRolePermissionsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listRolePermissionsResponseSchema,\n },\n },\n description: 'List of role permissions',\n },\n },\n});\n\nexport const assignRolePermissionRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Role Permissions'],\n summary: 'Assign permission to role',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: assignRolePermissionSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: rolePermissionResponseSchema,\n },\n },\n description: 'Permission assigned to role',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Permission already assigned to role',\n },\n },\n});\n\nexport const revokeRolePermissionRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Role Permissions'],\n summary: 'Revoke permission from role',\n request: {\n params: rolePermissionIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: revokeRolePermissionResponseSchema,\n },\n },\n description: 'Permission revoked from role',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role permission not found',\n },\n },\n});\n\nconst rolePermissionRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(listRolePermissionsRoute, listRolePermissionsHandler)\n .openapi(assignRolePermissionRoute, assignRolePermissionHandler)\n .openapi(revokeRolePermissionRoute, revokeRolePermissionHandler);\n\nexport default rolePermissionRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { rolePermissionsInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { assignRolePermissionRoute } from '../role-permissions.route';\n\nexport const assignRolePermissionHandler: RouteHandler<\n typeof assignRolePermissionRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n try {\n const [rolePermission] = await database\n .insert(rolePermissionsInIam)\n .values({\n tenantId: resolvedTenantId,\n roleId: body.roleId,\n permissionId: body.permissionId,\n })\n .returning();\n\n return c.json({ rolePermission }, 201);\n } catch (error: unknown) {\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n error.code === '23505'\n ) {\n return c.json({ error: 'Permission already assigned to role' }, 409);\n }\n throw error;\n }\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { rolePermissionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listRolePermissionsRoute } from '../role-permissions.route';\n\nexport const listRolePermissionsHandler: RouteHandler<\n typeof listRolePermissionsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const conditions = [eq(rolePermissionsInIam.tenantId, tenantId)];\n if (query.roleId) {\n conditions.push(eq(rolePermissionsInIam.roleId, query.roleId));\n }\n if (query.permissionId) {\n conditions.push(eq(rolePermissionsInIam.permissionId, query.permissionId));\n }\n\n const rolePermissions = await database\n .select()\n .from(rolePermissionsInIam)\n .where(and(...conditions));\n\n return c.json({ rolePermissions }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { rolePermissionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { revokeRolePermissionRoute } from '../role-permissions.route';\n\nexport const revokeRolePermissionHandler: RouteHandler<\n typeof revokeRolePermissionRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.id, id),\n eq(rolePermissionsInIam.tenantId, tenantId),\n ),\n )\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Role permission not found' }, 404);\n }\n\n await database\n .delete(rolePermissionsInIam)\n .where(\n and(\n eq(rolePermissionsInIam.id, id),\n eq(rolePermissionsInIam.tenantId, tenantId),\n ),\n );\n\n return c.json({ message: 'Permission revoked from role' }, 200);\n};\n","import { z } from 'zod';\n\n// Query schemas\nexport const listRolePermissionsQuerySchema = z.object({\n roleId: z.uuid().optional(),\n permissionId: z.string().optional(),\n});\n\n// Path parameter schemas\nexport const rolePermissionIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Request body schemas\nexport const assignRolePermissionSchema = z.object({\n roleId: z.uuid(),\n permissionId: z.string(),\n});\n\n// Response schemas\nexport const rolePermissionSchema = z.object({\n id: z.uuid(),\n tenantId: z.string(),\n roleId: z.uuid(),\n permissionId: z.string(),\n});\n\nexport const listRolePermissionsResponseSchema = z.object({\n rolePermissions: z.array(rolePermissionSchema),\n});\n\nexport const rolePermissionResponseSchema = z.object({\n rolePermission: rolePermissionSchema,\n});\n\nexport const revokeRolePermissionResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport { createRoleHandler } from './handler/create-role';\nimport { deleteRoleHandler } from './handler/delete-role';\nimport { getRoleHandler } from './handler/get-role';\nimport { listRolesHandler } from './handler/list-roles';\nimport { updateRoleHandler } from './handler/update-role';\nimport {\n createRoleSchema,\n deleteRoleResponseSchema,\n errorResponseSchema,\n listRolesQuerySchema,\n listRolesResponseSchema,\n roleIdParamSchema,\n roleResponseSchema,\n updateRoleSchema,\n} from './roles.schema';\n\nexport const listRolesRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Roles'],\n summary: 'List roles',\n request: {\n query: listRolesQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listRolesResponseSchema,\n },\n },\n description: 'List of roles',\n },\n },\n});\n\nexport const getRoleRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Roles'],\n summary: 'Get role by ID',\n request: {\n params: roleIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: roleResponseSchema,\n },\n },\n description: 'Role details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nexport const createRoleRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Roles'],\n summary: 'Create role',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: createRoleSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: roleResponseSchema,\n },\n },\n description: 'Role created',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role code already exists',\n },\n },\n});\n\nexport const updateRoleRoute = createRoute({\n method: 'put',\n path: '/{id}',\n tags: ['Roles'],\n summary: 'Update role',\n request: {\n params: roleIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: updateRoleSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: roleResponseSchema,\n },\n },\n description: 'Role updated',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nexport const deleteRoleRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Roles'],\n summary: 'Delete role',\n request: {\n params: roleIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: deleteRoleResponseSchema,\n },\n },\n description: 'Role deleted',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role not found',\n },\n },\n});\n\nconst roleRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(listRolesRoute, listRolesHandler)\n .openapi(getRoleRoute, getRoleHandler)\n .openapi(createRoleRoute, createRoleHandler)\n .openapi(updateRoleRoute, updateRoleHandler)\n .openapi(deleteRoleRoute, deleteRoleHandler);\n\nexport default roleRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { rolesInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { createRoleRoute } from '../roles.route';\n\nexport const createRoleHandler: RouteHandler<\n typeof createRoleRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const [role] = await database\n .insert(rolesInIam)\n .values({\n tenantId: resolvedTenantId,\n name: body.name,\n description: body.description,\n code: body.code,\n })\n .returning();\n\n return c.json({ role }, 201);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { rolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { deleteRoleRoute } from '../roles.route';\n\nexport const deleteRoleHandler: RouteHandler<\n typeof deleteRoleRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n await database\n .delete(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)));\n\n return c.json({ message: 'Role deleted' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { rolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getRoleRoute } from '../roles.route';\n\nexport const getRoleHandler: RouteHandler<\n typeof getRoleRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [role] = await database\n .select()\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!role) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n return c.json({ role }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { rolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listRolesRoute } from '../roles.route';\n\nexport const listRolesHandler: RouteHandler<\n typeof listRolesRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [eq(rolesInIam.tenantId, tenantId)];\n\n const [roles, totalResult] = await Promise.all([\n database\n .select()\n .from(rolesInIam)\n .where(and(...conditions))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(rolesInIam)\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ roles, total, page, limit });\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { rolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateRoleRoute } from '../roles.route';\n\nexport const updateRoleHandler: RouteHandler<\n typeof updateRoleRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(rolesInIam)\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n const updateData: Partial<typeof rolesInIam.$inferInsert> = {};\n\n if (body.name !== undefined) {\n updateData.name = body.name;\n }\n if (body.description !== undefined) {\n updateData.description = body.description;\n }\n if (body.code !== undefined) {\n updateData.code = body.code;\n }\n\n const [updated] = await database\n .update(rolesInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(rolesInIam.id, id), eq(rolesInIam.tenantId, tenantId)))\n .returning();\n\n if (!updated) {\n return c.json({ error: 'Role not found' }, 404);\n }\n\n return c.json({ role: updated }, 200);\n};\n","import { z } from 'zod';\n\n// Query schemas\nexport const listRolesQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n});\n\n// Path parameter schemas\nexport const roleIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Request body schemas\nexport const createRoleSchema = z.object({\n name: z.unknown(),\n description: z.unknown(),\n code: z.string(),\n});\n\nexport const updateRoleSchema = z.object({\n name: z.unknown().optional(),\n description: z.unknown().optional(),\n code: z.string().optional(),\n});\n\n// Response schemas\nexport const roleSchema = z.object({\n id: z.uuid(),\n tenantId: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n name: z.unknown(),\n description: z.unknown(),\n code: z.string(),\n});\n\nexport const listRolesResponseSchema = z.object({\n roles: z.array(roleSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const roleResponseSchema = z.object({\n role: roleSchema,\n});\n\nexport const deleteRoleResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport { getSessionHandler } from './handler/get-session';\nimport { listSessionsHandler } from './handler/list-sessions';\nimport { revokeAllSessionsHandler } from './handler/revoke-all-sessions';\nimport { revokeSessionHandler } from './handler/revoke-session';\nimport {\n errorResponseSchema,\n listSessionsQuerySchema,\n listSessionsResponseSchema,\n revokeSessionResponseSchema,\n sessionIdParamSchema,\n sessionResponseSchema,\n userIdParamSchema,\n} from './sessions.schema';\n\nexport const listSessionsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Sessions'],\n summary: 'List sessions',\n request: {\n query: listSessionsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listSessionsResponseSchema,\n },\n },\n description: 'List of sessions',\n },\n },\n});\n\nexport const getSessionRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Sessions'],\n summary: 'Get session by ID',\n request: {\n params: sessionIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: sessionResponseSchema,\n },\n },\n description: 'Session details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Session not found',\n },\n },\n});\n\nexport const revokeSessionRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Sessions'],\n summary: 'Revoke session',\n request: {\n params: sessionIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: revokeSessionResponseSchema,\n },\n },\n description: 'Session revoked',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Session not found',\n },\n },\n});\n\nexport const revokeAllSessionsRoute = createRoute({\n method: 'delete',\n path: '/user/{userId}',\n tags: ['Sessions'],\n summary: 'Revoke all user sessions',\n request: {\n params: userIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: revokeSessionResponseSchema,\n },\n },\n description: 'All user sessions revoked',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nconst sessionRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(listSessionsRoute, listSessionsHandler)\n .openapi(getSessionRoute, getSessionHandler)\n .openapi(revokeSessionRoute, revokeSessionHandler)\n .openapi(revokeAllSessionsRoute, revokeAllSessionsHandler);\n\nexport default sessionRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { sessionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getSessionRoute } from '../sessions.route';\n\nexport const getSessionHandler: RouteHandler<\n typeof getSessionRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [session] = await database\n .select()\n .from(sessionsInIam)\n .where(and(eq(sessionsInIam.id, id), eq(sessionsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!session) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n return c.json({ session }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { sessionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listSessionsRoute } from '../sessions.route';\n\nexport const listSessionsHandler: RouteHandler<\n typeof listSessionsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [eq(sessionsInIam.tenantId, tenantId)];\n if (query.userId) {\n conditions.push(eq(sessionsInIam.userId, query.userId));\n }\n\n const [sessions, totalResult] = await Promise.all([\n database\n .select()\n .from(sessionsInIam)\n .where(and(...conditions))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(sessionsInIam)\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ sessions, total, page, limit }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { sessionsInIam, usersInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { revokeAllSessionsRoute } from '../sessions.route';\n\nexport const revokeAllSessionsHandler: RouteHandler<\n typeof revokeAllSessionsRoute,\n AuthEnv\n> = async (c) => {\n const { userId } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [user] = await database\n .select()\n .from(usersInIam)\n .where(and(eq(usersInIam.id, userId), eq(usersInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!user) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n await database\n .delete(sessionsInIam)\n .where(\n and(\n eq(sessionsInIam.tenantId, tenantId),\n eq(sessionsInIam.userId, userId),\n ),\n );\n\n return c.json({ message: 'All user sessions revoked' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { sessionsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { revokeSessionRoute } from '../sessions.route';\n\nexport const revokeSessionHandler: RouteHandler<\n typeof revokeSessionRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(sessionsInIam)\n .where(and(eq(sessionsInIam.id, id), eq(sessionsInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Session not found' }, 404);\n }\n\n await database\n .delete(sessionsInIam)\n .where(and(eq(sessionsInIam.id, id), eq(sessionsInIam.tenantId, tenantId)));\n\n return c.json({ message: 'Session revoked' }, 200);\n};\n","import { z } from 'zod';\nimport { sessionSchema } from '../auth.schema';\n\n// Query schemas\nexport const listSessionsQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n userId: z.uuid().optional(),\n});\n\n// Path parameter schemas\nexport const sessionIdParamSchema = z.object({\n id: z.uuid(),\n});\n\nexport const userIdParamSchema = z.object({\n userId: z.uuid(),\n});\n\n// Response schemas\nexport const listSessionsResponseSchema = z.object({\n sessions: z.array(sessionSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const sessionResponseSchema = z.object({\n session: sessionSchema,\n});\n\nexport const revokeSessionResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport { createTenantHandler } from './handler/create-tenant';\nimport { deleteTenantHandler } from './handler/delete-tenant';\nimport { getTenantHandler } from './handler/get-tenant';\nimport { listTenantsHandler } from './handler/list-tenants';\nimport { updateTenantHandler } from './handler/update-tenant';\nimport {\n createTenantSchema,\n deleteTenantResponseSchema,\n errorResponseSchema,\n listTenantsQuerySchema,\n listTenantsResponseSchema,\n tenantIdParamSchema,\n tenantResponseSchema,\n updateTenantSchema,\n} from './tenants.schema';\n\nexport const listTenantsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Tenants'],\n summary: 'List tenants',\n request: {\n query: listTenantsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listTenantsResponseSchema,\n },\n },\n description: 'List of tenants',\n },\n },\n});\n\nexport const getTenantRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Tenants'],\n summary: 'Get tenant by ID',\n request: {\n params: tenantIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: tenantResponseSchema,\n },\n },\n description: 'Tenant details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Tenant not found',\n },\n },\n});\n\nexport const createTenantRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Tenants'],\n summary: 'Create tenant',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: createTenantSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: tenantResponseSchema,\n },\n },\n description: 'Tenant created',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Tenant already exists',\n },\n },\n});\n\nexport const updateTenantRoute = createRoute({\n method: 'put',\n path: '/{id}',\n tags: ['Tenants'],\n summary: 'Update tenant',\n request: {\n params: tenantIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: updateTenantSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: tenantResponseSchema,\n },\n },\n description: 'Tenant updated',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Tenant not found',\n },\n },\n});\n\nexport const deleteTenantRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Tenants'],\n summary: 'Delete tenant',\n request: {\n params: tenantIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: deleteTenantResponseSchema,\n },\n },\n description: 'Tenant deleted',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Tenant not found',\n },\n },\n});\n\nconst tenantRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(listTenantsRoute, listTenantsHandler)\n .openapi(getTenantRoute, getTenantHandler)\n .openapi(createTenantRoute, createTenantHandler)\n .openapi(updateTenantRoute, updateTenantHandler)\n .openapi(deleteTenantRoute, deleteTenantHandler);\n\nexport default tenantRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { eq } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { createTenantRoute } from '../tenants.route';\n\nexport const createTenantHandler: RouteHandler<\n typeof createTenantRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const database = c.get('database');\n\n const [existing] = await database\n .select()\n .from(tenantsInIam)\n .where(eq(tenantsInIam.id, body.id))\n .limit(1);\n\n if (existing) {\n return c.json({ error: 'Tenant already exists' }, 409);\n }\n\n const [tenant] = await database\n .insert(tenantsInIam)\n .values({\n id: body.id,\n name: body.name,\n description: body.description || null,\n theme: body.theme || null,\n supportedLanguages: body.supportedLanguages || null,\n defaultLanguage: body.defaultLanguage || null,\n supportedCurrency: body.supportedCurrency || null,\n defaultCurrency: body.defaultCurrency || null,\n timezone: body.timezone || null,\n isActive: body.isActive ?? true,\n locale: body.locale || null,\n settings: body.settings || null,\n seo: body.seo || null,\n })\n .returning();\n\n return c.json({ tenant }, 201);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { eq } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { deleteTenantRoute } from '../tenants.route';\n\nexport const deleteTenantHandler: RouteHandler<\n typeof deleteTenantRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n\n const [existing] = await database\n .select()\n .from(tenantsInIam)\n .where(eq(tenantsInIam.id, id))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Tenant not found' }, 404);\n }\n\n await database.delete(tenantsInIam).where(eq(tenantsInIam.id, id));\n\n return c.json({ message: 'Tenant deleted' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { eq } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getTenantRoute } from '../tenants.route';\n\nexport const getTenantHandler: RouteHandler<\n typeof getTenantRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n\n const [tenant] = await database\n .select()\n .from(tenantsInIam)\n .where(eq(tenantsInIam.id, id))\n .limit(1);\n\n if (!tenant) {\n return c.json({ error: 'Tenant not found' }, 404);\n }\n\n return c.json({ tenant }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listTenantsRoute } from '../tenants.route';\n\nexport const listTenantsHandler: RouteHandler<\n typeof listTenantsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [];\n if (query.isActive !== undefined) {\n conditions.push(eq(tenantsInIam.isActive, query.isActive));\n }\n\n const [tenants, totalResult] = await Promise.all([\n database\n .select()\n .from(tenantsInIam)\n .where(conditions.length > 0 ? and(...conditions) : undefined)\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(tenantsInIam)\n .where(conditions.length > 0 ? and(...conditions) : undefined),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ tenants, total, page, limit }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { eq, sql } from 'drizzle-orm';\nimport { tenantsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateTenantRoute } from '../tenants.route';\n\nexport const updateTenantHandler: RouteHandler<\n typeof updateTenantRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n\n const [existing] = await database\n .select()\n .from(tenantsInIam)\n .where(eq(tenantsInIam.id, id))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Tenant not found' }, 404);\n }\n\n const updateData: Partial<typeof tenantsInIam.$inferInsert> = {};\n\n if (body.name !== undefined) {\n updateData.name = body.name;\n }\n if (body.description !== undefined) {\n updateData.description = body.description;\n }\n if (body.theme !== undefined) {\n updateData.theme = body.theme;\n }\n if (body.supportedLanguages !== undefined) {\n updateData.supportedLanguages = body.supportedLanguages;\n }\n if (body.defaultLanguage !== undefined) {\n updateData.defaultLanguage = body.defaultLanguage;\n }\n if (body.supportedCurrency !== undefined) {\n updateData.supportedCurrency = body.supportedCurrency;\n }\n if (body.defaultCurrency !== undefined) {\n updateData.defaultCurrency = body.defaultCurrency;\n }\n if (body.timezone !== undefined) {\n updateData.timezone = body.timezone;\n }\n if (body.isActive !== undefined) {\n updateData.isActive = body.isActive;\n }\n if (body.locale !== undefined) {\n updateData.locale = body.locale;\n }\n if (body.settings !== undefined) {\n updateData.settings = body.settings;\n }\n if (body.seo !== undefined) {\n updateData.seo = body.seo;\n }\n\n const [updated] = await database\n .update(tenantsInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(eq(tenantsInIam.id, id))\n .returning();\n\n if (!updated) {\n return c.json({ error: 'Tenant not found' }, 404);\n }\n\n return c.json({ tenant: updated }, 200);\n};\n","import { z } from 'zod';\n\n// Query schemas\nexport const listTenantsQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n isActive: z.coerce.boolean().optional(),\n});\n\n// Path parameter schemas\nexport const tenantIdParamSchema = z.object({\n id: z.string(),\n});\n\n// Request body schemas\nexport const createTenantSchema = z.object({\n id: z.string().max(30),\n name: z.unknown(),\n description: z.unknown().optional(),\n theme: z.unknown().optional(),\n supportedLanguages: z.unknown().optional(),\n defaultLanguage: z.string().optional(),\n supportedCurrency: z.unknown().optional(),\n defaultCurrency: z.string().optional(),\n timezone: z.string().optional(),\n isActive: z.boolean().default(true).optional(),\n locale: z.unknown().optional(),\n settings: z.unknown().optional(),\n seo: z.unknown().optional(),\n});\n\nexport const updateTenantSchema = z.object({\n name: z.unknown().optional(),\n description: z.unknown().nullable().optional(),\n theme: z.unknown().nullable().optional(),\n supportedLanguages: z.unknown().nullable().optional(),\n defaultLanguage: z.string().nullable().optional(),\n supportedCurrency: z.unknown().nullable().optional(),\n defaultCurrency: z.string().nullable().optional(),\n timezone: z.string().nullable().optional(),\n isActive: z.boolean().optional(),\n locale: z.unknown().nullable().optional(),\n settings: z.unknown().nullable().optional(),\n seo: z.unknown().nullable().optional(),\n});\n\n// Response schemas\nexport const tenantSchema = z.object({\n id: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n name: z.unknown(),\n description: z.unknown().nullable(),\n theme: z.unknown().nullable(),\n supportedLanguages: z.unknown().nullable(),\n defaultLanguage: z.string().nullable(),\n supportedCurrency: z.unknown().nullable(),\n defaultCurrency: z.string().nullable(),\n timezone: z.string().nullable(),\n isActive: z.boolean(),\n locale: z.unknown().nullable(),\n settings: z.unknown().nullable(),\n seo: z.unknown().nullable(),\n});\n\nexport const listTenantsResponseSchema = z.object({\n tenants: z.array(tenantSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const tenantResponseSchema = z.object({\n tenant: tenantSchema,\n});\n\nexport const deleteTenantResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport { assignUserRoleHandler } from './handler/assign-user-role';\nimport { listUserRolesHandler } from './handler/list-user-roles';\nimport { revokeUserRoleHandler } from './handler/revoke-user-role';\nimport {\n assignUserRoleSchema,\n errorResponseSchema,\n listUserRolesQuerySchema,\n listUserRolesResponseSchema,\n revokeUserRoleResponseSchema,\n userRoleIdParamSchema,\n userRoleResponseSchema,\n} from './user-roles.schema';\n\nexport const listUserRolesRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['User Roles'],\n summary: 'List user roles',\n request: {\n query: listUserRolesQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listUserRolesResponseSchema,\n },\n },\n description: 'List of user roles',\n },\n },\n});\n\nexport const assignUserRoleRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['User Roles'],\n summary: 'Assign role to user',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: assignUserRoleSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: userRoleResponseSchema,\n },\n },\n description: 'Role assigned to user',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Role already assigned to user',\n },\n },\n});\n\nexport const revokeUserRoleRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['User Roles'],\n summary: 'Revoke role from user',\n request: {\n params: userRoleIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: revokeUserRoleResponseSchema,\n },\n },\n description: 'Role revoked from user',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User role not found',\n },\n },\n});\n\nconst userRoleRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(listUserRolesRoute, listUserRolesHandler)\n .openapi(assignUserRoleRoute, assignUserRoleHandler)\n .openapi(revokeUserRoleRoute, revokeUserRoleHandler);\n\nexport default userRoleRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { userRolesInIam } from '../../../db/schema';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport type { assignUserRoleRoute } from '../user-roles.route';\n\nexport const assignUserRoleHandler: RouteHandler<\n typeof assignUserRoleRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n try {\n const [userRole] = await database\n .insert(userRolesInIam)\n .values({\n tenantId: resolvedTenantId,\n userId: body.userId,\n roleId: body.roleId,\n })\n .returning();\n\n return c.json({ userRole }, 201);\n } catch (error: unknown) {\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n error.code === '23505'\n ) {\n return c.json({ error: 'Role already assigned to user' }, 409);\n }\n throw error;\n }\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { userRolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listUserRolesRoute } from '../user-roles.route';\n\nexport const listUserRolesHandler: RouteHandler<\n typeof listUserRolesRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const conditions = [eq(userRolesInIam.tenantId, tenantId)];\n if (query.userId) {\n conditions.push(eq(userRolesInIam.userId, query.userId));\n }\n if (query.roleId) {\n conditions.push(eq(userRolesInIam.roleId, query.roleId));\n }\n\n const userRoles = await database\n .select()\n .from(userRolesInIam)\n .where(and(...conditions));\n\n return c.json({ userRoles }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { userRolesInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { revokeUserRoleRoute } from '../user-roles.route';\n\nexport const revokeUserRoleHandler: RouteHandler<\n typeof revokeUserRoleRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(userRolesInIam)\n .where(\n and(eq(userRolesInIam.id, id), eq(userRolesInIam.tenantId, tenantId)),\n )\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'User role not found' }, 404);\n }\n\n await database\n .delete(userRolesInIam)\n .where(\n and(eq(userRolesInIam.id, id), eq(userRolesInIam.tenantId, tenantId)),\n );\n\n return c.json({ message: 'Role revoked from user' }, 200);\n};\n","import { z } from 'zod';\n\n// Query schemas\nexport const listUserRolesQuerySchema = z.object({\n userId: z.uuid().optional(),\n roleId: z.uuid().optional(),\n});\n\n// Path parameter schemas\nexport const userRoleIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Request body schemas\nexport const assignUserRoleSchema = z.object({\n userId: z.uuid(),\n roleId: z.uuid(),\n});\n\n// Response schemas\nexport const userRoleSchema = z.object({\n id: z.uuid(),\n tenantId: z.string(),\n userId: z.uuid(),\n roleId: z.uuid(),\n});\n\nexport const listUserRolesResponseSchema = z.object({\n userRoles: z.array(userRoleSchema),\n});\n\nexport const userRoleResponseSchema = z.object({\n userRole: userRoleSchema,\n});\n\nexport const revokeUserRoleResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport { banUserHandler } from './handler/ban-user';\nimport { createUserHandler } from './handler/create-user';\nimport { deleteUserHandler } from './handler/delete-user';\nimport { getUserHandler } from './handler/get-user';\nimport { listUsersHandler } from './handler/list-users';\nimport { searchUsersHandler } from './handler/search-users';\nimport { updateUserHandler } from './handler/update-user';\nimport {\n banUserSchema,\n createUserSchema,\n deleteUserResponseSchema,\n errorResponseSchema,\n listUsersQuerySchema,\n listUsersResponseSchema,\n searchUsersQuerySchema,\n searchUsersResponseSchema,\n updateUserSchema,\n userIdParamSchema,\n userResponseSchema,\n} from './users.schema';\n\nexport const listUsersRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Users'],\n summary: 'List users',\n request: {\n query: listUsersQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listUsersResponseSchema,\n },\n },\n description: 'List of users',\n },\n },\n});\n\nexport const getUserRoute = createRoute({\n method: 'get',\n path: '/{id}',\n tags: ['Users'],\n summary: 'Get user by ID',\n request: {\n params: userIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: userResponseSchema,\n },\n },\n description: 'User details',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const createUserRoute = createRoute({\n method: 'post',\n path: '/',\n tags: ['Users'],\n summary: 'Create user',\n request: {\n body: {\n content: {\n 'application/json': {\n schema: createUserSchema,\n },\n },\n },\n },\n responses: {\n 201: {\n content: {\n 'application/json': {\n schema: userResponseSchema,\n },\n },\n description: 'User created',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User already exists',\n },\n },\n});\n\nexport const updateUserRoute = createRoute({\n method: 'put',\n path: '/{id}',\n tags: ['Users'],\n summary: 'Update user',\n request: {\n params: userIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: updateUserSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: userResponseSchema,\n },\n },\n description: 'User updated',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n 409: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Handle already taken',\n },\n },\n});\n\nexport const deleteUserRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Users'],\n summary: 'Delete user',\n request: {\n params: userIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: deleteUserResponseSchema,\n },\n },\n description: 'User deleted',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const banUserRoute = createRoute({\n method: 'post',\n path: '/{id}/ban',\n tags: ['Users'],\n summary: 'Ban or unban user',\n request: {\n params: userIdParamSchema,\n body: {\n content: {\n 'application/json': {\n schema: banUserSchema,\n },\n },\n },\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: userResponseSchema,\n },\n },\n description: 'User ban status updated',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'User not found',\n },\n },\n});\n\nexport const searchUsersRoute = createRoute({\n method: 'get',\n path: '/search',\n tags: ['Users'],\n summary: 'Search users',\n request: {\n query: searchUsersQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: searchUsersResponseSchema,\n },\n },\n description: 'Search results',\n },\n },\n});\n\nconst userRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(listUsersRoute, listUsersHandler)\n .openapi(getUserRoute, getUserHandler)\n .openapi(createUserRoute, createUserHandler)\n .openapi(updateUserRoute, updateUserHandler)\n .openapi(deleteUserRoute, deleteUserHandler)\n .openapi(banUserRoute, banUserHandler)\n .openapi(searchUsersRoute, searchUsersHandler);\n\nexport default userRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { User } from '../../../types';\nimport type { AuthEnv } from '../../../types/context';\nimport type { banUserRoute } from '../users.route';\n\nexport const banUserHandler: RouteHandler<\n typeof banUserRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(usersInIam)\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n const [updated] = await database\n .update(usersInIam)\n .set({\n bannedUntil: body.bannedUntil || null,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)))\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (!updated) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n return c.json({ user: normalizeUser(updated as User) }, 200);\n};\n","import { and, eq, sql } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport type {\n CheckHandleExistsParams,\n CheckUserExistsParams,\n} from '../users.types';\n\nexport const checkUserExists = async ({\n database,\n identifier,\n tenantId,\n isEmail,\n}: CheckUserExistsParams) => {\n const whereClause = isEmail\n ? and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.email}) = lower(${identifier})`,\n )\n : and(eq(usersInIam.tenantId, tenantId), eq(usersInIam.phone, identifier));\n\n const [user] = await database\n .select()\n .from(usersInIam)\n .where(whereClause)\n .limit(1);\n\n return user || null;\n};\n\nexport const checkHandleExists = async ({\n database,\n handle,\n tenantId,\n}: CheckHandleExistsParams) => {\n const [existingHandle] = await database\n .select()\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.handle}) = lower(${handle})`,\n ),\n )\n .limit(1);\n\n return existingHandle || null;\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { usersInIam } from '../../../db/schema';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport { generateHandle } from '../../../lib/session';\nimport { ensureTenantId } from '../../../lib/tenant';\nimport type { AuthEnv } from '../../../types/context';\nimport { checkHandleExists, checkUserExists } from '../helper/user';\nimport type { createUserRoute } from '../users.route';\n\nexport const createUserHandler: RouteHandler<\n typeof createUserRoute,\n AuthEnv\n> = async (c) => {\n const body = c.req.valid('json');\n const config = c.get('config');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n const resolvedTenantId = ensureTenantId(config, tenantId);\n\n const identifier = body.email || body.phone;\n if (!identifier) {\n return c.json({ error: 'Either email or phone is required' }, 409);\n }\n const isEmail = identifier.includes('@');\n\n const existing = await checkUserExists({\n database,\n identifier,\n tenantId: resolvedTenantId,\n isEmail,\n });\n\n if (existing) {\n return c.json({ error: 'User already exists' }, 409);\n }\n\n const userHandle = body.handle || generateHandle();\n\n const existingHandle = await checkHandleExists({\n database,\n handle: userHandle,\n tenantId: resolvedTenantId,\n });\n\n if (existingHandle) {\n return c.json({ error: 'Handle already taken' }, 409);\n }\n\n const [user] = await database\n .insert(usersInIam)\n .values({\n tenantId: resolvedTenantId,\n fullName: body.fullName,\n handle: userHandle,\n email: body.email || null,\n phone: body.phone || null,\n image: body.image || null,\n emailVerified: Boolean(body.emailVerified),\n phoneVerified: Boolean(body.phoneVerified),\n })\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n return c.json({ user: normalizeUser(user) }, 201);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { deleteUserRoute } from '../users.route';\n\nexport const deleteUserHandler: RouteHandler<\n typeof deleteUserRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(usersInIam)\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n await database\n .delete(usersInIam)\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)));\n\n return c.json({ message: 'User deleted' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { fetchUserWithRoles } from '../../../db/orm';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { AuthEnv } from '../../../types/context';\nimport type { getUserRoute } from '../users.route';\n\nexport const getUserHandler: RouteHandler<\n typeof getUserRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const user = await fetchUserWithRoles({\n database,\n userId: id,\n tenantId,\n });\n\n if (!user) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n return c.json({ user: normalizeUser(user) }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, ilike, sql } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listUsersRoute } from '../users.route';\n\nexport const listUsersHandler: RouteHandler<\n typeof listUsersRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [eq(usersInIam.tenantId, tenantId)];\n\n if (query.email) {\n conditions.push(ilike(usersInIam.email, `%${query.email}%`));\n }\n if (query.phone) {\n conditions.push(ilike(usersInIam.phone, `%${query.phone}%`));\n }\n if (query.handle) {\n conditions.push(ilike(usersInIam.handle, `%${query.handle}%`));\n }\n\n const [users, totalResult] = await Promise.all([\n database\n .select({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n })\n .from(usersInIam)\n .where(and(...conditions))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(usersInIam)\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json(\n {\n users: users.map((u) => ({\n ...u,\n userRoles: null,\n })),\n total,\n page,\n limit,\n },\n 200,\n );\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, ilike, or } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { searchUsersRoute } from '../users.route';\n\nexport const searchUsersHandler: RouteHandler<\n typeof searchUsersRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const limit = query.limit || 20;\n const conditions = [eq(usersInIam.tenantId, tenantId)];\n\n if (query.search && query.search.trim().length > 0) {\n const searchCondition = or(\n ilike(usersInIam.fullName, `%${query.search}%`),\n ilike(usersInIam.email, `%${query.search}%`),\n ilike(usersInIam.handle, `%${query.search}%`),\n );\n if (searchCondition) {\n conditions.push(searchCondition);\n }\n }\n\n const users = await database\n .select({\n id: usersInIam.id,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n })\n .from(usersInIam)\n .where(and(...conditions))\n .limit(limit);\n\n return c.json({ users }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { usersInIam } from '../../../db/schema';\nimport { normalizeUser } from '../../../lib/normalize-user';\nimport type { User } from '../../../types';\nimport type { AuthEnv } from '../../../types/context';\nimport type { updateUserRoute } from '../users.route';\n\nexport const updateUserHandler: RouteHandler<\n typeof updateUserRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const body = c.req.valid('json');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(usersInIam)\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)))\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n if (body.handle && body.handle !== existing.handle) {\n const [handleExists] = await database\n .select()\n .from(usersInIam)\n .where(\n and(\n eq(usersInIam.tenantId, tenantId),\n sql`lower(${usersInIam.handle}) = lower(${body.handle})`,\n ),\n )\n .limit(1);\n if (handleExists) {\n return c.json({ error: 'Handle already taken' }, 409);\n }\n }\n\n const updateData: Partial<typeof usersInIam.$inferInsert> = {};\n\n if (body.fullName !== undefined) {\n updateData.fullName = body.fullName;\n }\n if (body.email !== undefined) {\n updateData.email = body.email;\n }\n if (body.phone !== undefined) {\n updateData.phone = body.phone;\n }\n if (body.handle !== undefined) {\n updateData.handle = body.handle;\n }\n if (body.image !== undefined) {\n updateData.image = body.image;\n }\n if (body.emailVerified !== undefined) {\n updateData.emailVerified = body.emailVerified;\n }\n if (body.phoneVerified !== undefined) {\n updateData.phoneVerified = body.phoneVerified;\n }\n\n const [updated] = await database\n .update(usersInIam)\n .set({\n ...updateData,\n updatedAt: sql`CURRENT_TIMESTAMP`,\n })\n .where(and(eq(usersInIam.id, id), eq(usersInIam.tenantId, tenantId)))\n .returning({\n id: usersInIam.id,\n tenantId: usersInIam.tenantId,\n fullName: usersInIam.fullName,\n email: usersInIam.email,\n phone: usersInIam.phone,\n handle: usersInIam.handle,\n image: usersInIam.image,\n emailVerified: usersInIam.emailVerified,\n phoneVerified: usersInIam.phoneVerified,\n lastSignInAt: usersInIam.lastSignInAt,\n });\n\n if (!updated) {\n return c.json({ error: 'User not found' }, 404);\n }\n\n return c.json({ user: normalizeUser(updated as User) }, 200);\n};\n","import { z } from 'zod';\nimport { userSchema } from '../auth.schema';\n\n// Query schemas\nexport const listUsersQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n tenantId: z.string().optional(),\n email: z.string().optional(),\n phone: z.string().optional(),\n handle: z.string().optional(),\n});\n\n// Path parameter schemas\nexport const userIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Request body schemas\nexport const createUserSchema = z.object({\n email: z.string().email().optional(),\n phone: z.string().optional(),\n fullName: z.string().min(1),\n handle: z.string().optional(),\n image: z.string().url().optional(),\n emailVerified: z.boolean().default(false).optional(),\n phoneVerified: z.boolean().default(false).optional(),\n});\n\nexport const updateUserSchema = z.object({\n fullName: z.string().min(1).optional(),\n email: z.string().email().nullable().optional(),\n phone: z.string().nullable().optional(),\n handle: z.string().optional(),\n image: z.string().url().nullable().optional(),\n emailVerified: z.boolean().optional(),\n phoneVerified: z.boolean().optional(),\n});\n\nexport const banUserSchema = z.object({\n bannedUntil: z.string().datetime().nullable().optional(),\n});\n\n// Response schemas\nexport const listUsersResponseSchema = z.object({\n users: z.array(userSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const userResponseSchema = z.object({\n user: userSchema,\n});\n\nexport const deleteUserResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n\nexport const searchUsersQuerySchema = z.object({\n search: z.string().optional().describe('Search term'),\n limit: z.coerce\n .number()\n .int()\n .positive()\n .optional()\n .default(20)\n .describe('Limit'),\n});\n\nexport const userSearchResultSchema = z.object({\n id: z.string().uuid().describe('User ID'),\n fullName: z.string().describe('Full name'),\n email: z.string().nullable().describe('Email'),\n phone: z.string().nullable().describe('Phone'),\n handle: z.string().describe('Handle'),\n image: z.string().nullable().describe('Image URL'),\n});\n\nexport const searchUsersResponseSchema = z.object({\n users: z.array(userSearchResultSchema).describe('Users'),\n});\n","import { createRoute, OpenAPIHono } from '@hono/zod-openapi';\nimport type { AuthEnv } from '../../types/context';\nimport { invalidateVerificationHandler } from './handler/invalidate-verification';\nimport { listVerificationsHandler } from './handler/list-verifications';\nimport {\n errorResponseSchema,\n invalidateVerificationResponseSchema,\n listVerificationsQuerySchema,\n listVerificationsResponseSchema,\n verificationIdParamSchema,\n} from './verifications.schema';\n\nexport const listVerificationsRoute = createRoute({\n method: 'get',\n path: '/',\n tags: ['Verifications'],\n summary: 'List verifications',\n request: {\n query: listVerificationsQuerySchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: listVerificationsResponseSchema,\n },\n },\n description: 'List of verifications',\n },\n },\n});\n\nexport const invalidateVerificationRoute = createRoute({\n method: 'delete',\n path: '/{id}',\n tags: ['Verifications'],\n summary: 'Invalidate verification',\n request: {\n params: verificationIdParamSchema,\n },\n responses: {\n 200: {\n content: {\n 'application/json': {\n schema: invalidateVerificationResponseSchema,\n },\n },\n description: 'Verification invalidated',\n },\n 404: {\n content: {\n 'application/json': {\n schema: errorResponseSchema,\n },\n },\n description: 'Verification not found',\n },\n },\n});\n\nconst verificationRoutes = new OpenAPIHono<AuthEnv>()\n .openapi(listVerificationsRoute, listVerificationsHandler)\n .openapi(invalidateVerificationRoute, invalidateVerificationHandler);\n\nexport default verificationRoutes;\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq } from 'drizzle-orm';\nimport { verificationsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { invalidateVerificationRoute } from '../verifications.route';\n\nexport const invalidateVerificationHandler: RouteHandler<\n typeof invalidateVerificationRoute,\n AuthEnv\n> = async (c) => {\n const { id } = c.req.valid('param');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const [existing] = await database\n .select()\n .from(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.id, id),\n eq(verificationsInIam.tenantId, tenantId),\n ),\n )\n .limit(1);\n\n if (!existing) {\n return c.json({ error: 'Verification not found' }, 404);\n }\n\n await database\n .delete(verificationsInIam)\n .where(\n and(\n eq(verificationsInIam.id, id),\n eq(verificationsInIam.tenantId, tenantId),\n ),\n );\n\n return c.json({ message: 'Verification invalidated' }, 200);\n};\n","import type { RouteHandler } from '@hono/zod-openapi';\nimport { and, eq, sql } from 'drizzle-orm';\nimport { verificationsInIam } from '../../../db/schema';\nimport type { AuthEnv } from '../../../types/context';\nimport type { listVerificationsRoute } from '../verifications.route';\n\nexport const listVerificationsHandler: RouteHandler<\n typeof listVerificationsRoute,\n AuthEnv\n> = async (c) => {\n const query = c.req.valid('query');\n const database = c.get('database');\n const tenantId = c.get('tenantId');\n\n const page = query.page || 1;\n const limit = query.limit || 20;\n const offset = (page - 1) * limit;\n\n const conditions = [eq(verificationsInIam.tenantId, tenantId)];\n if (query.userId) {\n conditions.push(eq(verificationsInIam.userId, query.userId));\n }\n if (query.type) {\n conditions.push(eq(verificationsInIam.type, query.type));\n }\n if (query.status) {\n if (query.status === 'active') {\n conditions.push(sql`${verificationsInIam.expiresAt} > CURRENT_TIMESTAMP`);\n } else if (query.status === 'expired') {\n conditions.push(\n sql`${verificationsInIam.expiresAt} <= CURRENT_TIMESTAMP`,\n );\n } else if (query.status === 'consumed') {\n conditions.push(sql`${verificationsInIam.attempt} >= 3`);\n }\n }\n\n const [verifications, totalResult] = await Promise.all([\n database\n .select()\n .from(verificationsInIam)\n .where(and(...conditions))\n .limit(limit)\n .offset(offset),\n database\n .select({ count: sql<number>`count(*)` })\n .from(verificationsInIam)\n .where(and(...conditions)),\n ]);\n\n const total = Number(totalResult[0]?.count || 0);\n\n return c.json({ verifications, total, page, limit }, 200);\n};\n","import { z } from 'zod';\n\n// Query schemas\nexport const listVerificationsQuerySchema = z.object({\n page: z.coerce.number().min(1).default(1).optional(),\n limit: z.coerce.number().min(1).max(100).default(20).optional(),\n userId: z.uuid().optional(),\n type: z.string().optional(),\n status: z.enum(['active', 'expired', 'consumed']).optional(),\n});\n\n// Path parameter schemas\nexport const verificationIdParamSchema = z.object({\n id: z.uuid(),\n});\n\n// Response schemas\nexport const verificationSchema = z.object({\n id: z.uuid(),\n tenantId: z.string(),\n userId: z.uuid(),\n code: z.string(),\n expiresAt: z.string(),\n type: z.string().nullable(),\n attempt: z.number().nullable(),\n to: z.string().nullable(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\nexport const listVerificationsResponseSchema = z.object({\n verifications: z.array(verificationSchema),\n total: z.number(),\n page: z.number(),\n limit: z.number(),\n});\n\nexport const invalidateVerificationResponseSchema = z.object({\n message: z.string(),\n});\n\nexport const errorResponseSchema = z.object({\n error: z.string(),\n});\n","import type { AuthConfig, Database, Session, User } from '../types';\nimport type { AuthContext } from '../types/context';\n\nexport const setAuthContext = ({\n c,\n config,\n database,\n user,\n session,\n}: {\n c: AuthContext;\n config: AuthConfig;\n database: Database;\n user?: User;\n session?: Session;\n}): void => {\n c.set('config', config);\n c.set('database', database);\n c.set('tenantId', config.tenant?.tenantId || 'tenant');\n c.set('userId', user?.id);\n c.set('user', user);\n c.set('session', session);\n};\n","import { Scalar } from '@scalar/hono-api-reference';\n\nexport type DocsConfig = {\n title?: string;\n theme?:\n | 'default'\n | 'moon'\n | 'purple'\n | 'saturn'\n | 'bluePlanet'\n | 'kepler'\n | 'mars';\n openApiPath?: string;\n favicon?: string;\n};\n\nexport const createDocsHandler = (config: DocsConfig = {}) => {\n return Scalar({\n url: config.openApiPath || '/openapi.json',\n theme: config.theme || 'saturn',\n pageTitle: config.title || 'IAM API Reference',\n favicon: config.favicon || '/favicon.ico',\n });\n};\n","import type { AuthConfig } from '../types';\n\nexport const createOpenApiConfig = (config: AuthConfig) => {\n const basePath = config.basePath || '';\n const servers = config.docs?.servers || [\n {\n url: 'http://localhost:3000',\n description: 'Development server',\n },\n ];\n const serversWithBasePath = servers.map((server) => ({\n ...server,\n url: `${server.url.replace(/\\/$/, '')}${basePath}`,\n }));\n\n return {\n openapi: '3.0.0',\n info: {\n title: config.docs?.title || 'IAM API',\n version: config.docs?.version || '1.0.0',\n description: 'Complete Identity and Access Management API',\n },\n servers: serversWithBasePath,\n tags: [\n { name: 'Auth', description: 'Authentication endpoints' },\n { name: 'Profile', description: 'User profile management' },\n { name: 'Password', description: 'Password management' },\n { name: 'Email', description: 'Email verification' },\n { name: 'Phone', description: 'Phone verification' },\n { name: 'Users', description: 'User management (IAM)' },\n { name: 'Tenants', description: 'Tenant management (IAM)' },\n { name: 'Domains', description: 'Domain management (IAM)' },\n { name: 'Roles', description: 'Role management (IAM)' },\n { name: 'Permissions', description: 'Permission management (IAM)' },\n {\n name: 'Role Permissions',\n description: 'Role-permission mapping (IAM)',\n },\n { name: 'User Roles', description: 'User-role assignment (IAM)' },\n { name: 'Sessions', description: 'Session management (IAM)' },\n { name: 'Verifications', description: 'Verification management (IAM)' },\n ],\n 'x-tagGroups': [\n {\n name: 'Authentication',\n tags: ['Auth', 'Profile', 'Password', 'Email', 'Phone'],\n },\n {\n name: 'IAM Management',\n tags: [\n 'Users',\n 'Tenants',\n 'Domains',\n 'Roles',\n 'Permissions',\n 'Role Permissions',\n 'User Roles',\n 'Sessions',\n 'Verifications',\n ],\n },\n ],\n };\n};\n","import { createMiddleware } from 'hono/factory';\n\nexport const createSessionMiddleware = () => {\n return createMiddleware(async (c, next) => {\n const authInstance = c.get('auth');\n if (!authInstance) {\n c.set('user', null);\n c.set('session', null);\n c.set('userId', null);\n return await next();\n }\n const sessionData = await authInstance.getSession(c);\n\n const { session, user } = sessionData;\n if (!(session && user)) {\n c.set('user', null);\n c.set('session', null);\n c.set('userId', null);\n await next();\n return;\n }\n\n c.set('user', user);\n c.set('session', session);\n c.set('userId', user.id);\n await next();\n });\n};\n","import { logger } from '@mesob/common';\n\nimport { createMiddleware } from 'hono/factory';\nimport { HTTPException } from 'hono/http-exception';\nimport type { Database } from '../db';\nimport {\n findTenantByDomain,\n findTenantById,\n type Tenant,\n} from '../db/orm/tenant';\nimport type { AuthConfig } from '../types';\n\nconst TENANT_TEST_PATH = '/api/health/tenant-test';\nconst AUTH_DOCS_PATHS = [\n '/api/auth/docs',\n '/api/auth/openapi.json',\n '/api/docs',\n '/api/openapi.json',\n];\n\nfunction resolveHost(\n hostHeader: string | undefined,\n forwardedHost: string | undefined,\n): string | null {\n const hostHeaderStr = hostHeader || '';\n const forwardedHostStr = forwardedHost || '';\n\n if (forwardedHostStr) {\n return forwardedHostStr;\n }\n\n if (hostHeaderStr) {\n return hostHeaderStr;\n }\n\n return null;\n}\n\nasync function resolveTenantId(\n database: Database,\n config: AuthConfig,\n host: string,\n): Promise<string | null> {\n // Prioritize config.tenant.tenantId if set\n if (config.tenant?.tenantId) {\n return config.tenant.tenantId;\n }\n\n const normalizedHost = host.toLowerCase().split(':')[0];\n if (\n normalizedHost === 'localhost' ||\n normalizedHost === '127.0.0.1' ||\n normalizedHost.includes('internal')\n ) {\n return 'tenant';\n }\n if (config.tenant?.tenantDomains?.includes(normalizedHost)) {\n return normalizedHost;\n }\n if (normalizedHost.endsWith('.lvh.me')) {\n return normalizedHost.replace('.lvh.me', '');\n }\n return await findTenantByDomain(database, normalizedHost);\n}\n\nasync function resolveTenant(\n database: Database,\n config: AuthConfig,\n host: string,\n): Promise<{ tenantId: string | null; tenant: Tenant | null }> {\n try {\n const tenantId = await resolveTenantId(database, config, host);\n if (!tenantId) {\n return { tenantId: null, tenant: null };\n }\n const tenant = await findTenantById(database, tenantId);\n if (!tenant) {\n return { tenantId: null, tenant: null };\n }\n return { tenantId, tenant };\n } catch (err) {\n logger.error('Tenant resolution error:', err);\n throw err;\n }\n}\n\nfunction validateTenant(\n tenantId: string | null,\n tenant: Tenant | null,\n): string | null {\n if (!tenantId) {\n return 'Unknown workspace domain';\n }\n if (!tenant) {\n return 'Tenant not found';\n }\n if (!tenant.isActive) {\n return 'Tenant inactive';\n }\n return null;\n}\n\nexport const createTenantMiddleware = (\n database: Database,\n config: AuthConfig,\n) => {\n return createMiddleware(async (c, next) => {\n const pathname = new URL(c.req.url).pathname;\n const isTenantTest = pathname === TENANT_TEST_PATH;\n const isAuthDocs = AUTH_DOCS_PATHS.includes(pathname);\n const host = resolveHost(\n c.req.header('host'),\n c.req.header('x-forwarded-host'),\n );\n\n c.set('host', host);\n\n if (!host) {\n if (isTenantTest || isAuthDocs) {\n return await next();\n }\n throw new HTTPException(400, { message: 'Missing Host header' });\n }\n\n let tenantId: string | null = null;\n let tenant: Tenant | null = null;\n\n try {\n const result = await resolveTenant(database, config, host);\n tenantId = result.tenantId;\n tenant = result.tenant;\n } catch {\n if (!isTenantTest) {\n throw new HTTPException(500, { message: 'Tenant resolution failed' });\n }\n }\n\n c.set('tenantId', tenantId);\n c.set('tenant', tenant);\n\n const error = validateTenant(tenantId, tenant);\n if (error && !isTenantTest && !isAuthDocs) {\n throw new HTTPException(404, { message: error });\n }\n\n return await next();\n });\n};\n","import type { Context } from 'hono';\nimport { getCookie } from 'hono/cookie';\nimport type { Database } from './db';\nimport {\n deleteSession,\n fetchSessionByToken,\n fetchUserWithRoles,\n updateSessionExpiry,\n} from './db/orm';\nimport {\n deleteSessionCookie,\n getSessionCookieName,\n setSessionCookie,\n} from './lib/cookie';\nimport { hashToken } from './lib/crypto';\nimport {\n getRefreshedExpiresAt,\n getSessionUpdateAge,\n shouldRefreshSession,\n} from './lib/session';\nimport type { AuthConfig, Session, User } from './types';\n\nexport type GetSessionResult = {\n session: Session | null;\n user: User | null;\n sessionToken: string | null;\n};\n\nexport const createGetSession = (database: Database, config: AuthConfig) => {\n return async (c: Context): Promise<GetSessionResult> => {\n const sessionToken = getCookie(c, getSessionCookieName(config));\n if (!sessionToken) {\n return { session: null, user: null, sessionToken: null };\n }\n\n try {\n const hashedToken = await hashToken(sessionToken, config.secret);\n const session = await fetchSessionByToken({\n database,\n hashedToken,\n tenantId: config.tenant?.tenantId || 'tenant',\n });\n\n if (!session) {\n // Session not found or expired, clear cookie\n deleteSessionCookie(c, config);\n return { session: null, user: null, sessionToken: null };\n }\n\n const user = await fetchUserWithRoles({\n database,\n userId: session.userId,\n tenantId: session.tenantId,\n });\n\n if (!user) {\n await deleteSession({\n database,\n sessionId: session.id,\n tenantId: session.tenantId,\n });\n deleteSessionCookie(c, config);\n return { session: null, user: null, sessionToken: null };\n }\n\n // Check if session needs refresh\n const rememberMe = session.meta?.rememberMe !== false;\n const updateAge = getSessionUpdateAge({\n sessionConfig: config.session,\n rememberMe,\n });\n\n if (shouldRefreshSession({ expiresAt: session.expiresAt, updateAge })) {\n const newExpiresAt = getRefreshedExpiresAt({\n sessionConfig: config.session,\n rememberMe,\n });\n\n // Update session expiry in database\n await updateSessionExpiry({\n database,\n sessionId: session.id,\n tenantId: session.tenantId,\n expiresAt: newExpiresAt,\n });\n\n // Update cookie with new expiry\n setSessionCookie(c, sessionToken, config, {\n expires: new Date(newExpiresAt),\n });\n\n // Return updated session\n return {\n session: { ...session, expiresAt: newExpiresAt },\n user,\n sessionToken,\n };\n }\n\n return { session, user, sessionToken };\n } catch {\n return { session: null, user: null, sessionToken: null };\n }\n };\n};\n","import { logger } from '@mesob/common';\nimport type { Database } from '../db';\n\nexport type { Database } from '../db';\n\nexport type UserRole = {\n id: string;\n roleId: string;\n code: string;\n name: unknown; // jsonb\n description: unknown; // jsonb\n};\n\nexport type User = {\n id: string;\n tenantId: string;\n fullName: string;\n email: string | null;\n phone: string | null;\n handle: string;\n image: string | null;\n emailVerified: boolean;\n phoneVerified: boolean;\n lastSignInAt: string | null;\n bannedUntil?: string | null;\n loginAttempt?: number;\n userRoles?: UserRole[];\n};\n\nexport type SessionMeta = {\n action?: string;\n rememberMe?: boolean;\n};\n\nexport type Session = {\n id: string;\n tenantId: string;\n userId: string;\n expiresAt: string;\n createdAt: string;\n updatedAt?: string;\n userAgent: string | null;\n ip: string | null;\n meta?: SessionMeta | null;\n};\n\nexport type Verification = {\n id: string;\n tenantId: string;\n userId: string;\n type: string;\n code: string;\n to: string | null;\n expiresAt: string;\n createdAt: string;\n attempt: number | null;\n};\n\nexport type Account = {\n id: string;\n tenantId: string;\n userId: string;\n provider: string;\n providerAccountId: string;\n password: string | null;\n};\n\nexport type SendVerificationOTPParams = {\n email?: string;\n phone?: string;\n code: string;\n hash: string;\n type: string;\n};\n\nexport type VerificationConfig = {\n enabled: boolean;\n required: boolean;\n otpLength: number;\n expiresIn: string;\n maxAttempts: number;\n resendInterval?: string;\n sendVerificationOTP?: (\n params: SendVerificationOTPParams,\n ) => Promise<void> | void;\n};\n\nexport type EmailConfig = VerificationConfig;\nexport type PhoneConfig = VerificationConfig;\n\nexport type SessionConfig = {\n /** Default session duration (e.g., '7d', '30d'). Default: '7d' */\n expiresIn: string;\n /** Session duration when \"remember me\" is checked (e.g., '30d'). Default: '30d' */\n rememberMeExpiresIn: string;\n /** Session duration when \"remember me\" is unchecked (e.g., '1h'). Default: '1h' */\n shortSessionExpiresIn: string;\n /** Refresh session if remaining time is less than this (e.g., '1d'). Default: '1d' */\n updateAge: string;\n /** Refresh short session if remaining time is less than this (e.g., '15m'). Default: '15m' */\n shortSessionUpdateAge: string;\n /** Maximum concurrent sessions per user */\n maxPerUser?: number;\n};\n\nexport type SecurityConfig = {\n maxLoginAttempts: number;\n lockoutDuration: string;\n};\n\nexport type TenantConfig = {\n enabled?: boolean;\n tenantId?: string;\n tenantDomains?: string[];\n};\n\nexport type DocsConfig = {\n enabled?: boolean;\n title?: string;\n version?: string;\n theme?:\n | 'default'\n | 'moon'\n | 'purple'\n | 'saturn'\n | 'bluePlanet'\n | 'kepler'\n | 'mars';\n servers?: Array<{ url: string; description?: string }>;\n};\n\nexport type CookieConfig = {\n prefix?: string;\n};\n\nexport type SMSConfig = {\n baseUrl: string;\n identifierId: string;\n senderName: string;\n apiKey: string;\n templateVerification?: string;\n templateLogin?: string;\n};\n\nexport type ResendConfig = {\n apiKey: string;\n from: string;\n verificationSubject?: string;\n resetPasswordSubject?: string;\n};\n\nexport type AuthConfig = {\n connectionString: string;\n secret: string;\n basePath?: string;\n tenant?: TenantConfig;\n docs?: DocsConfig;\n cookie?: CookieConfig;\n session: SessionConfig;\n email: EmailConfig;\n phone: PhoneConfig;\n security?: SecurityConfig;\n};\n\nexport type { AuthContext, AuthEnv } from './context';\n\nexport type CreateAuthRoutesOptions = {\n config: AuthConfig;\n database: Database;\n};\n\nexport type MesobAuth = {\n routes: ReturnType<typeof import('../handler').createAuthRoutes>;\n getSession: (c: import('hono').Context) => Promise<{\n session: Session | null;\n user: User | null;\n sessionToken: string | null;\n }>;\n tenantMiddleware: import('hono').MiddlewareHandler;\n sessionMiddleware: import('hono').MiddlewareHandler;\n};\n\nconst createDefaultSendVerificationOTP = (expiresIn: string) => {\n return (params: SendVerificationOTPParams): void => {\n logger.log(\n `[Verification OTP] Code: ${params.code}, Hash: ${params.hash}, ExpiresIn: ${expiresIn}, Type: ${params.type}`,\n );\n };\n};\n\nconst defaultConfig = {\n enabled: true,\n required: true,\n otpLength: 6,\n expiresIn: '15m',\n maxAttempts: 5,\n resendInterval: '30s',\n sendVerificationOTP: createDefaultSendVerificationOTP('15m'),\n} satisfies VerificationConfig;\n\ntype DefaultAuthConfig = {\n readonly tenant: {\n readonly enabled: true;\n readonly tenantId: 'tenant';\n };\n readonly docs: {\n readonly enabled: true;\n };\n readonly cookie: {\n readonly prefix: 'msb';\n };\n readonly session: {\n readonly expiresIn: '7d';\n readonly rememberMeExpiresIn: '30d';\n readonly shortSessionExpiresIn: '1h';\n readonly updateAge: '1d';\n readonly shortSessionUpdateAge: '15m';\n readonly maxPerUser: 5;\n };\n readonly email: typeof defaultConfig;\n readonly phone: typeof defaultConfig;\n readonly security: {\n readonly maxLoginAttempts: 5;\n readonly lockoutDuration: '15m';\n };\n};\n\nexport const defaultAuthConfig: DefaultAuthConfig = {\n tenant: {\n enabled: true,\n tenantId: 'tenant',\n },\n docs: {\n enabled: true,\n },\n cookie: {\n prefix: 'msb',\n },\n session: {\n expiresIn: '7d',\n rememberMeExpiresIn: '30d',\n shortSessionExpiresIn: '1h',\n updateAge: '1d',\n shortSessionUpdateAge: '15m',\n maxPerUser: 5,\n },\n email: defaultConfig,\n phone: defaultConfig,\n security: {\n maxLoginAttempts: 5,\n lockoutDuration: '15m',\n },\n} as const;\n","import { lt } from 'drizzle-orm';\nimport type { Database } from '../db';\nimport { sessionsInIam, verificationsInIam } from '../db/schema';\n\nexport const cleanupExpiredVerifications = async (database: Database) => {\n const now = new Date().toISOString();\n\n const result = await database\n .delete(verificationsInIam)\n .where(lt(verificationsInIam.expiresAt, now));\n\n return result;\n};\n\nexport const cleanupExpiredSessions = async (database: Database) => {\n const now = new Date().toISOString();\n\n const result = await database\n .delete(sessionsInIam)\n .where(lt(sessionsInIam.expiresAt, now));\n\n return result;\n};\n\nexport const cleanupExpiredData = async (database: Database) => {\n await Promise.all([\n cleanupExpiredVerifications(database),\n cleanupExpiredSessions(database),\n ]);\n};\n"],"mappings":"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","names":["OpenAPIHono","getCookie","and","eq","sql","and","sql","eq","and","eq","sql","sql","and","eq","OpenAPIHono","and","eq","sql","sql","and","eq","and","eq","and","eq","gt","sql","sql","and","eq","gt","and","eq","gt","sql","and","eq","sql","gt","dayjs","and","eq","and","eq","dayjs","and","eq","and","eq","gt","and","eq","gt","createRoute","OpenAPIHono","z","errorResponseSchema","and","eq","and","eq","and","eq","and","eq","and","eq","sql","eq","and","sql","and","eq","sql","and","eq","sql","and","eq","sql","and","eq","sql","createRoute","errorResponseSchema","OpenAPIHono","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","sql","and","eq","sql","createRoute","OpenAPIHono","createRoute","OpenAPIHono","and","eq","gt","getCookie","and","eq","getCookie","gt","and","eq","sql","sql","and","eq","and","eq","gt","and","eq","gt","and","eq","and","eq","createRoute","OpenAPIHono","createRoute","OpenAPIHono","eq","eq","and","sql","and","sql","z","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","and","eq","createRoute","OpenAPIHono","createRoute","OpenAPIHono","z","and","eq","gt","sql","and","eq","sql","gt","and","eq","sql","sql","and","eq","and","eq","ne","sql","and","eq","ne","sql","and","eq","ne","sql","and","eq","ne","sql","createRoute","z","OpenAPIHono","createRoute","OpenAPIHono","and","eq","eq","and","and","eq","and","eq","z","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","and","eq","and","eq","sql","eq","and","sql","and","eq","sql","and","eq","sql","z","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","sql","eq","and","sql","and","eq","and","eq","and","eq","and","eq","z","z","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","createRoute","OpenAPIHono","eq","eq","eq","eq","eq","eq","and","eq","sql","eq","and","sql","eq","sql","eq","sql","z","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","createRoute","OpenAPIHono","and","eq","eq","and","and","eq","and","eq","z","userRoleSchema","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","createRoute","OpenAPIHono","and","eq","sql","and","eq","sql","and","eq","sql","and","eq","sql","and","eq","and","eq","and","eq","ilike","sql","eq","ilike","and","sql","and","eq","ilike","eq","ilike","and","and","eq","sql","and","eq","sql","z","z","userIdParamSchema","errorResponseSchema","createRoute","userIdParamSchema","errorResponseSchema","OpenAPIHono","createRoute","OpenAPIHono","and","eq","and","eq","and","eq","sql","eq","sql","and","z","errorResponseSchema","createRoute","errorResponseSchema","OpenAPIHono","OpenAPIHono","getCookie","OpenAPIHono","createMiddleware","HTTPException","createMiddleware","HTTPException","getCookie","getCookie","logger","routes"]}
|