2023-01-29 19:24:55 +02:00

147 lines
3.8 KiB
JavaScript

'use strict';
const _ = require('lodash');
// eslint-disable-next-line node/no-extraneous-require
const { features } = require('@strapi/strapi/lib/utils/ee');
const executeCEBootstrap = require('../../server/bootstrap');
const { getService } = require('../../server/utils');
const actions = require('./config/admin-actions');
const enableUsersToLicenseLimit = async (numberOfUsersToEnable) => {
const data = await strapi.db.query('strapi::ee-store').findOne({
where: { key: 'ee_disabled_users' },
});
if (!data || !data.value || data.value.length === 0) return;
const disabledUsers = JSON.parse(data.value);
const usersToEnable = _.take(disabledUsers, numberOfUsersToEnable);
usersToEnable.forEach(async (user) => {
const data = await strapi.db.query('admin::user').findOne({
where: { id: user.id },
});
if (!data) return;
await strapi.db.query('admin::user').update({
where: { id: user.id },
data: { isActive: true },
});
});
// TODO: sync new list of disabled users with ee_store in case some are left
};
const calculateAdminSeatDifference = async (seatsAllowedByLicense) => {
const currentAdminSeats = await strapi.db.query('admin::user').count({
where: {
isActive: true,
},
});
return currentAdminSeats - seatsAllowedByLicense;
};
const disableUsersAboveLicenseLimit = async (numberOfUsersToDisable) => {
const users = await strapi.db.query('admin::user').findMany({
where: { isActive: 'true' },
orderBy: { createdAt: 'DESC' },
populate: { roles: { select: ['id'] } },
});
const usersToDisable = _.take(users, numberOfUsersToDisable);
console.log(usersToDisable);
usersToDisable.forEach(async (user) => {
user.isActive = false;
await strapi.db.query('admin::user').update({
where: { id: user.id },
data: {
isActive: false,
},
});
});
const data = await strapi.db.query('strapi::ee-store').findOne({
where: { key: 'ee_disabled_users' },
});
console.log('data run done', data);
if (data) {
return strapi.db.query('strapi::ee-store').update({
where: { id: data.id },
data: { value: JSON.stringify(usersToDisable) },
});
}
return strapi.db.query('strapi::ee-store').create({
data: {
key: 'ee_disabled_users',
value: JSON.stringify(usersToDisable),
},
});
};
const syncdDisabledUserRecords = async () => {
const data = await strapi.db.query('strapi::ee-store').findOne({
where: { key: 'ee_disabled_users' },
});
if (!data || !data.value || data.value.length === 0) return;
console.log(data);
const disabledUsers = JSON.parse(data.value);
disabledUsers.forEach(async (user) => {
const data = await strapi.db.query('admin::user').findOne({
where: { id: user.id },
});
if (!data) return;
await strapi.db.query('admin::user').update({
where: { id: user.id },
data: { isActive: user.isActive },
});
});
};
module.exports = async () => {
const { actionProvider } = getService('permission');
if (features.isEnabled('sso')) {
await actionProvider.registerMany(actions.sso);
}
if (features.isEnabled('audit-logs')) {
await actionProvider.registerMany(actions.auditLogs);
}
// TODO: check admin seats
await syncdDisabledUserRecords();
const permittedAdminSeats = 15;
const adminSeatDifference = await calculateAdminSeatDifference(permittedAdminSeats);
switch (true) {
case adminSeatDifference === 0:
console.log('Breaking out early');
break;
case adminSeatDifference > 0:
console.log('Disabling users');
await disableUsersAboveLicenseLimit(adminSeatDifference);
break;
case adminSeatDifference < 0:
console.log('Enabling users');
await enableUsersToLicenseLimit(Math.abs(adminSeatDifference));
break;
default:
break;
}
await executeCEBootstrap();
};