@budibase/pro 3.2.20 → 3.2.22
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/dist/index.js +210 -269
- package/dist/index.js.map +4 -4
- package/dist/index.js.meta.json +1 -1
- package/dist/sdk/users/users.d.ts +0 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/dist/sdk/api/api.d.ts +0 -2
- package/dist/sdk/api/index.d.ts +0 -1
package/dist/index.js
CHANGED
|
@@ -5744,7 +5744,7 @@ var src_exports = {};
|
|
|
5744
5744
|
__export(src_exports, {
|
|
5745
5745
|
Method: () => Method,
|
|
5746
5746
|
ai: () => ai_exports2,
|
|
5747
|
-
api: () =>
|
|
5747
|
+
api: () => api_exports,
|
|
5748
5748
|
auditLogs: () => auditLogs_exports3,
|
|
5749
5749
|
automations: () => automations_exports,
|
|
5750
5750
|
backups: () => backups_default,
|
|
@@ -8775,65 +8775,12 @@ var removeCustomAIConfigs = async (count) => {
|
|
|
8775
8775
|
var users_exports = {};
|
|
8776
8776
|
__export(users_exports, {
|
|
8777
8777
|
addAppBuilder: () => addAppBuilder2,
|
|
8778
|
-
createActivity: () => createActivity2,
|
|
8779
8778
|
db: () => db3,
|
|
8780
8779
|
removeAppBuilder: () => removeAppBuilder2
|
|
8781
8780
|
});
|
|
8782
8781
|
|
|
8783
|
-
// src/sdk/api/api.ts
|
|
8784
|
-
var import_backend_core25 = require("@budibase/backend-core");
|
|
8785
|
-
var api2 = new api_default(import_backend_core25.env.ACCOUNT_PORTAL_URL);
|
|
8786
|
-
var createActivity = async (userId, data) => {
|
|
8787
|
-
const response = await send(
|
|
8788
|
-
(options) => api2.post(`/api/users/${userId}/activity`, options),
|
|
8789
|
-
{
|
|
8790
|
-
body: data
|
|
8791
|
-
}
|
|
8792
|
-
);
|
|
8793
|
-
if (!response) {
|
|
8794
|
-
return;
|
|
8795
|
-
}
|
|
8796
|
-
if (response.status !== 201) {
|
|
8797
|
-
const text = await response.text();
|
|
8798
|
-
const message = `Error creating account user activity: ${text}`;
|
|
8799
|
-
import_backend_core25.logging.logAlert(message);
|
|
8800
|
-
throw new Error(message);
|
|
8801
|
-
}
|
|
8802
|
-
return response.json();
|
|
8803
|
-
};
|
|
8804
|
-
var send = async (requestFn, baseOptions) => {
|
|
8805
|
-
const headers = await authorizationHeaders();
|
|
8806
|
-
const options = {
|
|
8807
|
-
...baseOptions,
|
|
8808
|
-
headers: {
|
|
8809
|
-
...baseOptions.headers,
|
|
8810
|
-
...headers
|
|
8811
|
-
}
|
|
8812
|
-
};
|
|
8813
|
-
return requestFn(options);
|
|
8814
|
-
};
|
|
8815
|
-
var authorizationHeaders = async () => {
|
|
8816
|
-
if (import_backend_core25.env.SELF_HOSTED) {
|
|
8817
|
-
const licenseInfo = await licenseInfo_exports.get();
|
|
8818
|
-
if (licenseInfo.licenseKey) {
|
|
8819
|
-
const licenseKey = licenseInfo.licenseKey;
|
|
8820
|
-
return {
|
|
8821
|
-
[import_backend_core25.constants.Header.LICENSE_KEY]: licenseKey
|
|
8822
|
-
};
|
|
8823
|
-
} else {
|
|
8824
|
-
return {};
|
|
8825
|
-
}
|
|
8826
|
-
} else {
|
|
8827
|
-
const tenantId = import_backend_core25.tenancy.getTenantId();
|
|
8828
|
-
return {
|
|
8829
|
-
[import_backend_core25.constants.Header.API_KEY]: import_backend_core25.env.ACCOUNT_PORTAL_API_KEY,
|
|
8830
|
-
[import_backend_core25.constants.Header.TENANT_ID]: tenantId
|
|
8831
|
-
};
|
|
8832
|
-
}
|
|
8833
|
-
};
|
|
8834
|
-
|
|
8835
8782
|
// src/sdk/users/users.ts
|
|
8836
|
-
var
|
|
8783
|
+
var import_backend_core27 = require("@budibase/backend-core");
|
|
8837
8784
|
|
|
8838
8785
|
// src/sdk/groups/index.ts
|
|
8839
8786
|
var groups_exports2 = {};
|
|
@@ -8856,11 +8803,11 @@ __export(groups_exports2, {
|
|
|
8856
8803
|
});
|
|
8857
8804
|
|
|
8858
8805
|
// src/sdk/groups/groups.ts
|
|
8859
|
-
var
|
|
8806
|
+
var import_backend_core26 = require("@budibase/backend-core");
|
|
8860
8807
|
|
|
8861
8808
|
// src/api/errors.ts
|
|
8862
|
-
var
|
|
8863
|
-
var GroupNameUnavailableError = class extends
|
|
8809
|
+
var import_backend_core25 = require("@budibase/backend-core");
|
|
8810
|
+
var GroupNameUnavailableError = class extends import_backend_core25.HTTPError {
|
|
8864
8811
|
constructor(groupName) {
|
|
8865
8812
|
super(`Group name "${groupName}" is unavailable`, 409);
|
|
8866
8813
|
}
|
|
@@ -8872,7 +8819,7 @@ async function findHighestRole(groups, appId) {
|
|
|
8872
8819
|
let potentialRoles = [];
|
|
8873
8820
|
for (let group of groups) {
|
|
8874
8821
|
if (group.roles) {
|
|
8875
|
-
const role = group.roles[
|
|
8822
|
+
const role = group.roles[import_backend_core26.db.getProdAppID(appId)];
|
|
8876
8823
|
if (role) {
|
|
8877
8824
|
potentialRoles.push(role);
|
|
8878
8825
|
}
|
|
@@ -8881,7 +8828,7 @@ async function findHighestRole(groups, appId) {
|
|
|
8881
8828
|
const allRoleNumbersArr = await Promise.all(
|
|
8882
8829
|
potentialRoles.map(async (roleId) => {
|
|
8883
8830
|
return {
|
|
8884
|
-
[roleId]: await
|
|
8831
|
+
[roleId]: await import_backend_core26.roles.roleToNumber(roleId)
|
|
8885
8832
|
};
|
|
8886
8833
|
})
|
|
8887
8834
|
);
|
|
@@ -8900,7 +8847,7 @@ async function findHighestRole(groups, appId) {
|
|
|
8900
8847
|
}
|
|
8901
8848
|
return highestGroupRole;
|
|
8902
8849
|
} catch (error) {
|
|
8903
|
-
|
|
8850
|
+
import_backend_core26.logging.logAlert(
|
|
8904
8851
|
`Error finding higest role for ${groups.length} on app ${appId}`,
|
|
8905
8852
|
error
|
|
8906
8853
|
);
|
|
@@ -8922,7 +8869,7 @@ async function getGroupBuilderAppIds(user, opts) {
|
|
|
8922
8869
|
return [];
|
|
8923
8870
|
}
|
|
8924
8871
|
const groups = await groupList(user.userGroups, opts?.groups);
|
|
8925
|
-
const prodAppId = opts?.appId ?
|
|
8872
|
+
const prodAppId = opts?.appId ? import_backend_core26.db.getProdAppID(opts?.appId) : null;
|
|
8926
8873
|
let appIds = [];
|
|
8927
8874
|
for (let group of groups) {
|
|
8928
8875
|
const groupApps = group.builder?.apps;
|
|
@@ -8939,7 +8886,7 @@ async function getGroupRoleId(user, appId, opts) {
|
|
|
8939
8886
|
return null;
|
|
8940
8887
|
}
|
|
8941
8888
|
let groups = await groupList(user.userGroups, opts?.groups);
|
|
8942
|
-
const prodAppId =
|
|
8889
|
+
const prodAppId = import_backend_core26.db.getProdAppID(appId);
|
|
8943
8890
|
if (user.roles?.[prodAppId]) {
|
|
8944
8891
|
return user.roles[prodAppId];
|
|
8945
8892
|
}
|
|
@@ -8965,7 +8912,7 @@ async function enrichUserRolesFromGroups(user) {
|
|
|
8965
8912
|
}
|
|
8966
8913
|
allGroupAppIds = [...new Set(allGroupAppIds)];
|
|
8967
8914
|
for (let appId of allGroupAppIds) {
|
|
8968
|
-
await
|
|
8915
|
+
await import_backend_core26.context.doInAppContext(appId, async () => {
|
|
8969
8916
|
if (user.roles[appId]) {
|
|
8970
8917
|
return;
|
|
8971
8918
|
}
|
|
@@ -9004,11 +8951,11 @@ async function getCreatorsCountInGroup(group) {
|
|
|
9004
8951
|
if (!usersInGroup.length) {
|
|
9005
8952
|
return 0;
|
|
9006
8953
|
}
|
|
9007
|
-
const globalDb =
|
|
8954
|
+
const globalDb = import_backend_core26.tenancy.getGlobalDB();
|
|
9008
8955
|
const users7 = await Promise.all(
|
|
9009
8956
|
usersInGroup.map((user) => globalDb.get(user._id))
|
|
9010
8957
|
);
|
|
9011
|
-
const creatorsInGroup = await Promise.all(users7.map(
|
|
8958
|
+
const creatorsInGroup = await Promise.all(users7.map(import_backend_core26.userUtils.isCreator));
|
|
9012
8959
|
return creatorsInGroup.filter((x) => !!x).length;
|
|
9013
8960
|
}
|
|
9014
8961
|
async function save3(group) {
|
|
@@ -9019,13 +8966,13 @@ async function save3(group) {
|
|
|
9019
8966
|
if (!group._id) {
|
|
9020
8967
|
group._id = groups_exports.generateUserGroupID();
|
|
9021
8968
|
await guardNameAvailability(group.name);
|
|
9022
|
-
eventPromises.push(
|
|
8969
|
+
eventPromises.push(import_backend_core26.events.group.created(group));
|
|
9023
8970
|
} else {
|
|
9024
8971
|
const oldGroup = await groups_exports.get(group._id);
|
|
9025
8972
|
if (oldGroup.name !== group.name) {
|
|
9026
8973
|
await guardNameAvailability(group.name);
|
|
9027
8974
|
}
|
|
9028
|
-
eventPromises.push(
|
|
8975
|
+
eventPromises.push(import_backend_core26.events.group.updated(group));
|
|
9029
8976
|
if (JSON.stringify(oldGroup.roles) !== JSON.stringify(group.roles)) {
|
|
9030
8977
|
const usersCountInGroup = oldGroup.users?.length || 0;
|
|
9031
8978
|
let creatorsCountBeforeSave = 0;
|
|
@@ -9033,13 +8980,13 @@ async function save3(group) {
|
|
|
9033
8980
|
creatorsCountBeforeSave = await getCreatorsCountInGroup(oldGroup);
|
|
9034
8981
|
}
|
|
9035
8982
|
if (Object.values(group.roles).includes(
|
|
9036
|
-
|
|
8983
|
+
import_backend_core26.roles.BUILTIN_ROLE_IDS.ADMIN
|
|
9037
8984
|
)) {
|
|
9038
8985
|
newCreators = usersCountInGroup - creatorsCountBeforeSave;
|
|
9039
8986
|
} else {
|
|
9040
8987
|
newCreators = -usersCountInGroup;
|
|
9041
8988
|
}
|
|
9042
|
-
eventPromises.push(
|
|
8989
|
+
eventPromises.push(import_backend_core26.events.group.permissionsEdited(group));
|
|
9043
8990
|
}
|
|
9044
8991
|
}
|
|
9045
8992
|
await Promise.all(eventPromises);
|
|
@@ -9070,12 +9017,12 @@ async function remove(groupId, revision) {
|
|
|
9070
9017
|
throw new Error("Group not found");
|
|
9071
9018
|
}
|
|
9072
9019
|
const isAdminGroup = Object.values(group.roles || {}).includes(
|
|
9073
|
-
|
|
9020
|
+
import_backend_core26.roles.BUILTIN_ROLE_IDS.ADMIN
|
|
9074
9021
|
);
|
|
9075
9022
|
let recalculateCreatorsQuotasFn = () => {
|
|
9076
9023
|
};
|
|
9077
9024
|
if (isAdminGroup) {
|
|
9078
|
-
const globalDb =
|
|
9025
|
+
const globalDb = import_backend_core26.tenancy.getGlobalDB();
|
|
9079
9026
|
const usersInGroup = await groups_exports.getGroupUsers(groupId);
|
|
9080
9027
|
const users7 = await Promise.all(
|
|
9081
9028
|
usersInGroup.map((user) => {
|
|
@@ -9087,7 +9034,7 @@ async function remove(groupId, revision) {
|
|
|
9087
9034
|
userGroups: user.userGroups.filter((grp) => grp !== groupId)
|
|
9088
9035
|
}));
|
|
9089
9036
|
const creatorsEval = await Promise.all(
|
|
9090
|
-
usersWithoutGroup.map(
|
|
9037
|
+
usersWithoutGroup.map(import_backend_core26.userUtils.isCreator)
|
|
9091
9038
|
);
|
|
9092
9039
|
const creatorsCount = creatorsEval.filter((x) => !!x).length;
|
|
9093
9040
|
const creatorsToRemove = usersInGroup.length - creatorsCount;
|
|
@@ -9096,14 +9043,14 @@ async function remove(groupId, revision) {
|
|
|
9096
9043
|
}
|
|
9097
9044
|
}
|
|
9098
9045
|
let resp = await groups_exports.destroy(groupId, revision);
|
|
9099
|
-
await
|
|
9046
|
+
await import_backend_core26.events.group.deleted(group);
|
|
9100
9047
|
await removeGroup();
|
|
9101
9048
|
await recalculateCreatorsQuotasFn();
|
|
9102
9049
|
return resp;
|
|
9103
9050
|
}
|
|
9104
9051
|
async function addUsers2(groupId, userIds) {
|
|
9105
9052
|
const group = await groups_exports.get(groupId);
|
|
9106
|
-
const users7 = await
|
|
9053
|
+
const users7 = await import_backend_core26.users.bulkGetGlobalUsersById(userIds);
|
|
9107
9054
|
let toUpdate = [];
|
|
9108
9055
|
for (let user of users7) {
|
|
9109
9056
|
if (!user.userGroups) {
|
|
@@ -9120,12 +9067,12 @@ async function addUsers2(groupId, userIds) {
|
|
|
9120
9067
|
...user,
|
|
9121
9068
|
userGroups: [...user?.userGroups || [], groupId]
|
|
9122
9069
|
}));
|
|
9123
|
-
await
|
|
9070
|
+
await import_backend_core26.users.bulkUpdateGlobalUsers(updatedUsers);
|
|
9124
9071
|
const isAdminGroup = Object.values(group.roles || {}).includes(
|
|
9125
|
-
|
|
9072
|
+
import_backend_core26.roles.BUILTIN_ROLE_IDS.ADMIN
|
|
9126
9073
|
);
|
|
9127
9074
|
if (isAdminGroup) {
|
|
9128
|
-
const creatorsEval = await Promise.all(toUpdate.map(
|
|
9075
|
+
const creatorsEval = await Promise.all(toUpdate.map(import_backend_core26.userUtils.isCreator));
|
|
9129
9076
|
const creatorsCount = creatorsEval.filter((x) => !!x).length;
|
|
9130
9077
|
const creatorsToAdd = toUpdate.length - creatorsCount;
|
|
9131
9078
|
if (creatorsToAdd) {
|
|
@@ -9134,15 +9081,15 @@ async function addUsers2(groupId, userIds) {
|
|
|
9134
9081
|
}
|
|
9135
9082
|
let promises = [];
|
|
9136
9083
|
for (let userId of userIds) {
|
|
9137
|
-
promises.push(
|
|
9084
|
+
promises.push(import_backend_core26.cache.user.invalidateUser(userId));
|
|
9138
9085
|
}
|
|
9139
9086
|
await Promise.all(promises);
|
|
9140
|
-
await
|
|
9087
|
+
await import_backend_core26.events.group.usersAdded(updatedUsers.length, group);
|
|
9141
9088
|
return updatedUsers;
|
|
9142
9089
|
}
|
|
9143
9090
|
async function removeUsers2(groupId, userIds) {
|
|
9144
9091
|
const group = await groups_exports.get(groupId);
|
|
9145
|
-
const users7 = await
|
|
9092
|
+
const users7 = await import_backend_core26.users.bulkGetGlobalUsersById(userIds);
|
|
9146
9093
|
let toUpdate = [];
|
|
9147
9094
|
for (let user of users7) {
|
|
9148
9095
|
if (!user.userGroups || !user.userGroups.includes(groupId)) {
|
|
@@ -9152,12 +9099,12 @@ async function removeUsers2(groupId, userIds) {
|
|
|
9152
9099
|
user.userGroups.splice(idx, 1);
|
|
9153
9100
|
toUpdate.push(user);
|
|
9154
9101
|
}
|
|
9155
|
-
await
|
|
9102
|
+
await import_backend_core26.users.bulkUpdateGlobalUsers(toUpdate);
|
|
9156
9103
|
const isAdminGroup = Object.values(group.roles || {}).includes(
|
|
9157
|
-
|
|
9104
|
+
import_backend_core26.roles.BUILTIN_ROLE_IDS.ADMIN
|
|
9158
9105
|
);
|
|
9159
9106
|
if (isAdminGroup) {
|
|
9160
|
-
const creatorsEval = await Promise.all(toUpdate.map(
|
|
9107
|
+
const creatorsEval = await Promise.all(toUpdate.map(import_backend_core26.userUtils.isCreator));
|
|
9161
9108
|
const creatorsCount = creatorsEval.filter((x) => !!x).length;
|
|
9162
9109
|
const creatorsToRemove = toUpdate.length - creatorsCount;
|
|
9163
9110
|
if (creatorsToRemove) {
|
|
@@ -9166,11 +9113,11 @@ async function removeUsers2(groupId, userIds) {
|
|
|
9166
9113
|
}
|
|
9167
9114
|
let promises = [];
|
|
9168
9115
|
for (let userId of userIds) {
|
|
9169
|
-
promises.push(
|
|
9116
|
+
promises.push(import_backend_core26.cache.user.invalidateUser(userId));
|
|
9170
9117
|
}
|
|
9171
9118
|
await Promise.all(promises);
|
|
9172
9119
|
if (toUpdate.length) {
|
|
9173
|
-
await
|
|
9120
|
+
await import_backend_core26.events.group.usersDeleted(toUpdate.length, group);
|
|
9174
9121
|
}
|
|
9175
9122
|
return toUpdate;
|
|
9176
9123
|
}
|
|
@@ -9207,7 +9154,7 @@ async function addAppBuilder(groupId, appId) {
|
|
|
9207
9154
|
if (!await isAppBuildersEnabled()) {
|
|
9208
9155
|
throw new Error("Feature not enabled, please check license");
|
|
9209
9156
|
}
|
|
9210
|
-
const prodAppId =
|
|
9157
|
+
const prodAppId = import_backend_core26.db.getProdAppID(appId);
|
|
9211
9158
|
const group = await get4(groupId);
|
|
9212
9159
|
group.builder ??= { apps: [] };
|
|
9213
9160
|
if (!group.builder.apps.includes(appId)) {
|
|
@@ -9219,7 +9166,7 @@ async function removeAppBuilder(groupId, appId) {
|
|
|
9219
9166
|
if (!await isAppBuildersEnabled()) {
|
|
9220
9167
|
throw new Error("Feature not enabled, please check license");
|
|
9221
9168
|
}
|
|
9222
|
-
const prodAppId =
|
|
9169
|
+
const prodAppId = import_backend_core26.db.getProdAppID(appId);
|
|
9223
9170
|
const group = await get4(groupId);
|
|
9224
9171
|
if (group.builder?.apps.includes(appId)) {
|
|
9225
9172
|
group.builder.apps = group.builder.apps.filter((id) => id !== prodAppId);
|
|
@@ -9228,10 +9175,10 @@ async function removeAppBuilder(groupId, appId) {
|
|
|
9228
9175
|
}
|
|
9229
9176
|
async function adjustGroupCreatorsQuotas() {
|
|
9230
9177
|
if (!await isUserGroupsEnabled()) {
|
|
9231
|
-
const globalDb =
|
|
9178
|
+
const globalDb = import_backend_core26.tenancy.getGlobalDB();
|
|
9232
9179
|
const groups = await fetch3() || [];
|
|
9233
9180
|
const adminGroups = groups.filter(
|
|
9234
|
-
(group) => Object.values(group?.roles || {}).includes(
|
|
9181
|
+
(group) => Object.values(group?.roles || {}).includes(import_backend_core26.roles.BUILTIN_ROLE_IDS.ADMIN)
|
|
9235
9182
|
);
|
|
9236
9183
|
for (let group of adminGroups) {
|
|
9237
9184
|
const usersInGroup = await groups_exports.getGroupUsers(group._id);
|
|
@@ -9245,7 +9192,7 @@ async function adjustGroupCreatorsQuotas() {
|
|
|
9245
9192
|
userGroups: user.userGroups.filter((grp) => grp !== group._id)
|
|
9246
9193
|
}));
|
|
9247
9194
|
const creatorsEval = await Promise.all(
|
|
9248
|
-
usersWithoutGroup.map(
|
|
9195
|
+
usersWithoutGroup.map(import_backend_core26.userUtils.isCreator)
|
|
9249
9196
|
);
|
|
9250
9197
|
const creatorsCount = creatorsEval.filter((x) => !!x).length;
|
|
9251
9198
|
const creatorsToRemove = usersInGroup.length - creatorsCount;
|
|
@@ -9258,25 +9205,19 @@ async function adjustGroupCreatorsQuotas() {
|
|
|
9258
9205
|
}
|
|
9259
9206
|
|
|
9260
9207
|
// src/sdk/users/users.ts
|
|
9261
|
-
|
|
9262
|
-
var db3 =
|
|
9263
|
-
var createActivity2 = async (userId) => {
|
|
9264
|
-
const data = {
|
|
9265
|
-
timestamp: Date.now()
|
|
9266
|
-
};
|
|
9267
|
-
return createActivity(userId, data);
|
|
9268
|
-
};
|
|
9208
|
+
import_backend_core27.users.UserDB.init(quotas_exports5, groups_exports2, features_exports2);
|
|
9209
|
+
var db3 = import_backend_core27.users.UserDB;
|
|
9269
9210
|
async function addAppBuilder2(user, appId) {
|
|
9270
9211
|
if (!await isAppBuildersEnabled()) {
|
|
9271
9212
|
throw new Error("Feature not enabled, please check license");
|
|
9272
9213
|
}
|
|
9273
|
-
await
|
|
9214
|
+
await import_backend_core27.users.addAppBuilder(user, appId);
|
|
9274
9215
|
}
|
|
9275
9216
|
async function removeAppBuilder2(user, appId) {
|
|
9276
9217
|
if (!await isAppBuildersEnabled()) {
|
|
9277
9218
|
throw new Error("Feature not enabled, please check license");
|
|
9278
9219
|
}
|
|
9279
|
-
await
|
|
9220
|
+
await import_backend_core27.users.removeAppBuilder(user, appId);
|
|
9280
9221
|
}
|
|
9281
9222
|
|
|
9282
9223
|
// src/sdk/automations/index.ts
|
|
@@ -9293,14 +9234,14 @@ __export(logging_exports, {
|
|
|
9293
9234
|
storeLog: () => storeLog
|
|
9294
9235
|
});
|
|
9295
9236
|
var import_types25 = require("@budibase/types");
|
|
9296
|
-
var
|
|
9237
|
+
var import_backend_core30 = require("@budibase/backend-core");
|
|
9297
9238
|
|
|
9298
9239
|
// src/db/automations.ts
|
|
9299
9240
|
var import_types24 = require("@budibase/types");
|
|
9300
|
-
var
|
|
9241
|
+
var import_backend_core29 = require("@budibase/backend-core");
|
|
9301
9242
|
|
|
9302
9243
|
// src/utilities/delay.ts
|
|
9303
|
-
var
|
|
9244
|
+
var import_backend_core28 = require("@budibase/backend-core");
|
|
9304
9245
|
async function backOff(fn, errMsg) {
|
|
9305
9246
|
let error;
|
|
9306
9247
|
let attempts = 5, success = false, response, first = true;
|
|
@@ -9318,7 +9259,7 @@ async function backOff(fn, errMsg) {
|
|
|
9318
9259
|
}
|
|
9319
9260
|
}
|
|
9320
9261
|
if (!success) {
|
|
9321
|
-
|
|
9262
|
+
import_backend_core28.logging.logWarn(`Failed to backoff: ${errMsg}`, error);
|
|
9322
9263
|
}
|
|
9323
9264
|
return response;
|
|
9324
9265
|
}
|
|
@@ -9331,7 +9272,7 @@ var {
|
|
|
9331
9272
|
AutomationViewMode: AutomationViewMode2,
|
|
9332
9273
|
ViewName: ViewName3,
|
|
9333
9274
|
getQueryIndex
|
|
9334
|
-
} =
|
|
9275
|
+
} = import_backend_core29.db;
|
|
9335
9276
|
var EARLIEST_DATE = (/* @__PURE__ */ new Date(0)).toISOString();
|
|
9336
9277
|
var EXPIRED_LIMIT = 100;
|
|
9337
9278
|
var oldestLogDate = async () => {
|
|
@@ -9384,9 +9325,9 @@ function generateAutomationLogID(isoDate, status2, automationId) {
|
|
|
9384
9325
|
return `${DocumentType4.AUTOMATION_LOG}${SEPARATOR4}${isoDate}${SEPARATOR4}${automationId}${SEPARATOR4}${status2}`;
|
|
9385
9326
|
}
|
|
9386
9327
|
async function getAllLogs(startDate, endDate, opts = { docs: true }) {
|
|
9387
|
-
let db4 =
|
|
9328
|
+
let db4 = import_backend_core29.context.getProdAppDB();
|
|
9388
9329
|
if (!await db4.exists()) {
|
|
9389
|
-
db4 =
|
|
9330
|
+
db4 = import_backend_core29.context.getDevAppDB();
|
|
9390
9331
|
}
|
|
9391
9332
|
const optional = { status: opts.status };
|
|
9392
9333
|
const limit = opts?.limit ? opts.limit : opts?.paginate ? GENERIC_PAGE_SIZE + 1 : void 0;
|
|
@@ -9404,9 +9345,9 @@ async function getAllLogs(startDate, endDate, opts = { docs: true }) {
|
|
|
9404
9345
|
});
|
|
9405
9346
|
}
|
|
9406
9347
|
async function getLogsByView(startDate, endDate, viewParams = {}) {
|
|
9407
|
-
let db4 =
|
|
9348
|
+
let db4 = import_backend_core29.context.getProdAppDB();
|
|
9408
9349
|
if (!await db4.exists()) {
|
|
9409
|
-
db4 =
|
|
9350
|
+
db4 = import_backend_core29.context.getDevAppDB();
|
|
9410
9351
|
}
|
|
9411
9352
|
let response;
|
|
9412
9353
|
try {
|
|
@@ -9436,7 +9377,7 @@ async function getLogsByView(startDate, endDate, viewParams = {}) {
|
|
|
9436
9377
|
return pagination(response, { paginate: true, pageSize: GENERIC_PAGE_SIZE });
|
|
9437
9378
|
}
|
|
9438
9379
|
async function writeLog(automation, results) {
|
|
9439
|
-
const db4 =
|
|
9380
|
+
const db4 = import_backend_core29.context.getProdAppDB();
|
|
9440
9381
|
const automationId = automation._id;
|
|
9441
9382
|
const name2 = automation.name;
|
|
9442
9383
|
const status2 = getStatus(results);
|
|
@@ -9455,12 +9396,12 @@ async function writeLog(automation, results) {
|
|
|
9455
9396
|
return id;
|
|
9456
9397
|
}
|
|
9457
9398
|
async function updateAppMetadataWithErrors(logIds, { clearing } = { clearing: false }) {
|
|
9458
|
-
const db4 =
|
|
9399
|
+
const db4 = import_backend_core29.context.getProdAppDB();
|
|
9459
9400
|
await backOff(async () => {
|
|
9460
|
-
const metadata2 = await db4.get(
|
|
9401
|
+
const metadata2 = await db4.get(import_backend_core29.db.DocumentType.APP_METADATA);
|
|
9461
9402
|
for (let logId of logIds) {
|
|
9462
|
-
const parts = logId.split(
|
|
9463
|
-
const autoId = `${parts[parts.length - 3]}${
|
|
9403
|
+
const parts = logId.split(import_backend_core29.db.SEPARATOR);
|
|
9404
|
+
const autoId = `${parts[parts.length - 3]}${import_backend_core29.db.SEPARATOR}${parts[parts.length - 2]}`;
|
|
9464
9405
|
let errors = {};
|
|
9465
9406
|
if (metadata2.automationErrors) {
|
|
9466
9407
|
errors = metadata2.automationErrors;
|
|
@@ -9480,7 +9421,7 @@ async function updateAppMetadataWithErrors(logIds, { clearing } = { clearing: fa
|
|
|
9480
9421
|
metadata2.automationErrors = errors;
|
|
9481
9422
|
}
|
|
9482
9423
|
await db4.put(metadata2);
|
|
9483
|
-
await
|
|
9424
|
+
await import_backend_core29.cache.app.invalidateAppMetadata(metadata2.appId, metadata2);
|
|
9484
9425
|
}, "Failed to update app metadata with automation log error");
|
|
9485
9426
|
}
|
|
9486
9427
|
async function getExpiredLogs() {
|
|
@@ -9496,7 +9437,7 @@ async function getExpiredLogs() {
|
|
|
9496
9437
|
}
|
|
9497
9438
|
}
|
|
9498
9439
|
async function clearOldHistory() {
|
|
9499
|
-
const db4 =
|
|
9440
|
+
const db4 = import_backend_core29.context.getProdAppDB();
|
|
9500
9441
|
try {
|
|
9501
9442
|
const expired = await getExpiredLogs();
|
|
9502
9443
|
if (!expired.data || expired.data.length === 0) {
|
|
@@ -9508,7 +9449,7 @@ async function clearOldHistory() {
|
|
|
9508
9449
|
_deleted: true
|
|
9509
9450
|
}));
|
|
9510
9451
|
const errorLogIds = expired.data.filter((doc2) => {
|
|
9511
|
-
const parts = doc2.id.split(
|
|
9452
|
+
const parts = doc2.id.split(import_backend_core29.db.SEPARATOR);
|
|
9512
9453
|
const status2 = parts[parts.length - 1];
|
|
9513
9454
|
return status2 === import_types24.AutomationStatus.ERROR;
|
|
9514
9455
|
}).map((doc2) => doc2.id);
|
|
@@ -9517,7 +9458,7 @@ async function clearOldHistory() {
|
|
|
9517
9458
|
await updateAppMetadataWithErrors(errorLogIds, { clearing: true });
|
|
9518
9459
|
}
|
|
9519
9460
|
} catch (err) {
|
|
9520
|
-
|
|
9461
|
+
import_backend_core29.logging.logAlert(
|
|
9521
9462
|
`Failed to cleanup automation log history - Database "${db4.name}"`,
|
|
9522
9463
|
err
|
|
9523
9464
|
);
|
|
@@ -9559,7 +9500,7 @@ async function logSearch(options) {
|
|
|
9559
9500
|
);
|
|
9560
9501
|
}
|
|
9561
9502
|
async function storeLog(automation, results) {
|
|
9562
|
-
if (!
|
|
9503
|
+
if (!import_backend_core30.db.isProdAppID(import_backend_core30.context.getAppId())) {
|
|
9563
9504
|
return;
|
|
9564
9505
|
}
|
|
9565
9506
|
const status2 = getStatus(results);
|
|
@@ -9578,7 +9519,7 @@ __export(plugins_exports, {
|
|
|
9578
9519
|
storePlugin: () => storePlugin
|
|
9579
9520
|
});
|
|
9580
9521
|
var import_types26 = require("@budibase/types");
|
|
9581
|
-
var
|
|
9522
|
+
var import_backend_core31 = require("@budibase/backend-core");
|
|
9582
9523
|
|
|
9583
9524
|
// src/utilities/fileSystem.ts
|
|
9584
9525
|
var import_fs3 = __toESM(require("fs"));
|
|
@@ -9589,11 +9530,11 @@ function loadJSFile(directory2, name2) {
|
|
|
9589
9530
|
|
|
9590
9531
|
// src/sdk/plugins/index.ts
|
|
9591
9532
|
async function storePlugin(metadata, directory, source) {
|
|
9592
|
-
const db =
|
|
9533
|
+
const db = import_backend_core31.tenancy.getGlobalDB();
|
|
9593
9534
|
const version = metadata.package.version, name = metadata.package.name, description = metadata.package.description, hash = metadata.schema.hash;
|
|
9594
|
-
const bucketPath =
|
|
9595
|
-
const files = await
|
|
9596
|
-
|
|
9535
|
+
const bucketPath = import_backend_core31.objectStore.getPluginS3Dir(name);
|
|
9536
|
+
const files = await import_backend_core31.objectStore.uploadDirectory(
|
|
9537
|
+
import_backend_core31.objectStore.ObjectStoreBuckets.PLUGINS,
|
|
9597
9538
|
directory,
|
|
9598
9539
|
bucketPath
|
|
9599
9540
|
);
|
|
@@ -9612,7 +9553,7 @@ async function storePlugin(metadata, directory, source) {
|
|
|
9612
9553
|
}
|
|
9613
9554
|
}
|
|
9614
9555
|
const iconFileName = iconFile ? iconFile.name : null;
|
|
9615
|
-
const pluginId =
|
|
9556
|
+
const pluginId = import_backend_core31.db.generatePluginID(name);
|
|
9616
9557
|
let rev;
|
|
9617
9558
|
try {
|
|
9618
9559
|
const existing = await db.get(pluginId);
|
|
@@ -9640,7 +9581,7 @@ async function storePlugin(metadata, directory, source) {
|
|
|
9640
9581
|
}
|
|
9641
9582
|
const write = async () => {
|
|
9642
9583
|
const response = await db.put(doc);
|
|
9643
|
-
await
|
|
9584
|
+
await import_backend_core31.events.plugin.imported(doc);
|
|
9644
9585
|
return {
|
|
9645
9586
|
...doc,
|
|
9646
9587
|
_rev: response.rev
|
|
@@ -9653,16 +9594,16 @@ async function storePlugin(metadata, directory, source) {
|
|
|
9653
9594
|
}
|
|
9654
9595
|
}
|
|
9655
9596
|
async function deletePlugin(pluginId2) {
|
|
9656
|
-
const db4 =
|
|
9597
|
+
const db4 = import_backend_core31.tenancy.getGlobalDB();
|
|
9657
9598
|
try {
|
|
9658
9599
|
const plugin = await db4.get(pluginId2);
|
|
9659
|
-
const bucketPath2 =
|
|
9660
|
-
await
|
|
9661
|
-
|
|
9600
|
+
const bucketPath2 = import_backend_core31.objectStore.getPluginS3Dir(plugin.name);
|
|
9601
|
+
await import_backend_core31.objectStore.deleteFolder(
|
|
9602
|
+
import_backend_core31.objectStore.ObjectStoreBuckets.PLUGINS,
|
|
9662
9603
|
bucketPath2
|
|
9663
9604
|
);
|
|
9664
9605
|
await db4.remove(pluginId2, plugin._rev);
|
|
9665
|
-
await
|
|
9606
|
+
await import_backend_core31.events.plugin.deleted(plugin);
|
|
9666
9607
|
await removePlugin();
|
|
9667
9608
|
} catch (err) {
|
|
9668
9609
|
const errMsg = err?.message ? err?.message : err;
|
|
@@ -9670,14 +9611,14 @@ async function deletePlugin(pluginId2) {
|
|
|
9670
9611
|
}
|
|
9671
9612
|
}
|
|
9672
9613
|
async function checkPluginQuotas() {
|
|
9673
|
-
const db4 =
|
|
9614
|
+
const db4 = import_backend_core31.tenancy.getGlobalDB();
|
|
9674
9615
|
try {
|
|
9675
|
-
const allPlugins = await db4.allDocs(
|
|
9616
|
+
const allPlugins = await db4.allDocs(import_backend_core31.db.getPluginParams());
|
|
9676
9617
|
const pluginCount = allPlugins.rows.length;
|
|
9677
9618
|
console.log(`Syncing plugin count: ${pluginCount}`);
|
|
9678
9619
|
await updatePluginCount(pluginCount);
|
|
9679
9620
|
} catch (err) {
|
|
9680
|
-
|
|
9621
|
+
import_backend_core31.logging.logAlert("Unable to retrieve plugins for quota check", err);
|
|
9681
9622
|
}
|
|
9682
9623
|
}
|
|
9683
9624
|
|
|
@@ -9694,9 +9635,9 @@ __export(environmentVariables_exports2, {
|
|
|
9694
9635
|
|
|
9695
9636
|
// src/sdk/environmentVariables/environmentVariables.ts
|
|
9696
9637
|
var import_types27 = require("@budibase/types");
|
|
9697
|
-
var
|
|
9638
|
+
var import_backend_core32 = require("@budibase/backend-core");
|
|
9698
9639
|
function isEncryptionKeyAvailable() {
|
|
9699
|
-
return !!
|
|
9640
|
+
return !!import_backend_core32.env.ENCRYPTION_KEY;
|
|
9700
9641
|
}
|
|
9701
9642
|
async function fetch4() {
|
|
9702
9643
|
const doc2 = await environmentVariables_exports.get();
|
|
@@ -9764,10 +9705,10 @@ __export(auditLogs_exports3, {
|
|
|
9764
9705
|
var import_types30 = require("@budibase/types");
|
|
9765
9706
|
|
|
9766
9707
|
// src/db/auditLogs.ts
|
|
9767
|
-
var
|
|
9708
|
+
var import_backend_core33 = require("@budibase/backend-core");
|
|
9768
9709
|
var import_types28 = require("@budibase/types");
|
|
9769
9710
|
var MemoryStream = require("memorystream");
|
|
9770
|
-
var builder = new
|
|
9711
|
+
var builder = new import_backend_core33.sql.Sql(import_types28.SqlClient.SQL_LITE);
|
|
9771
9712
|
async function getAuditLogSqlQuery(filters, bookmark, limit) {
|
|
9772
9713
|
const request = {
|
|
9773
9714
|
operation: import_types28.Operation.READ,
|
|
@@ -9795,7 +9736,7 @@ async function getAuditLogSqlQuery(filters, bookmark, limit) {
|
|
|
9795
9736
|
return { sql: query.sql, bindings: query.bindings };
|
|
9796
9737
|
}
|
|
9797
9738
|
function generateAuditLogID(timestamp) {
|
|
9798
|
-
return `${
|
|
9739
|
+
return `${import_backend_core33.DocumentType.AUDIT_LOG}${import_backend_core33.SEPARATOR}${timestamp}${import_backend_core33.SEPARATOR}${import_backend_core33.utils.newid()}`;
|
|
9799
9740
|
}
|
|
9800
9741
|
async function save4(doc2) {
|
|
9801
9742
|
if (!doc2._id) {
|
|
@@ -9805,21 +9746,21 @@ async function save4(doc2) {
|
|
|
9805
9746
|
doc2.type = import_types28.AUDIT_LOG_TYPE;
|
|
9806
9747
|
}
|
|
9807
9748
|
try {
|
|
9808
|
-
const db4 =
|
|
9749
|
+
const db4 = import_backend_core33.context.getAuditLogsDB();
|
|
9809
9750
|
const response = await db4.put(doc2);
|
|
9810
9751
|
return {
|
|
9811
9752
|
...doc2,
|
|
9812
9753
|
_rev: response.rev
|
|
9813
9754
|
};
|
|
9814
9755
|
} catch (err) {
|
|
9815
|
-
|
|
9756
|
+
import_backend_core33.logging.logAlert("Failed to write audit log", err);
|
|
9816
9757
|
}
|
|
9817
9758
|
}
|
|
9818
9759
|
async function searchSQL(filters, bookmark, opts) {
|
|
9819
9760
|
if (!bookmark) {
|
|
9820
9761
|
bookmark = 1;
|
|
9821
9762
|
}
|
|
9822
|
-
const db4 =
|
|
9763
|
+
const db4 = import_backend_core33.context.getAuditLogsDB();
|
|
9823
9764
|
try {
|
|
9824
9765
|
const limit = GENERIC_PAGE_SIZE + 1;
|
|
9825
9766
|
const mainQuery = await getAuditLogSqlQuery(filters, bookmark, limit);
|
|
@@ -9851,9 +9792,9 @@ async function searchSQL(filters, bookmark, opts) {
|
|
|
9851
9792
|
}
|
|
9852
9793
|
}
|
|
9853
9794
|
async function migrate() {
|
|
9854
|
-
const db4 =
|
|
9795
|
+
const db4 = import_backend_core33.context.getAuditLogsDB();
|
|
9855
9796
|
const auditLogs = (await db4.allDocs(
|
|
9856
|
-
|
|
9797
|
+
import_backend_core33.db.getDocParams(import_backend_core33.DocumentType.AUDIT_LOG, null, {
|
|
9857
9798
|
include_docs: true
|
|
9858
9799
|
})
|
|
9859
9800
|
)).rows.map((row) => row.doc);
|
|
@@ -9864,12 +9805,12 @@ async function migrate() {
|
|
|
9864
9805
|
await db4.bulkDocs(updatedLogs);
|
|
9865
9806
|
}
|
|
9866
9807
|
function dump(params) {
|
|
9867
|
-
const db4 =
|
|
9808
|
+
const db4 = import_backend_core33.context.getAuditLogsDB();
|
|
9868
9809
|
const stream = new MemoryStream();
|
|
9869
9810
|
const promise = db4.dump(stream, {
|
|
9870
9811
|
filter: (doc2) => {
|
|
9871
9812
|
const auditLog = doc2;
|
|
9872
|
-
if (!auditLog._id?.startsWith(
|
|
9813
|
+
if (!auditLog._id?.startsWith(import_backend_core33.DocumentType.AUDIT_LOG)) {
|
|
9873
9814
|
return false;
|
|
9874
9815
|
}
|
|
9875
9816
|
let allMatched = true;
|
|
@@ -9910,14 +9851,14 @@ function dump(params) {
|
|
|
9910
9851
|
}
|
|
9911
9852
|
|
|
9912
9853
|
// src/sdk/auditLogs/auditLogs.ts
|
|
9913
|
-
var
|
|
9854
|
+
var import_backend_core35 = require("@budibase/backend-core");
|
|
9914
9855
|
|
|
9915
9856
|
// src/sdk/auditLogs/utils.ts
|
|
9916
9857
|
var import_types29 = require("@budibase/types");
|
|
9917
9858
|
var import_string_templates = require("@budibase/string-templates");
|
|
9918
|
-
var
|
|
9919
|
-
var MIN_DATE =
|
|
9920
|
-
var MAX_DATE2 =
|
|
9859
|
+
var import_backend_core34 = require("@budibase/backend-core");
|
|
9860
|
+
var MIN_DATE = import_backend_core34.constants.MIN_VALID_DATE.toISOString();
|
|
9861
|
+
var MAX_DATE2 = import_backend_core34.constants.MAX_VALID_DATE.toISOString();
|
|
9921
9862
|
function fillDates(params) {
|
|
9922
9863
|
if (params.startDate || params.endDate) {
|
|
9923
9864
|
params.startDate = params.startDate || MIN_DATE;
|
|
@@ -9927,7 +9868,7 @@ function fillDates(params) {
|
|
|
9927
9868
|
}
|
|
9928
9869
|
async function getSearchFilters(params) {
|
|
9929
9870
|
if (Array.isArray(params.appIds)) {
|
|
9930
|
-
params.appIds = params.appIds.map((appId) =>
|
|
9871
|
+
params.appIds = params.appIds.map((appId) => import_backend_core34.db.getProdAppID(appId));
|
|
9931
9872
|
}
|
|
9932
9873
|
const filter2 = {};
|
|
9933
9874
|
function addStringParams(key, params2) {
|
|
@@ -10005,7 +9946,7 @@ function getEventFriendlyName(event, metadata2) {
|
|
|
10005
9946
|
|
|
10006
9947
|
// src/sdk/auditLogs/auditLogs.ts
|
|
10007
9948
|
async function write2(event, metadata2, opts) {
|
|
10008
|
-
if (!await isAuditLogsEnabled() || !
|
|
9949
|
+
if (!await isAuditLogsEnabled() || !import_backend_core35.utils.isAudited(event)) {
|
|
10009
9950
|
return;
|
|
10010
9951
|
}
|
|
10011
9952
|
const friendly = getEventFriendlyName(event, metadata2);
|
|
@@ -10026,18 +9967,18 @@ async function write2(event, metadata2, opts) {
|
|
|
10026
9967
|
const fallback = {};
|
|
10027
9968
|
try {
|
|
10028
9969
|
if (opts?.appId) {
|
|
10029
|
-
doc2.appId =
|
|
10030
|
-
const appMetadata = await
|
|
9970
|
+
doc2.appId = import_backend_core35.db.getProdAppID(opts.appId);
|
|
9971
|
+
const appMetadata = await import_backend_core35.cache.app.getAppMetadata(opts.appId);
|
|
10031
9972
|
if ("name" in appMetadata) {
|
|
10032
9973
|
fallback.appName = appMetadata.name;
|
|
10033
9974
|
}
|
|
10034
9975
|
}
|
|
10035
9976
|
if (opts?.userId) {
|
|
10036
|
-
const user = await
|
|
9977
|
+
const user = await import_backend_core35.users.getById(opts?.userId);
|
|
10037
9978
|
fallback.email = user.email;
|
|
10038
9979
|
}
|
|
10039
9980
|
} catch (err) {
|
|
10040
|
-
|
|
9981
|
+
import_backend_core35.logging.logAlert(
|
|
10041
9982
|
"Failed to retrieve fallback information for audit log",
|
|
10042
9983
|
err
|
|
10043
9984
|
);
|
|
@@ -10049,17 +9990,17 @@ async function enrich(logs) {
|
|
|
10049
9990
|
const allUserIds = logs.map((log) => log.userId);
|
|
10050
9991
|
const hasAppIdLogs = logs.filter((log) => log.appId);
|
|
10051
9992
|
const allAppIds = hasAppIdLogs.map(
|
|
10052
|
-
(log) =>
|
|
9993
|
+
(log) => import_backend_core35.db.getDevAppID(log.appId)
|
|
10053
9994
|
);
|
|
10054
|
-
const userList = await
|
|
9995
|
+
const userList = await import_backend_core35.users.bulkGetGlobalUsersById(
|
|
10055
9996
|
[...new Set(allUserIds)],
|
|
10056
9997
|
{ cleanup: true }
|
|
10057
9998
|
);
|
|
10058
|
-
const appList = await
|
|
9999
|
+
const appList = await import_backend_core35.db.getAppsByIDs([...new Set(allAppIds)]);
|
|
10059
10000
|
let enriched = [];
|
|
10060
10001
|
for (let log of logs) {
|
|
10061
10002
|
const user = userList.find((user2) => user2?._id === log.userId);
|
|
10062
|
-
const app = appList.find((app2) =>
|
|
10003
|
+
const app = appList.find((app2) => import_backend_core35.db.isSameAppID(app2?.appId, log.appId));
|
|
10063
10004
|
const enrichedLog = {
|
|
10064
10005
|
event: log.event,
|
|
10065
10006
|
timestamp: log.timestamp,
|
|
@@ -10144,7 +10085,7 @@ __export(roles_exports, {
|
|
|
10144
10085
|
assign: () => assign,
|
|
10145
10086
|
unAssign: () => unAssign
|
|
10146
10087
|
});
|
|
10147
|
-
var
|
|
10088
|
+
var import_backend_core36 = require("@budibase/backend-core");
|
|
10148
10089
|
async function assign(userIds, opts) {
|
|
10149
10090
|
if (!await isExpandedPublicApiEnabled()) {
|
|
10150
10091
|
throw new Error("Unable to assign roles - license required.");
|
|
@@ -10152,11 +10093,11 @@ async function assign(userIds, opts) {
|
|
|
10152
10093
|
const users7 = await db3.bulkGet(userIds);
|
|
10153
10094
|
for (let user of users7) {
|
|
10154
10095
|
if (opts.role && opts.role.roleId) {
|
|
10155
|
-
const prodAppId =
|
|
10096
|
+
const prodAppId = import_backend_core36.db.getProdAppID(opts.role.appId);
|
|
10156
10097
|
user.roles[prodAppId] = opts.role.roleId;
|
|
10157
10098
|
}
|
|
10158
10099
|
if (opts.appBuilder) {
|
|
10159
|
-
const prodAppId =
|
|
10100
|
+
const prodAppId = import_backend_core36.db.getProdAppID(opts.appBuilder.appId);
|
|
10160
10101
|
const existing = user.builder?.apps || [];
|
|
10161
10102
|
user.builder = {
|
|
10162
10103
|
apps: existing.concat([prodAppId])
|
|
@@ -10183,13 +10124,13 @@ async function unAssign(userIds, opts) {
|
|
|
10183
10124
|
const users7 = await db3.bulkGet(userIds);
|
|
10184
10125
|
for (let user of users7) {
|
|
10185
10126
|
if (opts.role) {
|
|
10186
|
-
const prodAppId =
|
|
10127
|
+
const prodAppId = import_backend_core36.db.getProdAppID(opts.role?.appId);
|
|
10187
10128
|
if (user.roles[prodAppId] === opts.role.roleId) {
|
|
10188
10129
|
delete user.roles[prodAppId];
|
|
10189
10130
|
}
|
|
10190
10131
|
}
|
|
10191
10132
|
if (opts.appBuilder && user.builder?.apps) {
|
|
10192
|
-
const prodAppId =
|
|
10133
|
+
const prodAppId = import_backend_core36.db.getProdAppID(opts.appBuilder.appId);
|
|
10193
10134
|
user.builder.apps = user.builder.apps.filter((appId) => appId !== prodAppId);
|
|
10194
10135
|
}
|
|
10195
10136
|
if (opts.builder && user.builder) {
|
|
@@ -10207,7 +10148,7 @@ __export(applications_exports, {
|
|
|
10207
10148
|
buildExportFn: () => buildExportFn,
|
|
10208
10149
|
buildImportFn: () => buildImportFn
|
|
10209
10150
|
});
|
|
10210
|
-
var
|
|
10151
|
+
var import_backend_core37 = require("@budibase/backend-core");
|
|
10211
10152
|
function buildImportFn(importFn) {
|
|
10212
10153
|
return async (ctx, next) => {
|
|
10213
10154
|
if (!await isExpandedPublicApiEnabled()) {
|
|
@@ -10216,7 +10157,7 @@ function buildImportFn(importFn) {
|
|
|
10216
10157
|
if (!ctx.request.files?.appExport) {
|
|
10217
10158
|
ctx.throw(400, "Must provide app export file for import.");
|
|
10218
10159
|
}
|
|
10219
|
-
await
|
|
10160
|
+
await import_backend_core37.context.doInAppContext(ctx.params.appId, async () => {
|
|
10220
10161
|
await importFn(ctx);
|
|
10221
10162
|
ctx.body = void 0;
|
|
10222
10163
|
ctx.status = 204;
|
|
@@ -10230,7 +10171,7 @@ function buildExportFn(exportFn) {
|
|
|
10230
10171
|
ctx.throw(403, "Endpoint unavailable, license required.");
|
|
10231
10172
|
}
|
|
10232
10173
|
const { encryptPassword, excludeRows } = ctx.request.body;
|
|
10233
|
-
await
|
|
10174
|
+
await import_backend_core37.context.doInAppContext(ctx.params.appId, async () => {
|
|
10234
10175
|
ctx.request.body = {
|
|
10235
10176
|
encryptPassword,
|
|
10236
10177
|
excludeRows
|
|
@@ -10243,15 +10184,15 @@ function buildExportFn(exportFn) {
|
|
|
10243
10184
|
}
|
|
10244
10185
|
|
|
10245
10186
|
// src/sdk/backups/backup.ts
|
|
10246
|
-
var
|
|
10187
|
+
var import_backend_core39 = require("@budibase/backend-core");
|
|
10247
10188
|
var import_types31 = require("@budibase/types");
|
|
10248
10189
|
|
|
10249
10190
|
// src/sdk/backups/queue.ts
|
|
10250
|
-
var
|
|
10191
|
+
var import_backend_core38 = require("@budibase/backend-core");
|
|
10251
10192
|
var backupQueue;
|
|
10252
10193
|
function init2() {
|
|
10253
|
-
backupQueue =
|
|
10254
|
-
|
|
10194
|
+
backupQueue = import_backend_core38.queue.createQueue(
|
|
10195
|
+
import_backend_core38.queue.JobQueue.APP_BACKUP,
|
|
10255
10196
|
{
|
|
10256
10197
|
maxStalledCount: 3,
|
|
10257
10198
|
jobOptions: {
|
|
@@ -10319,8 +10260,8 @@ async function updateAppBackup(backupId, backupName) {
|
|
|
10319
10260
|
async function deleteAppBackup(backupId) {
|
|
10320
10261
|
const metadata2 = await backups_exports.getAppBackupMetadata(backupId);
|
|
10321
10262
|
if (metadata2.filename) {
|
|
10322
|
-
await
|
|
10323
|
-
|
|
10263
|
+
await import_backend_core39.objectStore.deleteFile(
|
|
10264
|
+
import_backend_core39.objectStore.ObjectStoreBuckets.BACKUPS,
|
|
10324
10265
|
metadata2.filename
|
|
10325
10266
|
);
|
|
10326
10267
|
}
|
|
@@ -10334,15 +10275,15 @@ async function getBackupDownloadStream(backupId) {
|
|
|
10334
10275
|
if (!metadata2.filename) {
|
|
10335
10276
|
throw new Error("Backup incomplete - cannot download.");
|
|
10336
10277
|
}
|
|
10337
|
-
const stream = await
|
|
10338
|
-
|
|
10278
|
+
const stream = await import_backend_core39.objectStore.getReadStream(
|
|
10279
|
+
import_backend_core39.objectStore.ObjectStoreBuckets.BACKUPS,
|
|
10339
10280
|
metadata2.filename
|
|
10340
10281
|
);
|
|
10341
10282
|
return { metadata: metadata2, stream };
|
|
10342
10283
|
}
|
|
10343
10284
|
async function downloadAppBackup(backupId) {
|
|
10344
10285
|
const { stream } = await getBackupDownloadStream(backupId);
|
|
10345
|
-
const path2 = (0, import_path4.join)(
|
|
10286
|
+
const path2 = (0, import_path4.join)(import_backend_core39.objectStore.budibaseTempDir(), import_backend_core39.utils.newid());
|
|
10346
10287
|
const writeStream = import_fs4.default.createWriteStream(path2);
|
|
10347
10288
|
return new Promise((resolve, reject) => {
|
|
10348
10289
|
stream.on("error", reject);
|
|
@@ -10377,7 +10318,7 @@ async function triggerAppBackup(appId, trigger, opts = {}) {
|
|
|
10377
10318
|
...opts
|
|
10378
10319
|
}
|
|
10379
10320
|
});
|
|
10380
|
-
await
|
|
10321
|
+
await import_backend_core39.events.backup.appBackupTriggered(
|
|
10381
10322
|
appId,
|
|
10382
10323
|
backup.id,
|
|
10383
10324
|
import_types31.AppBackupType.BACKUP,
|
|
@@ -10437,7 +10378,7 @@ var processing_exports = {};
|
|
|
10437
10378
|
__export(processing_exports, {
|
|
10438
10379
|
init: () => init3
|
|
10439
10380
|
});
|
|
10440
|
-
var
|
|
10381
|
+
var import_backend_core40 = require("@budibase/backend-core");
|
|
10441
10382
|
var import_types32 = require("@budibase/types");
|
|
10442
10383
|
var import_fs5 = __toESM(require("fs"));
|
|
10443
10384
|
async function init3(opts) {
|
|
@@ -10450,7 +10391,7 @@ async function init3(opts) {
|
|
|
10450
10391
|
return importProcessor(job, opts);
|
|
10451
10392
|
}
|
|
10452
10393
|
} catch (err) {
|
|
10453
|
-
|
|
10394
|
+
import_backend_core40.logging.logAlert(
|
|
10454
10395
|
`Failed to perform backup for app ID: ${data.appId}`,
|
|
10455
10396
|
err
|
|
10456
10397
|
);
|
|
@@ -10458,11 +10399,11 @@ async function init3(opts) {
|
|
|
10458
10399
|
});
|
|
10459
10400
|
}
|
|
10460
10401
|
async function removeExistingApp(devId) {
|
|
10461
|
-
const devDb =
|
|
10402
|
+
const devDb = import_backend_core40.db.getDB(devId, { skip_setup: true });
|
|
10462
10403
|
await devDb.destroy();
|
|
10463
10404
|
}
|
|
10464
10405
|
async function runBackup(trigger, tenantId, appId, opts) {
|
|
10465
|
-
const devAppId =
|
|
10406
|
+
const devAppId = import_backend_core40.db.getDevAppID(appId), prodAppId = import_backend_core40.db.getProdAppID(appId);
|
|
10466
10407
|
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
10467
10408
|
const updateMetadata = async (status2, updateOpts) => {
|
|
10468
10409
|
if (opts?.doc) {
|
|
@@ -10492,9 +10433,9 @@ async function runBackup(trigger, tenantId, appId, opts) {
|
|
|
10492
10433
|
const tarPath = await opts.processing.exportAppFn(devAppId, { tar: true });
|
|
10493
10434
|
const contents = await opts.processing.statsFn(devAppId);
|
|
10494
10435
|
let filename = `${prodAppId}/backup-${timestamp}.tar.gz`;
|
|
10495
|
-
const bucket =
|
|
10436
|
+
const bucket = import_backend_core40.objectStore.ObjectStoreBuckets.BACKUPS;
|
|
10496
10437
|
const fileStream = import_fs5.default.createReadStream(tarPath);
|
|
10497
|
-
await
|
|
10438
|
+
await import_backend_core40.objectStore.streamUpload({
|
|
10498
10439
|
bucket,
|
|
10499
10440
|
filename,
|
|
10500
10441
|
stream: fileStream,
|
|
@@ -10513,16 +10454,16 @@ async function runBackup(trigger, tenantId, appId, opts) {
|
|
|
10513
10454
|
import_fs5.default.rmSync(tarPath);
|
|
10514
10455
|
}
|
|
10515
10456
|
} catch (err) {
|
|
10516
|
-
|
|
10457
|
+
import_backend_core40.logging.logAlert("App backup error", err);
|
|
10517
10458
|
await updateMetadata(import_types32.AppBackupStatus.FAILED);
|
|
10518
10459
|
}
|
|
10519
10460
|
}
|
|
10520
10461
|
async function importProcessor(job, opts) {
|
|
10521
10462
|
const data = job.data;
|
|
10522
10463
|
const appId = data.appId, backupId = data.import.backupId, nameForBackup = data.import.nameForBackup, createdBy = data.import.createdBy;
|
|
10523
|
-
const tenantId =
|
|
10524
|
-
return
|
|
10525
|
-
const devAppId =
|
|
10464
|
+
const tenantId = import_backend_core40.tenancy.getTenantIDFromAppID(appId);
|
|
10465
|
+
return import_backend_core40.tenancy.doInTenant(tenantId, async () => {
|
|
10466
|
+
const devAppId = import_backend_core40.db.getDevAppID(appId);
|
|
10526
10467
|
const { rev: rev2 } = await backup_default.updateRestoreStatus(
|
|
10527
10468
|
data.docId,
|
|
10528
10469
|
data.docRev,
|
|
@@ -10537,7 +10478,7 @@ async function importProcessor(job, opts) {
|
|
|
10537
10478
|
await removeExistingApp(devAppId);
|
|
10538
10479
|
let status2 = import_types32.AppBackupStatus.COMPLETE;
|
|
10539
10480
|
try {
|
|
10540
|
-
await opts.importAppFn(devAppId,
|
|
10481
|
+
await opts.importAppFn(devAppId, import_backend_core40.db.getDB(devAppId), {
|
|
10541
10482
|
file: {
|
|
10542
10483
|
type: "application/gzip",
|
|
10543
10484
|
path: path2
|
|
@@ -10545,7 +10486,7 @@ async function importProcessor(job, opts) {
|
|
|
10545
10486
|
key: path2
|
|
10546
10487
|
});
|
|
10547
10488
|
} catch (err) {
|
|
10548
|
-
|
|
10489
|
+
import_backend_core40.logging.logAlert("App restore error", err);
|
|
10549
10490
|
status2 = import_types32.AppBackupStatus.FAILED;
|
|
10550
10491
|
}
|
|
10551
10492
|
await backup_default.updateRestoreStatus(data.docId, rev2, status2);
|
|
@@ -10557,8 +10498,8 @@ async function importProcessor(job, opts) {
|
|
|
10557
10498
|
async function exportProcessor(job, opts) {
|
|
10558
10499
|
const data = job.data;
|
|
10559
10500
|
const appId = data.appId, trigger = data.export.trigger, name2 = data.export.name;
|
|
10560
|
-
const tenantId =
|
|
10561
|
-
await
|
|
10501
|
+
const tenantId = import_backend_core40.tenancy.getTenantIDFromAppID(appId);
|
|
10502
|
+
await import_backend_core40.tenancy.doInTenant(tenantId, async () => {
|
|
10562
10503
|
try {
|
|
10563
10504
|
const { rev: rev2 } = await backup_default.updateBackupStatus(
|
|
10564
10505
|
data.docId,
|
|
@@ -10570,7 +10511,7 @@ async function exportProcessor(job, opts) {
|
|
|
10570
10511
|
name: name2
|
|
10571
10512
|
});
|
|
10572
10513
|
} catch (err) {
|
|
10573
|
-
|
|
10514
|
+
import_backend_core40.logging.logAlert("App backup error", err);
|
|
10574
10515
|
}
|
|
10575
10516
|
});
|
|
10576
10517
|
}
|
|
@@ -10604,12 +10545,12 @@ __export(users_exports3, {
|
|
|
10604
10545
|
update: () => update3
|
|
10605
10546
|
});
|
|
10606
10547
|
var import_merge2 = __toESM(require_merge2());
|
|
10607
|
-
var
|
|
10548
|
+
var import_backend_core41 = require("@budibase/backend-core");
|
|
10608
10549
|
var import_types33 = require("@budibase/types");
|
|
10609
10550
|
async function get5(params) {
|
|
10610
|
-
const db4 =
|
|
10611
|
-
const builder2 = new
|
|
10612
|
-
builder2.setIndexBuilder(
|
|
10551
|
+
const db4 = import_backend_core41.tenancy.getGlobalDB();
|
|
10552
|
+
const builder2 = new import_backend_core41.db.QueryBuilder(db4.name, import_types33.SearchIndex.USER);
|
|
10553
|
+
builder2.setIndexBuilder(import_backend_core41.db.searchIndexes.createUserIndex);
|
|
10613
10554
|
builder2.setLimit(params.pageSize);
|
|
10614
10555
|
builder2.addEqual("scimInfo.isSync", true);
|
|
10615
10556
|
for (const [key, value] of Object.entries(params.filters?.equal ?? {})) {
|
|
@@ -10624,13 +10565,13 @@ async function get5(params) {
|
|
|
10624
10565
|
};
|
|
10625
10566
|
}
|
|
10626
10567
|
async function find(id) {
|
|
10627
|
-
return await
|
|
10568
|
+
return await import_backend_core41.users.getById(id);
|
|
10628
10569
|
}
|
|
10629
10570
|
async function create(user) {
|
|
10630
10571
|
const existingUser = await db3.getUserByEmail(user.email);
|
|
10631
10572
|
if (existingUser) {
|
|
10632
10573
|
if (existingUser.scimInfo?.isSync) {
|
|
10633
|
-
throw new
|
|
10574
|
+
throw new import_backend_core41.HTTPError(`User is already synched`, 409);
|
|
10634
10575
|
}
|
|
10635
10576
|
user = {
|
|
10636
10577
|
...existingUser,
|
|
@@ -10659,7 +10600,7 @@ __export(groups_exports3, {
|
|
|
10659
10600
|
create: () => create2
|
|
10660
10601
|
});
|
|
10661
10602
|
var import_merge3 = __toESM(require_merge2());
|
|
10662
|
-
var
|
|
10603
|
+
var import_backend_core42 = require("@budibase/backend-core");
|
|
10663
10604
|
async function create2(data) {
|
|
10664
10605
|
const existingGroup = await getByName(data.name);
|
|
10665
10606
|
let groupId;
|
|
@@ -10668,7 +10609,7 @@ async function create2(data) {
|
|
|
10668
10609
|
groupId = createdGroup.id;
|
|
10669
10610
|
} else {
|
|
10670
10611
|
if (existingGroup.scimInfo?.isSync) {
|
|
10671
|
-
throw new
|
|
10612
|
+
throw new import_backend_core42.HTTPError(`Group is already synched`, 409);
|
|
10672
10613
|
}
|
|
10673
10614
|
groupId = existingGroup._id;
|
|
10674
10615
|
if (existingGroup.users) {
|
|
@@ -10692,16 +10633,16 @@ __export(logger_exports, {
|
|
|
10692
10633
|
logResponse: () => logResponse
|
|
10693
10634
|
});
|
|
10694
10635
|
var import_dayjs = __toESM(require_dayjs_min());
|
|
10695
|
-
var
|
|
10696
|
-
var { DocWritethrough } =
|
|
10636
|
+
var import_backend_core43 = require("@budibase/backend-core");
|
|
10637
|
+
var { DocWritethrough } = import_backend_core43.cache.docWritethrough;
|
|
10697
10638
|
function getLogDocId() {
|
|
10698
|
-
return `${
|
|
10639
|
+
return `${import_backend_core43.db.DocumentType.SCIM_LOG}${import_backend_core43.db.SEPARATOR}${(0, import_dayjs.default)().format(
|
|
10699
10640
|
"YYYYMMDD"
|
|
10700
10641
|
)}`;
|
|
10701
10642
|
}
|
|
10702
10643
|
var getDB2 = async () => {
|
|
10703
|
-
const dbName =
|
|
10704
|
-
return new DocWritethrough(
|
|
10644
|
+
const dbName = import_backend_core43.context.getScimDBName();
|
|
10645
|
+
return new DocWritethrough(import_backend_core43.db.getDB(dbName), getLogDocId());
|
|
10705
10646
|
};
|
|
10706
10647
|
async function logRequest(request) {
|
|
10707
10648
|
const logId = Date.now().toString();
|
|
@@ -10737,7 +10678,7 @@ __export(middleware_exports, {
|
|
|
10737
10678
|
});
|
|
10738
10679
|
|
|
10739
10680
|
// src/middleware/licensing.ts
|
|
10740
|
-
var
|
|
10681
|
+
var import_backend_core44 = require("@budibase/backend-core");
|
|
10741
10682
|
var import_types34 = require("@budibase/types");
|
|
10742
10683
|
var licensing = (opts = {
|
|
10743
10684
|
checkUsersLimit: true
|
|
@@ -10745,7 +10686,7 @@ var licensing = (opts = {
|
|
|
10745
10686
|
return async (ctx, next) => {
|
|
10746
10687
|
const licensingCheck = opts.licensingCheck ? opts.licensingCheck : () => !!ctx.user;
|
|
10747
10688
|
if (licensingCheck(ctx)) {
|
|
10748
|
-
if (
|
|
10689
|
+
if (import_backend_core44.env.SELF_HOSTED && import_backend_core44.env.DEFAULT_LICENSE) {
|
|
10749
10690
|
ctx.user.license = SELF_FREE_LICENSE;
|
|
10750
10691
|
return next();
|
|
10751
10692
|
}
|
|
@@ -10753,7 +10694,7 @@ var licensing = (opts = {
|
|
|
10753
10694
|
populateLicense: opts.populateLicense,
|
|
10754
10695
|
populateFreeLicense: opts.populateFreeLicense
|
|
10755
10696
|
});
|
|
10756
|
-
if (opts.checkUsersLimit && (
|
|
10697
|
+
if (opts.checkUsersLimit && (import_backend_core44.utils.isServingApp(ctx) || import_backend_core44.utils.isServingBuilder(ctx) || import_backend_core44.utils.isServingBuilderPreview(ctx) || import_backend_core44.utils.isPublicApiRequest(ctx))) {
|
|
10757
10698
|
await quotas_exports5.usageLimitIsExceeded(
|
|
10758
10699
|
import_types34.StaticQuotaName.USERS,
|
|
10759
10700
|
import_types34.QuotaUsageType.STATIC
|
|
@@ -10785,17 +10726,17 @@ var requireFeatures = (...featureFlags) => {
|
|
|
10785
10726
|
};
|
|
10786
10727
|
|
|
10787
10728
|
// src/middleware/doInScimContext.ts
|
|
10788
|
-
var
|
|
10729
|
+
var import_backend_core45 = require("@budibase/backend-core");
|
|
10789
10730
|
var doInScimContext = async (ctx, next) => {
|
|
10790
10731
|
let logId;
|
|
10791
|
-
if (!
|
|
10732
|
+
if (!import_backend_core45.env.DISABLE_SCIM_CALLS) {
|
|
10792
10733
|
logId = await logger_exports.logRequest({
|
|
10793
10734
|
// koa response stringify only returns status, message and header
|
|
10794
10735
|
...ctx.request.toJSON(),
|
|
10795
10736
|
body: ctx.request.body
|
|
10796
10737
|
});
|
|
10797
10738
|
}
|
|
10798
|
-
return await
|
|
10739
|
+
return await import_backend_core45.context.doInScimContext(async () => {
|
|
10799
10740
|
const result = await next();
|
|
10800
10741
|
if (logId) {
|
|
10801
10742
|
await logger_exports.logResponse(logId, {
|
|
@@ -10815,8 +10756,8 @@ var requireSCIM = async (ctx, next) => {
|
|
|
10815
10756
|
};
|
|
10816
10757
|
|
|
10817
10758
|
// src/middleware/scimSyncResourceRestricted.ts
|
|
10818
|
-
var
|
|
10819
|
-
var scimUserOnly = (paramId) => scimSyncChecks(
|
|
10759
|
+
var import_backend_core46 = require("@budibase/backend-core");
|
|
10760
|
+
var scimUserOnly = (paramId) => scimSyncChecks(import_backend_core46.users.getById, paramId, true);
|
|
10820
10761
|
var scimGroupOnly = (paramId) => scimSyncChecks(groups_exports.get, paramId, true);
|
|
10821
10762
|
var internalGroupOnly = (paramId) => scimSyncChecks(groups_exports.get, paramId, false);
|
|
10822
10763
|
function scimSyncChecks(getter, paramId, scimRequired) {
|
|
@@ -10834,8 +10775,8 @@ function scimSyncChecks(getter, paramId, scimRequired) {
|
|
|
10834
10775
|
}
|
|
10835
10776
|
|
|
10836
10777
|
// src/api/index.ts
|
|
10837
|
-
var
|
|
10838
|
-
__export(
|
|
10778
|
+
var api_exports = {};
|
|
10779
|
+
__export(api_exports, {
|
|
10839
10780
|
ai: () => ai_default,
|
|
10840
10781
|
appBackups: () => backups_default2,
|
|
10841
10782
|
auditLogs: () => auditLogs_default,
|
|
@@ -10852,7 +10793,7 @@ __export(ai_exports2, {
|
|
|
10852
10793
|
});
|
|
10853
10794
|
|
|
10854
10795
|
// src/ai/LargeLanguageModel.ts
|
|
10855
|
-
var
|
|
10796
|
+
var import_backend_core47 = require("@budibase/backend-core");
|
|
10856
10797
|
var import_types35 = require("@budibase/types");
|
|
10857
10798
|
var import_shared_core = require("@budibase/shared-core");
|
|
10858
10799
|
|
|
@@ -10991,7 +10932,7 @@ var LargeLanguageModel = class _LargeLanguageModel {
|
|
|
10991
10932
|
}
|
|
10992
10933
|
}
|
|
10993
10934
|
async init() {
|
|
10994
|
-
let aiConfig = await
|
|
10935
|
+
let aiConfig = await import_backend_core47.configs.getAIConfig();
|
|
10995
10936
|
const bbAIEnabled = await isBudibaseAIEnabled();
|
|
10996
10937
|
if (!aiConfig && !bbAIEnabled) {
|
|
10997
10938
|
throw Error("AI config must be defined to use Budibase AI LLM features");
|
|
@@ -11075,12 +11016,12 @@ async function generateCronExpression2(ctx) {
|
|
|
11075
11016
|
// src/api/routes/ai/index.ts
|
|
11076
11017
|
var import_types36 = require("@budibase/types");
|
|
11077
11018
|
var import_router = __toESM(require("@koa/router"));
|
|
11078
|
-
var
|
|
11019
|
+
var import_backend_core48 = require("@budibase/backend-core");
|
|
11079
11020
|
var router = new import_router.default();
|
|
11080
11021
|
router.post(
|
|
11081
11022
|
"/api/ai/cron",
|
|
11082
11023
|
feature_exports.requireFeature(import_types36.Feature.BUDIBASE_AI),
|
|
11083
|
-
|
|
11024
|
+
import_backend_core48.auth.builderOrAdmin,
|
|
11084
11025
|
generateCronExpression2
|
|
11085
11026
|
);
|
|
11086
11027
|
var ai_default = router;
|
|
@@ -11181,10 +11122,10 @@ async function removeAppBuilder3(ctx) {
|
|
|
11181
11122
|
var import_router2 = __toESM(require("@koa/router"));
|
|
11182
11123
|
var import_joi = __toESM(require("joi"));
|
|
11183
11124
|
var import_types37 = require("@budibase/types");
|
|
11184
|
-
var
|
|
11125
|
+
var import_backend_core49 = require("@budibase/backend-core");
|
|
11185
11126
|
var router2 = new import_router2.default();
|
|
11186
11127
|
function buildGroupSaveValidation() {
|
|
11187
|
-
return
|
|
11128
|
+
return import_backend_core49.auth.joiValidator.body(
|
|
11188
11129
|
import_joi.default.object({
|
|
11189
11130
|
_id: import_joi.default.string().optional(),
|
|
11190
11131
|
_rev: import_joi.default.string().optional(),
|
|
@@ -11202,7 +11143,7 @@ function buildGroupSaveValidation() {
|
|
|
11202
11143
|
}
|
|
11203
11144
|
router2.post(
|
|
11204
11145
|
"/api/global/groups",
|
|
11205
|
-
|
|
11146
|
+
import_backend_core49.auth.adminOnly,
|
|
11206
11147
|
feature_exports.requireFeature(import_types37.Feature.USER_GROUPS),
|
|
11207
11148
|
buildGroupSaveValidation(),
|
|
11208
11149
|
save5
|
|
@@ -11213,38 +11154,38 @@ router2.post(
|
|
|
11213
11154
|
).delete(
|
|
11214
11155
|
"/api/global/groups/:groupId/:rev",
|
|
11215
11156
|
feature_exports.requireFeature(import_types37.Feature.USER_GROUPS),
|
|
11216
|
-
|
|
11157
|
+
import_backend_core49.auth.adminOnly,
|
|
11217
11158
|
internalGroupOnly("groupId"),
|
|
11218
11159
|
destroy3
|
|
11219
11160
|
).get(
|
|
11220
11161
|
"/api/global/groups/:groupId",
|
|
11221
11162
|
feature_exports.requireFeature(import_types37.Feature.USER_GROUPS),
|
|
11222
|
-
|
|
11163
|
+
import_backend_core49.auth.adminOnly,
|
|
11223
11164
|
find2
|
|
11224
11165
|
).get(
|
|
11225
11166
|
"/api/global/groups/:groupId/users",
|
|
11226
11167
|
feature_exports.requireFeature(import_types37.Feature.USER_GROUPS),
|
|
11227
|
-
|
|
11168
|
+
import_backend_core49.auth.builderOrAdmin,
|
|
11228
11169
|
searchUsers
|
|
11229
11170
|
).post(
|
|
11230
11171
|
"/api/global/groups/:groupId/users",
|
|
11231
|
-
|
|
11172
|
+
import_backend_core49.auth.adminOnly,
|
|
11232
11173
|
feature_exports.requireFeature(import_types37.Feature.USER_GROUPS),
|
|
11233
11174
|
internalGroupOnly("groupId"),
|
|
11234
11175
|
updateGroupUsers
|
|
11235
11176
|
).post(
|
|
11236
11177
|
"/api/global/groups/:groupId/apps",
|
|
11237
|
-
|
|
11178
|
+
import_backend_core49.auth.builderOrAdmin,
|
|
11238
11179
|
feature_exports.requireFeature(import_types37.Feature.USER_GROUPS),
|
|
11239
11180
|
updateGroupApps2
|
|
11240
11181
|
).post(
|
|
11241
11182
|
"/api/global/groups/:groupId/app/:appId/builder",
|
|
11242
|
-
|
|
11183
|
+
import_backend_core49.auth.builderOrAdmin,
|
|
11243
11184
|
feature_exports.requireFeatures(import_types37.Feature.USER_GROUPS, import_types37.Feature.APP_BUILDERS),
|
|
11244
11185
|
addAppBuilder3
|
|
11245
11186
|
).delete(
|
|
11246
11187
|
"/api/global/groups/:groupId/app/:appId/builder",
|
|
11247
|
-
|
|
11188
|
+
import_backend_core49.auth.builderOrAdmin,
|
|
11248
11189
|
feature_exports.requireFeatures(import_types37.Feature.USER_GROUPS, import_types37.Feature.APP_BUILDERS),
|
|
11249
11190
|
removeAppBuilder3
|
|
11250
11191
|
);
|
|
@@ -11252,7 +11193,7 @@ var groups_default = router2;
|
|
|
11252
11193
|
|
|
11253
11194
|
// src/api/controllers/global/environmentVariables.ts
|
|
11254
11195
|
var import_types38 = require("@budibase/types");
|
|
11255
|
-
var
|
|
11196
|
+
var import_backend_core50 = require("@budibase/backend-core");
|
|
11256
11197
|
async function status(ctx) {
|
|
11257
11198
|
ctx.body = {
|
|
11258
11199
|
encryptionKeyAvailable: environmentVariables_exports2.isEncryptionKeyAvailable()
|
|
@@ -11270,7 +11211,7 @@ async function create3(ctx) {
|
|
|
11270
11211
|
if (production !== development) {
|
|
11271
11212
|
environments.push(import_types38.AppEnvironment.DEVELOPMENT);
|
|
11272
11213
|
}
|
|
11273
|
-
await
|
|
11214
|
+
await import_backend_core50.events.environmentVariable.created(name2, environments);
|
|
11274
11215
|
ctx.status = 200;
|
|
11275
11216
|
}
|
|
11276
11217
|
async function update4(ctx) {
|
|
@@ -11282,17 +11223,17 @@ async function update4(ctx) {
|
|
|
11282
11223
|
async function destroy4(ctx) {
|
|
11283
11224
|
const varName = ctx.params.varName;
|
|
11284
11225
|
await environmentVariables_exports2.remove(varName);
|
|
11285
|
-
await
|
|
11226
|
+
await import_backend_core50.events.environmentVariable.deleted(varName);
|
|
11286
11227
|
ctx.status = 200;
|
|
11287
11228
|
}
|
|
11288
11229
|
|
|
11289
11230
|
// src/api/routes/global/environmentVariables.ts
|
|
11290
|
-
var
|
|
11231
|
+
var import_backend_core51 = require("@budibase/backend-core");
|
|
11291
11232
|
var import_router3 = __toESM(require("@koa/router"));
|
|
11292
11233
|
var import_joi2 = __toESM(require("joi"));
|
|
11293
11234
|
var router3 = new import_router3.default();
|
|
11294
11235
|
function buildEnvVarUpdateValidator() {
|
|
11295
|
-
return
|
|
11236
|
+
return import_backend_core51.auth.joiValidator.body(
|
|
11296
11237
|
import_joi2.default.object({
|
|
11297
11238
|
name: import_joi2.default.string().optional(),
|
|
11298
11239
|
production: import_joi2.default.string().required(),
|
|
@@ -11300,35 +11241,35 @@ function buildEnvVarUpdateValidator() {
|
|
|
11300
11241
|
})
|
|
11301
11242
|
);
|
|
11302
11243
|
}
|
|
11303
|
-
router3.get("/api/env/variables/status",
|
|
11244
|
+
router3.get("/api/env/variables/status", import_backend_core51.auth.builderOrAdmin, status).get("/api/env/variables", import_backend_core51.auth.builderOrAdmin, fetch7).post(
|
|
11304
11245
|
"/api/env/variables",
|
|
11305
|
-
|
|
11246
|
+
import_backend_core51.auth.builderOrAdmin,
|
|
11306
11247
|
buildEnvVarUpdateValidator(),
|
|
11307
11248
|
create3
|
|
11308
11249
|
).patch(
|
|
11309
11250
|
"/api/env/variables/:varName",
|
|
11310
|
-
|
|
11251
|
+
import_backend_core51.auth.builderOrAdmin,
|
|
11311
11252
|
buildEnvVarUpdateValidator(),
|
|
11312
11253
|
update4
|
|
11313
11254
|
).delete(
|
|
11314
11255
|
"/api/env/variables/:varName",
|
|
11315
|
-
|
|
11256
|
+
import_backend_core51.auth.builderOrAdmin,
|
|
11316
11257
|
destroy4
|
|
11317
11258
|
);
|
|
11318
11259
|
var environmentVariables_default = router3;
|
|
11319
11260
|
|
|
11320
11261
|
// src/api/controllers/global/auditLogs.ts
|
|
11321
|
-
var
|
|
11262
|
+
var import_backend_core52 = require("@budibase/backend-core");
|
|
11322
11263
|
async function search(ctx) {
|
|
11323
11264
|
const search2 = ctx.request.body;
|
|
11324
11265
|
const fetched = await auditLogs_exports3.fetch(search2);
|
|
11325
|
-
await
|
|
11266
|
+
await import_backend_core52.events.auditLog.filtered(search2);
|
|
11326
11267
|
ctx.body = fetched;
|
|
11327
11268
|
}
|
|
11328
11269
|
async function download2(ctx) {
|
|
11329
11270
|
const search2 = ctx.request.body;
|
|
11330
11271
|
const { stream } = auditLogs_exports3.download(search2);
|
|
11331
|
-
await
|
|
11272
|
+
await import_backend_core52.events.auditLog.downloaded(search2);
|
|
11332
11273
|
ctx.attachment(`audit-logs-${Date.now()}.log`);
|
|
11333
11274
|
ctx.body = stream;
|
|
11334
11275
|
}
|
|
@@ -11340,11 +11281,11 @@ async function definitions2(ctx) {
|
|
|
11340
11281
|
|
|
11341
11282
|
// src/api/routes/global/auditLogs.ts
|
|
11342
11283
|
var import_types39 = require("@budibase/types");
|
|
11343
|
-
var
|
|
11284
|
+
var import_backend_core53 = require("@budibase/backend-core");
|
|
11344
11285
|
var import_router4 = __toESM(require("@koa/router"));
|
|
11345
11286
|
var import_joi3 = __toESM(require("joi"));
|
|
11346
11287
|
function buildAuditLogSearchValidator() {
|
|
11347
|
-
return
|
|
11288
|
+
return import_backend_core53.auth.joiValidator.body(
|
|
11348
11289
|
import_joi3.default.object({
|
|
11349
11290
|
userIds: import_joi3.default.array().items(import_joi3.default.string()).optional(),
|
|
11350
11291
|
appIds: import_joi3.default.array().items(import_joi3.default.string()).optional(),
|
|
@@ -11359,26 +11300,26 @@ function buildAuditLogSearchValidator() {
|
|
|
11359
11300
|
var router4 = new import_router4.default();
|
|
11360
11301
|
router4.post(
|
|
11361
11302
|
"/api/global/auditlogs/search",
|
|
11362
|
-
|
|
11303
|
+
import_backend_core53.auth.adminOnly,
|
|
11363
11304
|
buildAuditLogSearchValidator(),
|
|
11364
11305
|
search
|
|
11365
11306
|
).get(
|
|
11366
11307
|
"/api/global/auditlogs/download",
|
|
11367
|
-
|
|
11308
|
+
import_backend_core53.auth.adminOnly,
|
|
11368
11309
|
// convert query string param to body
|
|
11369
|
-
|
|
11310
|
+
import_backend_core53.middleware.querystringToBody,
|
|
11370
11311
|
buildAuditLogSearchValidator(),
|
|
11371
11312
|
download2
|
|
11372
11313
|
).get(
|
|
11373
11314
|
"/api/global/auditlogs/definitions",
|
|
11374
|
-
|
|
11315
|
+
import_backend_core53.auth.adminOnly,
|
|
11375
11316
|
definitions2
|
|
11376
11317
|
);
|
|
11377
11318
|
var auditLogs_default = router4;
|
|
11378
11319
|
|
|
11379
11320
|
// src/api/controllers/apps/backups.ts
|
|
11380
11321
|
var import_types40 = require("@budibase/types");
|
|
11381
|
-
var
|
|
11322
|
+
var import_backend_core54 = require("@budibase/backend-core");
|
|
11382
11323
|
async function checkAppID(ctx, appId) {
|
|
11383
11324
|
if (!await utils_exports2.appExists(appId)) {
|
|
11384
11325
|
ctx.throw(400, `Provided app ID: ${appId} - is invalid.`);
|
|
@@ -11419,7 +11360,7 @@ async function importBackup(ctx) {
|
|
|
11419
11360
|
if (!response) {
|
|
11420
11361
|
ctx.throw(500, "Unable to start restore.");
|
|
11421
11362
|
}
|
|
11422
|
-
await
|
|
11363
|
+
await import_backend_core54.events.backup.appBackupRestored(response.metadata);
|
|
11423
11364
|
ctx.body = {
|
|
11424
11365
|
restoredId: response?.restoreId,
|
|
11425
11366
|
message: "Restore triggered - process starting."
|
|
@@ -11469,10 +11410,10 @@ async function downloadBackup(ctx) {
|
|
|
11469
11410
|
var import_router5 = __toESM(require("@koa/router"));
|
|
11470
11411
|
var import_joi4 = __toESM(require("joi"));
|
|
11471
11412
|
var import_types41 = require("@budibase/types");
|
|
11472
|
-
var
|
|
11413
|
+
var import_backend_core55 = require("@budibase/backend-core");
|
|
11473
11414
|
var router5 = new import_router5.default();
|
|
11474
11415
|
function validateBackupSearch() {
|
|
11475
|
-
return
|
|
11416
|
+
return import_backend_core55.auth.joiValidator.body(
|
|
11476
11417
|
import_joi4.default.object({
|
|
11477
11418
|
trigger: import_joi4.default.string().valid(...Object.values(import_types41.AppBackupTrigger)),
|
|
11478
11419
|
type: import_joi4.default.string().valid(...Object.values(import_types41.AppBackupType)),
|
|
@@ -11482,26 +11423,26 @@ function validateBackupSearch() {
|
|
|
11482
11423
|
})
|
|
11483
11424
|
);
|
|
11484
11425
|
}
|
|
11485
|
-
router5.post("/api/apps/:appId/backups",
|
|
11426
|
+
router5.post("/api/apps/:appId/backups", import_backend_core55.auth.builderOrAdmin, manualBackup).post(
|
|
11486
11427
|
"/api/apps/:appId/backups/search",
|
|
11487
|
-
|
|
11428
|
+
import_backend_core55.auth.builderOrAdmin,
|
|
11488
11429
|
validateBackupSearch(),
|
|
11489
11430
|
fetchBackups
|
|
11490
11431
|
).get(
|
|
11491
11432
|
"/api/apps/:appId/backups/:backupId/file",
|
|
11492
|
-
|
|
11433
|
+
import_backend_core55.auth.builderOrAdmin,
|
|
11493
11434
|
downloadBackup
|
|
11494
11435
|
).patch(
|
|
11495
11436
|
"/api/apps/:appId/backups/:backupId",
|
|
11496
|
-
|
|
11437
|
+
import_backend_core55.auth.builderOrAdmin,
|
|
11497
11438
|
updateBackup
|
|
11498
11439
|
).delete(
|
|
11499
11440
|
"/api/apps/:appId/backups/:backupId",
|
|
11500
|
-
|
|
11441
|
+
import_backend_core55.auth.builderOrAdmin,
|
|
11501
11442
|
deleteBackup
|
|
11502
11443
|
).post(
|
|
11503
11444
|
"/api/apps/:appId/backups/:backupId/import",
|
|
11504
|
-
|
|
11445
|
+
import_backend_core55.auth.builderOrAdmin,
|
|
11505
11446
|
importBackup
|
|
11506
11447
|
);
|
|
11507
11448
|
var backups_default2 = router5;
|
|
@@ -11511,7 +11452,7 @@ var import_router6 = __toESM(require("@koa/router"));
|
|
|
11511
11452
|
|
|
11512
11453
|
// src/api/controllers/global/scim/users.ts
|
|
11513
11454
|
var import_scim_patch = require("scim-patch");
|
|
11514
|
-
var
|
|
11455
|
+
var import_backend_core56 = require("@budibase/backend-core");
|
|
11515
11456
|
function tryGetQueryAsNumber(ctx, name2) {
|
|
11516
11457
|
const value = ctx.request.query[name2];
|
|
11517
11458
|
if (value === void 0) {
|
|
@@ -11549,7 +11490,7 @@ var create4 = async (ctx) => {
|
|
|
11549
11490
|
const user = await users_exports3.create(userToCreate);
|
|
11550
11491
|
ctx.body = mappers_exports.user.toScimUserResponse(user);
|
|
11551
11492
|
} catch (e) {
|
|
11552
|
-
if (e instanceof
|
|
11493
|
+
if (e instanceof import_backend_core56.EmailUnavailableError) {
|
|
11553
11494
|
ctx.throw(409, "Email already in use");
|
|
11554
11495
|
}
|
|
11555
11496
|
throw e;
|
|
@@ -11758,11 +11699,11 @@ var scim_default = router6;
|
|
|
11758
11699
|
var import_router7 = __toESM(require("@koa/router"));
|
|
11759
11700
|
|
|
11760
11701
|
// src/api/controllers/global/users.ts
|
|
11761
|
-
var
|
|
11702
|
+
var import_backend_core57 = require("@budibase/backend-core");
|
|
11762
11703
|
async function addAppBuilder4(ctx) {
|
|
11763
11704
|
const { userId, appId } = ctx.params;
|
|
11764
11705
|
const user = await users_exports.db.getUser(userId);
|
|
11765
|
-
if (
|
|
11706
|
+
if (import_backend_core57.users.isGlobalBuilder(user)) {
|
|
11766
11707
|
ctx.body = { message: "User already admin - no permissions updated." };
|
|
11767
11708
|
return;
|
|
11768
11709
|
}
|
|
@@ -11772,7 +11713,7 @@ async function addAppBuilder4(ctx) {
|
|
|
11772
11713
|
async function removeAppBuilder4(ctx) {
|
|
11773
11714
|
const { userId, appId } = ctx.params;
|
|
11774
11715
|
const user = await users_exports.db.getUser(userId);
|
|
11775
|
-
if (
|
|
11716
|
+
if (import_backend_core57.users.isGlobalBuilder(user)) {
|
|
11776
11717
|
ctx.body = { message: "User already admin - no permissions removed." };
|
|
11777
11718
|
return;
|
|
11778
11719
|
}
|
|
@@ -11782,16 +11723,16 @@ async function removeAppBuilder4(ctx) {
|
|
|
11782
11723
|
|
|
11783
11724
|
// src/api/routes/global/users.ts
|
|
11784
11725
|
var import_types43 = require("@budibase/types");
|
|
11785
|
-
var
|
|
11726
|
+
var import_backend_core58 = require("@budibase/backend-core");
|
|
11786
11727
|
var router7 = new import_router7.default();
|
|
11787
11728
|
router7.post(
|
|
11788
11729
|
"/api/global/users/:userId/app/:appId/builder",
|
|
11789
|
-
|
|
11730
|
+
import_backend_core58.auth.builderOrAdmin,
|
|
11790
11731
|
feature_exports.requireFeatures(import_types43.Feature.APP_BUILDERS),
|
|
11791
11732
|
addAppBuilder4
|
|
11792
11733
|
).delete(
|
|
11793
11734
|
"/api/global/users/:userId/app/:appId/builder",
|
|
11794
|
-
|
|
11735
|
+
import_backend_core58.auth.builderOrAdmin,
|
|
11795
11736
|
feature_exports.requireFeatures(import_types43.Feature.APP_BUILDERS),
|
|
11796
11737
|
removeAppBuilder4
|
|
11797
11738
|
);
|
|
@@ -11813,7 +11754,7 @@ __export(users_exports6, {
|
|
|
11813
11754
|
});
|
|
11814
11755
|
var import_types44 = require("@budibase/types");
|
|
11815
11756
|
var import_scim2_parse_filter2 = require("scim2-parse-filter");
|
|
11816
|
-
var
|
|
11757
|
+
var import_backend_core59 = require("@budibase/backend-core");
|
|
11817
11758
|
var import_shared_core3 = require("@budibase/shared-core");
|
|
11818
11759
|
var { unreachable } = import_shared_core3.utils;
|
|
11819
11760
|
var toScimUserResponse = (user) => {
|
|
@@ -11842,7 +11783,7 @@ var isScimUserResponse = (user) => {
|
|
|
11842
11783
|
return !!user?.id;
|
|
11843
11784
|
};
|
|
11844
11785
|
function tryGetEmail(user) {
|
|
11845
|
-
if (
|
|
11786
|
+
if (import_backend_core59.utils.validEmail(user.userName)) {
|
|
11846
11787
|
return user.userName;
|
|
11847
11788
|
}
|
|
11848
11789
|
if (!user.emails) {
|