Skip to content

Commit

Permalink
Merge branch 'develop' into chore/translationCdn
Browse files Browse the repository at this point in the history
  • Loading branch information
kodiakhq[bot] authored Oct 3, 2023
2 parents 167f571 + a98f3ff commit 90e0aca
Show file tree
Hide file tree
Showing 6 changed files with 98 additions and 3 deletions.
7 changes: 7 additions & 0 deletions .changeset/tough-carrots-walk.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@rocket.chat/rest-typings': minor
'@rocket.chat/license': patch
'@rocket.chat/meteor': patch
---

feat: added `licenses.info` endpoint
13 changes: 13 additions & 0 deletions apps/meteor/ee/server/api/licenses.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { License } from '@rocket.chat/license';
import { Settings, Users } from '@rocket.chat/models';
import { isLicensesInfoProps } from '@rocket.chat/rest-typings';
import { check } from 'meteor/check';

import { API } from '../../../app/api/server/api';
Expand All @@ -22,6 +23,18 @@ API.v1.addRoute(
},
);

API.v1.addRoute(
'licenses.info',
{ authRequired: true, validateParams: isLicensesInfoProps, permissionsRequired: ['view-privileged-setting'] },
{
async get() {
const data = await License.getInfo(Boolean(this.queryParams.loadValues));

return API.v1.success({ data });
},
},
);

API.v1.addRoute(
'licenses.add',
{ authRequired: true },
Expand Down
10 changes: 9 additions & 1 deletion ee/packages/license/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { LicenseLimitKind } from './definition/ILicenseV3';
import type { ILicenseV3, LicenseLimitKind } from './definition/ILicenseV3';
import type { LicenseModule } from './definition/LicenseModule';
import type { LimitContext } from './definition/LimitContext';
import { getAppsConfig, getMaxActiveUsers, getUnmodifiedLicenseAndModules } from './deprecated';
import { onLicense } from './events/deprecated';
Expand Down Expand Up @@ -45,6 +46,13 @@ interface License {
onInvalidateLicense: typeof onInvalidateLicense;
onLimitReached: typeof onLimitReached;

getInfo: (loadCurrentValues: boolean) => Promise<{
license: ILicenseV3 | undefined;
activeModules: LicenseModule[];
limits: Record<LicenseLimitKind, { value?: number; max: number }>;
inFairPolicy: boolean;
}>;

// Deprecated:
onLicense: typeof onLicense;
// Deprecated:
Expand Down
41 changes: 40 additions & 1 deletion ee/packages/license/src/license.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { DuplicatedLicenseError } from './errors/DuplicatedLicenseError';
import { InvalidLicenseError } from './errors/InvalidLicenseError';
import { NotReadyForValidation } from './errors/NotReadyForValidation';
import { logger } from './logger';
import { invalidateAll, replaceModules } from './modules';
import { getModules, invalidateAll, replaceModules } from './modules';
import { applyPendingLicense, clearPendingLicense, hasPendingLicense, isPendingLicense, setPendingLicense } from './pendingLicense';
import { showLicense } from './showLicense';
import { replaceTags } from './tags';
Expand Down Expand Up @@ -227,4 +227,43 @@ export class LicenseManager extends Emitter<
.some(({ max }) => max < currentValue),
);
}

public async getInfo(loadCurrentValues = false): Promise<{
license: ILicenseV3 | undefined;
activeModules: LicenseModule[];
limits: Record<LicenseLimitKind, { value?: number; max: number }>;
inFairPolicy: boolean;
}> {
const activeModules = getModules.call(this);
const license = this.getLicense();

// Get all limits present in the license and their current value
const limits = (
(license &&
(await Promise.all(
(['activeUsers', 'guestUsers', 'privateApps', 'marketplaceApps', 'monthlyActiveContacts'] as LicenseLimitKind[])
.map((limitKey) => ({
limitKey,
max: Math.max(-1, Math.min(...Array.from(license.limits[limitKey as LicenseLimitKind] || [])?.map(({ max }) => max))),
}))
.filter(({ max }) => max >= 0 && max < Infinity)
.map(async ({ max, limitKey }) => {
return {
[limitKey as LicenseLimitKind]: {
...(loadCurrentValues ? { value: await getCurrentValueForLicenseLimit.call(this, limitKey as LicenseLimitKind) } : {}),
max,
},
};
}),
))) ||
[]
).reduce((prev, curr) => ({ ...prev, ...curr }), {});

return {
license,
activeModules,
limits: limits as Record<LicenseLimitKind, { max: number; value: number }>,
inFairPolicy: this.inFairPolicy,
};
}
}
1 change: 1 addition & 0 deletions packages/rest-typings/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,7 @@ export * from './v1/invites';
export * from './v1/dm';
export * from './v1/dm/DmHistoryProps';
export * from './v1/integrations';
export * from './v1/licenses';
export * from './v1/omnichannel';
export * from './v1/oauthapps';
export * from './v1/oauthapps/UpdateOAuthAppParamsPOST';
Expand Down
29 changes: 28 additions & 1 deletion packages/rest-typings/src/v1/licenses.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { ILicenseV2, ILicenseV3 } from '@rocket.chat/license';
import type { ILicenseV2, ILicenseV3, LicenseLimitKind } from '@rocket.chat/license';
import Ajv from 'ajv';

const ajv = new Ajv({
Expand All @@ -22,10 +22,37 @@ const licensesAddPropsSchema = {

export const isLicensesAddProps = ajv.compile<licensesAddProps>(licensesAddPropsSchema);

type licensesInfoProps = {
loadValues?: boolean;
};

const licensesInfoPropsSchema = {
type: 'object',
properties: {
loadValues: {
type: 'boolean',
},
},
required: [],
additionalProperties: false,
};

export const isLicensesInfoProps = ajv.compile<licensesInfoProps>(licensesInfoPropsSchema);

export type LicensesEndpoints = {
'/v1/licenses.get': {
GET: () => { licenses: Array<ILicenseV2 | (ILicenseV3 & { modules: string[] })> };
};
'/v1/licenses.info': {
GET: (params: licensesInfoProps) => {
data: {
license: ILicenseV3 | undefined;
activeModules: string[];
limits: Record<LicenseLimitKind, { max: number; value?: number }>;
inFairPolicy: boolean;
};
};
};
'/v1/licenses.add': {
POST: (params: licensesAddProps) => void;
};
Expand Down

0 comments on commit 90e0aca

Please sign in to comment.