]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/src/eg2/src/app/core/server-store.service.ts
ea2d93da366ae41a9b904ca6683205f6bac56a75
[working/Evergreen.git] / Open-ILS / src / eg2 / src / app / core / server-store.service.ts
1 /**
2  * Set and get server-stored settings.
3  */
4 import {Injectable} from '@angular/core';
5 import {AuthService} from './auth.service';
6 import {NetService} from './net.service';
7
8 // Settings summary objects returned by the API
9 interface ServerSettingSummary {
10     name: string;
11     value: string;
12     has_org_setting: boolean;
13     has_user_setting: boolean;
14     has_workstation_setting: boolean;
15 }
16
17 @Injectable({providedIn: 'root'})
18 export class ServerStoreService {
19
20     cache: {[key: string]: ServerSettingSummary};
21
22     constructor(
23         private net: NetService,
24         private auth: AuthService) {
25         this.cache = {};
26     }
27
28     setItem(key: string, value: any): Promise<any> {
29
30         if (!this.auth.token()) {
31             return Promise.reject('Auth required to apply settings');
32         }
33
34         const setting: any = {};
35         setting[key] = value;
36
37         return this.net.request(
38             'open-ils.actor',
39             'open-ils.actor.settings.apply.user_or_ws',
40             this.auth.token(), setting)
41
42         .toPromise().then(appliedCount => {
43
44             if (Number(appliedCount) > 0) { // value applied
45                 return this.cache[key] = value;
46             }
47
48             return Promise.reject(
49                 `No user or workstation setting type exists for: "${key}".\n` +
50                 'Create a ws/user setting type or use setLocalItem() to ' +
51                 'store the value locally.'
52             );
53         });
54     }
55
56     // Returns a single setting value
57     getItem(key: string): Promise<any> {
58         return this.getItemBatch([key]).then(
59             settings => settings[key]
60         );
61     }
62
63     // Returns a set of key/value pairs for the requested settings
64     getItemBatch(keys: string[]): Promise<any> {
65
66         const values: any = {};
67         keys.forEach(key => {
68             if (key in this.cache) {
69                 values[key] = this.cache[key];
70             }
71         });
72
73         if (keys.length === Object.keys(values).length) {
74             // All values are cached already
75             return Promise.resolve(values);
76         }
77
78         if (!this.auth.token()) {
79             // Authtokens require for fetching server settings, but
80             // calls to retrieve settings could potentially occur
81             // before auth completes -- Ideally not, but just to be safe.
82             return Promise.resolve({});
83         }
84
85         // Server call required.  Limit the settings to lookup to those
86         // we don't already have cached.
87         const serverKeys = [];
88         keys.forEach(key => {
89             if (!Object.keys(values).includes(key)) {
90                 serverKeys.push(key);
91             }
92         });
93
94         return new Promise((resolve, reject) => {
95             this.net.request(
96                 'open-ils.actor',
97                 'open-ils.actor.settings.retrieve',
98                 serverKeys, this.auth.token()
99             ).subscribe(
100                 summary => {
101                     this.cache[summary.name] =
102                         values[summary.name] = summary.value;
103                 },
104                 err => reject,
105                 () => resolve(values)
106             );
107         });
108     }
109
110     removeItem(key: string): Promise<any> {
111         return this.setItem(key, null);
112     }
113 }
114