@studyportals/fawkes 8.1.1-4 → 8.1.2-0

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 (141) hide show
  1. package/dist/src/common/IPolicyMetaData.d.ts +6 -0
  2. package/dist/src/common/IPolicyMetaData.js +1 -0
  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/OnlineAttendanceRule.d.ts +6 -0
  8. package/dist/src/organisations/rules/OnlineAttendanceRule.js +14 -0
  9. package/dist/src/presenters/AttendancePresenter.js +4 -0
  10. package/dist/src/presenters/FormatPresenter.js +4 -1
  11. package/dist/src/presenters/SpecialProgrammesPresenter.js +4 -0
  12. package/dist/src/programmes/IProgrammeSearchApplicationState.d.ts +4 -0
  13. package/dist/src/programmes/IProgrammeSearchApplicationState.js +1 -0
  14. package/dist/src/programmes/IProgrammeSearchDependencies.d.ts +7 -0
  15. package/dist/src/programmes/IProgrammeSearchDependencies.js +1 -0
  16. package/dist/src/programmes/IProgrammesSeoDependencies.d.ts +2 -0
  17. package/dist/src/programmes/IProgrammesSeoDependencies.js +1 -0
  18. package/dist/src/programmes/SearchIndexabilityManager.js +31 -3
  19. package/dist/src/programmes/policies/AttendanceArea.d.ts +16 -0
  20. package/dist/src/programmes/policies/AttendanceArea.js +48 -0
  21. package/dist/src/programmes/policies/AttendanceContinent.d.ts +16 -0
  22. package/dist/src/programmes/policies/AttendanceContinent.js +46 -0
  23. package/dist/src/programmes/policies/AttendanceDegree.d.ts +3 -3
  24. package/dist/src/programmes/policies/AttendanceDegree.js +4 -4
  25. package/dist/src/programmes/policies/AttendanceDuration.d.ts +17 -0
  26. package/dist/src/programmes/policies/AttendanceDuration.js +50 -0
  27. package/dist/src/programmes/policies/AttendanceFormat.d.ts +16 -0
  28. package/dist/src/programmes/policies/AttendanceFormat.js +48 -0
  29. package/dist/src/programmes/policies/AttendanceTuitionFee.d.ts +17 -0
  30. package/dist/src/programmes/policies/AttendanceTuitionFee.js +51 -0
  31. package/dist/src/programmes/policies/ContinentDuration.d.ts +16 -0
  32. package/dist/src/programmes/policies/ContinentDuration.js +48 -0
  33. package/dist/src/programmes/policies/ContinentFormat.d.ts +16 -0
  34. package/dist/src/programmes/policies/ContinentFormat.js +48 -0
  35. package/dist/src/programmes/policies/ContinentSpecialProgrammes.d.ts +16 -0
  36. package/dist/src/programmes/policies/ContinentSpecialProgrammes.js +48 -0
  37. package/dist/src/programmes/policies/CountryAttendanceDegree.js +1 -1
  38. package/dist/src/programmes/policies/CountryDuration.d.ts +2 -2
  39. package/dist/src/programmes/policies/CountryDuration.js +6 -4
  40. package/dist/src/programmes/policies/CountryDurationDegree.js +1 -1
  41. package/dist/src/programmes/policies/CountryEducationalForm.js +1 -1
  42. package/dist/src/programmes/policies/CountrySpecialProgrammes.d.ts +16 -0
  43. package/dist/src/programmes/policies/CountrySpecialProgrammes.js +48 -0
  44. package/dist/src/programmes/policies/DegreeArea.d.ts +15 -0
  45. package/dist/src/programmes/policies/DegreeArea.js +46 -0
  46. package/dist/src/programmes/policies/DegreeAreaTuitionFee.d.ts +16 -0
  47. package/dist/src/programmes/policies/DegreeAreaTuitionFee.js +54 -0
  48. package/dist/src/programmes/policies/DegreeAttendanceDiscipline.d.ts +2 -1
  49. package/dist/src/programmes/policies/DegreeAttendanceDiscipline.js +12 -12
  50. package/dist/src/programmes/policies/DegreeAttendanceFormat.d.ts +17 -0
  51. package/dist/src/programmes/policies/DegreeAttendanceFormat.js +56 -0
  52. package/dist/src/programmes/policies/DegreeAttendanceSpecialProgrammes.d.ts +17 -0
  53. package/dist/src/programmes/policies/DegreeAttendanceSpecialProgrammes.js +58 -0
  54. package/dist/src/programmes/policies/DegreeAttendanceTuitionFee.d.ts +18 -0
  55. package/dist/src/programmes/policies/DegreeAttendanceTuitionFee.js +59 -0
  56. package/dist/src/programmes/policies/DegreeContinent.d.ts +16 -0
  57. package/dist/src/programmes/policies/DegreeContinent.js +46 -0
  58. package/dist/src/programmes/policies/DegreeContinentTuitionFee.d.ts +16 -0
  59. package/dist/src/programmes/policies/DegreeContinentTuitionFee.js +52 -0
  60. package/dist/src/programmes/policies/DegreeCountryAttendance.js +3 -3
  61. package/dist/src/programmes/policies/DegreeCountryTuitionFee.js +2 -2
  62. package/dist/src/programmes/policies/DegreeDuration.d.ts +17 -0
  63. package/dist/src/programmes/policies/DegreeDuration.js +50 -0
  64. package/dist/src/programmes/policies/DegreeFormat.d.ts +16 -0
  65. package/dist/src/programmes/policies/DegreeFormat.js +48 -0
  66. package/dist/src/programmes/policies/DegreeFormatTuitionFee.d.ts +18 -0
  67. package/dist/src/programmes/policies/DegreeFormatTuitionFee.js +56 -0
  68. package/dist/src/programmes/policies/DegreeSpecialProgrammes.d.ts +17 -0
  69. package/dist/src/programmes/policies/DegreeSpecialProgrammes.js +52 -0
  70. package/dist/src/programmes/policies/DegreeTuitionFee.d.ts +16 -0
  71. package/dist/src/programmes/policies/DegreeTuitionFee.js +49 -0
  72. package/dist/src/programmes/policies/DisciplineArea.d.ts +1 -1
  73. package/dist/src/programmes/policies/DisciplineArea.js +1 -1
  74. package/dist/src/programmes/policies/DisciplineContinentAttendance.d.ts +16 -0
  75. package/dist/src/programmes/policies/DisciplineContinentAttendance.js +54 -0
  76. package/dist/src/programmes/policies/DisciplineCountryAttendance.d.ts +16 -0
  77. package/dist/src/programmes/policies/DisciplineCountryAttendance.js +54 -0
  78. package/dist/src/programmes/policies/DisciplineCountryDegree.d.ts +16 -0
  79. package/dist/src/programmes/policies/DisciplineCountryDegree.js +53 -0
  80. package/dist/src/programmes/policies/DisciplineCountryEducationalForm.js +1 -1
  81. package/dist/src/programmes/policies/DisciplineCountryFormat.d.ts +16 -0
  82. package/dist/src/programmes/policies/DisciplineCountryFormat.js +54 -0
  83. package/dist/src/programmes/policies/DisciplineDuration.d.ts +2 -2
  84. package/dist/src/programmes/policies/DisciplineDuration.js +2 -2
  85. package/dist/src/programmes/policies/DisciplineEducationalForm.js +1 -1
  86. package/dist/src/programmes/policies/DisciplineSpecialProgrammes.d.ts +16 -0
  87. package/dist/src/programmes/policies/DisciplineSpecialProgrammes.js +48 -0
  88. package/dist/src/programmes/policies/DisciplineTuitionFee.js +1 -1
  89. package/dist/src/programmes/policies/Duration.d.ts +16 -0
  90. package/dist/src/programmes/policies/Duration.js +40 -0
  91. package/dist/src/programmes/policies/Format.d.ts +15 -0
  92. package/dist/src/programmes/policies/Format.js +38 -0
  93. package/dist/src/programmes/policies/SpecialProgrammes.d.ts +1 -2
  94. package/dist/src/programmes/policies/SpecialProgrammes.js +0 -2
  95. package/dist/src/programmes/policies/index.d.ts +27 -1
  96. package/dist/src/programmes/policies/index.js +27 -1
  97. package/dist/src/programmes/rules/AtLeastSevenResultsRule.js +1 -1
  98. package/dist/src/programmes/rules/BlendedOrOnlineAttendanceRule.d.ts +6 -0
  99. package/dist/src/programmes/rules/BlendedOrOnlineAttendanceRule.js +18 -0
  100. package/dist/src/programmes/rules/DegreeAttendanceSpecificRule.d.ts +10 -0
  101. package/dist/src/programmes/rules/DegreeAttendanceSpecificRule.js +42 -0
  102. package/dist/src/programmes/rules/DegreeCountrySpecificRule.d.ts +10 -0
  103. package/dist/src/programmes/rules/DegreeCountrySpecificRule.js +43 -0
  104. package/dist/src/programmes/rules/DegreeCountryTuitionFeeRule.d.ts +11 -0
  105. package/dist/src/programmes/rules/DegreeCountryTuitionFeeRule.js +40 -0
  106. package/dist/src/programmes/rules/ErasmusOrExecutiveSpecialProgrammeRule.d.ts +6 -0
  107. package/dist/src/programmes/rules/ErasmusOrExecutiveSpecialProgrammeRule.js +19 -0
  108. package/dist/src/programmes/rules/ErasmusOrJointSpecialProgrammesRule.js +2 -2
  109. package/dist/src/programmes/rules/ErasmusSpecialProgrammeRule.d.ts +6 -0
  110. package/dist/src/programmes/rules/ErasmusSpecialProgrammeRule.js +19 -0
  111. package/dist/src/programmes/rules/ExecutiveSpecialProgrammeRule.d.ts +6 -0
  112. package/dist/src/programmes/rules/ExecutiveSpecialProgrammeRule.js +19 -0
  113. package/dist/src/programmes/rules/MBACountryAttendanceRule.d.ts +11 -0
  114. package/dist/src/programmes/rules/MBACountryAttendanceRule.js +40 -0
  115. package/dist/src/programmes/rules/MasterOfArtsDisciplineRule.d.ts +10 -0
  116. package/dist/src/programmes/rules/MasterOfArtsDisciplineRule.js +41 -0
  117. package/dist/src/programmes/rules/MasterOfEducationCountryDisciplineRule.d.ts +11 -0
  118. package/dist/src/programmes/rules/MasterOfEducationCountryDisciplineRule.js +69 -0
  119. package/dist/src/programmes/rules/MasterOfLawsCountryAttendanceRule.d.ts +12 -0
  120. package/dist/src/programmes/rules/MasterOfLawsCountryAttendanceRule.js +43 -0
  121. package/dist/src/programmes/rules/MasterOfLawsCountryTuitionFeeRule.d.ts +12 -0
  122. package/dist/src/programmes/rules/MasterOfLawsCountryTuitionFeeRule.js +46 -0
  123. package/dist/src/programmes/rules/MasterOfPhilosophyCountryAttendanceRule.d.ts +12 -0
  124. package/dist/src/programmes/rules/MasterOfPhilosophyCountryAttendanceRule.js +43 -0
  125. package/dist/src/programmes/rules/MasterOfScienceDisciplineRule.d.ts +10 -0
  126. package/dist/src/programmes/rules/MasterOfScienceDisciplineRule.js +41 -0
  127. package/dist/src/programmes/rules/OneOrTwoYearDurationRule.d.ts +6 -0
  128. package/dist/src/programmes/rules/OneOrTwoYearDurationRule.js +19 -0
  129. package/dist/src/programmes/rules/OneYearOnlyRule.d.ts +11 -0
  130. package/dist/src/programmes/rules/OneYearOnlyRule.js +34 -0
  131. package/dist/src/programmes/rules/OnlineAttendanceRule.d.ts +6 -0
  132. package/dist/src/programmes/rules/OnlineAttendanceRule.js +15 -0
  133. package/dist/src/programmes/rules/TwoYearDurationRule.d.ts +6 -0
  134. package/dist/src/programmes/rules/TwoYearDurationRule.js +19 -0
  135. package/dist/src/sitemap-generator/BaseSitemapUrlGeneratorManager.js +0 -1
  136. package/dist/src/sitemap-generator/IPageNumberProvider.d.ts +3 -0
  137. package/dist/src/sitemap-generator/IPageNumberProvider.js +1 -0
  138. package/dist/src/sitemap-generator/ProgrammesSitemapUrlGeneratorManager.js +117 -32
  139. package/package.json +105 -105
  140. package/dist/src/organisations/rules/AtLeastSevenResultsRule.d.ts +0 -15
  141. package/dist/src/organisations/rules/AtLeastSevenResultsRule.js +0 -30
@@ -0,0 +1,17 @@
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
+ import { OnlineAttendanceRule } from '../../common/rules/OnlineAttendanceRule';
8
+ import { PartTimeFormatRule } from '../rules/PartTimeFormatRule';
9
+ export declare class DegreeAttendanceFormat extends ProgrammesBaseIndexabilityPolicy {
10
+ readonly name: string;
11
+ readonly description: string;
12
+ readonly filterKeys: FilterKey[];
13
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | OnlineAttendanceRule | PartTimeFormatRule)[];
14
+ constructor(dependencies: IProgrammeSeoDependencies);
15
+ protected generateUrls(): Promise<string[]>;
16
+ get filterCombination(): FilterCombinations;
17
+ }
@@ -0,0 +1,56 @@
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 { DegreePresenter } from '../../presenters/DegreePresenter';
7
+ import { AttendancePresenter } from '../../presenters/AttendancePresenter';
8
+ import { FormatPresenter } from '../../presenters/FormatPresenter';
9
+ import { OnlineAttendanceRule } from '../../common/rules/OnlineAttendanceRule';
10
+ import { PartTimeFormatRule } from '../rules/PartTimeFormatRule';
11
+ export class DegreeAttendanceFormat extends ProgrammesBaseIndexabilityPolicy {
12
+ name = 'Degree Attendance Format Policy';
13
+ description = 'Determines indexing rules for pages filtered by degree type, attendance, and format.';
14
+ filterKeys = [FilterKey.DEGREE_TYPE, FilterKey.DELIVERY_METHOD, FilterKey.ATTENDANCE];
15
+ rules = [
16
+ new SingleValueSelectedForFilterRule(FilterKey.DEGREE_TYPE),
17
+ new SingleValueSelectedForFilterRule(FilterKey.DELIVERY_METHOD),
18
+ new SingleValueSelectedForFilterRule(FilterKey.ATTENDANCE),
19
+ new OnlyFiltersSelectedRule([FilterKey.DEGREE_TYPE, FilterKey.DELIVERY_METHOD, FilterKey.ATTENDANCE]),
20
+ new OnlineAttendanceRule(),
21
+ new PartTimeFormatRule()
22
+ ];
23
+ constructor(dependencies) {
24
+ super(dependencies);
25
+ this.initateBaseRules();
26
+ }
27
+ async generateUrls() {
28
+ const degreeFragments = DegreePresenter.getInstance().getFragments();
29
+ const attendanceFragments = AttendancePresenter.getInstance().getFragments();
30
+ const formatFragments = FormatPresenter.getInstance().getFragments();
31
+ const paths = [];
32
+ const allowedFormatIds = ['parttime'];
33
+ const allowedFormats = formatFragments.filter(f => allowedFormatIds.includes(f.id));
34
+ for (const pageNumber of this.indexablePageNumbers) {
35
+ for (const degree of degreeFragments) {
36
+ for (const format of allowedFormats) {
37
+ for (const attendance of attendanceFragments) {
38
+ const filterKeyValues = new Map([
39
+ [FilterKey.DEGREE_TYPE, [degree.id]],
40
+ [FilterKey.DELIVERY_METHOD, [attendance.id]],
41
+ [FilterKey.ATTENDANCE, [format.id]]
42
+ ]);
43
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
44
+ if (result) {
45
+ paths.push(this.getPathWithPageNumber(`${degree.path}/${format.path}/${attendance.path}`, pageNumber));
46
+ }
47
+ }
48
+ }
49
+ }
50
+ }
51
+ return paths;
52
+ }
53
+ get filterCombination() {
54
+ return FilterCombinations.DEGREE_ATTENDANCE_FORMAT;
55
+ }
56
+ }
@@ -0,0 +1,17 @@
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
+ import { OnlineAttendanceRule } from '../../common/rules/OnlineAttendanceRule';
8
+ import { ExecutiveSpecialProgrammeRule } from '../rules/ExecutiveSpecialProgrammeRule';
9
+ export declare class DegreeAttendanceSpecialProgrammes extends ProgrammesBaseIndexabilityPolicy {
10
+ readonly name: string;
11
+ readonly description: string;
12
+ readonly filterKeys: FilterKey[];
13
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | OnlineAttendanceRule | ExecutiveSpecialProgrammeRule)[];
14
+ constructor(dependencies: IProgrammeSeoDependencies);
15
+ protected generateUrls(): Promise<string[]>;
16
+ get filterCombination(): FilterCombinations;
17
+ }
@@ -0,0 +1,58 @@
1
+ import { DegreeTypeFilterOptionValue, FilterKey, SpecialProgrammesFilterOptionValue } 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 { DegreePresenter } from '../../presenters/DegreePresenter';
7
+ import { SpecialProgrammesPresenter } from '../../presenters/SpecialProgrammesPresenter';
8
+ import { OnlineAttendanceRule } from '../../common/rules/OnlineAttendanceRule';
9
+ import { AttendancePresenter } from '../../presenters/AttendancePresenter';
10
+ import { ExecutiveSpecialProgrammeRule } from '../rules/ExecutiveSpecialProgrammeRule';
11
+ export class DegreeAttendanceSpecialProgrammes extends ProgrammesBaseIndexabilityPolicy {
12
+ name = 'Degree Attendance Special Programmes Policy';
13
+ description = 'Determines indexing rules for pages filtered by special programmes, attendance(online) and degree type.';
14
+ filterKeys = [FilterKey.SPECIAL_PROGRAMMES, FilterKey.DEGREE_TYPE, FilterKey.DELIVERY_METHOD];
15
+ rules = [
16
+ new SingleValueSelectedForFilterRule(FilterKey.DEGREE_TYPE),
17
+ new SingleValueSelectedForFilterRule(FilterKey.SPECIAL_PROGRAMMES),
18
+ new SingleValueSelectedForFilterRule(FilterKey.DELIVERY_METHOD),
19
+ new OnlyFiltersSelectedRule([FilterKey.DEGREE_TYPE, FilterKey.SPECIAL_PROGRAMMES, FilterKey.DELIVERY_METHOD]),
20
+ new OnlineAttendanceRule(),
21
+ new ExecutiveSpecialProgrammeRule()
22
+ ];
23
+ constructor(dependencies) {
24
+ super(dependencies);
25
+ this.initateBaseRules();
26
+ }
27
+ async generateUrls() {
28
+ const degreeFragments = DegreePresenter.getInstance().getFragments();
29
+ const specialProgrammesFragments = SpecialProgrammesPresenter.getInstance().getFragments();
30
+ const attendanceFragments = AttendancePresenter.getInstance().getFragments();
31
+ const paths = [];
32
+ const allowedDegreeIds = [DegreeTypeFilterOptionValue.MBA];
33
+ const allowedDegrees = degreeFragments.filter(sp => allowedDegreeIds.includes(sp.id));
34
+ const allowedSpecialProgramIds = [SpecialProgrammesFilterOptionValue.EXECUTIVE_PROGRAMMES];
35
+ const allowedSpecialProgrammes = specialProgrammesFragments.filter(sp => allowedSpecialProgramIds.includes(sp.id));
36
+ for (const pageNumber of this.indexablePageNumbers) {
37
+ for (const degree of allowedDegrees) {
38
+ for (const specialProgramme of allowedSpecialProgrammes) {
39
+ for (const attendance of attendanceFragments) {
40
+ const filterKeyValues = new Map([
41
+ [FilterKey.DEGREE_TYPE, [degree.id]],
42
+ [FilterKey.SPECIAL_PROGRAMMES, [specialProgramme.id]],
43
+ [FilterKey.DELIVERY_METHOD, [attendance.id]]
44
+ ]);
45
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
46
+ if (result) {
47
+ paths.push(this.getPathWithPageNumber(`${degree.path}/${specialProgramme.path}/${attendance.path}`, pageNumber));
48
+ }
49
+ }
50
+ }
51
+ }
52
+ }
53
+ return paths;
54
+ }
55
+ get filterCombination() {
56
+ return FilterCombinations.DEGREE_ATTENDANCE_SPECIAL_PROGRAMMES;
57
+ }
58
+ }
@@ -0,0 +1,18 @@
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
+ import { OnlineAttendanceRule } from '../../common/rules/OnlineAttendanceRule';
8
+ import { IndexableDegreeRule } from '../rules/IndexableDegreeRule';
9
+ import { AffordableTuitionFeeRule } from '../rules/AffordableTuitionFeeRule';
10
+ export declare class DegreeAttendanceTuitionFee extends ProgrammesBaseIndexabilityPolicy {
11
+ readonly name: string;
12
+ readonly description: string;
13
+ readonly filterKeys: FilterKey[];
14
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | OnlineAttendanceRule | IndexableDegreeRule | AffordableTuitionFeeRule)[];
15
+ constructor(dependencies: IProgrammeSeoDependencies);
16
+ protected generateUrls(): Promise<string[]>;
17
+ get filterCombination(): FilterCombinations;
18
+ }
@@ -0,0 +1,59 @@
1
+ import { FilterKey } from '@studyportals/search-filters/server-side';
2
+ import { TuitionFeeFilterOptionValue } from '@studyportals/search-filters/server-side';
3
+ import { OnlyFiltersSelectedRule } from '../../common/rules/OnlyFiltersSelectedRule';
4
+ import { SingleValueSelectedForFilterRule } from '../../common/rules/SingleValueSelectedForFilterRule';
5
+ import { FilterCombinations } from '../../enums/FilterCombinations';
6
+ import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
+ import { DegreePresenter } from '../../presenters/DegreePresenter';
8
+ import { TuitionFeePresenter } from '../../presenters/TuitionFeePresenter';
9
+ import { AttendancePresenter } from '../../presenters/AttendancePresenter';
10
+ import { OnlineAttendanceRule } from '../../common/rules/OnlineAttendanceRule';
11
+ import { IndexableDegreeRule } from '../rules/IndexableDegreeRule';
12
+ import { AffordableTuitionFeeRule } from '../rules/AffordableTuitionFeeRule';
13
+ export class DegreeAttendanceTuitionFee extends ProgrammesBaseIndexabilityPolicy {
14
+ name = 'Tuition Fee Attendance Degree Policy';
15
+ description = 'Determines indexing rules for pages filtered by tuition fee, attendance, and degree type.';
16
+ filterKeys = [FilterKey.TUITION_FEE, FilterKey.DELIVERY_METHOD, FilterKey.DEGREE_TYPE];
17
+ rules = [
18
+ new SingleValueSelectedForFilterRule(FilterKey.DEGREE_TYPE),
19
+ new SingleValueSelectedForFilterRule(FilterKey.DELIVERY_METHOD),
20
+ new SingleValueSelectedForFilterRule(FilterKey.TUITION_FEE),
21
+ new OnlyFiltersSelectedRule([FilterKey.DEGREE_TYPE, FilterKey.DELIVERY_METHOD, FilterKey.TUITION_FEE]),
22
+ new IndexableDegreeRule(),
23
+ new OnlineAttendanceRule(),
24
+ new AffordableTuitionFeeRule()
25
+ ];
26
+ constructor(dependencies) {
27
+ super(dependencies);
28
+ this.initateBaseRules();
29
+ }
30
+ async generateUrls() {
31
+ const degreeFragments = DegreePresenter.getInstance().getFragments();
32
+ const attendanceFragments = AttendancePresenter.getInstance().getFragments();
33
+ const tuitionFeeFragments = TuitionFeePresenter.getInstance().getFragments();
34
+ const paths = [];
35
+ const affordableTuition = tuitionFeeFragments.find(t => t.id === TuitionFeeFilterOptionValue.ZERO_TO_TWO_THOUSAND_FIVE_HUNDRED);
36
+ if (!affordableTuition) {
37
+ return paths;
38
+ }
39
+ for (const pageNumber of this.indexablePageNumbers) {
40
+ for (const degree of degreeFragments) {
41
+ for (const attendance of attendanceFragments) {
42
+ const filterKeyValues = new Map([
43
+ [FilterKey.DELIVERY_METHOD, [attendance.id]],
44
+ [FilterKey.DEGREE_TYPE, [degree.id]],
45
+ [FilterKey.TUITION_FEE, [affordableTuition.id]]
46
+ ]);
47
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
48
+ if (result) {
49
+ paths.push(this.getPathWithPageNumber(`${degree.path}/${affordableTuition.path}/${attendance.path}`, pageNumber));
50
+ }
51
+ }
52
+ }
53
+ }
54
+ return paths;
55
+ }
56
+ get filterCombination() {
57
+ return FilterCombinations.DEGREE_ATTENDANCE_TUITION_FEE;
58
+ }
59
+ }
@@ -0,0 +1,16 @@
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 { IndexableDegreeRule } from '../rules/IndexableDegreeRule';
6
+ import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
+ import { IProgrammeSeoDependencies } from '../types/IProgrammeSeoDependencies';
8
+ export declare class DegreeContinent extends ProgrammesBaseIndexabilityPolicy {
9
+ readonly name: string;
10
+ readonly description: string;
11
+ readonly filterKeys: FilterKey[];
12
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | IndexableDegreeRule)[];
13
+ constructor(dependencies: IProgrammeSeoDependencies);
14
+ protected generateUrls(): Promise<string[]>;
15
+ get filterCombination(): FilterCombinations;
16
+ }
@@ -0,0 +1,46 @@
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 { IndexableDegreeRule } from '../rules/IndexableDegreeRule';
6
+ import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
+ import { DegreePresenter } from '../../presenters/DegreePresenter';
8
+ import { ContinentPresenter } from '../../presenters/ContinentPresenter';
9
+ export class DegreeContinent extends ProgrammesBaseIndexabilityPolicy {
10
+ name = 'Degree Continent Policy';
11
+ description = 'Determines indexing rules for pages filtered by both degree type, and continent.';
12
+ filterKeys = [FilterKey.DEGREE_TYPE, FilterKey.CONTINENT];
13
+ rules = [
14
+ new SingleValueSelectedForFilterRule(FilterKey.CONTINENT),
15
+ new SingleValueSelectedForFilterRule(FilterKey.DEGREE_TYPE),
16
+ new OnlyFiltersSelectedRule([FilterKey.CONTINENT, FilterKey.DEGREE_TYPE]),
17
+ new IndexableDegreeRule()
18
+ ];
19
+ constructor(dependencies) {
20
+ super(dependencies);
21
+ this.initateBaseRules();
22
+ }
23
+ async generateUrls() {
24
+ const continentFragments = ContinentPresenter.getInstance().getFragments();
25
+ const degreeFragments = DegreePresenter.getInstance().getFragments();
26
+ const paths = [];
27
+ for (const pageNumber of this.indexablePageNumbers) {
28
+ for (const continent of continentFragments) {
29
+ for (const degree of degreeFragments) {
30
+ const filterKeyValues = new Map([
31
+ [FilterKey.CONTINENT, [continent.id]],
32
+ [FilterKey.DEGREE_TYPE, [degree.id]]
33
+ ]);
34
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
35
+ if (result) {
36
+ paths.push(this.getPathWithPageNumber(`${degree.path}/${continent.path}`, pageNumber));
37
+ }
38
+ }
39
+ }
40
+ }
41
+ return paths;
42
+ }
43
+ get filterCombination() {
44
+ return FilterCombinations.DEGREE_CONTINENT;
45
+ }
46
+ }
@@ -0,0 +1,16 @@
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 { IndexableDegreeRule } from '../rules/IndexableDegreeRule';
6
+ import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
+ import { IProgrammeSeoDependencies } from '../types/IProgrammeSeoDependencies';
8
+ export declare class DegreeContinentTuitionFee extends ProgrammesBaseIndexabilityPolicy {
9
+ readonly name: string;
10
+ readonly description: string;
11
+ readonly filterKeys: FilterKey[];
12
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | IndexableDegreeRule)[];
13
+ constructor(dependencies: IProgrammeSeoDependencies);
14
+ protected generateUrls(): Promise<string[]>;
15
+ get filterCombination(): FilterCombinations;
16
+ }
@@ -0,0 +1,52 @@
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 { IndexableDegreeRule } from '../rules/IndexableDegreeRule';
6
+ import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
+ import { DegreePresenter } from '../../presenters/DegreePresenter';
8
+ import { ContinentPresenter } from '../../presenters/ContinentPresenter';
9
+ import { TuitionFeePresenter } from '../../presenters/TuitionFeePresenter';
10
+ export class DegreeContinentTuitionFee extends ProgrammesBaseIndexabilityPolicy {
11
+ name = 'Degree Continent Tuition Fee Policy';
12
+ description = 'Determines indexing rules for pages filtered by degree type, continent, and tuition fee.';
13
+ filterKeys = [FilterKey.DEGREE_TYPE, FilterKey.CONTINENT, FilterKey.TUITION_FEE];
14
+ rules = [
15
+ new SingleValueSelectedForFilterRule(FilterKey.CONTINENT),
16
+ new SingleValueSelectedForFilterRule(FilterKey.DEGREE_TYPE),
17
+ new SingleValueSelectedForFilterRule(FilterKey.TUITION_FEE),
18
+ new OnlyFiltersSelectedRule([FilterKey.CONTINENT, FilterKey.DEGREE_TYPE, FilterKey.TUITION_FEE]),
19
+ new IndexableDegreeRule()
20
+ ];
21
+ constructor(dependencies) {
22
+ super(dependencies);
23
+ this.initateBaseRules();
24
+ }
25
+ async generateUrls() {
26
+ const continentFragments = ContinentPresenter.getInstance().getFragments();
27
+ const degreeFragments = DegreePresenter.getInstance().getFragments();
28
+ const tuitionFeeFragments = TuitionFeePresenter.getInstance().getFragments();
29
+ const paths = [];
30
+ for (const pageNumber of this.indexablePageNumbers) {
31
+ for (const continent of continentFragments) {
32
+ for (const degree of degreeFragments) {
33
+ for (const tuitionFee of tuitionFeeFragments) {
34
+ const filterKeyValues = new Map([
35
+ [FilterKey.CONTINENT, [continent.id]],
36
+ [FilterKey.DEGREE_TYPE, [degree.id]],
37
+ [FilterKey.TUITION_FEE, [tuitionFee.id]],
38
+ ]);
39
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
40
+ if (result) {
41
+ paths.push(this.getPathWithPageNumber(`${degree.path}/${continent.path}/${tuitionFee.path}`, pageNumber));
42
+ }
43
+ }
44
+ }
45
+ }
46
+ }
47
+ return paths;
48
+ }
49
+ get filterCombination() {
50
+ return FilterCombinations.DEGREE_CONTINENT_TUITION_FEE;
51
+ }
52
+ }
@@ -47,7 +47,7 @@ export class DegreeCountryAttendance extends ProgrammesBaseIndexabilityPolicy {
47
47
  ]);
48
48
  const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
49
49
  if (result) {
50
- paths.push(this.getPathWithPageNumber(`${mba.path}/${country.path}/${onlineAttendance.path}`, pageNumber));
50
+ paths.push(this.getPathWithPageNumber(`${mba.path}/${onlineAttendance.path}/${country.path}`, pageNumber));
51
51
  }
52
52
  }
53
53
  }
@@ -61,7 +61,7 @@ export class DegreeCountryAttendance extends ProgrammesBaseIndexabilityPolicy {
61
61
  ]);
62
62
  const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
63
63
  if (result) {
64
- paths.push(this.getPathWithPageNumber(`${llm.path}/${country.path}/${onlineAttendance.path}`, pageNumber));
64
+ paths.push(this.getPathWithPageNumber(`${llm.path}/${onlineAttendance.path}/${country.path}`, pageNumber));
65
65
  }
66
66
  }
67
67
  }
@@ -75,7 +75,7 @@ export class DegreeCountryAttendance extends ProgrammesBaseIndexabilityPolicy {
75
75
  ]);
76
76
  const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
77
77
  if (result) {
78
- paths.push(this.getPathWithPageNumber(`${mphil.path}/${country.path}/${onlineAttendance.path}`, pageNumber));
78
+ paths.push(this.getPathWithPageNumber(`${mphil.path}/${onlineAttendance.path}/${country.path}`, pageNumber));
79
79
  }
80
80
  }
81
81
  }
@@ -46,7 +46,7 @@ export class DegreeCountryTuitionFee extends ProgrammesBaseIndexabilityPolicy {
46
46
  ]);
47
47
  const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
48
48
  if (result) {
49
- paths.push(this.getPathWithPageNumber(`${mba.path}/${country.path}/${affordableTuition.path}`, pageNumber));
49
+ paths.push(this.getPathWithPageNumber(`${mba.path}/${affordableTuition.path}/${country.path}`, pageNumber));
50
50
  }
51
51
  }
52
52
  }
@@ -60,7 +60,7 @@ export class DegreeCountryTuitionFee extends ProgrammesBaseIndexabilityPolicy {
60
60
  ]);
61
61
  const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
62
62
  if (result) {
63
- paths.push(this.getPathWithPageNumber(`${llm.path}/${country.path}/${affordableTuition.path}`, pageNumber));
63
+ paths.push(this.getPathWithPageNumber(`${llm.path}/${affordableTuition.path}/${country.path}`, pageNumber));
64
64
  }
65
65
  }
66
66
  }
@@ -0,0 +1,17 @@
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 { IndexableDegreeRule } from '../rules/IndexableDegreeRule';
6
+ import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
+ import { IProgrammeSeoDependencies } from '../types/IProgrammeSeoDependencies';
8
+ import { OneOrTwoYearDurationRule } from '../rules/OneOrTwoYearDurationRule';
9
+ export declare class DegreeDuration extends ProgrammesBaseIndexabilityPolicy {
10
+ readonly name: string;
11
+ readonly description: string;
12
+ readonly filterKeys: FilterKey[];
13
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | IndexableDegreeRule | OneOrTwoYearDurationRule)[];
14
+ constructor(dependencies: IProgrammeSeoDependencies);
15
+ protected generateUrls(): Promise<string[]>;
16
+ get filterCombination(): FilterCombinations;
17
+ }
@@ -0,0 +1,50 @@
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 { IndexableDegreeRule } from '../rules/IndexableDegreeRule';
6
+ import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
+ import { DegreePresenter } from '../../presenters/DegreePresenter';
8
+ import { DurationPresenter } from '../../presenters/DurationPresenter';
9
+ import { OneOrTwoYearDurationRule } from '../rules/OneOrTwoYearDurationRule';
10
+ export class DegreeDuration extends ProgrammesBaseIndexabilityPolicy {
11
+ name = 'Degree Duration Policy';
12
+ description = 'Determines indexing rules for pages filtered by degree type and duration (2 years).';
13
+ filterKeys = [FilterKey.DEGREE_TYPE, FilterKey.DURATION];
14
+ rules = [
15
+ new SingleValueSelectedForFilterRule(FilterKey.DURATION),
16
+ new SingleValueSelectedForFilterRule(FilterKey.DEGREE_TYPE),
17
+ new OnlyFiltersSelectedRule([FilterKey.DURATION, FilterKey.DEGREE_TYPE]),
18
+ new IndexableDegreeRule(),
19
+ new OneOrTwoYearDurationRule()
20
+ ];
21
+ constructor(dependencies) {
22
+ super(dependencies);
23
+ this.initateBaseRules();
24
+ }
25
+ async generateUrls() {
26
+ const durationFragments = DurationPresenter.getInstance().getFragments();
27
+ const degreeFragments = DegreePresenter.getInstance().getFragments();
28
+ const paths = [];
29
+ const allowedDurationIds = ["[720,720]", "[360,360]"];
30
+ const allowedDurations = durationFragments.filter(duration => allowedDurationIds.includes(duration.id));
31
+ for (const pageNumber of this.indexablePageNumbers) {
32
+ for (const duration of allowedDurations) {
33
+ for (const degree of degreeFragments) {
34
+ const filterKeyValues = new Map([
35
+ [FilterKey.DURATION, [duration.id]],
36
+ [FilterKey.DEGREE_TYPE, [degree.id]]
37
+ ]);
38
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
39
+ if (result) {
40
+ paths.push(this.getPathWithPageNumber(`${degree.path}/${duration.path}`, pageNumber));
41
+ }
42
+ }
43
+ }
44
+ }
45
+ return paths;
46
+ }
47
+ get filterCombination() {
48
+ return FilterCombinations.DEGREE_DURATION;
49
+ }
50
+ }
@@ -0,0 +1,16 @@
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 { IndexableDegreeRule } from '../rules/IndexableDegreeRule';
6
+ import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
+ import { IProgrammeSeoDependencies } from '../types/IProgrammeSeoDependencies';
8
+ export declare class DegreeFormat extends ProgrammesBaseIndexabilityPolicy {
9
+ readonly name: string;
10
+ readonly description: string;
11
+ readonly filterKeys: FilterKey[];
12
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | IndexableDegreeRule)[];
13
+ constructor(dependencies: IProgrammeSeoDependencies);
14
+ protected generateUrls(): Promise<string[]>;
15
+ get filterCombination(): FilterCombinations;
16
+ }
@@ -0,0 +1,48 @@
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 { IndexableDegreeRule } from '../rules/IndexableDegreeRule';
6
+ import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
+ import { DegreePresenter } from '../../presenters/DegreePresenter';
8
+ import { FormatPresenter } from '../../presenters/FormatPresenter';
9
+ export class DegreeFormat extends ProgrammesBaseIndexabilityPolicy {
10
+ name = 'Degree Format Policy';
11
+ description = 'Determines indexing rules for pages filtered by degree type and format.';
12
+ filterKeys = [FilterKey.DEGREE_TYPE, FilterKey.ATTENDANCE];
13
+ rules = [
14
+ new SingleValueSelectedForFilterRule(FilterKey.ATTENDANCE),
15
+ new SingleValueSelectedForFilterRule(FilterKey.DEGREE_TYPE),
16
+ new OnlyFiltersSelectedRule([FilterKey.ATTENDANCE, FilterKey.DEGREE_TYPE]),
17
+ new IndexableDegreeRule()
18
+ ];
19
+ constructor(dependencies) {
20
+ super(dependencies);
21
+ this.initateBaseRules();
22
+ }
23
+ async generateUrls() {
24
+ const formatFragments = FormatPresenter.getInstance().getFragments();
25
+ const degreeFragments = DegreePresenter.getInstance().getFragments();
26
+ const allowedFormatIds = [FormatFilterOptionValue.PART_TIME, FormatFilterOptionValue.FULL_TIME];
27
+ const allowedFormats = formatFragments.filter(format => allowedFormatIds.includes(format.id));
28
+ const paths = [];
29
+ for (const pageNumber of this.indexablePageNumbers) {
30
+ for (const format of allowedFormats) {
31
+ for (const degree of degreeFragments) {
32
+ const filterKeyValues = new Map([
33
+ [FilterKey.ATTENDANCE, [format.id]],
34
+ [FilterKey.DEGREE_TYPE, [degree.id]]
35
+ ]);
36
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
37
+ if (result) {
38
+ paths.push(this.getPathWithPageNumber(`${degree.path}/${format.path}`, pageNumber));
39
+ }
40
+ }
41
+ }
42
+ }
43
+ return paths;
44
+ }
45
+ get filterCombination() {
46
+ return FilterCombinations.DEGREE_FORMAT;
47
+ }
48
+ }
@@ -0,0 +1,18 @@
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 { IndexableDegreeRule } from '../rules/IndexableDegreeRule';
6
+ import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
+ import { IProgrammeSeoDependencies } from '../types/IProgrammeSeoDependencies';
8
+ import { AffordableTuitionFeeRule } from '../rules/AffordableTuitionFeeRule';
9
+ import { PartTimeFormatRule } from '../rules/PartTimeFormatRule';
10
+ export declare class DegreeFormatTuitionFee extends ProgrammesBaseIndexabilityPolicy {
11
+ readonly name: string;
12
+ readonly description: string;
13
+ readonly filterKeys: FilterKey[];
14
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | IndexableDegreeRule | AffordableTuitionFeeRule | PartTimeFormatRule)[];
15
+ constructor(dependencies: IProgrammeSeoDependencies);
16
+ protected generateUrls(): Promise<string[]>;
17
+ get filterCombination(): FilterCombinations;
18
+ }
@@ -0,0 +1,56 @@
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 { IndexableDegreeRule } from '../rules/IndexableDegreeRule';
6
+ import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
+ import { DegreePresenter } from '../../presenters/DegreePresenter';
8
+ import { FormatPresenter } from '../../presenters/FormatPresenter';
9
+ import { TuitionFeePresenter } from '../../presenters/TuitionFeePresenter';
10
+ import { AffordableTuitionFeeRule } from '../rules/AffordableTuitionFeeRule';
11
+ import { PartTimeFormatRule } from '../rules/PartTimeFormatRule';
12
+ export class DegreeFormatTuitionFee extends ProgrammesBaseIndexabilityPolicy {
13
+ name = 'Degree Format Tuition Fee Policy';
14
+ description = 'Determines indexing rules for pages filtered by degree type, format and tuition fee.';
15
+ filterKeys = [FilterKey.DEGREE_TYPE, FilterKey.ATTENDANCE, FilterKey.TUITION_FEE];
16
+ rules = [
17
+ new SingleValueSelectedForFilterRule(FilterKey.ATTENDANCE),
18
+ new SingleValueSelectedForFilterRule(FilterKey.DEGREE_TYPE),
19
+ new SingleValueSelectedForFilterRule(FilterKey.TUITION_FEE),
20
+ new OnlyFiltersSelectedRule([FilterKey.ATTENDANCE, FilterKey.DEGREE_TYPE, FilterKey.TUITION_FEE]),
21
+ new IndexableDegreeRule(),
22
+ new AffordableTuitionFeeRule(),
23
+ new PartTimeFormatRule()
24
+ ];
25
+ constructor(dependencies) {
26
+ super(dependencies);
27
+ this.initateBaseRules();
28
+ }
29
+ async generateUrls() {
30
+ const formatFragments = FormatPresenter.getInstance().getFragments();
31
+ const degreeFragments = DegreePresenter.getInstance().getFragments();
32
+ const tuitionFeeFragments = TuitionFeePresenter.getInstance().getFragments();
33
+ const paths = [];
34
+ for (const pageNumber of this.indexablePageNumbers) {
35
+ for (const format of formatFragments) {
36
+ for (const degree of degreeFragments) {
37
+ for (const tuitionFee of tuitionFeeFragments) {
38
+ const filterKeyValues = new Map([
39
+ [FilterKey.ATTENDANCE, [format.id]],
40
+ [FilterKey.DEGREE_TYPE, [degree.id]],
41
+ [FilterKey.TUITION_FEE, [tuitionFee.id]]
42
+ ]);
43
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
44
+ if (result) {
45
+ paths.push(this.getPathWithPageNumber(`${degree.path}/${tuitionFee.path}/${format.path}`, pageNumber));
46
+ }
47
+ }
48
+ }
49
+ }
50
+ }
51
+ return paths;
52
+ }
53
+ get filterCombination() {
54
+ return FilterCombinations.DEGREE_FORMAT_TUITION_FEE;
55
+ }
56
+ }