From 31c705d4448e42463c3ae5c7856ebe2db41a1e50 Mon Sep 17 00:00:00 2001 From: Jisu Date: Mon, 17 Apr 2023 20:11:16 +0900 Subject: [PATCH 1/6] :green_heart: chore: Add auth seeding files #91 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - auth 시딩파일 설정 - `yarn seed` 으로 시딩 - `yarn seed:reset` 으로 시딩할 디비 리셋 --- backend/.eslintrc.js | 2 +- backend/package.json | 7 +- backend/seeding/data-source.ts | 31 +++++++ backend/seeding/factory/auth.factory.ts | 16 ++++ backend/seeding/reset-db.sh | 7 ++ backend/seeding/seeder/auth.seeder.ts | 27 ++++++ backend/src/common/README.md | 3 - backend/yarn.lock | 117 +++++++++++++++++++++++- 8 files changed, 203 insertions(+), 7 deletions(-) create mode 100644 backend/seeding/data-source.ts create mode 100644 backend/seeding/factory/auth.factory.ts create mode 100755 backend/seeding/reset-db.sh create mode 100644 backend/seeding/seeder/auth.seeder.ts delete mode 100644 backend/src/common/README.md diff --git a/backend/.eslintrc.js b/backend/.eslintrc.js index 92f2eaf2..1561ab20 100644 --- a/backend/.eslintrc.js +++ b/backend/.eslintrc.js @@ -12,7 +12,7 @@ module.exports = { node: true, jest: true, }, - ignorePatterns: ['.eslintrc.js'], + ignorePatterns: ['.eslintrc.js', 'seeding/'], rules: { '@typescript-eslint/interface-name-prefix': 'off', '@typescript-eslint/explicit-function-return-type': 'off', diff --git a/backend/package.json b/backend/package.json index b4da8db7..f7e44df3 100644 --- a/backend/package.json +++ b/backend/package.json @@ -21,7 +21,9 @@ "db": "docker compose --env-file .env -f ../docker-compose.yml up -d", "db:down": "docker compose --env-file .env -f ../docker-compose.yml down", "db:reset": "docker compose --env-file .env -f ../docker-compose.yml down -v", - "postinstall": "if [ ! -d .husky/_ ]; then cd .. && husky install backend/.husky; fi" + "postinstall": "if [ ! -d .husky/_ ]; then cd .. && husky install backend/.husky; fi", + "seed": "npx ts-node ./seeding/data-source.ts", + "seed:reset": "./seeding/reset-db.sh" }, "dependencies": { "@hapi/joi": "^17.1.1", @@ -43,10 +45,12 @@ "typeorm-naming-strategies": "^4.1.0" }, "devDependencies": { + "@faker-js/faker": "^7.6.0", "@nestjs/cli": "^9.0.0", "@nestjs/schematics": "^9.0.0", "@nestjs/testing": "^9.4.0", "@types/express": "^4.17.13", + "@types/faker": "^6.6.9", "@types/hapi__joi": "^17.1.9", "@types/jest": "29.2.4", "@types/node": "18.11.18", @@ -67,6 +71,7 @@ "ts-loader": "^9.2.3", "ts-node": "^10.0.0", "tsconfig-paths": "4.1.1", + "typeorm-extension": "^2.7.0", "typescript": "^4.7.4" }, "jest": { diff --git a/backend/seeding/data-source.ts b/backend/seeding/data-source.ts new file mode 100644 index 00000000..1f7fb17f --- /dev/null +++ b/backend/seeding/data-source.ts @@ -0,0 +1,31 @@ +//import dotenv +import { config } from 'dotenv'; + +import { DataSource, DataSourceOptions } from 'typeorm'; +import { runSeeders, SeederOptions } from 'typeorm-extension'; +import { Auth } from '../src/entity/auth.entity'; +import AuthSeeder from './seeder/auth.seeder'; +import AuthFactory from './factory/auth.factory'; + +config(); + +(async () => { + const options: DataSourceOptions & SeederOptions = { + type: 'postgres', + host: process.env.DB_HOST, + port: Number(process.env.DB_PORT), + database: 'testdb', + username: process.env.DB_USER, + password: process.env.DB_PASSWORD, + synchronize: true, + entities: [Auth], + seeds: [AuthSeeder], + factories: [AuthFactory], + }; + console.log('options: ', options); + + const dataSource = new DataSource(options); + await dataSource.initialize(); + + await runSeeders(dataSource); +})(); diff --git a/backend/seeding/factory/auth.factory.ts b/backend/seeding/factory/auth.factory.ts new file mode 100644 index 00000000..79834bf5 --- /dev/null +++ b/backend/seeding/factory/auth.factory.ts @@ -0,0 +1,16 @@ +// file name should be .factory.ts + +import { Faker } from '@faker-js/faker'; +import { Auth, AuthStatus } from '../../src/entity/auth.entity'; +import { setSeederFactory } from 'typeorm-extension'; + +export default setSeederFactory(Auth, (faker: Faker) => { + const auth = new Auth(); + + //auth.id is auto generated + //auth.status = faker.datatype.boolean() ? AuthStatus.REGISTERD : AuthStatus.UNREGISTERD; + auth.status = AuthStatus.REGISTERD; + auth.email = faker.internet.email(); + + return auth; +}); diff --git a/backend/seeding/reset-db.sh b/backend/seeding/reset-db.sh new file mode 100755 index 00000000..9eca7ef1 --- /dev/null +++ b/backend/seeding/reset-db.sh @@ -0,0 +1,7 @@ +#!/bin/bash +DB=$1; +if [ $1 -z ] ; then + echo "Please provide a database name"; + read -p "Database name: " DB; +fi +dropdb $DB 2>/dev/null; createdb $DB; diff --git a/backend/seeding/seeder/auth.seeder.ts b/backend/seeding/seeder/auth.seeder.ts new file mode 100644 index 00000000..bd1630b9 --- /dev/null +++ b/backend/seeding/seeder/auth.seeder.ts @@ -0,0 +1,27 @@ +import { DataSource, MoreThan, Repository } from 'typeorm'; +import { Seeder, SeederFactoryManager } from 'typeorm-extension'; + +import { Auth } from '../../src/entity/auth.entity'; + +export default class AuthSeeder implements Seeder { + public async run(dataSource: DataSource, factoryManager: SeederFactoryManager) { + const repository: Repository = dataSource.getRepository(Auth); + repository.delete({ id: MoreThan(0) }); + //await repository.insert([ + // { + // firstName: 'Caleb', + // lastName: 'Barrows', + // email: 'caleb.barrows@gmail.com', + // }, + //]); + + // --------------------------------------------------- + + const authFactory = await factoryManager.get(Auth); + // save 1 factory generated entity, to the database + //await authFactory.save(); + + // save 5 factory generated entities, to the database + await authFactory.saveMany(1000); + } +} diff --git a/backend/src/common/README.md b/backend/src/common/README.md deleted file mode 100644 index b4f80224..00000000 --- a/backend/src/common/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Common - -Common utilities like guards, pipes, decorators, etc. diff --git a/backend/yarn.lock b/backend/yarn.lock index f6b9dc61..0fb0e9f3 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -377,6 +377,11 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.37.0.tgz#cf1b5fa24217fe007f6487a26d765274925efa7d" integrity sha512-x5vzdtOOGgFVDCUs81QRB2+liax8rFg3+7hqM+QhBG0/G3F1ZsoYl97UrqgHgQ9KKT7G6c4V+aTUCgu/n22v1A== +"@faker-js/faker@^7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-7.6.0.tgz#9ea331766084288634a9247fcd8b84f16ff4ba07" + integrity sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw== + "@hapi/address@^4.0.1": version "4.1.0" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-4.1.0.tgz#d60c5c0d930e77456fdcde2598e77302e2955e1d" @@ -1011,6 +1016,13 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/faker@^6.6.9": + version "6.6.9" + resolved "https://registry.yarnpkg.com/@types/faker/-/faker-6.6.9.tgz#1064e7c46be58388fa326e2f918a4f02ab740a7a" + integrity sha512-Y9YYm5L//8ooiiknO++4Gr539zzdI0j3aXnOBjo1Vk+kTvffY10GuE2wn78AFPECwZ5MYGTjiDVw1naLLdDimw== + dependencies: + faker "*" + "@types/graceful-fs@^4.1.3": version "4.1.6" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" @@ -2210,6 +2222,11 @@ depd@2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +destr@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/destr/-/destr-1.2.2.tgz#7ba9befcafb645a50e76b260449c63927b51e22f" + integrity sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA== + destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -2274,6 +2291,13 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== +ebec@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ebec/-/ebec-1.0.0.tgz#e05c067818688a29ff359f138d43b4f5786b7f4f" + integrity sha512-tPS/jSTrzChdC/EkxGcHRHvLZYnEbEepqvnOr8PnwsHlOpoKsQbQv8VZf6NmdR1AXyj+6suiq+1AoOXrKtKkTw== + dependencies: + smob "^1.0.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -2723,6 +2747,11 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" +faker@*: + version "6.6.6" + resolved "https://registry.yarnpkg.com/faker/-/faker-6.6.6.tgz#e9529da0109dca4c7c5dbfeaadbd9234af943033" + integrity sha512-9tCqYEDHI5RYFQigXFwF1hnCwcWCOJl/hmll0lr5D2Ljjb0o4wphb69wikeJDz5qCEzXCoPvG6ss5SDP6IfOdg== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -2831,6 +2860,11 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^3.1.0: version "3.2.7" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" @@ -3030,6 +3064,16 @@ glob@^9.2.0: minipass "^4.2.4" path-scurry "^1.6.1" +glob@^9.3.2: + version "9.3.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -3885,6 +3929,11 @@ jest@29.3.1: import-local "^3.0.2" jest-cli "^29.3.1" +jiti@^1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd" + integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== + js-sdsl@^4.1.4: version "4.4.0" resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" @@ -4046,6 +4095,17 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +locter@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/locter/-/locter-1.1.0.tgz#b66f650945ebe7f54704e068e3b59750620e1805" + integrity sha512-dZD6T3CSeVtJ+37ZArPtk/QROvwpZAfydBDP5qDpITBPoAd3EBm/SKPmzkSRiHhkZbvB2BrW0kj/QglYXVT4Zw== + dependencies: + destr "^1.2.2" + ebec "^1.0.0" + flat "^5.0.2" + glob "^9.3.2" + jiti "^1.18.2" + lodash.memoize@4.x: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -4079,6 +4139,13 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4306,6 +4373,14 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + node-abort-controller@^3.0.1: version "3.1.1" resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" @@ -4540,6 +4615,14 @@ parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -4801,6 +4884,13 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== +rapiq@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rapiq/-/rapiq-0.8.0.tgz#f9eee0bf5bf41b92916750cc6b066c0928a8c2b9" + integrity sha512-qAWUHJP++IDKE9ul9mwXoix45a6Hne3wDiqTd7BhoRNVOQv2gQvAlCOWCQCNTbQA/Ia9jW5ugcOmbd4eRGklSQ== + dependencies: + smob "^0.1.0" + raw-body@2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" @@ -5154,6 +5244,16 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" +smob@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/smob/-/smob-0.1.0.tgz#d61b307208d2510b3faf98c166ffe4e9e94f17a2" + integrity sha512-u6ezVF7hN3AxA1onkbMsl46XZr1HYrtMksmckSVpkLI8bYJ5I34kHMvDZk8qNCfA0y54VnhWqCoU6DQMMStzpw== + +smob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/smob/-/smob-1.0.0.tgz#f4e7df1292dce83981ffc651b49a7823c4a4f77c" + integrity sha512-fnePEPpgGjAdBDk0nV7L9jcStbbcUsKS5TC+RYambCSU9Dm1k2rqDivdg5LBRVWF/NXe0Rq8yfnKKQI08kSXIg== + socket.io-adapter@~2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz#5de9477c9182fdc171cd8c8364b9a8894ec75d12" @@ -5592,7 +5692,7 @@ tsconfig-paths@^4.1.2: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@2.5.0, tslib@^2.1.0, tslib@^2.5.0: +tslib@2.5.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== @@ -5653,6 +5753,19 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +typeorm-extension@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/typeorm-extension/-/typeorm-extension-2.7.0.tgz#066c2307b0a6ec1acd01e32fd3fc82229322b78f" + integrity sha512-ef5x+F635ztLE/4Li1yCCwyf+G6MeHBhIQVNqbgDL20FQpCly0rpq9itrohCxbpu5diLFcYkdZ+8lGkHZqnxBg== + dependencies: + "@faker-js/faker" "^7.6.0" + locter "^1.1.0" + pascal-case "^3.1.2" + rapiq "^0.8.0" + reflect-metadata "^0.1.13" + smob "^1.0.0" + yargs "^17.7.1" + typeorm-naming-strategies@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/typeorm-naming-strategies/-/typeorm-naming-strategies-4.1.0.tgz#1ec6eb296c8d7b69bb06764d5b9083ff80e814a9" @@ -5991,7 +6104,7 @@ yargs@^16.0.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.3.1, yargs@^17.6.2: +yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.1: version "17.7.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== From 917a004d117f233d1c77dd028db01f00b1963354 Mon Sep 17 00:00:00 2001 From: Jisu Date: Tue, 18 Apr 2023 17:41:03 +0900 Subject: [PATCH 2/6] :green_heart: chore: Add user and friend factory #91 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - user, friend factory 추가 - typeorm-extension 안쓰는 방법으로 refactoring --- backend/.gitignore | 3 + backend/seeding/data-source.ts | 30 +++++++--- backend/seeding/factory/auth.factory.ts | 16 ++--- .../seeding/factory/frieindship.factory.ts | 13 +++++ backend/seeding/factory/message.factory.ts | 12 ++++ backend/seeding/factory/user.factory.ts | 13 +++++ backend/seeding/reset-db.sh | 3 +- backend/seeding/seeder/auth-user.seeder.ts | 58 +++++++++++++++++++ backend/seeding/seeder/auth.seeder.ts | 27 --------- 9 files changed, 127 insertions(+), 48 deletions(-) create mode 100644 backend/seeding/factory/frieindship.factory.ts create mode 100644 backend/seeding/factory/message.factory.ts create mode 100644 backend/seeding/factory/user.factory.ts create mode 100644 backend/seeding/seeder/auth-user.seeder.ts delete mode 100644 backend/seeding/seeder/auth.seeder.ts diff --git a/backend/.gitignore b/backend/.gitignore index 4e52f69b..ea0f5969 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -1,6 +1,9 @@ # env files .env +# seeding result +/seeding/results + # compiled output /dist /node_modules diff --git a/backend/seeding/data-source.ts b/backend/seeding/data-source.ts index 1f7fb17f..296ac515 100644 --- a/backend/seeding/data-source.ts +++ b/backend/seeding/data-source.ts @@ -2,15 +2,29 @@ import { config } from 'dotenv'; import { DataSource, DataSourceOptions } from 'typeorm'; -import { runSeeders, SeederOptions } from 'typeorm-extension'; +import seeder from './seeder/auth-user.seeder'; +//import { runSeeders, SeederOptions } from 'typeorm-extension'; +import * as path from 'path'; + import { Auth } from '../src/entity/auth.entity'; -import AuthSeeder from './seeder/auth.seeder'; -import AuthFactory from './factory/auth.factory'; +import { User } from '../src/entity/user.entity'; +import { Friendship } from '../src/entity/friendship.entity'; +import { Message } from '../src/entity/message.entity'; +import { MessageView } from '../src/entity/message-view.entity'; +import { UserRecord } from '../src/entity/user-record.entity'; +import { GameHistory } from '../src/entity/game-history.entity'; +import { BlockedUser } from '../src/entity/blocked-user.entity'; +import { Achievement } from '../src/entity/achievement.entity'; +import { SnakeNamingStrategy } from 'typeorm-naming-strategies'; config(); (async () => { - const options: DataSourceOptions & SeederOptions = { + if (process.argv[2] === undefined) { + console.log('Please enter the number of auths to be created.'); + } + + const options: DataSourceOptions = { type: 'postgres', host: process.env.DB_HOST, port: Number(process.env.DB_PORT), @@ -18,14 +32,12 @@ config(); username: process.env.DB_USER, password: process.env.DB_PASSWORD, synchronize: true, - entities: [Auth], - seeds: [AuthSeeder], - factories: [AuthFactory], + entities: [Auth, User, Friendship /*Message, MessageView, UserRecord, GameHistory, BlockedUser, Achievement*/], + namingStrategy: new SnakeNamingStrategy(), }; - console.log('options: ', options); const dataSource = new DataSource(options); await dataSource.initialize(); - await runSeeders(dataSource); + await seeder(dataSource); })(); diff --git a/backend/seeding/factory/auth.factory.ts b/backend/seeding/factory/auth.factory.ts index 79834bf5..67338087 100644 --- a/backend/seeding/factory/auth.factory.ts +++ b/backend/seeding/factory/auth.factory.ts @@ -1,16 +1,10 @@ // file name should be .factory.ts -import { Faker } from '@faker-js/faker'; -import { Auth, AuthStatus } from '../../src/entity/auth.entity'; -import { setSeederFactory } from 'typeorm-extension'; - -export default setSeederFactory(Auth, (faker: Faker) => { - const auth = new Auth(); +import { faker } from '@faker-js/faker'; +import { AuthStatus } from '../../src/entity/auth.entity'; +export default () => ({ //auth.id is auto generated - //auth.status = faker.datatype.boolean() ? AuthStatus.REGISTERD : AuthStatus.UNREGISTERD; - auth.status = AuthStatus.REGISTERD; - auth.email = faker.internet.email(); - - return auth; + status: faker.datatype.boolean() && faker.datatype.boolean() ? AuthStatus.UNREGISTERD : AuthStatus.REGISTERD, + email: faker.internet.email(), }); diff --git a/backend/seeding/factory/frieindship.factory.ts b/backend/seeding/factory/frieindship.factory.ts new file mode 100644 index 00000000..4d3089d3 --- /dev/null +++ b/backend/seeding/factory/frieindship.factory.ts @@ -0,0 +1,13 @@ +// file name should be .factory.ts + +import { faker } from '@faker-js/faker'; +import { User } from '../../src/entity/user.entity'; + +export default (user1: User, user2: User) => { + return { + sender: user1, + receiver: user2, + accept: faker.datatype.boolean(), + lastMessegeTime: faker.datatype.boolean() ? faker.date.past() : undefined, + }; +}; diff --git a/backend/seeding/factory/message.factory.ts b/backend/seeding/factory/message.factory.ts new file mode 100644 index 00000000..01ac6d5e --- /dev/null +++ b/backend/seeding/factory/message.factory.ts @@ -0,0 +1,12 @@ +// file name should be .factory.ts + +import { faker } from '@faker-js/faker'; +import { Friendship } from '../../src/entity/friendship.entity'; + +export default (friendship: Friendship) => { + return { + sender: faker.datatype.boolean() ? friendship.sender : friendship.receiver, + friend: friendship, + contents: faker.lorem.sentence(), + }; +}; diff --git a/backend/seeding/factory/user.factory.ts b/backend/seeding/factory/user.factory.ts new file mode 100644 index 00000000..7ebd20e2 --- /dev/null +++ b/backend/seeding/factory/user.factory.ts @@ -0,0 +1,13 @@ +// file name should be .factory.ts + +import { faker } from '@faker-js/faker'; +import { Auth } from '../../src/entity/auth.entity'; + +export default (auth: Auth) => { + return { + id: auth.id, + nickname: faker.helpers.unique(faker.word.noun, [{ length: { min: 3, max: 8 } }]), + exp: faker.datatype.number(100000), + image: faker.image.imageUrl(), + }; +}; diff --git a/backend/seeding/reset-db.sh b/backend/seeding/reset-db.sh index 9eca7ef1..88b1058c 100755 --- a/backend/seeding/reset-db.sh +++ b/backend/seeding/reset-db.sh @@ -1,7 +1,8 @@ #!/bin/bash DB=$1; -if [ $1 -z ] ; then +if [ -z $1 ] ; then echo "Please provide a database name"; read -p "Database name: " DB; fi dropdb $DB 2>/dev/null; createdb $DB; +rm -rf seeding/results; diff --git a/backend/seeding/seeder/auth-user.seeder.ts b/backend/seeding/seeder/auth-user.seeder.ts new file mode 100644 index 00000000..075adc3a --- /dev/null +++ b/backend/seeding/seeder/auth-user.seeder.ts @@ -0,0 +1,58 @@ +import { DataSource, Repository } from 'typeorm'; +import * as fs from 'fs'; + +import { Auth } from '../../src/entity/auth.entity'; +import { User } from '../../src/entity/user.entity'; +import authFactory from '../factory/auth.factory'; +import userFactory from '../factory/user.factory'; +import { Friendship } from '../../src/entity/friendship.entity'; +import * as path from 'path'; + +import frieindshipFactory from '../factory/frieindship.factory'; + +export default async (dataSource: DataSource) => { + const resultDir = path.join(__dirname, '../results'); + + const authRepository: Repository = dataSource.getRepository(Auth); + const auths = await authRepository.save(Array(Number(process.argv[2])).fill(null).map(authFactory)); + //const auths = await factoryManager.get(Auth).saveMany(Number(process.argv[2])); + console.log('auth ' + auths.length + ' rows created.'); + fs.mkdir(resultDir, () => { + fs.writeFile(path.join(resultDir, 'auths.json'), JSON.stringify(auths), (err) => { + if (err) throw err; + console.log('created auth information has been saved to results/auths.json\n'); + }); + }); + + // generate user + const userRepository = dataSource.getRepository(User); + const users = await userRepository.save(auths.filter((auth) => auth.status === 'REGISTERD').map(userFactory)); + console.log('user ' + users.length + ' rows created.'); + + fs.writeFile(path.join(resultDir, 'users.json'), JSON.stringify(users), (err) => { + if (err) throw err; + console.log('created user information has been saved to seeding/results/users.json'); + }); + + //generate friendship + // 1/2 확률로 친구관계 생기게, 그 중 1/2 확률로 accept. + const friendsSeed = []; + for (let i: number = 0; i < users.length; i++) { + for (let j: number = i + 1; j < users.length; j++) { + Math.random() <= 0.1 && friendsSeed.push(frieindshipFactory(users[i], users[j])); + } + } + + const friendshipRepository = dataSource.getRepository(Friendship); + const friends = await friendshipRepository.save(friendsSeed); + console.log('friendship ' + friends.length + ' rows created.'); + + fs.writeFile(path.join(resultDir, 'friends.json'), JSON.stringify(friends), (err) => { + if (err) throw err; + console.log('created friendship information has been saved to seeding/results/friends.json'); + }); + + //generate message + + dataSource.destroy(); +}; diff --git a/backend/seeding/seeder/auth.seeder.ts b/backend/seeding/seeder/auth.seeder.ts deleted file mode 100644 index bd1630b9..00000000 --- a/backend/seeding/seeder/auth.seeder.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { DataSource, MoreThan, Repository } from 'typeorm'; -import { Seeder, SeederFactoryManager } from 'typeorm-extension'; - -import { Auth } from '../../src/entity/auth.entity'; - -export default class AuthSeeder implements Seeder { - public async run(dataSource: DataSource, factoryManager: SeederFactoryManager) { - const repository: Repository = dataSource.getRepository(Auth); - repository.delete({ id: MoreThan(0) }); - //await repository.insert([ - // { - // firstName: 'Caleb', - // lastName: 'Barrows', - // email: 'caleb.barrows@gmail.com', - // }, - //]); - - // --------------------------------------------------- - - const authFactory = await factoryManager.get(Auth); - // save 1 factory generated entity, to the database - //await authFactory.save(); - - // save 5 factory generated entities, to the database - await authFactory.saveMany(1000); - } -} From b613fa311ead1ecac6936c6d732eebd832a85db3 Mon Sep 17 00:00:00 2001 From: Jisu Date: Tue, 18 Apr 2023 18:40:43 +0900 Subject: [PATCH 3/6] :green_heart: chore: Remove typeorm-extension package --- backend/package.json | 1 - backend/yarn.lock | 100 +------------------------------------------ 2 files changed, 2 insertions(+), 99 deletions(-) diff --git a/backend/package.json b/backend/package.json index f7e44df3..6fdcb234 100644 --- a/backend/package.json +++ b/backend/package.json @@ -71,7 +71,6 @@ "ts-loader": "^9.2.3", "ts-node": "^10.0.0", "tsconfig-paths": "4.1.1", - "typeorm-extension": "^2.7.0", "typescript": "^4.7.4" }, "jest": { diff --git a/backend/yarn.lock b/backend/yarn.lock index 0fb0e9f3..49a16fb0 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -2222,11 +2222,6 @@ depd@2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -destr@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/destr/-/destr-1.2.2.tgz#7ba9befcafb645a50e76b260449c63927b51e22f" - integrity sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA== - destroy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" @@ -2291,13 +2286,6 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -ebec@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ebec/-/ebec-1.0.0.tgz#e05c067818688a29ff359f138d43b4f5786b7f4f" - integrity sha512-tPS/jSTrzChdC/EkxGcHRHvLZYnEbEepqvnOr8PnwsHlOpoKsQbQv8VZf6NmdR1AXyj+6suiq+1AoOXrKtKkTw== - dependencies: - smob "^1.0.0" - ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -2860,11 +2848,6 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - flatted@^3.1.0: version "3.2.7" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" @@ -3064,16 +3047,6 @@ glob@^9.2.0: minipass "^4.2.4" path-scurry "^1.6.1" -glob@^9.3.2: - version "9.3.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" - integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== - dependencies: - fs.realpath "^1.0.0" - minimatch "^8.0.2" - minipass "^4.2.4" - path-scurry "^1.6.1" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -3929,11 +3902,6 @@ jest@29.3.1: import-local "^3.0.2" jest-cli "^29.3.1" -jiti@^1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd" - integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== - js-sdsl@^4.1.4: version "4.4.0" resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" @@ -4095,17 +4063,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -locter@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/locter/-/locter-1.1.0.tgz#b66f650945ebe7f54704e068e3b59750620e1805" - integrity sha512-dZD6T3CSeVtJ+37ZArPtk/QROvwpZAfydBDP5qDpITBPoAd3EBm/SKPmzkSRiHhkZbvB2BrW0kj/QglYXVT4Zw== - dependencies: - destr "^1.2.2" - ebec "^1.0.0" - flat "^5.0.2" - glob "^9.3.2" - jiti "^1.18.2" - lodash.memoize@4.x: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -4139,13 +4096,6 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4373,14 +4323,6 @@ neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - node-abort-controller@^3.0.1: version "3.1.1" resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" @@ -4615,14 +4557,6 @@ parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -4884,13 +4818,6 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -rapiq@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/rapiq/-/rapiq-0.8.0.tgz#f9eee0bf5bf41b92916750cc6b066c0928a8c2b9" - integrity sha512-qAWUHJP++IDKE9ul9mwXoix45a6Hne3wDiqTd7BhoRNVOQv2gQvAlCOWCQCNTbQA/Ia9jW5ugcOmbd4eRGklSQ== - dependencies: - smob "^0.1.0" - raw-body@2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" @@ -5244,16 +5171,6 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" -smob@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/smob/-/smob-0.1.0.tgz#d61b307208d2510b3faf98c166ffe4e9e94f17a2" - integrity sha512-u6ezVF7hN3AxA1onkbMsl46XZr1HYrtMksmckSVpkLI8bYJ5I34kHMvDZk8qNCfA0y54VnhWqCoU6DQMMStzpw== - -smob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/smob/-/smob-1.0.0.tgz#f4e7df1292dce83981ffc651b49a7823c4a4f77c" - integrity sha512-fnePEPpgGjAdBDk0nV7L9jcStbbcUsKS5TC+RYambCSU9Dm1k2rqDivdg5LBRVWF/NXe0Rq8yfnKKQI08kSXIg== - socket.io-adapter@~2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz#5de9477c9182fdc171cd8c8364b9a8894ec75d12" @@ -5692,7 +5609,7 @@ tsconfig-paths@^4.1.2: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@2.5.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.5.0: +tslib@2.5.0, tslib@^2.1.0, tslib@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== @@ -5753,19 +5670,6 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typeorm-extension@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/typeorm-extension/-/typeorm-extension-2.7.0.tgz#066c2307b0a6ec1acd01e32fd3fc82229322b78f" - integrity sha512-ef5x+F635ztLE/4Li1yCCwyf+G6MeHBhIQVNqbgDL20FQpCly0rpq9itrohCxbpu5diLFcYkdZ+8lGkHZqnxBg== - dependencies: - "@faker-js/faker" "^7.6.0" - locter "^1.1.0" - pascal-case "^3.1.2" - rapiq "^0.8.0" - reflect-metadata "^0.1.13" - smob "^1.0.0" - yargs "^17.7.1" - typeorm-naming-strategies@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/typeorm-naming-strategies/-/typeorm-naming-strategies-4.1.0.tgz#1ec6eb296c8d7b69bb06764d5b9083ff80e814a9" @@ -6104,7 +6008,7 @@ yargs@^16.0.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.1: +yargs@^17.3.1, yargs@^17.6.2: version "17.7.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== From 444b1e31c603f81070e17c6f19abd31c38a5c85c Mon Sep 17 00:00:00 2001 From: Jisu Date: Tue, 18 Apr 2023 18:41:28 +0900 Subject: [PATCH 4/6] :green_heart: chore: Add messege seeding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - message seeding 파일 추가 - .env.sample 에 Test db 추가해서 관리 --- backend/.env.example | 3 ++ backend/seeding/data-source.ts | 6 ++-- backend/seeding/factory/message.factory.ts | 2 ++ backend/seeding/reset-db.sh | 8 ++--- ...{auth-user.seeder.ts => message.seeder.ts} | 35 ++++++++++++++++--- 5 files changed, 41 insertions(+), 13 deletions(-) rename backend/seeding/seeder/{auth-user.seeder.ts => message.seeder.ts} (65%) diff --git a/backend/.env.example b/backend/.env.example index 49ed6a4b..740171d2 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -10,3 +10,6 @@ DB_PORT= DB_USER= DB_PASSWORD= DB_HOST= + +# db name for test +TEST_DB_NAME= diff --git a/backend/seeding/data-source.ts b/backend/seeding/data-source.ts index 296ac515..e44b49c0 100644 --- a/backend/seeding/data-source.ts +++ b/backend/seeding/data-source.ts @@ -2,7 +2,7 @@ import { config } from 'dotenv'; import { DataSource, DataSourceOptions } from 'typeorm'; -import seeder from './seeder/auth-user.seeder'; +import seeder from './seeder/message.seeder'; //import { runSeeders, SeederOptions } from 'typeorm-extension'; import * as path from 'path'; @@ -28,11 +28,11 @@ config(); type: 'postgres', host: process.env.DB_HOST, port: Number(process.env.DB_PORT), - database: 'testdb', + database: process.env.TEST_DB_NAME, username: process.env.DB_USER, password: process.env.DB_PASSWORD, synchronize: true, - entities: [Auth, User, Friendship /*Message, MessageView, UserRecord, GameHistory, BlockedUser, Achievement*/], + entities: [Auth, User, Friendship, Message, MessageView, UserRecord, GameHistory, BlockedUser, Achievement], namingStrategy: new SnakeNamingStrategy(), }; diff --git a/backend/seeding/factory/message.factory.ts b/backend/seeding/factory/message.factory.ts index 01ac6d5e..1574eea5 100644 --- a/backend/seeding/factory/message.factory.ts +++ b/backend/seeding/factory/message.factory.ts @@ -2,11 +2,13 @@ import { faker } from '@faker-js/faker'; import { Friendship } from '../../src/entity/friendship.entity'; +import { Message } from '../../src/entity/message.entity'; export default (friendship: Friendship) => { return { sender: faker.datatype.boolean() ? friendship.sender : friendship.receiver, friend: friendship, contents: faker.lorem.sentence(), + createdAt: faker.date.past(1, friendship.lastMessegeTime), }; }; diff --git a/backend/seeding/reset-db.sh b/backend/seeding/reset-db.sh index 88b1058c..5ee63040 100755 --- a/backend/seeding/reset-db.sh +++ b/backend/seeding/reset-db.sh @@ -1,8 +1,4 @@ #!/bin/bash -DB=$1; -if [ -z $1 ] ; then - echo "Please provide a database name"; - read -p "Database name: " DB; -fi -dropdb $DB 2>/dev/null; createdb $DB; +DB=$(grep "TEST_DB_NAME" .env | cut -d "=" -f 2) +dropdb $DB -f 2>/dev/null; createdb $DB; rm -rf seeding/results; diff --git a/backend/seeding/seeder/auth-user.seeder.ts b/backend/seeding/seeder/message.seeder.ts similarity index 65% rename from backend/seeding/seeder/auth-user.seeder.ts rename to backend/seeding/seeder/message.seeder.ts index 075adc3a..27546d4b 100644 --- a/backend/seeding/seeder/auth-user.seeder.ts +++ b/backend/seeding/seeder/message.seeder.ts @@ -9,6 +9,8 @@ import { Friendship } from '../../src/entity/friendship.entity'; import * as path from 'path'; import frieindshipFactory from '../factory/frieindship.factory'; +import messageFactory from '../factory/message.factory'; +import { Message } from '../../src/entity/message.entity'; export default async (dataSource: DataSource) => { const resultDir = path.join(__dirname, '../results'); @@ -31,10 +33,10 @@ export default async (dataSource: DataSource) => { fs.writeFile(path.join(resultDir, 'users.json'), JSON.stringify(users), (err) => { if (err) throw err; - console.log('created user information has been saved to seeding/results/users.json'); + console.log('created user information has been saved to seeding/results/users.json\n'); }); - //generate friendship + // generate friendship // 1/2 확률로 친구관계 생기게, 그 중 1/2 확률로 accept. const friendsSeed = []; for (let i: number = 0; i < users.length; i++) { @@ -49,10 +51,35 @@ export default async (dataSource: DataSource) => { fs.writeFile(path.join(resultDir, 'friends.json'), JSON.stringify(friends), (err) => { if (err) throw err; - console.log('created friendship information has been saved to seeding/results/friends.json'); + console.log('created friendship information has been saved to seeding/results/friends.json\n'); }); - //generate message + // generate message + // 친구 수락 && 마지막 메세지 시간이 있으면 메세지 생성 + const messageRepository = dataSource.getRepository(Message); + + const messageSeed: Partial[] = []; + friends + .filter((friend) => friend.lastMessegeTime !== undefined && friend.accept === true) + .map((friend) => { + const random = Math.floor(Math.random() * 200); + for (let i: number = 0; i < random; i++) { + messageSeed.push(messageFactory(friend)); + } + }); + + const promises = []; + for (let i: number = 0; i < messageSeed.length; i += 10) { + promises.push(messageRepository.save(messageSeed.slice(i, i + 10))); + } + const messages = await Promise.all(promises); + + console.log('message ' + messages.length + ' rows created.'); + + fs.writeFile(path.join(resultDir, 'messages.json'), JSON.stringify(messages), (err) => { + if (err) throw err; + console.log('created message information has been saved to seeding/results/messages.json\n'); + }); dataSource.destroy(); }; From 8713388858d76c19c0a1a4a5cd1a9dda5021e41b Mon Sep 17 00:00:00 2001 From: Jisu Date: Tue, 18 Apr 2023 20:21:57 +0900 Subject: [PATCH 5/6] :lipstick: style: Fix seed files style --- backend/.eslintrc.js | 2 +- backend/seeding/data-source.ts | 19 +++++++++---------- backend/seeding/factory/auth.factory.ts | 1 + .../seeding/factory/frieindship.factory.ts | 1 + backend/seeding/factory/message.factory.ts | 2 +- backend/seeding/factory/user.factory.ts | 1 + backend/seeding/seeder/message.seeder.ts | 18 +++++++++--------- 7 files changed, 23 insertions(+), 21 deletions(-) diff --git a/backend/.eslintrc.js b/backend/.eslintrc.js index 1561ab20..92f2eaf2 100644 --- a/backend/.eslintrc.js +++ b/backend/.eslintrc.js @@ -12,7 +12,7 @@ module.exports = { node: true, jest: true, }, - ignorePatterns: ['.eslintrc.js', 'seeding/'], + ignorePatterns: ['.eslintrc.js'], rules: { '@typescript-eslint/interface-name-prefix': 'off', '@typescript-eslint/explicit-function-return-type': 'off', diff --git a/backend/seeding/data-source.ts b/backend/seeding/data-source.ts index e44b49c0..5b4d35a4 100644 --- a/backend/seeding/data-source.ts +++ b/backend/seeding/data-source.ts @@ -1,21 +1,20 @@ //import dotenv import { config } from 'dotenv'; - import { DataSource, DataSourceOptions } from 'typeorm'; -import seeder from './seeder/message.seeder'; -//import { runSeeders, SeederOptions } from 'typeorm-extension'; -import * as path from 'path'; +import { SnakeNamingStrategy } from 'typeorm-naming-strategies'; +import { Achievement } from '../src/entity/achievement.entity'; import { Auth } from '../src/entity/auth.entity'; -import { User } from '../src/entity/user.entity'; +import { BlockedUser } from '../src/entity/blocked-user.entity'; import { Friendship } from '../src/entity/friendship.entity'; -import { Message } from '../src/entity/message.entity'; +import { GameHistory } from '../src/entity/game-history.entity'; import { MessageView } from '../src/entity/message-view.entity'; +import { Message } from '../src/entity/message.entity'; import { UserRecord } from '../src/entity/user-record.entity'; -import { GameHistory } from '../src/entity/game-history.entity'; -import { BlockedUser } from '../src/entity/blocked-user.entity'; -import { Achievement } from '../src/entity/achievement.entity'; -import { SnakeNamingStrategy } from 'typeorm-naming-strategies'; +import { User } from '../src/entity/user.entity'; + +import seeder from './seeder/message.seeder'; +//import { runSeeders, SeederOptions } from 'typeorm-extension'; config(); diff --git a/backend/seeding/factory/auth.factory.ts b/backend/seeding/factory/auth.factory.ts index 67338087..81f6a528 100644 --- a/backend/seeding/factory/auth.factory.ts +++ b/backend/seeding/factory/auth.factory.ts @@ -1,6 +1,7 @@ // file name should be .factory.ts import { faker } from '@faker-js/faker'; + import { AuthStatus } from '../../src/entity/auth.entity'; export default () => ({ diff --git a/backend/seeding/factory/frieindship.factory.ts b/backend/seeding/factory/frieindship.factory.ts index 4d3089d3..dfd57b6d 100644 --- a/backend/seeding/factory/frieindship.factory.ts +++ b/backend/seeding/factory/frieindship.factory.ts @@ -1,6 +1,7 @@ // file name should be .factory.ts import { faker } from '@faker-js/faker'; + import { User } from '../../src/entity/user.entity'; export default (user1: User, user2: User) => { diff --git a/backend/seeding/factory/message.factory.ts b/backend/seeding/factory/message.factory.ts index 1574eea5..fffdd610 100644 --- a/backend/seeding/factory/message.factory.ts +++ b/backend/seeding/factory/message.factory.ts @@ -1,8 +1,8 @@ // file name should be .factory.ts import { faker } from '@faker-js/faker'; + import { Friendship } from '../../src/entity/friendship.entity'; -import { Message } from '../../src/entity/message.entity'; export default (friendship: Friendship) => { return { diff --git a/backend/seeding/factory/user.factory.ts b/backend/seeding/factory/user.factory.ts index 7ebd20e2..e833da54 100644 --- a/backend/seeding/factory/user.factory.ts +++ b/backend/seeding/factory/user.factory.ts @@ -1,6 +1,7 @@ // file name should be .factory.ts import { faker } from '@faker-js/faker'; + import { Auth } from '../../src/entity/auth.entity'; export default (auth: Auth) => { diff --git a/backend/seeding/seeder/message.seeder.ts b/backend/seeding/seeder/message.seeder.ts index 27546d4b..4fb058a6 100644 --- a/backend/seeding/seeder/message.seeder.ts +++ b/backend/seeding/seeder/message.seeder.ts @@ -1,16 +1,16 @@ -import { DataSource, Repository } from 'typeorm'; import * as fs from 'fs'; +import * as path from 'path'; + +import { DataSource, Repository } from 'typeorm'; import { Auth } from '../../src/entity/auth.entity'; +import { Friendship } from '../../src/entity/friendship.entity'; +import { Message } from '../../src/entity/message.entity'; import { User } from '../../src/entity/user.entity'; import authFactory from '../factory/auth.factory'; -import userFactory from '../factory/user.factory'; -import { Friendship } from '../../src/entity/friendship.entity'; -import * as path from 'path'; - import frieindshipFactory from '../factory/frieindship.factory'; import messageFactory from '../factory/message.factory'; -import { Message } from '../../src/entity/message.entity'; +import userFactory from '../factory/user.factory'; export default async (dataSource: DataSource) => { const resultDir = path.join(__dirname, '../results'); @@ -39,7 +39,7 @@ export default async (dataSource: DataSource) => { // generate friendship // 1/2 확률로 친구관계 생기게, 그 중 1/2 확률로 accept. const friendsSeed = []; - for (let i: number = 0; i < users.length; i++) { + for (let i = 0; i < users.length; i++) { for (let j: number = i + 1; j < users.length; j++) { Math.random() <= 0.1 && friendsSeed.push(frieindshipFactory(users[i], users[j])); } @@ -63,13 +63,13 @@ export default async (dataSource: DataSource) => { .filter((friend) => friend.lastMessegeTime !== undefined && friend.accept === true) .map((friend) => { const random = Math.floor(Math.random() * 200); - for (let i: number = 0; i < random; i++) { + for (let i = 0; i < random; i++) { messageSeed.push(messageFactory(friend)); } }); const promises = []; - for (let i: number = 0; i < messageSeed.length; i += 10) { + for (let i = 0; i < messageSeed.length; i += 10) { promises.push(messageRepository.save(messageSeed.slice(i, i + 10))); } const messages = await Promise.all(promises); From db6f9649259490d403f50de09f44d0b407f4b5fd Mon Sep 17 00:00:00 2001 From: Jisu Date: Tue, 18 Apr 2023 20:49:20 +0900 Subject: [PATCH 6/6] :bug: fix: Fix friendship factory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - accept: true 일 때만 last_message_time 생성되도록 변경 --- backend/seeding/data-source.ts | 1 - backend/seeding/factory/frieindship.factory.ts | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/seeding/data-source.ts b/backend/seeding/data-source.ts index 5b4d35a4..3ff4e697 100644 --- a/backend/seeding/data-source.ts +++ b/backend/seeding/data-source.ts @@ -14,7 +14,6 @@ import { UserRecord } from '../src/entity/user-record.entity'; import { User } from '../src/entity/user.entity'; import seeder from './seeder/message.seeder'; -//import { runSeeders, SeederOptions } from 'typeorm-extension'; config(); diff --git a/backend/seeding/factory/frieindship.factory.ts b/backend/seeding/factory/frieindship.factory.ts index dfd57b6d..0cb7db6d 100644 --- a/backend/seeding/factory/frieindship.factory.ts +++ b/backend/seeding/factory/frieindship.factory.ts @@ -5,10 +5,11 @@ import { faker } from '@faker-js/faker'; import { User } from '../../src/entity/user.entity'; export default (user1: User, user2: User) => { + const accept = faker.datatype.boolean(); return { sender: user1, receiver: user2, - accept: faker.datatype.boolean(), - lastMessegeTime: faker.datatype.boolean() ? faker.date.past() : undefined, + accept, + lastMessegeTime: accept && faker.datatype.boolean() ? faker.date.past() : undefined, }; };