user.service.ts 5.45 KB
Newer Older
Lukas Burgey's avatar
Lukas Burgey committed
1 2 3 4 5 6 7 8 9 10 11 12
import { Injectable } from '@angular/core';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/of';

import { CookieService } from 'ngx-cookie-service';
import { MatTableDataSource } from '@angular/material';

import { SnackBarService } from './snackbar.service';

Lukas Burgey's avatar
Lukas Burgey committed
13
import { environment } from '../environments/environment';
14
import { IdP, User, Service, AuthInfo, AllAuthInfo, UserState, SSHKey, NewSSHKey } from './types/types.module';
Lukas Burgey's avatar
Lukas Burgey committed
15

Lukas Burgey's avatar
Lukas Burgey committed
16 17 18 19 20 21 22

@Injectable()
export class UserService {
  public loggedIn = false;
  public user: User;
  public sshKeyData: MatTableDataSource<any>;
  public userInfoData: MatTableDataSource<any>;
23
  public services: Service[];
Lukas Burgey's avatar
Lukas Burgey committed
24 25 26 27 28 29 30


  constructor(
    public cookieService: CookieService,
    public http: HttpClient,
    public snackBar: SnackBarService,
  ) {
Lukas Burgey's avatar
Lukas Burgey committed
31
    this.update();
Lukas Burgey's avatar
Lukas Burgey committed
32 33
  }

34 35
  public setIdPPreference(idp: IdP) {
    this.cookieService.set(environment.idpCookieName, String(idp.id));
Lukas Burgey's avatar
Lukas Burgey committed
36 37
  }

38 39 40 41 42 43
  public errorHandler(error: any): void {
    if (error.status === 500) {
      this.snackBar.open('Server Error');
    }
  }

44 45
  public getIdPPreference(): Observable<AllAuthInfo> {
    let idpID = Number(this.cookieService.get(environment.idpCookieName));
Lukas Burgey's avatar
Lukas Burgey committed
46

47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
    return this.http.get('/backend/auth/v1/info/').map(
      (authInfo: AuthInfo) => {
        let selected = authInfo.idps[1];

        if (!idpID) {
          idpID = authInfo.default;
        }
        for (const idp of authInfo.idps) {
          if (idp.id === idpID) {
            selected = idp;
          }
        }
        return {
          idps: authInfo.idps,
          selected: selected,
        };
      }
64 65 66 67 68
    ).catch(
      (error: any) => {
        this.errorHandler(error);
        return Observable.of(null);
      }
69
    );
Lukas Burgey's avatar
Lukas Burgey committed
70 71
  }

72
  public updateData(data: any) {
73 74 75 76
    if (data['error']) {
      this.snackBar.open(data['error']);
    }

77 78 79 80 81
    if (!this.loggedIn && data.logged_in) {
      this.snackBar.open('Logged in');
    }

    this.loggedIn = data.logged_in;
Lukas Burgey's avatar
Lukas Burgey committed
82 83
    if (!this.services) {
      this.services = data.services;
84 85 86 87 88 89 90 91 92 93 94 95 96
    }
    this.user = data.user;

    if (this.user) {
      // build sshKeyData
      if ('ssh_keys' in this.user) {
        this.sshKeyData = new MatTableDataSource(this.user.ssh_keys);
      } else {
        this.sshKeyData = null;
      }

      // build userInfoData
      const userInfoList = [];
Lukas Burgey's avatar
Lukas Burgey committed
97 98 99
      for (const key in this.user.userinfo) {
        if (this.user.userinfo.hasOwnProperty(key)) {
          userInfoList.push({name: key, info: this.user.userinfo[key]});
Lukas Burgey's avatar
Lukas Burgey committed
100
        }
101 102 103 104 105 106 107
      }
      this.userInfoData = new MatTableDataSource(userInfoList);

    } else {
      this.sshKeyData = null;
      this.userInfoData = null;
    }
Lukas Burgey's avatar
Lukas Burgey committed
108 109 110
  }

  public updateState() {
Lukas Burgey's avatar
Lukas Burgey committed
111 112 113
    this.http
      .get('/backend/api/state/')
      .subscribe(
114
        (data: UserState) => {
115
          this.updateData(data);
Lukas Burgey's avatar
Lukas Burgey committed
116 117 118 119 120 121 122 123
        },
        (err: HttpErrorResponse) => {
          console.log('Error', err);
          this.snackBar.open('Error receiving data from the server');
        }
      );
  }

Lukas Burgey's avatar
Lukas Burgey committed
124 125 126 127
  public update() {
    this.updateState();
  }

128 129
  public login(idp: IdP) {
    this.setIdPPreference(idp);
130 131 132
    window.location.href = 'https://hdf-portal.data.kit.edu/backend/auth/v1/request';
  }

Lukas Burgey's avatar
Lukas Burgey committed
133
  public logout() {
Lukas Burgey's avatar
Lukas Burgey committed
134
    this.http.post('/backend/auth/v1/logout/', {}).subscribe(
Lukas Burgey's avatar
Lukas Burgey committed
135
      data => {
Lukas Burgey's avatar
Lukas Burgey committed
136
        this.updateData(data);
Lukas Burgey's avatar
Lukas Burgey committed
137 138 139 140
      }
    );
  }

141
  public addSshKey(key: NewSSHKey) {
Lukas Burgey's avatar
Lukas Burgey committed
142 143 144 145 146 147
    const body = {
      'type': 'add',
      'key': key,
    };
    return this.http.post('/backend/api/sshkey/', body).subscribe(
      data => {
148
        this.updateData(data);
Lukas Burgey's avatar
Lukas Burgey committed
149 150 151 152
      },
      (err) => {
        this.snackBar.open('Error uploading key');
        console.log(err);
153
        this.update();
Lukas Burgey's avatar
Lukas Burgey committed
154 155 156 157
      }
    );
  }

158
  public removeSshKey(key: SSHKey) {
Lukas Burgey's avatar
Lukas Burgey committed
159 160
    const body = {
      'type': 'remove',
161
      'id': key.id,
Lukas Burgey's avatar
Lukas Burgey committed
162 163 164
    };
    return this.http.post('/backend/api/sshkey/', body).subscribe(
      (data) => {
165
        this.updateData(data);
Lukas Burgey's avatar
Lukas Burgey committed
166 167 168 169
      },
      (err) => {
        this.snackBar.open('Error deleting key');
        console.log(err);
170 171 172 173 174
        this.update();
      }
    );
  }

175
  public addDeployment(service: Service, key: SSHKey) {
176 177
    const body = {
      'type': 'add',
178 179
      'key': key.id,
      'service': service.id,
180 181 182
    };
    return this.http.post('/backend/api/deployments/', body).subscribe(
      (data) => {
183
        this.snackBar.open('Deployed key ' + key.name);
184 185 186
        this.updateData(data);
      },
      (err) => {
187
        this.snackBar.open('Error deploying key ' + key.name);
188 189 190 191 192 193
        console.log(err);
        this.update();
      }
    );
  }

194
  public removeDeployment(service: Service, key: SSHKey) {
195 196
    const body = {
      'type': 'remove',
197 198
      'key': key.id,
      'service':  service.id,
199
    };
200

201 202
    return this.http.post('/backend/api/deployments/', body).subscribe(
      (data) => {
203
        this.snackBar.open('Withdrew key ' + key.name);
204 205 206
        this.updateData(data);
      },
      (err) => {
207
        this.snackBar.open('Error withdrawing key ' + key.name);
208 209
        console.log(err);
        this.update();
Lukas Burgey's avatar
Lukas Burgey committed
210 211 212
      }
    );
  }
Lukas Burgey's avatar
Lukas Burgey committed
213 214 215 216 217 218 219 220 221 222 223 224 225 226

  public deleteUser() {
    return this.http.delete('/backend/api/delete_user/').subscribe(
      (data) => {
        this.snackBar.open('Deleted user from server');
        this.updateData(data);
      },
      (err) => {
        this.snackBar.open('Error deleting user from server');
        console.log(err);
        this.update();
      }
    );
  }
Lukas Burgey's avatar
Lukas Burgey committed
227
}