import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { throwError, Observable } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; import { ConfigService } from './config.service'; import { Course } from './models/course'; import { DegreePlan } from './models/degree-plan'; import { Term } from './models/term'; import { FavoriteCourse } from './models/favorite-course'; import { CourseDetails } from './models/course-details'; const httpOptions = { headers: new HttpHeaders({ 'Content-Type': 'application/json' }) }; @Injectable() export class DataService { private plannerApiUrl: string; private searchApiUrl: string; constructor(private http: HttpClient, private configService: ConfigService) { this.plannerApiUrl = this.configService.apiPlannerUrl; this.searchApiUrl = this.configService.apiSearchUrl; } getDegreePlans(): Observable<DegreePlan[]> { return this.http.get<DegreePlan[]>(this.plannerApiUrl + '/degreePlan') .pipe(catchError(this.errorHandler)); } getDegreePlannerCourseData(): Observable<Course[]> { return this.http.get<Course[]>(this.plannerApiUrl + '/degreePlan/520224/courses') .pipe(catchError(this.errorHandler)); } getTerms(): Observable<Term[]> { return this.http.get<Term[]>(this.searchApiUrl + '/terms') .pipe(catchError(this.errorHandler)); } getCourseDetails(termCode: string, subjectCode: string, courseId: string): Observable<CourseDetails[]> { return this.http.get<CourseDetails[]>(this.searchApiUrl + 'course/' + termCode + '/' + subjectCode + '/' + courseId, httpOptions) .pipe(catchError(this.errorHandler)); } getFavoriteCourses(): Observable<FavoriteCourse[]> { return this.http.get<FavoriteCourse[]>(this.plannerApiUrl + '/favorites') .pipe(catchError(this.errorHandler)); } saveFavoriteCourse(subjectCode: string, courseId: string): Observable<FavoriteCourse> { return this.http.post<FavoriteCourse>(this.plannerApiUrl + 'favorites/' + subjectCode + '/' + courseId, httpOptions) .pipe(catchError(this.errorHandler)); } removeFavoriteCourse(subjectCode, courseId): Observable<FavoriteCourse> { return this.http.delete<FavoriteCourse>(this.plannerApiUrl + 'favorites/' + subjectCode + '/' + courseId, httpOptions) .pipe(catchError(this.errorHandler)); } addCourse(subjectCode, courseId, termCode) { return this.http.post(this.plannerApiUrl + 'degreePlan/520224/courses', {subjectCode, courseId, termCode }, httpOptions) .pipe(catchError(this.errorHandler)); } removeCourse(recordId) { return this.http.delete(this.plannerApiUrl + 'degreePlan/520224/courses/' + recordId, httpOptions) .pipe(catchError(this.errorHandler)); } updateCourseTerm(recordId, termCode): Observable<Course> { return this.http.put<Course>(this.plannerApiUrl + 'degreePlan/520224/courses/' + recordId + '?termCode=' + termCode, httpOptions) .pipe(catchError(this.errorHandler)); } private errorHandler(error: HttpErrorResponse) { return throwError(error || 'Server Error'); } }