diff --git a/packages/cli/commands/user-management/reset.ts b/packages/cli/commands/user-management/reset.ts new file mode 100644 index 0000000000000..7b2084a720c0f --- /dev/null +++ b/packages/cli/commands/user-management/reset.ts @@ -0,0 +1,80 @@ +/* eslint-disable no-console */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + +import Command from '@oclif/command'; +import { Not } from 'typeorm'; +import { LoggerProxy } from 'n8n-workflow'; +import { Db } from '../../src'; +import { User } from '../../src/databases/entities/User'; +import { getLogger } from '../../src/Logger'; + +export class Reset extends Command { + static description = '\nResets the database to the default user state'; + + private defaultUserProps = { + firstName: 'default', + lastName: 'default', + email: null, + password: null, + resetPasswordToken: null, + }; + + async run(): Promise { + const logger = getLogger(); + LoggerProxy.init(logger); + await Db.init(); + + try { + const owner = await this.getInstanceOwner(); + + const ownerWorkflowRole = await Db.collections.Role!.findOneOrFail({ + name: 'owner', + scope: 'workflow', + }); + + const ownerCredentialRole = await Db.collections.Role!.findOneOrFail({ + name: 'owner', + scope: 'credential', + }); + + await Db.collections.SharedWorkflow!.update( + { user: Not(owner) }, + { user: { ...owner, globalRole: ownerWorkflowRole } }, + ); + + await Db.collections.SharedCredentials!.update( + { user: Not(owner) }, + { user: { ...owner, globalRole: ownerCredentialRole } }, + ); + + await Db.collections.User!.delete({ id: Not(owner.id) }); + await Db.collections.User!.save(Object.assign(owner, this.defaultUserProps)); + + await Db.collections.Settings!.update({ key: 'userManagement.hasOwner' }, { value: 'false' }); + } catch (error) { + console.error('Error resetting database. See log messages for details.'); + if (error instanceof Error) logger.error(error.message); + this.exit(1); + } + + console.info('Successfully reset the database to default user state.'); + this.exit(); + } + + private async getInstanceOwner(): Promise { + const globalRole = await Db.collections.Role!.findOneOrFail({ + name: 'owner', + scope: 'global', + }); + + const owner = await Db.collections.User!.findOne({ globalRole }); + + if (owner) return owner; + + const user = new User(); + + await Db.collections.User!.save(Object.assign(user, { ...this.defaultUserProps, globalRole })); + + return Db.collections.User!.findOneOrFail({ globalRole }); + } +} diff --git a/packages/nodes-base/package.json b/packages/nodes-base/package.json index ac787b601a93d..599b8da1f4012 100644 --- a/packages/nodes-base/package.json +++ b/packages/nodes-base/package.json @@ -698,7 +698,7 @@ "basic-auth": "^2.0.1", "change-case": "^4.1.1", "cheerio": "1.0.0-rc.6", - "chokidar": "^3.5.2", + "chokidar": "3.5.2", "cron": "~1.7.2", "eventsource": "^1.0.7", "fast-glob": "^3.2.5",