Skip to content

Commit

Permalink
Merge branch 'develop' into fix/username-update-async
Browse files Browse the repository at this point in the history
  • Loading branch information
tapiarafael authored Oct 3, 2023
2 parents d58984e + a98f3ff commit 66dc482
Show file tree
Hide file tree
Showing 21 changed files with 152 additions and 10 deletions.
13 changes: 13 additions & 0 deletions .changeset/nice-chairs-add.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
"@rocket.chat/meteor": minor
"@rocket.chat/core-typings": minor
---

Added `push` statistic, containing three bits. Each bit represents a boolean:
```
1 1 1
| | |
| | +- push enabled = 0b1 = 1
| +--- push gateway enabled = 0b10 = 2
+----- push gateway changed = 0b100 = 4
```
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
2 changes: 2 additions & 0 deletions .github/actions/build-docker/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ runs:

steps:
- name: Login to GitHub Container Registry
if: github.event.pull_request.head.repo.full_name == github.repository
uses: docker/login-action@v2
with:
registry: ghcr.io
Expand Down Expand Up @@ -62,6 +63,7 @@ runs:
docker compose -f docker-compose-ci.yml build "${args[@]}"
- name: Publish Docker images to GitHub Container Registry
if: github.event.pull_request.head.repo.full_name == github.repository
shell: bash
run: |
args=(rocketchat)
Expand Down
8 changes: 8 additions & 0 deletions .github/workflows/ci-test-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,14 @@ jobs:
cache-modules: true
install: true

# if we are testing a PR from a fork, we need to build the docker image at this point
- uses: ./.github/actions/build-docker
if: github.event.pull_request.head.repo.full_name != github.repository
with:
CR_USER: ${{ secrets.CR_USER }}
CR_PAT: ${{ secrets.CR_PAT }}
node-version: ${{ inputs.node-version }}

- uses: dtinth/setup-github-actions-caching-for-turbo@v1

- name: Start httpbin container and wait for it to be ready
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,6 @@ jobs:
build-gh-docker-coverage:
name: 🚢 Build Docker Images for Testing
needs: [build, release-versions]
if: (github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'release' || github.ref == 'refs/heads/develop')
runs-on: ubuntu-20.04

env:
Expand All @@ -189,7 +188,10 @@ jobs:

steps:
- uses: actions/checkout@v3

# we only build and publish the actual docker images if not a PR from a fork
- uses: ./.github/actions/build-docker
if: (github.event.pull_request.head.repo.full_name == github.repository || github.event_name == 'release' || github.ref == 'refs/heads/develop')
with:
CR_USER: ${{ secrets.CR_USER }}
CR_PAT: ${{ secrets.CR_PAT }}
Expand Down
9 changes: 9 additions & 0 deletions apps/meteor/app/statistics/server/lib/statistics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -517,6 +517,15 @@ export const statistics = {
statistics.totalWebRTCCalls = settings.get('WebRTC_Calls_Count');
statistics.uncaughtExceptionsCount = settings.get('Uncaught_Exceptions_Count');

const defaultGateway = (await Settings.findOneById('Push_gateway', { projection: { packageValue: 1 } }))?.packageValue;

// one bit for each of the following:
const pushEnabled = settings.get('Push_enable') ? 1 : 0;
const pushGatewayEnabled = settings.get('Push_enable_gateway') ? 2 : 0;
const pushGatewayChanged = settings.get('Push_gateway') !== defaultGateway ? 4 : 0;

statistics.push = pushEnabled | pushGatewayEnabled | pushGatewayChanged;

const defaultHomeTitle = (await Settings.findOneById('Layout_Home_Title'))?.packageValue;
statistics.homeTitleChanged = settings.get('Layout_Home_Title') !== defaultHomeTitle;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ export default {
totalCustomRoles: 0,
totalWebRTCCalls: 0,
uncaughtExceptionsCount: 0,
push: 0,
matrixFederation: {
enabled: false,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,7 @@ export default {
totalCustomRoles: 0,
totalWebRTCCalls: 0,
uncaughtExceptionsCount: 0,
push: 0,
matrixFederation: {
enabled: false,
},
Expand Down
1 change: 1 addition & 0 deletions apps/meteor/client/views/admin/info/UsageCard.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ export default {
totalCustomRoles: 0,
totalWebRTCCalls: 0,
uncaughtExceptionsCount: 0,
push: 0,
matrixFederation: {
enabled: false,
},
Expand Down
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
2 changes: 0 additions & 2 deletions apps/meteor/ee/server/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import './startup';

import '../app/license/server/index';
import '../app/api-enterprise/server/index';
import '../app/authorization/server/index';
Expand Down
3 changes: 2 additions & 1 deletion apps/meteor/server/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ import './importPackages';
import '../imports/startup/server';
import '../app/lib/server/startup';

import '../ee/server/startup';
import './startup';
import '../ee/server';
import './lib/pushConfig';
import './startup';
import './configuration/accounts_meld';
import './configuration/ldap';
import './methods/OEmbedCacheCleanup';
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,
};
}
}
4 changes: 2 additions & 2 deletions ee/packages/license/src/pendingLicense.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ export function setPendingLicense(this: LicenseManager, encryptedLicense: string
}
}

export function applyPendingLicense(this: LicenseManager) {
export async function applyPendingLicense(this: LicenseManager) {
if (this.pendingLicense) {
logger.info('Applying pending license.');
this.setLicense(this.pendingLicense);
return this.setLicense(this.pendingLicense);
}
}

Expand Down
3 changes: 3 additions & 0 deletions ee/packages/presence/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@
"files": [
"/dist"
],
"volta": {
"extends": "../../../package.json"
},
"dependencies": {
"@rocket.chat/core-services": "workspace:^",
"@rocket.chat/core-typings": "workspace:^",
Expand Down
3 changes: 3 additions & 0 deletions packages/core-services/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@
"files": [
"/dist"
],
"volta": {
"extends": "../../package.json"
},
"dependencies": {
"@rocket.chat/apps-engine": "1.41.0-alpha.290",
"@rocket.chat/core-typings": "workspace:^",
Expand Down
6 changes: 5 additions & 1 deletion packages/core-services/src/lib/Api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,11 @@ export class Api implements IApiService {
}

async broadcast<T extends keyof EventSignatures>(event: T, ...args: Parameters<EventSignatures[T]>): Promise<void> {
return this.broker?.broadcast(event, ...args);
if (!this.broker) {
throw new Error(`No broker set to broadcast: ${event}`);
}

return this.broker.broadcast(event, ...args);
}

async broadcastToServices<T extends keyof EventSignatures>(
Expand Down
1 change: 1 addition & 0 deletions packages/core-typings/src/IStats.ts
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,7 @@ export interface IStats {
totalCustomRoles: number;
totalWebRTCCalls: number;
uncaughtExceptionsCount: number;
push: number;
matrixFederation: {
enabled: boolean;
};
Expand Down
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 66dc482

Please sign in to comment.