@studyportals/fawkes 8.1.1 → 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 { AffordableTuitionFeeRule } from '../rules/AffordableTuitionFeeRule';
9
+ export declare class AttendanceTuitionFee extends ProgrammesBaseIndexabilityPolicy {
10
+ readonly name: string;
11
+ readonly description: string;
12
+ readonly filterKeys: FilterKey[];
13
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | OnlineAttendanceRule | AffordableTuitionFeeRule)[];
14
+ constructor(dependencies: IProgrammeSeoDependencies);
15
+ protected generateUrls(): Promise<string[]>;
16
+ get filterCombination(): FilterCombinations;
17
+ }
@@ -0,0 +1,51 @@
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 { TuitionFeePresenter } from '../../presenters/TuitionFeePresenter';
8
+ import { AttendancePresenter } from '../../presenters/AttendancePresenter';
9
+ import { OnlineAttendanceRule } from '../../common/rules/OnlineAttendanceRule';
10
+ import { AffordableTuitionFeeRule } from '../rules/AffordableTuitionFeeRule';
11
+ export class AttendanceTuitionFee extends ProgrammesBaseIndexabilityPolicy {
12
+ name = 'Tuition Fee Attendance Policy';
13
+ description = 'Determines indexing rules for pages filtered by tuition fee and attendance.';
14
+ filterKeys = [FilterKey.TUITION_FEE, FilterKey.DELIVERY_METHOD];
15
+ rules = [
16
+ new SingleValueSelectedForFilterRule(FilterKey.DELIVERY_METHOD),
17
+ new SingleValueSelectedForFilterRule(FilterKey.TUITION_FEE),
18
+ new OnlyFiltersSelectedRule([FilterKey.DELIVERY_METHOD, FilterKey.TUITION_FEE]),
19
+ new OnlineAttendanceRule(),
20
+ new AffordableTuitionFeeRule()
21
+ ];
22
+ constructor(dependencies) {
23
+ super(dependencies);
24
+ this.initateBaseRules();
25
+ }
26
+ async generateUrls() {
27
+ const attendanceFragments = AttendancePresenter.getInstance().getFragments();
28
+ const tuitionFeeFragments = TuitionFeePresenter.getInstance().getFragments();
29
+ const paths = [];
30
+ const affordableTuition = tuitionFeeFragments.find(t => t.id === TuitionFeeFilterOptionValue.ZERO_TO_TWO_THOUSAND_FIVE_HUNDRED);
31
+ if (!affordableTuition) {
32
+ return paths;
33
+ }
34
+ for (const pageNumber of this.indexablePageNumbers) {
35
+ for (const attendance of attendanceFragments) {
36
+ const filterKeyValues = new Map([
37
+ [FilterKey.DELIVERY_METHOD, [attendance.id]],
38
+ [FilterKey.TUITION_FEE, [affordableTuition.id]]
39
+ ]);
40
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
41
+ if (result) {
42
+ paths.push(this.getPathWithPageNumber(`${affordableTuition.path}/${attendance.path}`, pageNumber));
43
+ }
44
+ }
45
+ }
46
+ return paths;
47
+ }
48
+ get filterCombination() {
49
+ return FilterCombinations.ATTENDANCE_TUITION_FEE;
50
+ }
51
+ }
@@ -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 { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
6
+ import { IProgrammeSeoDependencies } from '../types/IProgrammeSeoDependencies';
7
+ import { OneYearDurationRule } from '../rules/OneYearDurationRule';
8
+ export declare class ContinentDuration extends ProgrammesBaseIndexabilityPolicy {
9
+ readonly name: string;
10
+ readonly description: string;
11
+ readonly filterKeys: FilterKey[];
12
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | OneYearDurationRule)[];
13
+ constructor(dependencies: IProgrammeSeoDependencies);
14
+ protected generateUrls(): Promise<string[]>;
15
+ get filterCombination(): FilterCombinations;
16
+ }
@@ -0,0 +1,48 @@
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 { ContinentPresenter } from '../../presenters/ContinentPresenter';
7
+ import { DurationPresenter } from '../../presenters/DurationPresenter';
8
+ import { OneYearDurationRule } from '../rules/OneYearDurationRule';
9
+ export class ContinentDuration extends ProgrammesBaseIndexabilityPolicy {
10
+ name = 'Continent Duration Policy';
11
+ description = 'Determines indexing rules for pages filtered by continent and duration (1 year).';
12
+ filterKeys = [FilterKey.CONTINENT, FilterKey.DURATION];
13
+ rules = [
14
+ new SingleValueSelectedForFilterRule(FilterKey.DURATION),
15
+ new SingleValueSelectedForFilterRule(FilterKey.CONTINENT),
16
+ new OnlyFiltersSelectedRule([FilterKey.DURATION, FilterKey.CONTINENT]),
17
+ new OneYearDurationRule()
18
+ ];
19
+ constructor(dependencies) {
20
+ super(dependencies);
21
+ this.initateBaseRules();
22
+ }
23
+ async generateUrls() {
24
+ const durationFragments = DurationPresenter.getInstance().getFragments();
25
+ const continentFragments = ContinentPresenter.getInstance().getFragments();
26
+ const paths = [];
27
+ const allowedDurationIds = [DurationFilterOptionValue.ONE_YEAR];
28
+ const allowedDurations = durationFragments.filter(duration => allowedDurationIds.includes(duration.id));
29
+ for (const pageNumber of this.indexablePageNumbers) {
30
+ for (const duration of allowedDurations) {
31
+ for (const continent of continentFragments) {
32
+ const filterKeyValues = new Map([
33
+ [FilterKey.DURATION, [duration.id]],
34
+ [FilterKey.CONTINENT, [continent.id]]
35
+ ]);
36
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
37
+ if (result) {
38
+ paths.push(this.getPathWithPageNumber(`${continent.path}/${duration.path}`, pageNumber));
39
+ }
40
+ }
41
+ }
42
+ }
43
+ return paths;
44
+ }
45
+ get filterCombination() {
46
+ return FilterCombinations.CONTINENT_DURATION;
47
+ }
48
+ }
@@ -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 { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
6
+ import { IProgrammeSeoDependencies } from '../types/IProgrammeSeoDependencies';
7
+ import { PartTimeFormatRule } from '../rules/PartTimeFormatRule';
8
+ export declare class ContinentFormat extends ProgrammesBaseIndexabilityPolicy {
9
+ readonly name: string;
10
+ readonly description: string;
11
+ readonly filterKeys: FilterKey[];
12
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | PartTimeFormatRule)[];
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 { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
6
+ import { ContinentPresenter } from '../../presenters/ContinentPresenter';
7
+ import { FormatPresenter } from '../../presenters/FormatPresenter';
8
+ import { PartTimeFormatRule } from '../rules/PartTimeFormatRule';
9
+ export class ContinentFormat extends ProgrammesBaseIndexabilityPolicy {
10
+ name = 'Continent Format Policy';
11
+ description = 'Determines indexing rules for pages filtered by continent and format.';
12
+ filterKeys = [FilterKey.CONTINENT, FilterKey.ATTENDANCE];
13
+ rules = [
14
+ new SingleValueSelectedForFilterRule(FilterKey.ATTENDANCE),
15
+ new SingleValueSelectedForFilterRule(FilterKey.CONTINENT),
16
+ new OnlyFiltersSelectedRule([FilterKey.ATTENDANCE, FilterKey.CONTINENT]),
17
+ new PartTimeFormatRule()
18
+ ];
19
+ constructor(dependencies) {
20
+ super(dependencies);
21
+ this.initateBaseRules();
22
+ }
23
+ async generateUrls() {
24
+ const formatFragments = FormatPresenter.getInstance().getFragments();
25
+ const continentFragments = ContinentPresenter.getInstance().getFragments();
26
+ const paths = [];
27
+ const allowedFormatIds = [FormatFilterOptionValue.PART_TIME];
28
+ const allowedFormats = formatFragments.filter(format => allowedFormatIds.includes(format.id));
29
+ for (const pageNumber of this.indexablePageNumbers) {
30
+ for (const format of allowedFormats) {
31
+ for (const continent of continentFragments) {
32
+ const filterKeyValues = new Map([
33
+ [FilterKey.ATTENDANCE, [format.id]],
34
+ [FilterKey.CONTINENT, [continent.id]]
35
+ ]);
36
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
37
+ if (result) {
38
+ paths.push(this.getPathWithPageNumber(`${continent.path}/${format.path}`, pageNumber));
39
+ }
40
+ }
41
+ }
42
+ }
43
+ return paths;
44
+ }
45
+ get filterCombination() {
46
+ return FilterCombinations.CONTINENT_FORMAT;
47
+ }
48
+ }
@@ -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 { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
6
+ import { IProgrammeSeoDependencies } from '../types/IProgrammeSeoDependencies';
7
+ import { ErasmusSpecialProgrammeRule } from '../../programmes/rules/ErasmusSpecialProgrammeRule';
8
+ export declare class ContinentSpecialProgrammes extends ProgrammesBaseIndexabilityPolicy {
9
+ readonly name: string;
10
+ readonly description: string;
11
+ readonly filterKeys: FilterKey[];
12
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | ErasmusSpecialProgrammeRule)[];
13
+ constructor(dependencies: IProgrammeSeoDependencies);
14
+ protected generateUrls(): Promise<string[]>;
15
+ get filterCombination(): FilterCombinations;
16
+ }
@@ -0,0 +1,48 @@
1
+ import { 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 { ContinentPresenter } from '../../presenters/ContinentPresenter';
7
+ import { SpecialProgrammesPresenter } from '../../presenters/SpecialProgrammesPresenter';
8
+ import { ErasmusSpecialProgrammeRule } from '../../programmes/rules/ErasmusSpecialProgrammeRule';
9
+ export class ContinentSpecialProgrammes extends ProgrammesBaseIndexabilityPolicy {
10
+ name = 'Continent Special Programmes Policy';
11
+ description = 'Determines indexing rules for pages filtered by continent and special programmes (Erasmus Mundus).';
12
+ filterKeys = [FilterKey.CONTINENT, FilterKey.SPECIAL_PROGRAMMES];
13
+ rules = [
14
+ new SingleValueSelectedForFilterRule(FilterKey.SPECIAL_PROGRAMMES),
15
+ new SingleValueSelectedForFilterRule(FilterKey.CONTINENT),
16
+ new OnlyFiltersSelectedRule([FilterKey.SPECIAL_PROGRAMMES, FilterKey.CONTINENT]),
17
+ new ErasmusSpecialProgrammeRule()
18
+ ];
19
+ constructor(dependencies) {
20
+ super(dependencies);
21
+ this.initateBaseRules();
22
+ }
23
+ async generateUrls() {
24
+ const specialProgrammesFragments = SpecialProgrammesPresenter.getInstance().getFragments();
25
+ const continentFragments = ContinentPresenter.getInstance().getFragments();
26
+ const paths = [];
27
+ const validSpecialProgrammesIds = [SpecialProgrammesFilterOptionValue.ERASMUS_MUNDUS];
28
+ const validSpecialProgrammes = specialProgrammesFragments.filter(specialProgramme => validSpecialProgrammesIds.includes(specialProgramme.id));
29
+ for (const pageNumber of this.indexablePageNumbers) {
30
+ for (const specialProgramme of validSpecialProgrammes) {
31
+ for (const continent of continentFragments) {
32
+ const filterKeyValues = new Map([
33
+ [FilterKey.SPECIAL_PROGRAMMES, [specialProgramme.id]],
34
+ [FilterKey.CONTINENT, [continent.id]]
35
+ ]);
36
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
37
+ if (result) {
38
+ paths.push(this.getPathWithPageNumber(`${specialProgramme.path}/${continent.path}`, pageNumber));
39
+ }
40
+ }
41
+ }
42
+ }
43
+ return paths;
44
+ }
45
+ get filterCombination() {
46
+ return FilterCombinations.CONTINENT_SPECIAL_PROGRAMMES;
47
+ }
48
+ }
@@ -10,7 +10,7 @@ import { AttendancePresenter } from '../../presenters/AttendancePresenter';
10
10
  import { DegreePresenter } from '../../presenters/DegreePresenter';
11
11
  export class CountryAttendanceDegree extends ProgrammesBaseIndexabilityPolicy {
12
12
  name = 'Country Attendance Degree Policy';
13
- description = `Determines indexing rules for pages filtered by country,
13
+ description = `Determines indexing rules for pages filtered by country,
14
14
  study format (online, on-campus, etc.), and degree type.`;
15
15
  filterKeys = [FilterKey.COUNTRY, FilterKey.DELIVERY_METHOD, FilterKey.DEGREE_TYPE];
16
16
  rules = [
@@ -2,14 +2,14 @@ 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 { IndexableDurationRule } from '../rules/IndexableDurationRule';
5
+ import { OneYearOnlyRule } from '../rules/OneYearOnlyRule';
6
6
  import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
7
  import { IProgrammeSeoDependencies } from '../types/IProgrammeSeoDependencies';
8
8
  export declare class CountryDuration extends ProgrammesBaseIndexabilityPolicy {
9
9
  readonly name: string;
10
10
  readonly description: string;
11
11
  readonly filterKeys: FilterKey[];
12
- protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | IndexableDurationRule)[];
12
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | OneYearOnlyRule)[];
13
13
  constructor(dependencies: IProgrammeSeoDependencies);
14
14
  protected generateUrls(): Promise<string[]>;
15
15
  get filterCombination(): FilterCombinations;
@@ -2,19 +2,19 @@ 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 { IndexableDurationRule } from '../rules/IndexableDurationRule';
5
+ import { OneYearOnlyRule } from '../rules/OneYearOnlyRule';
6
6
  import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
7
  import { CountryPresenter } from '../../presenters/CountryPresenter';
8
8
  import { DurationPresenter } from '../../presenters/DurationPresenter';
9
9
  export class CountryDuration extends ProgrammesBaseIndexabilityPolicy {
10
10
  name = 'Country Duration Policy';
11
- description = 'Determines indexing rules for pages filtered by both country, and duration (1 year, 2 years, etc.).';
11
+ description = 'Determines indexing rules for pages filtered by both country, and duration (1 year only).';
12
12
  filterKeys = [FilterKey.COUNTRY, FilterKey.DURATION];
13
13
  rules = [
14
14
  new SingleValueSelectedForFilterRule(FilterKey.COUNTRY),
15
15
  new SingleValueSelectedForFilterRule(FilterKey.DURATION),
16
16
  new OnlyFiltersSelectedRule([FilterKey.COUNTRY, FilterKey.DURATION]),
17
- new IndexableDurationRule()
17
+ new OneYearOnlyRule()
18
18
  ];
19
19
  constructor(dependencies) {
20
20
  super(dependencies);
@@ -23,10 +23,12 @@ export class CountryDuration extends ProgrammesBaseIndexabilityPolicy {
23
23
  async generateUrls() {
24
24
  const countryFragments = CountryPresenter.getInstance().getFragments();
25
25
  const durationFragments = DurationPresenter.getInstance().getFragments();
26
+ const allowedDurationIds = ["[360,360]"];
27
+ const allowedDurations = durationFragments.filter(duration => allowedDurationIds.includes(duration.id));
26
28
  const paths = [];
27
29
  for (const pageNumber of this.indexablePageNumbers) {
28
30
  for (const country of countryFragments) {
29
- for (const duration of durationFragments) {
31
+ for (const duration of allowedDurations) {
30
32
  const filterKeyValues = new Map([
31
33
  [FilterKey.COUNTRY, [country.id]],
32
34
  [FilterKey.DURATION, [duration.id]]
@@ -10,7 +10,7 @@ import { DegreePresenter } from '../../presenters/DegreePresenter';
10
10
  import { DurationPresenter } from '../../presenters/DurationPresenter';
11
11
  export class CountryDurationDegree extends ProgrammesBaseIndexabilityPolicy {
12
12
  name = 'Country Duration Degree Policy';
13
- description = `Determines indexing rules for pages filtered by country,
13
+ description = `Determines indexing rules for pages filtered by country,
14
14
  duration (1 year, 2 years, etc.), and degree type.`;
15
15
  filterKeys = [FilterKey.COUNTRY, FilterKey.DURATION, FilterKey.DEGREE_TYPE];
16
16
  rules = [
@@ -8,7 +8,7 @@ import { CountryPresenter } from '../../presenters/CountryPresenter';
8
8
  import { EducationalFormPresenter } from '../../presenters/EducationalFormPresenter';
9
9
  export class CountryEducationalForm extends ProgrammesBaseIndexabilityPolicy {
10
10
  name = 'Country Educational Form Policy';
11
- description = `Determines indexing rules for pages filtered by both country,
11
+ description = `Determines indexing rules for pages filtered by both country,
12
12
  and educational form (academic, semester, summer school, etc.).`;
13
13
  filterKeys = [FilterKey.COUNTRY, FilterKey.EDUCATIONAL_FORM];
14
14
  rules = [
@@ -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 { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
6
+ import { IProgrammeSeoDependencies } from '../types/IProgrammeSeoDependencies';
7
+ import { ErasmusSpecialProgrammeRule } from '../../programmes/rules/ErasmusSpecialProgrammeRule';
8
+ export declare class CountrySpecialProgrammes extends ProgrammesBaseIndexabilityPolicy {
9
+ readonly name: string;
10
+ readonly description: string;
11
+ readonly filterKeys: FilterKey[];
12
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | ErasmusSpecialProgrammeRule)[];
13
+ constructor(dependencies: IProgrammeSeoDependencies);
14
+ protected generateUrls(): Promise<string[]>;
15
+ get filterCombination(): FilterCombinations;
16
+ }
@@ -0,0 +1,48 @@
1
+ import { 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 { CountryPresenter } from '../../presenters/CountryPresenter';
7
+ import { SpecialProgrammesPresenter } from '../../presenters/SpecialProgrammesPresenter';
8
+ import { ErasmusSpecialProgrammeRule } from '../../programmes/rules/ErasmusSpecialProgrammeRule';
9
+ export class CountrySpecialProgrammes extends ProgrammesBaseIndexabilityPolicy {
10
+ name = 'Country Special Programmes Policy';
11
+ description = 'Determines indexing rules for pages filtered by country and special programmes (Joint).';
12
+ filterKeys = [FilterKey.COUNTRY, FilterKey.SPECIAL_PROGRAMMES];
13
+ rules = [
14
+ new SingleValueSelectedForFilterRule(FilterKey.SPECIAL_PROGRAMMES),
15
+ new SingleValueSelectedForFilterRule(FilterKey.COUNTRY),
16
+ new OnlyFiltersSelectedRule([FilterKey.SPECIAL_PROGRAMMES, FilterKey.COUNTRY]),
17
+ new ErasmusSpecialProgrammeRule()
18
+ ];
19
+ constructor(dependencies) {
20
+ super(dependencies);
21
+ this.initateBaseRules();
22
+ }
23
+ async generateUrls() {
24
+ const specialProgrammesFragments = SpecialProgrammesPresenter.getInstance().getFragments();
25
+ const countryFragments = CountryPresenter.getInstance().getFragments();
26
+ const paths = [];
27
+ const validSpecialProgrammesIds = [SpecialProgrammesFilterOptionValue.ERASMUS_MUNDUS];
28
+ const validSpecialProgrammes = specialProgrammesFragments.filter(specialProgramme => validSpecialProgrammesIds.includes(specialProgramme.id));
29
+ for (const pageNumber of this.indexablePageNumbers) {
30
+ for (const specialProgramme of validSpecialProgrammes) {
31
+ for (const country of countryFragments) {
32
+ const filterKeyValues = new Map([
33
+ [FilterKey.SPECIAL_PROGRAMMES, [specialProgramme.id]],
34
+ [FilterKey.COUNTRY, [country.id]]
35
+ ]);
36
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
37
+ if (result) {
38
+ paths.push(this.getPathWithPageNumber(`${specialProgramme.path}/${country.path}`, pageNumber));
39
+ }
40
+ }
41
+ }
42
+ }
43
+ return paths;
44
+ }
45
+ get filterCombination() {
46
+ return FilterCombinations.COUNTRY_SPECIAL_PROGRAMMES;
47
+ }
48
+ }
@@ -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 DegreeArea 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,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 { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
6
+ import { AreaPresenter } from '../../presenters/AreaPresenter';
7
+ import { DegreePresenter } from '../../presenters/DegreePresenter';
8
+ export class DegreeArea extends ProgrammesBaseIndexabilityPolicy {
9
+ name = 'Degree Area Policy';
10
+ description = 'Controls indexing of pages filtered by geographic areas and degree type.';
11
+ filterKeys = [FilterKey.DEGREE_TYPE, FilterKey.AREA];
12
+ rules = [
13
+ new SingleValueSelectedForFilterRule(FilterKey.AREA),
14
+ new SingleValueSelectedForFilterRule(FilterKey.COUNTRY),
15
+ new SingleValueSelectedForFilterRule(FilterKey.DEGREE_TYPE),
16
+ new OnlyFiltersSelectedRule([FilterKey.AREA, FilterKey.COUNTRY, FilterKey.DEGREE_TYPE])
17
+ ];
18
+ constructor(dependencies) {
19
+ super(dependencies);
20
+ this.initateBaseRules();
21
+ }
22
+ async generateUrls() {
23
+ const areaFragments = AreaPresenter.getInstance().getFragments();
24
+ const degreeFragments = DegreePresenter.getInstance().getFragments();
25
+ const paths = [];
26
+ for (const pageNumber of this.indexablePageNumbers) {
27
+ for (const degree of degreeFragments) {
28
+ for (const area of areaFragments) {
29
+ const filterKeyValues = new Map([
30
+ [FilterKey.AREA, [area.id]],
31
+ [FilterKey.COUNTRY, [area.countryId]],
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}/${area.path}`, pageNumber));
37
+ }
38
+ }
39
+ }
40
+ }
41
+ return paths;
42
+ }
43
+ get filterCombination() {
44
+ return FilterCombinations.DEGREE_AREA;
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 { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
6
+ import { IProgrammeSeoDependencies } from '../types/IProgrammeSeoDependencies';
7
+ import { AffordableTuitionFeeRule } from '../rules/AffordableTuitionFeeRule';
8
+ export declare class DegreeAreaTuitionFee extends ProgrammesBaseIndexabilityPolicy {
9
+ readonly name: string;
10
+ readonly description: string;
11
+ readonly filterKeys: FilterKey[];
12
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | AffordableTuitionFeeRule)[];
13
+ constructor(dependencies: IProgrammeSeoDependencies);
14
+ protected generateUrls(): Promise<string[]>;
15
+ get filterCombination(): FilterCombinations;
16
+ }
@@ -0,0 +1,54 @@
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 { AreaPresenter } from '../../presenters/AreaPresenter';
7
+ import { DegreePresenter } from '../../presenters/DegreePresenter';
8
+ import { TuitionFeePresenter } from '../../presenters/TuitionFeePresenter';
9
+ import { AffordableTuitionFeeRule } from '../rules/AffordableTuitionFeeRule';
10
+ export class DegreeAreaTuitionFee extends ProgrammesBaseIndexabilityPolicy {
11
+ name = 'Degree Area Tuition fee Policy';
12
+ description = 'Controls indexing of pages filtered by geographic areas and tuition fees.';
13
+ filterKeys = [FilterKey.AREA, FilterKey.DEGREE_TYPE, FilterKey.TUITION_FEE, FilterKey.COUNTRY];
14
+ rules = [
15
+ new SingleValueSelectedForFilterRule(FilterKey.AREA),
16
+ new SingleValueSelectedForFilterRule(FilterKey.COUNTRY),
17
+ new SingleValueSelectedForFilterRule(FilterKey.DEGREE_TYPE),
18
+ new SingleValueSelectedForFilterRule(FilterKey.TUITION_FEE),
19
+ new OnlyFiltersSelectedRule([FilterKey.AREA, FilterKey.COUNTRY, FilterKey.DEGREE_TYPE, FilterKey.TUITION_FEE]),
20
+ new AffordableTuitionFeeRule()
21
+ ];
22
+ constructor(dependencies) {
23
+ super(dependencies);
24
+ this.initateBaseRules();
25
+ }
26
+ async generateUrls() {
27
+ const areaFragments = AreaPresenter.getInstance().getFragments();
28
+ const degreeFragments = DegreePresenter.getInstance().getFragments();
29
+ const tuitionFeeFragments = TuitionFeePresenter.getInstance().getFragments();
30
+ const paths = [];
31
+ for (const pageNumber of this.indexablePageNumbers) {
32
+ for (const degree of degreeFragments) {
33
+ for (const area of areaFragments) {
34
+ for (const tuitionFee of tuitionFeeFragments) {
35
+ const filterKeyValues = new Map([
36
+ [FilterKey.AREA, [area.id]],
37
+ [FilterKey.COUNTRY, [area.countryId]],
38
+ [FilterKey.DEGREE_TYPE, [degree.id]],
39
+ [FilterKey.TUITION_FEE, [tuitionFee.id]]
40
+ ]);
41
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
42
+ if (result) {
43
+ paths.push(this.getPathWithPageNumber(`${degree.path}/${tuitionFee.path}/${area.path}`, pageNumber));
44
+ }
45
+ }
46
+ }
47
+ }
48
+ }
49
+ return paths;
50
+ }
51
+ get filterCombination() {
52
+ return FilterCombinations.DEGREE_AREA_TUITION_FEE;
53
+ }
54
+ }
@@ -5,11 +5,12 @@ import { FilterCombinations } from '../../enums/FilterCombinations';
5
5
  import { DegreeAttendanceDisciplineSpecificRule } from '../rules/DegreeAttendanceDisciplineSpecificRule';
6
6
  import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
7
  import { IProgrammeSeoDependencies } from '../types/IProgrammeSeoDependencies';
8
+ import { OnlineAttendanceRule } from '../../common/rules/OnlineAttendanceRule';
8
9
  export declare class DegreeAttendanceDiscipline extends ProgrammesBaseIndexabilityPolicy {
9
10
  readonly name: string;
10
11
  readonly description: string;
11
12
  readonly filterKeys: FilterKey[];
12
- protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | DegreeAttendanceDisciplineSpecificRule)[];
13
+ protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | OnlineAttendanceRule | DegreeAttendanceDisciplineSpecificRule)[];
13
14
  constructor(dependencies: IProgrammeSeoDependencies);
14
15
  protected generateUrls(): Promise<string[]>;
15
16
  get filterCombination(): FilterCombinations;
@@ -8,6 +8,7 @@ import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityP
8
8
  import { DegreePresenter } from '../../presenters/DegreePresenter';
9
9
  import { AttendancePresenter } from '../../presenters/AttendancePresenter';
10
10
  import { DisciplinePresenter } from '../../presenters/DisciplinePresenter';
11
+ import { OnlineAttendanceRule } from '../../common/rules/OnlineAttendanceRule';
11
12
  export class DegreeAttendanceDiscipline extends ProgrammesBaseIndexabilityPolicy {
12
13
  name = 'Degree Attendance Discipline Policy';
13
14
  description = 'Determines indexing rules for pages filtered by degree type, attendance, and discipline.';
@@ -18,6 +19,7 @@ export class DegreeAttendanceDiscipline extends ProgrammesBaseIndexabilityPolicy
18
19
  new SingleValueSelectedForFilterRule(FilterKey.DISCIPLINES),
19
20
  new OnlyFiltersSelectedRule([FilterKey.DEGREE_TYPE, FilterKey.DELIVERY_METHOD, FilterKey.DISCIPLINES]),
20
21
  new DegreeAttendanceDisciplineSpecificRule(),
22
+ new OnlineAttendanceRule()
21
23
  ];
22
24
  constructor(dependencies) {
23
25
  super(dependencies);
@@ -33,24 +35,22 @@ export class DegreeAttendanceDiscipline extends ProgrammesBaseIndexabilityPolicy
33
35
  DegreeTypeFilterOptionValue.MSC,
34
36
  DegreeTypeFilterOptionValue.MBA
35
37
  ];
36
- const onlineAttendance = attendanceFragments.find(a => a.id === 'online');
37
- if (!onlineAttendance) {
38
- return paths;
39
- }
40
38
  for (const pageNumber of this.indexablePageNumbers) {
41
39
  for (const degreeId of allowedDegreeIds) {
42
40
  const degree = degreeFragments.find(d => d.id === degreeId);
43
41
  if (!degree)
44
42
  continue;
45
43
  for (const discipline of disciplineFragments) {
46
- const filterKeyValues = new Map([
47
- [FilterKey.DEGREE_TYPE, [degree.id]],
48
- [FilterKey.DELIVERY_METHOD, [onlineAttendance.id]],
49
- [FilterKey.DISCIPLINES, [discipline.id]]
50
- ]);
51
- const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
52
- if (result) {
53
- paths.push(this.getPathWithPageNumber(`${degree.path}/${onlineAttendance.path}/${discipline.path}`, pageNumber));
44
+ for (const attendance of attendanceFragments) {
45
+ const filterKeyValues = new Map([
46
+ [FilterKey.DEGREE_TYPE, [degree.id]],
47
+ [FilterKey.DELIVERY_METHOD, [attendance.id]],
48
+ [FilterKey.DISCIPLINES, [discipline.id]]
49
+ ]);
50
+ const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
51
+ if (result) {
52
+ paths.push(this.getPathWithPageNumber(`${degree.path}/${attendance.path}/${discipline.path}`, pageNumber));
53
+ }
54
54
  }
55
55
  }
56
56
  }