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);
Lukas Burgey's avatar
Lukas Burgey committed
130
    window.location.href = 'https://hdf-portal.data.kit.edu/backend/auth/v1/request/';
131
132
  }

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
}