@studyportals/fawkes 8.1.2-2 → 8.1.2-3

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 (146) hide show
  1. package/dist/src/common/IPolicyMetaData.d.ts +6 -0
  2. package/dist/src/common/rules/BaseFilterKeyValueRule.js +10 -3
  3. package/dist/src/enums/FilterCombinations.d.ts +26 -1
  4. package/dist/src/enums/FilterCombinations.js +26 -1
  5. package/dist/src/organisations/OrganisationsRuleBasedIndexabilityPolicy.d.ts +11 -0
  6. package/dist/src/organisations/OrganisationsRuleBasedIndexabilityPolicy.js +19 -0
  7. package/dist/src/organisations/rules/AtLeastTwoRankedResultsRule.d.ts +13 -0
  8. package/dist/src/organisations/rules/AtLeastTwoRankedResultsRule.js +26 -0
  9. package/dist/src/organisations/rules/OnlineAttendanceRule.d.ts +6 -0
  10. package/dist/src/organisations/rules/OnlineAttendanceRule.js +14 -0
  11. package/dist/src/presenters/AttendancePresenter.js +4 -0
  12. package/dist/src/presenters/FormatPresenter.js +4 -1
  13. package/dist/src/presenters/SpecialProgrammesPresenter.js +4 -0
  14. package/dist/src/programmes/IProgrammeSearchApplicationState.d.ts +4 -0
  15. package/dist/src/programmes/IProgrammeSearchApplicationState.js +1 -0
  16. package/dist/src/programmes/IProgrammeSearchDependencies.d.ts +7 -0
  17. package/dist/src/programmes/IProgrammeSearchDependencies.js +1 -0
  18. package/dist/src/programmes/IProgrammesSeoDependencies.d.ts +2 -0
  19. package/dist/src/programmes/IProgrammesSeoDependencies.js +1 -0
  20. package/dist/src/programmes/SearchIndexabilityManager.js +31 -3
  21. package/dist/src/programmes/policies/AttendanceArea.d.ts +16 -0
  22. package/dist/src/programmes/policies/AttendanceArea.js +48 -0
  23. package/dist/src/programmes/policies/AttendanceContinent.d.ts +16 -0
  24. package/dist/src/programmes/policies/AttendanceContinent.js +46 -0
  25. package/dist/src/programmes/policies/AttendanceDegree.d.ts +3 -3
  26. package/dist/src/programmes/policies/AttendanceDegree.js +4 -4
  27. package/dist/src/programmes/policies/AttendanceDuration.d.ts +17 -0
  28. package/dist/src/programmes/policies/AttendanceDuration.js +50 -0
  29. package/dist/src/programmes/policies/AttendanceFormat.d.ts +16 -0
  30. package/dist/src/programmes/policies/AttendanceFormat.js +48 -0
  31. package/dist/src/programmes/policies/AttendanceTuitionFee.d.ts +17 -0
  32. package/dist/src/programmes/policies/AttendanceTuitionFee.js +51 -0
  33. package/dist/src/programmes/policies/ContinentDuration.d.ts +16 -0
  34. package/dist/src/programmes/policies/ContinentDuration.js +48 -0
  35. package/dist/src/programmes/policies/ContinentFormat.d.ts +16 -0
  36. package/dist/src/programmes/policies/ContinentFormat.js +48 -0
  37. package/dist/src/programmes/policies/ContinentSpecialProgrammes.d.ts +16 -0
  38. package/dist/src/programmes/policies/ContinentSpecialProgrammes.js +48 -0
  39. package/dist/src/programmes/policies/CountryDuration.d.ts +2 -2
  40. package/dist/src/programmes/policies/CountryDuration.js +6 -4
  41. package/dist/src/programmes/policies/CountrySpecialProgrammes.d.ts +16 -0
  42. package/dist/src/programmes/policies/CountrySpecialProgrammes.js +48 -0
  43. package/dist/src/programmes/policies/DegreeArea.d.ts +15 -0
  44. package/dist/src/programmes/policies/DegreeArea.js +46 -0
  45. package/dist/src/programmes/policies/DegreeAreaTuitionFee.d.ts +16 -0
  46. package/dist/src/programmes/policies/DegreeAreaTuitionFee.js +54 -0
  47. package/dist/src/programmes/policies/DegreeAttendanceDiscipline.d.ts +2 -1
  48. package/dist/src/programmes/policies/DegreeAttendanceDiscipline.js +12 -12
  49. package/dist/src/programmes/policies/DegreeAttendanceFormat.d.ts +17 -0
  50. package/dist/src/programmes/policies/DegreeAttendanceFormat.js +56 -0
  51. package/dist/src/programmes/policies/DegreeAttendanceSpecialProgrammes.d.ts +17 -0
  52. package/dist/src/programmes/policies/DegreeAttendanceSpecialProgrammes.js +58 -0
  53. package/dist/src/programmes/policies/DegreeAttendanceTuitionFee.d.ts +18 -0
  54. package/dist/src/programmes/policies/DegreeAttendanceTuitionFee.js +59 -0
  55. package/dist/src/programmes/policies/DegreeContinent.d.ts +16 -0
  56. package/dist/src/programmes/policies/DegreeContinent.js +46 -0
  57. package/dist/src/programmes/policies/DegreeContinentTuitionFee.d.ts +16 -0
  58. package/dist/src/programmes/policies/DegreeContinentTuitionFee.js +52 -0
  59. package/dist/src/programmes/policies/DegreeCountryAttendance.js +3 -3
  60. package/dist/src/programmes/policies/DegreeCountryTuitionFee.js +2 -2
  61. package/dist/src/programmes/policies/DegreeDuration.d.ts +17 -0
  62. package/dist/src/programmes/policies/DegreeDuration.js +50 -0
  63. package/dist/src/programmes/policies/DegreeFormat.d.ts +16 -0
  64. package/dist/src/programmes/policies/DegreeFormat.js +48 -0
  65. package/dist/src/programmes/policies/DegreeFormatTuitionFee.d.ts +18 -0
  66. package/dist/src/programmes/policies/DegreeFormatTuitionFee.js +56 -0
  67. package/dist/src/programmes/policies/DegreeSpecialProgrammes.d.ts +17 -0
  68. package/dist/src/programmes/policies/DegreeSpecialProgrammes.js +52 -0
  69. package/dist/src/programmes/policies/DegreeTuitionFee.d.ts +16 -0
  70. package/dist/src/programmes/policies/DegreeTuitionFee.js +49 -0
  71. package/dist/src/programmes/policies/DisciplineArea.d.ts +1 -1
  72. package/dist/src/programmes/policies/DisciplineArea.js +1 -1
  73. package/dist/src/programmes/policies/DisciplineContinentAttendance.d.ts +16 -0
  74. package/dist/src/programmes/policies/DisciplineContinentAttendance.js +54 -0
  75. package/dist/src/programmes/policies/DisciplineCountryAttendance.d.ts +16 -0
  76. package/dist/src/programmes/policies/DisciplineCountryAttendance.js +54 -0
  77. package/dist/src/programmes/policies/DisciplineCountryDegree.d.ts +16 -0
  78. package/dist/src/programmes/policies/DisciplineCountryDegree.js +53 -0
  79. package/dist/src/programmes/policies/DisciplineCountryFormat.d.ts +16 -0
  80. package/dist/src/programmes/policies/DisciplineCountryFormat.js +54 -0
  81. package/dist/src/programmes/policies/DisciplineDuration.d.ts +2 -2
  82. package/dist/src/programmes/policies/DisciplineDuration.js +2 -2
  83. package/dist/src/programmes/policies/DisciplineSpecialProgrammes.d.ts +16 -0
  84. package/dist/src/programmes/policies/DisciplineSpecialProgrammes.js +48 -0
  85. package/dist/src/programmes/policies/DisciplineTuitionFee.js +1 -1
  86. package/dist/src/programmes/policies/Duration.d.ts +16 -0
  87. package/dist/src/programmes/policies/Duration.js +40 -0
  88. package/dist/src/programmes/policies/Format.d.ts +15 -0
  89. package/dist/src/programmes/policies/Format.js +38 -0
  90. package/dist/src/programmes/policies/SpecialProgrammes.d.ts +1 -2
  91. package/dist/src/programmes/policies/SpecialProgrammes.js +0 -2
  92. package/dist/src/programmes/policies/index.d.ts +27 -1
  93. package/dist/src/programmes/policies/index.js +27 -1
  94. package/dist/src/programmes/rules/AtLeastSevenResultsRule.d.ts +15 -0
  95. package/dist/src/programmes/rules/AtLeastSevenResultsRule.js +30 -0
  96. package/dist/src/programmes/rules/BlendedOrOnlineAttendanceRule.d.ts +6 -0
  97. package/dist/src/programmes/rules/BlendedOrOnlineAttendanceRule.js +18 -0
  98. package/dist/src/programmes/rules/DegreeAttendanceSpecificRule.d.ts +10 -0
  99. package/dist/src/programmes/rules/DegreeAttendanceSpecificRule.js +42 -0
  100. package/dist/src/programmes/rules/DegreeCountrySpecificRule.d.ts +10 -0
  101. package/dist/src/programmes/rules/DegreeCountrySpecificRule.js +43 -0
  102. package/dist/src/programmes/rules/DegreeCountryTuitionFeeRule.d.ts +11 -0
  103. package/dist/src/programmes/rules/DegreeCountryTuitionFeeRule.js +40 -0
  104. package/dist/src/programmes/rules/ErasmusOrExecutiveSpecialProgrammeRule.d.ts +6 -0
  105. package/dist/src/programmes/rules/ErasmusOrExecutiveSpecialProgrammeRule.js +19 -0
  106. package/dist/src/programmes/rules/ErasmusOrJointSpecialProgrammesRule.js +2 -2
  107. package/dist/src/programmes/rules/ErasmusSpecialProgrammeRule.d.ts +6 -0
  108. package/dist/src/programmes/rules/ErasmusSpecialProgrammeRule.js +19 -0
  109. package/dist/src/programmes/rules/ExecutiveSpecialProgrammeRule.d.ts +6 -0
  110. package/dist/src/programmes/rules/ExecutiveSpecialProgrammeRule.js +19 -0
  111. package/dist/src/programmes/rules/MBACountryAttendanceRule.d.ts +11 -0
  112. package/dist/src/programmes/rules/MBACountryAttendanceRule.js +40 -0
  113. package/dist/src/programmes/rules/MasterOfArtsDisciplineRule.d.ts +10 -0
  114. package/dist/src/programmes/rules/MasterOfArtsDisciplineRule.js +41 -0
  115. package/dist/src/programmes/rules/MasterOfEducationCountryDisciplineRule.d.ts +11 -0
  116. package/dist/src/programmes/rules/MasterOfEducationCountryDisciplineRule.js +69 -0
  117. package/dist/src/programmes/rules/MasterOfLawsCountryAttendanceRule.d.ts +12 -0
  118. package/dist/src/programmes/rules/MasterOfLawsCountryAttendanceRule.js +43 -0
  119. package/dist/src/programmes/rules/MasterOfLawsCountryTuitionFeeRule.d.ts +12 -0
  120. package/dist/src/programmes/rules/MasterOfLawsCountryTuitionFeeRule.js +46 -0
  121. package/dist/src/programmes/rules/MasterOfPhilosophyCountryAttendanceRule.d.ts +12 -0
  122. package/dist/src/programmes/rules/MasterOfPhilosophyCountryAttendanceRule.js +43 -0
  123. package/dist/src/programmes/rules/MasterOfScienceDisciplineRule.d.ts +10 -0
  124. package/dist/src/programmes/rules/MasterOfScienceDisciplineRule.js +41 -0
  125. package/dist/src/programmes/rules/OneOrTwoYearDurationRule.d.ts +6 -0
  126. package/dist/src/programmes/rules/OneOrTwoYearDurationRule.js +19 -0
  127. package/dist/src/programmes/rules/OneYearOnlyRule.d.ts +11 -0
  128. package/dist/src/programmes/rules/OneYearOnlyRule.js +34 -0
  129. package/dist/src/programmes/rules/OnlineAttendanceRule.d.ts +6 -0
  130. package/dist/src/programmes/rules/OnlineAttendanceRule.js +15 -0
  131. package/dist/src/programmes/rules/TwoYearDurationRule.d.ts +6 -0
  132. package/dist/src/programmes/rules/TwoYearDurationRule.js +19 -0
  133. package/dist/src/sitemap-generator/BaseSitemapUrlGeneratorManager.js +0 -1
  134. package/dist/src/sitemap-generator/IPageNumberProvider.d.ts +3 -0
  135. package/dist/src/sitemap-generator/IPageNumberProvider.js +1 -0
  136. package/dist/src/sitemap-generator/ProgrammesSitemapUrlGeneratorManager.js +117 -32
  137. package/dist/src/structured-data/SearchStructuredDataFactory.d.ts +2 -22
  138. package/dist/src/structured-data/SearchStructuredDataFactory.js +7 -64
  139. package/dist/src/structured-data/dto/EntityDTO.d.ts +0 -2
  140. package/dist/src/structured-data/dto/index.d.ts +0 -1
  141. package/dist/src/structured-data/dto/index.js +0 -1
  142. package/package.json +6 -6
  143. package/dist/src/structured-data/ScholarshipStructuredDataFactory.d.ts +0 -14
  144. package/dist/src/structured-data/ScholarshipStructuredDataFactory.js +0 -69
  145. package/dist/src/structured-data/dto/PaywallDTO.d.ts +0 -14
  146. /package/dist/src/{structured-data/dto/PaywallDTO.js → common/IPolicyMetaData.js} +0 -0
@@ -0,0 +1,40 @@
1
+ import { DurationFilterOptionValue, FilterKey } from '@studyportals/search-filters/server-side';
2
+ import { OnlyFiltersSelectedRule } from '../../common/rules/OnlyFiltersSelectedRule';
3
+ import { SingleValueSelectedForFilterRule } from '../../common/rules/SingleValueSelectedForFilterRule';
4
+ import { FilterCombinations } from '../../enums/FilterCombinations';
5
+ import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
6
+ import { DurationPresenter } from '../../presenters/DurationPresenter';
7
+ import { OneOrTwoYearDurationRule } from '../rules/OneOrTwoYearDurationRule';
8
+ export class Duration extends ProgrammesBaseIndexabilityPolicy {
9
+ name = 'Duration Policy';
10
+ description = 'Governs indexing of duration-level filtered pages. (1 year - 2 year)';
11
+ filterKeys = [FilterKey.DURATION];
12
+ rules = [
13
+ new SingleValueSelectedForFilterRule(FilterKey.DURATION),
14
+ new OnlyFiltersSelectedRule([FilterKey.DURATION]),
15
+ new OneOrTwoYearDurationRule()
16
+ ];
17
+ constructor(dependencies) {
18
+ super(dependencies);
19
+ this.initateBaseRules();
20
+ }
21
+ async generateUrls() {
22
+ const durationFragments = DurationPresenter.getInstance().getFragments();
23
+ const allowedDurationIds = [DurationFilterOptionValue.ONE_YEAR, DurationFilterOptionValue.TWO_YEARS];
24
+ const allowedDurations = durationFragments.filter(duration => allowedDurationIds.includes(duration.id));
25
+ const paths = [];
26
+ for (const pageNumber of this.indexablePageNumbers) {
27
+ for (const duration of allowedDurations) {
28
+ const filterKeyValues = new Map([[FilterKey.DURATION, [duration.id]]]);
29
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
30
+ if (result) {
31
+ paths.push(this.getPathWithPageNumber(duration.path, pageNumber));
32
+ }
33
+ }
34
+ }
35
+ return paths;
36
+ }
37
+ get filterCombination() {
38
+ return FilterCombinations.DURATION;
39
+ }
40
+ }
@@ -0,0 +1,15 @@
1
+ import { FilterKey } from '@studyportals/search-filters/server-side';
2
+ import { OnlyFiltersSelectedRule } from '../../common/rules/OnlyFiltersSelectedRule';
3
+ import { SingleValueSelectedForFilterRule } from '../../common/rules/SingleValueSelectedForFilterRule';
4
+ import { FilterCombinations } from '../../enums/FilterCombinations';
5
+ import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
6
+ import { IProgrammeSeoDependencies } from '../types/IProgrammeSeoDependencies';
7
+ export declare class Format extends ProgrammesBaseIndexabilityPolicy {
8
+ readonly name: string;
9
+ readonly description: string;
10
+ readonly filterKeys: FilterKey[];
11
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule)[];
12
+ constructor(dependencies: IProgrammeSeoDependencies);
13
+ protected generateUrls(): Promise<string[]>;
14
+ get filterCombination(): FilterCombinations;
15
+ }
@@ -0,0 +1,38 @@
1
+ import { FilterKey, FormatFilterOptionValue } from '@studyportals/search-filters/server-side';
2
+ import { OnlyFiltersSelectedRule } from '../../common/rules/OnlyFiltersSelectedRule';
3
+ import { SingleValueSelectedForFilterRule } from '../../common/rules/SingleValueSelectedForFilterRule';
4
+ import { FilterCombinations } from '../../enums/FilterCombinations';
5
+ import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
6
+ import { FormatPresenter } from '../../presenters/FormatPresenter';
7
+ export class Format extends ProgrammesBaseIndexabilityPolicy {
8
+ name = 'Format Policy';
9
+ description = 'Governs indexing of format-level filtered pages.';
10
+ filterKeys = [FilterKey.ATTENDANCE];
11
+ rules = [
12
+ new SingleValueSelectedForFilterRule(FilterKey.ATTENDANCE),
13
+ new OnlyFiltersSelectedRule([FilterKey.ATTENDANCE])
14
+ ];
15
+ constructor(dependencies) {
16
+ super(dependencies);
17
+ this.initateBaseRules();
18
+ }
19
+ async generateUrls() {
20
+ const formatFragments = FormatPresenter.getInstance().getFragments();
21
+ const allowedFormatIds = [FormatFilterOptionValue.PART_TIME, FormatFilterOptionValue.FULL_TIME];
22
+ const allowedFormats = formatFragments.filter(format => allowedFormatIds.includes(format.id));
23
+ const paths = [];
24
+ for (const pageNumber of this.indexablePageNumbers) {
25
+ for (const format of allowedFormats) {
26
+ const filterKeyValues = new Map([[FilterKey.ATTENDANCE, [format.id]]]);
27
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
28
+ if (result) {
29
+ paths.push(this.getPathWithPageNumber(format.path, pageNumber));
30
+ }
31
+ }
32
+ }
33
+ return paths;
34
+ }
35
+ get filterCombination() {
36
+ return FilterCombinations.FORMAT;
37
+ }
38
+ }
@@ -2,14 +2,13 @@ import { FilterKey } from '@studyportals/search-filters/server-side';
2
2
  import { OnlyFiltersSelectedRule } from '../../common/rules/OnlyFiltersSelectedRule';
3
3
  import { SingleValueSelectedForFilterRule } from '../../common/rules/SingleValueSelectedForFilterRule';
4
4
  import { FilterCombinations } from '../../enums/FilterCombinations';
5
- import { ErasmusOrJointSpecialProgrammesRule } from '../rules/ErasmusOrJointSpecialProgrammesRule';
6
5
  import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
6
  import { IProgrammeSeoDependencies } from '../types/IProgrammeSeoDependencies';
8
7
  export declare class SpecialProgrammes extends ProgrammesBaseIndexabilityPolicy {
9
8
  readonly name: string;
10
9
  readonly description: string;
11
10
  readonly filterKeys: FilterKey[];
12
- protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | ErasmusOrJointSpecialProgrammesRule)[];
11
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule)[];
13
12
  constructor(dependencies: IProgrammeSeoDependencies);
14
13
  protected generateUrls(): Promise<string[]>;
15
14
  get filterCombination(): FilterCombinations;
@@ -2,7 +2,6 @@ import { FilterKey } from '@studyportals/search-filters/server-side';
2
2
  import { OnlyFiltersSelectedRule } from '../../common/rules/OnlyFiltersSelectedRule';
3
3
  import { SingleValueSelectedForFilterRule } from '../../common/rules/SingleValueSelectedForFilterRule';
4
4
  import { FilterCombinations } from '../../enums/FilterCombinations';
5
- import { ErasmusOrJointSpecialProgrammesRule } from '../rules/ErasmusOrJointSpecialProgrammesRule';
6
5
  import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
6
  import { SpecialProgrammesPresenter } from '../../presenters/SpecialProgrammesPresenter';
8
7
  export class SpecialProgrammes extends ProgrammesBaseIndexabilityPolicy {
@@ -12,7 +11,6 @@ export class SpecialProgrammes extends ProgrammesBaseIndexabilityPolicy {
12
11
  rules = [
13
12
  new SingleValueSelectedForFilterRule(FilterKey.SPECIAL_PROGRAMMES),
14
13
  new OnlyFiltersSelectedRule([FilterKey.SPECIAL_PROGRAMMES]),
15
- new ErasmusOrJointSpecialProgrammesRule()
16
14
  ];
17
15
  constructor(dependencies) {
18
16
  super(dependencies);
@@ -18,7 +18,6 @@ export * from './DegreeCountryDiscipline';
18
18
  export * from './DegreeCountryTuitionFee';
19
19
  export * from './DisciplineDegree';
20
20
  export * from './Discipline';
21
- export * from './DisciplineArea';
22
21
  export * from './DisciplineAttendance';
23
22
  export * from './DisciplineContinent';
24
23
  export * from './DisciplineCountry';
@@ -32,3 +31,30 @@ export * from './DisciplineTuitionFeeAttendance';
32
31
  export * from './SpecialProgrammes';
33
32
  export * from './TuitionFee';
34
33
  export * from './Unfiltered';
34
+ export * from './Format';
35
+ export * from './DegreeFormat';
36
+ export * from './DegreeAttendanceTuitionFee';
37
+ export * from './DegreeArea';
38
+ export * from './DegreeTuitionFee';
39
+ export * from './DegreeAttendanceTuitionFee';
40
+ export * from './DegreeContinent';
41
+ export * from './AttendanceTuitionFee';
42
+ export * from './Duration';
43
+ export * from './AttendanceDuration';
44
+ export * from './DegreeAreaTuitionFee';
45
+ export * from './DisciplineContinentAttendance';
46
+ export * from './DegreeContinentTuitionFee';
47
+ export * from './AttendanceFormat';
48
+ export * from './ContinentFormat';
49
+ export * from './AttendanceContinent';
50
+ export * from './DegreeDuration';
51
+ export * from './ContinentSpecialProgrammes';
52
+ export * from './CountrySpecialProgrammes';
53
+ export * from './AttendanceArea';
54
+ export * from './DegreeFormatTuitionFee';
55
+ export * from './ContinentDuration';
56
+ export * from './DegreeAttendanceFormat';
57
+ export * from './DisciplineCountryAttendance';
58
+ export * from './DisciplineCountryFormat';
59
+ export * from './DegreeSpecialProgrammes';
60
+ export * from './Degree';
@@ -18,7 +18,6 @@ export * from './DegreeCountryDiscipline';
18
18
  export * from './DegreeCountryTuitionFee';
19
19
  export * from './DisciplineDegree';
20
20
  export * from './Discipline';
21
- export * from './DisciplineArea';
22
21
  export * from './DisciplineAttendance';
23
22
  export * from './DisciplineContinent';
24
23
  export * from './DisciplineCountry';
@@ -32,3 +31,30 @@ export * from './DisciplineTuitionFeeAttendance';
32
31
  export * from './SpecialProgrammes';
33
32
  export * from './TuitionFee';
34
33
  export * from './Unfiltered';
34
+ export * from './Format';
35
+ export * from './DegreeFormat';
36
+ export * from './DegreeAttendanceTuitionFee';
37
+ export * from './DegreeArea';
38
+ export * from './DegreeTuitionFee';
39
+ export * from './DegreeAttendanceTuitionFee';
40
+ export * from './DegreeContinent';
41
+ export * from './AttendanceTuitionFee';
42
+ export * from './Duration';
43
+ export * from './AttendanceDuration';
44
+ export * from './DegreeAreaTuitionFee';
45
+ export * from './DisciplineContinentAttendance';
46
+ export * from './DegreeContinentTuitionFee';
47
+ export * from './AttendanceFormat';
48
+ export * from './ContinentFormat';
49
+ export * from './AttendanceContinent';
50
+ export * from './DegreeDuration';
51
+ export * from './ContinentSpecialProgrammes';
52
+ export * from './CountrySpecialProgrammes';
53
+ export * from './AttendanceArea';
54
+ export * from './DegreeFormatTuitionFee';
55
+ export * from './ContinentDuration';
56
+ export * from './DegreeAttendanceFormat';
57
+ export * from './DisciplineCountryAttendance';
58
+ export * from './DisciplineCountryFormat';
59
+ export * from './DegreeSpecialProgrammes';
60
+ export * from './Degree';
@@ -0,0 +1,15 @@
1
+ import { ISearchDependencies } from '../../common/ISearchDependencies';
2
+ import { FilterKeyValuesMap } from '../../common/FilterKeyValuesMap';
3
+ import { ISearchApiClient } from '../../sitemap-generator/ISearchApiClient';
4
+ import { IProgrammeRule } from '../IProgrammeRule';
5
+ export declare class AtLeastSevenResultsRule implements IProgrammeRule {
6
+ private readonly minimumResultsCount;
7
+ private readonly maximumPageSize;
8
+ private readonly searchApiClient?;
9
+ constructor(searchApiClient?: ISearchApiClient);
10
+ forSearch(dependencies: ISearchDependencies): Promise<boolean>;
11
+ forSitemapGeneratorWithPageNumber(filterKeyValues: FilterKeyValuesMap, pageNumber: number): Promise<boolean>;
12
+ forSitemapGenerator(): Promise<boolean>;
13
+ getName(): string;
14
+ getDescription(): string;
15
+ }
@@ -0,0 +1,30 @@
1
+ import { DependencyMissingError } from '../../errors/DependencyMissingError';
2
+ export class AtLeastSevenResultsRule {
3
+ minimumResultsCount = 7;
4
+ maximumPageSize = 20;
5
+ searchApiClient;
6
+ constructor(searchApiClient) {
7
+ this.searchApiClient = searchApiClient;
8
+ }
9
+ forSearch(dependencies) {
10
+ const { applicationState } = dependencies;
11
+ const resultCount = applicationState.getNumberOfResults();
12
+ return Promise.resolve(resultCount >= this.minimumResultsCount);
13
+ }
14
+ async forSitemapGeneratorWithPageNumber(filterKeyValues, pageNumber) {
15
+ if (!this.searchApiClient) {
16
+ throw new DependencyMissingError('SearchApiClient');
17
+ }
18
+ const count = await this.searchApiClient.getProgrammeCount(filterKeyValues);
19
+ return count >= (pageNumber - 1) * this.maximumPageSize + this.minimumResultsCount;
20
+ }
21
+ forSitemapGenerator() {
22
+ throw new Error('Method not implemented.');
23
+ }
24
+ getName() {
25
+ return 'AtLeastSevenResultsRule';
26
+ }
27
+ getDescription() {
28
+ return 'Is indexable if there are at least 7 results.';
29
+ }
30
+ }
@@ -0,0 +1,6 @@
1
+ import { BaseProgrammeFilterKeyValueRule } from '../BaseProgrammeFilterKeyValueRule';
2
+ export declare class BlendedOrOnlineAttendanceRule extends BaseProgrammeFilterKeyValueRule {
3
+ constructor();
4
+ getName(): string;
5
+ getDescription(): string;
6
+ }
@@ -0,0 +1,18 @@
1
+ import { FilterKey } from '@studyportals/search-filters/server-side';
2
+ import { AttendanceFilterOptionValue } from '@studyportals/search-filters/server-side';
3
+ import { BaseProgrammeFilterKeyValueRule } from '../BaseProgrammeFilterKeyValueRule';
4
+ export class BlendedOrOnlineAttendanceRule extends BaseProgrammeFilterKeyValueRule {
5
+ constructor() {
6
+ const filterKeyValues = new Map([[
7
+ FilterKey.DELIVERY_METHOD,
8
+ [AttendanceFilterOptionValue.BLENDED, AttendanceFilterOptionValue.ONLINE]
9
+ ]]);
10
+ super(filterKeyValues);
11
+ }
12
+ getName() {
13
+ return 'BlendedOrOnlineAttendanceRule';
14
+ }
15
+ getDescription() {
16
+ return 'Is indexable if the selected delivery method is blended or online.';
17
+ }
18
+ }
@@ -0,0 +1,10 @@
1
+ import { ISearchDependencies } from '../../common/ISearchDependencies';
2
+ import { FilterKeyValuesMap } from '../../common/FilterKeyValuesMap';
3
+ import { BaseProgrammeRule } from '../BaseProgrammeRule';
4
+ export declare class DegreeAttendanceSpecificRule extends BaseProgrammeRule {
5
+ private readonly validCombinations;
6
+ getName(): string;
7
+ getDescription(): string;
8
+ forSearch(dependencies: ISearchDependencies): Promise<boolean>;
9
+ forSitemapGenerator(filterKeyValues: FilterKeyValuesMap): Promise<boolean>;
10
+ }
@@ -0,0 +1,42 @@
1
+ import { FilterKey } from '@studyportals/search-filters';
2
+ import { BaseProgrammeRule } from '../BaseProgrammeRule';
3
+ export class DegreeAttendanceSpecificRule extends BaseProgrammeRule {
4
+ validCombinations = {
5
+ 'master-of-science': ['online'], // MSc with online attendance
6
+ 'master-of-arts': ['online'], // MA with online attendance
7
+ 'master-of-business-administration': ['online'] // MBA with online attendance
8
+ };
9
+ getName() {
10
+ return 'DegreeAttendanceSpecificRule';
11
+ }
12
+ getDescription() {
13
+ return 'Indexes: master-of-science (online); master-of-arts (online); master-of-business-administration (online)';
14
+ }
15
+ forSearch(dependencies) {
16
+ const { seoInfoBase, filterState } = dependencies;
17
+ const degreeTypeValue = seoInfoBase.getFilterOptionValueBy(FilterKey.DEGREE_TYPE, filterState);
18
+ const attendanceValue = seoInfoBase.getFilterOptionValueBy(FilterKey.DELIVERY_METHOD, filterState);
19
+ if (!degreeTypeValue || !attendanceValue) {
20
+ return Promise.resolve(false);
21
+ }
22
+ const allowedAttendance = this.validCombinations[degreeTypeValue];
23
+ if (!allowedAttendance) {
24
+ return Promise.resolve(false);
25
+ }
26
+ return Promise.resolve(allowedAttendance.includes(attendanceValue));
27
+ }
28
+ forSitemapGenerator(filterKeyValues) {
29
+ const degreeTypeValues = filterKeyValues.get(FilterKey.DEGREE_TYPE);
30
+ const attendanceValues = filterKeyValues.get(FilterKey.DELIVERY_METHOD);
31
+ if (!degreeTypeValues?.length || !attendanceValues?.length) {
32
+ return Promise.resolve(false);
33
+ }
34
+ const degreeTypeValue = degreeTypeValues[0];
35
+ const attendanceValue = attendanceValues[0];
36
+ const allowedAttendance = this.validCombinations[degreeTypeValue];
37
+ if (!allowedAttendance) {
38
+ return Promise.resolve(false);
39
+ }
40
+ return Promise.resolve(allowedAttendance.includes(attendanceValue));
41
+ }
42
+ }
@@ -0,0 +1,10 @@
1
+ import { ISearchDependencies } from '../../common/ISearchDependencies';
2
+ import { FilterKeyValuesMap } from '../../common/FilterKeyValuesMap';
3
+ import { BaseProgrammeRule } from '../BaseProgrammeRule';
4
+ export declare class DegreeCountrySpecificRule extends BaseProgrammeRule {
5
+ private readonly validCombinations;
6
+ getName(): string;
7
+ getDescription(): string;
8
+ forSearch(dependencies: ISearchDependencies): Promise<boolean>;
9
+ forSitemapGenerator(filterKeyValues: FilterKeyValuesMap): Promise<boolean>;
10
+ }
@@ -0,0 +1,43 @@
1
+ import { FilterKey } from '@studyportals/search-filters';
2
+ import { DegreeTypeFilterOptionValue } from '@studyportals/search-filters';
3
+ import { BaseProgrammeRule } from '../BaseProgrammeRule';
4
+ export class DegreeCountrySpecificRule extends BaseProgrammeRule {
5
+ validCombinations = {
6
+ [DegreeTypeFilterOptionValue.MSC]: ['82', '56', '11', '30'],
7
+ [DegreeTypeFilterOptionValue.MBA]: ['82', '30'],
8
+ [DegreeTypeFilterOptionValue.MED]: ['202', '56']
9
+ };
10
+ getName() {
11
+ return 'DegreeCountrySpecificRule';
12
+ }
13
+ getDescription() {
14
+ return 'Indexes: master-of-science (USA, Canada, Germany, UK); master-of-business-administration (USA, UK); master-of-education (Australia, Canada)';
15
+ }
16
+ forSearch(dependencies) {
17
+ const { seoInfoBase, filterState } = dependencies;
18
+ const degreeTypeValue = seoInfoBase.getFilterOptionValueBy(FilterKey.DEGREE_TYPE, filterState);
19
+ const countryValue = seoInfoBase.getFilterOptionValueBy(FilterKey.COUNTRY, filterState);
20
+ if (!degreeTypeValue || !countryValue) {
21
+ return Promise.resolve(false);
22
+ }
23
+ const allowedCountries = this.validCombinations[degreeTypeValue];
24
+ if (!allowedCountries) {
25
+ return Promise.resolve(false);
26
+ }
27
+ return Promise.resolve(allowedCountries.includes(countryValue));
28
+ }
29
+ forSitemapGenerator(filterKeyValues) {
30
+ const degreeTypeValues = filterKeyValues.get(FilterKey.DEGREE_TYPE);
31
+ const countryValues = filterKeyValues.get(FilterKey.COUNTRY);
32
+ if (!degreeTypeValues?.length || !countryValues?.length) {
33
+ return Promise.resolve(false);
34
+ }
35
+ const degreeTypeValue = degreeTypeValues[0];
36
+ const countryValue = countryValues[0];
37
+ const allowedCountries = this.validCombinations[degreeTypeValue];
38
+ if (!allowedCountries) {
39
+ return Promise.resolve(false);
40
+ }
41
+ return Promise.resolve(allowedCountries.includes(countryValue));
42
+ }
43
+ }
@@ -0,0 +1,11 @@
1
+ import { ISearchDependencies } from '../../common/ISearchDependencies';
2
+ import { FilterKeyValuesMap } from '../../common/FilterKeyValuesMap';
3
+ import { BaseProgrammeRule } from '../BaseProgrammeRule';
4
+ export declare class DegreeCountryTuitionFeeRule extends BaseProgrammeRule {
5
+ private readonly degreeValue;
6
+ private readonly tuitionFeeValue;
7
+ getName(): string;
8
+ getDescription(): string;
9
+ forSearch(dependencies: ISearchDependencies): Promise<boolean>;
10
+ forSitemapGenerator(filterKeyValues: FilterKeyValuesMap): Promise<boolean>;
11
+ }
@@ -0,0 +1,40 @@
1
+ import { FilterKey } from '@studyportals/search-filters';
2
+ import { TuitionFeeFilterOptionValue } from '@studyportals/search-filters';
3
+ import { BaseProgrammeRule } from '../BaseProgrammeRule';
4
+ export class DegreeCountryTuitionFeeRule extends BaseProgrammeRule {
5
+ degreeValue = 'master-of-business-administration';
6
+ tuitionFeeValue = TuitionFeeFilterOptionValue.ZERO_TO_TWO_THOUSAND_FIVE_HUNDRED;
7
+ getName() {
8
+ return 'DegreeCountryTuitionFeeRule';
9
+ }
10
+ getDescription() {
11
+ return 'Indexes: master-of-business-administration + all countries + affordable tuition (0-2500)';
12
+ }
13
+ forSearch(dependencies) {
14
+ const { seoInfoBase, filterState } = dependencies;
15
+ const degreeTypeValue = seoInfoBase.getFilterOptionValueBy(FilterKey.DEGREE_TYPE, filterState);
16
+ const countryValue = seoInfoBase.getFilterOptionValueBy(FilterKey.COUNTRY, filterState);
17
+ const tuitionFeeValue = seoInfoBase.getFilterOptionValueBy(FilterKey.TUITION_FEE, filterState);
18
+ if (degreeTypeValue !== this.degreeValue) {
19
+ return Promise.resolve(true);
20
+ }
21
+ if (!countryValue || !tuitionFeeValue) {
22
+ return Promise.resolve(false);
23
+ }
24
+ return Promise.resolve(tuitionFeeValue === this.tuitionFeeValue);
25
+ }
26
+ forSitemapGenerator(filterKeyValues) {
27
+ const degreeTypeValues = filterKeyValues.get(FilterKey.DEGREE_TYPE);
28
+ const countryValues = filterKeyValues.get(FilterKey.COUNTRY);
29
+ const tuitionFeeValues = filterKeyValues.get(FilterKey.TUITION_FEE);
30
+ if (!degreeTypeValues?.length || !countryValues?.length || !tuitionFeeValues?.length) {
31
+ return Promise.resolve(false);
32
+ }
33
+ const degreeTypeValue = degreeTypeValues[0];
34
+ const tuitionFeeValue = tuitionFeeValues[0];
35
+ if (degreeTypeValue !== this.degreeValue) {
36
+ return Promise.resolve(true);
37
+ }
38
+ return Promise.resolve(tuitionFeeValue === this.tuitionFeeValue);
39
+ }
40
+ }
@@ -0,0 +1,6 @@
1
+ import { BaseProgrammeFilterKeyValueRule } from '../BaseProgrammeFilterKeyValueRule';
2
+ export declare class ErasmusOrExecutiveSpecialProgrammeRule extends BaseProgrammeFilterKeyValueRule {
3
+ constructor();
4
+ getName(): string;
5
+ getDescription(): string;
6
+ }
@@ -0,0 +1,19 @@
1
+ import { FilterKey } from '@studyportals/search-filters/server-side';
2
+ import { SpecialProgrammesFilterOptionValue } from '@studyportals/search-filters/server-side';
3
+ import { BaseProgrammeFilterKeyValueRule } from '../BaseProgrammeFilterKeyValueRule';
4
+ export class ErasmusOrExecutiveSpecialProgrammeRule extends BaseProgrammeFilterKeyValueRule {
5
+ constructor() {
6
+ const filterKeyValues = new Map([[
7
+ FilterKey.SPECIAL_PROGRAMMES,
8
+ [SpecialProgrammesFilterOptionValue.ERASMUS_MUNDUS, SpecialProgrammesFilterOptionValue.EXECUTIVE_PROGRAMMES]
9
+ ]
10
+ ]);
11
+ super(filterKeyValues);
12
+ }
13
+ getName() {
14
+ return 'ErasmusOrExecutiveSpecialProgrammeRule';
15
+ }
16
+ getDescription() {
17
+ return 'Is indexable if the selected special programme is Erasmus Mundus or Executive Programmes.';
18
+ }
19
+ }
@@ -1,5 +1,5 @@
1
- import { FilterKey } from '@studyportals/search-filters/server-side';
2
- import { SpecialProgrammesFilterOptionValue } from '@studyportals/search-filters/server-side';
1
+ import { FilterKey } from '@studyportals/search-filters';
2
+ import { SpecialProgrammesFilterOptionValue } from '@studyportals/search-filters';
3
3
  import { BaseProgrammeRule } from '../BaseProgrammeRule';
4
4
  export class ErasmusOrJointSpecialProgrammesRule extends BaseProgrammeRule {
5
5
  forSearch(dependencies) {
@@ -0,0 +1,6 @@
1
+ import { BaseProgrammeFilterKeyValueRule } from '../BaseProgrammeFilterKeyValueRule';
2
+ export declare class ErasmusSpecialProgrammeRule extends BaseProgrammeFilterKeyValueRule {
3
+ constructor();
4
+ getName(): string;
5
+ getDescription(): string;
6
+ }
@@ -0,0 +1,19 @@
1
+ import { FilterKey } from '@studyportals/search-filters/server-side';
2
+ import { SpecialProgrammesFilterOptionValue } from '@studyportals/search-filters/server-side';
3
+ import { BaseProgrammeFilterKeyValueRule } from '../BaseProgrammeFilterKeyValueRule';
4
+ export class ErasmusSpecialProgrammeRule extends BaseProgrammeFilterKeyValueRule {
5
+ constructor() {
6
+ const filterKeyValues = new Map([[
7
+ FilterKey.SPECIAL_PROGRAMMES,
8
+ [SpecialProgrammesFilterOptionValue.ERASMUS_MUNDUS]
9
+ ]
10
+ ]);
11
+ super(filterKeyValues);
12
+ }
13
+ getName() {
14
+ return 'ErasmusSpecialProgrammeRule';
15
+ }
16
+ getDescription() {
17
+ return 'Is indexable if the selected special programme is Erasmus Mundus.';
18
+ }
19
+ }
@@ -0,0 +1,6 @@
1
+ import { BaseProgrammeFilterKeyValueRule } from '../BaseProgrammeFilterKeyValueRule';
2
+ export declare class ExecutiveSpecialProgrammeRule extends BaseProgrammeFilterKeyValueRule {
3
+ constructor();
4
+ getName(): string;
5
+ getDescription(): string;
6
+ }
@@ -0,0 +1,19 @@
1
+ import { FilterKey } from '@studyportals/search-filters/server-side';
2
+ import { SpecialProgrammesFilterOptionValue } from '@studyportals/search-filters/server-side';
3
+ import { BaseProgrammeFilterKeyValueRule } from '../BaseProgrammeFilterKeyValueRule';
4
+ export class ExecutiveSpecialProgrammeRule extends BaseProgrammeFilterKeyValueRule {
5
+ constructor() {
6
+ const filterKeyValues = new Map([[
7
+ FilterKey.SPECIAL_PROGRAMMES,
8
+ [SpecialProgrammesFilterOptionValue.EXECUTIVE_PROGRAMMES]
9
+ ]
10
+ ]);
11
+ super(filterKeyValues);
12
+ }
13
+ getName() {
14
+ return 'ExecutiveSpecialProgrammeRule';
15
+ }
16
+ getDescription() {
17
+ return 'Is indexable if the selected special programme is Executive.';
18
+ }
19
+ }
@@ -0,0 +1,11 @@
1
+ import { ISearchDependencies } from '../../common/ISearchDependencies';
2
+ import { FilterKeyValuesMap } from '../../common/FilterKeyValuesMap';
3
+ import { BaseProgrammeRule } from '../BaseProgrammeRule';
4
+ export declare class MbaCountryAttendanceRule extends BaseProgrammeRule {
5
+ private readonly degreeValue;
6
+ private readonly attendanceValue;
7
+ getName(): string;
8
+ getDescription(): string;
9
+ forSearch(dependencies: ISearchDependencies): Promise<boolean>;
10
+ forSitemapGenerator(filterKeyValues: FilterKeyValuesMap): Promise<boolean>;
11
+ }
@@ -0,0 +1,40 @@
1
+ import { FilterKey } from '@studyportals/search-filters';
2
+ import { DegreeTypeFilterOptionValue } from '@studyportals/search-filters';
3
+ import { BaseProgrammeRule } from '../BaseProgrammeRule';
4
+ export class MbaCountryAttendanceRule extends BaseProgrammeRule {
5
+ degreeValue = DegreeTypeFilterOptionValue.MBA;
6
+ attendanceValue = 'online';
7
+ getName() {
8
+ return 'MbaCountryAttendanceRule';
9
+ }
10
+ getDescription() {
11
+ return 'Indexes: master-of-business-administration + all countries + online attendance';
12
+ }
13
+ forSearch(dependencies) {
14
+ const { seoInfoBase, filterState } = dependencies;
15
+ const degreeTypeValue = seoInfoBase.getFilterOptionValueBy(FilterKey.DEGREE_TYPE, filterState);
16
+ const countryValue = seoInfoBase.getFilterOptionValueBy(FilterKey.COUNTRY, filterState);
17
+ const attendanceValue = seoInfoBase.getFilterOptionValueBy(FilterKey.DELIVERY_METHOD, filterState);
18
+ if (degreeTypeValue !== this.degreeValue) {
19
+ return Promise.resolve(true);
20
+ }
21
+ if (!countryValue || !attendanceValue) {
22
+ return Promise.resolve(false);
23
+ }
24
+ return Promise.resolve(attendanceValue === this.attendanceValue);
25
+ }
26
+ forSitemapGenerator(filterKeyValues) {
27
+ const degreeTypeValues = filterKeyValues.get(FilterKey.DEGREE_TYPE);
28
+ const countryValues = filterKeyValues.get(FilterKey.COUNTRY);
29
+ const attendanceValues = filterKeyValues.get(FilterKey.DELIVERY_METHOD);
30
+ if (!degreeTypeValues?.length || !countryValues?.length || !attendanceValues?.length) {
31
+ return Promise.resolve(false);
32
+ }
33
+ const degreeTypeValue = degreeTypeValues[0];
34
+ const attendanceValue = attendanceValues[0];
35
+ if (degreeTypeValue !== this.degreeValue) {
36
+ return Promise.resolve(true);
37
+ }
38
+ return Promise.resolve(attendanceValue === this.attendanceValue);
39
+ }
40
+ }
@@ -0,0 +1,10 @@
1
+ import { ISearchDependencies } from '../../common/ISearchDependencies';
2
+ import { FilterKeyValuesMap } from '../../common/FilterKeyValuesMap';
3
+ import { BaseProgrammeRule } from '../BaseProgrammeRule';
4
+ export declare class MasterOfArtsDisciplineRule extends BaseProgrammeRule {
5
+ private readonly degreeValue;
6
+ getName(): string;
7
+ getDescription(): string;
8
+ forSearch(dependencies: ISearchDependencies): Promise<boolean>;
9
+ forSitemapGenerator(filterKeyValues: FilterKeyValuesMap): Promise<boolean>;
10
+ }