moahmedwafy commited on
Commit
b76416f
·
1 Parent(s): cf843e4

feat: seeder

Browse files
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
+ });