{"version":3,"file":"base.mjs","sources":["../../../../../rest/base.ts"],"sourcesContent":["import {RestResourceError} from '../lib/error';\nimport {Session} from '../lib/session/session';\nimport {PageInfo, RestRequestReturn} from '../lib/clients/admin/types';\nimport {DataType} from '../lib/clients/types';\nimport {RestClient} from '../lib/clients/admin/rest/client';\nimport {ApiVersion} from '../lib/types';\nimport {ConfigInterface} from '../lib/base-types';\nimport {Headers} from '../runtime/http';\n\nimport {IdSet, Body, ResourcePath, ParamSet, ResourceNames} from './types';\n\ninterface BaseFindArgs {\n  session: Session;\n  params?: ParamSet;\n  urlIds: IdSet;\n  requireIds?: boolean;\n}\n\ninterface BaseConstructorArgs {\n  session: Session;\n  fromData?: Body | null;\n}\n\ninterface SaveArgs {\n  update?: boolean;\n}\n\ninterface RequestArgs extends BaseFindArgs {\n  http_method: string;\n  operation: string;\n  body?: Body | null;\n  entity?: Base | null;\n}\n\ninterface GetPathArgs {\n  http_method: string;\n  operation: string;\n  urlIds: IdSet;\n  entity?: Base | null;\n}\n\ninterface SetClassPropertiesArgs {\n  Client: typeof RestClient;\n  config: ConfigInterface;\n}\n\nexport interface FindAllResponse<T = Base> {\n  data: T[];\n  headers: Headers;\n  pageInfo?: PageInfo;\n}\n\nexport class Base {\n  // For instance attributes\n  [key: string]: any;\n\n  public static Client: typeof RestClient;\n  public static config: ConfigInterface;\n\n  public static apiVersion: string;\n  protected static resourceNames: ResourceNames[] = [];\n\n  protected static primaryKey = 'id';\n  protected static customPrefix: string | null = null;\n  protected static readOnlyAttributes: string[] = [];\n\n  protected static hasOne: Record<string, typeof Base> = {};\n  protected static hasMany: Record<string, typeof Base> = {};\n\n  protected static paths: ResourcePath[] = [];\n\n  public static setClassProperties({Client, config}: SetClassPropertiesArgs) {\n    this.Client = Client;\n    this.config = config;\n  }\n\n  protected static async baseFind<T extends Base = Base>({\n    session,\n    urlIds,\n    params,\n    requireIds = false,\n  }: BaseFindArgs): Promise<FindAllResponse<T>> {\n    if (requireIds) {\n      const hasIds = Object.entries(urlIds).some(([_key, value]) => value);\n\n      if (!hasIds) {\n        throw new RestResourceError(\n          'No IDs given for request, cannot find path',\n        );\n      }\n    }\n\n    const response = await this.request<T>({\n      http_method: 'get',\n      operation: 'get',\n      session,\n      urlIds,\n      params,\n    });\n\n    return {\n      data: this.createInstancesFromResponse<T>(session, response.body as Body),\n      headers: response.headers,\n      pageInfo: response.pageInfo,\n    };\n  }\n\n  protected static async request<T = unknown>({\n    session,\n    http_method,\n    operation,\n    urlIds,\n    params,\n    body,\n    entity,\n  }: RequestArgs): Promise<RestRequestReturn<T>> {\n    const client = new this.Client({\n      session,\n      apiVersion: this.apiVersion as ApiVersion,\n    });\n\n    const path = this.getPath({http_method, operation, urlIds, entity});\n\n    const cleanParams: Record<string, string | number> = {};\n    if (params) {\n      for (const key in params) {\n        if (params[key] !== null) {\n          cleanParams[key] = params[key];\n        }\n      }\n    }\n\n    switch (http_method) {\n      case 'get':\n        return client.get<T>({path, query: cleanParams});\n      case 'post':\n        return client.post<T>({\n          path,\n          query: cleanParams,\n          data: body!,\n          type: DataType.JSON,\n        });\n      case 'put':\n        return client.put<T>({\n          path,\n          query: cleanParams,\n          data: body!,\n          type: DataType.JSON,\n        });\n      case 'delete':\n        return client.delete<T>({path, query: cleanParams});\n      default:\n        throw new Error(`Unrecognized HTTP method \"${http_method}\"`);\n    }\n  }\n\n  protected static getJsonBodyName(): string {\n    return this.name.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();\n  }\n\n  protected static getPath({\n    http_method,\n    operation,\n    urlIds,\n    entity,\n  }: GetPathArgs): string {\n    let match: string | null = null;\n    let specificity = -1;\n\n    const potentialPaths: ResourcePath[] = [];\n    this.paths.forEach((path: ResourcePath) => {\n      if (\n        http_method !== path.http_method ||\n        operation !== path.operation ||\n        path.ids.length <= specificity\n      ) {\n        return;\n      }\n\n      potentialPaths.push(path);\n\n      let pathUrlIds: IdSet = {...urlIds};\n      path.ids.forEach((id) => {\n        if (!pathUrlIds[id] && entity && entity[id]) {\n          pathUrlIds[id] = entity[id];\n        }\n      });\n\n      pathUrlIds = Object.entries(pathUrlIds).reduce(\n        (acc: IdSet, [key, value]: [string, string | number | null]) => {\n          if (value) {\n            acc[key] = value;\n          }\n          return acc;\n        },\n        {},\n      );\n\n      // If we weren't given all of the path's required ids, we can't use it\n      const diff = path.ids.reduce(\n        (acc: string[], id: string) => (pathUrlIds[id] ? acc : acc.concat(id)),\n        [],\n      );\n      if (diff.length > 0) {\n        return;\n      }\n\n      specificity = path.ids.length;\n      match = path.path.replace(\n        /(<([^>]+)>)/g,\n        (_m1, _m2, id) => `${pathUrlIds[id]}`,\n      );\n    });\n\n    if (!match) {\n      const pathOptions = potentialPaths.map((path) => path.path);\n\n      throw new RestResourceError(\n        `Could not find a path for request. If you are trying to make a request to one of the following paths, ensure all relevant IDs are set. :\\n - ${pathOptions.join(\n          '\\n - ',\n        )}`,\n      );\n    }\n\n    if (this.customPrefix) {\n      return `${this.customPrefix}/${match}`;\n    } else {\n      return match;\n    }\n  }\n\n  protected static createInstancesFromResponse<T extends Base = Base>(\n    session: Session,\n    data: Body,\n  ): T[] {\n    let instances: T[] = [];\n    this.resourceNames.forEach((resourceName) => {\n      const singular = resourceName.singular;\n      const plural = resourceName.plural;\n      if (data[plural] || Array.isArray(data[singular])) {\n        instances = instances.concat(\n          (data[plural] || data[singular]).reduce(\n            (acc: T[], entry: Body) =>\n              acc.concat(this.createInstance<T>(session, entry)),\n            [],\n          ),\n        );\n      } else if (data[singular]) {\n        instances.push(this.createInstance<T>(session, data[singular]));\n      }\n    });\n\n    return instances;\n  }\n\n  protected static createInstance<T extends Base = Base>(\n    session: Session,\n    data: Body,\n    prevInstance?: T,\n  ): T {\n    const instance: T = prevInstance\n      ? prevInstance\n      : new (this as any)({session});\n\n    if (data) {\n      instance.setData(data);\n    }\n\n    return instance;\n  }\n\n  #session: Session;\n\n  get session(): Session {\n    return this.#session;\n  }\n\n  constructor({session, fromData}: BaseConstructorArgs) {\n    this.#session = session;\n\n    if (fromData) {\n      this.setData(fromData);\n    }\n  }\n\n  public async save({update = false}: SaveArgs = {}): Promise<void> {\n    const {primaryKey, resourceNames} = this.resource();\n    const method = this[primaryKey] ? 'put' : 'post';\n\n    const data = this.serialize(true);\n\n    const response = await this.resource().request({\n      http_method: method,\n      operation: method,\n      session: this.session,\n      urlIds: {},\n      body: {[this.resource().getJsonBodyName()]: data},\n      entity: this,\n    });\n\n    const flattenResourceNames: string[] = resourceNames.reduce<string[]>(\n      (acc, obj) => {\n        return acc.concat(Object.values(obj));\n      },\n      [],\n    );\n\n    const matchResourceName = Object.keys(response.body as Body).filter(\n      (key: string) => flattenResourceNames.includes(key),\n    );\n\n    const body: Body | undefined = (response.body as Body)[\n      matchResourceName[0]\n    ];\n\n    if (update && body) {\n      this.setData(body);\n    }\n  }\n\n  public async saveAndUpdate(): Promise<void> {\n    await this.save({update: true});\n  }\n\n  public async delete(): Promise<void> {\n    await this.resource().request({\n      http_method: 'delete',\n      operation: 'delete',\n      session: this.session,\n      urlIds: {},\n      entity: this,\n    });\n  }\n\n  public serialize(saving = false): Body {\n    const {hasMany, hasOne, readOnlyAttributes} = this.resource();\n\n    return Object.entries(this).reduce((acc: Body, [attribute, value]) => {\n      if (\n        ['#session'].includes(attribute) ||\n        (saving && readOnlyAttributes.includes(attribute))\n      ) {\n        return acc;\n      }\n\n      if (attribute in hasMany && value) {\n        acc[attribute] = value.reduce((attrAcc: Body, entry: Base) => {\n          return attrAcc.concat(this.serializeSubAttribute(entry, saving));\n        }, []);\n      } else if (attribute in hasOne && value) {\n        acc[attribute] = this.serializeSubAttribute(value, saving);\n      } else {\n        acc[attribute] = value;\n      }\n\n      return acc;\n    }, {});\n  }\n\n  public toJSON(): Body {\n    return this.serialize();\n  }\n\n  public request<T = unknown>(args: RequestArgs) {\n    return this.resource().request<T>(args);\n  }\n\n  protected setData(data: Body): void {\n    const {hasMany, hasOne} = this.resource();\n\n    Object.entries(data).forEach(([attribute, val]) => {\n      if (attribute in hasMany) {\n        const HasManyResource: typeof Base = hasMany[attribute];\n        this[attribute] = [];\n        val.forEach((entry: Body) => {\n          const obj = new HasManyResource({session: this.session});\n          if (entry) {\n            obj.setData(entry);\n          }\n\n          this[attribute].push(obj);\n        });\n      } else if (attribute in hasOne) {\n        const HasOneResource: typeof Base = hasOne[attribute];\n        const obj = new HasOneResource({session: this.session});\n        if (val) {\n          obj.setData(val);\n        }\n        this[attribute] = obj;\n      } else {\n        this[attribute] = val;\n      }\n    });\n  }\n\n  protected resource(): typeof Base {\n    return this.constructor as unknown as typeof Base;\n  }\n\n  private serializeSubAttribute(attribute: Base, saving: boolean): Body {\n    return attribute.serialize\n      ? attribute.serialize(saving)\n      : this.resource()\n          .createInstance(this.session, attribute)\n          .serialize(saving);\n  }\n}\n"],"names":[],"mappings":"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"}