Skip to content

Commit

Permalink
feat: first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
horpeazy committed May 9, 2024
1 parent 6d542ee commit b92c3dc
Show file tree
Hide file tree
Showing 36 changed files with 652 additions and 260 deletions.
14 changes: 14 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,22 @@
"test:e2e:all": "scripts/run-e2e.js all"
},
"dependencies": {
"@types/lodash.set": "^4.3.9",
"@types/lodash.sortby": "^4.7.9",
"@types/openapi-to-postmanv2": "^3.2.4",
"@types/postman-collection": "^3.5.10",
"@types/qrcode": "^1.5.0",
"@types/request": "^2.48.12",
"@types/request-promise-native": "^1.0.21",
"@types/strftime": "^0.9.8",
"lodash.set": "^4.3.2",
"lodash.sortby": "^4.7.0",
"n8n": "workspace:*",
"openapi-to-postmanv2": "^4.20.1",
"postman-collection": "^4.4.0",
"qrcode": "^1.5.3",
"request": "^2.88.2",
"request-promise-native": "^1.0.9",
"strftime": "^0.10.2"
},
"devDependencies": {
Expand Down
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
Empty file.
1 change: 1 addition & 0 deletions packages/cli/src/WorkflowRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ import { PermissionChecker } from '@/UserManagement/PermissionChecker';
import { InternalHooks } from '@/InternalHooks';
import { Logger } from '@/Logger';
import { WorkflowStaticDataService } from '@/workflows/workflowStaticData.service';
import { logIncidentFromWorkflowExecute } from './lib/incidentLogger';

@Service()
export class WorkflowRunner {
Expand Down
4 changes: 2 additions & 2 deletions packages/cli/src/controllers/owner.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export class OwnerController {
*/
@Post('/setup', { skipAuth: true })
async setupOwner(req: OwnerRequest.Post, res: Response) {
const { email, firstName, lastName, password } = req.body;
const { email, firstName, lastName, password, otpSecret, otp } = req.body;

if (config.getEnv('userManagement.isInstanceOwnerSetUp')) {
this.logger.debug(
Expand Down Expand Up @@ -63,7 +63,7 @@ export class OwnerController {
if (!otpSecret || !otp) {
this.logger.debug(
'Request to claim instance ownership failed because of missing otpSecret or otp in payload',
{ userId, payload: req.body },
{ otp, payload: req.body },
);
throw new BadRequestError('otpSecret and otp are mandatory');
}
Expand Down
25 changes: 11 additions & 14 deletions packages/cli/src/controllers/saveRequestLog.controller.ts
Original file line number Diff line number Diff line change
@@ -1,36 +1,33 @@
import type { IDatabaseCollections } from '@/Interfaces';
import type { SaveRequestStatusEnum } from '@/databases/entities/SaveRequestLog';
import { SaveRequestLog } from '@/databases/entities/SaveRequestLog';
import type {
SaveRequestLogRepository,
UserRepository,
WorkflowRepository,
} from '@/databases/repositories';
import type { UserRepository } from '@db/repositories/user.repository';
import type { SaveRequestLogRepository } from '@db/repositories/saveRequestLog.repository';
import type { WorkflowRepository } from '@db/repositories/workflow.repository';
import { Post, RestController } from '@/decorators';
import { SaveRequestLogRequest } from '@/requests';
import type { ILogger } from 'n8n-workflow';
import { Logger } from '@/Logger';

@RestController('/save-request-log')
export class SaveRequestLogController {
private readonly logger: ILogger;

private saveRequestLogRepository: SaveRequestLogRepository;

private userRepository: UserRepository;

private workFlowRepository: WorkflowRepository;

private logger: Logger

constructor({
logger,
repositories,
}: {
logger: ILogger;
repositories: Pick<IDatabaseCollections, 'User' | 'Workflow' | 'SaveRequestLog'>;
logger: Logger;
repositories: { User?: UserRepository; SaveRequestLog?: SaveRequestLogRepository; Workflow?: WorkflowRepository };
}) {
this.logger = logger;
this.saveRequestLogRepository = repositories.SaveRequestLog;
this.userRepository = repositories.User;
this.workFlowRepository = repositories.Workflow;
this.saveRequestLogRepository = repositories.SaveRequestLog!;
this.userRepository = repositories.User!;
this.workFlowRepository = repositories.Workflow!;
}

@Post('/')
Expand Down
4 changes: 2 additions & 2 deletions packages/cli/src/databases/entities/SaveRequestLog.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
import { AbstractEntity } from './AbstractEntity';
import { WithTimestampsAndStringId } from './AbstractEntity';
import { User } from './User';
import { WorkflowEntity } from './WorkflowEntity';

Expand All @@ -9,7 +9,7 @@ export const enum SaveRequestStatusEnum {
}

@Entity()
export class SaveRequestLog extends AbstractEntity {
export class SaveRequestLog extends WithTimestampsAndStringId {
@PrimaryGeneratedColumn('uuid')
id: string;

Expand Down
4 changes: 4 additions & 0 deletions packages/cli/src/databases/entities/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import { WorkflowStatistics } from './WorkflowStatistics';
import { ExecutionMetadata } from './ExecutionMetadata';
import { ExecutionData } from './ExecutionData';
import { WorkflowHistory } from './WorkflowHistory';
import { ServerIncident } from './ServerIncident';
import { DataRecoveryActivity } from './DataRecoveryActivity';

export const entities = {
AuthIdentity,
Expand All @@ -41,4 +43,6 @@ export const entities = {
ExecutionMetadata,
ExecutionData,
WorkflowHistory,
ServerIncident,
DataRecoveryActivity,
};
Original file line number Diff line number Diff line change
@@ -1,20 +1,13 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers';
import type { MigrationContext, ReversibleMigration } from '@db/types';

export class AddUserOTPSecret1681134145997 implements MigrationInterface {
export class AddUserOTPSecret1681134145997 implements ReversibleMigration {
name = 'AddUserOTPSecret1681134145997';

async up(queryRunner: QueryRunner): Promise<void> {
const tablePrefix = getTablePrefix();
logMigrationStart(this.name);
async up({ queryRunner, tablePrefix }: MigrationContext): Promise<void> {
await queryRunner.query(`ALTER TABLE "${tablePrefix}user" ADD COLUMN otpsecret varchar`);

logMigrationEnd(this.name);
}

async down(queryRunner: QueryRunner): Promise<void> {
const tablePrefix = getTablePrefix();

async down({ queryRunner, tablePrefix }: MigrationContext): Promise<void> {
await queryRunner.query(`ALTER TABLE "${tablePrefix}user" DROP COLUMN otpsecret`);
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers';
import type { MigrationContext, ReversibleMigration } from '@db/types';

export class AddSaveRequestLog1681134145998 implements MigrationInterface {
export class AddSaveRequestLog1681134145998 implements ReversibleMigration {
name = 'AddSaveRequestLog1681134145998';

async up(queryRunner: QueryRunner): Promise<void> {
const tablePrefix = getTablePrefix();
logMigrationStart(this.name);

async up({ queryRunner, tablePrefix }: MigrationContext): Promise<void> {
await queryRunner.query(`
CREATE TABLE "${tablePrefix}save_request_log" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "userId" uuid NOT NULL, "request" jsonb DEFAULT '{}', "createdAt" TIMESTAMP NOT NULL DEFAULT ('now'::text)::timestamp(6) with time zone, "updatedAt" TIMESTAMP NOT NULL DEFAULT ('now'::text)::timestamp(6) with time zone, "workflowId" integer NOT NULL, "response" jsonb DEFAULT '{}', "status" VARCHAR(128) NOT NULL, CONSTRAINT "PK_a2a6978768567cd32a5d6cc2797" PRIMARY KEY ("id"))
`);
Expand All @@ -23,13 +19,9 @@ export class AddSaveRequestLog1681134145998 implements MigrationInterface {
ALTER TABLE "${tablePrefix}save_request_log" ADD CONSTRAINT "FK_9a3caef176a6bd386c9ca3b3799" FOREIGN KEY ("workflowId") REFERENCES "workflow_entity"("id") ON DELETE NO ACTION ON UPDATE NO action
`,
);

logMigrationEnd(this.name);
}

async down(queryRunner: QueryRunner): Promise<void> {
const tablePrefix = getTablePrefix();

async down({ queryRunner, tablePrefix }: MigrationContext): Promise<void> {
await queryRunner.query(
`ALTER TABLE "${tablePrefix}save_request_log" DROP CONSTRAINT "FK_9a3caef176a6bd386c9ca3b3799"`,
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
import type { MigrationContext, ReversibleMigration } from '@db/types';

export class addIncidentHandlingTables1689942863738 implements MigrationInterface {
export class addIncidentHandlingTables1689942863738 implements ReversibleMigration {
name = 'addIncidentHandlingTables1689942863738';

public async up(queryRunner: QueryRunner): Promise<void> {
public async up({ queryRunner, tablePrefix }: MigrationContext): Promise<void> {
await queryRunner.query(
`CREATE TABLE "server_incident" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "lastUpdateByAppUserId" character varying, "lastUpdateByZohoUserId" character varying, "lastUpdateSource" character varying, "createdAt" TIMESTAMP NOT NULL DEFAULT ('now'::text)::timestamp(6) with time zone, "updatedAt" TIMESTAMP NOT NULL DEFAULT ('now'::text)::timestamp(6) with time zone, "API" character varying, "APIMethod" character varying, "APIBody" json, "queueName" character varying, "errorMessage" character varying NOT NULL, "errorStackTrace" character varying, "incidentTime" TIMESTAMP NOT NULL, "additionalInformation" json, "zohoDeskTicketId" character varying, "correlationId" character varying, "isResolved" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_c24ae1e5263dccb981312915dfc" PRIMARY KEY ("id"))`,
);
Expand All @@ -15,7 +15,7 @@ export class addIncidentHandlingTables1689942863738 implements MigrationInterfac
);
}

public async down(queryRunner: QueryRunner): Promise<void> {
public async down({ queryRunner, tablePrefix }: MigrationContext): Promise<void> {
await queryRunner.query(`DROP TABLE "data_recovery_activity"`);
await queryRunner.query(`DROP TYPE "public"."data_recovery_activity_status_enum"`);
await queryRunner.query(`DROP TABLE "server_incident"`);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import type { MigrationContext, ReversibleMigration } from '@db/types';

export class dropConstraintOnSaveRequestLog1689942863739 implements ReversibleMigration {
name = 'dropConstraintOnSaveRequestLog1689942863739';

public async up({ queryRunner, tablePrefix }: MigrationContext): Promise<void> {
await queryRunner.query(
`ALTER TABLE ${tablePrefix}save_request_log" DROP CONSTRAINT IF EXISTS "FK_9a3caef176a6bd386c9ca3b3799";`,
);
}

public async down({ queryRunner, tablePrefix }: MigrationContext): Promise<void> {
await queryRunner.query(
`
ALTER TABLE "${tablePrefix}save_request_log" ADD CONSTRAINT "FK_9a3caef176a6bd386c9ca3b3799" FOREIGN KEY ("workflowId") REFERENCES "workflow_entity"("id") ON DELETE NO ACTION ON UPDATE NO action
`,
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import type { MigrationContext, ReversibleMigration } from '@db/types';

export class addConstarinToSvaeRequestLog1694091729096 implements ReversibleMigration {
name = 'addConstarinToSvaeRequestLog1694091729096';

public async up({ queryRunner, tablePrefix }: MigrationContext): Promise<void> {
await queryRunner.query(
`
ALTER TABLE "${tablePrefix}save_request_log" ADD CONSTRAINT "FK_9a3caef176a6bd386c9ca3b3799" FOREIGN KEY ("workflowId") REFERENCES "workflow_entity"("id") ON DELETE NO ACTION ON UPDATE NO action
`,
);
}

public async down({ queryRunner, tablePrefix }: MigrationContext): Promise<void> {
await queryRunner.query(
`ALTER TABLE ${tablePrefix}save_request_log" DROP CONSTRAINT IF EXISTS "FK_9a3caef176a6bd386c9ca3b3799";`,
);
}
}
4 changes: 4 additions & 0 deletions packages/cli/src/databases/migrations/postgresdb/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,11 @@ import { AddUserActivatedProperty1681134145996 } from './1681134145996-AddUserAc
import { AddUserOTPSecret1681134145997 } from './1681134145997-AddUserOTPSecret';
import { AddSaveRequestLog1681134145998 } from './1681134145998-AddSaveRequestLog';
import { addIncidentHandlingTables1689942863738 } from './1689942863738-addIncidentHandlingTables';
import { dropConstraintOnSaveRequestLog1689942863739 } from './1689942863739-dropConstraintOnSaveRequestLog';
import { MigrateIntegerKeysToString1690000000000 } from './1690000000000-MigrateIntegerKeysToString';
import { SeparateExecutionData1690000000020 } from './1690000000020-SeparateExecutionData';
import { RemoveSkipOwnerSetup1681134145997 } from './1681134145997-RemoveSkipOwnerSetup';
import { addConstarinToSvaeRequestLog1694091729096 } from './1694091729096-addConstarinToSvaeRequestLog';
import { RemoveResetPasswordColumns1690000000030 } from '../common/1690000000030-RemoveResetPasswordColumns';
import { AddMissingPrimaryKeyOnExecutionData1690787606731 } from './1690787606731-AddMissingPrimaryKeyOnExecutionData';
import { CreateWorkflowNameIndex1691088862123 } from '../common/1691088862123-CreateWorkflowNameIndex';
Expand Down Expand Up @@ -99,9 +101,11 @@ export const postgresMigrations: Migration[] = [
AddUserOTPSecret1681134145997,
AddSaveRequestLog1681134145998,
addIncidentHandlingTables1689942863738,
dropConstraintOnSaveRequestLog1689942863739,
MigrateIntegerKeysToString1690000000000,
SeparateExecutionData1690000000020,
RemoveSkipOwnerSetup1681134145997,
addConstarinToSvaeRequestLog1694091729096,
RemoveResetPasswordColumns1690000000030,
AddMissingPrimaryKeyOnExecutionData1690787606731,
CreateWorkflowNameIndex1691088862123,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,13 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers';
import type { MigrationContext, ReversibleMigration } from '@db/types';

export class AddUserOTPSecret1681134145997 implements MigrationInterface {
export class AddUserOTPSecret1681134145997 implements ReversibleMigration {
name = 'AddUserOTPSecret1681134145997';

async up(queryRunner: QueryRunner): Promise<void> {
const tablePrefix = getTablePrefix();
logMigrationStart(this.name);
async up({ queryRunner, tablePrefix }: MigrationContext): Promise<void> {
await queryRunner.query(`ALTER TABLE "${tablePrefix}user" ADD COLUMN otpsecret varchar`);

logMigrationEnd(this.name);
}

async down(queryRunner: QueryRunner): Promise<void> {
const tablePrefix = getTablePrefix();

async down({ queryRunner, tablePrefix }: MigrationContext): Promise<void> {
await queryRunner.query(`ALTER TABLE "${tablePrefix}user" DROP COLUMN otpsecret`);
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
import { getTablePrefix, logMigrationEnd, logMigrationStart } from '@db/utils/migrationHelpers';
import type { MigrationContext, ReversibleMigration } from '@db/types';

export class AddSaveRequestLog1681134145998 implements MigrationInterface {
export class AddSaveRequestLog1681134145998 implements ReversibleMigration {
name = 'AddSaveRequestLog1681134145998';

async up(queryRunner: QueryRunner): Promise<void> {
const tablePrefix = getTablePrefix();
logMigrationStart(this.name);

async up({ queryRunner, tablePrefix }: MigrationContext): Promise<void> {
await queryRunner.query(`
CREATE TABLE "${tablePrefix}save_request_log" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "userId" uuid NOT NULL, "request" jsonb DEFAULT '{}', "createdAt" TIMESTAMP NOT NULL DEFAULT ('now'::text)::timestamp(6) with time zone, "updatedAt" TIMESTAMP NOT NULL DEFAULT ('now'::text)::timestamp(6) with time zone, "workflowId" integer NOT NULL, "response" jsonb DEFAULT '{}', "status" VARCHAR(128) NOT NULL, CONSTRAINT "PK_a2a6978768567cd32a5d6cc2797" PRIMARY KEY ("id"))
`);
Expand All @@ -23,13 +19,9 @@ export class AddSaveRequestLog1681134145998 implements MigrationInterface {
ALTER TABLE "${tablePrefix}save_request_log" ADD CONSTRAINT "FK_9a3caef176a6bd386c9ca3b3799" FOREIGN KEY ("workflowId") REFERENCES "workflow_entity"("id") ON DELETE NO ACTION ON UPDATE NO action
`,
);

logMigrationEnd(this.name);
}

async down(queryRunner: QueryRunner): Promise<void> {
const tablePrefix = getTablePrefix();

async down({ queryRunner, tablePrefix }: MigrationContext): Promise<void> {
await queryRunner.query(
`ALTER TABLE "${tablePrefix}save_request_log" DROP CONSTRAINT "FK_9a3caef176a6bd386c9ca3b3799"`,
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
import type { MigrationContext, ReversibleMigration } from '@db/types';

export class addIncidentHandlingTables1689942863738 implements MigrationInterface {
export class addIncidentHandlingTables1689942863738 implements ReversibleMigration {
name = 'addIncidentHandlingTables1689942863738';

public async up(queryRunner: QueryRunner): Promise<void> {
public async up({ queryRunner, tablePrefix }: MigrationContext): Promise<void> {
await queryRunner.query(
`CREATE TABLE "server_incident" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "lastUpdateByAppUserId" character varying, "lastUpdateByZohoUserId" character varying, "lastUpdateSource" character varying, "createdAt" TIMESTAMP NOT NULL DEFAULT ('now'::text)::timestamp(6) with time zone, "updatedAt" TIMESTAMP NOT NULL DEFAULT ('now'::text)::timestamp(6) with time zone, "API" character varying, "APIMethod" character varying, "APIBody" json, "queueName" character varying, "errorMessage" character varying NOT NULL, "errorStackTrace" character varying, "incidentTime" TIMESTAMP NOT NULL, "additionalInformation" json, "zohoDeskTicketId" character varying, "correlationId" character varying, "isResolved" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_c24ae1e5263dccb981312915dfc" PRIMARY KEY ("id"))`,
);
Expand All @@ -15,7 +15,7 @@ export class addIncidentHandlingTables1689942863738 implements MigrationInterfac
);
}

public async down(queryRunner: QueryRunner): Promise<void> {
public async down({ queryRunner, tablePrefix }: MigrationContext): Promise<void> {
await queryRunner.query(`DROP TABLE "data_recovery_activity"`);
await queryRunner.query(`DROP TYPE "public"."data_recovery_activity_status_enum"`);
await queryRunner.query(`DROP TABLE "server_incident"`);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Service } from 'typedi';
import { DataSource, Repository } from 'typeorm';
import { DataSource, Repository } from '@n8n/typeorm';
import { SaveRequestLog } from '../entities/SaveRequestLog';

@Service()
Expand Down
6 changes: 3 additions & 3 deletions packages/cli/src/elitesoftwareautomation/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ export const createPostmanCollectionRequestsForWorkflowWebhooks = async (
},
{},
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(error: any, conversionResult) => {
(error: any, conversionResult: any) => {
if (!conversionResult.result) {
const message =
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
Expand All @@ -91,7 +91,7 @@ export const createPostmanCollectionRequestsForWorkflowWebhooks = async (
reject(new Error(message));
} else {
const foundCollection = conversionResult.output.find(
(collection) => collection.type === 'collection',
(collection: any) => collection.type === 'collection',
);
if (foundCollection) {
resolve(foundCollection.data);
Expand Down Expand Up @@ -174,7 +174,7 @@ export const createPostmanCollectionRequestsForWorkflowWebhooks = async (

if (collectionItems) {
// find it directly in the collection, i.e. not within folders
collectionRequestItemIndex = collectionItems.findIndex((requestItem) => {
collectionRequestItemIndex = collectionItems.findIndex((requestItem: any) => {
if ('request' in requestItem) {
const requestItemUrlData =
typeof requestItem.request?.url === 'string'
Expand Down
Loading

0 comments on commit b92c3dc

Please sign in to comment.