@studyportals/domain-client 3.6.0-1 → 3.6.0-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/.eslintignore +3 -0
  2. package/.eslintrc.js +12 -0
  3. package/.github/dependabot.yml +17 -0
  4. package/.github/stale.yml +10 -0
  5. package/.mocharc.yml +3 -0
  6. package/.nycrc +15 -0
  7. package/README.md +117 -0
  8. package/{index.d.ts → bin/index.d.ts} +0 -0
  9. package/{index.js → bin/index.js} +0 -0
  10. package/{index.js.map → bin/index.js.map} +0 -0
  11. package/bin/package.json +54 -0
  12. package/{src → bin/src}/domain-client.d.ts +0 -0
  13. package/{src → bin/src}/domain-client.js +0 -0
  14. package/{src → bin/src}/domain-client.js.map +0 -0
  15. package/{src → bin/src}/exceptions/bad-request-exception.d.ts +0 -0
  16. package/{src → bin/src}/exceptions/bad-request-exception.js +0 -0
  17. package/{src → bin/src}/exceptions/bad-request-exception.js.map +0 -0
  18. package/{src → bin/src}/exceptions/client-exception.d.ts +0 -0
  19. package/{src → bin/src}/exceptions/client-exception.js +0 -0
  20. package/{src → bin/src}/exceptions/client-exception.js.map +0 -0
  21. package/{src → bin/src}/exceptions/internal-server-exception.d.ts +0 -0
  22. package/{src → bin/src}/exceptions/internal-server-exception.js +0 -0
  23. package/{src → bin/src}/exceptions/internal-server-exception.js.map +0 -0
  24. package/{src → bin/src}/exceptions/not-found-exception.d.ts +0 -0
  25. package/{src → bin/src}/exceptions/not-found-exception.js +0 -0
  26. package/{src → bin/src}/exceptions/not-found-exception.js.map +0 -0
  27. package/{src → bin/src}/exceptions/property-not-available-exception.d.ts +0 -0
  28. package/{src → bin/src}/exceptions/property-not-available-exception.js +0 -0
  29. package/{src → bin/src}/exceptions/property-not-available-exception.js.map +0 -0
  30. package/{src → bin/src}/factories/DateFactory.d.ts +0 -0
  31. package/{src → bin/src}/factories/DateFactory.js +0 -0
  32. package/{src → bin/src}/factories/DateFactory.js.map +0 -0
  33. package/{src → bin/src}/factories/InternalLinkFactory.d.ts +0 -0
  34. package/{src → bin/src}/factories/InternalLinkFactory.js +0 -0
  35. package/{src → bin/src}/factories/InternalLinkFactory.js.map +0 -0
  36. package/{src → bin/src}/i-api-response.d.ts +0 -0
  37. package/{src → bin/src}/i-api-response.js +0 -0
  38. package/{src → bin/src}/i-api-response.js.map +0 -0
  39. package/{src → bin/src}/i-class-factory.d.ts +0 -0
  40. package/{src → bin/src}/i-class-factory.js +0 -0
  41. package/{src → bin/src}/i-class-factory.js.map +0 -0
  42. package/{src → bin/src}/i-model-description.d.ts +0 -0
  43. package/{src → bin/src}/i-model-description.js +0 -0
  44. package/{src → bin/src}/i-model-description.js.map +0 -0
  45. package/{src → bin/src}/model-client.d.ts +0 -0
  46. package/{src → bin/src}/model-client.js +0 -0
  47. package/{src → bin/src}/model-client.js.map +0 -0
  48. package/{src → bin/src}/model-factory.d.ts +0 -0
  49. package/{src → bin/src}/model-factory.js +0 -0
  50. package/{src → bin/src}/model-factory.js.map +0 -0
  51. package/{src → bin/src}/models/bestfit-programme/bestfit-programme-client.d.ts +0 -0
  52. package/{src → bin/src}/models/bestfit-programme/bestfit-programme-client.js +0 -0
  53. package/{src → bin/src}/models/bestfit-programme/bestfit-programme-client.js.map +0 -0
  54. package/{src → bin/src}/models/bestfit-programme/i-best-fit-programme.d.ts +0 -0
  55. package/{src → bin/src}/models/bestfit-programme/i-best-fit-programme.js +0 -0
  56. package/{src → bin/src}/models/bestfit-programme/i-best-fit-programme.js.map +0 -0
  57. package/{src → bin/src}/models/bestfit-programme/i-g-p-a-requirement.d.ts +0 -0
  58. package/{src → bin/src}/models/bestfit-programme/i-g-p-a-requirement.js +0 -0
  59. package/{src → bin/src}/models/bestfit-programme/i-g-p-a-requirement.js.map +0 -0
  60. package/{src → bin/src}/models/bestfit-programme/i-living-cost.d.ts +0 -0
  61. package/{src → bin/src}/models/bestfit-programme/i-living-cost.js +0 -0
  62. package/{src → bin/src}/models/bestfit-programme/i-living-cost.js.map +0 -0
  63. package/{src → bin/src}/models/common/i-city.d.ts +0 -0
  64. package/{src → bin/src}/models/common/i-city.js +0 -0
  65. package/{src → bin/src}/models/common/i-city.js.map +0 -0
  66. package/{src → bin/src}/models/common/i-country.d.ts +0 -0
  67. package/{src → bin/src}/models/common/i-country.js +0 -0
  68. package/{src → bin/src}/models/common/i-country.js.map +0 -0
  69. package/{src → bin/src}/models/common/i-english-requirements.d.ts +0 -0
  70. package/{src → bin/src}/models/common/i-english-requirements.js +0 -0
  71. package/{src → bin/src}/models/common/i-english-requirements.js.map +0 -0
  72. package/{src → bin/src}/models/common/i-internal-link.d.ts +0 -0
  73. package/{src → bin/src}/models/common/i-internal-link.js +0 -0
  74. package/{src → bin/src}/models/common/i-internal-link.js.map +0 -0
  75. package/{src → bin/src}/models/common/i-logo.d.ts +0 -0
  76. package/{src → bin/src}/models/common/i-logo.js +0 -0
  77. package/{src → bin/src}/models/common/i-logo.js.map +0 -0
  78. package/{src → bin/src}/models/common/i-tuition-fee.d.ts +0 -0
  79. package/{src → bin/src}/models/common/i-tuition-fee.js +0 -0
  80. package/{src → bin/src}/models/common/i-tuition-fee.js.map +0 -0
  81. package/{src → bin/src}/models/dotdigital-organisation/dotdigital-organisation-client.d.ts +0 -0
  82. package/{src → bin/src}/models/dotdigital-organisation/dotdigital-organisation-client.js +0 -0
  83. package/{src → bin/src}/models/dotdigital-organisation/dotdigital-organisation-client.js.map +0 -0
  84. package/{src → bin/src}/models/dotdigital-organisation/i-dot-digital-organisation.d.ts +1 -0
  85. package/{src → bin/src}/models/dotdigital-organisation/i-dot-digital-organisation.js +0 -0
  86. package/{src → bin/src}/models/dotdigital-organisation/i-dot-digital-organisation.js.map +0 -0
  87. package/{src → bin/src}/models/dotdigital-organisation/i-review.d.ts +0 -0
  88. package/{src → bin/src}/models/dotdigital-organisation/i-review.js +0 -0
  89. package/{src → bin/src}/models/dotdigital-organisation/i-review.js.map +0 -0
  90. package/{src → bin/src}/models/dotdigital-programme/dotdigital-programme-client.d.ts +0 -0
  91. package/{src → bin/src}/models/dotdigital-programme/dotdigital-programme-client.js +0 -0
  92. package/{src → bin/src}/models/dotdigital-programme/dotdigital-programme-client.js.map +0 -0
  93. package/{src → bin/src}/models/dotdigital-programme/i-dot-digital-programme.d.ts +0 -0
  94. package/{src → bin/src}/models/dotdigital-programme/i-dot-digital-programme.js +0 -0
  95. package/{src → bin/src}/models/dotdigital-programme/i-dot-digital-programme.js.map +0 -0
  96. package/{src → bin/src}/models/programme-card/i-click-tracking-data.d.ts +0 -0
  97. package/{src → bin/src}/models/programme-card/i-click-tracking-data.js +0 -0
  98. package/{src → bin/src}/models/programme-card/i-click-tracking-data.js.map +0 -0
  99. package/{src → bin/src}/models/programme-card/i-cover.d.ts +0 -0
  100. package/{src → bin/src}/models/programme-card/i-cover.js +0 -0
  101. package/{src → bin/src}/models/programme-card/i-cover.js.map +0 -0
  102. package/{src → bin/src}/models/programme-card/i-deadline.d.ts +0 -0
  103. package/{src → bin/src}/models/programme-card/i-deadline.js +0 -0
  104. package/{src → bin/src}/models/programme-card/i-deadline.js.map +0 -0
  105. package/{src → bin/src}/models/programme-card/i-duration.d.ts +0 -0
  106. package/{src → bin/src}/models/programme-card/i-duration.js +0 -0
  107. package/{src → bin/src}/models/programme-card/i-duration.js.map +0 -0
  108. package/{src → bin/src}/models/programme-card/i-link.d.ts +0 -0
  109. package/{src → bin/src}/models/programme-card/i-link.js +0 -0
  110. package/{src → bin/src}/models/programme-card/i-link.js.map +0 -0
  111. package/{src → bin/src}/models/programme-card/i-location.d.ts +0 -0
  112. package/{src → bin/src}/models/programme-card/i-location.js +0 -0
  113. package/{src → bin/src}/models/programme-card/i-location.js.map +0 -0
  114. package/{src → bin/src}/models/programme-card/i-optional-link.d.ts +0 -0
  115. package/{src → bin/src}/models/programme-card/i-optional-link.js +0 -0
  116. package/{src → bin/src}/models/programme-card/i-optional-link.js.map +0 -0
  117. package/{src → bin/src}/models/programme-card/i-programme-card.d.ts +0 -0
  118. package/{src → bin/src}/models/programme-card/i-programme-card.js +0 -0
  119. package/{src → bin/src}/models/programme-card/i-programme-card.js.map +0 -0
  120. package/{src → bin/src}/models/programme-card/i-start-date.d.ts +0 -0
  121. package/{src → bin/src}/models/programme-card/i-start-date.js +0 -0
  122. package/{src → bin/src}/models/programme-card/i-start-date.js.map +0 -0
  123. package/{src → bin/src}/models/programme-card/i-timing.d.ts +0 -0
  124. package/{src → bin/src}/models/programme-card/i-timing.js +0 -0
  125. package/{src → bin/src}/models/programme-card/i-timing.js.map +0 -0
  126. package/{src → bin/src}/models/programme-card/i-tracked-link.d.ts +0 -0
  127. package/{src → bin/src}/models/programme-card/i-tracked-link.js +0 -0
  128. package/{src → bin/src}/models/programme-card/i-tracked-link.js.map +0 -0
  129. package/{src → bin/src}/models/programme-card/i-tracking.d.ts +0 -0
  130. package/{src → bin/src}/models/programme-card/i-tracking.js +0 -0
  131. package/{src → bin/src}/models/programme-card/i-tracking.js.map +0 -0
  132. package/{src → bin/src}/models/programme-card/programme-card-client.d.ts +0 -0
  133. package/{src → bin/src}/models/programme-card/programme-card-client.js +0 -0
  134. package/{src → bin/src}/models/programme-card/programme-card-client.js.map +0 -0
  135. package/{src → bin/src}/models/search-country-faq/i-search-country-faq.d.ts +0 -0
  136. package/{src → bin/src}/models/search-country-faq/i-search-country-faq.js +0 -0
  137. package/{src → bin/src}/models/search-country-faq/i-search-country-faq.js.map +0 -0
  138. package/{src → bin/src}/models/search-country-faq/public-search-country-faq-client.d.ts +0 -0
  139. package/{src → bin/src}/models/search-country-faq/public-search-country-faq-client.js +0 -0
  140. package/{src → bin/src}/models/search-country-faq/public-search-country-faq-client.js.map +0 -0
  141. package/{src → bin/src}/models/search-projection/i-geo-targeting-configuration.d.ts +0 -0
  142. package/{src → bin/src}/models/search-projection/i-geo-targeting-configuration.js +0 -0
  143. package/{src → bin/src}/models/search-projection/i-geo-targeting-configuration.js.map +0 -0
  144. package/{src → bin/src}/models/search-projection/i-geo-targeting-values.d.ts +0 -0
  145. package/{src → bin/src}/models/search-projection/i-geo-targeting-values.js +0 -0
  146. package/{src → bin/src}/models/search-projection/i-geo-targeting-values.js.map +0 -0
  147. package/{src → bin/src}/models/search-projection/i-organisation-values.d.ts +0 -0
  148. package/{src → bin/src}/models/search-projection/i-organisation-values.js +0 -0
  149. package/{src → bin/src}/models/search-projection/i-organisation-values.js.map +0 -0
  150. package/{src → bin/src}/models/search-projection/i-premium-values.d.ts +0 -0
  151. package/{src → bin/src}/models/search-projection/i-premium-values.js +0 -0
  152. package/{src → bin/src}/models/search-projection/i-premium-values.js.map +0 -0
  153. package/{src → bin/src}/models/search-projection/i-search-projection.d.ts +0 -0
  154. package/{src → bin/src}/models/search-projection/i-search-projection.js +0 -0
  155. package/{src → bin/src}/models/search-projection/i-search-projection.js.map +0 -0
  156. package/{src → bin/src}/models/search-projection/i-tuition-values.d.ts +0 -0
  157. package/{src → bin/src}/models/search-projection/i-tuition-values.js +0 -0
  158. package/{src → bin/src}/models/search-projection/i-tuition-values.js.map +0 -0
  159. package/{src → bin/src}/models/search-projection/search-projection-client.d.ts +0 -0
  160. package/{src → bin/src}/models/search-projection/search-projection-client.js +0 -0
  161. package/{src → bin/src}/models/search-projection/search-projection-client.js.map +0 -0
  162. package/{src → bin/src}/types/portal-map.d.ts +0 -0
  163. package/{src → bin/src}/types/portal-map.js +0 -0
  164. package/{src → bin/src}/types/portal-map.js.map +0 -0
  165. package/{src → bin/src}/types/portal-type.d.ts +0 -0
  166. package/{src → bin/src}/types/portal-type.js +0 -0
  167. package/{src → bin/src}/types/portal-type.js.map +0 -0
  168. package/{src → bin/src}/types.d.ts +0 -0
  169. package/{src → bin/src}/types.js +0 -0
  170. package/{src → bin/src}/types.js.map +0 -0
  171. package/index.ts +91 -0
  172. package/package.json +1 -1
  173. package/src/domain-client.ts +70 -0
  174. package/src/exceptions/bad-request-exception.ts +2 -0
  175. package/src/exceptions/client-exception.ts +2 -0
  176. package/src/exceptions/internal-server-exception.ts +2 -0
  177. package/src/exceptions/not-found-exception.ts +2 -0
  178. package/src/exceptions/property-not-available-exception.ts +2 -0
  179. package/src/factories/DateFactory.ts +8 -0
  180. package/src/factories/InternalLinkFactory.ts +27 -0
  181. package/src/i-api-response.ts +7 -0
  182. package/src/i-class-factory.ts +5 -0
  183. package/src/i-model-description.ts +13 -0
  184. package/src/model-client.ts +77 -0
  185. package/src/model-factory.ts +94 -0
  186. package/src/models/bestfit-programme/bestfit-programme-client.ts +16 -0
  187. package/src/models/bestfit-programme/i-best-fit-programme.ts +102 -0
  188. package/src/models/bestfit-programme/i-g-p-a-requirement.ts +23 -0
  189. package/src/models/bestfit-programme/i-living-cost.ts +23 -0
  190. package/src/models/common/i-city.ts +16 -0
  191. package/src/models/common/i-country.ts +16 -0
  192. package/src/models/common/i-english-requirements.ts +38 -0
  193. package/src/models/common/i-internal-link.ts +32 -0
  194. package/src/models/common/i-logo.ts +16 -0
  195. package/src/models/common/i-tuition-fee.ts +57 -0
  196. package/src/models/dotdigital-organisation/dotdigital-organisation-client.ts +16 -0
  197. package/src/models/dotdigital-organisation/i-dot-digital-organisation.ts +59 -0
  198. package/src/models/dotdigital-organisation/i-review.ts +12 -0
  199. package/src/models/dotdigital-programme/dotdigital-programme-client.ts +16 -0
  200. package/src/models/dotdigital-programme/i-dot-digital-programme.ts +108 -0
  201. package/src/models/programme-card/i-click-tracking-data.ts +8 -0
  202. package/src/models/programme-card/i-cover.ts +16 -0
  203. package/src/models/programme-card/i-deadline.ts +23 -0
  204. package/src/models/programme-card/i-duration.ts +46 -0
  205. package/src/models/programme-card/i-link.ts +25 -0
  206. package/src/models/programme-card/i-location.ts +12 -0
  207. package/src/models/programme-card/i-optional-link.ts +27 -0
  208. package/src/models/programme-card/i-programme-card.ts +152 -0
  209. package/src/models/programme-card/i-start-date.ts +39 -0
  210. package/src/models/programme-card/i-timing.ts +53 -0
  211. package/src/models/programme-card/i-tracked-link.ts +34 -0
  212. package/src/models/programme-card/i-tracking.ts +55 -0
  213. package/src/models/programme-card/programme-card-client.ts +16 -0
  214. package/src/models/search-country-faq/i-search-country-faq.ts +22 -0
  215. package/src/models/search-country-faq/public-search-country-faq-client.ts +16 -0
  216. package/src/models/search-projection/i-geo-targeting-configuration.ts +44 -0
  217. package/src/models/search-projection/i-geo-targeting-values.ts +38 -0
  218. package/src/models/search-projection/i-organisation-values.ts +46 -0
  219. package/src/models/search-projection/i-premium-values.ts +43 -0
  220. package/src/models/search-projection/i-search-projection.ts +216 -0
  221. package/src/models/search-projection/i-tuition-values.ts +63 -0
  222. package/src/models/search-projection/search-projection-client.ts +16 -0
  223. package/src/types/portal-map.ts +3 -0
  224. package/src/types/portal-type.ts +7 -0
  225. package/src/types.ts +4 -0
  226. package/tsconfig.json +39 -0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
package/index.ts ADDED
@@ -0,0 +1,91 @@
1
+ import { BadRequestException } from "./src/exceptions/bad-request-exception"
2
+ import { ClientException } from "./src/exceptions/client-exception"
3
+ import { InternalServerException } from "./src/exceptions/internal-server-exception"
4
+ import { NotFoundException } from "./src/exceptions/not-found-exception"
5
+ import { PropertyNotAvailableException } from "./src/exceptions/property-not-available-exception"
6
+ import { ICover } from "./src/models/programme-card/i-cover";
7
+ import { ILink } from "./src/models/programme-card/i-link";
8
+ import { IOptionalLink } from "./src/models/programme-card/i-optional-link";
9
+ import { ILocation } from "./src/models/programme-card/i-location";
10
+ import { IClickTrackingData } from "./src/models/programme-card/i-click-tracking-data";
11
+ import { ITracking } from "./src/models/programme-card/i-tracking";
12
+ import { IDuration } from "./src/models/programme-card/i-duration";
13
+ import { IDeadline } from "./src/models/programme-card/i-deadline";
14
+ import { IStartDate } from "./src/models/programme-card/i-start-date";
15
+ import { ITiming } from "./src/models/programme-card/i-timing";
16
+ import { ITrackedLink } from "./src/models/programme-card/i-tracked-link";
17
+ import { IProgrammeCard } from "./src/models/programme-card/i-programme-card";
18
+ import { ProgrammeCardClient } from "./src/models/programme-card/programme-card-client";
19
+ import { ITuitionValues } from "./src/models/search-projection/i-tuition-values";
20
+ import { IPremiumValues } from "./src/models/search-projection/i-premium-values";
21
+ import { IOrganisationValues } from "./src/models/search-projection/i-organisation-values";
22
+ import { IGeoTargetingConfiguration } from "./src/models/search-projection/i-geo-targeting-configuration";
23
+ import { IGeoTargetingValues } from "./src/models/search-projection/i-geo-targeting-values";
24
+ import { ISearchProjection } from "./src/models/search-projection/i-search-projection";
25
+ import { SearchProjectionClient } from "./src/models/search-projection/search-projection-client";
26
+ import { ILivingCost } from "./src/models/bestfit-programme/i-living-cost";
27
+ import { IGPARequirement } from "./src/models/bestfit-programme/i-g-p-a-requirement";
28
+ import { IBestFitProgramme } from "./src/models/bestfit-programme/i-best-fit-programme";
29
+ import { BestfitProgrammeClient } from "./src/models/bestfit-programme/bestfit-programme-client";
30
+ import { IDotDigitalProgramme } from "./src/models/dotdigital-programme/i-dot-digital-programme";
31
+ import { DotdigitalProgrammeClient } from "./src/models/dotdigital-programme/dotdigital-programme-client";
32
+ import { ISearchCountryFaq } from "./src/models/search-country-faq/i-search-country-faq";
33
+ import { PublicSearchCountryFaqClient } from "./src/models/search-country-faq/public-search-country-faq-client";
34
+ import { IReview } from "./src/models/dotdigital-organisation/i-review";
35
+ import { IDotDigitalOrganisation } from "./src/models/dotdigital-organisation/i-dot-digital-organisation";
36
+ import { DotdigitalOrganisationClient } from "./src/models/dotdigital-organisation/dotdigital-organisation-client";
37
+ import { IInternalLink } from "./src/models/common/i-internal-link"
38
+ import { ILogo } from "./src/models/common/i-logo"
39
+ import { ITuitionFee } from "./src/models/common/i-tuition-fee"
40
+ import { IEnglishRequirements } from "./src/models/common/i-english-requirements"
41
+ import { ICity } from "./src/models/common/i-city"
42
+ import { ICountry } from "./src/models/common/i-country"
43
+ import { PortalType } from "./src/types/portal-type"
44
+ import { PortalMap } from "./src/types/portal-map"
45
+
46
+ export {
47
+ BadRequestException,
48
+ ClientException,
49
+ InternalServerException,
50
+ NotFoundException,
51
+ PropertyNotAvailableException,
52
+ IInternalLink,
53
+ ILogo,
54
+ ITuitionFee,
55
+ IEnglishRequirements,
56
+ ICity,
57
+ ICountry,
58
+ ICover,
59
+ ILink,
60
+ IOptionalLink,
61
+ ILocation,
62
+ IClickTrackingData,
63
+ ITracking,
64
+ IDuration,
65
+ IDeadline,
66
+ IStartDate,
67
+ ITiming,
68
+ ITrackedLink,
69
+ IProgrammeCard,
70
+ ProgrammeCardClient,
71
+ ITuitionValues,
72
+ IPremiumValues,
73
+ IOrganisationValues,
74
+ IGeoTargetingConfiguration,
75
+ IGeoTargetingValues,
76
+ ISearchProjection,
77
+ SearchProjectionClient,
78
+ ILivingCost,
79
+ IGPARequirement,
80
+ IBestFitProgramme,
81
+ BestfitProgrammeClient,
82
+ IDotDigitalProgramme,
83
+ DotdigitalProgrammeClient,
84
+ ISearchCountryFaq,
85
+ PublicSearchCountryFaqClient,
86
+ IReview,
87
+ IDotDigitalOrganisation,
88
+ DotdigitalOrganisationClient,
89
+ PortalMap,
90
+ PortalType
91
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@studyportals/domain-client",
3
- "version": "3.6.0-1",
3
+ "version": "3.6.0-2",
4
4
  "description": "Responsible for fetching data from the Domain API",
5
5
  "main": "bin/index.js",
6
6
  "author": "StudyPortals B.V.",
@@ -0,0 +1,70 @@
1
+ import Axios from "axios";
2
+
3
+ import { BadRequestException } from "./exceptions/bad-request-exception";
4
+ import { InternalServerException } from "./exceptions/internal-server-exception";
5
+ import { NotFoundException } from "./exceptions/not-found-exception";
6
+ import { IApiResponse } from "./i-api-response";
7
+ import { IModelDescription } from "./i-model-description";
8
+
9
+
10
+ export class DomainClient {
11
+
12
+ constructor(
13
+ public readonly baseUrl: string,
14
+ public readonly apiKey: string | undefined,
15
+ public readonly model: string,
16
+ public readonly version: string,
17
+ public readonly isPublic: boolean,
18
+ public readonly seed: number
19
+ ) {
20
+ }
21
+
22
+ public async doRequest(ids: number[]): Promise<IModelDescription[]> {
23
+ const url = this.buildUrl(ids);
24
+ const config: any = { baseURL: this.baseUrl }
25
+ if (this.apiKey !== undefined) {
26
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
27
+ config["headers"] = {'x-api-key': this.apiKey}
28
+ }
29
+ const axiosResponse = await Axios.get(url, config);
30
+ const response = axiosResponse.data as IApiResponse;
31
+ this.handleErrors(response);
32
+
33
+ const models: IModelDescription[] = [];
34
+ for (const id of ids) {
35
+ const modelData = response.data[id];
36
+ if (!modelData) {
37
+ continue;
38
+ }
39
+ models.push(modelData);
40
+ }
41
+ return models;
42
+ }
43
+
44
+ private handleErrors(response: IApiResponse): void {
45
+ if (!response.status) {
46
+ throw new InternalServerException(response.message);
47
+ }
48
+
49
+ if (response.status === 400) {
50
+ throw new BadRequestException(response.message);
51
+ }
52
+
53
+ if (response.status === 404) {
54
+ throw new NotFoundException(response.message);
55
+ }
56
+ }
57
+
58
+ private buildUrl(ids: number[]): string {
59
+ const publicPrefix = this.shouldAddPublicPrefix() ? 'public/' : '';
60
+ let query = `${publicPrefix}${this.model}/${this.version}/?seed=${this.seed}`;
61
+ for (const id of ids) {
62
+ query += `&id=${id}`;
63
+ }
64
+ return query;
65
+ }
66
+
67
+ private shouldAddPublicPrefix(): boolean {
68
+ return this.isPublic && this.apiKey === undefined;
69
+ }
70
+ }
@@ -0,0 +1,2 @@
1
+ export class BadRequestException extends Error {
2
+ }
@@ -0,0 +1,2 @@
1
+ export class ClientException extends Error {
2
+ }
@@ -0,0 +1,2 @@
1
+ export class InternalServerException extends Error {
2
+ }
@@ -0,0 +1,2 @@
1
+ export class NotFoundException extends Error {
2
+ }
@@ -0,0 +1,2 @@
1
+ export class PropertyNotAvailableException extends Error {
2
+ }
@@ -0,0 +1,8 @@
1
+ import { IClassFactory } from "../i-class-factory";
2
+ import { CallableReturnType, Model } from "../types";
3
+
4
+ export class DateFactory implements IClassFactory {
5
+ public create(data: Model, parameters: string[]): CallableReturnType {
6
+ return new Date(parameters[0]);
7
+ }
8
+ }
@@ -0,0 +1,27 @@
1
+ import { IClassFactory } from "../i-class-factory";
2
+ import { PortalType } from "../types/portal-type";
3
+ import { CallableReturnType, Model } from "../types";
4
+ import { PortalMap } from "../types/portal-map";
5
+
6
+ export class InternalLinkFactory implements IClassFactory {
7
+ private portalMap: PortalMap;
8
+
9
+ constructor(portalMap: PortalMap) {
10
+ this.portalMap = portalMap;
11
+ }
12
+
13
+ public create(link: Model): CallableReturnType {
14
+ const portalBaseUrl = this.getPortalBaseUrl(link.getPortalType() as PortalType);
15
+
16
+ const path = link['getUrl']() as string;
17
+ link['getUrl'] = () => portalBaseUrl + path;
18
+
19
+ return link;
20
+ }
21
+
22
+ private getPortalBaseUrl(portalType: PortalType): string {
23
+ const url = this.portalMap.get(portalType);
24
+ return url || '';
25
+ }
26
+
27
+ }
@@ -0,0 +1,7 @@
1
+ import { IModelDescription } from "./i-model-description";
2
+
3
+ export interface IApiResponse {
4
+ status: number;
5
+ data: Record<number, IModelDescription>;
6
+ message: string
7
+ }
@@ -0,0 +1,5 @@
1
+ import { CallableReturnType, Model } from "./types";
2
+
3
+ export interface IClassFactory {
4
+ create(data: Model, parameters?: any[]): CallableReturnType
5
+ }
@@ -0,0 +1,13 @@
1
+ import { AcceptedType } from "./types";
2
+
3
+ export interface IModelDescription {
4
+ class: string;
5
+ func: Record<string, AcceptedType | IModelDescription>;
6
+ parameters?: any[];
7
+ }
8
+
9
+ // eslint-disable-next-line
10
+ export function isModelDescription(arg: any): arg is IModelDescription {
11
+ // eslint-disable-next-line
12
+ return arg && arg.class && (arg.func || arg.parameters);
13
+ }
@@ -0,0 +1,77 @@
1
+ import { DomainClient } from "./domain-client";
2
+ import { ClientException } from "./exceptions/client-exception";
3
+ import { IModelDescription } from "./i-model-description";
4
+ import { ModelFactory } from "./model-factory";
5
+ import { PortalMap } from "./types/portal-map";
6
+
7
+
8
+ export abstract class ModelClient<T> {
9
+ private readonly domainClient: DomainClient | null;
10
+ private readonly modelFactory: ModelFactory<T>;
11
+
12
+ constructor(
13
+ baseUrl?: string,
14
+ apiKey?: string,
15
+ seed?: number,
16
+ portalMap?: PortalMap
17
+ ) {
18
+ if (!baseUrl || !seed) {
19
+ return;
20
+ }
21
+
22
+ this.modelFactory = new ModelFactory<T>(portalMap);
23
+ this.domainClient = new DomainClient(
24
+ baseUrl,
25
+ apiKey,
26
+ this.getModelName(),
27
+ this.getVersion(),
28
+ this.isPublic(),
29
+ seed
30
+ );
31
+ }
32
+
33
+ public async fetch(id: number): Promise<T> {
34
+ const modelDescriptions = await this.fetchDescription(id);
35
+ return this.modelFactory.fromDescription(modelDescriptions);
36
+ }
37
+
38
+ public async fetchDescription(id: number): Promise<IModelDescription> {
39
+ if (!this.domainClient) {
40
+ throw new ClientException(
41
+ "Offline mode active: did you provide all parameters " +
42
+ "in the constructor?"
43
+ );
44
+ }
45
+ const result = await this.domainClient.doRequest([id]);
46
+ return result[0];
47
+ }
48
+
49
+ public async fetchMultiple(ids: number[]): Promise<T[]> {
50
+ const descriptions = await this.fetchMultipleDescriptions(ids);
51
+ return this.modelFactory.fromDescriptions(descriptions);
52
+ }
53
+
54
+ public async fetchMultipleDescriptions(ids: number[]): Promise<IModelDescription[]> {
55
+ if (!this.domainClient) {
56
+ throw new ClientException(
57
+ 'Offline mode active: did you provide all parameters ' +
58
+ 'in the constructor?'
59
+ );
60
+ }
61
+ return await this.domainClient.doRequest(ids);
62
+ }
63
+
64
+ public fromDescription(description: IModelDescription): T {
65
+ return this.modelFactory.fromDescription(description);
66
+ }
67
+
68
+ public fromDescriptions(descriptions: IModelDescription[]): T[] {
69
+ return this.modelFactory.fromDescriptions(descriptions);
70
+ }
71
+
72
+ protected abstract getModelName(): string;
73
+
74
+ protected abstract getVersion(): string;
75
+
76
+ public abstract isPublic(): boolean;
77
+ }
@@ -0,0 +1,94 @@
1
+ import { InternalLinkFactory } from "./factories/InternalLinkFactory";
2
+ import { DateFactory } from "./factories/DateFactory";
3
+ import { IClassFactory } from "./i-class-factory";
4
+ import { IModelDescription, isModelDescription } from "./i-model-description";
5
+ import { PropertyNotAvailableException } from "./exceptions/property-not-available-exception";
6
+ import { Callable, CallableReturnType, Model } from "./types";
7
+ import { PortalMap } from "./types/portal-map";
8
+ import { PortalType } from "./types/portal-type";
9
+
10
+ export class ModelFactory<T> {
11
+
12
+ private customClassFactories: Map<string, IClassFactory>;
13
+
14
+ constructor(portalMap: PortalMap = new Map<PortalType, string>()) {
15
+ const factories = new Map<string, IClassFactory>();
16
+ factories.set('IInternalLink', new InternalLinkFactory(portalMap));
17
+ factories.set('SerializableDateTime', new DateFactory());
18
+
19
+ this.customClassFactories = factories;
20
+ }
21
+
22
+ public fromDescription(data: IModelDescription): T {
23
+ return this.unpackClass(data) as unknown as T;
24
+ }
25
+
26
+ public fromDescriptions(data: IModelDescription[]): T[] {
27
+ const models: T[] = [];
28
+ for (const modelDescription of data) {
29
+ models.push(this.unpackClass(modelDescription) as unknown as T);
30
+ }
31
+ return models;
32
+ }
33
+
34
+ private unpackClass(data: IModelDescription): CallableReturnType {
35
+
36
+
37
+ const unpacked: Model = {};
38
+ for (const functionName in data.func) {
39
+ unpacked[functionName] = this.getCallable(functionName, data);
40
+ }
41
+
42
+ const factory = this.customClassFactories.get(data.class);
43
+ if (factory !== undefined) {
44
+ return factory.create(unpacked, data.parameters);
45
+ }
46
+
47
+ return unpacked;
48
+ }
49
+
50
+ private getCallable(
51
+ functionName: string,
52
+ data: IModelDescription
53
+ ): Callable {
54
+ const propertyName = functionName.substr(3);
55
+ const canShowFunction = 'canShow' + propertyName;
56
+
57
+ const value: unknown = data.func[functionName];
58
+ let returnValue: CallableReturnType|CallableReturnType[];
59
+
60
+ if (isModelDescription(value)) {
61
+ returnValue = this.unpackClass(value);
62
+ } else if (Array.isArray(value)) {
63
+ returnValue = this.unpackArray(value);
64
+ } else {
65
+ returnValue = value as CallableReturnType;
66
+ }
67
+
68
+ if (canShowFunction in data.func) {
69
+ return () => {
70
+ if (data.func[canShowFunction] === false) {
71
+ throw new PropertyNotAvailableException(
72
+ `Property '${propertyName}' not available`
73
+ );
74
+ }
75
+ return returnValue;
76
+ };
77
+ }
78
+ return () => {
79
+ return returnValue;
80
+ };
81
+ }
82
+
83
+ private unpackArray(list: any[]): CallableReturnType[] {
84
+ return list.map(
85
+ item => {
86
+ if (isModelDescription(item)) {
87
+ return this.unpackClass(item)
88
+ }
89
+
90
+ return item as CallableReturnType;
91
+ }
92
+ );
93
+ }
94
+ }
@@ -0,0 +1,16 @@
1
+ import { IBestFitProgramme } from "../../..";
2
+ import { ModelClient } from "../../model-client";
3
+
4
+ export class BestfitProgrammeClient extends ModelClient<IBestFitProgramme> {
5
+ protected getModelName(): string {
6
+ return 'bestfit-programme';
7
+ }
8
+
9
+ protected getVersion(): string {
10
+ return 'v1';
11
+ }
12
+
13
+ public isPublic(): boolean {
14
+ return false;
15
+ }
16
+ }
@@ -0,0 +1,102 @@
1
+ import { ICity, IEnglishRequirements, IGPARequirement, ILivingCost, ITuitionFee } from "../../..";
2
+
3
+ export interface IBestFitProgramme {
4
+
5
+ /**
6
+ * Average university ranking across multiple ranking institutes.
7
+ *
8
+ * @return number
9
+ */
10
+ getAverageRankingPosition(): number;
11
+
12
+ canShowAverageRankingPosition(): boolean;
13
+
14
+ /**
15
+ * City which programme is given in
16
+ *
17
+ * @return ICity
18
+ */
19
+ getCity(): ICity;
20
+
21
+ /**
22
+ * Get country id the programme is teached in
23
+ *
24
+ * @return number
25
+ */
26
+ getCountryId(): number;
27
+
28
+ /**
29
+ * Discipline ids which the program is linked to.
30
+ *
31
+ * @return number[]
32
+ */
33
+ getDisciplineIds(): number[];
34
+
35
+ canShowDisciplineIds(): boolean;
36
+
37
+ /**
38
+ * English level requirements.
39
+ *
40
+ * @return IEnglishRequirements
41
+ */
42
+ getEnglishRequirements(): IEnglishRequirements;
43
+
44
+ /**
45
+ * GPA requirements
46
+ *
47
+ * @return IGPARequirement
48
+ */
49
+ getGPA(): IGPARequirement;
50
+
51
+ canShowGPA(): boolean;
52
+
53
+ /**
54
+ * Id of the programme.
55
+ *
56
+ * @return number
57
+ */
58
+ getId(): number;
59
+
60
+ /**
61
+ * Estimated living cost based on universities location.
62
+ *
63
+ * @return ILivingCost
64
+ */
65
+ getLivingCost(): ILivingCost;
66
+
67
+ canShowLivingCost(): boolean;
68
+
69
+ /**
70
+ * Minimum required education level
71
+ *
72
+ * @return string
73
+ */
74
+ getRequiredEducationalLevel(): string;
75
+
76
+ canShowRequiredEducationalLevel(): boolean;
77
+
78
+ /**
79
+ * The programmes tuition fees
80
+ *
81
+ * @return ITuitionFee[]
82
+ */
83
+ getTuitionFees(): ITuitionFee[];
84
+
85
+ canShowTuitionFees(): boolean;
86
+
87
+ /**
88
+ * Amount of years required as work experience
89
+ *
90
+ * @return number
91
+ */
92
+ getWorkExperienceYears(): number;
93
+
94
+ canShowWorkExperienceYears(): boolean;
95
+
96
+ /**
97
+ * Indicates whenever a programme is fully online or not
98
+ *
99
+ * @return boolean
100
+ */
101
+ isFullyOnline(): boolean;
102
+ }
@@ -0,0 +1,23 @@
1
+ export interface IGPARequirement {
2
+
3
+ /**
4
+ * The used GPA scale for this requirement
5
+ *
6
+ * @return string
7
+ */
8
+ getScale(): string;
9
+
10
+ /**
11
+ * Required minimum score.
12
+ *
13
+ * @return string
14
+ */
15
+ getScore(): string;
16
+
17
+ /**
18
+ * Is GPA recommended or required.
19
+ *
20
+ * @return boolean
21
+ */
22
+ isRequired(): boolean;
23
+ }
@@ -0,0 +1,23 @@
1
+ export interface ILivingCost {
2
+
3
+ /**
4
+ * Get the applicable currency.
5
+ *
6
+ * @return string
7
+ */
8
+ getCurrency(): string;
9
+
10
+ /**
11
+ * Get the maximum living cost in the provided currency.
12
+ *
13
+ * @return number
14
+ */
15
+ getMax(): number;
16
+
17
+ /**
18
+ * Get the minimum living cost in the provided currency.
19
+ *
20
+ * @return number
21
+ */
22
+ getMin(): number;
23
+ }
@@ -0,0 +1,16 @@
1
+ export interface ICity {
2
+
3
+ /**
4
+ * Get city id
5
+ *
6
+ * @return number
7
+ */
8
+ getId(): number;
9
+
10
+ /**
11
+ * Get city name
12
+ *
13
+ * @return string
14
+ */
15
+ getName(): string;
16
+ }