From ef0b08d33da56ea4d35784106bd1ddc8d043ca2a Mon Sep 17 00:00:00 2001 From: S4-K1 Date: Mon, 13 May 2024 16:33:14 +0100 Subject: [PATCH 1/4] Product provider API integration --- src/client.ts | 4 +++ src/modules.ts | 1 + src/modules/products.ts | 76 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 src/modules/products.ts diff --git a/src/client.ts b/src/client.ts index 40202df..0d16a89 100644 --- a/src/client.ts +++ b/src/client.ts @@ -111,6 +111,10 @@ export default class TourManager { maps (): Modules.Maps.Api { return new Modules.Maps.Api(this.axios) } + + products (): Modules.Products.Api { + return new Modules.Products.Api(this.axios) + } } /** diff --git a/src/modules.ts b/src/modules.ts index 4671e90..597160a 100644 --- a/src/modules.ts +++ b/src/modules.ts @@ -11,3 +11,4 @@ export * as Images from './modules/images.js' export * as Locations from './modules/locations.js' export * as Organizations from './modules/organizations.js' export * as Maps from './modules/maps.js' +export * as Products from '/modules/products.js' \ No newline at end of file diff --git a/src/modules/products.ts b/src/modules/products.ts new file mode 100644 index 0000000..34d0f8f --- /dev/null +++ b/src/modules/products.ts @@ -0,0 +1,76 @@ +import type { + Paginated, + PaginatedQuery, + QueryBoolean, + Entity, + Fields +} from './common.js' +import type { AxiosInstance } from 'axios' +import { ApiGroup } from './common.js' +import timestamp from '../annotations/timestamp.js' +import type {Organization} from "./organizations"; + +type Price = { + currency: string + value: number +} + +type Provider = { + id: string + organization: Organization + name: string + descriptorUrl: string + enabled: boolean +} + +export interface IProduct extends Entity { + name: string + provider: Provider + groupName: string + description: string | null + category: string + prices: Price[] +} + +export class Product implements IProduct { + readonly id!: string + readonly provider!: Provider + readonly name!: string + readonly groupName!: string + readonly description!: string | null + readonly category!: string + readonly prices!: Price[] + + private readonly axios: AxiosInstance + @timestamp() readonly updated_at!: Date + @timestamp() readonly created_at!: Date + + constructor (data: IProduct, axios: AxiosInstance) { + this.axios = axios + Object.assign(this, data) + } + + async list (provider: Provider): Promise> { + const response = (await this.axios.get>(`/products`, provider.id)) + response.data = response.data.map(p => new Product(p, this.axios)) + return response as Paginated + } + + async reserve (id: string): Promise { + const response = await this.axios.post(`/products/reserve/${id}`) + return new Product(response, this.axios) + } +} + +export class Api extends ApiGroup { + async list (provider: Provider): Promise> { + const response = (await this.axios.get>(`/products`, provider.id)) + response.data = response.data.map(p => new Product(p, this.axios)) + return response as Paginated + } + + async reserve (id: string): Promise { + const response = await this.axios.post(`/products/reserve/${id}`) + return new Product(response, this.axios) + } +} \ No newline at end of file From 06f1c8d6e5085c4c3e020615bbf2f48f9b56b784 Mon Sep 17 00:00:00 2001 From: S4-K1 Date: Mon, 13 May 2024 17:05:46 +0100 Subject: [PATCH 2/4] Tweak --- src/modules.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules.ts b/src/modules.ts index 597160a..e2f9a55 100644 --- a/src/modules.ts +++ b/src/modules.ts @@ -11,4 +11,4 @@ export * as Images from './modules/images.js' export * as Locations from './modules/locations.js' export * as Organizations from './modules/organizations.js' export * as Maps from './modules/maps.js' -export * as Products from '/modules/products.js' \ No newline at end of file +export * as Products from './modules/products.js' \ No newline at end of file From 62d45f8d064254215a3145eb3345a823b3579439 Mon Sep 17 00:00:00 2001 From: S4-K1 Date: Mon, 24 Jun 2024 10:16:08 +0100 Subject: [PATCH 3/4] Accommodations cleanup --- src/client.ts | 4 ++++ src/modules.ts | 3 ++- src/modules/accommodations.ts | 2 +- src/modules/holidayVersion.ts | 15 --------------- 4 files changed, 7 insertions(+), 17 deletions(-) diff --git a/src/client.ts b/src/client.ts index 0d16a89..d6a2619 100644 --- a/src/client.ts +++ b/src/client.ts @@ -115,6 +115,10 @@ export default class TourManager { products (): Modules.Products.Api { return new Modules.Products.Api(this.axios) } + + accommodations (): Modules.Accommodations.Api { + return new Modules.Accommodations.Api(this.axios) + } } /** diff --git a/src/modules.ts b/src/modules.ts index e2f9a55..df5ec90 100644 --- a/src/modules.ts +++ b/src/modules.ts @@ -11,4 +11,5 @@ export * as Images from './modules/images.js' export * as Locations from './modules/locations.js' export * as Organizations from './modules/organizations.js' export * as Maps from './modules/maps.js' -export * as Products from './modules/products.js' \ No newline at end of file +export * as Products from './modules/products.js' +export * as Accommodations from './modules/accommodations' \ No newline at end of file diff --git a/src/modules/accommodations.ts b/src/modules/accommodations.ts index 6e7403c..cc0be32 100644 --- a/src/modules/accommodations.ts +++ b/src/modules/accommodations.ts @@ -85,7 +85,7 @@ export class Accommodation implements IAccommodation { } } -export class Accommodations extends ApiGroup { +export class Api extends ApiGroup { async list (params?: ListAccommodationsQuery): Promise> { const response = (await this.axios.get>('/accommodations', { params })).data diff --git a/src/modules/holidayVersion.ts b/src/modules/holidayVersion.ts index b7d9b18..f6003ae 100644 --- a/src/modules/holidayVersion.ts +++ b/src/modules/holidayVersion.ts @@ -10,25 +10,21 @@ import { Itinerary } from './itinerary.js' import type { Locatable } from './locations.js' import { LocationAttachment } from './locations.js' import {type IMap, Map} from './maps' -import { Accommodation, type IAccommodation } from './accommodations' export interface IHolidayVersion extends Omit { holiday_id: string duration?: number map_id?: string - accommodation_id?: string } export interface UpdateHolidayVersionInput extends UpdateHolidayInput { duration?: number | null map_id?: string | null - accommodation_id?: string | null } export interface CreateHolidayVersionInput extends CreateHolidayInput { duration?: number | null map_id?: string | null - accommodation_id?: string | null } export class HolidayVersion implements IHolidayVersion, Categorized, Locatable { @@ -62,11 +58,6 @@ export class HolidayVersion implements IHolidayVersion, Categorized { - const response = (await this.axios.get(`/accommodations/${this.accommodation_id}`)).data - return new Accommodation(response, this.axios) - } - get departures (): Departures { return new Departures(this.axios, { version: this.id }) } @@ -84,7 +75,6 @@ export class HolidayVersion implements IHolidayVersion, Categorized(`/maps/${id}`)).data return new Map(response, this.axios) } - - async accommodation (id: string): Promise { - const response = (await this.axios.get(`/accommodations/${id}`)).data - return new Accommodation(response, this.axios) - } } From 7c459f27c282859d060d6a35f188df2bb809dd67 Mon Sep 17 00:00:00 2001 From: S4-K1 Date: Mon, 24 Jun 2024 10:27:03 +0100 Subject: [PATCH 4/4] Revert --- src/client.ts | 4 ---- src/modules.ts | 3 +-- src/modules/accommodations.ts | 2 +- src/modules/holidayVersion.ts | 15 +++++++++++++++ 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/client.ts b/src/client.ts index d6a2619..0d16a89 100644 --- a/src/client.ts +++ b/src/client.ts @@ -115,10 +115,6 @@ export default class TourManager { products (): Modules.Products.Api { return new Modules.Products.Api(this.axios) } - - accommodations (): Modules.Accommodations.Api { - return new Modules.Accommodations.Api(this.axios) - } } /** diff --git a/src/modules.ts b/src/modules.ts index df5ec90..e2f9a55 100644 --- a/src/modules.ts +++ b/src/modules.ts @@ -11,5 +11,4 @@ export * as Images from './modules/images.js' export * as Locations from './modules/locations.js' export * as Organizations from './modules/organizations.js' export * as Maps from './modules/maps.js' -export * as Products from './modules/products.js' -export * as Accommodations from './modules/accommodations' \ No newline at end of file +export * as Products from './modules/products.js' \ No newline at end of file diff --git a/src/modules/accommodations.ts b/src/modules/accommodations.ts index cc0be32..6e7403c 100644 --- a/src/modules/accommodations.ts +++ b/src/modules/accommodations.ts @@ -85,7 +85,7 @@ export class Accommodation implements IAccommodation { } } -export class Api extends ApiGroup { +export class Accommodations extends ApiGroup { async list (params?: ListAccommodationsQuery): Promise> { const response = (await this.axios.get>('/accommodations', { params })).data diff --git a/src/modules/holidayVersion.ts b/src/modules/holidayVersion.ts index f6003ae..b7d9b18 100644 --- a/src/modules/holidayVersion.ts +++ b/src/modules/holidayVersion.ts @@ -10,21 +10,25 @@ import { Itinerary } from './itinerary.js' import type { Locatable } from './locations.js' import { LocationAttachment } from './locations.js' import {type IMap, Map} from './maps' +import { Accommodation, type IAccommodation } from './accommodations' export interface IHolidayVersion extends Omit { holiday_id: string duration?: number map_id?: string + accommodation_id?: string } export interface UpdateHolidayVersionInput extends UpdateHolidayInput { duration?: number | null map_id?: string | null + accommodation_id?: string | null } export interface CreateHolidayVersionInput extends CreateHolidayInput { duration?: number | null map_id?: string | null + accommodation_id?: string | null } export class HolidayVersion implements IHolidayVersion, Categorized, Locatable { @@ -58,6 +62,11 @@ export class HolidayVersion implements IHolidayVersion, Categorized { + const response = (await this.axios.get(`/accommodations/${this.accommodation_id}`)).data + return new Accommodation(response, this.axios) + } + get departures (): Departures { return new Departures(this.axios, { version: this.id }) } @@ -75,6 +84,7 @@ export class HolidayVersion implements IHolidayVersion, Categorized(`/maps/${id}`)).data return new Map(response, this.axios) } + + async accommodation (id: string): Promise { + const response = (await this.axios.get(`/accommodations/${id}`)).data + return new Accommodation(response, this.axios) + } }