{"version":3,"file":"d1-identity.mjs","names":["DatabaseService"],"sources":["../../src/drizzle/d1-identity.ts"],"sourcesContent":["import type * as D1Client from \"@effect/sql-d1/D1Client\";\nimport { withStorageValidation } from \"@yielded/auth-persistence/Adapter\";\nimport {\n  ExternalIdentityMutation,\n  type ExternalIdentity,\n  IdentityConflict,\n  IdentityUnavailable,\n  SubjectProvisioned,\n  SubjectProvisioner,\n  type SubjectProvisioningInput,\n} from \"@yielded/auth/Identity\";\nimport { reportPersistenceFailure } from \"@yielded/auth/Persistence\";\nimport type { SubjectId } from \"@yielded/auth/Schema\";\n/* oxlint-disable no-explicit-any -- D1 batch bridges Drizzle SQL objects to Effect SQL Statements at this adapter boundary. */\nimport {\n  and,\n  eq,\n  getTableColumns,\n  is,\n  sql,\n  SQL,\n  type InferInsertModel,\n  type Table,\n} from \"drizzle-orm\";\nimport type { EffectSQLiteD1Database } from \"drizzle-orm/effect-d1\";\nimport type { AnySQLiteTable, SQLiteColumn } from \"drizzle-orm/sqlite-core\";\nimport * as Cause from \"effect/Cause\";\nimport * as Effect from \"effect/Effect\";\nimport * as Schema from \"effect/Schema\";\n\nimport { Database as DatabaseService } from \"./d1-database\";\nimport {\n  column,\n  isMappedConstraintConflict,\n  provisioningFingerprint,\n  type D1ExternalIdentityMapping,\n  type D1GeneratedIdentityMapping,\n  type D1SubjectProvisioningMapping,\n} from \"./model\";\nimport { NativeDatabase, nativeDatabase } from \"./native-database\";\nimport { validateDrizzleStorage } from \"./storage-validation\";\n\ntype RuntimeDatabase = EffectSQLiteD1Database<any> & { readonly $client: D1Client.D1Client };\nconst unavailable = () => IdentityUnavailable.make();\nconst isIdentityFailure = Schema.is(Schema.Union([IdentityConflict, IdentityUnavailable]));\n\nconst mapUnavailable = <A, E, R>(effect: Effect.Effect<A, E, R>) =>\n  reportPersistenceFailure(effect, isIdentityFailure, { markReported: true }).pipe(\n    Effect.catchCause((cause) =>\n      Effect.failCause(\n        Cause.map(cause, (error) => (isIdentityFailure(error) ? error : unavailable())),\n      ),\n    ),\n  );\n\nconst selectFields = <T extends Table>(\n  table: T,\n  values: InferInsertModel<T>,\n): Record<string, unknown> => {\n  const columns = getTableColumns(table) as Record<string, SQLiteColumn>;\n\n  const fields = Object.fromEntries(\n    Object.entries(values)\n      .filter(([, value]) => value !== undefined)\n      .map(([key, value]) => [\n        key,\n        is(value, SQL) ? value : sql`${sql.param(value, columns[key] as SQLiteColumn)}`,\n      ]),\n  );\n\n  for (const [key, mapped] of Object.entries(columns)) {\n    if (\n      fields[key] !== undefined ||\n      (\n        mapped as SQLiteColumn & { readonly shouldDisableInsert: () => boolean }\n      ).shouldDisableInsert()\n    )\n      continue;\n    if (mapped.default !== null && mapped.default !== undefined) continue;\n\n    const value =\n      mapped.defaultFn !== undefined\n        ? mapped.defaultFn()\n        : !mapped.default && mapped.onUpdateFn !== undefined\n          ? mapped.onUpdateFn()\n          : undefined;\n\n    if (value !== undefined || mapped.defaultFn !== undefined || mapped.onUpdateFn !== undefined)\n      fields[key] = is(value, SQL) ? value : sql`${sql.param(value, mapped)}`;\n  }\n\n  return fields;\n};\n\n/**\n * D1 provisioning is an ordered atomic batch. The receipt captures the\n * database-generated subject id from the first insert via last_insert_rowid;\n * the optional identifier then reads that stable id from the receipt.\n */\nexport const makeD1SubjectProvisioningServices = Effect.fnUntraced(function* <\n  Subject extends AnySQLiteTable,\n  Identifier extends AnySQLiteTable,\n  Request extends AnySQLiteTable,\n  NativeId,\n>(mapping: D1SubjectProvisioningMapping<Subject, Identifier, Request, NativeId>) {\n  const database = yield* DatabaseService;\n\n  yield* validateDrizzleStorage(mapping).pipe(\n    Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n    Effect.catchCause((cause) =>\n      Effect.failCause(Cause.map(cause, () => IdentityUnavailable.make())),\n    ),\n  );\n\n  const db = database as RuntimeDatabase;\n  const requestTable = mapping.provisioningRequest.table;\n\n  const requestIdColumn = column(\n    requestTable,\n    mapping.provisioningRequest.requestId,\n  ) as SQLiteColumn;\n\n  const requestFingerprintColumn = column(\n    requestTable,\n    mapping.provisioningRequest.fingerprint,\n  ) as SQLiteColumn;\n\n  const requestSubjectColumn = column(\n    requestTable,\n    mapping.provisioningRequest.subjectId,\n  ) as SQLiteColumn;\n\n  const findReceipt = Effect.fn(\"DrizzleD1Identity.findReceipt\")(function* (requestId: string) {\n    const rows = yield* db\n      .select({ fingerprint: requestFingerprintColumn, subjectId: requestSubjectColumn })\n      .from(requestTable as any)\n      .where(eq(requestIdColumn, requestId))\n      .limit(1);\n\n    return rows[0];\n  });\n\n  const provision = Effect.fn(\"DrizzleD1Identity.provision\")(function* (\n    input: SubjectProvisioningInput,\n  ) {\n    const fingerprint = provisioningFingerprint(input);\n    const existing = yield* findReceipt(input.requestId);\n\n    if (existing !== undefined) {\n      if (existing.fingerprint !== fingerprint) return yield* IdentityConflict.make();\n      const subjectId = yield* mapping.subjectId.toSubject(existing.subjectId as NativeId);\n\n      return SubjectProvisioned.make({ subjectId });\n    }\n\n    const allocated =\n      mapping.subject.allocateId === undefined\n        ? mapping.subject.allocateIdSync?.()\n        : yield* mapping.subject.allocateId;\n\n    const subjectQuery = db\n      .insert(mapping.subject.table as any)\n      .values(mapping.subject.encodeInsert(input, allocated) as any)\n      .toSQL();\n\n    const statements = [db.$client.unsafe(subjectQuery.sql, subjectQuery.params)];\n\n    if (allocated !== undefined) {\n      const requestQuery = db\n        .insert(requestTable as any)\n        .values(\n          mapping.provisioningRequest.encodeInsert(input.requestId, fingerprint, allocated) as any,\n        )\n        .toSQL();\n\n      statements.push(db.$client.unsafe(requestQuery.sql, requestQuery.params));\n\n      if (input.identifier !== undefined) {\n        const identifierQuery = db\n          .insert(mapping.identifier.table as any)\n          .values(\n            mapping.identifier.encodeInsert(input.identifier, allocated, input.verifiedAt) as any,\n          )\n          .toSQL();\n\n        statements.push(db.$client.unsafe(identifierQuery.sql, identifierQuery.params));\n      }\n    } else {\n      if (mapping.d1.generatedRowIdAlias === undefined) return yield* unavailable();\n\n      const mappedColumnNames = Object.values(getTableColumns(mapping.subject.table)).map((value) =>\n        value.name.toLowerCase(),\n      );\n\n      if (mappedColumnNames.includes(mapping.d1.generatedRowIdAlias.toLowerCase()))\n        return yield* unavailable();\n      const subjectIdColumn = column(mapping.subject.table, mapping.subject.id);\n      const rowId = sql.identifier(mapping.d1.generatedRowIdAlias);\n\n      const requestQuery = db\n        .insert(requestTable as any)\n        .values({\n          ...mapping.d1.requestInsertWithoutSubject(input.requestId, fingerprint),\n          [mapping.provisioningRequest.subjectId]:\n            sql`(select ${subjectIdColumn} from ${mapping.subject.table} where ${rowId} = last_insert_rowid())`,\n        } as any)\n        .toSQL();\n\n      statements.push(db.$client.unsafe(requestQuery.sql, requestQuery.params));\n    }\n\n    if (allocated === undefined && input.identifier !== undefined) {\n      const requestIdParam = sql.param(input.requestId, requestIdColumn);\n\n      const identifierQuery = db\n        .insert(mapping.identifier.table as any)\n        .values({\n          ...mapping.d1.identifierInsertWithoutSubject(input.identifier, input.verifiedAt),\n          [mapping.identifier.subjectId]:\n            sql`(select ${requestSubjectColumn} from ${requestTable} where ${requestIdColumn} = ${requestIdParam})`,\n        } as any)\n        .toSQL();\n\n      statements.push(db.$client.unsafe(identifierQuery.sql, identifierQuery.params));\n    }\n    const attempt = db.$client.batch(statements);\n\n    yield* attempt.pipe((effect) =>\n      Effect.catchCauseIf(\n        effect,\n        (cause) =>\n          !(\n            cause.reasons.length === 0 ||\n            !cause.reasons.every(\n              (reason) =>\n                Cause.isFailReason(reason) &&\n                isMappedConstraintConflict(mapping.isConstraintConflict, reason.error),\n            )\n          ),\n        (): Effect.Effect<\n          void,\n          | Effect.Error<typeof attempt>\n          | Effect.Error<ReturnType<typeof findReceipt>>\n          | IdentityConflict\n        > => {\n          return findReceipt(input.requestId).pipe(\n            Effect.flatMap((receipt) =>\n              receipt !== undefined && receipt.fingerprint === fingerprint\n                ? Effect.void\n                : IdentityConflict.make(),\n            ),\n          );\n        },\n      ),\n    );\n    const receipt = yield* findReceipt(input.requestId);\n\n    if (receipt === undefined || receipt.fingerprint !== fingerprint)\n      return yield* IdentityConflict.make();\n    const subjectId = yield* mapping.subjectId.toSubject(receipt.subjectId as NativeId);\n\n    return SubjectProvisioned.make({ subjectId });\n  }, mapUnavailable);\n\n  return { subjectProvisioner: SubjectProvisioner.of({ provision }) } as const;\n});\n\nexport const makeD1ExternalIdentityServices = Effect.fnUntraced(function* <\n  Subject extends AnySQLiteTable,\n  External extends AnySQLiteTable,\n  NativeId,\n>(mapping: D1ExternalIdentityMapping<Subject, External, NativeId>) {\n  const database = yield* DatabaseService;\n\n  yield* validateDrizzleStorage(mapping).pipe(\n    Effect.provideServiceEffect(NativeDatabase, nativeDatabase(DatabaseService)),\n    Effect.catchCause((cause) =>\n      Effect.failCause(Cause.map(cause, () => IdentityUnavailable.make())),\n    ),\n  );\n\n  const db = database as RuntimeDatabase;\n  const externalTable = mapping.externalIdentity.table;\n\n  const externalSubjectIdColumn = column(\n    externalTable,\n    mapping.externalIdentity.subjectId,\n  ) as SQLiteColumn;\n\n  const externalProviderColumn = column(\n    externalTable,\n    mapping.externalIdentity.provider,\n  ) as SQLiteColumn;\n\n  const externalIssuerColumn = column(\n    externalTable,\n    mapping.externalIdentity.issuer,\n  ) as SQLiteColumn;\n\n  const externalSubjectColumn = column(\n    externalTable,\n    mapping.externalIdentity.subject,\n  ) as SQLiteColumn;\n\n  const bind = Effect.fn(\"DrizzleD1Identity.bindExternalIdentity\")(function* (\n    subjectId: SubjectId,\n    identity: ExternalIdentity,\n  ) {\n    const nativeId = yield* mapping.subjectId.toNative(subjectId);\n    const subjectIdColumn = column(mapping.subject.table, mapping.subject.id);\n    const subjectStatusColumn = column(mapping.subject.table, mapping.subject.status);\n    const nativeIdParam = sql.param(nativeId, subjectIdColumn);\n    const activeStatusParam = sql.param(mapping.d1.activeStatusValue, subjectStatusColumn);\n\n    const selection = selectFields(\n      externalTable,\n      mapping.externalIdentity.encodeInsert(identity, nativeId),\n    );\n\n    selection[mapping.externalIdentity.subjectId] = subjectIdColumn;\n\n    const inserted = yield* db\n      .insert(externalTable as any)\n      .select(\n        db\n          .select(selection as any)\n          .from(mapping.subject.table as any)\n          .where(\n            and(eq(subjectIdColumn, nativeIdParam), eq(subjectStatusColumn, activeStatusParam)),\n          ) as any,\n      )\n      .returning({ subjectId: externalSubjectIdColumn })\n      .pipe((effect) =>\n        Effect.catchCauseIf(\n          effect,\n          (cause) =>\n            !(\n              cause.reasons.length === 0 ||\n              !cause.reasons.every(\n                (reason) =>\n                  Cause.isFailReason(reason) &&\n                  isMappedConstraintConflict(mapping.isConstraintConflict, reason.error),\n              )\n            ),\n          () => {\n            return db\n              .select({ subjectId: externalSubjectIdColumn })\n              .from(externalTable as any)\n              .innerJoin(\n                mapping.subject.table as any,\n                and(\n                  eq(externalSubjectIdColumn, subjectIdColumn),\n                  eq(subjectStatusColumn, mapping.d1.activeStatusValue),\n                ),\n              )\n              .where(\n                and(\n                  eq(externalProviderColumn, identity.provider),\n                  eq(externalIssuerColumn, identity.issuer),\n                  eq(externalSubjectColumn, identity.subject),\n                  eq(externalSubjectIdColumn, nativeId),\n                ),\n              )\n              .limit(1);\n          },\n        ),\n      );\n\n    const row = inserted[0];\n\n    if (row === undefined) return yield* IdentityConflict.make();\n    const linked = row.subjectId as NativeId;\n\n    if (!mapping.subjectId.equals(linked, nativeId)) return yield* IdentityConflict.make();\n  }, mapUnavailable);\n\n  return { externalIdentityMutation: ExternalIdentityMutation.of({ bind }) } as const;\n});\n\nexport const makeD1IdentityServices = Effect.fnUntraced(function* <\n  Subject extends AnySQLiteTable,\n  Identifier extends AnySQLiteTable,\n  External extends AnySQLiteTable,\n  Request extends AnySQLiteTable,\n  NativeId,\n>(mapping: D1GeneratedIdentityMapping<Subject, Identifier, External, Request, NativeId>) {\n  return {\n    ...(yield* makeD1SubjectProvisioningServices(mapping)),\n    ...(yield* makeD1ExternalIdentityServices(mapping)),\n  };\n}, withStorageValidation);\n"],"mappings":"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"}