@kth/om-kursen-ladok-client 1.3.5 → 1.3.7

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 (52) hide show
  1. package/dist/createApiClient.js +3 -78
  2. package/dist/createApiClient.js.map +1 -1
  3. package/dist/groupSearchResults.d.ts +8 -1
  4. package/dist/groupSearchResults.js +9 -2
  5. package/dist/groupSearchResults.js.map +1 -1
  6. package/dist/mapCourse.d.ts +11 -12
  7. package/dist/mapCourse.js +24 -13
  8. package/dist/mapCourse.js.map +1 -1
  9. package/dist/mapSearchResult.d.ts +1 -1
  10. package/dist/mapSearchResult.js +4 -3
  11. package/dist/mapSearchResult.js.map +1 -1
  12. package/dist/{mapCourseInstans.d.ts → mapStructurePartVersions.d.ts} +4 -0
  13. package/dist/{mapCourseInstans.js → mapStructurePartVersions.js} +7 -1
  14. package/dist/mapStructurePartVersions.js.map +1 -0
  15. package/dist/search/SearchError.d.ts +32 -0
  16. package/dist/search/SearchError.js +51 -0
  17. package/dist/search/SearchError.js.map +1 -0
  18. package/dist/search/createSearchApi.d.ts +3 -0
  19. package/dist/search/createSearchApi.js +103 -0
  20. package/dist/search/createSearchApi.js.map +1 -0
  21. package/dist/search/types.d.ts +21 -0
  22. package/dist/search/types.js +3 -0
  23. package/dist/search/types.js.map +1 -0
  24. package/dist/search/utils/getAllEntitiesByUseOfContinuation.d.ts +18 -0
  25. package/dist/search/utils/getAllEntitiesByUseOfContinuation.js +49 -0
  26. package/dist/search/utils/getAllEntitiesByUseOfContinuation.js.map +1 -0
  27. package/dist/search/utils/searchUtils.d.ts +18 -0
  28. package/dist/search/utils/searchUtils.js +87 -0
  29. package/dist/search/utils/searchUtils.js.map +1 -0
  30. package/dist/types/OmKursenLadokApiClient.d.ts +2 -12
  31. package/dist/utils/errorUtils.d.ts +14 -0
  32. package/dist/utils/errorUtils.js +50 -0
  33. package/dist/utils/errorUtils.js.map +1 -0
  34. package/dist/utils/index.d.ts +1 -0
  35. package/dist/utils/index.js +1 -0
  36. package/dist/utils/index.js.map +1 -1
  37. package/dist/utils/periodUtil.d.ts +1 -1
  38. package/dist/utils/periodUtil.js +2 -4
  39. package/dist/utils/periodUtil.js.map +1 -1
  40. package/dist/utils/programStrukturUtil.d.ts +25 -74
  41. package/dist/utils/programStrukturUtil.js +100 -43
  42. package/dist/utils/programStrukturUtil.js.map +1 -1
  43. package/dist/utils/programUtil.d.ts +0 -2
  44. package/dist/utils/programUtil.js +4 -15
  45. package/dist/utils/programUtil.js.map +1 -1
  46. package/dist/utils/studyYearUtil.d.ts +4 -21
  47. package/dist/utils/studyYearUtil.js.map +1 -1
  48. package/dist/utils/versionUtils.d.ts +28 -0
  49. package/dist/utils/versionUtils.js +58 -0
  50. package/dist/utils/versionUtils.js.map +1 -0
  51. package/package.json +3 -3
  52. package/dist/mapCourseInstans.js.map +0 -1
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createSearchApi = void 0;
13
+ const searchUtils_1 = require("./utils/searchUtils");
14
+ const SearchError_1 = require("./SearchError");
15
+ const getAllEntitiesByUseOfContinuation_1 = require("./utils/getAllEntitiesByUseOfContinuation");
16
+ const mapSearchResult_1 = require("../mapSearchResult");
17
+ const groupSearchResults_1 = require("../groupSearchResults");
18
+ const errorUtils_1 = require("../utils/errorUtils");
19
+ const mapCourse_1 = require("../mapCourse");
20
+ const gradingScalesUtils_1 = require("../utils/gradingScalesUtils");
21
+ const utils_1 = require("../utils");
22
+ const createSearchApi = (ladokClient) => {
23
+ return {
24
+ searchCourses: (searchParams, language) => __awaiter(void 0, void 0, void 0, function* () {
25
+ try {
26
+ (0, searchUtils_1.validateSearchParams)(searchParams);
27
+ const utbildningstyper = yield extractUtbildningstypItems(ladokClient.utbildningstyp()); // TODO: Use cached values
28
+ const { requestQuery, filterPeriod } = (0, searchUtils_1.prepareSearchRequestQueryForKursTillfallen)(utbildningstyper, searchParams);
29
+ const allCourses = yield (0, getAllEntitiesByUseOfContinuation_1.getAllEntitiesByUseOfContinuation)(ladokClient.sokKursTillfalleSlim, requestQuery);
30
+ const mappedCourses = allCourses.map(course => (0, mapSearchResult_1.mapKursTillfalleResult)(course, language));
31
+ const groupedCourses = (0, groupSearchResults_1.groupSearchResults)(mappedCourses, filterPeriod);
32
+ return { searchHits: groupedCourses };
33
+ }
34
+ catch (error) {
35
+ const searchError = (0, errorUtils_1.toSearchError)(error);
36
+ return {
37
+ searchHits: [],
38
+ errorCode: searchError.errorCode,
39
+ };
40
+ }
41
+ }),
42
+ searchCourseVersions: (searchParams, language) => __awaiter(void 0, void 0, void 0, function* () {
43
+ try {
44
+ (0, searchUtils_1.validateSearchParams)(searchParams);
45
+ const requestQueryForKursInstans = (0, searchUtils_1.prepareSearchRequestQueryForKursInstans)(searchParams);
46
+ const allCourses = yield (0, getAllEntitiesByUseOfContinuation_1.getAllEntitiesByUseOfContinuation)(ladokClient.sokUtbildningsInstansSlim, requestQueryForKursInstans);
47
+ const gradingScalesCodes = yield (0, gradingScalesUtils_1.getGradingScalesCodes)(ladokClient); // TODO: Use cached values
48
+ // TODO Benni: maybe do the mapping after the filtering?
49
+ const mappedCourses = allCourses.map(course => (0, mapCourse_1.mapCourse)(course, language, gradingScalesCodes));
50
+ const latestCourses = findLatestCourses(mappedCourses);
51
+ // TODO Benni: should use mapBasicCourse instead of this
52
+ const basicCourses = latestCourses.map(course => {
53
+ return {
54
+ uid: course.uid,
55
+ versionsnummer: course === null || course === void 0 ? void 0 : course.versionsnummer,
56
+ kod: course.kod,
57
+ benamning: course.benamning,
58
+ omfattning: course.omfattning,
59
+ };
60
+ });
61
+ return { searchHits: basicCourses };
62
+ }
63
+ catch (error) {
64
+ const searchError = (0, errorUtils_1.toSearchError)(error);
65
+ return {
66
+ searchHits: [],
67
+ errorCode: searchError.errorCode,
68
+ };
69
+ }
70
+ }),
71
+ };
72
+ };
73
+ exports.createSearchApi = createSearchApi;
74
+ /**
75
+ * This function extracts the utbildningstyp items from the API response.
76
+ * It throws an error if the response is invalid or if the data is not present.
77
+ * @param utbildningstypApiCall
78
+ * @returns
79
+ */
80
+ const extractUtbildningstypItems = (utbildningstypApiCall) => __awaiter(void 0, void 0, void 0, function* () {
81
+ const utbildningstypResponse = yield utbildningstypApiCall;
82
+ // TODO Benni: this can be refactored more, e.g. enum for type
83
+ if (utbildningstypResponse.type === 'error' || !(utbildningstypResponse === null || utbildningstypResponse === void 0 ? void 0 : utbildningstypResponse.data)) {
84
+ throw SearchError_1.SearchError.unknown(`Failed to fetch valid utbildningstyp data: ${utbildningstypResponse.responseInfo.message}`);
85
+ }
86
+ return utbildningstypResponse.data.Utbildningstyp;
87
+ });
88
+ // TODO Benni: refactor and possibly move
89
+ const findLatestCourses = (mappedCourses) => {
90
+ const coursesGroupedByKurskod = new Map();
91
+ for (const course of mappedCourses) {
92
+ if (!coursesGroupedByKurskod.has(course.kod)) {
93
+ coursesGroupedByKurskod.set(course.kod, []);
94
+ }
95
+ coursesGroupedByKurskod.get(course.kod).push(course);
96
+ }
97
+ const courseVersionsGroupedByKurskodArray = Array.from(coursesGroupedByKurskod.entries()).map(([, value]) => value);
98
+ const latestDefinedCourses = courseVersionsGroupedByKurskodArray
99
+ .map(courses => (0, utils_1.findLatestVersion)(courses))
100
+ .filter(course => course !== undefined);
101
+ return latestDefinedCourses;
102
+ };
103
+ //# sourceMappingURL=createSearchApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSearchApi.js","sourceRoot":"","sources":["../../src/search/createSearchApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { GroupedCourseSearchResult } from '../groupSearchResults';
2
+ import { BasicCourse } from '../mapCourse';
3
+ import { Language } from '../utils';
4
+ export type SearchApi = {
5
+ searchCourses: (searchParams: SearchParams, language: Language) => Promise<{
6
+ searchHits?: GroupedCourseSearchResult[] | [];
7
+ errorCode?: string;
8
+ } | string>;
9
+ searchCourseVersions: (searchParams: SearchParams, language: Language) => Promise<{
10
+ searchHits?: BasicCourse[];
11
+ errorCode?: string;
12
+ } | string>;
13
+ };
14
+ export type SearchParams = {
15
+ kodEllerBenamning?: string;
16
+ organisation?: string;
17
+ sprak?: string;
18
+ avvecklad?: string;
19
+ startPeriod?: string[];
20
+ utbildningsniva?: string[];
21
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/search/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { MellanlagringSearchResponse } from '@kth/ladok-mellanlager-client';
2
+ export type RequestQuery = {
3
+ attributVarden: string;
4
+ instansAttributVarden: string;
5
+ antalTraffar: string;
6
+ avvecklad?: string | undefined;
7
+ sprak?: string | undefined;
8
+ organisation?: string | undefined;
9
+ utbildningsniva: string;
10
+ kodEllerBenamning: string;
11
+ } & ({
12
+ startPeriod: string;
13
+ } | {
14
+ terminkodStart: string;
15
+ });
16
+ export declare const getAllEntitiesByUseOfContinuation: <T>(apiCall: (requestQuery: RequestQuery, requestHeader?: {
17
+ continuationToken?: string;
18
+ }) => Promise<MellanlagringSearchResponse<T>>, requestQuery: any) => Promise<T[]>;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.getAllEntitiesByUseOfContinuation = void 0;
13
+ const SearchError_1 = require("../SearchError");
14
+ const MAX_SEARCH_RESULTS_TO_RETURN = 250;
15
+ const MAX_CONTINUATION_ITERATIONS = 4;
16
+ const getAllEntitiesByUseOfContinuation = (apiCall, requestQuery) => __awaiter(void 0, void 0, void 0, function* () {
17
+ var _a;
18
+ let continuationToken = undefined;
19
+ let iterationCount = 0;
20
+ let allEntities = [];
21
+ do {
22
+ if (iterationCount >= MAX_CONTINUATION_ITERATIONS) {
23
+ throw SearchError_1.SearchError.overflow(`Maximum number of continuation iterations reached: ${MAX_CONTINUATION_ITERATIONS}`);
24
+ }
25
+ const requestHeader = Object.assign({}, (continuationToken !== null && continuationToken !== undefined && { continuationToken }));
26
+ const result = yield apiCall(requestQuery, requestHeader);
27
+ // TODO Benni If we get this error after a few continuations, what should happen? At least error log
28
+ if (typeof result === 'string') {
29
+ throw SearchError_1.SearchError.unknown(result);
30
+ }
31
+ // TODO Benni If we get this error after a few continuations, what should happen? At least error log
32
+ if (result.type === 'error') {
33
+ throw SearchError_1.SearchError.unknown(result.responseInfo.message);
34
+ }
35
+ if (result.searchMeta.pageResultSize === 0) {
36
+ // TODO Benni: can we occur this on the last continuationToken? Check here whether we have allCourses at all or not
37
+ return [];
38
+ }
39
+ allEntities = allEntities.concat(result.items);
40
+ if (allEntities.length > MAX_SEARCH_RESULTS_TO_RETURN) {
41
+ throw SearchError_1.SearchError.overflow(`Maximum number of entities exceeded: ${allEntities.length}`);
42
+ }
43
+ continuationToken = (_a = result.searchMeta.continuationToken) !== null && _a !== void 0 ? _a : undefined;
44
+ iterationCount++;
45
+ } while (continuationToken);
46
+ return allEntities;
47
+ });
48
+ exports.getAllEntitiesByUseOfContinuation = getAllEntitiesByUseOfContinuation;
49
+ //# sourceMappingURL=getAllEntitiesByUseOfContinuation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getAllEntitiesByUseOfContinuation.js","sourceRoot":"","sources":["../../../src/search/utils/getAllEntitiesByUseOfContinuation.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,gDAA4C;AAE5C,MAAM,4BAA4B,GAAG,GAAG,CAAA;AACxC,MAAM,2BAA2B,GAAG,CAAC,CAAA;AAqB9B,MAAM,iCAAiC,GAAG,CAC/C,OAK4C,EAC5C,YAAiB,EACH,EAAE;;IAChB,IAAI,iBAAiB,GAAuB,SAAS,CAAA;IACrD,IAAI,cAAc,GAAG,CAAC,CAAA;IACtB,IAAI,WAAW,GAAQ,EAAE,CAAA;IAEzB,GAAG,CAAC;QACF,IAAI,cAAc,IAAI,2BAA2B,EAAE,CAAC;YAClD,MAAM,yBAAW,CAAC,QAAQ,CAAC,sDAAsD,2BAA2B,EAAE,CAAC,CAAA;QACjH,CAAC;QACD,MAAM,aAAa,qBACd,CAAC,iBAAiB,KAAK,IAAI,IAAI,iBAAiB,KAAK,SAAS,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAC5F,CAAA;QACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,aAAa,CAAC,CAAA;QAEzD,oGAAoG;QACpG,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,yBAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACnC,CAAC;QAED,oGAAoG;QACpG,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,MAAM,yBAAW,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;QACxD,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;YAC3C,mHAAmH;YACnH,OAAO,EAAE,CAAA;QACX,CAAC;QAED,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAE9C,IAAI,WAAW,CAAC,MAAM,GAAG,4BAA4B,EAAE,CAAC;YACtD,MAAM,yBAAW,CAAC,QAAQ,CAAC,wCAAwC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAA;QAC1F,CAAC;QAED,iBAAiB,GAAG,MAAA,MAAM,CAAC,UAAU,CAAC,iBAAiB,mCAAI,SAAS,CAAA;QACpE,cAAc,EAAE,CAAA;IAClB,CAAC,QAAQ,iBAAiB,EAAC;IAE3B,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA,CAAA;AAhDY,QAAA,iCAAiC,qCAgD7C"}
@@ -0,0 +1,18 @@
1
+ import { UtbildningstypItem } from '@kth/ladok-mellanlager-client';
2
+ import { SearchParams } from '../types';
3
+ import { RequestQuery } from './getAllEntitiesByUseOfContinuation';
4
+ /**
5
+ * Throws an error if the searchParams are invalid.
6
+ * @param searchParams
7
+ */
8
+ export declare const validateSearchParams: (searchParams: SearchParams) => void;
9
+ export declare const prepareSearchRequestQueryForKursTillfallen: (utbildningstyper: UtbildningstypItem[], searchParams: SearchParams) => {
10
+ requestQuery: RequestQuery;
11
+ filterPeriod: boolean;
12
+ };
13
+ export declare const prepareSearchRequestQueryForKursInstans: (searchParams: SearchParams) => {
14
+ kodEllerBenamning: string | undefined;
15
+ antalTraffar: string;
16
+ avvecklad: string;
17
+ utbildningstypgrundtyp: string;
18
+ };
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareSearchRequestQueryForKursInstans = exports.prepareSearchRequestQueryForKursTillfallen = exports.validateSearchParams = void 0;
4
+ const SearchError_1 = require("../SearchError");
5
+ const utils_1 = require("../../utils");
6
+ const ladok_attributvarde_utils_1 = require("@kth/ladok-attributvarde-utils");
7
+ /**
8
+ * Throws an error if the searchParams are invalid.
9
+ * @param searchParams
10
+ */
11
+ const validateSearchParams = (searchParams) => {
12
+ const { kodEllerBenamning, organisation, sprak, startPeriod, utbildningsniva, avvecklad } = searchParams;
13
+ if (!avvecklad && !kodEllerBenamning && !organisation && !sprak && !startPeriod && !utbildningsniva) {
14
+ throw SearchError_1.SearchError.noRestrictions();
15
+ }
16
+ if (kodEllerBenamning && kodEllerBenamning.length < 3) {
17
+ throw SearchError_1.SearchError.kodEllerBenamning();
18
+ }
19
+ };
20
+ exports.validateSearchParams = validateSearchParams;
21
+ const MAX_ANTAL_TRAFFAR = '100';
22
+ const DEFAULT_QUERY_PARAMS = {
23
+ attributVarden: 'utbildningstyp,utbildning.lokalt.attribut.29.malgrupp.sv,utbildning.lokalt.attribut.29.malgrupp.en,utbildning.lokalt.attribut.29.kortnamn.sv,utbildning.lokalt.attribut.29.kortnamn.en,utbildning.lokalt.attribut.29.urvalskriterier.sv,utbildning.lokalt.attribut.29.urvalskriterier.en,utbildning.attribut.undervisningsform,utbildning.attribut.undervisningstid,utbildning.attribut.undervisningssprak,utbildning.attribut.studieort,utbildning.attribut.finansieringsform,utbildning.attribut.studietakt,status,installt,utbildning.attribut.utbildningstillfalleskod,utbildning.lokalt.attribut.29.minantalplatser,utbildning.attribut.utbildningsplatser,utbildning.attribut.organisation,utbildning.attribut.startperiod',
24
+ instansAttributVarden: 'utbildningstyp,',
25
+ antalTraffar: MAX_ANTAL_TRAFFAR,
26
+ };
27
+ const prepareSearchRequestQueryForKursTillfallen = (utbildningstyper, searchParams) => {
28
+ const { kodEllerBenamning, organisation, sprak, startPeriod, utbildningsniva, avvecklad } = searchParams;
29
+ const educationalTypes = filterAndMapEducationalTypes({ utbildningsniva, utbildningstyper });
30
+ const filterPeriod = !Boolean(startPeriod);
31
+ const requestQuery = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ kodEllerBenamning: kodEllerBenamning !== null && kodEllerBenamning !== void 0 ? kodEllerBenamning : '*' }, getStartPeriodOrTerminkodStart(startPeriod)), (educationalTypes && { utbildningsniva: educationalTypes.join(',') })), (organisation && { organisation })), (sprak && { sprak })), (avvecklad && { avvecklad })), DEFAULT_QUERY_PARAMS);
32
+ return { requestQuery, filterPeriod }; // TODO Benni this does two things, filterPeriod should probably be split out
33
+ };
34
+ exports.prepareSearchRequestQueryForKursTillfallen = prepareSearchRequestQueryForKursTillfallen;
35
+ const prepareSearchRequestQueryForKursInstans = (searchParams) => {
36
+ const requestQuery = {
37
+ kodEllerBenamning: searchParams.kodEllerBenamning,
38
+ antalTraffar: MAX_ANTAL_TRAFFAR,
39
+ avvecklad: 'false',
40
+ utbildningstypgrundtyp: 'KURS',
41
+ };
42
+ return requestQuery;
43
+ };
44
+ exports.prepareSearchRequestQueryForKursInstans = prepareSearchRequestQueryForKursInstans;
45
+ const filterAndMapEducationalTypes = ({ utbildningsniva, utbildningstyper: ladokTypes, }) => {
46
+ if (!utbildningsniva)
47
+ return [];
48
+ const preparatoryTypes = [ladok_attributvarde_utils_1.EDUCATIONAL_TYPE_CODE_FOR_PREPARATORY_LEVEL]; // Hard coded
49
+ const basicTypes = ladokTypes
50
+ .filter(typ => String(typ.NivaInomStudieordningID) === ladok_attributvarde_utils_1.EducationalLevelCode.Basic)
51
+ .map(x => x.Kod);
52
+ const advancedTypes = ladokTypes
53
+ .filter(typ => String(typ.NivaInomStudieordningID) === ladok_attributvarde_utils_1.EducationalLevelCode.Advanced)
54
+ .map(x => x.Kod);
55
+ const researchTypes = ladokTypes
56
+ .filter(typ => String(typ.NivaInomStudieordningID) === ladok_attributvarde_utils_1.EducationalLevelCode.Research)
57
+ .map(x => x.Kod);
58
+ const levelMap = new Map([
59
+ [ladok_attributvarde_utils_1.EducationalLevelCode.Preparatory, preparatoryTypes],
60
+ [ladok_attributvarde_utils_1.EducationalLevelCode.Basic, basicTypes],
61
+ [ladok_attributvarde_utils_1.EducationalLevelCode.Advanced, advancedTypes],
62
+ [ladok_attributvarde_utils_1.EducationalLevelCode.Research, researchTypes],
63
+ ]);
64
+ return utbildningsniva === null || utbildningsniva === void 0 ? void 0 : utbildningsniva.flatMap(level => levelMap.get(level) || []);
65
+ };
66
+ /**
67
+ * If startPeriod is defined, returns it as an object with startPeriod property and comma-separated values.
68
+ * If not, returns an object with terminkodStart property and the default period.
69
+ * @param startPeriod array of start periods
70
+ * @returns
71
+ */
72
+ const getStartPeriodOrTerminkodStart = (startPeriod) => {
73
+ if (startPeriod && startPeriod.length > 0) {
74
+ return { startPeriod: startPeriod.join(',') };
75
+ }
76
+ return { terminkodStart: getDefaultPeriod() };
77
+ };
78
+ /**
79
+ *
80
+ * @returns the default period code based on the current date.
81
+ */
82
+ const getDefaultPeriod = () => {
83
+ const now = new Date();
84
+ const defaultPeriod = (0, utils_1.getPeriodCodeForDate)(now);
85
+ return defaultPeriod;
86
+ };
87
+ //# sourceMappingURL=searchUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchUtils.js","sourceRoot":"","sources":["../../../src/search/utils/searchUtils.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { MellanlagringResponse, ResponseInfo } from '@kth/ladok-mellanlager-client';
2
- import { GroupedCourseSearchResult } from '../groupSearchResults';
3
2
  import { Course } from '../mapCourse';
4
3
  import { CourseRound } from '../mapCourseRound';
5
4
  import { Language } from '../utils';
@@ -8,19 +7,10 @@ import { KursPlan } from '../mapCourseSyllabus';
8
7
  import { Period } from '@kth/ladok-mellanlager-client/dist/types/endpoints/period';
9
8
  import { ProgramInstans } from '../mapProgramInstans';
10
9
  import { ProgramTillfalle } from '../mapProgramTillfalle';
10
+ import { SearchApi } from '../search/types';
11
11
  export type OmKursenLadokApiClient = {
12
12
  getLatestCourseVersion: (courseCode: string, language: Language) => Promise<(Course & ResponseInfo) | ResponseInfo>;
13
- searchCourses: (searchParams: {
14
- kodEllerBenamning?: string;
15
- organisation?: string;
16
- sprak?: string;
17
- avvecklad?: string;
18
- startPeriod?: string[];
19
- utbildningsniva?: string[];
20
- }, language: Language) => Promise<{
21
- searchHits?: GroupedCourseSearchResult[] | [];
22
- errorCode?: string;
23
- } | string>;
13
+ Search: SearchApi;
24
14
  getActiveCourseRounds: (courseCode: string, language: Language) => Promise<CourseRound[] | undefined>;
25
15
  getActiveAndFutureCourseRounds: (courseCode: string, language: Language) => Promise<CourseRound[] | undefined>;
26
16
  getCourseRoundsFromPeriod: (courseCode: string, fromPeriod: string, language: Language) => Promise<CourseRound[] | undefined>;
@@ -0,0 +1,14 @@
1
+ import { SearchError } from '../search/SearchError';
2
+ /**
3
+ * This function contains a utility to convert an unknown error into a SearchError.
4
+ * This was inspired by this blog post: https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript
5
+ *
6
+ * Currently, the only error type that is used is SearchError.
7
+ * In the future, we might want to add more error types.
8
+ */
9
+ /**
10
+ * This function takes an unknown error and tries to convert it into a SearchError.
11
+ * @param maybeError
12
+ * @returns A SearchError
13
+ */
14
+ export declare const toSearchError: (maybeError: unknown) => SearchError;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toSearchError = void 0;
4
+ const SearchError_1 = require("../search/SearchError");
5
+ /**
6
+ * This function contains a utility to convert an unknown error into a SearchError.
7
+ * This was inspired by this blog post: https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript
8
+ *
9
+ * Currently, the only error type that is used is SearchError.
10
+ * In the future, we might want to add more error types.
11
+ */
12
+ /**
13
+ * This function takes an unknown error and tries to convert it into a SearchError.
14
+ * @param maybeError
15
+ * @returns A SearchError
16
+ */
17
+ const toSearchError = (maybeError) => {
18
+ if (isSearchError(maybeError))
19
+ return maybeError;
20
+ if (isErrorWithMessage(maybeError)) {
21
+ return SearchError_1.SearchError.unknown(maybeError.message);
22
+ }
23
+ return SearchError_1.SearchError.unknown(convertErrorIntoString(maybeError));
24
+ };
25
+ exports.toSearchError = toSearchError;
26
+ const isSearchError = (error) => {
27
+ return (typeof error === 'object' &&
28
+ error !== null &&
29
+ 'name' in error &&
30
+ typeof error.name === 'string' &&
31
+ error.name === 'SearchError' &&
32
+ error instanceof SearchError_1.SearchError);
33
+ };
34
+ function isErrorWithMessage(error) {
35
+ return (typeof error === 'object' &&
36
+ error !== null &&
37
+ 'message' in error &&
38
+ typeof error.message === 'string');
39
+ }
40
+ const convertErrorIntoString = (maybeError) => {
41
+ try {
42
+ return JSON.stringify(maybeError);
43
+ }
44
+ catch (_a) {
45
+ // fallback in case there's an error stringifying the maybeError
46
+ // like with circular references for example.
47
+ return String(maybeError);
48
+ }
49
+ };
50
+ //# sourceMappingURL=errorUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorUtils.js","sourceRoot":"","sources":["../../src/utils/errorUtils.ts"],"names":[],"mappings":";;;AAAA,uDAAmD;AAEnD;;;;;;GAMG;AAEH;;;;GAIG;AACI,MAAM,aAAa,GAAG,CAAC,UAAmB,EAAe,EAAE;IAChE,IAAI,aAAa,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAA;IAEhD,IAAI,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO,yBAAW,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAChD,CAAC;IAED,OAAO,yBAAW,CAAC,OAAO,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAA;AAChE,CAAC,CAAA;AARY,QAAA,aAAa,iBAQzB;AAED,MAAM,aAAa,GAAG,CAAC,KAAc,EAAwB,EAAE;IAC7D,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,OAAQ,KAAiC,CAAC,IAAI,KAAK,QAAQ;QAC3D,KAAK,CAAC,IAAI,KAAK,aAAa;QAC5B,KAAK,YAAY,yBAAW,CAC7B,CAAA;AACH,CAAC,CAAA;AAMD,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,SAAS,IAAI,KAAK;QAClB,OAAQ,KAAiC,CAAC,OAAO,KAAK,QAAQ,CAC/D,CAAA;AACH,CAAC;AAED,MAAM,sBAAsB,GAAG,CAAC,UAAmB,EAAU,EAAE;IAC7D,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;IACnC,CAAC;IAAC,WAAM,CAAC;QACP,gEAAgE;QAChE,6CAA6C;QAC7C,OAAO,MAAM,CAAC,UAAU,CAAC,CAAA;IAC3B,CAAC;AACH,CAAC,CAAA"}
@@ -3,3 +3,4 @@ export * from './languageUtil';
3
3
  export * from './periodUtil';
4
4
  export * from './studyYearUtil';
5
5
  export * from './filterCourseRoundUtils';
6
+ export * from './versionUtils';
@@ -19,4 +19,5 @@ __exportStar(require("./languageUtil"), exports);
19
19
  __exportStar(require("./periodUtil"), exports);
20
20
  __exportStar(require("./studyYearUtil"), exports);
21
21
  __exportStar(require("./filterCourseRoundUtils"), exports);
22
+ __exportStar(require("./versionUtils"), exports);
22
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA0B;AAC1B,iDAA8B;AAC9B,+CAA4B;AAC5B,kDAA+B;AAC/B,2DAAwC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA0B;AAC1B,iDAA8B;AAC9B,+CAA4B;AAC5B,kDAA+B;AAC/B,2DAAwC;AACxC,iDAA8B"}
@@ -13,4 +13,4 @@ export declare const getKthStudyPeriod: (date: Date, startPeriod: {
13
13
  code: string | undefined;
14
14
  startDate: Date | undefined;
15
15
  endDate: Date | undefined;
16
- }, type: "start" | "end") => 4 | 0 | 1 | 2 | 3 | 5 | undefined;
16
+ }, type: "start" | "end") => 0 | 4 | 1 | 2 | 3 | 5 | undefined;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getKthStudyPeriod = exports.getPeriodCodeForDate = exports.findValidProgramForCode = exports.findPeriodByKod = exports.transformDigitsInPeriod = exports.transformPeriodInDigits = exports.parsePeriod = void 0;
4
+ const versionUtils_1 = require("./versionUtils");
4
5
  const parsePeriod = (period) => {
5
6
  const match = period.match(/(VT|HT)(\d{4})/);
6
7
  if (!match) {
@@ -33,9 +34,6 @@ const findPeriodByKod = (kod, periods) => {
33
34
  return periods.find(p => p.Kod === kod);
34
35
  };
35
36
  exports.findPeriodByKod = findPeriodByKod;
36
- const getSortedPrograms = (programs) => {
37
- return [...programs].sort((a, b) => (Number(b.versionsnummer) || 0) - (Number(a.versionsnummer) || 0));
38
- };
39
37
  const isProgramValidForPeriod = (program, periodStart) => {
40
38
  const { giltigFrom } = program;
41
39
  if (!(giltigFrom === null || giltigFrom === void 0 ? void 0 : giltigFrom.startDay) || !(giltigFrom === null || giltigFrom === void 0 ? void 0 : giltigFrom.lastDay))
@@ -48,7 +46,7 @@ const findValidProgramForCode = (code, periods, programs) => {
48
46
  if (!matchedPeriod)
49
47
  return undefined;
50
48
  const periodStart = new Date(matchedPeriod.Giltighetsperiod.Startdatum);
51
- const sortedPrograms = getSortedPrograms(programs);
49
+ const sortedPrograms = (0, versionUtils_1.sortByVersionsnummerDesc)(programs);
52
50
  const validPrograms = sortedPrograms.filter((program, index, arr) => isProgramValidForPeriod(program, periodStart));
53
51
  if (validPrograms.length > 0)
54
52
  return validPrograms[0];
@@ -1 +1 @@
1
- {"version":3,"file":"periodUtil.js","sourceRoot":"","sources":["../../src/utils/periodUtil.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"periodUtil.js","sourceRoot":"","sources":["../../src/utils/periodUtil.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,24 @@
1
1
  import { LadokMellanlagerApiClient, Strukturdel } from '@kth/ladok-mellanlager-client';
2
2
  import { Language } from './languageUtil';
3
3
  import { StructurePartInstance } from '../mapStructureCourses';
4
+ import { StructurePartVersion } from '../mapStructurePartVersions';
5
+ import { StudyYear } from './studyYearUtil';
6
+ export type ProgramCourse = StructurePartVersion & Partial<Omit<StructurePartInstance, 'Tillfallesperioder'>> & {
7
+ Valvillkor: CategorizedStrukturdel['Valvillkor'];
8
+ Tillfallesperioder: Partial<StructurePartInstance['Tillfallesperioder'][number]> & {
9
+ ForstaUndervisningsdatum: string;
10
+ SistaUndervisningsdatum: string;
11
+ }[];
12
+ };
13
+ export type ProgramCurriculumFromStructure = {
14
+ studyYears: StudyYear[];
15
+ } | {
16
+ studyYears: StudyYear[];
17
+ programmeSpecialization: {
18
+ programmeSpecializationCode: string;
19
+ title: string;
20
+ };
21
+ };
4
22
  export declare const handleError: (message: string, error?: any) => {
5
23
  error: string;
6
24
  details: any;
@@ -9,79 +27,12 @@ export declare const fetchStructureByTillfalleUid: (uid: string, ladokClient: La
9
27
  export declare const fetchStructureByInstansUid: (uid: string, ladokClient: LadokMellanlagerApiClient) => Promise<Strukturdel[]>;
10
28
  export declare const fetchStructurePartInstances: (utbildningstillfalleUIDn: string[], ladokClient: LadokMellanlagerApiClient) => Promise<(import("@kth/ladok-mellanlager-client").UtbildningstillfalleSlim | undefined)[]>;
11
29
  export declare const fetchStructurePartsVersions: (utbildningsinstansUIDn: string[], ladokClient: LadokMellanlagerApiClient) => Promise<(import("@kth/ladok-mellanlager-client").UtbildningsinstansSlim | undefined)[]>;
30
+ type CategorizedStrukturdel = Strukturdel & {
31
+ Valvillkor: string;
32
+ };
12
33
  export declare const fetchAndCategorizeStructureParts: (utbildningstillfalleUID: string, language: Language, ladokClient: LadokMellanlagerApiClient) => Promise<{
13
- courseListFromStructure: {
14
- Valvillkor: string;
15
- kod: string;
16
- benamning: string;
17
- utbildningstyp?: import("./languageUtil").TranslatedUtbildningstyp;
18
- utbildningsinstansUid: string;
19
- uid: string;
20
- tillfalleskod: string;
21
- status?: import("@kth/ladok-attributvarde-utils").LadokStatus;
22
- omfattning: {
23
- number: number;
24
- formattedWithUnit: string;
25
- };
26
- startperiod?: import("./languageUtil").TranslatedGrunddata;
27
- Tillfallesperioder: {
28
- ForstaRegistreringsdatum: string;
29
- ForstaUndervisningsdatum: string;
30
- Lasperiodsfordelning?: {
31
- Lasperiodskod: string;
32
- Omfattningsvarde: number;
33
- }[];
34
- Omfattningsvarde: number;
35
- SistaRegistreringsdatum: string;
36
- SistaUndervisningsdatum: string;
37
- }[];
38
- }[];
39
- specializationListFromStructure: StructurePartInstance[];
34
+ structureCourses: ProgramCourse[];
35
+ structureSpecializations: StructurePartInstance[];
40
36
  }>;
41
- export declare const fetchProgramStructure: (utbildningstillfalleUID: string, language: Language, ladokClient: LadokMellanlagerApiClient) => Promise<({
42
- studyYears: {
43
- yearNumber: number;
44
- courses: {
45
- kod: string;
46
- benamning: string;
47
- Valvillkor: string;
48
- omfattning: {
49
- number: number;
50
- formattedWithUnit: string;
51
- };
52
- startperiod?: {
53
- code: string;
54
- };
55
- Tillfallesperioder: {
56
- SistaUndervisningsdatum: string;
57
- }[];
58
- uid: string;
59
- utbildningsinstansUid: string;
60
- }[];
61
- }[];
62
- programmeSpecialization: {
63
- programmeSpecializationCode: string;
64
- title: string;
65
- };
66
- } | {
67
- studyYears: {
68
- yearNumber: number;
69
- courses: {
70
- kod: string;
71
- benamning: string;
72
- Valvillkor: string;
73
- omfattning: {
74
- number: number;
75
- formattedWithUnit: string;
76
- };
77
- startperiod?: {
78
- code: string;
79
- };
80
- Tillfallesperioder: {
81
- SistaUndervisningsdatum: string;
82
- }[];
83
- uid: string;
84
- utbildningsinstansUid: string;
85
- }[];
86
- }[];
87
- })[]>;
37
+ export declare const fetchProgramStructure: (utbildningstillfalleUID: string, language: Language, ladokClient: LadokMellanlagerApiClient) => Promise<ProgramCurriculumFromStructure[]>;
38
+ export {};