@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.
- package/dist/createApiClient.js +3 -78
- package/dist/createApiClient.js.map +1 -1
- package/dist/groupSearchResults.d.ts +8 -1
- package/dist/groupSearchResults.js +9 -2
- package/dist/groupSearchResults.js.map +1 -1
- package/dist/mapCourse.d.ts +11 -12
- package/dist/mapCourse.js +24 -13
- package/dist/mapCourse.js.map +1 -1
- package/dist/mapSearchResult.d.ts +1 -1
- package/dist/mapSearchResult.js +4 -3
- package/dist/mapSearchResult.js.map +1 -1
- package/dist/{mapCourseInstans.d.ts → mapStructurePartVersions.d.ts} +4 -0
- package/dist/{mapCourseInstans.js → mapStructurePartVersions.js} +7 -1
- package/dist/mapStructurePartVersions.js.map +1 -0
- package/dist/search/SearchError.d.ts +32 -0
- package/dist/search/SearchError.js +51 -0
- package/dist/search/SearchError.js.map +1 -0
- package/dist/search/createSearchApi.d.ts +3 -0
- package/dist/search/createSearchApi.js +103 -0
- package/dist/search/createSearchApi.js.map +1 -0
- package/dist/search/types.d.ts +21 -0
- package/dist/search/types.js +3 -0
- package/dist/search/types.js.map +1 -0
- package/dist/search/utils/getAllEntitiesByUseOfContinuation.d.ts +18 -0
- package/dist/search/utils/getAllEntitiesByUseOfContinuation.js +49 -0
- package/dist/search/utils/getAllEntitiesByUseOfContinuation.js.map +1 -0
- package/dist/search/utils/searchUtils.d.ts +18 -0
- package/dist/search/utils/searchUtils.js +87 -0
- package/dist/search/utils/searchUtils.js.map +1 -0
- package/dist/types/OmKursenLadokApiClient.d.ts +2 -12
- package/dist/utils/errorUtils.d.ts +14 -0
- package/dist/utils/errorUtils.js +50 -0
- package/dist/utils/errorUtils.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/periodUtil.d.ts +1 -1
- package/dist/utils/periodUtil.js +2 -4
- package/dist/utils/periodUtil.js.map +1 -1
- package/dist/utils/programStrukturUtil.d.ts +25 -74
- package/dist/utils/programStrukturUtil.js +100 -43
- package/dist/utils/programStrukturUtil.js.map +1 -1
- package/dist/utils/programUtil.d.ts +0 -2
- package/dist/utils/programUtil.js +4 -15
- package/dist/utils/programUtil.js.map +1 -1
- package/dist/utils/studyYearUtil.d.ts +4 -21
- package/dist/utils/studyYearUtil.js.map +1 -1
- package/dist/utils/versionUtils.d.ts +28 -0
- package/dist/utils/versionUtils.js +58 -0
- package/dist/utils/versionUtils.js.map +1 -0
- package/package.json +3 -3
- 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 @@
|
|
|
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
|
-
|
|
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"}
|
package/dist/utils/index.d.ts
CHANGED
package/dist/utils/index.js
CHANGED
|
@@ -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
|
package/dist/utils/index.js.map
CHANGED
|
@@ -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") =>
|
|
16
|
+
}, type: "start" | "end") => 0 | 4 | 1 | 2 | 3 | 5 | undefined;
|
package/dist/utils/periodUtil.js
CHANGED
|
@@ -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 =
|
|
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":";;;
|
|
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
|
-
|
|
14
|
-
|
|
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
|
-
|
|
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 {};
|