Advertisement
Guest User

Untitled

a guest
Nov 21st, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { CompanyConnector } from '../connectors/CompanyConnector';
  2. import { ShipsConnector } from '../connectors/ShipsConnector';
  3. import { DreamlinesModels } from 'dreamlines-product-api-client';
  4. import { ProductApiClient, ISearchQuery} from 'dreamlines-product-api-client';
  5. import { IConfiguration } from '../config/Configuration';
  6. import { FilterParams } from '../models/FilterParams';
  7. import { CompanyDetailCmsData } from '../models/cms/CompanyDetailCmsData';
  8. import { IShipPageUris } from '../interfaces/IShipDetailPageData';
  9. import { BaseDataConnector } from '../connectors/BaseDataConnector';
  10. import { CompanyOverviewCmsData } from '../models/cms/CompanyOverviewCmsData';
  11. import { RelevanceUriData } from '../models/cms/CompanyOverviewCmsData';
  12. import { ICompanyData } from '../interfaces/ICompanyOverviewPageData';
  13. import { PageConnector } from '../connectors/PageConnector';
  14. import { companyOverviewPageTable } from '../consts/sqlTableNames';
  15. import { IBreadcrumb } from '../interfaces/IBreadcrumb';
  16. import { UGCService } from '../services/UGCService';
  17. import { IUGC } from '../interfaces/IUGC';
  18. import { ICruiseOffers } from '../interfaces/ICruisePage';
  19. import { generateOffers } from '../helpers/cruiseHelpers';
  20.  
  21. interface ICompanyDetailPageDataMobile {
  22.     dataFromCms:CompanyDetailCmsData;
  23.     companyData:DreamlinesModels.ICompany;
  24.     cruises:DreamlinesModels.ISearchResult;
  25.     ships:DreamlinesModels.IShip[];
  26.     shipPageUris:IShipPageUris;
  27.     parentBreadcrumb: IBreadcrumb;
  28.     reviews: IUGC;
  29.     offers: ICruiseOffers;
  30. }
  31.  
  32. interface ICompanyOverviewPageDataMobile {
  33.     dataFromCms: CompanyOverviewCmsData;
  34.     companyData: ICompanyData;
  35.     relevanceUriData: RelevanceUriData;
  36.     topCompanyNids: number[];
  37. }
  38.  
  39. export class CompanyRepository {
  40.     private targetCurrency: string;
  41.     private sourceCurrency: string;
  42.  
  43.     constructor(
  44.         private environment:IConfiguration,
  45.         private companyConnector:CompanyConnector,
  46.         private shipConnector:ShipsConnector,
  47.         private productApiClient: ProductApiClient,
  48.         private baseDataConnector: BaseDataConnector,
  49.         private pageConnector: PageConnector,
  50.         private ugcService: UGCService,
  51.     ) {
  52.         this.targetCurrency = this.environment.brandSpecification.dualCurrency || this.environment.brandSpecification.defaultCurrency;
  53.         this.sourceCurrency = this.environment.brandSpecification.defaultCurrency;
  54.     }
  55.  
  56.     public getCompanyDetailPageDataMobile = async (uri:string):Promise<ICompanyDetailPageDataMobile> => {
  57.         try {
  58.             const [
  59.                 dataFromCms,
  60.                 parentBreadcrumb
  61.             ] = await Promise.all([
  62.                 this.companyConnector.fetchCompanyDetailPage(uri),
  63.                 this.pageConnector.getPageBreadcrumb({
  64.                     tableName: companyOverviewPageTable
  65.                 })
  66.             ]);
  67.  
  68.             const filterParams = new FilterParams();
  69.             filterParams.company = [dataFromCms.companyId];
  70.             const { countryCode } = this.environment.brandSpecification;
  71.  
  72.             const [
  73.                 companyData,
  74.                 cruises,
  75.                 ships,
  76.                 reviews,
  77.                 cheapestCruise
  78.             ] = await Promise.all([
  79.                 this.getCompanyData(dataFromCms.companyId),
  80.                 this.getCruiseRecommendations(dataFromCms.companyId),
  81.                 this.getShipList(dataFromCms.companyId),
  82.                 this.ugcService.getShipCompositeRating({
  83.                     filterParams: {
  84.                         productApiOperatorId: dataFromCms.companyId,
  85.                         language: countryCode !== 'br' ? countryCode : 'pt'
  86.                     }
  87.                 }),
  88.                 this.productApiClient.doSearchRequest({
  89.                     countryCode,
  90.                     limit: 1,
  91.                     offset: 0,
  92.                     sortString: 'price',
  93.                     filterParams
  94.                 })
  95.             ]);
  96.  
  97.             const shipPageUris = await this.getShipPageUris(ships);
  98.  
  99.             return {
  100.                 dataFromCms,
  101.                 companyData,
  102.                 cruises,
  103.                 ships,
  104.                 shipPageUris,
  105.                 parentBreadcrumb,
  106.                 reviews,
  107.                 offers: generateOffers(cheapestCruise)
  108.             };
  109.         } catch (error) {
  110.             throw error;
  111.         }
  112.     };
  113.  
  114.     public getCompanyOverviewPageDataMobile = async (uri: string): Promise<ICompanyOverviewPageDataMobile> => {
  115.         try {
  116.             const [
  117.                 dataFromCms,
  118.                 companyData,
  119.                 relevanceUriData,
  120.                 topCompanyNids
  121.             ] = await Promise.all([
  122.                 this.companyConnector.fetchCompanyOverviewPage(uri),
  123.                 this.getAllCompanies(),
  124.                 this.companyConnector.fetchCompanyUriRelevance(),
  125.                 this.getTopCompanyNids()
  126.             ]);
  127.  
  128.             return {
  129.                 dataFromCms,
  130.                 companyData,
  131.                 relevanceUriData,
  132.                 topCompanyNids
  133.             };
  134.         } catch (error) {
  135.             throw error;
  136.         }
  137.     };
  138.  
  139.     public getShipList = async (companyId:number):Promise<DreamlinesModels.IShip[]> => {
  140.         const filterParams = new FilterParams();
  141.         filterParams.company = [companyId];
  142.  
  143.         let query:ISearchQuery = {
  144.             countryCode: this.environment.brandSpecification.countryCode,
  145.             limit: 5,
  146.             offset: 0,
  147.             sortString: '',
  148.             filterParams: filterParams
  149.         };
  150.  
  151.         try {
  152.             const ships = await this.productApiClient.doShipSearchRequest(query);
  153.             const shipData: DreamlinesModels.IShipSearchResult = ships;
  154.             //This is a hack because Product API returns ships wrapped in an object instead an array of ships
  155.             const shipDataKeys = Object.keys(shipData.ships);
  156.             const shipList = [];
  157.             shipDataKeys.forEach(val => shipList.push(shipData.ships[val]));
  158.             return shipList;
  159.         } catch (error) {
  160.             throw error;
  161.         }
  162.     };
  163.  
  164.     public getCompanyData = (companyId:number):Promise<DreamlinesModels.ICompany> => {
  165.         return this.productApiClient.doCompanyContentRequest(this.environment.brandSpecification.countryCode, companyId);
  166.     };
  167.  
  168.     public getCruiseRecommendations = (companyId:number):Promise<DreamlinesModels.ISearchResult> => {
  169.         const filterParams = new FilterParams();
  170.         filterParams.company = [companyId];
  171.  
  172.         let query:ISearchQuery = {
  173.             countryCode: this.environment.brandSpecification.countryCode,
  174.             limit: 5,
  175.             offset: 0,
  176.             sortString: 'relevance',
  177.             filterParams: filterParams
  178.         };
  179.  
  180.         return this.productApiClient.doSearchRequest(query);
  181.     };
  182.  
  183.     public getShipPageUris = (ships:DreamlinesModels.IShip[]):Promise<IShipPageUris> => {
  184.         const shipNids = ships.map((ship) => ship.nid);
  185.         return this.shipConnector.fetchShipPageUris(shipNids);
  186.     }
  187.  
  188.     public getAllCompanies = ():Promise<ICompanyData> => {
  189.         return this.productApiClient.doCompanyContentRequest(this.environment.brandSpecification.countryCode);
  190.     };
  191.  
  192.     public getTopCompanyNids = async ():Promise<number[]> => {
  193.         try {
  194.             const rawTopCompanies = await this.baseDataConnector.getDBField('TopCompanies');
  195.             return JSON.parse(rawTopCompanies);
  196.         } catch (error) {
  197.             throw error;
  198.         }
  199.     }
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement