Skip to content

Commit

Permalink
Create reset command for user management (#2698)
Browse files Browse the repository at this point in the history
* ✨ Create reset command

* 📌 Pin chokidar version

* ⚡ Set default user name per migration

* ⚡ Create owner if empty users table

* 👕 Remove some lint exceptions

* 🐛 Set role for reassigned workflows and creds

* ✏️ Add success message

* ⚡ Add access modifiers
  • Loading branch information
ivov authored Jan 19, 2022
1 parent d625fae commit 71c5c02
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 1 deletion.
80 changes: 80 additions & 0 deletions packages/cli/commands/user-management/reset.ts
Original file line number Diff line number Diff line change
@@ -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<void> {
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<User> {
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 });
}
}
2 changes: 1 addition & 1 deletion packages/nodes-base/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down

0 comments on commit 71c5c02

Please sign in to comment.