refactor(core): Send active workflow IDs during license renewal (#9804)
This commit is contained in:
@@ -99,7 +99,7 @@
|
||||
"@n8n/n8n-nodes-langchain": "workspace:*",
|
||||
"@n8n/permissions": "workspace:*",
|
||||
"@n8n/typeorm": "0.3.20-10",
|
||||
"@n8n_io/license-sdk": "2.12.0",
|
||||
"@n8n_io/license-sdk": "2.13.0",
|
||||
"@oclif/core": "3.26.6",
|
||||
"@pinecone-database/pinecone": "2.1.0",
|
||||
"@rudderstack/rudder-sdk-node": "2.0.7",
|
||||
|
||||
@@ -84,6 +84,9 @@ export class License {
|
||||
const collectUsageMetrics = isMainInstance
|
||||
? async () => await this.usageMetricsService.collectUsageMetrics()
|
||||
: async () => [];
|
||||
const collectPassthroughData = isMainInstance
|
||||
? async () => await this.usageMetricsService.getActiveWorkflowIds()
|
||||
: async () => ({});
|
||||
|
||||
const renewalEnabled = this.renewalEnabled(instanceType);
|
||||
|
||||
@@ -101,6 +104,7 @@ export class License {
|
||||
saveCertStr,
|
||||
deviceFingerprint: () => this.instanceSettings.instanceId,
|
||||
collectUsageMetrics,
|
||||
collectPassthroughData,
|
||||
onFeatureChange,
|
||||
});
|
||||
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
import { UsageMetricsRepository } from '@/databases/repositories/usageMetrics.repository';
|
||||
import { Service } from 'typedi';
|
||||
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
||||
|
||||
@Service()
|
||||
export class UsageMetricsService {
|
||||
constructor(private readonly usageMetricsRepository: UsageMetricsRepository) {}
|
||||
constructor(
|
||||
private readonly usageMetricsRepository: UsageMetricsRepository,
|
||||
private readonly workflowRepository: WorkflowRepository,
|
||||
) {}
|
||||
|
||||
async collectUsageMetrics() {
|
||||
const {
|
||||
@@ -26,4 +30,10 @@ export class UsageMetricsService {
|
||||
{ name: 'manualExecutions', value: manualExecutions },
|
||||
];
|
||||
}
|
||||
|
||||
async getActiveWorkflowIds() {
|
||||
return {
|
||||
activeWorkflowIds: await this.workflowRepository.getActiveIds(),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,11 @@ import Container from 'typedi';
|
||||
import { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
||||
|
||||
import * as testDb from '../../shared/testDb';
|
||||
import { createWorkflowWithTrigger, getAllWorkflows } from '../../shared/db/workflows';
|
||||
import {
|
||||
createWorkflowWithTrigger,
|
||||
createWorkflow,
|
||||
getAllWorkflows,
|
||||
} from '../../shared/db/workflows';
|
||||
|
||||
describe('WorkflowRepository', () => {
|
||||
beforeAll(async () => {
|
||||
@@ -67,4 +71,27 @@ describe('WorkflowRepository', () => {
|
||||
expect(after).toMatchObject([{ active: false }, { active: false }]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getActiveIds', () => {
|
||||
it('should return active workflow IDs', async () => {
|
||||
//
|
||||
// ARRANGE
|
||||
//
|
||||
const workflows = await Promise.all([
|
||||
createWorkflow({ active: true }),
|
||||
createWorkflow({ active: false }),
|
||||
createWorkflow({ active: false }),
|
||||
]);
|
||||
|
||||
//
|
||||
// ACT
|
||||
//
|
||||
const activeIds = await Container.get(WorkflowRepository).getActiveIds();
|
||||
|
||||
//
|
||||
// ASSERT
|
||||
//
|
||||
expect(activeIds).toEqual([workflows[0].id]);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
32
packages/cli/test/integration/usage-metrics.service.test.ts
Normal file
32
packages/cli/test/integration/usage-metrics.service.test.ts
Normal file
@@ -0,0 +1,32 @@
|
||||
import { mock } from 'jest-mock-extended';
|
||||
import { UsageMetricsService } from '@/services/usageMetrics.service';
|
||||
import type { WorkflowRepository } from '@/databases/repositories/workflow.repository';
|
||||
import type { UsageMetricsRepository } from '@/databases/repositories/usageMetrics.repository';
|
||||
|
||||
describe('UsageMetricsService', () => {
|
||||
const workflowRepository = mock<WorkflowRepository>();
|
||||
const usageMetricsService = new UsageMetricsService(
|
||||
mock<UsageMetricsRepository>(),
|
||||
workflowRepository,
|
||||
);
|
||||
|
||||
describe('getActiveWorkflowIds', () => {
|
||||
test('should return active workflow IDs', async () => {
|
||||
/**
|
||||
* Arrange
|
||||
*/
|
||||
const activeWorkflowIds = ['1', '2'];
|
||||
workflowRepository.getActiveIds.mockResolvedValue(activeWorkflowIds);
|
||||
|
||||
/**
|
||||
* Act
|
||||
*/
|
||||
const result = await usageMetricsService.getActiveWorkflowIds();
|
||||
|
||||
/**
|
||||
* Assert
|
||||
*/
|
||||
expect(result).toEqual({ activeWorkflowIds });
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -48,6 +48,7 @@ describe('License', () => {
|
||||
saveCertStr: expect.any(Function),
|
||||
onFeatureChange: expect.any(Function),
|
||||
collectUsageMetrics: expect.any(Function),
|
||||
collectPassthroughData: expect.any(Function),
|
||||
server: MOCK_SERVER_URL,
|
||||
tenantId: 1,
|
||||
});
|
||||
@@ -68,6 +69,7 @@ describe('License', () => {
|
||||
saveCertStr: expect.any(Function),
|
||||
onFeatureChange: expect.any(Function),
|
||||
collectUsageMetrics: expect.any(Function),
|
||||
collectPassthroughData: expect.any(Function),
|
||||
server: MOCK_SERVER_URL,
|
||||
tenantId: 1,
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user