Spaces:
Running
Running
Commit
·
b76416f
1
Parent(s):
cf843e4
feat: seeder
Browse files- package.json +3 -1
- src/configs/database.ts +2 -1
- src/lib/decorators/swagger-controller.decorator.ts +0 -8
- src/seeder/helpers/db-store.ts +3 -0
- src/seeder/helpers/seeder-wrapper.ts +27 -0
- src/seeder/seed.ts +55 -0
- src/seeder/seeders/admins.seeder.ts +15 -0
package.json
CHANGED
@@ -7,7 +7,9 @@
|
|
7 |
"start": "build && node dist/index.js",
|
8 |
"start:dev": "ts-node-dev --files -r tsconfig-paths/register src/index.ts",
|
9 |
"build": "rimraf dist && tsc && tsc-alias",
|
10 |
-
"lint": "eslint . --ext .ts"
|
|
|
|
|
11 |
},
|
12 |
"author": "",
|
13 |
"license": "ISC",
|
|
|
7 |
"start": "build && node dist/index.js",
|
8 |
"start:dev": "ts-node-dev --files -r tsconfig-paths/register src/index.ts",
|
9 |
"build": "rimraf dist && tsc && tsc-alias",
|
10 |
+
"lint": "eslint . --ext .ts",
|
11 |
+
"seed": "ts-node-dev --files -r tsconfig-paths/register src/seeder/seed.ts",
|
12 |
+
"seed:reset": "ts-node --files -r tsconfig-paths/register src/seeder/seed.ts --reset"
|
13 |
},
|
14 |
"author": "",
|
15 |
"license": "ISC",
|
src/configs/database.ts
CHANGED
@@ -2,7 +2,8 @@ import mongoose from "mongoose";
|
|
2 |
import { config } from "./config";
|
3 |
|
4 |
export const connectDatabase = async () => {
|
5 |
-
return mongoose.connect(config.db.uri).then(() => {
|
6 |
console.log(`Connected to MongoDB database successfully!`);
|
|
|
7 |
});
|
8 |
};
|
|
|
2 |
import { config } from "./config";
|
3 |
|
4 |
export const connectDatabase = async () => {
|
5 |
+
return mongoose.connect(config.db.uri).then((o) => {
|
6 |
console.log(`Connected to MongoDB database successfully!`);
|
7 |
+
return o;
|
8 |
});
|
9 |
};
|
src/lib/decorators/swagger-controller.decorator.ts
DELETED
@@ -1,8 +0,0 @@
|
|
1 |
-
import { swaggerRegistry } from "@lib/swagger/swagger";
|
2 |
-
|
3 |
-
export const SwaggerController = (path: string) => {
|
4 |
-
return (target: any) => {
|
5 |
-
target = target.prototype.constructor.name;
|
6 |
-
swaggerRegistry.setControllerPrefix(target, path);
|
7 |
-
};
|
8 |
-
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
src/seeder/helpers/db-store.ts
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
export const dbStore = {
|
2 |
+
dbConnected: false,
|
3 |
+
};
|
src/seeder/helpers/seeder-wrapper.ts
ADDED
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { connectDatabase } from "@configs/database";
|
2 |
+
import { dbStore } from "./db-store";
|
3 |
+
|
4 |
+
export const seederWrapper =
|
5 |
+
(model, seederFunction: () => Promise<void>) => async () => {
|
6 |
+
// get cli arguments
|
7 |
+
const args = process.argv.slice(2);
|
8 |
+
|
9 |
+
// check if reset flag is passed
|
10 |
+
const resetFlag = args.includes("--reset");
|
11 |
+
|
12 |
+
// connect to database
|
13 |
+
if (!dbStore.dbConnected) {
|
14 |
+
await connectDatabase();
|
15 |
+
dbStore.dbConnected = true;
|
16 |
+
}
|
17 |
+
|
18 |
+
// clear the collection
|
19 |
+
if (resetFlag) {
|
20 |
+
console.log(`Clearing collection: ${model.collection.collectionName}`);
|
21 |
+
await model.deleteMany({});
|
22 |
+
console.log(`Collection ${model.collection.collectionName} cleared!`);
|
23 |
+
}
|
24 |
+
|
25 |
+
// run the seeder
|
26 |
+
return seederFunction();
|
27 |
+
};
|
src/seeder/seed.ts
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
// mongoose seeder script
|
2 |
+
// takes an optional cli argument "--reset" to reset the database
|
3 |
+
//
|
4 |
+
// Usage:
|
5 |
+
// npm run seed
|
6 |
+
// npm run seed:reset
|
7 |
+
// node src/seeder/seed.ts
|
8 |
+
// node src/seeder/seed.ts --reset
|
9 |
+
|
10 |
+
import * as glob from "glob";
|
11 |
+
import path from "path";
|
12 |
+
|
13 |
+
const main = async () => {
|
14 |
+
// get cli arguments
|
15 |
+
const args = process.argv.slice(2);
|
16 |
+
|
17 |
+
// get cli names that don't start with "--"
|
18 |
+
const seederNames = args.filter((arg) => !arg.startsWith("--"));
|
19 |
+
|
20 |
+
// list all files under ./seeders
|
21 |
+
const seedersPath = path
|
22 |
+
.relative(process.cwd(), path.join(__dirname, "**/*.seeder.{ts,js}"))
|
23 |
+
.replace(/\\/g, "/");
|
24 |
+
|
25 |
+
const seedersFiles = glob
|
26 |
+
.sync(seedersPath, {})
|
27 |
+
.map((file) => {
|
28 |
+
return path.resolve(file);
|
29 |
+
})
|
30 |
+
.filter((file) => {
|
31 |
+
if (seederNames.length === 0) {
|
32 |
+
return true;
|
33 |
+
}
|
34 |
+
|
35 |
+
return seederNames.includes(path.basename(file));
|
36 |
+
});
|
37 |
+
|
38 |
+
// run all seeders
|
39 |
+
let count = 0;
|
40 |
+
for await (const file of seedersFiles) {
|
41 |
+
const baseName = path.basename(file);
|
42 |
+
console.log(`Running ${baseName} ...`);
|
43 |
+
const seeder = await import(file);
|
44 |
+
await seeder.default();
|
45 |
+
console.log(`${baseName} completed! (${++count}/${seedersFiles.length})`);
|
46 |
+
}
|
47 |
+
|
48 |
+
console.log("All seeders completed!");
|
49 |
+
process.exit(0);
|
50 |
+
};
|
51 |
+
|
52 |
+
main().catch((err) => {
|
53 |
+
console.error(err);
|
54 |
+
process.exit(1);
|
55 |
+
});
|
src/seeder/seeders/admins.seeder.ts
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { Role } from "@common/enums/role.enum";
|
2 |
+
import { Admin } from "modules/console/common/models/admin.model";
|
3 |
+
import { seederWrapper } from "seeder/helpers/seeder-wrapper";
|
4 |
+
|
5 |
+
export default seederWrapper(Admin, async () => {
|
6 |
+
// create super admin
|
7 |
+
await Admin.create({
|
8 |
+
email: "[email protected]",
|
9 |
+
password: "super",
|
10 |
+
role: Role.SUPER_ADMIN,
|
11 |
+
gender: "M1 Abrams Tank",
|
12 |
+
name: "Super Admin",
|
13 |
+
dob: new Date(),
|
14 |
+
});
|
15 |
+
});
|