import { Course } from '@app/core/models/course'; import { Note } from './../models/note'; import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { groupBy, toArray, mergeMap, flatMap, tap, mergeAll, map, distinct, share } from 'rxjs/operators'; import { DataService } from '@app/core/data.service'; @Injectable({ providedIn: 'root' }) export class DegreePlannerDataService { degreePlannerData: Observable<any>; coursesData$: any; termCodes: any; planId: number; constructor(private dataService: DataService) { } getDegreePlanDataById(planId: number) { this.planId = planId; // this.dataService.test().subscribe(() => {}); this.degreePlannerData = this.dataService.getDegreePlannerCourseData(planId).pipe( map(courses => courses.sort((a, b) => Number(a.termCode) - Number(b.termCode))), mergeAll(), share() ); this.degreePlannerData.pipe( map(course => course.termCode), distinct(), toArray() ).subscribe(termCodes => this.termCodes = termCodes); this.coursesData$ = this.degreePlannerData.pipe( groupBy(course => course.termCode), mergeMap(group$ => group$.pipe(toArray())), map(course => { return { termCode: course[0].termCode, year: course[0].termCode.substring(1, 3), courses: course }; }), groupBy(terms => terms.year), mergeMap(group$ => group$.pipe(toArray())), toArray(), tap(x => console.log('new data', x)) ); return this.coursesData$; } getAllTerms() { return this.termCodes; } getAllNotes(): Observable<Note[]> { return this.dataService.getAllNotes(this.planId); } getPlanId(): number { return this.planId; } }