diff --git a/package.json b/package.json index 162bc90..861cb00 100644 --- a/package.json +++ b/package.json @@ -5,10 +5,12 @@ "build": "tsc", "start": "node dist/index.js", "dev": "nodemon src/index.ts", - "test": "jest" + "test": "jest", + "import": "nodemon src/name-loader-program.ts" }, "dependencies": { "body-parser": "^1.20.3", + "csv-parse": "^5.6.0", "dotenv": "^16.4.5", "express": "^4.20.0", "express-rate-limit": "^7.4.0", diff --git a/sample.csv b/sample.csv new file mode 100644 index 0000000..9a0ddb3 --- /dev/null +++ b/sample.csv @@ -0,0 +1,2 @@ +username,name +berviantoleo,Bervianto Leo Pratama \ No newline at end of file diff --git a/src/helper/name-loader.ts b/src/helper/name-loader.ts new file mode 100644 index 0000000..b8aa222 --- /dev/null +++ b/src/helper/name-loader.ts @@ -0,0 +1,37 @@ +import fs from 'fs'; +import { parse } from 'csv-parse/sync'; +import mongoose from 'mongoose'; +import dotenv from 'dotenv'; +import logger from '../logger'; +import name from '../models/name'; + +dotenv.config(); + +async function loadData() { + const readSample = fs.readFileSync('sample.csv'); + const records = parse(readSample, { + columns: true, + }); + if (Array.isArray(records)) { + for (const record of records) { + logger.info(`Load: ${JSON.stringify(record)}`); + const result = await name.findOneAndUpdate({username: record.username}, { + username: record.username, + name: record.name, + createdAt: Date.now() + }, { + upsert: true, + returnNewDocument: true + }); + logger.info(`Saved: ${result?._id}. Result: ${JSON.stringify(result)}`); + } + } +} + +async function startLoader() { + await mongoose.connect(process.env.MONGO_CONNECTION_STRING || ''); + logger.info("MongoDB Connected!"); + await loadData(); +} + +export default startLoader; diff --git a/src/name-loader-program.ts b/src/name-loader-program.ts new file mode 100644 index 0000000..39bbac6 --- /dev/null +++ b/src/name-loader-program.ts @@ -0,0 +1,2 @@ +import nameLoader from './helper/name-loader'; +nameLoader(); \ No newline at end of file diff --git a/test/invitation.spec.ts b/test/invitation.spec.ts index 8dd2911..fc66d7f 100644 --- a/test/invitation.spec.ts +++ b/test/invitation.spec.ts @@ -15,15 +15,15 @@ describe("Test the invitation path", () => { }); }); - beforeEach(async () => { - await Invitation.deleteMany(); - }) - afterAll(async () => { - await Name.deleteMany(); + await Name.deleteMany({}); await mongoose.disconnect(); }); + afterEach(async () => { + await Invitation.deleteMany({}); + }) + test("It should response the GET method", async () => { let dateNow = Date.now(); let objectItem = { diff --git a/test/name.spec.ts b/test/name.spec.ts index 0c34a22..4092cc5 100644 --- a/test/name.spec.ts +++ b/test/name.spec.ts @@ -15,15 +15,19 @@ describe("Test the name path", () => { test("It should response the GET method", async () => { let dateNow = Date.now(); const objectItem = { - username: 'berviantoleo', + username: 'berviantoleo-test', name: 'Bervianto', createdAt: dateNow }; await Name.create(objectItem); - const response = await request(app).get("/name/berviantoleo"); + const response = await request(app).get("/name/berviantoleo-test"); expect(response.statusCode).toBe(200); expect(response.body.username).toBe(objectItem.username); expect(response.body.name).toBe(objectItem.name); expect(response.body.createdAt).toBe(new Date(objectItem.createdAt).toISOString()); }); + + afterEach(async () => { + await Name.deleteMany({}); + }) }); \ No newline at end of file diff --git a/test/nameloader.spec.ts b/test/nameloader.spec.ts new file mode 100644 index 0000000..726b56d --- /dev/null +++ b/test/nameloader.spec.ts @@ -0,0 +1,17 @@ +import loader from '../src/helper/name-loader'; +import app from "../src/app"; +import Name from "../src/models/name"; + +describe("Test the name path", () => { + test("Should load correctly", async () => { + await loader(); + + const successLoad = await Name.findOne({username: 'berviantoleo'}); + expect(successLoad?._id).not.toBeNull(); + expect(successLoad?.name).toBe('Bervianto Leo Pratama'); + }); + + afterEach(async () => { + await Name.deleteMany({}); + }) +}); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 6533f96..eeffbe2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2823,6 +2823,13 @@ __metadata: languageName: node linkType: hard +"csv-parse@npm:^5.6.0": + version: 5.6.0 + resolution: "csv-parse@npm:5.6.0" + checksum: 10c0/52f5e6c45359902e0c8e57fc2eeed41366dc6b6d283b495b538dd50c8e8510413d6f924096ea056319cbbb8ed26e111c3a3485d7985c021bcf5abaa9e92425c7 + languageName: node + linkType: hard + "debug@npm:2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -3667,6 +3674,7 @@ __metadata: "@types/node": "npm:^22.2.0" "@types/supertest": "npm:^6.0.2" body-parser: "npm:^1.20.3" + csv-parse: "npm:^5.6.0" dotenv: "npm:^16.4.5" express: "npm:^4.20.0" express-rate-limit: "npm:^7.4.0"