@ampsec/platform-client 50.0.0 → 51.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/src/services/rest/ConnectorInstallService.d.ts +4 -0
- package/build/src/services/rest/ConnectorInstallService.js +12 -0
- package/build/src/services/rest/ConnectorInstallService.js.map +1 -1
- package/build/src/services/rest/RestClient.d.ts +3 -1
- package/build/src/services/rest/RestClient.js +1 -1
- package/build/src/services/rest/RestClient.js.map +1 -1
- package/build/src/services/settings.service.d.ts +2 -2
- package/build/src/services/settings.service.js.map +1 -1
- package/build/src/settings.d.ts +11 -5
- package/build/src/settings.js +62 -33
- package/build/src/settings.js.map +1 -1
- package/package.json +1 -1
- package/src/services/rest/ConnectorInstallService.ts +13 -0
- package/src/services/rest/RestClient.ts +4 -2
- package/src/services/settings.service.ts +2 -2
- package/src/settings.ts +71 -37
|
@@ -6,7 +6,11 @@ export declare class ConnectorInstallService {
|
|
|
6
6
|
credentials: (cid: string, credentials: {
|
|
7
7
|
[key: string]: unknown;
|
|
8
8
|
}) => Promise<boolean>;
|
|
9
|
+
getOauthInstallUrl: (cid: string, provider: string, clientRedirectUrl: string) => Promise<string>;
|
|
10
|
+
/** @deprecated */
|
|
9
11
|
getInstallToken: (cid: string) => Promise<string>;
|
|
12
|
+
/** @deprecated */
|
|
10
13
|
getRedirectUrl: (token: string) => Promise<string>;
|
|
14
|
+
/** @deprecated */
|
|
11
15
|
buildInstallOAuthUrl: (token: string, redirectUrl: string) => string;
|
|
12
16
|
}
|
|
@@ -12,6 +12,16 @@ class ConnectorInstallService {
|
|
|
12
12
|
const success = res.data.success;
|
|
13
13
|
return success;
|
|
14
14
|
};
|
|
15
|
+
this.getOauthInstallUrl = async (cid, provider, clientRedirectUrl) => {
|
|
16
|
+
const res = await this.rest.call({
|
|
17
|
+
url: `/${this.targetApi}/v1/install/oauth/token`,
|
|
18
|
+
method: 'POST',
|
|
19
|
+
data: { cid },
|
|
20
|
+
});
|
|
21
|
+
const token = res.data.token;
|
|
22
|
+
return `${this.rest.baseUrl}/${this.targetApi}/v1/install/oauth/${provider}/login?token=${token}&redirectUrl=${encodeURIComponent(clientRedirectUrl)}`;
|
|
23
|
+
};
|
|
24
|
+
/** @deprecated */
|
|
15
25
|
this.getInstallToken = async (cid) => {
|
|
16
26
|
const res = await this.rest.call({
|
|
17
27
|
url: `/${this.targetApi}/v1/install/oauth/token`,
|
|
@@ -21,6 +31,7 @@ class ConnectorInstallService {
|
|
|
21
31
|
const token = res.data.token;
|
|
22
32
|
return token;
|
|
23
33
|
};
|
|
34
|
+
/** @deprecated */
|
|
24
35
|
this.getRedirectUrl = async (token) => {
|
|
25
36
|
const res = await this.rest.call({
|
|
26
37
|
url: `/${this.targetApi}/v1/install/oauth/login`,
|
|
@@ -30,6 +41,7 @@ class ConnectorInstallService {
|
|
|
30
41
|
const redirectUrl = res.data.redirect;
|
|
31
42
|
return redirectUrl;
|
|
32
43
|
};
|
|
44
|
+
/** @deprecated */
|
|
33
45
|
this.buildInstallOAuthUrl = (token, redirectUrl) => {
|
|
34
46
|
return `/${this.targetApi}/v1/install/oauth?token=${token}&redirect=${encodeURIComponent(redirectUrl)}`;
|
|
35
47
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectorInstallService.js","sourceRoot":"","sources":["../../../../src/services/rest/ConnectorInstallService.ts"],"names":[],"mappings":";;;AAEA,MAAa,uBAAuB;IAIlC,YAAY,IAAgB,EAAE,SAAiB;QAK/C,gBAAW,GAAG,KAAK,EAAE,GAAW,EAAE,WAAqC,EAAoB,EAAE;YAC3F,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/B,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,yBAAyB;gBAChD,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,EAAC,GAAG,EAAE,WAAW,EAAC;aACzB,CAAC,CAAC;YACH,MAAM,OAAO,GAAI,GAAG,CAAC,IAA2B,CAAC,OAAO,CAAC;YAEzD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QAEF,oBAAe,GAAG,KAAK,EAAE,GAAW,EAAmB,EAAE;YACvD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/B,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,yBAAyB;gBAChD,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,EAAC,GAAG,EAAC;aACZ,CAAC,CAAC;YACH,MAAM,KAAK,GAAI,GAAG,CAAC,IAAwB,CAAC,KAAK,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,mBAAc,GAAG,KAAK,EAAE,KAAa,EAAmB,EAAE;YACxD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/B,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,yBAAyB;gBAChD,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,EAAC,KAAK,EAAC;aAChB,CAAC,CAAC;YACH,MAAM,WAAW,GAAI,GAAG,CAAC,IAA2B,CAAC,QAAQ,CAAC;YAC9D,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC;QAEF,yBAAoB,GAAG,CAAC,KAAa,EAAE,WAAmB,EAAU,EAAE;YACpE,OAAO,IAAI,IAAI,CAAC,SAAS,2BAA2B,KAAK,aAAa,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1G,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"ConnectorInstallService.js","sourceRoot":"","sources":["../../../../src/services/rest/ConnectorInstallService.ts"],"names":[],"mappings":";;;AAEA,MAAa,uBAAuB;IAIlC,YAAY,IAAgB,EAAE,SAAiB;QAK/C,gBAAW,GAAG,KAAK,EAAE,GAAW,EAAE,WAAqC,EAAoB,EAAE;YAC3F,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/B,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,yBAAyB;gBAChD,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,EAAC,GAAG,EAAE,WAAW,EAAC;aACzB,CAAC,CAAC;YACH,MAAM,OAAO,GAAI,GAAG,CAAC,IAA2B,CAAC,OAAO,CAAC;YAEzD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QAEF,uBAAkB,GAAG,KAAK,EAAE,GAAW,EAAE,QAAgB,EAAE,iBAAyB,EAAmB,EAAE;YACvG,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/B,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,yBAAyB;gBAChD,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,EAAC,GAAG,EAAC;aACZ,CAAC,CAAC;YACH,MAAM,KAAK,GAAI,GAAG,CAAC,IAAwB,CAAC,KAAK,CAAC;YAClD,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,qBAAqB,QAAQ,gBAAgB,KAAK,gBAAgB,kBAAkB,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACzJ,CAAC,CAAC;QAEF,kBAAkB;QAClB,oBAAe,GAAG,KAAK,EAAE,GAAW,EAAmB,EAAE;YACvD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/B,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,yBAAyB;gBAChD,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,EAAC,GAAG,EAAC;aACZ,CAAC,CAAC;YACH,MAAM,KAAK,GAAI,GAAG,CAAC,IAAwB,CAAC,KAAK,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,kBAAkB;QAClB,mBAAc,GAAG,KAAK,EAAE,KAAa,EAAmB,EAAE;YACxD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/B,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,yBAAyB;gBAChD,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,EAAC,KAAK,EAAC;aAChB,CAAC,CAAC;YACH,MAAM,WAAW,GAAI,GAAG,CAAC,IAA2B,CAAC,QAAQ,CAAC;YAC9D,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC;QAEF,kBAAkB;QAClB,yBAAoB,GAAG,CAAC,KAAa,EAAE,WAAmB,EAAU,EAAE;YACpE,OAAO,IAAI,IAAI,CAAC,SAAS,2BAA2B,KAAK,aAAa,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1G,CAAC,CAAC;QAlDA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CAiDF;AAxDD,0DAwDC"}
|
|
@@ -31,6 +31,7 @@ export type RestClientOptions = {
|
|
|
31
31
|
* RestClient is a generic interface for making REST calls.
|
|
32
32
|
*/
|
|
33
33
|
export interface RestClient {
|
|
34
|
+
baseUrl?: string;
|
|
34
35
|
strict: boolean;
|
|
35
36
|
call(_request: RestRequest): Promise<RestResponse>;
|
|
36
37
|
}
|
|
@@ -41,11 +42,12 @@ export interface RestClient {
|
|
|
41
42
|
*
|
|
42
43
|
* These strategies can be useful when scraping 3rd party APIs.
|
|
43
44
|
*/
|
|
44
|
-
export declare class DefaultRestClient {
|
|
45
|
+
export declare class DefaultRestClient implements RestClient {
|
|
45
46
|
protected readonly ampAxios: Axios;
|
|
46
47
|
protected readonly retryStrategy: RestClientRetryStrategy;
|
|
47
48
|
protected readonly rateLimitStrategy: RestClientRateLimitStrategy;
|
|
48
49
|
protected readonly logger: AmpLogger;
|
|
50
|
+
readonly baseUrl?: string;
|
|
49
51
|
readonly strict: boolean;
|
|
50
52
|
constructor(options?: RestClientOptions);
|
|
51
53
|
call: (request: RestRequest) => Promise<RestResponse>;
|
|
@@ -81,7 +81,6 @@ class DefaultRestClient {
|
|
|
81
81
|
throw err;
|
|
82
82
|
}
|
|
83
83
|
};
|
|
84
|
-
// TODO: rest client
|
|
85
84
|
const client = (_a = options.client) !== null && _a !== void 0 ? _a : axios_1.default;
|
|
86
85
|
this.ampAxios = client.create({
|
|
87
86
|
baseURL: options.baseUrl,
|
|
@@ -100,6 +99,7 @@ class DefaultRestClient {
|
|
|
100
99
|
this.ampAxios.defaults.headers.put['Content-Type'] = 'application/json';
|
|
101
100
|
this.retryStrategy = (_d = options.retryStrategy) !== null && _d !== void 0 ? _d : retry_rest_1.noopRestRetryStrategy;
|
|
102
101
|
this.rateLimitStrategy = (_e = options.rateLimitStrategy) !== null && _e !== void 0 ? _e : rateLimit_rest_1.noopRestClientRateLimitStrategy;
|
|
102
|
+
this.baseUrl = options.baseUrl;
|
|
103
103
|
this.strict = (_f = options.strict) !== null && _f !== void 0 ? _f : false;
|
|
104
104
|
}
|
|
105
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RestClient.js","sourceRoot":"","sources":["../../../../src/services/rest/RestClient.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAAuB;AACvB,4CAAoB;AACpB,+CAA4D;AAG5D,6CAA4E;AAC5E,mCAAmD;AACnD,qDAAiI;AACjI,2CAAoD;
|
|
1
|
+
{"version":3,"file":"RestClient.js","sourceRoot":"","sources":["../../../../src/services/rest/RestClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,8 +35,8 @@ export declare class AmpSettingsMap {
|
|
|
35
35
|
private readonly settings;
|
|
36
36
|
private readonly rawSettingsList;
|
|
37
37
|
constructor(settings: TenantSettingsMap, rawSettingsList: AmpSettingDto[]);
|
|
38
|
-
getGlobalSetting: <T>(key: TypedAmpSettingsKey<T>) => T
|
|
39
|
-
getConnectorSetting: <T>(cid: string, key: TypedAmpSettingsKey<T>) => T
|
|
38
|
+
getGlobalSetting: <T>(key: TypedAmpSettingsKey<T>) => T;
|
|
39
|
+
getConnectorSetting: <T>(cid: string, key: TypedAmpSettingsKey<T>) => T;
|
|
40
40
|
getConnectorSettings: (cid: string) => RawAmpSettingsMap | undefined;
|
|
41
41
|
getRawMap: () => TenantSettingsMap;
|
|
42
42
|
static asKey: <T>(key: AmpSettingKey, defaultValue?: T | undefined) => TypedAmpSettingsKey<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.service.js","sourceRoot":"","sources":["../../../src/services/settings.service.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAuB;AAoBvB,MAAa,kBAAkB;IAG7B,YAAY,IAAgB,EAAE,YAAuB,KAAK;QAK1D,mBAAc,GAAG,KAAK,EAAE,GAAY,EAA2B,EAAE;YAC/D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/B,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,cAAc;gBACrC,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,EAAC,GAAG,EAAC;aACd,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,GAAG,CAAC,IAA2B,CAAC;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;YAC3B,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBACzB,IAAI,gBAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,0CAA0C,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;oBAC/F,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;iBAC3C;YACH,CAAC,CAAC,CAAC;YACH,MAAM,cAAc,GAAsB,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC9F,OAAO,IAAI,cAAc,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACtD,CAAC,CAAC;QAEF,mBAAc,GAAG,KAAK,EAAK,SAA2E,EAAE,GAAY,EAA4B,EAAE;YAChJ,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChC,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,cAAc;gBACrC,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACzB,GAAG;oBACH,GAAG,EAAE,EAAE,CAAC,GAAG;oBACX,KAAK,EAAE,EAAE,CAAC,KAAK;iBAChB,CAAC,CAAC;aACJ,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAuB,CAAC;YAC9C,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC;QAEF,WAAM,GAAG,KAAK,EAAK,GAAe,EAAE,KAAkB,EAAE,GAAY,EAA0B,EAAE;YAC9F,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChC,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,cAAc;gBACrC,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE;oBACJ,GAAG;oBACH,GAAG;oBACH,KAAK;iBACN;aACF,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAuB,CAAC;YAC9C,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC,CAAC;QAEF,WAAM,GAAG,KAAK,EAAE,EAAU,EAAE,MAA2B,EAA0B,EAAE;YACjF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChC,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,gBAAgB,EAAE,EAAE;gBAC3C,MAAM,EAAE,OAAO;gBACf,IAAI,EAAE,MAAM;aACb,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAuB,CAAC;YAC9C,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC,CAAC;QAEF,WAAM,GAAG,KAAK,EAAE,EAAU,EAA0B,EAAE;YACpD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChC,GAAG,EAAE,IAAI,IAAI,CAAC,SAAS,gBAAgB,EAAE,EAAE;gBAC3C,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAuB,CAAC;YAC9C,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC,CAAC;QAlEA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;;AANH,gDAyFC;AAjBQ,mCAAgB,GAAG,CAAC,QAAyB,EAAE,UAAU,GAAG,IAAI,EAAqB,EAAE;IAC5F,MAAM,cAAc,GAAsB;QACxC,cAAc,EAAE,EAAE;QAClB,iBAAiB,EAAE,EAAE;KACtB,CAAC;IACF,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QACzB,IAAI,OAAO,CAAC,GAAG,EAAE;YACf,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBAClD,cAAc,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;aACpD;YACD,cAAc,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;SACnG;aAAM;YACL,cAAc,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;SACnF;IACH,CAAC,CAAC,CAAC;IACH,OAAO,cAAc,CAAC;AACxB,CAAC,AAhBsB,CAgBrB;AAGJ,MAAa,cAAc;IAIzB,YAAY,QAA2B,EAAE,eAAgC;QAFxD,oBAAe,GAAG,IAAI,KAAK,EAAiB,CAAC;QAO9D,qBAAgB,GAAG,CAAI,GAA2B,
|
|
1
|
+
{"version":3,"file":"settings.service.js","sourceRoot":"","sources":["../../../src/services/settings.service.ts"],"names":[],"mappings":"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"}
|
package/build/src/settings.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Collection of hard coded settings to be use centrally across services and user interfaces.
|
|
3
3
|
*
|
|
4
4
|
* # Naming convention:
|
|
5
|
-
* Keys should be name spaced following dot notation, e.g. notifications.
|
|
5
|
+
* Keys should be name spaced following dot notation and camel case, e.g. notifications.ghostMode.enabled`.
|
|
6
6
|
*
|
|
7
7
|
* ## Use Cases
|
|
8
8
|
* 1. Boolean "enabled" toggles should end in `*.enabled`. You should never use the inverse `*.disabled`
|
|
@@ -21,6 +21,8 @@ export declare const AMP_SETTINGS: {
|
|
|
21
21
|
* These are tenant level settings that are not meant to be overridden at the connector level
|
|
22
22
|
*/
|
|
23
23
|
tenant: {
|
|
24
|
+
/** Specifies the default connector for the `messages` delivery strategy. */
|
|
25
|
+
DEFAULT_NOTIFICATION_CONNECTOR_ID: import("./services").TypedAmpSettingsKey<string | undefined>;
|
|
24
26
|
/** Disables all automated messages from being sent to end users. */
|
|
25
27
|
GHOST_MODE: import("./services").TypedAmpSettingsKey<boolean>;
|
|
26
28
|
/** Enables mock providers on the tenant. */
|
|
@@ -34,14 +36,12 @@ export declare const AMP_SETTINGS: {
|
|
|
34
36
|
* - `ingen`: mocked data for ~250 users
|
|
35
37
|
*/
|
|
36
38
|
MOCK_TENANT_ID: import("./services").TypedAmpSettingsKey<string>;
|
|
37
|
-
/** Specifies the default connector for the `messages` delivery strategy. */
|
|
38
|
-
DEFAULT_NOTIFICATION_CONNECTOR_ID: import("./services").TypedAmpSettingsKey<string>;
|
|
39
39
|
};
|
|
40
40
|
/**
|
|
41
41
|
* GLOBAL
|
|
42
42
|
* Note: these can be overridden by connector level settings
|
|
43
43
|
*/
|
|
44
|
-
|
|
44
|
+
connectorDefaults: {
|
|
45
45
|
/** Not currently implemented/respected */
|
|
46
46
|
NOTIFICATIONS_ENABLED: import("./services").TypedAmpSettingsKey<boolean>;
|
|
47
47
|
};
|
|
@@ -54,12 +54,18 @@ export declare const AMP_SETTINGS: {
|
|
|
54
54
|
GOOGLE_PRIV_ACCESS_GROUPS: import("./services").TypedAmpSettingsKey<string[]>;
|
|
55
55
|
GOOGLE_SERV_ACCT_GROUPS: import("./services").TypedAmpSettingsKey<string[]>;
|
|
56
56
|
};
|
|
57
|
+
okta: {
|
|
58
|
+
OKTA_EXECUTIVE_GROUPS: import("./services").TypedAmpSettingsKey<string[]>;
|
|
59
|
+
OKTA_PROD_ACCESS_GROUPS: import("./services").TypedAmpSettingsKey<string[]>;
|
|
60
|
+
OKTA_PRIV_ACCESS_GROUPS: import("./services").TypedAmpSettingsKey<string[]>;
|
|
61
|
+
OKTA_SERV_ACCT_GROUPS: import("./services").TypedAmpSettingsKey<string[]>;
|
|
62
|
+
};
|
|
57
63
|
slack: {
|
|
58
64
|
SLACK_EXECUTIVE_GROUPS: import("./services").TypedAmpSettingsKey<string[]>;
|
|
59
65
|
SLACK_PROD_ACCESS_GROUPS: import("./services").TypedAmpSettingsKey<string[]>;
|
|
60
66
|
SLACK_PRIV_ACCESS_GROUPS: import("./services").TypedAmpSettingsKey<string[]>;
|
|
61
67
|
SLACK_SERV_ACCT_GROUPS: import("./services").TypedAmpSettingsKey<string[]>;
|
|
62
|
-
SLACK_CONTACT_SECURITY_CHANNEL: import("./services").TypedAmpSettingsKey<string>;
|
|
68
|
+
SLACK_CONTACT_SECURITY_CHANNEL: import("./services").TypedAmpSettingsKey<string | undefined>;
|
|
63
69
|
SLACK_CONTACT_SECURITY_TEMPLATE: import("./services").TypedAmpSettingsKey<string>;
|
|
64
70
|
};
|
|
65
71
|
};
|
package/build/src/settings.js
CHANGED
|
@@ -2,12 +2,66 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AMP_SETTINGS = void 0;
|
|
4
4
|
const services_1 = require("./services");
|
|
5
|
-
|
|
5
|
+
/**************************
|
|
6
|
+
* GLOBAL SETTINGS *
|
|
7
|
+
*************************/
|
|
8
|
+
/**
|
|
9
|
+
* GLOBAL ONLY
|
|
10
|
+
* ===========
|
|
11
|
+
* These are tenant level settings that are not meant to be overridden at the connector level
|
|
12
|
+
*/
|
|
13
|
+
const TENANT_SETTINGS = {
|
|
14
|
+
/** Disables all automated messages from being sent to end users. */
|
|
15
|
+
GHOST_MODE: services_1.AmpSettingsMap.asKey('notifications.ghostMode.enabled', false),
|
|
16
|
+
/** Enables mock providers on the tenant. */
|
|
17
|
+
ENABLE_MOCKS: services_1.AmpSettingsMap.asKey('mocks.enabled', false),
|
|
18
|
+
/**
|
|
19
|
+
* Specifies which mock tenant to use.
|
|
20
|
+
* - `david`: single insecure user
|
|
21
|
+
* - `ampsec`: founding team of amplifier security with mock data
|
|
22
|
+
* - `stryper`: branded small test tenant
|
|
23
|
+
* - `acme`: mocked data for ~25 users
|
|
24
|
+
* - `ingen`: mocked data for ~250 users
|
|
25
|
+
*/
|
|
26
|
+
MOCK_TENANT_ID: services_1.AmpSettingsMap.asKey('mocks.tenant.id', 'stryper'),
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* GLOBAL CONNECTOR DEFAULTS
|
|
30
|
+
* Note: these can be overridden by connector level settings
|
|
31
|
+
*/
|
|
32
|
+
const GLOBAL_CONNECTOR_DEFAULT_SETTINGS = {
|
|
33
|
+
/** Not currently implemented/respected */
|
|
34
|
+
NOTIFICATIONS_ENABLED: services_1.AmpSettingsMap.asKey('notifications.enabled', false),
|
|
35
|
+
};
|
|
36
|
+
/********************
|
|
37
|
+
* PROVIDERS *
|
|
38
|
+
********************/
|
|
39
|
+
const GOOGLE_SETTINGS = {
|
|
40
|
+
GOOGLE_EXECUTIVE_GROUPS: services_1.AmpSettingsMap.asKey('google.groups.exec.extIds', []),
|
|
41
|
+
GOOGLE_PROD_ACCESS_GROUPS: services_1.AmpSettingsMap.asKey('google.groups.prod.extIds', []),
|
|
42
|
+
GOOGLE_PRIV_ACCESS_GROUPS: services_1.AmpSettingsMap.asKey('google.groups.priv.extIds', []),
|
|
43
|
+
GOOGLE_SERV_ACCT_GROUPS: services_1.AmpSettingsMap.asKey('google.groups.servAcct.extIds', []),
|
|
44
|
+
};
|
|
45
|
+
const OKTA_SETTINGS = {
|
|
46
|
+
OKTA_EXECUTIVE_GROUPS: services_1.AmpSettingsMap.asKey('okta.groups.exec.extIds', []),
|
|
47
|
+
OKTA_PROD_ACCESS_GROUPS: services_1.AmpSettingsMap.asKey('okta.groups.prod.extIds', []),
|
|
48
|
+
OKTA_PRIV_ACCESS_GROUPS: services_1.AmpSettingsMap.asKey('okta.groups.priv.extIds', []),
|
|
49
|
+
OKTA_SERV_ACCT_GROUPS: services_1.AmpSettingsMap.asKey('okta.groups.servAcct.extIds', []),
|
|
50
|
+
};
|
|
51
|
+
const SLACK_SETTINGS = {
|
|
52
|
+
SLACK_EXECUTIVE_GROUPS: services_1.AmpSettingsMap.asKey('slack.groups.exec.extIds', []),
|
|
53
|
+
SLACK_PROD_ACCESS_GROUPS: services_1.AmpSettingsMap.asKey('slack.groups.prod.extIds', []),
|
|
54
|
+
SLACK_PRIV_ACCESS_GROUPS: services_1.AmpSettingsMap.asKey('slack.groups.priv.extIds', []),
|
|
55
|
+
SLACK_SERV_ACCT_GROUPS: services_1.AmpSettingsMap.asKey('slack.groups.servAcct.extIds', []),
|
|
56
|
+
SLACK_CONTACT_SECURITY_CHANNEL: services_1.AmpSettingsMap.asKey('slack.channels.security.extId'),
|
|
57
|
+
// TODO localization... does this get moved to contentful? Does the setting "point" to content in contentful?
|
|
58
|
+
SLACK_CONTACT_SECURITY_TEMPLATE: services_1.AmpSettingsMap.asKey('slack.templates.contactSecurity', 'Thanks for getting in touch! We forwarded your message to our security team and they will get back to you shortly.'),
|
|
59
|
+
};
|
|
6
60
|
/**
|
|
7
61
|
* Collection of hard coded settings to be use centrally across services and user interfaces.
|
|
8
62
|
*
|
|
9
63
|
* # Naming convention:
|
|
10
|
-
* Keys should be name spaced following dot notation, e.g. notifications.
|
|
64
|
+
* Keys should be name spaced following dot notation and camel case, e.g. notifications.ghostMode.enabled`.
|
|
11
65
|
*
|
|
12
66
|
* ## Use Cases
|
|
13
67
|
* 1. Boolean "enabled" toggles should end in `*.enabled`. You should never use the inverse `*.disabled`
|
|
@@ -26,19 +80,7 @@ exports.AMP_SETTINGS = {
|
|
|
26
80
|
* These are tenant level settings that are not meant to be overridden at the connector level
|
|
27
81
|
*/
|
|
28
82
|
tenant: {
|
|
29
|
-
|
|
30
|
-
GHOST_MODE: services_1.AmpSettingsMap.asKey('notifications.ghost_mode.enabled', false),
|
|
31
|
-
/** Enables mock providers on the tenant. */
|
|
32
|
-
ENABLE_MOCKS: services_1.AmpSettingsMap.asKey('mocks.enabled', false),
|
|
33
|
-
/**
|
|
34
|
-
* Specifies which mock tenant to use.
|
|
35
|
-
* - `david`: single insecure user
|
|
36
|
-
* - `ampsec`: founding team of amplifier security with mock data
|
|
37
|
-
* - `stryper`: branded small test tenant
|
|
38
|
-
* - `acme`: mocked data for ~25 users
|
|
39
|
-
* - `ingen`: mocked data for ~250 users
|
|
40
|
-
*/
|
|
41
|
-
MOCK_TENANT_ID: services_1.AmpSettingsMap.asKey('mocks.tenant.id', 'stryper'),
|
|
83
|
+
...TENANT_SETTINGS,
|
|
42
84
|
/** Specifies the default connector for the `messages` delivery strategy. */
|
|
43
85
|
DEFAULT_NOTIFICATION_CONNECTOR_ID: services_1.AmpSettingsMap.asKey('notifications.connectors.default.cid'),
|
|
44
86
|
},
|
|
@@ -46,27 +88,14 @@ exports.AMP_SETTINGS = {
|
|
|
46
88
|
* GLOBAL
|
|
47
89
|
* Note: these can be overridden by connector level settings
|
|
48
90
|
*/
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
NOTIFICATIONS_ENABLED: services_1.AmpSettingsMap.asKey('notifications.enabled', false),
|
|
91
|
+
connectorDefaults: {
|
|
92
|
+
...GLOBAL_CONNECTOR_DEFAULT_SETTINGS,
|
|
52
93
|
},
|
|
53
94
|
/********************
|
|
54
95
|
* PROVIDERS *
|
|
55
96
|
********************/
|
|
56
|
-
google: {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
GOOGLE_PRIV_ACCESS_GROUPS: services_1.AmpSettingsMap.asKey('google.groups.priv.extIds', []),
|
|
60
|
-
GOOGLE_SERV_ACCT_GROUPS: services_1.AmpSettingsMap.asKey('google.groups.serv_acct.extIds', []),
|
|
61
|
-
},
|
|
62
|
-
slack: {
|
|
63
|
-
SLACK_EXECUTIVE_GROUPS: services_1.AmpSettingsMap.asKey('slack.groups.exec.extIds', []),
|
|
64
|
-
SLACK_PROD_ACCESS_GROUPS: services_1.AmpSettingsMap.asKey('slack.groups.prod.extIds', []),
|
|
65
|
-
SLACK_PRIV_ACCESS_GROUPS: services_1.AmpSettingsMap.asKey('slack.groups.priv.extIds', []),
|
|
66
|
-
SLACK_SERV_ACCT_GROUPS: services_1.AmpSettingsMap.asKey('slack.groups.serv_acct.extIds', []),
|
|
67
|
-
SLACK_CONTACT_SECURITY_CHANNEL: services_1.AmpSettingsMap.asKey('slack.channels.contact_security.extId'),
|
|
68
|
-
// TODO localization... does this get moved to contentful? Does the setting "point" to content in contentful?
|
|
69
|
-
SLACK_CONTACT_SECURITY_TEMPLATE: services_1.AmpSettingsMap.asKey('slack.templates.contact_security', 'Thanks for getting in touch! We forwarded your message to our security team and they will get back to you shortly.'),
|
|
70
|
-
},
|
|
97
|
+
google: { ...GOOGLE_SETTINGS },
|
|
98
|
+
okta: { ...OKTA_SETTINGS },
|
|
99
|
+
slack: { ...SLACK_SETTINGS },
|
|
71
100
|
};
|
|
72
101
|
//# sourceMappingURL=settings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/settings.ts"],"names":[],"mappings":";;;AAAA,yCAA0C;AAE1C
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/settings.ts"],"names":[],"mappings":";;;AAAA,yCAA0C;AAE1C;;2BAE2B;AAC3B;;;;GAIG;AACH,MAAM,eAAe,GAAG;IACtB,oEAAoE;IACpE,UAAU,EAAE,yBAAc,CAAC,KAAK,CAAU,iCAAiC,EAAE,KAAK,CAAC;IACnF,4CAA4C;IAC5C,YAAY,EAAE,yBAAc,CAAC,KAAK,CAAU,eAAe,EAAE,KAAK,CAAC;IACnE;;;;;;;OAOG;IACH,cAAc,EAAE,yBAAc,CAAC,KAAK,CAAS,iBAAiB,EAAE,SAAS,CAAC;CAC3E,CAAC;AAEF;;;GAGG;AACH,MAAM,iCAAiC,GAAG;IACxC,0CAA0C;IAC1C,qBAAqB,EAAE,yBAAc,CAAC,KAAK,CAAU,uBAAuB,EAAE,KAAK,CAAC;CACrF,CAAC;AAEF;;sBAEsB;AACtB,MAAM,eAAe,GAAG;IACtB,uBAAuB,EAAE,yBAAc,CAAC,KAAK,CAAW,2BAA2B,EAAE,EAAE,CAAC;IACxF,yBAAyB,EAAE,yBAAc,CAAC,KAAK,CAAW,2BAA2B,EAAE,EAAE,CAAC;IAC1F,yBAAyB,EAAE,yBAAc,CAAC,KAAK,CAAW,2BAA2B,EAAE,EAAE,CAAC;IAC1F,uBAAuB,EAAE,yBAAc,CAAC,KAAK,CAAW,+BAA+B,EAAE,EAAE,CAAC;CAC7F,CAAC;AAEF,MAAM,aAAa,GAAG;IACpB,qBAAqB,EAAE,yBAAc,CAAC,KAAK,CAAW,yBAAyB,EAAE,EAAE,CAAC;IACpF,uBAAuB,EAAE,yBAAc,CAAC,KAAK,CAAW,yBAAyB,EAAE,EAAE,CAAC;IACtF,uBAAuB,EAAE,yBAAc,CAAC,KAAK,CAAW,yBAAyB,EAAE,EAAE,CAAC;IACtF,qBAAqB,EAAE,yBAAc,CAAC,KAAK,CAAW,6BAA6B,EAAE,EAAE,CAAC;CACzF,CAAC;AAEF,MAAM,cAAc,GAAG;IACrB,sBAAsB,EAAE,yBAAc,CAAC,KAAK,CAAW,0BAA0B,EAAE,EAAE,CAAC;IACtF,wBAAwB,EAAE,yBAAc,CAAC,KAAK,CAAW,0BAA0B,EAAE,EAAE,CAAC;IACxF,wBAAwB,EAAE,yBAAc,CAAC,KAAK,CAAW,0BAA0B,EAAE,EAAE,CAAC;IACxF,sBAAsB,EAAE,yBAAc,CAAC,KAAK,CAAW,8BAA8B,EAAE,EAAE,CAAC;IAC1F,8BAA8B,EAAE,yBAAc,CAAC,KAAK,CAAqB,+BAA+B,CAAC;IACzG,6GAA6G;IAC7G,+BAA+B,EAAE,yBAAc,CAAC,KAAK,CACnD,iCAAiC,EACjC,oHAAoH,CACrH;CACF,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACU,QAAA,YAAY,GAAG;IAC1B;;;;OAIG;IACH,MAAM,EAAE;QACN,GAAG,eAAe;QAClB,4EAA4E;QAC5E,iCAAiC,EAAE,yBAAc,CAAC,KAAK,CAAqB,sCAAsC,CAAC;KACpH;IACD;;;OAGG;IACH,iBAAiB,EAAE;QACjB,GAAG,iCAAiC;KACrC;IACD;;0BAEsB;IACtB,MAAM,EAAE,EAAC,GAAG,eAAe,EAAC;IAC5B,IAAI,EAAE,EAAC,GAAG,aAAa,EAAC;IACxB,KAAK,EAAE,EAAC,GAAG,cAAc,EAAC;CAC3B,CAAC"}
|
package/package.json
CHANGED
|
@@ -20,6 +20,17 @@ export class ConnectorInstallService {
|
|
|
20
20
|
return success;
|
|
21
21
|
};
|
|
22
22
|
|
|
23
|
+
getOauthInstallUrl = async (cid: string, provider: string, clientRedirectUrl: string): Promise<string> => {
|
|
24
|
+
const res = await this.rest.call({
|
|
25
|
+
url: `/${this.targetApi}/v1/install/oauth/token`,
|
|
26
|
+
method: 'POST',
|
|
27
|
+
data: {cid},
|
|
28
|
+
});
|
|
29
|
+
const token = (res.data as {token: string}).token;
|
|
30
|
+
return `${this.rest.baseUrl}/${this.targetApi}/v1/install/oauth/${provider}/login?token=${token}&redirectUrl=${encodeURIComponent(clientRedirectUrl)}`;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/** @deprecated */
|
|
23
34
|
getInstallToken = async (cid: string): Promise<string> => {
|
|
24
35
|
const res = await this.rest.call({
|
|
25
36
|
url: `/${this.targetApi}/v1/install/oauth/token`,
|
|
@@ -30,6 +41,7 @@ export class ConnectorInstallService {
|
|
|
30
41
|
return token;
|
|
31
42
|
};
|
|
32
43
|
|
|
44
|
+
/** @deprecated */
|
|
33
45
|
getRedirectUrl = async (token: string): Promise<string> => {
|
|
34
46
|
const res = await this.rest.call({
|
|
35
47
|
url: `/${this.targetApi}/v1/install/oauth/login`,
|
|
@@ -40,6 +52,7 @@ export class ConnectorInstallService {
|
|
|
40
52
|
return redirectUrl;
|
|
41
53
|
};
|
|
42
54
|
|
|
55
|
+
/** @deprecated */
|
|
43
56
|
buildInstallOAuthUrl = (token: string, redirectUrl: string): string => {
|
|
44
57
|
return `/${this.targetApi}/v1/install/oauth?token=${token}&redirect=${encodeURIComponent(redirectUrl)}`;
|
|
45
58
|
};
|
|
@@ -36,6 +36,7 @@ export type RestClientOptions = {
|
|
|
36
36
|
* RestClient is a generic interface for making REST calls.
|
|
37
37
|
*/
|
|
38
38
|
export interface RestClient {
|
|
39
|
+
baseUrl?: string;
|
|
39
40
|
strict: boolean;
|
|
40
41
|
call(_request: RestRequest): Promise<RestResponse>;
|
|
41
42
|
}
|
|
@@ -47,15 +48,15 @@ export interface RestClient {
|
|
|
47
48
|
*
|
|
48
49
|
* These strategies can be useful when scraping 3rd party APIs.
|
|
49
50
|
*/
|
|
50
|
-
export class DefaultRestClient {
|
|
51
|
+
export class DefaultRestClient implements RestClient {
|
|
51
52
|
protected readonly ampAxios: Axios;
|
|
52
53
|
protected readonly retryStrategy: RestClientRetryStrategy;
|
|
53
54
|
protected readonly rateLimitStrategy: RestClientRateLimitStrategy;
|
|
54
55
|
protected readonly logger: AmpLogger;
|
|
56
|
+
readonly baseUrl?: string;
|
|
55
57
|
readonly strict: boolean;
|
|
56
58
|
|
|
57
59
|
constructor(options: RestClientOptions = {}) {
|
|
58
|
-
// TODO: rest client
|
|
59
60
|
const client = options.client ?? axios;
|
|
60
61
|
this.ampAxios = client.create({
|
|
61
62
|
baseURL: options.baseUrl,
|
|
@@ -73,6 +74,7 @@ export class DefaultRestClient {
|
|
|
73
74
|
this.ampAxios.defaults.headers.put['Content-Type'] = 'application/json';
|
|
74
75
|
this.retryStrategy = options.retryStrategy ?? noopRestRetryStrategy;
|
|
75
76
|
this.rateLimitStrategy = options.rateLimitStrategy ?? noopRestClientRateLimitStrategy;
|
|
77
|
+
this.baseUrl = options.baseUrl;
|
|
76
78
|
this.strict = options.strict ?? false;
|
|
77
79
|
}
|
|
78
80
|
call = async (request: RestRequest): Promise<RestResponse> => {
|
|
@@ -118,7 +118,7 @@ export class AmpSettingsMap {
|
|
|
118
118
|
this.rawSettingsList = rawSettingsList;
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
getGlobalSetting = <T>(key: TypedAmpSettingsKey<T>): T
|
|
121
|
+
getGlobalSetting = <T>(key: TypedAmpSettingsKey<T>): T => {
|
|
122
122
|
const tenantVal = this.settings.tenantSettings[key.id];
|
|
123
123
|
if (!_.isNil(tenantVal)) {
|
|
124
124
|
return tenantVal as T;
|
|
@@ -126,7 +126,7 @@ export class AmpSettingsMap {
|
|
|
126
126
|
return key.defaultValue;
|
|
127
127
|
};
|
|
128
128
|
|
|
129
|
-
getConnectorSetting = <T>(cid: string, key: TypedAmpSettingsKey<T>): T
|
|
129
|
+
getConnectorSetting = <T>(cid: string, key: TypedAmpSettingsKey<T>): T => {
|
|
130
130
|
const tenantVal = this.settings.tenantSettings[key.id];
|
|
131
131
|
const connectorMap = this.settings.connectorSettings[cid];
|
|
132
132
|
if (connectorMap) {
|
package/src/settings.ts
CHANGED
|
@@ -1,11 +1,73 @@
|
|
|
1
1
|
import {AmpSettingsMap} from './services';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
/**************************
|
|
4
|
+
* GLOBAL SETTINGS *
|
|
5
|
+
*************************/
|
|
6
|
+
/**
|
|
7
|
+
* GLOBAL ONLY
|
|
8
|
+
* ===========
|
|
9
|
+
* These are tenant level settings that are not meant to be overridden at the connector level
|
|
10
|
+
*/
|
|
11
|
+
const TENANT_SETTINGS = {
|
|
12
|
+
/** Disables all automated messages from being sent to end users. */
|
|
13
|
+
GHOST_MODE: AmpSettingsMap.asKey<boolean>('notifications.ghostMode.enabled', false), // TODO enble by default
|
|
14
|
+
/** Enables mock providers on the tenant. */
|
|
15
|
+
ENABLE_MOCKS: AmpSettingsMap.asKey<boolean>('mocks.enabled', false),
|
|
16
|
+
/**
|
|
17
|
+
* Specifies which mock tenant to use.
|
|
18
|
+
* - `david`: single insecure user
|
|
19
|
+
* - `ampsec`: founding team of amplifier security with mock data
|
|
20
|
+
* - `stryper`: branded small test tenant
|
|
21
|
+
* - `acme`: mocked data for ~25 users
|
|
22
|
+
* - `ingen`: mocked data for ~250 users
|
|
23
|
+
*/
|
|
24
|
+
MOCK_TENANT_ID: AmpSettingsMap.asKey<string>('mocks.tenant.id', 'stryper'),
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* GLOBAL CONNECTOR DEFAULTS
|
|
29
|
+
* Note: these can be overridden by connector level settings
|
|
30
|
+
*/
|
|
31
|
+
const GLOBAL_CONNECTOR_DEFAULT_SETTINGS = {
|
|
32
|
+
/** Not currently implemented/respected */
|
|
33
|
+
NOTIFICATIONS_ENABLED: AmpSettingsMap.asKey<boolean>('notifications.enabled', false),
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/********************
|
|
37
|
+
* PROVIDERS *
|
|
38
|
+
********************/
|
|
39
|
+
const GOOGLE_SETTINGS = {
|
|
40
|
+
GOOGLE_EXECUTIVE_GROUPS: AmpSettingsMap.asKey<string[]>('google.groups.exec.extIds', []),
|
|
41
|
+
GOOGLE_PROD_ACCESS_GROUPS: AmpSettingsMap.asKey<string[]>('google.groups.prod.extIds', []),
|
|
42
|
+
GOOGLE_PRIV_ACCESS_GROUPS: AmpSettingsMap.asKey<string[]>('google.groups.priv.extIds', []),
|
|
43
|
+
GOOGLE_SERV_ACCT_GROUPS: AmpSettingsMap.asKey<string[]>('google.groups.servAcct.extIds', []),
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const OKTA_SETTINGS = {
|
|
47
|
+
OKTA_EXECUTIVE_GROUPS: AmpSettingsMap.asKey<string[]>('okta.groups.exec.extIds', []),
|
|
48
|
+
OKTA_PROD_ACCESS_GROUPS: AmpSettingsMap.asKey<string[]>('okta.groups.prod.extIds', []),
|
|
49
|
+
OKTA_PRIV_ACCESS_GROUPS: AmpSettingsMap.asKey<string[]>('okta.groups.priv.extIds', []),
|
|
50
|
+
OKTA_SERV_ACCT_GROUPS: AmpSettingsMap.asKey<string[]>('okta.groups.servAcct.extIds', []),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const SLACK_SETTINGS = {
|
|
54
|
+
SLACK_EXECUTIVE_GROUPS: AmpSettingsMap.asKey<string[]>('slack.groups.exec.extIds', []),
|
|
55
|
+
SLACK_PROD_ACCESS_GROUPS: AmpSettingsMap.asKey<string[]>('slack.groups.prod.extIds', []),
|
|
56
|
+
SLACK_PRIV_ACCESS_GROUPS: AmpSettingsMap.asKey<string[]>('slack.groups.priv.extIds', []),
|
|
57
|
+
SLACK_SERV_ACCT_GROUPS: AmpSettingsMap.asKey<string[]>('slack.groups.servAcct.extIds', []),
|
|
58
|
+
SLACK_CONTACT_SECURITY_CHANNEL: AmpSettingsMap.asKey<string | undefined>('slack.channels.security.extId'),
|
|
59
|
+
// TODO localization... does this get moved to contentful? Does the setting "point" to content in contentful?
|
|
60
|
+
SLACK_CONTACT_SECURITY_TEMPLATE: AmpSettingsMap.asKey<string>(
|
|
61
|
+
'slack.templates.contactSecurity',
|
|
62
|
+
'Thanks for getting in touch! We forwarded your message to our security team and they will get back to you shortly.'
|
|
63
|
+
),
|
|
64
|
+
};
|
|
65
|
+
|
|
4
66
|
/**
|
|
5
67
|
* Collection of hard coded settings to be use centrally across services and user interfaces.
|
|
6
68
|
*
|
|
7
69
|
* # Naming convention:
|
|
8
|
-
* Keys should be name spaced following dot notation, e.g. notifications.
|
|
70
|
+
* Keys should be name spaced following dot notation and camel case, e.g. notifications.ghostMode.enabled`.
|
|
9
71
|
*
|
|
10
72
|
* ## Use Cases
|
|
11
73
|
* 1. Boolean "enabled" toggles should end in `*.enabled`. You should never use the inverse `*.disabled`
|
|
@@ -24,49 +86,21 @@ export const AMP_SETTINGS = {
|
|
|
24
86
|
* These are tenant level settings that are not meant to be overridden at the connector level
|
|
25
87
|
*/
|
|
26
88
|
tenant: {
|
|
27
|
-
|
|
28
|
-
GHOST_MODE: AmpSettingsMap.asKey<boolean>('notifications.ghost_mode.enabled', false), // TODO enble by default
|
|
29
|
-
/** Enables mock providers on the tenant. */
|
|
30
|
-
ENABLE_MOCKS: AmpSettingsMap.asKey<boolean>('mocks.enabled', false),
|
|
31
|
-
/**
|
|
32
|
-
* Specifies which mock tenant to use.
|
|
33
|
-
* - `david`: single insecure user
|
|
34
|
-
* - `ampsec`: founding team of amplifier security with mock data
|
|
35
|
-
* - `stryper`: branded small test tenant
|
|
36
|
-
* - `acme`: mocked data for ~25 users
|
|
37
|
-
* - `ingen`: mocked data for ~250 users
|
|
38
|
-
*/
|
|
39
|
-
MOCK_TENANT_ID: AmpSettingsMap.asKey<string>('mocks.tenant.id', 'stryper'),
|
|
89
|
+
...TENANT_SETTINGS,
|
|
40
90
|
/** Specifies the default connector for the `messages` delivery strategy. */
|
|
41
|
-
DEFAULT_NOTIFICATION_CONNECTOR_ID: AmpSettingsMap.asKey<string>('notifications.connectors.default.cid'),
|
|
91
|
+
DEFAULT_NOTIFICATION_CONNECTOR_ID: AmpSettingsMap.asKey<string | undefined>('notifications.connectors.default.cid'),
|
|
42
92
|
},
|
|
43
93
|
/**
|
|
44
94
|
* GLOBAL
|
|
45
95
|
* Note: these can be overridden by connector level settings
|
|
46
96
|
*/
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
NOTIFICATIONS_ENABLED: AmpSettingsMap.asKey<boolean>('notifications.enabled', false),
|
|
97
|
+
connectorDefaults: {
|
|
98
|
+
...GLOBAL_CONNECTOR_DEFAULT_SETTINGS,
|
|
50
99
|
},
|
|
51
100
|
/********************
|
|
52
101
|
* PROVIDERS *
|
|
53
102
|
********************/
|
|
54
|
-
google: {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
GOOGLE_PRIV_ACCESS_GROUPS: AmpSettingsMap.asKey<string[]>('google.groups.priv.extIds', []),
|
|
58
|
-
GOOGLE_SERV_ACCT_GROUPS: AmpSettingsMap.asKey<string[]>('google.groups.serv_acct.extIds', []),
|
|
59
|
-
},
|
|
60
|
-
slack: {
|
|
61
|
-
SLACK_EXECUTIVE_GROUPS: AmpSettingsMap.asKey<string[]>('slack.groups.exec.extIds', []),
|
|
62
|
-
SLACK_PROD_ACCESS_GROUPS: AmpSettingsMap.asKey<string[]>('slack.groups.prod.extIds', []),
|
|
63
|
-
SLACK_PRIV_ACCESS_GROUPS: AmpSettingsMap.asKey<string[]>('slack.groups.priv.extIds', []),
|
|
64
|
-
SLACK_SERV_ACCT_GROUPS: AmpSettingsMap.asKey<string[]>('slack.groups.serv_acct.extIds', []),
|
|
65
|
-
SLACK_CONTACT_SECURITY_CHANNEL: AmpSettingsMap.asKey<string>('slack.channels.contact_security.extId'),
|
|
66
|
-
// TODO localization... does this get moved to contentful? Does the setting "point" to content in contentful?
|
|
67
|
-
SLACK_CONTACT_SECURITY_TEMPLATE: AmpSettingsMap.asKey<string>(
|
|
68
|
-
'slack.templates.contact_security',
|
|
69
|
-
'Thanks for getting in touch! We forwarded your message to our security team and they will get back to you shortly.'
|
|
70
|
-
),
|
|
71
|
-
},
|
|
103
|
+
google: {...GOOGLE_SETTINGS},
|
|
104
|
+
okta: {...OKTA_SETTINGS},
|
|
105
|
+
slack: {...SLACK_SETTINGS},
|
|
72
106
|
};
|