@oondemand/oon-core-back 0.5.5 → 0.6.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/package.json +2 -3
- package/src/api/core.routes.js +0 -2
- package/src/boot/createApp.js +0 -7
- package/src/boot/database.js +0 -34
- package/src/boot/loadCentral.js +0 -6
- package/src/capabilities/pdfRendering.js +9 -9
- package/src/core/define.js +1 -6
- package/src/core/models/Sistema.js +2 -10
- package/src/core/registry.js +0 -8
- package/src/deploy/render.js +0 -2
- package/src/deploy/templates/secret.yaml +0 -2
- package/src/index.js +2 -16
- package/src/manifest/appManifest.js +5 -22
- package/bin/integration-worker.js +0 -31
- package/src/modules/integrations/index.js +0 -26
- package/src/modules/integrations/models.js +0 -112
- package/src/modules/integrations/registry.js +0 -171
- package/src/modules/integrations/routes.js +0 -343
- package/src/modules/integrations/runtime/inbox.js +0 -134
- package/src/modules/integrations/runtime/lease.js +0 -94
- package/src/modules/integrations/runtime/outbox.js +0 -199
- package/src/modules/integrations/runtime/sync.js +0 -85
- package/src/modules/integrations/runtime/tracking.js +0 -89
- package/src/modules/integrations/runtime/utils.js +0 -71
- package/src/modules/integrations/runtime.js +0 -10
- package/src/modules/integrations/sanitizer.js +0 -96
- package/src/modules/integrations/worker.js +0 -56
- package/src/modules/omie/client.js +0 -282
- package/src/modules/omie/definitions.js +0 -212
- package/src/modules/omie/index.js +0 -33
- package/src/modules/omie/models.js +0 -377
- package/src/modules/omie/provider.js +0 -529
|
@@ -1,377 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const crypto = require("node:crypto");
|
|
4
|
-
const mongoose = require("mongoose");
|
|
5
|
-
const GenericError = require("../../core/errors/GenericError");
|
|
6
|
-
|
|
7
|
-
const SECRET_PREFIX = "oon:v1";
|
|
8
|
-
const DEFAULT_BASE_URL = "https://app.omie.com.br/api/v1";
|
|
9
|
-
|
|
10
|
-
function encryptionSecret() {
|
|
11
|
-
return String(
|
|
12
|
-
process.env.OON_CREDENTIALS_ENCRYPTION_KEY
|
|
13
|
-
|| process.env.INSTANCE_CREDENTIAL_ENCRYPTION_KEY
|
|
14
|
-
|| process.env.OMIE_CREDENTIALS_ENCRYPTION_KEY
|
|
15
|
-
|| "",
|
|
16
|
-
).trim();
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function encryptionKey() {
|
|
20
|
-
const secret = encryptionSecret();
|
|
21
|
-
if (!secret) {
|
|
22
|
-
throw new GenericError(
|
|
23
|
-
"Configure OON_CREDENTIALS_ENCRYPTION_KEY ou disponibilize INSTANCE_CREDENTIAL_ENCRYPTION_KEY para persistir credenciais Omie.",
|
|
24
|
-
{ statusCode: 503 },
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
return crypto.createHash("sha256").update(secret).digest();
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function encryptSecret(value) {
|
|
31
|
-
const clear = String(value || "");
|
|
32
|
-
if (!clear) return "";
|
|
33
|
-
const iv = crypto.randomBytes(12);
|
|
34
|
-
const cipher = crypto.createCipheriv("aes-256-gcm", encryptionKey(), iv);
|
|
35
|
-
const encrypted = Buffer.concat([cipher.update(clear, "utf8"), cipher.final()]);
|
|
36
|
-
const tag = cipher.getAuthTag();
|
|
37
|
-
return [SECRET_PREFIX, iv.toString("base64url"), tag.toString("base64url"), encrypted.toString("base64url")].join(":");
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function decryptSecret(value) {
|
|
41
|
-
const encrypted = String(value || "");
|
|
42
|
-
if (!encrypted) return "";
|
|
43
|
-
const [namespace, version, ivValue, tagValue, payloadValue] = encrypted.split(":");
|
|
44
|
-
if (`${namespace}:${version}` !== SECRET_PREFIX || !ivValue || !tagValue || !payloadValue) {
|
|
45
|
-
throw new GenericError("Credencial Omie armazenada em formato inválido.", { statusCode: 500 });
|
|
46
|
-
}
|
|
47
|
-
const decipher = crypto.createDecipheriv(
|
|
48
|
-
"aes-256-gcm",
|
|
49
|
-
encryptionKey(),
|
|
50
|
-
Buffer.from(ivValue, "base64url"),
|
|
51
|
-
);
|
|
52
|
-
decipher.setAuthTag(Buffer.from(tagValue, "base64url"));
|
|
53
|
-
return Buffer.concat([
|
|
54
|
-
decipher.update(Buffer.from(payloadValue, "base64url")),
|
|
55
|
-
decipher.final(),
|
|
56
|
-
]).toString("utf8");
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function maskSecret(value) {
|
|
60
|
-
const clear = String(value || "");
|
|
61
|
-
if (!clear) return "";
|
|
62
|
-
if (clear.length <= 4) return "••••";
|
|
63
|
-
return `${clear.slice(0, 2)}${"•".repeat(Math.min(8, clear.length - 4))}${clear.slice(-2)}`;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function generateWebhookToken() {
|
|
67
|
-
return crypto.randomBytes(32).toString("base64url");
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function normalizeInstanceId(value) {
|
|
71
|
-
const instanceId = String(value || "default").trim().toLowerCase();
|
|
72
|
-
if (!/^[a-z0-9][a-z0-9._-]*$/.test(instanceId)) {
|
|
73
|
-
throw new GenericError("Identificador da instância Omie inválido.", { statusCode: 422 });
|
|
74
|
-
}
|
|
75
|
-
return instanceId;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function configurationSchema() {
|
|
79
|
-
const schema = new mongoose.Schema({
|
|
80
|
-
instanceId: { type: String, required: true, unique: true, index: true },
|
|
81
|
-
label: { type: String, required: true, default: "Omie" },
|
|
82
|
-
active: { type: Boolean, default: true, index: true },
|
|
83
|
-
environment: { type: String, enum: ["homologation", "production"], default: "production" },
|
|
84
|
-
baseUrl: { type: String, required: true, default: DEFAULT_BASE_URL },
|
|
85
|
-
appKeyEncrypted: { type: String, default: "", select: false },
|
|
86
|
-
appSecretEncrypted: { type: String, default: "", select: false },
|
|
87
|
-
webhookTokenEncrypted: { type: String, default: "", select: false },
|
|
88
|
-
appKeyMasked: { type: String, default: "" },
|
|
89
|
-
credentialsConfigured: { type: Boolean, default: false },
|
|
90
|
-
webhookConfigured: { type: Boolean, default: false },
|
|
91
|
-
connectionStatus: { type: String, enum: ["not-tested", "ok", "error"], default: "not-tested" },
|
|
92
|
-
lastConnectionError: { type: String, default: "" },
|
|
93
|
-
lastConnectionTestAt: { type: Date, default: null },
|
|
94
|
-
}, { timestamps: true, minimize: false, strict: true });
|
|
95
|
-
return schema;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
function listStateSchema() {
|
|
99
|
-
const schema = new mongoose.Schema({
|
|
100
|
-
provider: { type: String, default: "omie", index: true },
|
|
101
|
-
instanceId: { type: String, required: true, index: true },
|
|
102
|
-
listKey: { type: String, required: true, index: true },
|
|
103
|
-
status: { type: String, default: "not-run", index: true },
|
|
104
|
-
cursor: { type: mongoose.Schema.Types.Mixed, default: null },
|
|
105
|
-
lastStartedAt: { type: Date, default: null },
|
|
106
|
-
lastCompletedAt: { type: Date, default: null },
|
|
107
|
-
summary: { type: mongoose.Schema.Types.Mixed, default: {} },
|
|
108
|
-
diagnostic: { type: mongoose.Schema.Types.Mixed, default: {} },
|
|
109
|
-
}, { timestamps: true, minimize: false, strict: true });
|
|
110
|
-
schema.index({ provider: 1, instanceId: 1, listKey: 1 }, { unique: true });
|
|
111
|
-
return schema;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
function getOmieModels() {
|
|
115
|
-
return {
|
|
116
|
-
Configuration: mongoose.models.OonOmieConfiguration
|
|
117
|
-
|| mongoose.model("OonOmieConfiguration", configurationSchema(), "oon_omie_configurations"),
|
|
118
|
-
ListState: mongoose.models.OonOmieListState
|
|
119
|
-
|| mongoose.model("OonOmieListState", listStateSchema(), "oon_omie_list_states"),
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
function instanceEnvPrefix(instanceId) {
|
|
124
|
-
return normalizeInstanceId(instanceId).replace(/[^a-z0-9]/g, "_").toUpperCase();
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
function environmentCredentials(instanceId) {
|
|
128
|
-
const normalized = normalizeInstanceId(instanceId);
|
|
129
|
-
const prefix = instanceEnvPrefix(normalized);
|
|
130
|
-
const specific = normalized === "default" ? "OMIE" : `OMIE_${prefix}`;
|
|
131
|
-
return {
|
|
132
|
-
appKey: String(process.env[`${specific}_APP_KEY`] || "").trim(),
|
|
133
|
-
appSecret: String(process.env[`${specific}_APP_SECRET`] || "").trim(),
|
|
134
|
-
webhookToken: String(process.env[`${specific}_WEBHOOK_TOKEN`] || "").trim(),
|
|
135
|
-
baseUrl: String(process.env[`${specific}_BASE_URL`] || process.env.API_OMIE || DEFAULT_BASE_URL).trim(),
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
function publicConfiguration(document) {
|
|
140
|
-
if (!document) return null;
|
|
141
|
-
const value = typeof document.toObject === "function" ? document.toObject() : { ...document };
|
|
142
|
-
value.webhookConfigured = Boolean(value.webhookConfigured || value.webhookTokenEncrypted);
|
|
143
|
-
delete value.appKeyEncrypted;
|
|
144
|
-
delete value.appSecretEncrypted;
|
|
145
|
-
delete value.webhookTokenEncrypted;
|
|
146
|
-
return value;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
async function listOmieConfigurations() {
|
|
150
|
-
const { Configuration } = getOmieModels();
|
|
151
|
-
const persisted = await Configuration.find({})
|
|
152
|
-
.select("+webhookTokenEncrypted")
|
|
153
|
-
.sort({ label: 1, instanceId: 1 })
|
|
154
|
-
.lean();
|
|
155
|
-
if (persisted.length) return persisted.map(publicConfiguration);
|
|
156
|
-
const env = environmentCredentials("default");
|
|
157
|
-
return [{
|
|
158
|
-
instanceId: "default",
|
|
159
|
-
label: "Omie",
|
|
160
|
-
active: true,
|
|
161
|
-
environment: "production",
|
|
162
|
-
baseUrl: env.baseUrl,
|
|
163
|
-
appKeyMasked: maskSecret(env.appKey),
|
|
164
|
-
credentialsConfigured: Boolean(env.appKey && env.appSecret),
|
|
165
|
-
webhookConfigured: Boolean(env.webhookToken),
|
|
166
|
-
connectionStatus: "not-tested",
|
|
167
|
-
lastConnectionError: "",
|
|
168
|
-
lastConnectionTestAt: null,
|
|
169
|
-
source: "environment",
|
|
170
|
-
}];
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
async function saveOmieConfiguration(instanceId, input = {}) {
|
|
174
|
-
const normalized = normalizeInstanceId(instanceId);
|
|
175
|
-
const { Configuration } = getOmieModels();
|
|
176
|
-
const current = await Configuration.findOne({ instanceId: normalized })
|
|
177
|
-
.select("+appKeyEncrypted +appSecretEncrypted +webhookTokenEncrypted");
|
|
178
|
-
const update = {
|
|
179
|
-
instanceId: normalized,
|
|
180
|
-
label: String(input.label || current?.label || (normalized === "default" ? "Omie" : normalized)).trim(),
|
|
181
|
-
active: input.active !== undefined ? Boolean(input.active) : (current?.active ?? true),
|
|
182
|
-
environment: ["homologation", "production"].includes(input.environment)
|
|
183
|
-
? input.environment
|
|
184
|
-
: (current?.environment || "production"),
|
|
185
|
-
baseUrl: String(input.baseUrl || current?.baseUrl || environmentCredentials(normalized).baseUrl || DEFAULT_BASE_URL)
|
|
186
|
-
.trim()
|
|
187
|
-
.replace(/\/+$/, ""),
|
|
188
|
-
};
|
|
189
|
-
|
|
190
|
-
const appKey = String(input.appKey || "").trim();
|
|
191
|
-
const appSecret = String(input.appSecret || "").trim();
|
|
192
|
-
const webhookToken = String(input.webhookToken || "").trim();
|
|
193
|
-
const env = environmentCredentials(normalized);
|
|
194
|
-
if (appKey) {
|
|
195
|
-
update.appKeyEncrypted = encryptSecret(appKey);
|
|
196
|
-
update.appKeyMasked = maskSecret(appKey);
|
|
197
|
-
} else if (current?.appKeyEncrypted) {
|
|
198
|
-
update.appKeyEncrypted = current.appKeyEncrypted;
|
|
199
|
-
update.appKeyMasked = current.appKeyMasked;
|
|
200
|
-
}
|
|
201
|
-
if (appSecret) update.appSecretEncrypted = encryptSecret(appSecret);
|
|
202
|
-
else if (current?.appSecretEncrypted) update.appSecretEncrypted = current.appSecretEncrypted;
|
|
203
|
-
|
|
204
|
-
const effectiveWebhookToken = webhookToken
|
|
205
|
-
|| (current?.webhookTokenEncrypted ? decryptSecret(current.webhookTokenEncrypted) : env.webhookToken)
|
|
206
|
-
|| generateWebhookToken();
|
|
207
|
-
update.webhookTokenEncrypted = encryptSecret(effectiveWebhookToken);
|
|
208
|
-
update.webhookConfigured = true;
|
|
209
|
-
const effectiveKey = appKey || (current?.appKeyEncrypted ? decryptSecret(current.appKeyEncrypted) : env.appKey);
|
|
210
|
-
const effectiveSecret = appSecret
|
|
211
|
-
|| (current?.appSecretEncrypted ? decryptSecret(current.appSecretEncrypted) : env.appSecret);
|
|
212
|
-
update.credentialsConfigured = Boolean(effectiveKey && effectiveSecret);
|
|
213
|
-
if (update.active && !update.credentialsConfigured) {
|
|
214
|
-
throw new GenericError(
|
|
215
|
-
"Configure App Key e App Secret antes de ativar a integração Omie.",
|
|
216
|
-
{ statusCode: 422 },
|
|
217
|
-
);
|
|
218
|
-
}
|
|
219
|
-
if (appKey || appSecret || input.baseUrl) {
|
|
220
|
-
update.connectionStatus = "not-tested";
|
|
221
|
-
update.lastConnectionError = "";
|
|
222
|
-
update.lastConnectionTestAt = null;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
const saved = await Configuration.findOneAndUpdate(
|
|
226
|
-
{ instanceId: normalized },
|
|
227
|
-
{ $set: update },
|
|
228
|
-
{ upsert: true, new: true, setDefaultsOnInsert: true, runValidators: true },
|
|
229
|
-
).lean();
|
|
230
|
-
return publicConfiguration(saved);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
async function resolveOmieConfiguration(instanceId = "default", options = {}) {
|
|
234
|
-
const normalized = normalizeInstanceId(instanceId);
|
|
235
|
-
const { Configuration } = getOmieModels();
|
|
236
|
-
let query = Configuration.findOne({ instanceId: normalized });
|
|
237
|
-
if (options.includeSecrets) {
|
|
238
|
-
query = query.select("+appKeyEncrypted +appSecretEncrypted +webhookTokenEncrypted");
|
|
239
|
-
}
|
|
240
|
-
const persisted = await query.lean();
|
|
241
|
-
const env = environmentCredentials(normalized);
|
|
242
|
-
if (!persisted) {
|
|
243
|
-
return {
|
|
244
|
-
instanceId: normalized,
|
|
245
|
-
label: normalized === "default" ? "Omie" : normalized,
|
|
246
|
-
active: true,
|
|
247
|
-
environment: "production",
|
|
248
|
-
baseUrl: env.baseUrl,
|
|
249
|
-
appKey: options.includeSecrets ? env.appKey : undefined,
|
|
250
|
-
appSecret: options.includeSecrets ? env.appSecret : undefined,
|
|
251
|
-
webhookToken: options.includeSecrets ? env.webhookToken : undefined,
|
|
252
|
-
appKeyMasked: maskSecret(env.appKey),
|
|
253
|
-
credentialsConfigured: Boolean(env.appKey && env.appSecret),
|
|
254
|
-
webhookConfigured: Boolean(env.webhookToken),
|
|
255
|
-
connectionStatus: "not-tested",
|
|
256
|
-
source: "environment",
|
|
257
|
-
};
|
|
258
|
-
}
|
|
259
|
-
const result = publicConfiguration(persisted);
|
|
260
|
-
if (options.includeSecrets) {
|
|
261
|
-
result.appKey = persisted.appKeyEncrypted ? decryptSecret(persisted.appKeyEncrypted) : env.appKey;
|
|
262
|
-
result.appSecret = persisted.appSecretEncrypted ? decryptSecret(persisted.appSecretEncrypted) : env.appSecret;
|
|
263
|
-
result.webhookToken = persisted.webhookTokenEncrypted
|
|
264
|
-
? decryptSecret(persisted.webhookTokenEncrypted)
|
|
265
|
-
: env.webhookToken;
|
|
266
|
-
}
|
|
267
|
-
return result;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
async function ensureOmieWebhookAccess(instanceId = "default", options = {}) {
|
|
271
|
-
const normalized = normalizeInstanceId(instanceId);
|
|
272
|
-
const rotate = Boolean(options.rotate);
|
|
273
|
-
const { Configuration } = getOmieModels();
|
|
274
|
-
const env = environmentCredentials(normalized);
|
|
275
|
-
const current = await Configuration.findOne({ instanceId: normalized })
|
|
276
|
-
.select("+appKeyEncrypted +appSecretEncrypted +webhookTokenEncrypted");
|
|
277
|
-
|
|
278
|
-
let token = !rotate && current?.webhookTokenEncrypted
|
|
279
|
-
? decryptSecret(current.webhookTokenEncrypted)
|
|
280
|
-
: (!rotate ? env.webhookToken : "");
|
|
281
|
-
if (!token) token = generateWebhookToken();
|
|
282
|
-
|
|
283
|
-
if (!current) {
|
|
284
|
-
await saveOmieConfiguration(normalized, {
|
|
285
|
-
label: normalized === "default" ? "Omie" : normalized,
|
|
286
|
-
active: Boolean(env.appKey && env.appSecret),
|
|
287
|
-
baseUrl: env.baseUrl,
|
|
288
|
-
...(env.appKey ? { appKey: env.appKey } : {}),
|
|
289
|
-
...(env.appSecret ? { appSecret: env.appSecret } : {}),
|
|
290
|
-
webhookToken: token,
|
|
291
|
-
});
|
|
292
|
-
} else if (rotate || !current.webhookTokenEncrypted) {
|
|
293
|
-
await Configuration.updateOne(
|
|
294
|
-
{ instanceId: normalized },
|
|
295
|
-
{
|
|
296
|
-
$set: {
|
|
297
|
-
webhookTokenEncrypted: encryptSecret(token),
|
|
298
|
-
webhookConfigured: true,
|
|
299
|
-
},
|
|
300
|
-
},
|
|
301
|
-
);
|
|
302
|
-
} else if (!current.webhookConfigured) {
|
|
303
|
-
await Configuration.updateOne(
|
|
304
|
-
{ instanceId: normalized },
|
|
305
|
-
{ $set: { webhookConfigured: true } },
|
|
306
|
-
);
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
return {
|
|
310
|
-
instanceId: normalized,
|
|
311
|
-
webhookConfigured: true,
|
|
312
|
-
rotated: rotate,
|
|
313
|
-
webhookPath: `/integrations/webhooks/omie/${encodeURIComponent(token)}`,
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
async function rotateOmieWebhookToken(instanceId = "default") {
|
|
318
|
-
return ensureOmieWebhookAccess(instanceId, { rotate: true });
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
async function updateConnectionStatus(instanceId, result = {}) {
|
|
322
|
-
const normalized = normalizeInstanceId(instanceId);
|
|
323
|
-
const { Configuration } = getOmieModels();
|
|
324
|
-
await Configuration.updateOne(
|
|
325
|
-
{ instanceId: normalized },
|
|
326
|
-
{
|
|
327
|
-
$set: {
|
|
328
|
-
connectionStatus: result.ok ? "ok" : "error",
|
|
329
|
-
lastConnectionError: result.ok ? "" : String(result.error || "Falha na conexão."),
|
|
330
|
-
lastConnectionTestAt: new Date(),
|
|
331
|
-
},
|
|
332
|
-
},
|
|
333
|
-
);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
async function resolveInstanceByWebhookToken(token) {
|
|
337
|
-
const candidate = String(token || "");
|
|
338
|
-
if (!candidate) return null;
|
|
339
|
-
const { Configuration } = getOmieModels();
|
|
340
|
-
const configurations = await Configuration.find({ active: true })
|
|
341
|
-
.select("+webhookTokenEncrypted")
|
|
342
|
-
.lean();
|
|
343
|
-
for (const configuration of configurations) {
|
|
344
|
-
if (!configuration.webhookTokenEncrypted) continue;
|
|
345
|
-
const expected = decryptSecret(configuration.webhookTokenEncrypted);
|
|
346
|
-
const left = Buffer.from(candidate);
|
|
347
|
-
const right = Buffer.from(expected);
|
|
348
|
-
if (left.length === right.length && crypto.timingSafeEqual(left, right)) {
|
|
349
|
-
return configuration.instanceId;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
const env = environmentCredentials("default");
|
|
353
|
-
if (env.webhookToken) {
|
|
354
|
-
const left = Buffer.from(candidate);
|
|
355
|
-
const right = Buffer.from(env.webhookToken);
|
|
356
|
-
if (left.length === right.length && crypto.timingSafeEqual(left, right)) return "default";
|
|
357
|
-
}
|
|
358
|
-
return null;
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
module.exports = {
|
|
362
|
-
DEFAULT_BASE_URL,
|
|
363
|
-
decryptSecret,
|
|
364
|
-
encryptSecret,
|
|
365
|
-
ensureOmieWebhookAccess,
|
|
366
|
-
generateWebhookToken,
|
|
367
|
-
getOmieModels,
|
|
368
|
-
listOmieConfigurations,
|
|
369
|
-
maskSecret,
|
|
370
|
-
normalizeInstanceId,
|
|
371
|
-
publicConfiguration,
|
|
372
|
-
resolveInstanceByWebhookToken,
|
|
373
|
-
resolveOmieConfiguration,
|
|
374
|
-
rotateOmieWebhookToken,
|
|
375
|
-
saveOmieConfiguration,
|
|
376
|
-
updateConnectionStatus,
|
|
377
|
-
};
|