{"version":3,"file":"index.mjs","sources":["../../src/lib/services/case-management/index.mjs"],"sourcesContent":["import axios from 'axios'\nimport { importSPKI, jwtVerify } from 'jose'\n\nconst BASEURL = 'https://apim.looplex.com/case-management'\nconst PUBLIC_KEY = 'LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUF6bzBKWThaeHZSbW9kMUFJNDhqZgo4eW90KzN4VjBkVDU4NzJudFAxdGxUazdOc1VUSUF2V2ZDVk5HR01SRFhucjF1dVVHZlJVZXFFOVhMRDd4RWR3Cmt3b1gzV1BGOE5SS2ZuUUxuNERRVDNxRXJYbklDL0N2M1VIcGxzRFgyUUJMUi9YcEoyMnQ2elJCdERiNm8zUE8KRml1N2FmNmZkSnNNaUR1dCtxdlFwUWpKNG5oU3VTSkhFTXFaQnRYQitNNU1KMWJESUJ5Y2FDK0luSW9kN3o1UAo3eHNmRU5rU1FMM3JCTmhSeWVOOHRndXVobmZzbkZZbnJMNnB6T3Y0Zjdic2ZRZitVMDVBaUd2WnRJdENoNEx3CitURXFlYlMrb1VaOWRxVnVwNmJ4b0p3dDdFK2c0Q2x3MXREc0tZaTRvR2VyUkM4RkdKYXR4aHg4ZTdaWjNGUmoKYk0zL21HTWw1QnkwM015b09mQ2Y0WnErb2tULzErTEZYek95dGNLYzRVcjBiZm1BaGhqZURVN01ab0hUUVNTMQp1TEhBWGtLaUxmaC9QM1JQdjM4b29FQkk0UUxDa2FoZzhmd2Z6UzIzampBQlV2RXJuTjQyWkIyckFPUkgxZTNwCjhDbnhGdmUyRXdWWTlyVlliY1lPdFF2VS9FNnVmeHhYeW4wNk9icUZWdnlDOTlHMXZXU3pJejRLQjlUN2I2emgKWjJ0UU5IdXNVUHB6bTVFUFBOSVBQRVM0eU95ZFR5VFk4TlZFOHFvb3V6aDRGNyt2VEVVa0Zpc05UZUNHZmZqTQp6czYyOTdJbkJPakxDclluVUl6UDRDYkwwdCtLc0psRll2SE9OR1NIQjNkTUM4SW5wQ1VwbFZaV1JBTnBCNEVoCmcvK1Z4SmVIYWdxT0J1eWhNZUhVdFY4Q0F3RUFBUT09Ci0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLQo='\n\nasync function getCopilotEntraAccessToken () {\n  const res = await axios({\n    method: 'POST',\n    url: 'https://actions.looplex.com/api/code/1F83B420-5848-11F0-8074-57094DD09A64'\n  })\n  return res.data.access_token\n}\n\nasync function getSilentlyToken (properties, services) {\n  const { stm } = services\n  const memory = await stm.load('WORKFLOWS_CASE_MANAGEMENT_ACCESS_TOKEN')\n  if (memory) {\n    const { accessToken } = memory\n    const expired = await hasExpired(accessToken)\n    if (accessToken && !expired) return accessToken\n  }\n  const msAccessToken = await getCopilotEntraAccessToken()\n  const accessToken = await exchangeAccessToken(msAccessToken, properties, services)\n  await stm.save('WORKFLOWS_CASE_MANAGEMENT_ACCESS_TOKEN', { accessToken })\n  return accessToken\n}\n\nasync function hasExpired (jwt) {\n  const pem = Buffer.from(PUBLIC_KEY, 'base64').toString('utf8')\n  const jwk = await importSPKI(pem, 'RS256')\n  try {\n    await jwtVerify(jwt, jwk)\n    return false\n  } catch (e) {\n    if (e.code === 'ERR_JWT_EXPIRED') return true\n    throw e\n  }\n}\n\nfunction urlEncodedFromObject (o) {\n  return Object.keys(o)\n    .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(o[k]))\n    .join('&')\n}\n\nasync function exchangeAccessToken (accessToken, properties, services) {\n  const { apimSubscriptionKey } = properties\n  const body = {\n    grant_type: 'urn:ietf:params:oauth:grant-type:token-exchange',\n    subject_token_type: 'urn:ietf:params:oauth:token-type:access_token',\n    subject_token: accessToken\n  }\n  const data = urlEncodedFromObject(body)\n  const res = await axios({\n    method: 'POST',\n    url: `${BASEURL}/v1/token`,\n    headers: {\n      'Ocp-Apim-Subscription-Key': apimSubscriptionKey,\n      'Content-Type': 'application/x-www-form-urlencoded'\n    },\n    data\n  })\n  return res.data.access_token\n}\n\nexport class CaseManagement {\n  constructor (config) {\n    for (const prop of Object.keys(config.properties)) {\n      this[prop] = config.properties[prop]\n    }\n    this.services = config.services\n  }\n\n  static async create (properties, services) {\n    const { tenant, apimSubscriptionKey } = properties\n    const accessToken = await getSilentlyToken(properties, services)\n    const config = {\n      properties: {\n        accessToken: `Bearer ${accessToken}`,\n        apimSubscriptionKey,\n        tenant\n      },\n      services\n    }\n    return new CaseManagement(config)\n  }\n\n  async execute (config) {\n    const requestConfig = Object.assign({\n      baseURL: BASEURL,\n      headers: {\n        'Ocp-Apim-Subscription-Key': this.apimSubscriptionKey,\n        Authorization: this.accessToken,\n        'X-Looplex-Tenant': this.tenant\n      }\n    }, config)\n    try {\n      const res = await axios(requestConfig)\n      return [null, res]\n    } catch (e) {\n      return [e, null]\n    }\n  }\n}\n"],"names":[],"mappings":";;;AAGA,MAAM,OAAO,GAAG;AAChB,MAAM,UAAU,GAAG;;AAEnB,eAAe,0BAA0B,IAAI;AAC7C,EAAE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC;AAC1B,IAAI,MAAM,EAAE,MAAM;AAClB,IAAI,GAAG,EAAE;AACT,GAAG;AACH,EAAE,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB;;AAEA,eAAe,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE;AACvD,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG;AAClB,EAAE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,wCAAwC;AACxE,EAAE,IAAI,MAAM,EAAE;AACd,IAAI,MAAM,EAAE,WAAW,EAAE,GAAG;AAC5B,IAAI,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,WAAW;AAChD,IAAI,IAAI,WAAW,IAAI,CAAC,OAAO,EAAE,OAAO;AACxC,EAAE;AACF,EAAE,MAAM,aAAa,GAAG,MAAM,0BAA0B;AACxD,EAAE,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,aAAa,EAAE,UAAoB;AACnF,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,WAAW,EAAE;AAC1E,EAAE,OAAO;AACT;;AAEA,eAAe,UAAU,EAAE,GAAG,EAAE;AAChC,EAAE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM;AAC/D,EAAE,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,OAAO;AAC3C,EAAE,IAAI;AACN,IAAI,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG;AAC5B,IAAI,OAAO;AACX,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE;AACd,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,EAAE,OAAO;AAC7C,IAAI,MAAM;AACV,EAAE;AACF;;AAEA,SAAS,oBAAoB,EAAE,CAAC,EAAE;AAClC,EAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,KAAK,GAAG,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,KAAK,IAAI,CAAC,GAAG;AACb;;AAEA,eAAe,mBAAmB,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE;AACvE,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG;AAClC,EAAE,MAAM,IAAI,GAAG;AACf,IAAI,UAAU,EAAE,iDAAiD;AACjE,IAAI,kBAAkB,EAAE,+CAA+C;AACvE,IAAI,aAAa,EAAE;AACnB;AACA,EAAE,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI;AACxC,EAAE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC;AAC1B,IAAI,MAAM,EAAE,MAAM;AAClB,IAAI,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC;AAC9B,IAAI,OAAO,EAAE;AACb,MAAM,2BAA2B,EAAE,mBAAmB;AACtD,MAAM,cAAc,EAAE;AACtB,KAAK;AACL,IAAI;AACJ,GAAG;AACH,EAAE,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB;;AAEO,MAAM,cAAc,CAAC;AAC5B,EAAE,WAAW,CAAC,CAAC,MAAM,EAAE;AACvB,IAAI,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE;AACvD,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI;AACzC,IAAI;AACJ,IAAI,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;AAC3B,EAAE;;AAEF,EAAE,aAAa,MAAM,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE;AAC7C,IAAI,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG;AAC5C,IAAI,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,QAAQ;AACnE,IAAI,MAAM,MAAM,GAAG;AACnB,MAAM,UAAU,EAAE;AAClB,QAAQ,WAAW,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAC5C,QAAQ,mBAAmB;AAC3B,QAAQ;AACR,OAAO;AACP,MAAM;AACN;AACA,IAAI,OAAO,IAAI,cAAc,CAAC,MAAM;AACpC,EAAE;;AAEF,EAAE,MAAM,OAAO,CAAC,CAAC,MAAM,EAAE;AACzB,IAAI,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;AACxC,MAAM,OAAO,EAAE,OAAO;AACtB,MAAM,OAAO,EAAE;AACf,QAAQ,2BAA2B,EAAE,IAAI,CAAC,mBAAmB;AAC7D,QAAQ,aAAa,EAAE,IAAI,CAAC,WAAW;AACvC,QAAQ,kBAAkB,EAAE,IAAI,CAAC;AACjC;AACA,KAAK,EAAE,MAAM;AACb,IAAI,IAAI;AACR,MAAM,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,aAAa;AAC3C,MAAM,OAAO,CAAC,IAAI,EAAE,GAAG;AACvB,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE;AAChB,MAAM,OAAO,CAAC,CAAC,EAAE,IAAI;AACrB,IAAI;AACJ,EAAE;AACF;;;;"}