1 import { Injectable, SecurityContext } from '@angular/core';
2 import { Observable } from 'rxjs/Observable';
3 import { BehaviorSubject } from 'rxjs/BehaviorSubject';
5 import { XDSAgentService, IXDSProjectConfig } from "../services/xdsagent.service";
7 export enum ProjectType {
9 NATIVE_PATHMAP = "PathMap",
10 SYNCTHING = "CloudSync"
13 export var ProjectTypes = [
14 { value: ProjectType.NATIVE_PATHMAP, display: "Path mapping" },
15 { value: ProjectType.SYNCTHING, display: "Cloud Sync" }
18 export var ProjectStatus = {
19 ErrorConfig: "ErrorConfig",
26 export interface IProject {
36 serverPrjDef?: IXDSProjectConfig;
39 defaultSdkID?: string;
43 export class ProjectService {
44 public Projects$: Observable<IProject[]>;
46 private _prjsList: IProject[] = [];
47 private current: IProject;
48 private prjsSubject = <BehaviorSubject<IProject[]>>new BehaviorSubject(this._prjsList);
50 constructor(private xdsSvr: XDSAgentService) {
52 this.Projects$ = this.prjsSubject.asObservable();
54 this.xdsSvr.getProjects().subscribe((projects) => {
56 projects.forEach(p => {
57 this._addProject(p, true);
59 this.prjsSubject.next(Object.assign([], this._prjsList));
62 // Update Project data
63 this.xdsSvr.ProjectState$.subscribe(prj => {
64 let i = this._getProjectIdx(prj.id);
66 // XXX for now, only isInSync and status may change
67 this._prjsList[i].isInSync = prj.isInSync;
68 this._prjsList[i].status = prj.status;
69 this._prjsList[i].isUsable = this._isUsableProject(prj);
70 this.prjsSubject.next(Object.assign([], this._prjsList));
74 // Add listener on create and delete project events
75 this.xdsSvr.addEventListener('event:project-add', (ev) => {
76 if (ev && ev.data && ev.data.id) {
77 this._addProject(ev.data);
79 console.log("Warning: received events with unknown data: ev=", ev);
82 this.xdsSvr.addEventListener('event:project-delete', (ev) => {
83 if (ev && ev.data && ev.data.id) {
84 let idx = this._prjsList.findIndex(item => item.id === ev.data.id);
86 console.log("Warning: received events on unknown project id: ev=", ev);
89 this._prjsList.splice(idx, 1);
90 this.prjsSubject.next(Object.assign([], this._prjsList));
92 console.log("Warning: received events with unknown data: ev=", ev);
98 public setCurrent(s: IProject) {
102 public getCurrent(): IProject {
106 public getCurrentId(): string {
107 if (this.current && this.current.id) {
108 return this.current.id;
113 Add(prj: IProject): Observable<IProject> {
114 let xdsPrj: IXDSProjectConfig = {
116 serverId: prj.serverId,
117 label: prj.label || "",
118 clientPath: prj.pathClient.trim(),
119 serverPath: prj.pathServer,
121 defaultSdkID: prj.defaultSdkID,
123 // Send config to XDS server
124 return this.xdsSvr.addProject(xdsPrj)
125 .map(xdsPrj => this._convToIProject(xdsPrj));
128 Delete(prj: IProject): Observable<IProject> {
129 let idx = this._getProjectIdx(prj.id);
132 throw new Error("Invalid project id (id=" + prj.id + ")");
134 return this.xdsSvr.deleteProject(prj.id)
135 .map(res => { return delPrj; });
138 Sync(prj: IProject): Observable<string> {
139 let idx = this._getProjectIdx(prj.id);
141 throw new Error("Invalid project id (id=" + prj.id + ")");
143 return this.xdsSvr.syncProject(prj.id);
146 private _isUsableProject(p) {
147 return p && p.isInSync &&
148 (p.status === ProjectStatus.Enable) &&
149 (p.status !== ProjectStatus.Syncing);
152 private _getProjectIdx(id: string): number {
153 return this._prjsList.findIndex((item) => item.id === id);
156 private _convToIProject(rPrj: IXDSProjectConfig): IProject {
157 // Convert XDSFolderConfig to IProject
160 serverId: rPrj.serverId,
162 pathClient: rPrj.clientPath,
163 pathServer: rPrj.serverPath,
166 isInSync: rPrj.isInSync,
167 isUsable: this._isUsableProject(rPrj),
168 defaultSdkID: rPrj.defaultSdkID,
169 serverPrjDef: Object.assign({}, rPrj), // do a copy
174 private _addProject(rPrj: IXDSProjectConfig, noNext?: boolean): IProject {
176 // Convert XDSFolderConfig to IProject
177 let pp = this._convToIProject(rPrj);
180 this._prjsList.push(pp);
182 // sort project array
183 this._prjsList.sort((a, b) => {
184 if (a.label < b.label) {
187 if (a.label > b.label) {
194 this.prjsSubject.next(Object.assign([], this._prjsList));