diff --git a/src/addons/coursecompletion/services/coursecompletion.ts b/src/addons/coursecompletion/services/coursecompletion.ts index 76feeecd4..488c1d7af 100644 --- a/src/addons/coursecompletion/services/coursecompletion.ts +++ b/src/addons/coursecompletion/services/coursecompletion.ts @@ -17,12 +17,11 @@ import { CoreLogger } from '@singletons/logger'; import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; import { CoreUtils } from '@services/utils/utils'; import { CoreCourses } from '@features/courses/services/courses'; -import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; +import { CoreSite, CoreSiteWSPreSets, WSObservable } from '@classes/site'; import { CoreStatusWithWarningsWSResponse, CoreWSExternalWarning } from '@services/ws'; import { makeSingleton } from '@singletons'; import { CoreError } from '@classes/errors/error'; import { asyncObservable, firstValueFrom } from '@/core/utils/rxjs'; -import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; const ROOT_CACHE_KEY = 'mmaCourseCompletion:'; @@ -119,7 +118,7 @@ export class AddonCourseCompletionProvider { getCompletionObservable( courseId: number, options: AddonCourseCompletionGetCompletionOptions = {}, - ): Observable { + ): WSObservable { return asyncObservable(async () => { const site = await CoreSites.getSite(options.siteId); diff --git a/src/core/classes/site.ts b/src/core/classes/site.ts index dfbeef584..e0dcf4853 100644 --- a/src/core/classes/site.ts +++ b/src/core/classes/site.ts @@ -125,7 +125,7 @@ export class CoreSite { protected lastAutoLogin = 0; protected offlineDisabled = false; // eslint-disable-next-line @typescript-eslint/no-explicit-any - protected ongoingRequests: { [cacheId: string]: Observable } = {}; + protected ongoingRequests: { [cacheId: string]: WSObservable } = {}; protected requestQueue: RequestQueueItem[] = []; protected requestQueueTimeout: number | null = null; protected tokenPluginFileWorks?: boolean; @@ -504,10 +504,10 @@ export class CoreSite { * @param method WS method to use. * @param data Data to send to the WS. * @param preSets Extra options. - * @return Observable. + * @return Observable returning the WS data. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any - readObservable(method: string, data: any, preSets?: CoreSiteWSPreSets): Observable { + readObservable(method: string, data: any, preSets?: CoreSiteWSPreSets): WSObservable { preSets = preSets || {}; preSets.getFromCache = preSets.getFromCache ?? true; preSets.saveToCache = preSets.saveToCache ?? true; @@ -535,10 +535,10 @@ export class CoreSite { * @param method WS method to use. * @param data Data to send to the WS. * @param preSets Extra options. - * @return Observable. + * @return Observable returning the WS data. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any - writeObservable(method: string, data: any, preSets?: CoreSiteWSPreSets): Observable { + writeObservable(method: string, data: any, preSets?: CoreSiteWSPreSets): WSObservable { preSets = preSets || {}; preSets.getFromCache = preSets.getFromCache ?? false; preSets.saveToCache = preSets.saveToCache ?? false; @@ -566,7 +566,7 @@ export class CoreSite { * @param method The WebService method to be called. * @param data Arguments to pass to the method. * @param preSets Extra options. - * @return Observable + * @return Observable returning the WS data. * @description * * Sends a webservice request to the site. This method will automatically add the @@ -576,7 +576,7 @@ export class CoreSite { * data hasn't expired. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any - requestObservable(method: string, data: any, preSets: CoreSiteWSPreSets): Observable { + requestObservable(method: string, data: any, preSets: CoreSiteWSPreSets): WSObservable { if (this.isLoggedOut() && !ALLOWED_LOGGEDOUT_WS.includes(method)) { // Site is logged out, it cannot call WebServices. CoreEvents.trigger(CoreEvents.SESSION_EXPIRED, {}, this.id); @@ -665,14 +665,14 @@ export class CoreSite { * @param data Arguments to pass to the method. * @param preSets Extra options related to the site. * @param wsPreSets Extra options related to the WS call. - * @return Observable. + * @return Observable returning the WS data. */ protected performRequest( method: string, data: unknown, preSets: CoreSiteWSPreSets, wsPreSets: CoreWSPreSets, - ): Observable { + ): WSObservable { const subject = new Subject(); const run = async () => { @@ -1903,9 +1903,9 @@ export class CoreSite { * @param readingStrategy Reading strategy. * @return Observable returning site config. */ - getConfigObservable(name?: undefined, readingStrategy?: CoreSitesReadingStrategy): Observable; - getConfigObservable(name: string, readingStrategy?: CoreSitesReadingStrategy): Observable; - getConfigObservable(name?: string, readingStrategy?: CoreSitesReadingStrategy): Observable { + getConfigObservable(name?: undefined, readingStrategy?: CoreSitesReadingStrategy): WSObservable; + getConfigObservable(name: string, readingStrategy?: CoreSitesReadingStrategy): WSObservable; + getConfigObservable(name?: string, readingStrategy?: CoreSitesReadingStrategy): WSObservable { const preSets: CoreSiteWSPreSets = { cacheKey: this.getConfigCacheKey(), ...CoreSites.getReadingStrategyPreSets(readingStrategy), @@ -2403,7 +2403,7 @@ export function chainRequests>( readingStrategy: CoreSitesReadingStrategy | undefined, callback: (data: T, readingStrategy?: CoreSitesReadingStrategy) => O, ): OperatorFunction> { - return (source: Observable) => new Observable<{ data: T; readingStrategy?: CoreSitesReadingStrategy }>(subscriber => { + return (source: WSObservable) => new Observable<{ data: T; readingStrategy?: CoreSitesReadingStrategy }>(subscriber => { let firstValue = true; let isCompleted = false; diff --git a/src/core/features/course/services/course.ts b/src/core/features/course/services/course.ts index d382d49be..16a680440 100644 --- a/src/core/features/course/services/course.ts +++ b/src/core/features/course/services/course.ts @@ -21,7 +21,7 @@ import { CoreLogger } from '@singletons/logger'; import { CoreSitesCommonWSOptions, CoreSites, CoreSitesReadingStrategy } from '@services/sites'; import { CoreTimeUtils } from '@services/utils/time'; import { CoreUtils } from '@services/utils/utils'; -import { CoreSiteWSPreSets, CoreSite } from '@classes/site'; +import { CoreSiteWSPreSets, CoreSite, WSObservable } from '@classes/site'; import { CoreConstants } from '@/core/constants'; import { makeSingleton, Translate } from '@singletons'; import { CoreStatusWithWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; @@ -54,7 +54,6 @@ import { CoreDatabaseCachingStrategy } from '@classes/database/database-table-pr import { SQLiteDB } from '@classes/sqlitedb'; import { CorePlatform } from '@services/platform'; import { CoreTime } from '@singletons/time'; -import { Observable } from 'rxjs'; import { asyncObservable, firstValueFrom } from '@/core/utils/rxjs'; import { map } from 'rxjs/operators'; @@ -417,7 +416,7 @@ export class CoreCourseProvider { * @return Observable that returns the blocks. * @since 3.7 */ - getCourseBlocksObservable(courseId: number, options: CoreSitesCommonWSOptions = {}): Observable { + getCourseBlocksObservable(courseId: number, options: CoreSitesCommonWSOptions = {}): WSObservable { return asyncObservable(async () => { const site = await CoreSites.getSite(options.siteId); @@ -955,7 +954,7 @@ export class CoreCourseProvider { getSectionsObservable( courseId: number, options: CoreCourseGetSectionsOptions = {}, - ): Observable { + ): WSObservable { options.includeStealthModules = options.includeStealthModules ?? true; return asyncObservable(async () => { diff --git a/src/core/features/courses/services/courses-helper.ts b/src/core/features/courses/services/courses-helper.ts index 4e81eac5c..b2cfe3ca8 100644 --- a/src/core/features/courses/services/courses-helper.ts +++ b/src/core/features/courses/services/courses-helper.ts @@ -26,10 +26,10 @@ import { makeSingleton, Translate } from '@singletons'; import { CoreWSExternalFile } from '@services/ws'; import { AddonCourseCompletion } from '@addons/coursecompletion/services/coursecompletion'; import moment from 'moment-timezone'; -import { Observable, of } from 'rxjs'; +import { of } from 'rxjs'; import { firstValueFrom, zipIncludingComplete } from '@/core/utils/rxjs'; import { catchError, map } from 'rxjs/operators'; -import { chainRequests } from '@classes/site'; +import { chainRequests, WSObservable } from '@classes/site'; /** * Helper to gather some common courses functions. @@ -134,7 +134,7 @@ export class CoreCoursesHelperProvider { courses: CoreEnrolledCourseDataWithExtraInfo[], loadCategoryNames: boolean = false, options: CoreSitesCommonWSOptions = {}, - ): Observable { + ): WSObservable { if (!courses.length) { return of([]); } @@ -245,7 +245,7 @@ export class CoreCoursesHelperProvider { */ getUserCoursesWithOptionsObservable( options: CoreCoursesGetWithOptionsOptions = {}, - ): Observable { + ): WSObservable { return CoreCourses.getUserCoursesObservable(options).pipe( chainRequests(options.readingStrategy, (courses, newReadingStrategy) => { @@ -338,7 +338,7 @@ export class CoreCoursesHelperProvider { protected loadCourseCompletedStatus( course: CoreEnrolledCourseDataWithExtraInfo, options: CoreSitesCommonWSOptions = {}, - ): Observable { + ): WSObservable { if (course.completed !== undefined) { // The WebService already returns the completed status, no need to fetch it. return of(course); diff --git a/src/core/features/courses/services/courses.ts b/src/core/features/courses/services/courses.ts index 6c4ea9e43..753605724 100644 --- a/src/core/features/courses/services/courses.ts +++ b/src/core/features/courses/services/courses.ts @@ -14,14 +14,14 @@ import { Injectable } from '@angular/core'; import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites'; -import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; +import { CoreSite, CoreSiteWSPreSets, WSObservable } from '@classes/site'; import { makeSingleton } from '@singletons'; import { CoreStatusWithWarningsWSResponse, CoreWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; import { CoreEvents } from '@singletons/events'; import { CoreWSError } from '@classes/errors/wserror'; import { CoreCourseAnyCourseDataWithExtraInfoAndOptions, CoreCourseWithImageAndColor } from './courses-helper'; import { asyncObservable, firstValueFrom, ignoreErrors, zipIncludingComplete } from '@/core/utils/rxjs'; -import { of, Observable } from 'rxjs'; +import { of } from 'rxjs'; import { map } from 'rxjs/operators'; const ROOT_CACHE_KEY = 'mmCourses:'; @@ -510,7 +510,7 @@ export class CoreCoursesProvider { field: string = '', value: string | number = '', options: CoreSitesCommonWSOptions = {}, - ): Observable { + ): WSObservable { return asyncObservable(async () => { const siteId = options.siteId || CoreSites.getCurrentSiteId(); const originalValue = value; @@ -617,7 +617,7 @@ export class CoreCoursesProvider { customFieldName: string, customFieldValue: string, options: CoreSitesCommonWSOptions, - ): Observable { + ): WSObservable { return asyncObservable(async () => { const site = await CoreSites.getSite(options. siteId); @@ -685,7 +685,7 @@ export class CoreCoursesProvider { getCoursesAdminAndNavOptionsObservable( courseIds: number[], options: CoreSitesCommonWSOptions = {}, - ): Observable<{ + ): WSObservable<{ navOptions: CoreCourseUserAdminOrNavOptionCourseIndexed; admOptions: CoreCourseUserAdminOrNavOptionCourseIndexed; }> { @@ -780,7 +780,7 @@ export class CoreCoursesProvider { getUserAdministrationOptionsObservable( courseIds: number[], options: CoreSitesCommonWSOptions = {}, - ): Observable { + ): WSObservable { if (!courseIds || courseIds.length == 0) { return of({}); } @@ -847,7 +847,7 @@ export class CoreCoursesProvider { getUserNavigationOptionsObservable( courseIds: number[], options: CoreSitesCommonWSOptions = {}, - ): Observable { + ): WSObservable { if (!courseIds || courseIds.length == 0) { return of({}); } @@ -939,10 +939,10 @@ export class CoreCoursesProvider { ): Promise { strategy = strategy ?? (preferCache ? CoreSitesReadingStrategy.PREFER_CACHE : undefined); - return this.getUserCoursesObservable({ + return firstValueFrom(this.getUserCoursesObservable({ readingStrategy: strategy, siteId, - }).toPromise(); + })); } /** @@ -951,7 +951,7 @@ export class CoreCoursesProvider { * @param options Options. * @return Observable that returns the courses. */ - getUserCoursesObservable(options: CoreSitesCommonWSOptions = {}): Observable { + getUserCoursesObservable(options: CoreSitesCommonWSOptions = {}): WSObservable { return asyncObservable(async () => { const site = await CoreSites.getSite(options.siteId); diff --git a/src/core/features/courses/services/dashboard.ts b/src/core/features/courses/services/dashboard.ts index eb812b835..fb6aea9ca 100644 --- a/src/core/features/courses/services/dashboard.ts +++ b/src/core/features/courses/services/dashboard.ts @@ -14,12 +14,11 @@ import { Injectable } from '@angular/core'; import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; -import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; +import { CoreSite, CoreSiteWSPreSets, WSObservable } from '@classes/site'; import { CoreCourseBlock } from '@features/course/services/course'; import { CoreStatusWithWarningsWSResponse } from '@services/ws'; import { makeSingleton } from '@singletons'; import { CoreError } from '@classes/errors/error'; -import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { asyncObservable, firstValueFrom } from '@/core/utils/rxjs'; @@ -73,7 +72,7 @@ export class CoreCoursesDashboardProvider { * @return Observable that returns the list of blocks. * @since 3.6 */ - getDashboardBlocksFromWSObservable(options: GetDashboardBlocksOptions = {}): Observable { + getDashboardBlocksFromWSObservable(options: GetDashboardBlocksOptions = {}): WSObservable { return asyncObservable(async () => { const site = await CoreSites.getSite(options.siteId); @@ -142,7 +141,7 @@ export class CoreCoursesDashboardProvider { * @param options Options. * @return observable that returns the list of blocks. */ - getDashboardBlocksObservable(options: GetDashboardBlocksOptions = {}): Observable { + getDashboardBlocksObservable(options: GetDashboardBlocksOptions = {}): WSObservable { return this.getDashboardBlocksFromWSObservable(options).pipe(map(blocks => { let mainBlocks: CoreCourseBlock[] = []; let sideBlocks: CoreCourseBlock[] = [];