2 * Set and get server-stored settings.
4 import {Injectable} from '@angular/core';
5 import {AuthService} from './auth.service';
6 import {NetService} from './net.service';
8 // Settings summary objects returned by the API
9 interface ServerSettingSummary {
12 has_org_setting: boolean;
13 has_user_setting: boolean;
14 has_workstation_setting: boolean;
17 @Injectable({providedIn: 'root'})
18 export class ServerStoreService {
20 cache: {[key: string]: ServerSettingSummary};
23 private net: NetService,
24 private auth: AuthService) {
28 setItem(key: string, value: any): Promise<any> {
30 if (!this.auth.token()) {
31 return Promise.reject('Auth required to apply settings');
34 const setting: any = {};
37 return this.net.request(
39 'open-ils.actor.settings.apply.user_or_ws',
40 this.auth.token(), setting)
42 .toPromise().then(appliedCount => {
44 if (Number(appliedCount) > 0) { // value applied
45 return this.cache[key] = value;
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.'
56 // Returns a single setting value
57 getItem(key: string): Promise<any> {
58 return this.getItemBatch([key]).then(
59 settings => settings[key]
63 // Returns a set of key/value pairs for the requested settings
64 getItemBatch(keys: string[]): Promise<any> {
66 const values: any = {};
68 if (this.cache[key]) {
69 values[key] = this.cache[key];
73 if (keys.length === Object.keys(values).length) {
74 // All values are cached already
75 return Promise.resolve(values);
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({});
85 // Server call required. Limit the settings to lookup to those
86 // we don't already have cached.
87 const serverKeys = [];
89 if (!Object.keys(values).includes(key)) {
94 return new Promise((resolve, reject) => {
97 'open-ils.actor.settings.retrieve',
98 serverKeys, this.auth.token()
101 this.cache[summary.name] =
102 values[summary.name] = summary.value;
105 () => resolve(values)
110 removeItem(key: string): Promise<any> {
111 return this.setItem(key, null);