Skip to content
Snippets Groups Projects
backend.service.ts 3.56 KiB
Newer Older
  • Learn to ignore specific revisions
  • Martin Mechtel's avatar
    Martin Mechtel committed
    
    
    import { Injectable, Inject } from '@angular/core';
    
    paflov's avatar
    paflov committed
    import {HttpClient, HttpParams} from '@angular/common/http';
    
    import { Observable, of } from 'rxjs';
    
    import {catchError, map, switchMap} from 'rxjs/operators';
    import {LoginData, BookletStatus, PersonTokenAndTestId, KeyValuePair, SysConfig} from './app.interfaces';
    
    paflov's avatar
    paflov committed
    import {ErrorHandler, ServerError} from 'iqb-components';
    
    // ============================================================================
    
    @Injectable({
      providedIn: 'root'
    })
    
    export class BackendService {
    
      constructor(
    
        @Inject('SERVER_URL') private readonly serverUrl: string,
    
        private http: HttpClient
      ) {}
    
      login(name: string, password: string): Observable<LoginData | ServerError> {
    
        return this.http
    
            .put<LoginData>(this.serverUrl + 'session/login', {name, password})
    
              catchError(ErrorHandler.handle),
              switchMap(myLoginData => {
                if (myLoginData instanceof ServerError) {
    
    paflov's avatar
    paflov committed
                  if ((myLoginData as ServerError).code === 401) {
    
                      .put<LoginData>(this.serverUrl + 'session/admin', {name, password})
    
    paflov's avatar
    paflov committed
                      .pipe(catchError(ErrorHandler.handle));
    
    paflov's avatar
    paflov committed
                    return of(myLoginData);
    
    paflov's avatar
    paflov committed
            );
    
    paflov's avatar
    paflov committed
    
      getSession(loginToken: string, personToken: string): Observable<LoginData | ServerError> {
    
        const authToken = JSON.stringify({l: loginToken, p: personToken});
    
        return this.http
    
          .get<LoginData>(this.serverUrl + 'session', {headers: {'AuthToken': authToken}})
    
    paflov's avatar
    paflov committed
          .pipe(catchError(ErrorHandler.handle));
    
      getAdminSession(adminToken: string): Observable<LoginData | ServerError> {
    
        const authToken = JSON.stringify({at: adminToken});
    
        return this.http
    
          .get<LoginData>(this.serverUrl + 'session', {headers: {'AuthToken': authToken}})
          .pipe(catchError(ErrorHandler.handle));
    
    Martin Mechtel's avatar
    Martin Mechtel committed
      getSysConfig(): Observable<KeyValuePair> {
    
          .get<SysConfig>(this.serverUrl + `system/config`)
    
          .pipe(catchError(() => of(null)))
          .pipe(map((sysConfig: SysConfig): KeyValuePair => {
    
    paflov's avatar
    paflov committed
            console.log(sysConfig.version); // TODO check for system version mismatch https://github.com/iqb-berlin/testcenter-iqb-ng/issues/53
    
    paflov's avatar
    paflov committed
      getBookletState(bookletName: string, code = ''): Observable<BookletStatus | ServerError> {
    
    
    paflov's avatar
    paflov committed
        // TODO after https://github.com/iqb-berlin/testcenter-iqb-ng/issues/52 is resolved,
        //  this must be removed, we would have a personToken here
    
    paflov's avatar
    paflov committed
        const params = new HttpParams().set('code', code);
    
        return this.http
    
          .get<BookletStatus>(this.serverUrl + `booklet/${bookletName}/state`, {params})
    
    paflov's avatar
    paflov committed
          .pipe(catchError(ErrorHandler.handle));
    
    paflov's avatar
    paflov committed
    
      startBooklet(code: string, bookletName: string, bookletLabel: string): Observable<PersonTokenAndTestId | ServerError> {
    
    
        return this.http
    
          .put<PersonTokenAndTestId>(this.serverUrl + `test`, {code, bookletName, bookletLabel})
    
    paflov's avatar
    paflov committed
          .pipe(catchError(ErrorHandler.handle));
    
    paflov's avatar
    paflov committed
    
      addBookletLogClose(testId: number): Observable<boolean | ServerError> {
    
    
        return this.http
    
          .put<boolean>(this.serverUrl + `test/${testId}/log`, {timestamp: Date.now(), entry: 'BOOKLETLOCKEDbyTESTEE'})
    
    paflov's avatar
    paflov committed
          .pipe(catchError(ErrorHandler.handle));
    
    Martin Mechtel's avatar
    Martin Mechtel committed
      }
    
    
    
      lockBooklet(testId: number): Observable<boolean | ServerError> {
    
    
    Martin Mechtel's avatar
    Martin Mechtel committed
        return this.http
    
          .patch<boolean>(this.serverUrl + `test/${testId}/lock`, {})
    
          .pipe(catchError(ErrorHandler.handle));
    
    Martin Mechtel's avatar
    Martin Mechtel committed
      }