diff --git a/scripts/generate-types.sh b/scripts/generate-types.sh index 645a418f..ff797fda 100755 --- a/scripts/generate-types.sh +++ b/scripts/generate-types.sh @@ -1,3 +1,3 @@ #!/bin/bash -swagger-typescript-api -p "https://api.entur.io/stop-places/v1/read/api-docs" -n ./src/nsr/types.ts +swagger-typescript-api -p "https://api.entur.io/stop-places/v1/read/api-docs" -n ./src/nsr/types.ts --no-client diff --git a/src/nsr/types.ts b/src/nsr/types.ts index d6739f75..abad5a0b 100644 --- a/src/nsr/types.ts +++ b/src/nsr/types.ts @@ -2557,346 +2557,3 @@ export interface GroupOfOperatorsRefStructure { version?: string; nameOfMemberClass?: string; } - -export type QueryParamsType = Record; -export type ResponseFormat = keyof Omit; - -export interface FullRequestParams extends Omit { - /** set parameter to `true` for call `securityWorker` for this request */ - secure?: boolean; - /** request path */ - path: string; - /** content type of request body */ - type?: ContentType; - /** query params */ - query?: QueryParamsType; - /** format of response (i.e. response.json() -> format: "json") */ - format?: ResponseFormat; - /** request body */ - body?: unknown; - /** base url */ - baseUrl?: string; - /** request cancellation token */ - cancelToken?: CancelToken; -} - -export type RequestParams = Omit; - -export interface ApiConfig { - baseUrl?: string; - baseApiParams?: Omit; - securityWorker?: (securityData: SecurityDataType | null) => Promise | RequestParams | void; - customFetch?: typeof fetch; -} - -export interface HttpResponse extends Response { - data: D; - error: E; -} - -type CancelToken = Symbol | string | number; - -export enum ContentType { - Json = "application/json", - FormData = "multipart/form-data", - UrlEncoded = "application/x-www-form-urlencoded", -} - -export class HttpClient { - public baseUrl: string = "https://api.entur.io/stop-places/v1/read"; - private securityData: SecurityDataType | null = null; - private securityWorker?: ApiConfig["securityWorker"]; - private abortControllers = new Map(); - private customFetch = (...fetchParams: Parameters) => fetch(...fetchParams); - - private baseApiParams: RequestParams = { - credentials: "same-origin", - headers: {}, - redirect: "follow", - referrerPolicy: "no-referrer", - }; - - constructor(apiConfig: ApiConfig = {}) { - Object.assign(this, apiConfig); - } - - public setSecurityData = (data: SecurityDataType | null) => { - this.securityData = data; - }; - - private encodeQueryParam(key: string, value: any) { - const encodedKey = encodeURIComponent(key); - return `${encodedKey}=${encodeURIComponent(typeof value === "number" ? value : `${value}`)}`; - } - - private addQueryParam(query: QueryParamsType, key: string) { - return this.encodeQueryParam(key, query[key]); - } - - private addArrayQueryParam(query: QueryParamsType, key: string) { - const value = query[key]; - return value.map((v: any) => this.encodeQueryParam(key, v)).join("&"); - } - - protected toQueryString(rawQuery?: QueryParamsType): string { - const query = rawQuery || {}; - const keys = Object.keys(query).filter((key) => "undefined" !== typeof query[key]); - return keys - .map((key) => (Array.isArray(query[key]) ? this.addArrayQueryParam(query, key) : this.addQueryParam(query, key))) - .join("&"); - } - - protected addQueryParams(rawQuery?: QueryParamsType): string { - const queryString = this.toQueryString(rawQuery); - return queryString ? `?${queryString}` : ""; - } - - private contentFormatters: Record any> = { - [ContentType.Json]: (input: any) => - input !== null && (typeof input === "object" || typeof input === "string") ? JSON.stringify(input) : input, - [ContentType.FormData]: (input: any) => - Object.keys(input || {}).reduce((formData, key) => { - const property = input[key]; - formData.append( - key, - property instanceof Blob - ? property - : typeof property === "object" && property !== null - ? JSON.stringify(property) - : `${property}`, - ); - return formData; - }, new FormData()), - [ContentType.UrlEncoded]: (input: any) => this.toQueryString(input), - }; - - private mergeRequestParams(params1: RequestParams, params2?: RequestParams): RequestParams { - return { - ...this.baseApiParams, - ...params1, - ...(params2 || {}), - headers: { - ...(this.baseApiParams.headers || {}), - ...(params1.headers || {}), - ...((params2 && params2.headers) || {}), - }, - }; - } - - private createAbortSignal = (cancelToken: CancelToken): AbortSignal | undefined => { - if (this.abortControllers.has(cancelToken)) { - const abortController = this.abortControllers.get(cancelToken); - if (abortController) { - return abortController.signal; - } - return void 0; - } - - const abortController = new AbortController(); - this.abortControllers.set(cancelToken, abortController); - return abortController.signal; - }; - - public abortRequest = (cancelToken: CancelToken) => { - const abortController = this.abortControllers.get(cancelToken); - - if (abortController) { - abortController.abort(); - this.abortControllers.delete(cancelToken); - } - }; - - public request = async ({ - body, - secure, - path, - type, - query, - format, - baseUrl, - cancelToken, - ...params - }: FullRequestParams): Promise> => { - const secureParams = - ((typeof secure === "boolean" ? secure : this.baseApiParams.secure) && - this.securityWorker && - (await this.securityWorker(this.securityData))) || - {}; - const requestParams = this.mergeRequestParams(params, secureParams); - const queryString = query && this.toQueryString(query); - const payloadFormatter = this.contentFormatters[type || ContentType.Json]; - const responseFormat = format || requestParams.format; - - return this.customFetch(`${baseUrl || this.baseUrl || ""}${path}${queryString ? `?${queryString}` : ""}`, { - ...requestParams, - headers: { - ...(type && type !== ContentType.FormData ? { "Content-Type": type } : {}), - ...(requestParams.headers || {}), - }, - signal: cancelToken ? this.createAbortSignal(cancelToken) : void 0, - body: typeof body === "undefined" || body === null ? null : payloadFormatter(body), - }).then(async (response) => { - const r = response as HttpResponse; - r.data = null as unknown as T; - r.error = null as unknown as E; - - const data = !responseFormat - ? r - : await response[responseFormat]() - .then((data) => { - if (r.ok) { - r.data = data; - } else { - r.error = data; - } - return r; - }) - .catch((e) => { - r.error = e; - return r; - }); - - if (cancelToken) { - this.abortControllers.delete(cancelToken); - } - - if (!response.ok) throw data; - return data; - }); - }; -} - -/** - * @title OpenAPI definition - * @version v0 - * @baseUrl https://api.entur.io/stop-places/v1/read - */ -export class Api extends HttpClient { - topographicPlaces = { - /** - * No description - * - * @tags rest-resource - * @name GetTopographicPlaceById - * @request GET:/topographic-places/{id} - */ - getTopographicPlaceById: (id: string, params: RequestParams = {}) => - this.request({ - path: `/topographic-places/${id}`, - method: "GET", - format: "json", - ...params, - }), - }; - tariffZones = { - /** - * No description - * - * @tags rest-resource - * @name GetTariffZoneById - * @request GET:/tariff-zones/{id} - */ - getTariffZoneById: (id: string, params: RequestParams = {}) => - this.request({ - path: `/tariff-zones/${id}`, - method: "GET", - format: "json", - ...params, - }), - }; - stopPlaces = { - /** - * No description - * - * @tags rest-resource - * @name GetStopPlaceById - * @request GET:/stop-places/{id} - */ - getStopPlaceById: (id: string, params: RequestParams = {}) => - this.request({ - path: `/stop-places/${id}`, - method: "GET", - format: "json", - ...params, - }), - }; - quays = { - /** - * No description - * - * @tags rest-resource - * @name GetQuayById - * @request GET:/quays/{id} - */ - getQuayById: (id: string, params: RequestParams = {}) => - this.request({ - path: `/quays/${id}`, - method: "GET", - format: "json", - ...params, - }), - - /** - * No description - * - * @tags rest-resource - * @name GetStopPlaceByQuayId - * @request GET:/quays/{id}/stop-place - */ - getStopPlaceByQuayId: (id: string, params: RequestParams = {}) => - this.request({ - path: `/quays/${id}/stop-place`, - method: "GET", - format: "json", - ...params, - }), - }; - parkings = { - /** - * No description - * - * @tags rest-resource - * @name GetParkingById - * @request GET:/parkings/{id} - */ - getParkingById: (id: string, params: RequestParams = {}) => - this.request({ - path: `/parkings/${id}`, - method: "GET", - format: "json", - ...params, - }), - }; - groupsOfStopPlaces = { - /** - * No description - * - * @tags rest-resource - * @name GetGroupOfStopPlacesById - * @request GET:/groups-of-stop-places/{id} - */ - getGroupOfStopPlacesById: (id: string, params: RequestParams = {}) => - this.request({ - path: `/groups-of-stop-places/${id}`, - method: "GET", - format: "json", - ...params, - }), - }; - fareZones = { - /** - * No description - * - * @tags rest-resource - * @name GetFareZoneById - * @request GET:/fare-zones/{id} - */ - getFareZoneById: (id: string, params: RequestParams = {}) => - this.request({ - path: `/fare-zones/${id}`, - method: "GET", - format: "json", - ...params, - }), - }; -}