From 067adec0be652cbdf77d72e2cc04ef80d097f11e Mon Sep 17 00:00:00 2001 From: Tim Arendsen Date: Thu, 9 Nov 2023 00:23:16 +0100 Subject: [PATCH] v0.4.7: Added Gardaland --- README.md | 3 +- package-lock.json | 2 +- package.json | 2 +- src/_services/aio/aio-themepark.service.ts | 64 +-- src/_services/parks/parks.service.ts | 3 + src/controllers/parks/parks.controller.ts | 9 +- src/parks/gardaland/gardaland.module.ts | 19 + src/parks/gardaland/gardaland.service.spec.ts | 31 ++ src/parks/gardaland/gardaland.service.ts | 504 ++++++++++++++++++ src/parks/parks.module.ts | 8 +- .../universal-transfer.service.ts | 3 +- 11 files changed, 608 insertions(+), 40 deletions(-) create mode 100644 src/parks/gardaland/gardaland.module.ts create mode 100644 src/parks/gardaland/gardaland.service.spec.ts create mode 100644 src/parks/gardaland/gardaland.service.ts diff --git a/README.md b/README.md index bf8aeb0..35bcf2f 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,7 @@ In the table below you will find the parks that are currently supported and the | 🇬🇧 Alton Towers | 🎡 | True | True | True | True | False | | 🇬🇧 Paultons Park | 🎡 | True | True | True | True | False | | 🇬🇧 Chessington world of Adventures | 🎡 | True | True | True | True | False | +| 🇮🇹 Gardaland | 🎡 | True | True | True | False | False | | 🇳🇱 Efteling | 🎡 | True | True | True | True | False | | 🇳🇱 Toverland | 🎡 | True | True | True | False | True | | 🇳🇱 Walibi Holland | 🎡 | True | True | True | True | True | @@ -104,7 +105,7 @@ In the table below you will find the parks that are currently supported and the ## Parks on the planning UK: Pleasure Beach, LegoLand Windsor, Drayton Manor -IT: Gardaland, Cincetitta World +IT: Cincetitta World, **Mirabilandia** ES: Puy de Fou Espana DE: Europapark, Rulantica, Heidi Park OO: Familypark diff --git a/package-lock.json b/package-lock.json index dce88b4..0cf308a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "themeparks-node-api", - "version": "0.4.6", + "version": "0.4.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d0d6ef2..ed995ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "themeparks-node-api", - "version": "0.4.6", + "version": "0.4.7", "description": "An API which can retrieve theme park wait times.", "author": "Tim Arendsen", "private": false, diff --git a/src/_services/aio/aio-themepark.service.ts b/src/_services/aio/aio-themepark.service.ts index dcd0261..786d319 100644 --- a/src/_services/aio/aio-themepark.service.ts +++ b/src/_services/aio/aio-themepark.service.ts @@ -9,6 +9,7 @@ import { ThemeParkSupports } from '../../_interfaces/park-supports.interface'; import { Poi } from '../../_interfaces/poi.interface'; import * as fs from 'fs'; import { HttpService } from '@nestjs/axios'; +import * as Sentry from '@sentry/node'; const unzipper = require('unzipper'); @@ -43,7 +44,7 @@ export class AioThemeparkService extends ThroughPoisThemeParkService { supportsRideWaitTimesHistory: false, supportsPois: true, supportsTranslations: false, -supportsHalloween: false, + supportsHalloween: false, }; } @@ -121,24 +122,24 @@ supportsHalloween: false, }; return new Promise((resolve, reject) => { - this.httpService - .get( - this._attractionsIoApiUrl + '/data', - config, - ) - .toPromise() - .then(() => { - // When the call is successful, a redirect status code was not given - // This means something went wrong - console.error('SUCCESS BUT ACTUALLY AN ERROR'); - reject(); - }) - .catch((reason: AxiosError) => { - if (reason.response.status === 303) { - const headers = reason.response.headers; - resolve(headers.location); - return; - } + this.httpService + .get( + this._attractionsIoApiUrl + '/data', + config, + ) + .toPromise() + .then(() => { + // When the call is successful, a redirect status code was not given + // This means something went wrong + console.error('SUCCESS BUT ACTUALLY AN ERROR'); + reject(); + }) + .catch((reason: AxiosError) => { + if (reason.response.status === 303) { + const headers = reason.response.headers; + resolve(headers.location); + return; + } console.error('FAILED'); console.error(`${reason.response.status} / ${reason.response.statusText}`); @@ -163,11 +164,11 @@ supportsHalloween: false, .toPromise() .then(value => { if (!fs.existsSync(`${__dirname}/../../../storage`)) { - fs.mkdirSync(`${__dirname}/../../../storage`) + fs.mkdirSync(`${__dirname}/../../../storage`); } if (!fs.existsSync(`${__dirname}/../../../storage/aio`)) { - fs.mkdirSync(`${__dirname}/../../../storage/aio`) + fs.mkdirSync(`${__dirname}/../../../storage/aio`); } fs.writeFile(downloadLocation, value.data, function(err) { @@ -200,24 +201,27 @@ supportsHalloween: false, } public getDefaultLanguage(): string { - return 'en-GB' + return 'en-GB'; } async getPois(): Promise { - const url = await this.getDataUrl() - .then((value) => { - return value; - }) - .catch(reason => { - console.error(reason); - }); - const inputPath = `${__dirname}/../../../storage/aio/${this.getInstallationDirectory()}.zip`; const outputPath = `${__dirname}/../../../storage/aio/${this.getInstallationDirectory()}-output/`; + // TODO: Add a system that invalidates old information (fs.stat or fs.statSync?) const settingsExists = fs.existsSync(`${outputPath}/records.json`); if (!settingsExists) { + const url = await this.getDataUrl() + .then((value) => { + return value; + }) + .catch(reason => { + console.error(reason); + Sentry.captureException(reason); + throw reason; + }); + await this.downloadZip(url, inputPath) .then(() => { console.log(`Zip file downloaded to ${inputPath}`); diff --git a/src/_services/parks/parks.service.ts b/src/_services/parks/parks.service.ts index 029aafd..74cc861 100644 --- a/src/_services/parks/parks.service.ts +++ b/src/_services/parks/parks.service.ts @@ -56,6 +56,7 @@ import { import { HersheyparkService } from '../../parks/hersheypark/hersheypark.service'; import { SeaworldService } from '../../parks/seaworld/seaworld.service'; import { UniversalService } from '../../parks/universal/universal.service'; +import { GardalandService } from '../../parks/gardaland/gardaland.service'; @Injectable() export class ParksService { @@ -113,6 +114,7 @@ export class ParksService { private readonly _hersheypark: HersheyparkService, private readonly _seaworldCompanyService: SeaworldService, private readonly _universalService: UniversalService, + private readonly _gardaland: GardalandService, ) { this._parks = []; this._parks.push(_eftelingService); @@ -158,6 +160,7 @@ export class ParksService { this._parks.push(_parqueWarnerMadridBeach); this._parks.push(_futuroscope); this._parks.push(_hersheypark); + this._parks.push(_gardaland) this._companies = []; this._companies.push(_sixflagsService); diff --git a/src/controllers/parks/parks.controller.ts b/src/controllers/parks/parks.controller.ts index b73b41b..a7d5ac6 100644 --- a/src/controllers/parks/parks.controller.ts +++ b/src/controllers/parks/parks.controller.ts @@ -73,11 +73,11 @@ export class ParksController { } /** - * convert country code to corresponding flag emoji + * Convert country code to corresponding flag emoji * @param {string} cc - country code string * @returns {string} flag emoji */ - private countryCodeEmoji(cc) { + private countryCodeEmoji(cc): string { // country code regex const CC_REGEX = /^[a-z]{2}$/i; @@ -100,6 +100,11 @@ export class ParksController { return String.fromCodePoint(...codePoints); } + /** + * Capitalize the first letter of a word + * @param string The string to capitalize + * @private + */ private capitalize(string: string) { return string.slice(0, 1).toUpperCase() + string.slice(1); }; diff --git a/src/parks/gardaland/gardaland.module.ts b/src/parks/gardaland/gardaland.module.ts new file mode 100644 index 0000000..2b56e9d --- /dev/null +++ b/src/parks/gardaland/gardaland.module.ts @@ -0,0 +1,19 @@ +import { Module } from '@nestjs/common'; +import { GardalandService } from './gardaland.service'; +import { HttpModule } from '@nestjs/axios'; +import { ConfigModule } from '@nestjs/config'; +import { AioTransferServiceService } from '../../_services/aio/transfer-service/aio-transfer-service.service'; + +@Module({ + imports: [ + HttpModule, + ConfigModule.forRoot({ + envFilePath: '.env', + cache: false, + ignoreEnvFile: false, + }), + ], + providers: [GardalandService, AioTransferServiceService], + exports: [GardalandService], +}) +export class GardalandModule {} diff --git a/src/parks/gardaland/gardaland.service.spec.ts b/src/parks/gardaland/gardaland.service.spec.ts new file mode 100644 index 0000000..0372fb2 --- /dev/null +++ b/src/parks/gardaland/gardaland.service.spec.ts @@ -0,0 +1,31 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { GardalandService } from './gardaland.service'; +import { AioTransferServiceService } from '../../_services/aio/transfer-service/aio-transfer-service.service'; +import { HttpModule } from '@nestjs/axios'; +import { ConfigModule } from '@nestjs/config'; + +describe('GardalandService', () => { + let service: GardalandService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [GardalandService, AioTransferServiceService], + imports: [HttpModule, ConfigModule.forRoot()], + }).compile(); + + service = module.get(GardalandService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + it('should return info', () => { + expect(service.getInfo().id).toBeDefined(); + }); + + it('should return a list of POIs', async () => { + const data = await service.getPois(); + expect(data).toBeInstanceOf(Array); + }, 1000 * 60); +}); diff --git a/src/parks/gardaland/gardaland.service.ts b/src/parks/gardaland/gardaland.service.ts new file mode 100644 index 0000000..c4a2515 --- /dev/null +++ b/src/parks/gardaland/gardaland.service.ts @@ -0,0 +1,504 @@ +import { Injectable } from '@nestjs/common'; +import { AioThemeparkService } from '../../_services/aio/aio-themepark.service'; +import { ParkType, ThemePark } from '../../_interfaces/park.interface'; +import { + AttractionsIoAppDetailsInterface, +} from '../../_interfaces/attractions-io/attractions-io-app-details.interface'; +import { ThemeParkSupports } from '../../_interfaces/park-supports.interface'; +import { PoiCategory } from '../../_interfaces/poi-categories.enum'; + +@Injectable() +export class GardalandService extends AioThemeparkService { + getInfo(): ThemePark { + return { + countryCode: 'it', + description: 'Gardaland is een resort bij Castelnuovo del Garda aan het Gardameer. Het attractiepark werd geopend in juli 1975 en is sindsdien, met meer dan 2,5 miljoen bezoekers per jaar, uitgegroeid tot het grootste en populairste attractiepark in Italië', + id: 'gardaland', + image: 'https://www.gardaland.it/media/1wzlpokx/panoramiche-006.jpg', + name: 'Gardaland', + parkType: ParkType.THEMEPARK, + location: { + lat: 45.45624514532554, + lng: 10.713386930685767, + }, + timezone: 'Europe/Italy', + }; + } + + getSupports(): ThemeParkSupports { + return { + supportsAnimals: false, + supportsHalloween: false, + supportsOpeningTimes: false, + supportsOpeningTimesHistory: false, + supportsPoiLocations: true, + supportsPois: true, + supportsRestaurantOpeningTimes: false, + supportsRestaurants: true, + supportsRideWaitTimes: false, + supportsRideWaitTimesHistory: false, + supportsRides: true, + supportsShopOpeningTimes: false, + supportsShops: false, + supportsShowTimes: false, + supportsShows: true, + supportsTranslations: false, + }; + } + + getAppDetails(): AttractionsIoAppDetailsInterface { + return { + appBuild: '134', + platformVersion: '3.6.6', + userAgent: 'Gardaland/134 CFNetwork/1474 Darwin/23.0.0', + platform: 'iOS', + latestUpdate: '2023-10-30T11:43:44+01:00', + contentType: 'multipart/form-data; boundary=s47UC4ujBvwu4tUZny16oB9EYPIK2lYen2gqiaI3cG8N2xg2xG4CuZ88uVFUzeVBcHglTSA5twz4fJCrDwgWt1vy0Ff8gIwp3DPc' + } + } + + getApiKey(): string { + return 'ab9f17bb-92e5-4ff5-8009-4bca4e4b92fe' + } + + getInstallationRequestBody(): string { + return '--s47UC4ujBvwu4tUZny16oB9EYPIK2lYen2gqiaI3cG8N2xg2xG4CuZ88uVFUzeVBcHglTSA5twz4fJCrDwgWt1vy0Ff8gIwp3DPc\n' + + 'Content-Disposition: form-data; name="device_identifier"\n' + + '\n' + + 'B1D2F681-44EB-448D-BD30-48B0BE854741\n' + + '--s47UC4ujBvwu4tUZny16oB9EYPIK2lYen2gqiaI3cG8N2xg2xG4CuZ88uVFUzeVBcHglTSA5twz4fJCrDwgWt1vy0Ff8gIwp3DPc\n' + + 'Content-Disposition: form-data; name="user_identifier"\n' + + '\n' + + 'A18F5422-AD9B-48C7-9A09-7FA7383B4D13\n' + + '--s47UC4ujBvwu4tUZny16oB9EYPIK2lYen2gqiaI3cG8N2xg2xG4CuZ88uVFUzeVBcHglTSA5twz4fJCrDwgWt1vy0Ff8gIwp3DPc\n' + + 'Content-Disposition: form-data; name="app_version"\n' + + '\n' + + '3.6.6\n' + + '--s47UC4ujBvwu4tUZny16oB9EYPIK2lYen2gqiaI3cG8N2xg2xG4CuZ88uVFUzeVBcHglTSA5twz4fJCrDwgWt1vy0Ff8gIwp3DPc\n' + + 'Content-Disposition: form-data; name="app_build"\n' + + '\n' + + '134\n' + + '--s47UC4ujBvwu4tUZny16oB9EYPIK2lYen2gqiaI3cG8N2xg2xG4CuZ88uVFUzeVBcHglTSA5twz4fJCrDwgWt1vy0Ff8gIwp3DPc--\n' + + '\n' + } + + getCategory(category: number): PoiCategory { + switch (category) { + case 672: + return PoiCategory.ATTRACTION; + case 673: + return PoiCategory.SHOW; + case 674: + case 696: + // Table Service + case 697: + // Fast Food + case 698: + // Bar + return PoiCategory.RESTAURANT; + case 675: + return PoiCategory.GUEST_SERVICES; + case 676: + return PoiCategory.SHOP; + case 688: + return PoiCategory.HOTEL; + case 690: + return PoiCategory.PARKING; + case 703: + return PoiCategory.TOILETS; + case 691: + // Fantasy + case 692: + // Adventure + case 689: + // AQUARIUM + case 693: + // Adrenaline + case 694: + // For Families + case 695: + // For Kids + return PoiCategory.UNDEFINED; + // { + // "_id": 699, + // "Name": { + // "en-GB": "Gluten free Kiosk", + // "it-IT": "Chiosco cibo senza glutine", + // "de-DE": "Gluten free Kiosk" + // }, + // "Icon": null, + // "Parent": 674 + // }, + // { + // "_id": 700, + // "Name": { + // "en-GB": "Sandwich Shop", + // "it-IT": "Paninoteche", + // "de-DE": "Sandwich-Shop" + // }, + // "Icon": null, + // "Parent": 674 + // }, + // { + // "_id": 701, + // "Name": { + // "en-GB": "Gardaland Express", + // "it-IT": "Gardaland Express", + // "de-DE": "Gardaland Express" + // }, + // "Icon": null, + // "Parent": 675 + // }, + // { + // "_id": 702, + // "Name": { + // "en-GB": "Nursery", + // "it-IT": "Nursery", + // "de-DE": "Nursery" + // }, + // "Icon": null, + // "Parent": 675 + // }, + // { + // "_id": 704, + // "Name": { + // "en-GB": "Info Point", + // "it-IT": "Informazioni", + // "de-DE": "Info" + // }, + // "Icon": null, + // "Parent": 675 + // }, + // { + // "_id": 705, + // "Name": { + // "en-GB": "Welcome Desk", + // "it-IT": "Welcome Desk", + // "de-DE": "Welcome Desk" + // }, + // "Icon": null, + // "Parent": 675 + // }, + // { + // "_id": 706, + // "Name": { + // "en-GB": "Baggage Deposit", + // "it-IT": "Deposito Custodito", + // "de-DE": "Gepäckaufbewahrung" + // }, + // "Icon": null, + // "Parent": 675 + // }, + // { + // "_id": 707, + // "Name": { + // "en-GB": "Mailbox", + // "it-IT": "Cassetta Postale", + // "de-DE": "Briefkasten" + // }, + // "Icon": null, + // "Parent": 675 + // }, + // { + // "_id": 708, + // "Name": { + // "en-GB": "Mobile Recharge station", + // "it-IT": "Ricarica cellulari", + // "de-DE": "Mobiltelefon Aufladung" + // }, + // "Icon": null, + // "Parent": 675 + // }, + // { + // "_id": 709, + // "Name": { + // "en-GB": "Picnic Area", + // "it-IT": "Area Picnic", + // "de-DE": "Picknickzone" + // }, + // "Icon": null, + // "Parent": 675 + // }, + // { + // "_id": 710, + // "Name": { + // "en-GB": "Easy Shopping", + // "it-IT": "Easy Shopping", + // "de-DE": "Easy Shopping" + // }, + // "Icon": null, + // "Parent": 675 + // }, + // { + // "_id": 711, + // "Name": { + // "en-GB": "Tobacco Shop", + // "it-IT": "Tabacchi", + // "de-DE": "Tabakwaren" + // }, + // "Icon": null, + // "Parent": 675 + // }, + // { + // "_id": 712, + // "Name": { + // "en-GB": "Buggy Rent", + // "it-IT": "Noleggio passeggini", + // "de-DE": "Vermietung von Buggies" + // }, + // "Icon": null, + // "Parent": 675 + // }, + // { + // "_id": 713, + // "Name": { + // "en-GB": "ATM", + // "it-IT": "Bancomat", + // "de-DE": "Bankomat" + // }, + // "Icon": null, + // "Parent": 675 + // }, + // { + // "_id": 714, + // "Name": { + // "en-GB": "First Aid", + // "it-IT": "Primo Soccorso", + // "de-DE": "Erste Hilfe" + // }, + // "Icon": null, + // "Parent": 675 + // }, + // { + // "_id": 715, + // "Name": { + // "en-GB": "Selfie Point", + // "it-IT": "Punto Selfie", + // "de-DE": "Selfie Punkt" + // }, + // "Icon": null, + // "Parent": 675 + // }, + // { + // "_id": 716, + // "Name": { + // "en-GB": "Attraction with height limit", + // "it-IT": "Attrazione con limite di altezza", + // "de-DE": "Attraktion mit Höhenbegrenzung" + // }, + // "Icon": null, + // "Parent": 675 + // }, + // { + // "_id": 717, + // "Name": { + // "en-GB": "Adventure", + // "it-IT": "Avventura", + // "de-DE": "Abenteuer" + // }, + // "Icon": null, + // "Parent": 676 + // }, + // { + // "_id": 718, + // "Name": { + // "en-GB": "Teenagers", + // "it-IT": "Teenager", + // "de-DE": "Teenagers" + // }, + // "Icon": null, + // "Parent": 676 + // }, + // { + // "_id": 719, + // "Name": { + // "en-GB": "Kids", + // "it-IT": "Bambini", + // "de-DE": "Kinder" + // }, + // "Icon": null, + // "Parent": 676 + // }, + // { + // "_id": 720, + // "Name": { + // "en-GB": "Infants", + // "it-IT": "Neonati", + // "de-DE": "Säuglinge" + // }, + // "Icon": null, + // "Parent": 676 + // }, + // { + // "_id": 721, + // "Name": { + // "en-GB": "Sweets & Candies", + // "it-IT": "Dolci e caramelle", + // "de-DE": "Süßigkeiten & Bonbons" + // }, + // "Icon": null, + // "Parent": 676 + // }, + // { + // "_id": 722, + // "Name": { + // "en-GB": "Gardaland Fans", + // "it-IT": "Fan di Gardaland", + // "de-DE": "Gardaland Fans" + // }, + // "Icon": null, + // "Parent": 676 + // }, + // { + // "_id": 723, + // "Name": { + // "en-GB": "Clothing & Accessories", + // "it-IT": "Abbigliamento e Accessori", + // "de-DE": "Kleidung und Accessoires" + // }, + // "Icon": null, + // "Parent": 676 + // }, + // { + // "_id": 724, + // "Name": { + // "en-GB": "Dreams & Fairytale", + // "it-IT": "Sogni & Fiabe", + // "de-DE": "Träume und Märchen" + // }, + // "Icon": null, + // "Parent": 688 + // }, + // { + // "_id": 725, + // "Name": { + // "en-GB": "Adventure", + // "it-IT": "Adventure", + // "de-DE": "Abenteuer" + // }, + // "Icon": null, + // "Parent": 688 + // }, + // { + // "_id": 726, + // "Name": { + // "en-GB": "Enchanted Kingdom", + // "it-IT": "Regno Incantato", + // "de-DE": "Verzaubertes Königreich" + // }, + // "Icon": null, + // "Parent": 688 + // }, + // { + // "_id": 740, + // "Name": { + // "en-GB": "Meet & Greet", + // "it-IT": "Meet & Greet", + // "de-DE": "Meet & Greet" + // }, + // "Icon": "35892145-2f11-58c1-96c4-488576e6fcbf", + // "Parent": null + // }, + // { + // "_id": 953, + // "Name": { + // "en-GB": "Kiosk", + // "de-DE": "Kiosk", + // "it-IT": "Chiosco" + // }, + // "Icon": "76cd453f-354a-5e31-87f9-79fa1c408ad6", + // "Parent": 674 + // }, + // { + // "_id": 955, + // "Name": { + // "en-GB": "Sandwich Shop", + // "de-DE": "Sandwich-Shop", + // "it-IT": "Paninoteca" + // }, + // "Icon": "149d6afc-5d6b-51c7-8c81-96eca8679b2e", + // "Parent": 674 + // }, + // { + // "_id": 956, + // "Name": { + // "en-GB": "Suitable for Everyone", + // "de-DE": "Für jeden geeignet", + // "it-IT": "Adatto a Tutti" + // }, + // "Icon": "3317af4a-bb38-5c70-83cf-7a4494299d33", + // "Parent": 673 + // }, + // { + // "_id": 957, + // "Name": { + // "en-GB": "Recommended for children", + // "de-DE": "Empfohlen für Kinder", + // "it-IT": "Consigliato per i Bambini" + // }, + // "Icon": "a4ac0f63-b604-5708-9e76-ed208d3fff8b", + // "Parent": 673 + // }, + // { + // "_id": 959, + // "Name": { + // "en-GB": "Lockers", + // "de-DE": "Schließfächer", + // "it-IT": "Armadietti" + // }, + // "Icon": "dae0a6bd-600c-5485-b89a-7d4b2656268c", + // "Parent": 675 + // }, + // { + // "_id": 960, + // "Name": { + // "en-GB": "Everything else", + // "de-DE": "Alles andere", + // "it-IT": "Tutto il resto" + // }, + // "Icon": "3f0a1079-0272-5aa2-b60d-7a148bc671cd", + // "Parent": 675 + // }, + // { + // "_id": 1705, + // "Name": { + // "it-IT": "LEGOLAND® Water Park", + // "en-GB": "LEGOLAND® Water Park", + // "de-DE": "LEGOLAND® Water Park" + // }, + // "Icon": "b1dfc511-afa4-50e6-9502-205b90e1a947", + // "Parent": null + // }, + // { + // "_id": 3871, + // "Name": { + // "it-IT": "Aree Relax", + // "en-GB": "Relaxation Areas", + // "de-DE": "Relax-Bereiche" + // }, + // "Icon": "14a43a9b-89a5-56fa-ba03-15d90815c458", + // "Parent": null + // }, + // { + // "_id": 3873, + // "Name": { + // "it-IT": "Aree Fumatori", + // "en-GB": "Smoking Area", + // "de-DE": "Raucherzone" + // }, + // "Icon": "ce503d1b-fc7c-5ad8-a589-a551939e8b8f", + // "Parent": 675 + // }, + // { + // "_id": 4072, + // "Name": { + // "it-IT": "Tricky Zucca", + // "en-GB": "Tricky Pumpkin", + // "de-DE": "Tricky Pumpkin" + // }, + // "Icon": "e2266174-6eaf-5546-b718-4b9f8880d4fe", + // "Parent": null + // } + } + } +} diff --git a/src/parks/parks.module.ts b/src/parks/parks.module.ts index 093face..3425f21 100644 --- a/src/parks/parks.module.ts +++ b/src/parks/parks.module.ts @@ -39,10 +39,10 @@ import { ParquesReunidosModule } from './parques-reunidos/parques-reunidos.modul import { HersheyparkModule } from './hersheypark/hersheypark.module'; import { SeaworldModule } from './seaworld/seaworld.module'; import { UniversalModule } from './universal/universal.module'; +import { GardalandModule } from './gardaland/gardaland.module'; @Module({ - exports: [EftelingModule, ToverlandModule, PhantasialandModule, ParcAsterixModule, HolidayParkModule, DippiedoeModule, DisneyModule, WalibiModule, PortaventuraModule, SixflagsModule, BellewaerdeModule, HellendoornModule, LegolandModule, BobbejaanlandModule, PlopsalandDePanneModule, EuropaParkModule, HansaParkModule, OuwehandsDierenparkModule, WildlandsModule, LisebergModule, HerschendModule, CedarfairModule, ParqueWarnerModule, GronaLundModule, TivoliModule, ThorpeParkModule, AltonTowersModule, PaultonsParkModule, SanDiegoZooModule, ChessingtonResortModule, BlijdorpModule, ApenheulModule, EnergylandiaModule, FamilyparkModule, BeekseBergenModule, ParquesReunidosModule, FuturoscopeModule, HersheyparkModule, SeaworldModule, UniversalModule], - imports: [EftelingModule, ToverlandModule, PhantasialandModule, ParcAsterixModule, HolidayParkModule, DippiedoeModule, DisneyModule, WalibiModule, PortaventuraModule, SixflagsModule, BellewaerdeModule, HellendoornModule, LegolandModule, BobbejaanlandModule, PlopsalandDePanneModule, EuropaParkModule, HansaParkModule, OuwehandsDierenparkModule, WildlandsModule, LisebergModule, HerschendModule, CedarfairModule, ParqueWarnerModule, GronaLundModule, TivoliModule, ThorpeParkModule, AltonTowersModule, PaultonsParkModule, SanDiegoZooModule, ChessingtonResortModule, BlijdorpModule, ApenheulModule, EnergylandiaModule, FamilyparkModule, BeekseBergenModule, ParquesReunidosModule, FuturoscopeModule, HersheyparkModule, SeaworldModule, UniversalModule], + exports: [EftelingModule, ToverlandModule, PhantasialandModule, ParcAsterixModule, HolidayParkModule, DippiedoeModule, DisneyModule, WalibiModule, PortaventuraModule, SixflagsModule, BellewaerdeModule, HellendoornModule, LegolandModule, BobbejaanlandModule, PlopsalandDePanneModule, EuropaParkModule, HansaParkModule, OuwehandsDierenparkModule, WildlandsModule, LisebergModule, HerschendModule, CedarfairModule, ParqueWarnerModule, GronaLundModule, TivoliModule, ThorpeParkModule, AltonTowersModule, PaultonsParkModule, SanDiegoZooModule, ChessingtonResortModule, BlijdorpModule, ApenheulModule, EnergylandiaModule, FamilyparkModule, BeekseBergenModule, ParquesReunidosModule, FuturoscopeModule, HersheyparkModule, SeaworldModule, UniversalModule, GardalandModule], + imports: [EftelingModule, ToverlandModule, PhantasialandModule, ParcAsterixModule, HolidayParkModule, DippiedoeModule, DisneyModule, WalibiModule, PortaventuraModule, SixflagsModule, BellewaerdeModule, HellendoornModule, LegolandModule, BobbejaanlandModule, PlopsalandDePanneModule, EuropaParkModule, HansaParkModule, OuwehandsDierenparkModule, WildlandsModule, LisebergModule, HerschendModule, CedarfairModule, ParqueWarnerModule, GronaLundModule, TivoliModule, ThorpeParkModule, AltonTowersModule, PaultonsParkModule, SanDiegoZooModule, ChessingtonResortModule, BlijdorpModule, ApenheulModule, EnergylandiaModule, FamilyparkModule, BeekseBergenModule, ParquesReunidosModule, FuturoscopeModule, HersheyparkModule, SeaworldModule, UniversalModule, GardalandModule], }) -export class ParksModule { -} +export class ParksModule {} diff --git a/src/parks/universal/universal-transfer/universal-transfer.service.ts b/src/parks/universal/universal-transfer/universal-transfer.service.ts index f53f3a6..801aeb0 100644 --- a/src/parks/universal/universal-transfer/universal-transfer.service.ts +++ b/src/parks/universal/universal-transfer/universal-transfer.service.ts @@ -19,7 +19,8 @@ export class UniversalTransferService extends TransferService { original: poi, title: poi.MblDisplayName, original_category: poi.Category, - description: poi.MblShortDescription, + subTitle: poi.MblLongDescription != poi.MblShortDescription ? poi.MblShortDescription : null, + description: poi.MblLongDescription ?? poi.MblShortDescription, images: poi.DetailImages, image_url: poi.ListImage ?? poi.ThumbnailImage, previewImage: poi.ListImage ?? poi.ThumbnailImage,