{"version":3,"file":"cosmos-db.cjs","names":["SERVICE_NAME","#db","document: Document"],"sources":["../src/cosmos-db.ts"],"sourcesContent":["import type { CosmosClient, Database } from \"@azure/cosmos\";\nimport { SERVICE_NAME } from \"@storybooker/core/constants\";\nimport type {\n  DatabaseDocumentListOptions,\n  DatabaseService,\n  DatabaseServiceOptions,\n  StoryBookerDatabaseDocument,\n} from \"@storybooker/core/types\";\n\nexport class AzureCosmosDatabaseService implements DatabaseService {\n  #db: Database;\n\n  constructor(client: CosmosClient, dbName = SERVICE_NAME) {\n    this.#db = client.database(dbName);\n  }\n\n  init: DatabaseService[\"init\"] = async (options) => {\n    await this.#db.client.databases.createIfNotExists(\n      { id: this.#db.id },\n      { abortSignal: options.abortSignal },\n    );\n  };\n\n  listCollections: DatabaseService[\"listCollections\"] = async (options) => {\n    const response = await this.#db.containers\n      .readAll({ abortSignal: options.abortSignal })\n      .fetchAll();\n    const collections: string[] = response.resources.map(\n      (resource) => resource.id,\n    );\n\n    return collections;\n  };\n\n  createCollection: DatabaseService[\"createCollection\"] = async (\n    collectionId,\n    options,\n  ) => {\n    await this.#db.containers.create(\n      { id: collectionId },\n      { abortSignal: options.abortSignal },\n    );\n    return;\n  };\n\n  hasCollection: DatabaseService[\"hasCollection\"] = async (\n    collectionId,\n    options,\n  ) => {\n    try {\n      const response = await this.#db\n        .container(collectionId)\n        .read({ abortSignal: options.abortSignal });\n      return !!response.resource;\n    } catch {\n      return false;\n    }\n  };\n\n  deleteCollection: DatabaseService[\"deleteCollection\"] = async (\n    collectionId,\n    options,\n  ) => {\n    await this.#db\n      .container(collectionId)\n      .delete({ abortSignal: options.abortSignal });\n    return;\n  };\n\n  listDocuments: DatabaseService[\"listDocuments\"] = async <\n    Document extends StoryBookerDatabaseDocument,\n  >(\n    collectionId: string,\n    _listOptions: DatabaseDocumentListOptions<Document>,\n    options: DatabaseServiceOptions,\n  ) => {\n    const items = await this.#db\n      .container(collectionId)\n      .items.readAll({ abortSignal: options.abortSignal })\n      .fetchAll();\n    return items.resources as Document[];\n  };\n\n  getDocument: DatabaseService[\"getDocument\"] = async <\n    Document extends StoryBookerDatabaseDocument,\n  >(\n    collectionId: string,\n    documentId: string,\n    options: DatabaseServiceOptions,\n  ) => {\n    const item = this.#db.container(collectionId).item(documentId);\n    const response = await item.read({ abortSignal: options.abortSignal });\n    const document: Document = response.resource;\n    document.id = documentId;\n    return document;\n  };\n\n  createDocument: DatabaseService[\"createDocument\"] = async (\n    collectionId,\n    documentData,\n    options,\n  ) => {\n    await this.#db\n      .container(collectionId)\n      .items.create(documentData, { abortSignal: options.abortSignal });\n    return;\n  };\n\n  hasDocument: DatabaseService[\"hasDocument\"] = async (\n    collectionId,\n    documentId,\n    options,\n  ) => {\n    const item = this.#db.container(collectionId).item(documentId);\n    const response = await item.read({ abortSignal: options.abortSignal });\n    return !!response.resource;\n  };\n\n  deleteDocument: DatabaseService[\"deleteDocument\"] = async (\n    collectionId,\n    documentId,\n    options,\n  ) => {\n    await this.#db\n      .container(collectionId)\n      .item(documentId)\n      .delete({ abortSignal: options.abortSignal });\n    return;\n  };\n\n  // oxlint-disable-next-line max-params\n  updateDocument: DatabaseService[\"updateDocument\"] = async (\n    collectionId,\n    documentId,\n    documentData,\n    options,\n  ) => {\n    await this.#db\n      .container(collectionId)\n      .item(documentId)\n      .patch<Document>(\n        {\n          operations: Object.entries(documentData).map(([key, value]) => ({\n            op: \"replace\",\n            path: `/${key}`,\n            value,\n          })),\n        },\n        { abortSignal: options.abortSignal },\n      );\n\n    return;\n  };\n}\n"],"mappings":";;;;;AASA,IAAa,6BAAb,MAAmE;CACjE;CAEA,YAAY,QAAsB,SAASA,2CAAc;cAIzB,OAAO,YAAY;AACjD,SAAM,MAAKC,GAAI,OAAO,UAAU,kBAC9B,EAAE,IAAI,MAAKA,GAAI,IAAI,EACnB,EAAE,aAAa,QAAQ,aAAa,CACrC;;yBAGmD,OAAO,YAAY;AAQvE,WAPiB,MAAM,MAAKA,GAAI,WAC7B,QAAQ,EAAE,aAAa,QAAQ,aAAa,CAAC,CAC7C,UAAU,EAC0B,UAAU,KAC9C,aAAa,SAAS,GACxB;;0BAKqD,OACtD,cACA,YACG;AACH,SAAM,MAAKA,GAAI,WAAW,OACxB,EAAE,IAAI,cAAc,EACpB,EAAE,aAAa,QAAQ,aAAa,CACrC;;uBAI+C,OAChD,cACA,YACG;AACH,OAAI;AAIF,WAAO,CAAC,EAHS,MAAM,MAAKA,GACzB,UAAU,aAAa,CACvB,KAAK,EAAE,aAAa,QAAQ,aAAa,CAAC,EAC3B;WACZ;AACN,WAAO;;;0BAI6C,OACtD,cACA,YACG;AACH,SAAM,MAAKA,GACR,UAAU,aAAa,CACvB,OAAO,EAAE,aAAa,QAAQ,aAAa,CAAC;;uBAIC,OAGhD,cACA,cACA,YACG;AAKH,WAJc,MAAM,MAAKA,GACtB,UAAU,aAAa,CACvB,MAAM,QAAQ,EAAE,aAAa,QAAQ,aAAa,CAAC,CACnD,UAAU,EACA;;qBAG+B,OAG5C,cACA,YACA,YACG;GAGH,MAAMC,YADW,MADJ,MAAKD,GAAI,UAAU,aAAa,CAAC,KAAK,WAAW,CAClC,KAAK,EAAE,aAAa,QAAQ,aAAa,CAAC,EAClC;AACpC,YAAS,KAAK;AACd,UAAO;;wBAG2C,OAClD,cACA,cACA,YACG;AACH,SAAM,MAAKA,GACR,UAAU,aAAa,CACvB,MAAM,OAAO,cAAc,EAAE,aAAa,QAAQ,aAAa,CAAC;;qBAIvB,OAC5C,cACA,YACA,YACG;AAGH,UAAO,CAAC,EADS,MADJ,MAAKA,GAAI,UAAU,aAAa,CAAC,KAAK,WAAW,CAClC,KAAK,EAAE,aAAa,QAAQ,aAAa,CAAC,EACpD;;wBAGgC,OAClD,cACA,YACA,YACG;AACH,SAAM,MAAKA,GACR,UAAU,aAAa,CACvB,KAAK,WAAW,CAChB,OAAO,EAAE,aAAa,QAAQ,aAAa,CAAC;;wBAKG,OAClD,cACA,YACA,cACA,YACG;AACH,SAAM,MAAKA,GACR,UAAU,aAAa,CACvB,KAAK,WAAW,CAChB,MACC,EACE,YAAY,OAAO,QAAQ,aAAa,CAAC,KAAK,CAAC,KAAK,YAAY;IAC9D,IAAI;IACJ,MAAM,IAAI;IACV;IACD,EAAE,EACJ,EACD,EAAE,aAAa,QAAQ,aAAa,CACrC;;AAxIH,QAAKA,KAAM,OAAO,SAAS,OAAO"}