typescript-express-starter 10.2.1 → 11.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.kr.md +136 -287
- package/README.md +134 -274
- package/bin/ast-utils.js +226 -0
- package/bin/common.js +312 -0
- package/bin/config.js +80 -0
- package/bin/db-map.js +169 -0
- package/bin/errors.js +129 -0
- package/bin/performance.js +203 -0
- package/bin/starter.js +359 -0
- package/bin/validators.js +146 -0
- package/devtools/biome/.biome.json +34 -0
- package/devtools/biome/.biomeignore +29 -0
- package/devtools/docker/.dockerignore +27 -0
- package/devtools/docker/Dockerfile.dev +20 -0
- package/devtools/docker/Dockerfile.prod +35 -0
- package/{lib/default → devtools/docker}/Makefile +3 -0
- package/devtools/docker/nginx.conf +67 -0
- package/devtools/eslint/eslint.config.cjs +23 -0
- package/devtools/husky/.husky/commit-msg +4 -0
- package/devtools/husky/.husky/pre-commit +4 -0
- package/devtools/husky/.husky/pre-push +4 -0
- package/devtools/jest/jest.config.cjs +2 -0
- package/devtools/jest/jest.config.ts +25 -0
- package/devtools/jest/src/test/e2e/auth.e2e.spec.ts +40 -0
- package/devtools/jest/src/test/e2e/users.e2e.spec.ts +63 -0
- package/devtools/jest/src/test/setup.ts +31 -0
- package/devtools/jest/src/test/unit/entities/user.entity.spec.ts +279 -0
- package/devtools/jest/src/test/unit/services/auth.service.spec.ts +75 -0
- package/devtools/jest/src/test/unit/services/users.service.spec.ts +109 -0
- package/devtools/oxlint/.oxlintrc.json +57 -0
- package/devtools/pm2/ecosystem.config.js +59 -0
- package/devtools/swagger/swagger.yaml +124 -0
- package/{lib/prisma → devtools/swc}/.swcrc +2 -1
- package/devtools/tsup/tsup.config.ts +15 -0
- package/devtools/vitest/src/test/e2e/auth.e2e.spec.ts +41 -0
- package/devtools/vitest/src/test/e2e/users.e2e.spec.ts +64 -0
- package/devtools/vitest/src/test/setup.ts +31 -0
- package/devtools/vitest/src/test/unit/services/auth.service.spec.ts +70 -0
- package/devtools/vitest/src/test/unit/services/users.service.spec.ts +90 -0
- package/devtools/vitest/vitest.config.ts +22 -0
- package/package.json +24 -11
- package/templates/default/nodemon.json +7 -0
- package/templates/default/package.json +48 -0
- package/templates/default/src/app.ts +118 -0
- package/templates/default/src/config/env.ts +78 -0
- package/templates/default/src/controllers/auth.controller.ts +40 -0
- package/templates/default/src/controllers/users.controller.ts +46 -0
- package/templates/default/src/dtos/users.dto.ts +42 -0
- package/templates/default/src/entities/user.entity.ts +190 -0
- package/templates/default/src/exceptions/httpException.ts +14 -0
- package/{lib/knex → templates/default}/src/interfaces/auth.interface.ts +3 -3
- package/templates/default/src/interfaces/users.interface.ts +9 -0
- package/templates/default/src/middlewares/auth.middleware.ts +49 -0
- package/templates/default/src/middlewares/error.middleware.ts +89 -0
- package/templates/default/src/middlewares/notFound.middleware.ts +6 -0
- package/templates/default/src/middlewares/validation.middleware.ts +15 -0
- package/templates/default/src/repositories/users.repository.ts +55 -0
- package/templates/default/src/routes/auth.route.ts +31 -0
- package/templates/default/src/routes/users.route.ts +32 -0
- package/templates/default/src/server.ts +35 -0
- package/templates/default/src/services/auth.service.ts +67 -0
- package/templates/default/src/services/users.service.ts +48 -0
- package/templates/default/src/utils/asyncHandler.ts +8 -0
- package/templates/default/src/utils/logger.ts +113 -0
- package/{lib/typeorm → templates/default}/tsconfig.json +23 -22
- package/CONTRIBUTORS.md +0 -69
- package/bin/cli.js +0 -18
- package/lib/default/.dockerignore +0 -18
- package/lib/default/.editorconfig +0 -9
- package/lib/default/.env.development.local +0 -13
- package/lib/default/.env.production.local +0 -13
- package/lib/default/.env.test.local +0 -13
- package/lib/default/.eslintignore +0 -1
- package/lib/default/.eslintrc +0 -18
- package/lib/default/.huskyrc +0 -5
- package/lib/default/.lintstagedrc.json +0 -5
- package/lib/default/.prettierrc +0 -8
- package/lib/default/.swcrc +0 -39
- package/lib/default/.vscode/launch.json +0 -35
- package/lib/default/.vscode/settings.json +0 -6
- package/lib/default/Dockerfile.dev +0 -18
- package/lib/default/Dockerfile.prod +0 -18
- package/lib/default/docker-compose.yml +0 -35
- package/lib/default/ecosystem.config.js +0 -57
- package/lib/default/jest.config.js +0 -12
- package/lib/default/nginx.conf +0 -40
- package/lib/default/nodemon.json +0 -12
- package/lib/default/package.json +0 -76
- package/lib/default/src/app.ts +0 -81
- package/lib/default/src/config/index.ts +0 -5
- package/lib/default/src/controllers/auth.controller.ts +0 -44
- package/lib/default/src/controllers/users.controller.ts +0 -63
- package/lib/default/src/dtos/users.dto.ts +0 -20
- package/lib/default/src/exceptions/HttpException.ts +0 -10
- package/lib/default/src/http/auth.http +0 -27
- package/lib/default/src/http/users.http +0 -34
- package/lib/default/src/interfaces/auth.interface.ts +0 -15
- package/lib/default/src/interfaces/users.interface.ts +0 -5
- package/lib/default/src/middlewares/auth.middleware.ts +0 -38
- package/lib/default/src/middlewares/error.middleware.ts +0 -15
- package/lib/default/src/middlewares/validation.middleware.ts +0 -27
- package/lib/default/src/models/users.model.ts +0 -9
- package/lib/default/src/routes/auth.route.ts +0 -21
- package/lib/default/src/routes/users.route.ts +0 -23
- package/lib/default/src/server.ts +0 -10
- package/lib/default/src/services/auth.service.ts +0 -52
- package/lib/default/src/services/users.service.ts +0 -51
- package/lib/default/src/test/auth.test.ts +0 -52
- package/lib/default/src/test/users.test.ts +0 -62
- package/lib/default/src/utils/logger.ts +0 -65
- package/lib/default/src/utils/validateEnv.ts +0 -8
- package/lib/default/swagger.yaml +0 -123
- package/lib/default/tsconfig.json +0 -39
- package/lib/graphql/.dockerignore +0 -18
- package/lib/graphql/.editorconfig +0 -9
- package/lib/graphql/.env.development.local +0 -20
- package/lib/graphql/.env.production.local +0 -20
- package/lib/graphql/.env.test.local +0 -20
- package/lib/graphql/.eslintignore +0 -1
- package/lib/graphql/.eslintrc +0 -18
- package/lib/graphql/.huskyrc +0 -5
- package/lib/graphql/.lintstagedrc.json +0 -5
- package/lib/graphql/.prettierrc +0 -8
- package/lib/graphql/.swcrc +0 -40
- package/lib/graphql/.vscode/launch.json +0 -35
- package/lib/graphql/.vscode/settings.json +0 -6
- package/lib/graphql/Dockerfile.dev +0 -19
- package/lib/graphql/Dockerfile.prod +0 -19
- package/lib/graphql/Makefile +0 -46
- package/lib/graphql/docker-compose.yml +0 -58
- package/lib/graphql/ecosystem.config.js +0 -59
- package/lib/graphql/jest.config.js +0 -12
- package/lib/graphql/nginx.conf +0 -40
- package/lib/graphql/nodemon.json +0 -12
- package/lib/graphql/package.json +0 -75
- package/lib/graphql/src/app.ts +0 -107
- package/lib/graphql/src/config/index.ts +0 -6
- package/lib/graphql/src/database/index.ts +0 -26
- package/lib/graphql/src/dtos/users.dto.ts +0 -27
- package/lib/graphql/src/entities/users.entity.ts +0 -26
- package/lib/graphql/src/exceptions/HttpException.ts +0 -10
- package/lib/graphql/src/http/auth.http +0 -49
- package/lib/graphql/src/http/users.http +0 -78
- package/lib/graphql/src/interfaces/auth.interface.ts +0 -14
- package/lib/graphql/src/interfaces/users.interface.ts +0 -5
- package/lib/graphql/src/middlewares/auth.middleware.ts +0 -42
- package/lib/graphql/src/middlewares/error.middleware.ts +0 -15
- package/lib/graphql/src/repositories/auth.repository.ts +0 -53
- package/lib/graphql/src/repositories/users.repository.ts +0 -51
- package/lib/graphql/src/resolvers/auth.resolver.ts +0 -32
- package/lib/graphql/src/resolvers/users.resolver.ts +0 -47
- package/lib/graphql/src/server.ts +0 -10
- package/lib/graphql/src/test/auth.test.ts +0 -10
- package/lib/graphql/src/test/users.test.ts +0 -11
- package/lib/graphql/src/typedefs/users.type.ts +0 -13
- package/lib/graphql/src/utils/logger.ts +0 -77
- package/lib/graphql/src/utils/validateEnv.ts +0 -8
- package/lib/graphql/tsconfig.json +0 -40
- package/lib/knex/.dockerignore +0 -18
- package/lib/knex/.editorconfig +0 -9
- package/lib/knex/.env.development.local +0 -20
- package/lib/knex/.env.production.local +0 -20
- package/lib/knex/.env.test.local +0 -20
- package/lib/knex/.eslintignore +0 -1
- package/lib/knex/.eslintrc +0 -18
- package/lib/knex/.huskyrc +0 -5
- package/lib/knex/.lintstagedrc.json +0 -5
- package/lib/knex/.prettierrc +0 -8
- package/lib/knex/.swcrc +0 -40
- package/lib/knex/.vscode/launch.json +0 -35
- package/lib/knex/.vscode/settings.json +0 -6
- package/lib/knex/Dockerfile.dev +0 -19
- package/lib/knex/Dockerfile.prod +0 -19
- package/lib/knex/Makefile +0 -46
- package/lib/knex/docker-compose.yml +0 -55
- package/lib/knex/ecosystem.config.js +0 -57
- package/lib/knex/jest.config.js +0 -12
- package/lib/knex/knexfile.ts +0 -23
- package/lib/knex/nginx.conf +0 -40
- package/lib/knex/nodemon.json +0 -12
- package/lib/knex/package.json +0 -85
- package/lib/knex/src/app.ts +0 -87
- package/lib/knex/src/config/index.ts +0 -6
- package/lib/knex/src/controllers/auth.controller.ts +0 -44
- package/lib/knex/src/controllers/users.controller.ts +0 -63
- package/lib/knex/src/database/index.ts +0 -24
- package/lib/knex/src/database/migrations/.gitkeep +0 -0
- package/lib/knex/src/database/migrations/20210713110926_initial.ts +0 -17
- package/lib/knex/src/database/seeds/.gitkeep +0 -0
- package/lib/knex/src/dtos/users.dto.ts +0 -20
- package/lib/knex/src/exceptions/HttpException.ts +0 -10
- package/lib/knex/src/http/auth.http +0 -27
- package/lib/knex/src/http/users.http +0 -34
- package/lib/knex/src/interfaces/routes.interface.ts +0 -6
- package/lib/knex/src/interfaces/users.interface.ts +0 -5
- package/lib/knex/src/middlewares/auth.middleware.ts +0 -40
- package/lib/knex/src/middlewares/error.middleware.ts +0 -15
- package/lib/knex/src/middlewares/validation.middleware.ts +0 -27
- package/lib/knex/src/models/users.model.ts +0 -13
- package/lib/knex/src/routes/auth.route.ts +0 -22
- package/lib/knex/src/routes/users.route.ts +0 -23
- package/lib/knex/src/server.ts +0 -10
- package/lib/knex/src/services/auth.service.ts +0 -60
- package/lib/knex/src/services/users.service.ts +0 -55
- package/lib/knex/src/test/auth.test.ts +0 -51
- package/lib/knex/src/test/users.test.ts +0 -65
- package/lib/knex/src/utils/logger.ts +0 -65
- package/lib/knex/src/utils/validateEnv.ts +0 -8
- package/lib/knex/swagger.yaml +0 -123
- package/lib/knex/tsconfig.json +0 -40
- package/lib/mikro-orm/.dockerignore +0 -18
- package/lib/mikro-orm/.editorconfig +0 -9
- package/lib/mikro-orm/.env.development.local +0 -18
- package/lib/mikro-orm/.env.production.local +0 -18
- package/lib/mikro-orm/.env.test.local +0 -18
- package/lib/mikro-orm/.eslintignore +0 -1
- package/lib/mikro-orm/.eslintrc +0 -18
- package/lib/mikro-orm/.huskyrc +0 -5
- package/lib/mikro-orm/.lintstagedrc.json +0 -5
- package/lib/mikro-orm/.prettierrc +0 -8
- package/lib/mikro-orm/.swcrc +0 -41
- package/lib/mikro-orm/.vscode/launch.json +0 -35
- package/lib/mikro-orm/.vscode/settings.json +0 -6
- package/lib/mikro-orm/Dockerfile.dev +0 -19
- package/lib/mikro-orm/Dockerfile.prod +0 -19
- package/lib/mikro-orm/Makefile +0 -46
- package/lib/mikro-orm/docker-compose.yml +0 -55
- package/lib/mikro-orm/ecosystem.config.js +0 -57
- package/lib/mikro-orm/jest.config.js +0 -12
- package/lib/mikro-orm/nginx.conf +0 -40
- package/lib/mikro-orm/nodemon.json +0 -12
- package/lib/mikro-orm/package.json +0 -79
- package/lib/mikro-orm/src/app.ts +0 -97
- package/lib/mikro-orm/src/config/index.ts +0 -6
- package/lib/mikro-orm/src/controllers/auth.controller.ts +0 -44
- package/lib/mikro-orm/src/controllers/users.controller.ts +0 -63
- package/lib/mikro-orm/src/database/index.ts +0 -19
- package/lib/mikro-orm/src/dtos/users.dto.ts +0 -20
- package/lib/mikro-orm/src/entities/base.entity.ts +0 -16
- package/lib/mikro-orm/src/entities/users.entity.ts +0 -17
- package/lib/mikro-orm/src/exceptions/HttpException.ts +0 -10
- package/lib/mikro-orm/src/http/auth.http +0 -32
- package/lib/mikro-orm/src/http/users.http +0 -34
- package/lib/mikro-orm/src/interfaces/auth.interface.ts +0 -15
- package/lib/mikro-orm/src/interfaces/routes.interface.ts +0 -6
- package/lib/mikro-orm/src/interfaces/users.interface.ts +0 -5
- package/lib/mikro-orm/src/middlewares/auth.middleware.ts +0 -39
- package/lib/mikro-orm/src/middlewares/error.middleware.ts +0 -15
- package/lib/mikro-orm/src/middlewares/validation.middleware.ts +0 -27
- package/lib/mikro-orm/src/routes/auth.route.ts +0 -22
- package/lib/mikro-orm/src/routes/users.route.ts +0 -23
- package/lib/mikro-orm/src/server.ts +0 -10
- package/lib/mikro-orm/src/services/auth.service.ts +0 -53
- package/lib/mikro-orm/src/services/users.service.ts +0 -60
- package/lib/mikro-orm/src/test/auth.test.ts +0 -65
- package/lib/mikro-orm/src/test/users.test.ts +0 -69
- package/lib/mikro-orm/src/utils/logger.ts +0 -65
- package/lib/mikro-orm/src/utils/validateEnv.ts +0 -8
- package/lib/mikro-orm/swagger.yaml +0 -122
- package/lib/mikro-orm/tsconfig.json +0 -41
- package/lib/mongoose/.dockerignore +0 -18
- package/lib/mongoose/.editorconfig +0 -9
- package/lib/mongoose/.env.development.local +0 -18
- package/lib/mongoose/.env.production.local +0 -18
- package/lib/mongoose/.env.test.local +0 -18
- package/lib/mongoose/.eslintignore +0 -1
- package/lib/mongoose/.eslintrc +0 -18
- package/lib/mongoose/.huskyrc +0 -5
- package/lib/mongoose/.lintstagedrc.json +0 -5
- package/lib/mongoose/.prettierrc +0 -8
- package/lib/mongoose/.swcrc +0 -40
- package/lib/mongoose/.vscode/launch.json +0 -35
- package/lib/mongoose/.vscode/settings.json +0 -6
- package/lib/mongoose/Dockerfile.dev +0 -19
- package/lib/mongoose/Dockerfile.prod +0 -19
- package/lib/mongoose/Makefile +0 -46
- package/lib/mongoose/docker-compose.yml +0 -55
- package/lib/mongoose/ecosystem.config.js +0 -57
- package/lib/mongoose/jest.config.js +0 -12
- package/lib/mongoose/nginx.conf +0 -40
- package/lib/mongoose/nodemon.json +0 -12
- package/lib/mongoose/package.json +0 -78
- package/lib/mongoose/src/app.ts +0 -87
- package/lib/mongoose/src/config/index.ts +0 -6
- package/lib/mongoose/src/controllers/auth.controller.ts +0 -44
- package/lib/mongoose/src/controllers/users.controller.ts +0 -63
- package/lib/mongoose/src/database/index.ts +0 -18
- package/lib/mongoose/src/dtos/users.dto.ts +0 -20
- package/lib/mongoose/src/exceptions/HttpException.ts +0 -10
- package/lib/mongoose/src/http/auth.http +0 -27
- package/lib/mongoose/src/http/users.http +0 -34
- package/lib/mongoose/src/interfaces/auth.interface.ts +0 -15
- package/lib/mongoose/src/interfaces/routes.interface.ts +0 -6
- package/lib/mongoose/src/interfaces/users.interface.ts +0 -5
- package/lib/mongoose/src/middlewares/auth.middleware.ts +0 -39
- package/lib/mongoose/src/middlewares/error.middleware.ts +0 -15
- package/lib/mongoose/src/middlewares/validation.middleware.ts +0 -27
- package/lib/mongoose/src/models/users.model.ts +0 -16
- package/lib/mongoose/src/routes/auth.route.ts +0 -22
- package/lib/mongoose/src/routes/users.route.ts +0 -23
- package/lib/mongoose/src/server.ts +0 -10
- package/lib/mongoose/src/services/auth.service.ts +0 -52
- package/lib/mongoose/src/services/users.service.ts +0 -54
- package/lib/mongoose/src/test/auth.test.ts +0 -83
- package/lib/mongoose/src/test/index.test.ts +0 -18
- package/lib/mongoose/src/test/users.test.ts +0 -133
- package/lib/mongoose/src/utils/logger.ts +0 -65
- package/lib/mongoose/src/utils/validateEnv.ts +0 -8
- package/lib/mongoose/swagger.yaml +0 -120
- package/lib/mongoose/tsconfig.json +0 -40
- package/lib/node-postgres/.dockerignore +0 -18
- package/lib/node-postgres/.editorconfig +0 -9
- package/lib/node-postgres/.env.development.local +0 -20
- package/lib/node-postgres/.env.production.local +0 -20
- package/lib/node-postgres/.env.test.local +0 -20
- package/lib/node-postgres/.eslintignore +0 -1
- package/lib/node-postgres/.eslintrc +0 -18
- package/lib/node-postgres/.huskyrc +0 -5
- package/lib/node-postgres/.lintstagedrc.json +0 -5
- package/lib/node-postgres/.prettierrc +0 -8
- package/lib/node-postgres/.swcrc +0 -38
- package/lib/node-postgres/.vscode/launch.json +0 -35
- package/lib/node-postgres/.vscode/settings.json +0 -6
- package/lib/node-postgres/Dockerfile.dev +0 -17
- package/lib/node-postgres/Dockerfile.prod +0 -17
- package/lib/node-postgres/Makefile +0 -46
- package/lib/node-postgres/docker-compose.yml +0 -61
- package/lib/node-postgres/ecosystem.config.js +0 -57
- package/lib/node-postgres/jest.config.js +0 -12
- package/lib/node-postgres/nginx.conf +0 -40
- package/lib/node-postgres/nodemon.json +0 -12
- package/lib/node-postgres/package.json +0 -78
- package/lib/node-postgres/src/app.ts +0 -81
- package/lib/node-postgres/src/config/index.ts +0 -6
- package/lib/node-postgres/src/controllers/auth.controller.ts +0 -44
- package/lib/node-postgres/src/controllers/users.controller.ts +0 -63
- package/lib/node-postgres/src/database/index.ts +0 -10
- package/lib/node-postgres/src/database/init.sql +0 -13
- package/lib/node-postgres/src/dtos/users.dto.ts +0 -20
- package/lib/node-postgres/src/exceptions/httpException.ts +0 -10
- package/lib/node-postgres/src/http/auth.http +0 -27
- package/lib/node-postgres/src/http/users.http +0 -34
- package/lib/node-postgres/src/interfaces/auth.interface.ts +0 -15
- package/lib/node-postgres/src/interfaces/routes.interface.ts +0 -6
- package/lib/node-postgres/src/interfaces/users.interface.ts +0 -5
- package/lib/node-postgres/src/middlewares/auth.middleware.ts +0 -46
- package/lib/node-postgres/src/middlewares/error.middleware.ts +0 -15
- package/lib/node-postgres/src/middlewares/validation.middleware.ts +0 -27
- package/lib/node-postgres/src/routes/auth.route.ts +0 -21
- package/lib/node-postgres/src/routes/users.route.ts +0 -23
- package/lib/node-postgres/src/server.ts +0 -10
- package/lib/node-postgres/src/services/auth.service.ts +0 -103
- package/lib/node-postgres/src/services/users.service.ts +0 -133
- package/lib/node-postgres/src/test/auth.test.ts +0 -57
- package/lib/node-postgres/src/test/users.test.ts +0 -72
- package/lib/node-postgres/src/utils/logger.ts +0 -65
- package/lib/node-postgres/src/utils/validateEnv.ts +0 -8
- package/lib/node-postgres/swagger.yaml +0 -123
- package/lib/node-postgres/tsconfig.json +0 -39
- package/lib/prisma/.dockerignore +0 -18
- package/lib/prisma/.editorconfig +0 -9
- package/lib/prisma/.env.development.local +0 -16
- package/lib/prisma/.env.production.local +0 -16
- package/lib/prisma/.env.test.local +0 -16
- package/lib/prisma/.eslintignore +0 -1
- package/lib/prisma/.eslintrc +0 -18
- package/lib/prisma/.huskyrc +0 -5
- package/lib/prisma/.lintstagedrc.json +0 -5
- package/lib/prisma/.prettierrc +0 -8
- package/lib/prisma/.vscode/launch.json +0 -35
- package/lib/prisma/.vscode/settings.json +0 -6
- package/lib/prisma/Dockerfile.dev +0 -19
- package/lib/prisma/Dockerfile.prod +0 -19
- package/lib/prisma/Makefile +0 -46
- package/lib/prisma/docker-compose.yml +0 -51
- package/lib/prisma/ecosystem.config.js +0 -57
- package/lib/prisma/jest.config.js +0 -12
- package/lib/prisma/nginx.conf +0 -40
- package/lib/prisma/nodemon.json +0 -12
- package/lib/prisma/package.json +0 -84
- package/lib/prisma/src/app.ts +0 -81
- package/lib/prisma/src/config/index.ts +0 -5
- package/lib/prisma/src/controllers/auth.controller.ts +0 -44
- package/lib/prisma/src/controllers/users.controller.ts +0 -63
- package/lib/prisma/src/dtos/users.dto.ts +0 -20
- package/lib/prisma/src/exceptions/HttpException.ts +0 -10
- package/lib/prisma/src/http/auth.http +0 -27
- package/lib/prisma/src/http/users.http +0 -34
- package/lib/prisma/src/interfaces/auth.interface.ts +0 -15
- package/lib/prisma/src/interfaces/routes.interface.ts +0 -6
- package/lib/prisma/src/interfaces/users.interface.ts +0 -5
- package/lib/prisma/src/middlewares/auth.middleware.ts +0 -39
- package/lib/prisma/src/middlewares/error.middleware.ts +0 -15
- package/lib/prisma/src/middlewares/validation.middleware.ts +0 -27
- package/lib/prisma/src/prisma/migrations/20210314081925_initial/migration.sql +0 -9
- package/lib/prisma/src/prisma/migrations/migration_lock.toml +0 -3
- package/lib/prisma/src/prisma/schema.prisma +0 -17
- package/lib/prisma/src/routes/auth.route.ts +0 -22
- package/lib/prisma/src/routes/users.route.ts +0 -23
- package/lib/prisma/src/server.ts +0 -10
- package/lib/prisma/src/services/auth.service.ts +0 -56
- package/lib/prisma/src/services/users.service.ts +0 -49
- package/lib/prisma/src/test/auth.test.ts +0 -81
- package/lib/prisma/src/test/index.test.ts +0 -18
- package/lib/prisma/src/test/users.test.ts +0 -134
- package/lib/prisma/src/utils/logger.ts +0 -65
- package/lib/prisma/src/utils/validateEnv.ts +0 -8
- package/lib/prisma/swagger.yaml +0 -123
- package/lib/prisma/tsconfig.json +0 -38
- package/lib/routing-controllers/.dockerignore +0 -18
- package/lib/routing-controllers/.editorconfig +0 -9
- package/lib/routing-controllers/.env.development.local +0 -13
- package/lib/routing-controllers/.env.production.local +0 -13
- package/lib/routing-controllers/.env.test.local +0 -13
- package/lib/routing-controllers/.eslintignore +0 -1
- package/lib/routing-controllers/.eslintrc +0 -18
- package/lib/routing-controllers/.huskyrc +0 -5
- package/lib/routing-controllers/.lintstagedrc.json +0 -5
- package/lib/routing-controllers/.prettierrc +0 -8
- package/lib/routing-controllers/.swcrc +0 -38
- package/lib/routing-controllers/.vscode/launch.json +0 -35
- package/lib/routing-controllers/.vscode/settings.json +0 -6
- package/lib/routing-controllers/Dockerfile.dev +0 -19
- package/lib/routing-controllers/Dockerfile.prod +0 -19
- package/lib/routing-controllers/Makefile +0 -42
- package/lib/routing-controllers/docker-compose.yml +0 -35
- package/lib/routing-controllers/ecosystem.config.js +0 -57
- package/lib/routing-controllers/jest.config.js +0 -12
- package/lib/routing-controllers/nginx.conf +0 -40
- package/lib/routing-controllers/nodemon.json +0 -12
- package/lib/routing-controllers/package.json +0 -77
- package/lib/routing-controllers/src/app.ts +0 -101
- package/lib/routing-controllers/src/config/index.ts +0 -5
- package/lib/routing-controllers/src/controllers/auth.controller.ts +0 -41
- package/lib/routing-controllers/src/controllers/users.controller.ts +0 -51
- package/lib/routing-controllers/src/dtos/users.dto.ts +0 -20
- package/lib/routing-controllers/src/exceptions/HttpException.ts +0 -12
- package/lib/routing-controllers/src/http/auth.http +0 -27
- package/lib/routing-controllers/src/http/users.http +0 -34
- package/lib/routing-controllers/src/interfaces/auth.interface.ts +0 -15
- package/lib/routing-controllers/src/interfaces/users.interface.ts +0 -5
- package/lib/routing-controllers/src/middlewares/auth.middleware.ts +0 -38
- package/lib/routing-controllers/src/middlewares/error.middleware.ts +0 -15
- package/lib/routing-controllers/src/middlewares/validation.middleware.ts +0 -27
- package/lib/routing-controllers/src/models/users.model.ts +0 -9
- package/lib/routing-controllers/src/server.ts +0 -9
- package/lib/routing-controllers/src/services/auth.service.ts +0 -53
- package/lib/routing-controllers/src/services/users.service.ts +0 -52
- package/lib/routing-controllers/src/test/auth.test.ts +0 -49
- package/lib/routing-controllers/src/test/users.test.ts +0 -65
- package/lib/routing-controllers/src/utils/logger.ts +0 -65
- package/lib/routing-controllers/src/utils/validateEnv.ts +0 -8
- package/lib/routing-controllers/tsconfig.json +0 -38
- package/lib/sequelize/.dockerignore +0 -18
- package/lib/sequelize/.editorconfig +0 -9
- package/lib/sequelize/.env.development.local +0 -20
- package/lib/sequelize/.env.production.local +0 -20
- package/lib/sequelize/.env.test.local +0 -20
- package/lib/sequelize/.eslintignore +0 -1
- package/lib/sequelize/.eslintrc +0 -18
- package/lib/sequelize/.huskyrc +0 -5
- package/lib/sequelize/.lintstagedrc.json +0 -5
- package/lib/sequelize/.prettierrc +0 -8
- package/lib/sequelize/.sequelizerc +0 -8
- package/lib/sequelize/.swcrc +0 -40
- package/lib/sequelize/.vscode/launch.json +0 -35
- package/lib/sequelize/.vscode/settings.json +0 -6
- package/lib/sequelize/Dockerfile.dev +0 -23
- package/lib/sequelize/Dockerfile.prod +0 -23
- package/lib/sequelize/Makefile +0 -46
- package/lib/sequelize/docker-compose.yml +0 -55
- package/lib/sequelize/docker-entrypoint.sh +0 -5
- package/lib/sequelize/ecosystem.config.js +0 -57
- package/lib/sequelize/jest.config.js +0 -12
- package/lib/sequelize/nginx.conf +0 -40
- package/lib/sequelize/nodemon.json +0 -12
- package/lib/sequelize/package.json +0 -82
- package/lib/sequelize/src/app.ts +0 -87
- package/lib/sequelize/src/config/index.ts +0 -6
- package/lib/sequelize/src/config/sequelize-cli.js +0 -15
- package/lib/sequelize/src/controllers/auth.controller.ts +0 -45
- package/lib/sequelize/src/controllers/users.controller.ts +0 -64
- package/lib/sequelize/src/database/index.ts +0 -34
- package/lib/sequelize/src/database/migrations/.gitkeep +0 -0
- package/lib/sequelize/src/database/seeders/.gitkeep +0 -0
- package/lib/sequelize/src/dtos/users.dto.ts +0 -20
- package/lib/sequelize/src/exceptions/HttpException.ts +0 -10
- package/lib/sequelize/src/http/auth.http +0 -27
- package/lib/sequelize/src/http/users.http +0 -34
- package/lib/sequelize/src/interfaces/auth.interface.ts +0 -15
- package/lib/sequelize/src/interfaces/routes.interface.ts +0 -6
- package/lib/sequelize/src/interfaces/users.interface.ts +0 -5
- package/lib/sequelize/src/middlewares/auth.middleware.ts +0 -38
- package/lib/sequelize/src/middlewares/error.middleware.ts +0 -15
- package/lib/sequelize/src/middlewares/validation.middleware.ts +0 -27
- package/lib/sequelize/src/models/users.model.ts +0 -39
- package/lib/sequelize/src/routes/auth.route.ts +0 -21
- package/lib/sequelize/src/routes/users.route.ts +0 -23
- package/lib/sequelize/src/server.ts +0 -10
- package/lib/sequelize/src/services/auth.service.ts +0 -52
- package/lib/sequelize/src/services/users.service.ts +0 -50
- package/lib/sequelize/src/test/auth.test.ts +0 -71
- package/lib/sequelize/src/test/users.test.ts +0 -131
- package/lib/sequelize/src/utils/logger.ts +0 -65
- package/lib/sequelize/src/utils/validateEnv.ts +0 -8
- package/lib/sequelize/swagger.yaml +0 -123
- package/lib/sequelize/tsconfig.json +0 -40
- package/lib/starter.js +0 -262
- package/lib/typegoose/.dockerignore +0 -18
- package/lib/typegoose/.editorconfig +0 -9
- package/lib/typegoose/.env.development.local +0 -18
- package/lib/typegoose/.env.production.local +0 -18
- package/lib/typegoose/.env.test.local +0 -18
- package/lib/typegoose/.eslintignore +0 -1
- package/lib/typegoose/.eslintrc +0 -18
- package/lib/typegoose/.huskyrc +0 -5
- package/lib/typegoose/.lintstagedrc.json +0 -5
- package/lib/typegoose/.prettierrc +0 -8
- package/lib/typegoose/.swcrc +0 -40
- package/lib/typegoose/.vscode/launch.json +0 -35
- package/lib/typegoose/.vscode/settings.json +0 -6
- package/lib/typegoose/Dockerfile.dev +0 -19
- package/lib/typegoose/Dockerfile.prod +0 -19
- package/lib/typegoose/Makefile +0 -46
- package/lib/typegoose/docker-compose.yml +0 -55
- package/lib/typegoose/ecosystem.config.js +0 -57
- package/lib/typegoose/jest.config.js +0 -12
- package/lib/typegoose/nginx.conf +0 -40
- package/lib/typegoose/nodemon.json +0 -12
- package/lib/typegoose/package.json +0 -79
- package/lib/typegoose/src/app.ts +0 -90
- package/lib/typegoose/src/config/index.ts +0 -6
- package/lib/typegoose/src/controllers/auth.controller.ts +0 -44
- package/lib/typegoose/src/controllers/users.controller.ts +0 -63
- package/lib/typegoose/src/database/index.ts +0 -18
- package/lib/typegoose/src/dtos/users.dto.ts +0 -20
- package/lib/typegoose/src/exceptions/HttpException.ts +0 -10
- package/lib/typegoose/src/http/auth.http +0 -27
- package/lib/typegoose/src/http/users.http +0 -34
- package/lib/typegoose/src/interfaces/auth.interface.ts +0 -15
- package/lib/typegoose/src/interfaces/routes.interface.ts +0 -6
- package/lib/typegoose/src/interfaces/users.interface.ts +0 -5
- package/lib/typegoose/src/middlewares/auth.middleware.ts +0 -38
- package/lib/typegoose/src/middlewares/error.middleware.ts +0 -15
- package/lib/typegoose/src/middlewares/validation.middleware.ts +0 -27
- package/lib/typegoose/src/models/users.model.ts +0 -16
- package/lib/typegoose/src/routes/auth.route.ts +0 -21
- package/lib/typegoose/src/routes/users.route.ts +0 -23
- package/lib/typegoose/src/server.ts +0 -10
- package/lib/typegoose/src/services/auth.service.ts +0 -52
- package/lib/typegoose/src/services/users.service.ts +0 -55
- package/lib/typegoose/src/test/auth.test.ts +0 -83
- package/lib/typegoose/src/test/users.test.ts +0 -133
- package/lib/typegoose/src/utils/logger.ts +0 -65
- package/lib/typegoose/src/utils/validateEnv.ts +0 -8
- package/lib/typegoose/swagger.yaml +0 -120
- package/lib/typegoose/tsconfig.json +0 -40
- package/lib/typeorm/.dockerignore +0 -18
- package/lib/typeorm/.editorconfig +0 -9
- package/lib/typeorm/.env.development.local +0 -20
- package/lib/typeorm/.env.production.local +0 -20
- package/lib/typeorm/.env.test.local +0 -20
- package/lib/typeorm/.eslintignore +0 -1
- package/lib/typeorm/.eslintrc +0 -18
- package/lib/typeorm/.huskyrc +0 -5
- package/lib/typeorm/.lintstagedrc.json +0 -5
- package/lib/typeorm/.prettierrc +0 -8
- package/lib/typeorm/.swcrc +0 -40
- package/lib/typeorm/.vscode/launch.json +0 -35
- package/lib/typeorm/.vscode/settings.json +0 -6
- package/lib/typeorm/Dockerfile.dev +0 -19
- package/lib/typeorm/Dockerfile.prod +0 -19
- package/lib/typeorm/Makefile +0 -46
- package/lib/typeorm/docker-compose.yml +0 -57
- package/lib/typeorm/ecosystem.config.js +0 -57
- package/lib/typeorm/jest.config.js +0 -12
- package/lib/typeorm/nginx.conf +0 -40
- package/lib/typeorm/nodemon.json +0 -12
- package/lib/typeorm/package.json +0 -78
- package/lib/typeorm/src/app.ts +0 -87
- package/lib/typeorm/src/config/index.ts +0 -6
- package/lib/typeorm/src/controllers/auth.controller.ts +0 -44
- package/lib/typeorm/src/controllers/users.controller.ts +0 -63
- package/lib/typeorm/src/database/index.ts +0 -26
- package/lib/typeorm/src/database/migrations/.gitkeep +0 -0
- package/lib/typeorm/src/dtos/users.dto.ts +0 -20
- package/lib/typeorm/src/entities/users.entity.ts +0 -26
- package/lib/typeorm/src/exceptions/HttpException.ts +0 -10
- package/lib/typeorm/src/http/auth.http +0 -27
- package/lib/typeorm/src/http/users.http +0 -34
- package/lib/typeorm/src/interfaces/auth.interface.ts +0 -15
- package/lib/typeorm/src/interfaces/routes.interface.ts +0 -6
- package/lib/typeorm/src/interfaces/users.interface.ts +0 -5
- package/lib/typeorm/src/middlewares/auth.middleware.ts +0 -38
- package/lib/typeorm/src/middlewares/error.middleware.ts +0 -15
- package/lib/typeorm/src/middlewares/validation.middleware.ts +0 -27
- package/lib/typeorm/src/routes/auth.route.ts +0 -21
- package/lib/typeorm/src/routes/users.route.ts +0 -23
- package/lib/typeorm/src/server.ts +0 -10
- package/lib/typeorm/src/services/auth.service.ts +0 -54
- package/lib/typeorm/src/services/users.service.ts +0 -51
- package/lib/typeorm/src/test/auth.test.ts +0 -75
- package/lib/typeorm/src/test/users.test.ts +0 -136
- package/lib/typeorm/src/utils/logger.ts +0 -65
- package/lib/typeorm/src/utils/validateEnv.ts +0 -8
- package/lib/typeorm/swagger.yaml +0 -123
- /package/{lib → templates}/default/src/interfaces/routes.interface.ts +0 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
user nginx;
|
|
2
|
+
worker_processes 1;
|
|
3
|
+
|
|
4
|
+
error_log /var/log/nginx/error.log warn;
|
|
5
|
+
pid /var/run/nginx.pid;
|
|
6
|
+
|
|
7
|
+
events {
|
|
8
|
+
worker_connections 1024;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
http {
|
|
12
|
+
include /etc/nginx/mime.types;
|
|
13
|
+
default_type application/octet-stream;
|
|
14
|
+
|
|
15
|
+
# gzip compression (optional but recommended)
|
|
16
|
+
gzip on;
|
|
17
|
+
gzip_disable "msie6";
|
|
18
|
+
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
|
|
19
|
+
gzip_min_length 256;
|
|
20
|
+
|
|
21
|
+
upstream api-server {
|
|
22
|
+
server server:3000; # 여러 서버면 server api1:3000; server api2:3000; ...
|
|
23
|
+
keepalive 100;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
server {
|
|
27
|
+
listen 80;
|
|
28
|
+
server_name localhost;
|
|
29
|
+
|
|
30
|
+
# Health check endpoint
|
|
31
|
+
location /health {
|
|
32
|
+
return 200 'ok';
|
|
33
|
+
add_header Content-Type text/plain;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# Main reverse proxy for API
|
|
37
|
+
location / {
|
|
38
|
+
proxy_set_header Host $host;
|
|
39
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
40
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
41
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
42
|
+
proxy_http_version 1.1;
|
|
43
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
44
|
+
proxy_set_header Connection "upgrade";
|
|
45
|
+
proxy_pass http://api-server;
|
|
46
|
+
proxy_read_timeout 300;
|
|
47
|
+
proxy_connect_timeout 60;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
# (Optional) Static file serving example
|
|
51
|
+
# location /static/ {
|
|
52
|
+
# alias /app/public/;
|
|
53
|
+
# expires 30d;
|
|
54
|
+
# access_log off;
|
|
55
|
+
# }
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
|
59
|
+
'$status $body_bytes_sent "$http_referer" '
|
|
60
|
+
'"$http_user_agent" "$http_x_forwarded_for"';
|
|
61
|
+
|
|
62
|
+
access_log /var/log/nginx/access.log main;
|
|
63
|
+
|
|
64
|
+
sendfile on;
|
|
65
|
+
keepalive_timeout 65;
|
|
66
|
+
include /etc/nginx/conf.d/*.conf;
|
|
67
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const tseslint = require('typescript-eslint');
|
|
2
|
+
const globals = require('globals');
|
|
3
|
+
const eslintConfigPrettier = require('eslint-config-prettier');
|
|
4
|
+
|
|
5
|
+
module.exports = [
|
|
6
|
+
{ ignores: ['dist/', 'coverage/', 'logs/', 'node_modules/', '*.config.js', '*.config.ts', '.env', '.env.*', '!.eslintrc.js'] },
|
|
7
|
+
...tseslint.configs.recommended,
|
|
8
|
+
eslintConfigPrettier,
|
|
9
|
+
{
|
|
10
|
+
files: ['**/*.ts'],
|
|
11
|
+
languageOptions: {
|
|
12
|
+
ecmaVersion: 2022,
|
|
13
|
+
sourceType: 'commonjs',
|
|
14
|
+
globals: { ...globals.node, ...globals.es2022 },
|
|
15
|
+
},
|
|
16
|
+
rules: {
|
|
17
|
+
'@typescript-eslint/no-explicit-any': 'off',
|
|
18
|
+
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
|
19
|
+
'@typescript-eslint/ban-types': 'off',
|
|
20
|
+
'@typescript-eslint/no-var-requires': 'off',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
];
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Config } from 'jest';
|
|
2
|
+
import { pathsToModuleNameMapper } from 'ts-jest';
|
|
3
|
+
import { compilerOptions } from './tsconfig.json';
|
|
4
|
+
|
|
5
|
+
const config: Config = {
|
|
6
|
+
preset: 'ts-jest',
|
|
7
|
+
testEnvironment: 'node',
|
|
8
|
+
setupFiles: ['<rootDir>/src/test/setup.ts'],
|
|
9
|
+
roots: ['<rootDir>/src'],
|
|
10
|
+
transform: {
|
|
11
|
+
'^.+\\.tsx?$': 'ts-jest',
|
|
12
|
+
},
|
|
13
|
+
moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths || {}, {
|
|
14
|
+
prefix: '<rootDir>/src/',
|
|
15
|
+
}),
|
|
16
|
+
coverageDirectory: 'coverage',
|
|
17
|
+
collectCoverageFrom: [
|
|
18
|
+
'src/**/*.{ts,tsx}',
|
|
19
|
+
'!src/**/*.d.ts',
|
|
20
|
+
'!src/**/index.ts',
|
|
21
|
+
],
|
|
22
|
+
testPathIgnorePatterns: ['/node_modules/', '/dist/', '/logs/'],
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export default config;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import request from 'supertest';
|
|
2
|
+
import { createTestApp, resetUserDB } from '@/test/setup';
|
|
3
|
+
|
|
4
|
+
describe('Auth API', () => {
|
|
5
|
+
let server: any;
|
|
6
|
+
const prefix = '/api/v1';
|
|
7
|
+
|
|
8
|
+
beforeAll(() => {
|
|
9
|
+
server = createTestApp(); // Use shared repository for testing
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
resetUserDB(); // Reset repository before each test
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
const user = { email: 'authuser@example.com', password: 'authpassword123' };
|
|
17
|
+
|
|
18
|
+
it('should successfully register a new user', async () => {
|
|
19
|
+
const res = await request(server).post(`${prefix}/auth/signup`).send(user);
|
|
20
|
+
expect(res.statusCode).toBe(201);
|
|
21
|
+
expect(res.body.data.email).toBe(user.email);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('should login a user and set a cookie', async () => {
|
|
25
|
+
await request(server).post(`${prefix}/auth/signup`).send(user);
|
|
26
|
+
const res = await request(server).post(`${prefix}/auth/login`).send(user);
|
|
27
|
+
expect(res.statusCode).toBe(200);
|
|
28
|
+
expect(res.body.data.email).toBe(user.email);
|
|
29
|
+
expect(res.header['set-cookie']).toBeDefined();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('should logout a user', async () => {
|
|
33
|
+
await request(server).post(`${prefix}/auth/signup`).send(user);
|
|
34
|
+
const loginRes = await request(server).post(`${prefix}/auth/login`).send(user);
|
|
35
|
+
const cookie = loginRes.headers['set-cookie'];
|
|
36
|
+
const logoutRes = await request(server).post(`${prefix}/auth/logout`).set('Cookie', cookie[0]);
|
|
37
|
+
expect(logoutRes.statusCode).toBe(200);
|
|
38
|
+
expect(logoutRes.body.message).toBe('logout');
|
|
39
|
+
});
|
|
40
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import request from 'supertest';
|
|
2
|
+
import { createTestApp, resetUserDB } from '@/test/setup';
|
|
3
|
+
|
|
4
|
+
describe('Users API', () => {
|
|
5
|
+
let server: any;
|
|
6
|
+
const prefix = '/api/v1';
|
|
7
|
+
|
|
8
|
+
beforeAll(() => {
|
|
9
|
+
server = createTestApp(); // Initialize server with shared repository
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
resetUserDB(); // Reset repository before each test
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
const user = { email: 'user1@example.com', password: 'password123' };
|
|
17
|
+
|
|
18
|
+
it('should create a new user', async () => {
|
|
19
|
+
const res = await request(server).post(`${prefix}/users`).send(user);
|
|
20
|
+
expect(res.statusCode).toBe(201);
|
|
21
|
+
expect(res.body.data.email).toBe(user.email);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('should retrieve all users', async () => {
|
|
25
|
+
await request(server).post(`${prefix}/users`).send(user);
|
|
26
|
+
const res = await request(server).get(`${prefix}/users`);
|
|
27
|
+
expect(res.statusCode).toBe(200);
|
|
28
|
+
expect(Array.isArray(res.body.data)).toBe(true);
|
|
29
|
+
expect(res.body.data[0].email).toBe(user.email);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('should retrieve a user by id', async () => {
|
|
33
|
+
const createRes = await request(server).post(`${prefix}/users`).send(user);
|
|
34
|
+
const id = createRes.body.data.id;
|
|
35
|
+
|
|
36
|
+
const res = await request(server).get(`${prefix}/users/${id}`);
|
|
37
|
+
expect(res.statusCode).toBe(200);
|
|
38
|
+
expect(res.body.data.email).toBe(user.email);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('should update user information', async () => {
|
|
42
|
+
const createRes = await request(server).post(`${prefix}/users`).send(user);
|
|
43
|
+
const id = createRes.body.data.id;
|
|
44
|
+
|
|
45
|
+
const newPassword = 'newpassword123';
|
|
46
|
+
const res = await request(server).put(`${prefix}/users/${id}`).send({ password: newPassword });
|
|
47
|
+
expect(res.statusCode).toBe(200);
|
|
48
|
+
expect(res.body.data.id).toBe(id);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('should delete a user', async () => {
|
|
52
|
+
const createRes = await request(server).post(`${prefix}/users`).send(user);
|
|
53
|
+
const id = createRes.body.data.id;
|
|
54
|
+
|
|
55
|
+
const res = await request(server).delete(`${prefix}/users/${id}`);
|
|
56
|
+
expect(res.statusCode).toBe(204);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('should return 404 if user does not exist', async () => {
|
|
60
|
+
const res = await request(server).get(`${prefix}/users/invalid-id`);
|
|
61
|
+
expect(res.statusCode).toBe(404);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { container } from 'tsyringe';
|
|
3
|
+
import App from '@/app';
|
|
4
|
+
import { AuthRoute } from '@routes/auth.route';
|
|
5
|
+
import { UsersRoute } from '@routes/users.route';
|
|
6
|
+
import { UsersRepository, IUsersRepository } from '@repositories/users.repository';
|
|
7
|
+
|
|
8
|
+
let sharedRepo: UsersRepository;
|
|
9
|
+
|
|
10
|
+
export function createTestApp({ mockRepo }: { mockRepo?: IUsersRepository } = {}) {
|
|
11
|
+
// 항상 새로운 인스턴스를 주입하고 싶으면 reset logic 추가 필요
|
|
12
|
+
if (!sharedRepo) {
|
|
13
|
+
sharedRepo = new UsersRepository();
|
|
14
|
+
container.registerInstance(UsersRepository, sharedRepo);
|
|
15
|
+
}
|
|
16
|
+
// mockRepo가 있으면 주입
|
|
17
|
+
if (mockRepo) {
|
|
18
|
+
container.registerInstance(UsersRepository, mockRepo as UsersRepository);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// 클래스 타입을 직접 주입
|
|
22
|
+
const routes = [container.resolve(UsersRoute), container.resolve(AuthRoute)];
|
|
23
|
+
const appInstance = new App(routes);
|
|
24
|
+
return appInstance.getServer();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function resetUserDB() {
|
|
28
|
+
if (sharedRepo) {
|
|
29
|
+
sharedRepo.reset();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { User, type UserCreateData } from '@entities/user.entity';
|
|
2
|
+
|
|
3
|
+
describe('User Entity', () => {
|
|
4
|
+
const validUserData: UserCreateData = {
|
|
5
|
+
email: 'test@example.com',
|
|
6
|
+
password: 'password123',
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
describe('create', () => {
|
|
10
|
+
it('should create a new user with valid data', async () => {
|
|
11
|
+
const user = await User.create(validUserData);
|
|
12
|
+
|
|
13
|
+
expect(user.id).toBeDefined();
|
|
14
|
+
expect(user.id).toMatch(/^user_/);
|
|
15
|
+
expect(user.email).toBe('test@example.com');
|
|
16
|
+
expect(user.password).not.toBe('password123'); // should be hashed
|
|
17
|
+
expect(user.createdAt).toBeInstanceOf(Date);
|
|
18
|
+
expect(user.updatedAt).toBeInstanceOf(Date);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('should normalize email to lowercase', async () => {
|
|
22
|
+
const user = await User.create({ ...validUserData, email: 'TEST@EXAMPLE.COM' });
|
|
23
|
+
expect(user.email).toBe('test@example.com');
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('should throw error for invalid email format', async () => {
|
|
27
|
+
await expect(User.create({ ...validUserData, email: 'invalid-email' })).rejects.toThrow(
|
|
28
|
+
'Invalid email format',
|
|
29
|
+
);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('should throw error for empty email', async () => {
|
|
33
|
+
await expect(User.create({ ...validUserData, email: '' })).rejects.toThrow(
|
|
34
|
+
'Email is required',
|
|
35
|
+
);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('should throw error for too long email', async () => {
|
|
39
|
+
const longEmail = 'a'.repeat(250) + '@example.com';
|
|
40
|
+
await expect(User.create({ ...validUserData, email: longEmail })).rejects.toThrow(
|
|
41
|
+
'Email is too long',
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('should throw error for short password', async () => {
|
|
46
|
+
await expect(User.create({ ...validUserData, password: '123' })).rejects.toThrow(
|
|
47
|
+
'Password must be at least 8 characters long',
|
|
48
|
+
);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('should throw error for password without number', async () => {
|
|
52
|
+
await expect(User.create({ ...validUserData, password: 'onlyletters' })).rejects.toThrow(
|
|
53
|
+
'Password must contain at least one letter and one number',
|
|
54
|
+
);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('should throw error for password without letter', async () => {
|
|
58
|
+
await expect(User.create({ ...validUserData, password: '12345678' })).rejects.toThrow(
|
|
59
|
+
'Password must contain at least one letter and one number',
|
|
60
|
+
);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('should throw error for too long password', async () => {
|
|
64
|
+
const longPassword = 'a'.repeat(130) + '123'; // 133 chars, exceeds 128 limit
|
|
65
|
+
await expect(User.create({ ...validUserData, password: longPassword })).rejects.toThrow(
|
|
66
|
+
'Password is too long',
|
|
67
|
+
);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
describe('fromPersistence', () => {
|
|
72
|
+
it('should restore user from persistence data', () => {
|
|
73
|
+
const persistenceData = {
|
|
74
|
+
id: 'user_123',
|
|
75
|
+
email: 'test@example.com',
|
|
76
|
+
password: 'hashedpassword',
|
|
77
|
+
createdAt: new Date('2025-01-01'),
|
|
78
|
+
updatedAt: new Date('2025-01-02'),
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const user = User.fromPersistence(persistenceData);
|
|
82
|
+
|
|
83
|
+
expect(user.id).toBe('user_123');
|
|
84
|
+
expect(user.email).toBe('test@example.com');
|
|
85
|
+
expect(user.password).toBe('hashedpassword');
|
|
86
|
+
expect(user.createdAt).toEqual(new Date('2025-01-01'));
|
|
87
|
+
expect(user.updatedAt).toEqual(new Date('2025-01-02'));
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('should use default dates if not provided', () => {
|
|
91
|
+
const persistenceData = {
|
|
92
|
+
id: 'user_123',
|
|
93
|
+
email: 'test@example.com',
|
|
94
|
+
password: 'hashedpassword',
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const user = User.fromPersistence(persistenceData);
|
|
98
|
+
|
|
99
|
+
expect(user.createdAt).toBeInstanceOf(Date);
|
|
100
|
+
expect(user.updatedAt).toBeInstanceOf(Date);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
describe('changeEmail', () => {
|
|
105
|
+
it('should change email and update timestamp', async () => {
|
|
106
|
+
const user = await User.create(validUserData);
|
|
107
|
+
const originalUpdatedAt = user.updatedAt;
|
|
108
|
+
|
|
109
|
+
// Wait a bit to ensure timestamp difference
|
|
110
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
111
|
+
|
|
112
|
+
await user.changeEmail('new@example.com');
|
|
113
|
+
|
|
114
|
+
expect(user.email).toBe('new@example.com');
|
|
115
|
+
expect(user.updatedAt.getTime()).toBeGreaterThan(originalUpdatedAt.getTime());
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it('should validate new email format', async () => {
|
|
119
|
+
const user = await User.create(validUserData);
|
|
120
|
+
|
|
121
|
+
await expect(user.changeEmail('invalid-email')).rejects.toThrow('Invalid email format');
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
describe('changePassword', () => {
|
|
126
|
+
it('should change password and update timestamp', async () => {
|
|
127
|
+
const user = await User.create(validUserData);
|
|
128
|
+
const originalPassword = user.password;
|
|
129
|
+
const originalUpdatedAt = user.updatedAt;
|
|
130
|
+
|
|
131
|
+
// Wait a bit to ensure timestamp difference
|
|
132
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
133
|
+
|
|
134
|
+
await user.changePassword('newpassword123');
|
|
135
|
+
|
|
136
|
+
expect(user.password).not.toBe(originalPassword);
|
|
137
|
+
expect(user.password).not.toBe('newpassword123'); // should be hashed
|
|
138
|
+
expect(user.updatedAt.getTime()).toBeGreaterThan(originalUpdatedAt.getTime());
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it('should validate new password', async () => {
|
|
142
|
+
const user = await User.create(validUserData);
|
|
143
|
+
|
|
144
|
+
await expect(user.changePassword('123')).rejects.toThrow(
|
|
145
|
+
'Password must be at least 8 characters long',
|
|
146
|
+
);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
describe('verifyPassword', () => {
|
|
151
|
+
it('should verify correct password', async () => {
|
|
152
|
+
const user = await User.create(validUserData);
|
|
153
|
+
|
|
154
|
+
const isValid = await user.verifyPassword('password123');
|
|
155
|
+
expect(isValid).toBe(true);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it('should reject incorrect password', async () => {
|
|
159
|
+
const user = await User.create(validUserData);
|
|
160
|
+
|
|
161
|
+
const isValid = await user.verifyPassword('wrongpassword');
|
|
162
|
+
expect(isValid).toBe(false);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe('updateProfile', () => {
|
|
167
|
+
it('should update email only', async () => {
|
|
168
|
+
const user = await User.create(validUserData);
|
|
169
|
+
const originalPassword = user.password;
|
|
170
|
+
|
|
171
|
+
await user.updateProfile({ email: 'updated@example.com' });
|
|
172
|
+
|
|
173
|
+
expect(user.email).toBe('updated@example.com');
|
|
174
|
+
expect(user.password).toBe(originalPassword); // unchanged
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it('should update password only', async () => {
|
|
178
|
+
const user = await User.create(validUserData);
|
|
179
|
+
const originalEmail = user.email;
|
|
180
|
+
const originalPassword = user.password;
|
|
181
|
+
|
|
182
|
+
await user.updateProfile({ password: 'newpassword456' });
|
|
183
|
+
|
|
184
|
+
expect(user.email).toBe(originalEmail); // unchanged
|
|
185
|
+
expect(user.password).not.toBe(originalPassword);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('should update both email and password', async () => {
|
|
189
|
+
const user = await User.create(validUserData);
|
|
190
|
+
const originalPassword = user.password;
|
|
191
|
+
|
|
192
|
+
await user.updateProfile({
|
|
193
|
+
email: 'both@example.com',
|
|
194
|
+
password: 'bothupdate789',
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
expect(user.email).toBe('both@example.com');
|
|
198
|
+
expect(user.password).not.toBe(originalPassword);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it('should not update timestamp if no changes', async () => {
|
|
202
|
+
const user = await User.create(validUserData);
|
|
203
|
+
const originalUpdatedAt = user.updatedAt;
|
|
204
|
+
|
|
205
|
+
await user.updateProfile({ email: user.email }); // same email
|
|
206
|
+
|
|
207
|
+
expect(user.updatedAt.getTime()).toBe(originalUpdatedAt.getTime());
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
describe('toPersistence', () => {
|
|
212
|
+
it('should return persistence data format', async () => {
|
|
213
|
+
const user = await User.create(validUserData);
|
|
214
|
+
const persistenceData = user.toPersistence();
|
|
215
|
+
|
|
216
|
+
expect(persistenceData).toEqual({
|
|
217
|
+
id: user.id,
|
|
218
|
+
email: user.email,
|
|
219
|
+
password: user.password,
|
|
220
|
+
createdAt: user.createdAt,
|
|
221
|
+
updatedAt: user.updatedAt,
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
describe('toResponse', () => {
|
|
227
|
+
it('should return response format without password', async () => {
|
|
228
|
+
const user = await User.create(validUserData);
|
|
229
|
+
const responseData = user.toResponse();
|
|
230
|
+
|
|
231
|
+
expect(responseData).toEqual({
|
|
232
|
+
id: user.id,
|
|
233
|
+
email: user.email,
|
|
234
|
+
createdAt: user.createdAt,
|
|
235
|
+
updatedAt: user.updatedAt,
|
|
236
|
+
});
|
|
237
|
+
expect(responseData).not.toHaveProperty('password');
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
describe('equals', () => {
|
|
242
|
+
it('should return true for same user ID', async () => {
|
|
243
|
+
const userData1 = { ...validUserData };
|
|
244
|
+
const userData2 = { ...validUserData, email: 'different@example.com' };
|
|
245
|
+
|
|
246
|
+
const user1 = await User.create(userData1);
|
|
247
|
+
const user2 = User.fromPersistence({
|
|
248
|
+
id: user1.id,
|
|
249
|
+
email: userData2.email,
|
|
250
|
+
password: 'different',
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
expect(user1.equals(user2)).toBe(true);
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
it('should return false for different user ID', async () => {
|
|
257
|
+
const user1 = await User.create(validUserData);
|
|
258
|
+
const user2 = await User.create({ ...validUserData, email: 'other@example.com' });
|
|
259
|
+
|
|
260
|
+
expect(user1.equals(user2)).toBe(false);
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
describe('defensive copying', () => {
|
|
265
|
+
it('should return defensive copies of dates', async () => {
|
|
266
|
+
const user = await User.create(validUserData);
|
|
267
|
+
|
|
268
|
+
const createdAt1 = user.createdAt;
|
|
269
|
+
const createdAt2 = user.createdAt;
|
|
270
|
+
|
|
271
|
+
expect(createdAt1).not.toBe(createdAt2); // different instances
|
|
272
|
+
expect(createdAt1.getTime()).toBe(createdAt2.getTime()); // same time
|
|
273
|
+
|
|
274
|
+
// Modifying returned date should not affect internal state
|
|
275
|
+
createdAt1.setTime(0);
|
|
276
|
+
expect(user.createdAt.getTime()).not.toBe(0);
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { compare, hash } from 'bcryptjs';
|
|
2
|
+
import { CreateUserDto } from '@dtos/users.dto';
|
|
3
|
+
import { User } from '@entities/user.entity';
|
|
4
|
+
import { UsersRepository } from '@repositories/users.repository';
|
|
5
|
+
import { AuthService } from '@services/auth.service';
|
|
6
|
+
|
|
7
|
+
describe('AuthService (with UserMemoryRepository)', () => {
|
|
8
|
+
let authService: AuthService;
|
|
9
|
+
let userRepo: UsersRepository;
|
|
10
|
+
|
|
11
|
+
beforeEach(async () => {
|
|
12
|
+
userRepo = new UsersRepository();
|
|
13
|
+
authService = new AuthService(userRepo);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('should sign up a new user', async () => {
|
|
17
|
+
const dto: CreateUserDto = {
|
|
18
|
+
email: 'newuser@example.com',
|
|
19
|
+
password: 'newpassword123',
|
|
20
|
+
};
|
|
21
|
+
const created = await authService.signup(dto);
|
|
22
|
+
expect(created.email).toBe(dto.email);
|
|
23
|
+
|
|
24
|
+
const found = await userRepo.findByEmail(dto.email);
|
|
25
|
+
expect(found).toBeDefined();
|
|
26
|
+
expect(await compare(dto.password, found!.password)).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('should throw an error if email is already in use', async () => {
|
|
30
|
+
// First create a user
|
|
31
|
+
const existingUser = await User.create({
|
|
32
|
+
email: 'existing@example.com',
|
|
33
|
+
password: 'password123',
|
|
34
|
+
});
|
|
35
|
+
await userRepo.save(existingUser);
|
|
36
|
+
|
|
37
|
+
const dto: CreateUserDto = {
|
|
38
|
+
email: 'existing@example.com',
|
|
39
|
+
password: 'anypass1',
|
|
40
|
+
};
|
|
41
|
+
await expect(authService.signup(dto)).rejects.toThrow(/already/);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it('should return user and cookie on successful login', async () => {
|
|
45
|
+
// Create user using Entity
|
|
46
|
+
const plainPassword = 'mySecret123';
|
|
47
|
+
const email = 'loginuser@example.com';
|
|
48
|
+
const user = await User.create({ email, password: plainPassword });
|
|
49
|
+
await userRepo.save(user);
|
|
50
|
+
|
|
51
|
+
const result = await authService.login({ email, password: plainPassword });
|
|
52
|
+
expect(result.user.email).toBe(email);
|
|
53
|
+
expect(result.cookie).toContain('Authorization=');
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('should throw an error if email or password is incorrect', async () => {
|
|
57
|
+
// Non-existing email
|
|
58
|
+
await expect(
|
|
59
|
+
authService.login({ email: 'nobody@example.com', password: 'wrongpass1' }),
|
|
60
|
+
).rejects.toThrow(/Invalid email or password/i);
|
|
61
|
+
|
|
62
|
+
// Create user and test wrong password
|
|
63
|
+
const user = await User.create({ email: 'test@example.com', password: 'correctpass1' });
|
|
64
|
+
await userRepo.save(user);
|
|
65
|
+
|
|
66
|
+
await expect(
|
|
67
|
+
authService.login({ email: 'test@example.com', password: 'wrongpass2' }),
|
|
68
|
+
).rejects.toThrow(/password/i);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it('should successfully logout without errors', async () => {
|
|
72
|
+
const user = await User.create({ email: 'logout@example.com', password: 'password123' });
|
|
73
|
+
await expect(authService.logout(user)).resolves.toBeUndefined();
|
|
74
|
+
});
|
|
75
|
+
});
|