{"version":3,"file":"ajax-result.mjs","sources":["../../../../src/core/http/ajax-result.ts"],"sourcesContent":["import type { IResult } from '../result'\nimport type { Payload, SuccessPayload } from '../../types/payloads'\nimport type { TypeCallParams, TypeHttp } from '../../types/http'\nimport type { TypeDescriptionError, TypeDescriptionErrorV3 } from '../../types/auth'\nimport { Type } from '../../tools/type'\nimport { Text } from '../../tools/text'\nimport { Result } from '../result'\nimport { AjaxError } from './ajax-error'\nimport { ApiVersion } from '../../types/b24'\nimport { SdkError } from '../sdk-error'\n\nexport type AjaxQuery = Readonly<{\n  method: string\n  params: TypeCallParams\n  requestId: string\n}>\n\ntype AjaxResultOptions<T> = Readonly<{\n  answer: Payload<T>\n  query: AjaxQuery\n  status: number\n}>\n\ntype ErrorData = {\n  code: string\n  description: string\n  status: number\n}\n\n/**\n * Result of request to Rest Api\n *\n * @todo docs\n */\nexport class AjaxResult<T = unknown> extends Result<Payload<T>> implements IResult<Payload<T>> {\n  private readonly _status: number\n  private readonly _query: AjaxQuery\n  protected override _data: Payload<T> | null | undefined\n\n  constructor(options: AjaxResultOptions<T>) {\n    super()\n\n    this._data = options.answer ? Object.freeze(options.answer) : undefined\n    this._query = Object.freeze(structuredClone(options.query))\n    this._status = options.status\n\n    this.#processErrors()\n  }\n\n  override get isSuccess(): boolean {\n    return this.#getIsSuccess()\n  }\n\n  /**\n   * @todo test this predicate\n   */\n  #getIsSuccess(): this is { getData: () => SuccessPayload<T> } {\n    return this._errors.size === 0\n  }\n\n  override getData(): undefined | SuccessPayload<T> {\n    if (!this.isSuccess) {\n      return undefined\n    }\n\n    const payload = this._data as SuccessPayload<T>\n\n    return Object.freeze({\n      result: payload.result,\n      time: payload.time\n    }) as SuccessPayload<T>\n  }\n\n  /**\n   * If the response contains error data, we'll restore it to an error.\n   *\n   * @todo make single function\n   * @see AbstractHttp._convertAxiosErrorToAjaxError()\n   */\n  #processErrors(): void {\n    if (this._data && typeof this._data === 'object' && 'error' in this._data) {\n      const responseData = this._data as TypeDescriptionError | TypeDescriptionErrorV3\n\n      if (\n        responseData.error\n        && typeof responseData.error === 'object'\n        && 'code' in responseData.error\n      ) {\n        const errorCode = responseData.error.code\n        let errorDescription = responseData.error.message.trimEnd()\n        if (responseData.error.validation) {\n          if (errorDescription.length > 0) {\n            if (!errorDescription.endsWith('.')) {\n              errorDescription += `.`\n            }\n            errorDescription += ` `\n          }\n          responseData.error.validation.forEach((row) => {\n            errorDescription += `${row?.message || JSON.stringify(row)}`\n          })\n        }\n\n        this.addError(this.#createAjaxError({\n          code: errorCode,\n          description: errorDescription,\n          status: this._status\n        }), 'base-error')\n      } else if (responseData.error && typeof responseData.error === 'string') {\n        const errorCode = responseData.error !== '0' ? responseData.error : 'JSSDK_RESPONSE_ERROR'\n        const errorDescription = (responseData as TypeDescriptionError)?.error_description ?? 'Some error in response'\n\n        this.addError(this.#createAjaxError({\n          code: errorCode,\n          description: errorDescription,\n          status: this._status\n        }), 'base-error')\n      }\n    }\n  }\n\n  #createAjaxError(errorData: ErrorData): AjaxError {\n    return new AjaxError({\n      code: errorData.code,\n      description: errorData.description,\n      status: errorData.status,\n      requestInfo: {\n        method: this._query.method,\n        params: this._query.params,\n        requestId: this._query.requestId\n      }\n    })\n  }\n\n  /**\n   * Alias for isMore\n   *\n   * @deprecated Will be removed in `2.0.0`. Tied to the `restApi:v2` envelope\n   *   field `next`, which `restApi:v3` does not return. Use the SDK's list\n   *   helpers — they hide pagination entirely:\n   *   - `restApi:v2`: {@link CallListV2.make `b24.actions.v2.callList.make`} or {@link FetchListV2.make `b24.actions.v2.fetchList.make`}\n   *   - `restApi:v3`: {@link CallListV3.make `b24.actions.v3.callList.make`} or {@link FetchListV3.make `b24.actions.v3.fetchList.make`}\n   *\n   * @removed 2.0.0\n   */\n  hasMore(): boolean {\n    return this.isMore()\n  }\n\n  /**\n   * @deprecated Will be removed in `2.0.0`. Tied to the `restApi:v2` envelope\n   *   field `next`, which `restApi:v3` does not return. Use the SDK's list\n   *   helpers — they hide pagination entirely:\n   *   - `restApi:v2`: {@link CallListV2.make `b24.actions.v2.callList.make`} or {@link FetchListV2.make `b24.actions.v2.fetchList.make`}\n   *   - `restApi:v3`: {@link CallListV3.make `b24.actions.v3.callList.make`} or {@link FetchListV3.make `b24.actions.v3.fetchList.make`}\n   *\n   * @removed 2.0.0\n   */\n  isMore(): boolean {\n    if (!this.isSuccess) {\n      return false\n    }\n    const payload = this._data as { next?: number }\n    const nextValue = 'next' in payload ? payload.next : undefined\n\n    return Type.isNumber(nextValue)\n  }\n\n  /**\n   * @deprecated Will be removed in `2.0.0`. Tied to the `restApi:v2` envelope\n   *   field `total`, which `restApi:v3` does not return. For `restApi:v3` the\n   *   SDK exposes element counts via the `aggregate` action (`count` /\n   *   `countDistinct`); for `restApi:v2` use the list helpers, which iterate\n   *   without exposing `total`.\n   *\n   * @removed 2.0.0\n   */\n  getTotal(): number {\n    if (!this.isSuccess) {\n      return 0\n    }\n    const payload = this._data as { total?: number }\n    const totalValue = 'total' in payload ? payload.total : undefined\n\n    return Text.toInteger(totalValue)\n  }\n\n  getStatus(): number {\n    return this._status\n  }\n\n  getQuery(): Readonly<AjaxQuery> {\n    return this._query\n  }\n\n  /**\n   * Alias for getNext\n   * @param http\n   *\n   * @deprecated Will be removed in `2.0.0`. `restApi:v3` does not support\n   *   `getNext()` (the v2 envelope field `next` does not exist). Use the SDK's\n   *   list helpers instead — they hide pagination entirely:\n   *   - `restApi:v2`: {@link CallListV2.make `b24.actions.v2.callList.make`} or {@link FetchListV2.make `b24.actions.v2.fetchList.make`}\n   *   - `restApi:v3`: {@link CallListV3.make `b24.actions.v3.callList.make`} or {@link FetchListV3.make `b24.actions.v3.fetchList.make`}\n   *\n   * @removed 2.0.0\n   */\n  async fetchNext(http: TypeHttp): Promise<AjaxResult<T> | null> {\n    const data = await this.getNext(http)\n    if (data === false) {\n      return null\n    }\n\n    return data\n  }\n\n  /**\n   * @deprecated Will be removed in `2.0.0`. Throws on `restApi:v3` because the\n   *   v2 envelope field `next` is not part of the v3 protocol. Use the SDK's\n   *   list helpers instead — they hide pagination entirely:\n   *   - `restApi:v2`: {@link CallListV2.make `b24.actions.v2.callList.make`} or {@link FetchListV2.make `b24.actions.v2.fetchList.make`}\n   *   - `restApi:v3`: {@link CallListV3.make `b24.actions.v3.callList.make`} or {@link FetchListV3.make `b24.actions.v3.fetchList.make`}\n   *\n   * @throws {SdkError} `JSSDK_CORE_METHOD_NOT_SUPPORT_IN_API_V3` when called against a `restApi:v3` HTTP client. This throw is preserved until `2.0.0`.\n   * @removed 2.0.0\n   */\n  async getNext(http: TypeHttp): Promise<AjaxResult<T> | false> {\n    // @todo ! Correction -> we can use pagination to navigate to the next page\n    if (http.apiVersion === ApiVersion.v3) {\n      throw new SdkError({\n        code: 'JSSDK_CORE_METHOD_NOT_SUPPORT_IN_API_V3',\n        description: `restApi:v3 not support method getNext`,\n        status: 500\n      })\n    }\n    if (\n      !this.isSuccess\n      || !this.isMore()\n    ) {\n      return false\n    }\n\n    const nextPageQuery = this.#buildNextPageQuery()\n    return http.call(\n      nextPageQuery.method,\n      nextPageQuery.params\n    ) as Promise<AjaxResult<T>>\n  }\n\n  #buildNextPageQuery(): AjaxQuery {\n    const result = { ...this._query }\n\n    const payload = this._data as { next?: number }\n    const nextValue = 'next' in payload ? payload.next : undefined\n\n    result.params.start = Text.toInteger(Text.toInteger(nextValue))\n\n    return result\n  }\n\n  // Immutable API\n  override setData(): never {\n    throw new ReferenceError('AjaxResult does not allow data modification')\n  }\n}\n"],"names":[],"mappings":"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"}