Project

General

Profile

1
import {Injectable} from "@angular/core";
2
import {HttpClient} from "@angular/common/http";
3
import {BehaviorSubject, from, Observable, Subscriber} from "rxjs";
4
import {Indicator, Section, Stakeholder, StakeholderInfo, Visibility} from "../entities/stakeholder";
5
import {HelperFunctions} from "../../utils/HelperFunctions.class";
6
import {map} from "rxjs/operators";
7
import {ActivatedRoute} from "@angular/router";
8
import {properties} from "../../../../environments/environment";
9
import {CustomOptions} from "../../services/servicesUtils/customOptions.class";
10

    
11
let maps: string[] = ['parameters', 'filters'];
12

    
13
export interface Reorder {
14
  action: 'moved' | 'added' | 'removed',
15
  target: string,
16
  ids: string[];
17
}
18

    
19
@Injectable({
20
  providedIn: "root"
21
})
22
export class StakeholderService {
23

    
24
  private stakeholderSubject: BehaviorSubject<Stakeholder> = null;
25
  private promise: Promise<any>;
26
  private sub;
27
  constructor(private http: HttpClient, private route: ActivatedRoute) {
28
    this.stakeholderSubject = new BehaviorSubject<Stakeholder>(null);
29
  }
30
  ngOnDestroy() {
31
   this.clearSubscriptions();
32
  }
33

    
34
  clearSubscriptions(){
35
    if (this.sub instanceof Subscriber) {
36
      this.sub.unsubscribe();
37
    }
38
  }
39
  getStakeholder(alias:string): Observable<Stakeholder> {
40
    if(!this.stakeholderSubject.value || this.stakeholderSubject.value.alias !== alias) {
41
      this.promise = new Promise<any>((resolve, reject) => {
42
        this.sub = this.http.get<Stakeholder>(properties.monitorServiceAPIURL + '/stakeholder/' + encodeURIComponent(alias), CustomOptions.registryOptions()).pipe(map(stakeholder => {
43
          return this.formalize(stakeholder);
44
        })).subscribe(stakeholder => {
45
          this.stakeholderSubject.next(stakeholder);
46
          resolve();
47
        }, error => {
48
          this.stakeholderSubject.next(null);
49
          reject();
50
        });
51
      });
52
    }
53
    return from(this.getStakeholderAsync());
54
  }
55
  
56
  async getStakeholderAsync() {
57
    await this.promise;
58
    this.clearSubscriptions();
59
    return this.stakeholderSubject.getValue();
60
  }
61
  
62
  getAlias(url: string): Observable<string[]> {
63
    return this.http.get<Stakeholder[]>(url + '/stakeholder/alias', CustomOptions.registryOptions()).pipe(map(stakeholders => {
64
      return this.formalize(stakeholders);
65
    }));
66
  }
67
  
68
  getStakeholders(url: string, type: string = null): Observable<(Stakeholder & StakeholderInfo)[]> {
69
    return this.http.get<Stakeholder[]>(url + '/stakeholder' + ((type)?('?type=' + type):''), CustomOptions.registryOptions()).pipe(map(stakeholders => {
70
      return this.formalize(stakeholders);
71
    }));
72
  }
73
  
74
  getMyStakeholders(url: string, type: string = null): Observable<Stakeholder[]> {
75
    return this.http.get<Stakeholder[]>(url + '/my-stakeholder' + ((type)?('?type=' + type):''), CustomOptions.registryOptions()).pipe(map(stakeholders => {
76
      return this.formalize(stakeholders);
77
    }));
78
  }
79

    
80
  getDefaultStakeholders(url: string, type: string = null): Observable<Stakeholder[]> {
81
    return this.http.get<Stakeholder[]>(url + '/stakeholder/default' + ((type)?('?type=' + type):''), CustomOptions.registryOptions()).pipe(map(stakeholders => {
82
      return this.formalize(stakeholders);
83
    }));
84
  }
85

    
86
  buildStakeholder(url: string, stakeholder: Stakeholder): Observable<Stakeholder> {
87
    return this.http.post<Stakeholder>(url + '/build-stakeholder', stakeholder, CustomOptions.registryOptions()).pipe(map(stakeholder => {
88
      return this.formalize(stakeholder);
89
    }));
90
  }
91
  
92
  changeVisibility(url: string, path: string[], visibility:Visibility): Observable<any> {
93
    return this.http.post<Visibility>(url + '/' + path.join('/') + '/change-visibility'+'?visibility=' + visibility, null, CustomOptions.registryOptions());
94
  }
95

    
96
  saveElement(url: string, element: any, path: string[] = []): Observable<any> {
97
    path = HelperFunctions.encodeArray(path);
98
    return this.http.post<any>(url + ((path.length > 0)?'/':'') + path.join('/') +
99
      '/save', element, CustomOptions.registryOptions()).pipe(map(element => {
100
        return this.formalize(element);
101
    }));
102
  }
103
  
104
  saveSection(url: string, element: any, path: string[] = [], index: number = -1): Observable<Section> {
105
    path = HelperFunctions.encodeArray(path);
106
    return this.http.post<Section>(url + ((path.length > 0)?'/':'') + path.join('/') +
107
      '/save/' + index, element, CustomOptions.registryOptions()).pipe(map(element => {
108
      return this.formalize(element);
109
    }));
110
  }
111

    
112
  deleteElement(url: string, path: string[], childrenAction: string = null): Observable<any> {
113
    path = HelperFunctions.encodeArray(path);
114
    let params: string = "";
115
    if(childrenAction) {
116
      params = "?children="+childrenAction;
117
    }
118
    return this.http.delete<any>(url + '/' + path.join('/') + '/delete'+params, CustomOptions.registryOptions());
119
  }
120

    
121
  reorderIndicators(url: string, path: string[], reorder: Reorder, type: string = 'chart'): Observable<Indicator[]> {
122
    path = HelperFunctions.encodeArray(path);
123
    return this.http.post<Indicator[]>(url + '/' + path.join('/') + '/' + type + '/reorder', reorder, CustomOptions.registryOptions()).pipe(map(indicators => {
124
      return this.formalize(indicators);
125
    }));
126
  }
127

    
128
  getStakeholderAsObservable(): Observable<Stakeholder> {
129
    return this.stakeholderSubject.asObservable();
130
  }
131

    
132
  get stakeholder(): Stakeholder {
133
    return this.stakeholderSubject.getValue();
134
  }
135

    
136
  setStakeholder(stakeholder: Stakeholder) {
137
    this.stakeholderSubject.next(stakeholder);
138
  }
139

    
140
  private formalize(element: any) {
141
    return HelperFunctions.copy(element);
142
  }
143
}
    (1-1/1)