diff --git a/backend/src/services/learning-objects/database-learning-object-provider.ts b/backend/src/services/learning-objects/database-learning-object-provider.ts new file mode 100644 index 00000000..85b97614 --- /dev/null +++ b/backend/src/services/learning-objects/database-learning-object-provider.ts @@ -0,0 +1,42 @@ +import {LearningObjectProvider} from "./learning-object-provider"; +import { + FilteredLearningObject, + LearningObjectIdentifier, + LearningPathIdentifier +} from "../../interfaces/learning-content"; + +/** + * Service providing access to data about learning objects from the database + */ +const databaseLearningObjectProvider: LearningObjectProvider = { + /** + * Fetches a single learning object by its HRUID + */ + getLearningObjectById(id: LearningObjectIdentifier): Promise { + return Promise.resolve(null); // TODO + }, + + /** + * Fetch full learning object data (metadata) + */ + getLearningObjectHTML(id: LearningObjectIdentifier): Promise { + return Promise.resolve(null); // TODO + }, + + /** + * Fetch only learning object HRUIDs + */ + getLearningObjectIdsFromPath(id: LearningPathIdentifier): Promise { + return Promise.resolve([]);// TODO + }, + + /** + * Obtain a HTML-rendering of the learning object with the given identifier (as a string). + */ + getLearningObjectsFromPath(id: LearningPathIdentifier): Promise { + return Promise.resolve([]); // TODO + } + +} + +export default databaseLearningObjectProvider; diff --git a/backend/src/services/learning-objects/learning-object-service.ts b/backend/src/services/learning-objects/learning-object-service.ts index 587e8968..51152ec8 100644 --- a/backend/src/services/learning-objects/learning-object-service.ts +++ b/backend/src/services/learning-objects/learning-object-service.ts @@ -5,9 +5,15 @@ import { } from "../../interfaces/learning-content"; import dwengoApiLearningObjectProvider from "./dwengo-api-learning-object-provider"; import {LearningObjectProvider} from "./learning-object-provider"; +import {EnvVars, getEnvVar} from "../../util/envvars"; +import databaseLearningObjectProvider from "./database-learning-object-provider"; function getProvider(id: LearningObjectIdentifier): LearningObjectProvider { - return dwengoApiLearningObjectProvider + if (id.hruid.startsWith(getEnvVar(EnvVars.UserContentPrefix))) { + return databaseLearningObjectProvider; + } else { + return dwengoApiLearningObjectProvider; + } } /** diff --git a/backend/src/services/learning-paths/database-learning-path-provider.ts b/backend/src/services/learning-paths/database-learning-path-provider.ts new file mode 100644 index 00000000..292bb79e --- /dev/null +++ b/backend/src/services/learning-paths/database-learning-path-provider.ts @@ -0,0 +1,23 @@ +import {LearningPathProvider} from "./learning-path-provider"; +import {LearningPath, LearningPathResponse} from "../../interfaces/learning-content"; + +/** + * Service providing access to data about learning paths from the database. + */ +const databaseLearningPathProvider: LearningPathProvider = { + /** + * Fetch the learning paths with the given hruids from the database. + */ + fetchLearningPaths(hruids: string[], language: string, source: string): Promise { + throw new Error("Not yet implemented"); // TODO + }, + + /** + * Search learning paths in the database using the given search string. + */ + searchLearningPaths(query: string, language: string): Promise { + return Promise.resolve([]); // TODO + } +} + +export default databaseLearningPathProvider; diff --git a/backend/src/services/learning-paths/learning-path-service.ts b/backend/src/services/learning-paths/learning-path-service.ts index fd37cd38..a2776554 100644 --- a/backend/src/services/learning-paths/learning-path-service.ts +++ b/backend/src/services/learning-paths/learning-path-service.ts @@ -1,5 +1,13 @@ -import {LearningPath, LearningPathResponse} from "../../interfaces/learning-content"; +import { + LearningPath, + LearningPathResponse +} from "../../interfaces/learning-content"; import dwengoApiLearningPathProvider from "./dwengo-api-learning-path-provider"; +import databaseLearningPathProvider from "./database-learning-path-provider"; +import {EnvVars, getEnvVar} from "../../util/envvars"; + +const userContentPrefix = getEnvVar(EnvVars.UserContentPrefix); +const allProviders = [dwengoApiLearningPathProvider, databaseLearningPathProvider] /** * Service providing access to data about learning paths from the appropriate data source (database or Dwengo-api) @@ -8,15 +16,32 @@ const learningPathService = { /** * Fetch the learning paths with the given hruids from the data source. */ - fetchLearningPaths(hruids: string[], language: string, source: string): Promise { - return dwengoApiLearningPathProvider.fetchLearningPaths(hruids, language, source); + async fetchLearningPaths(hruids: string[], language: string, source: string): Promise { + const userContentHruids = hruids.filter(hruid => hruid.startsWith(userContentPrefix)); + const nonUserContentHruids = hruids.filter(hruid => !hruid.startsWith(userContentPrefix)); + + const userContentLearningPaths = + await databaseLearningPathProvider.fetchLearningPaths(userContentHruids, language, source); + const nonUserContentLearningPaths + = await databaseLearningPathProvider.fetchLearningPaths(nonUserContentHruids, language, source); + + return { + data: (userContentLearningPaths.data || []).concat(nonUserContentLearningPaths.data || []), + source: source, + success: userContentLearningPaths.success || nonUserContentLearningPaths.success + }; }, /** * Search learning paths in the data source using the given search string. */ - searchLearningPaths(query: string, language: string): Promise { - return dwengoApiLearningPathProvider.searchLearningPaths(query, language); + async searchLearningPaths(query: string, language: string): Promise { + const providerResponses = await Promise.all( + allProviders.map( + provider => provider.searchLearningPaths(query, language) + ) + ); + return providerResponses.flat(); } } diff --git a/backend/src/util/envvars.ts b/backend/src/util/envvars.ts index 8cb82487..c6258a30 100644 --- a/backend/src/util/envvars.ts +++ b/backend/src/util/envvars.ts @@ -13,6 +13,7 @@ export const EnvVars: { [key: string]: EnvVar } = { DbUpdate: { key: DB_PREFIX + 'UPDATE', defaultValue: false }, LearningContentRepoApiBaseUrl: { key: PREFIX + "LEARNING_CONTENT_REPO_API_BASE_URL", defaultValue: "https://dwengo.org/backend/api"}, FallbackLanguage: { key: PREFIX + "FALLBACK_LANGUAGE", defaultValue: "nl" }, + UserContentPrefix: { key: DB_PREFIX + 'USER_CONTENT_PREFIX', defaultValue: "u_" }, } as const; /**