diff --git a/packages/server/src/application/Application.ts b/packages/server/src/application/Application.ts index f1cbc52..98141dc 100644 --- a/packages/server/src/application/Application.ts +++ b/packages/server/src/application/Application.ts @@ -12,10 +12,12 @@ import {IDatabase} from '../database/IDatabase' import {ILogger} from '../logger/ILogger' import {IRoutes} from '@rondo/common' import {ITransactionManager} from '../database/ITransactionManager' +import {DB} from '../database/DB' import {loggerFactory, LoggerFactory} from '../logger/LoggerFactory' import {json} from 'body-parser' export class Application implements IApplication { + readonly db: DB readonly transactionManager: ITransactionManager readonly server: express.Application @@ -29,7 +31,8 @@ export class Application implements IApplication { constructor(readonly config: IConfig, readonly database: IDatabase) { this.transactionManager = database.transactionManager - this.userService = new services.UserService(this.transactionManager) + this.db = new DB(this.transactionManager) + this.userService = new services.UserService(this.db) this.teamService = new team.TeamService(this.transactionManager) this.userPermissions = new user.UserPermissions(this.transactionManager) diff --git a/packages/server/src/database/DB.ts b/packages/server/src/database/DB.ts new file mode 100644 index 0000000..c8b442d --- /dev/null +++ b/packages/server/src/database/DB.ts @@ -0,0 +1,21 @@ +import { + EntityManager, + EntitySchema, + ObjectType, + Repository, +} from 'typeorm' +import {ITransactionManager} from '../database/ITransactionManager' + +export class DB { + constructor(protected readonly transactionManager: ITransactionManager) {} + + getEntityManager(): EntityManager { + return this.transactionManager.getEntityManager() + } + + getRepository( + target: ObjectType | EntitySchema | string, + ): Repository { + return this.transactionManager.getRepository(target) + } +} diff --git a/packages/server/src/database/index.ts b/packages/server/src/database/index.ts index 59ba1d2..b11ee84 100644 --- a/packages/server/src/database/index.ts +++ b/packages/server/src/database/index.ts @@ -2,3 +2,4 @@ export * from './ITransactionManager' export * from './TransactionManager' export * from './IDatabase' export * from './Database' +export * from './DB' diff --git a/packages/server/src/services/UserService.test.ts b/packages/server/src/services/UserService.test.ts index efdb3c4..36bf518 100644 --- a/packages/server/src/services/UserService.test.ts +++ b/packages/server/src/services/UserService.test.ts @@ -8,7 +8,7 @@ describe('UserService', () => { const username = 'test@user.com' const password = '1234567890' - const userService = new UserService(test.transactionManager) + const userService = new UserService(test.db) async function createUser(u = username, p = password) { return userService.createUser({ diff --git a/packages/server/src/services/UserService.ts b/packages/server/src/services/UserService.ts index 3b574c6..07f4e68 100644 --- a/packages/server/src/services/UserService.ts +++ b/packages/server/src/services/UserService.ts @@ -1,5 +1,6 @@ import createError from 'http-errors' import {BaseService} from './BaseService' +import {DB} from '../database/DB' import {ICredentials, INewUser, IUser, trim} from '@rondo/common' import {IUserService} from './IUserService' import {UserEmail} from '../entities/UserEmail' @@ -11,7 +12,9 @@ import {Validator} from '../validator' const SALT_ROUNDS = 10 const MIN_PASSWORD_LENGTH = 10 -export class UserService extends BaseService implements IUserService { +export class UserService implements IUserService { + constructor(protected readonly db: DB) {} + async createUser(payload: INewUser): Promise { const newUser = { username: trim(payload.username), @@ -34,11 +37,11 @@ export class UserService extends BaseService implements IUserService { .throw() const password = await this.hash(payload.password) - const user = await this.getRepository(User).save({ + const user = await this.db.getRepository(User).save({ ...newUser, password, }) - await this.getRepository(UserEmail).save({ + await this.db.getRepository(UserEmail).save({ email: newUser.username, userId: user.id, }) @@ -49,7 +52,7 @@ export class UserService extends BaseService implements IUserService { } async findOne(id: number) { - const user = await this.getRepository(User).findOne(id, { + const user = await this.db.getRepository(User).findOne(id, { relations: ['emails'], }) @@ -66,7 +69,7 @@ export class UserService extends BaseService implements IUserService { } async findUserByEmail(email: string) { - const userEmail = await this.getRepository(UserEmail) + const userEmail = await this.db.getRepository(UserEmail) .findOne({ email }, { relations: ['user'], }) @@ -91,7 +94,7 @@ export class UserService extends BaseService implements IUserService { newPassword: string, }) { const {userId, oldPassword, newPassword} = params - const userRepository = this.getRepository(User) + const userRepository = this.db.getRepository(User) const user = await userRepository .createQueryBuilder('user') .select('user') @@ -109,7 +112,7 @@ export class UserService extends BaseService implements IUserService { async validateCredentials(credentials: ICredentials) { const {username, password} = credentials - const user = await this.getRepository(User) + const user = await this.db.getRepository(User) .createQueryBuilder('user') .select('user') .addSelect('user.password') @@ -131,7 +134,7 @@ export class UserService extends BaseService implements IUserService { } async findUserEmails(userId: number) { - return this.getRepository(UserEmail).find({ userId }) + return this.db.getRepository(UserEmail).find({ userId }) } protected async hash(password: string): Promise { diff --git a/packages/server/src/test-utils/TestUtils.ts b/packages/server/src/test-utils/TestUtils.ts index b283784..c688df0 100644 --- a/packages/server/src/test-utils/TestUtils.ts +++ b/packages/server/src/test-utils/TestUtils.ts @@ -1,6 +1,7 @@ import express from 'express' import supertest from 'supertest' import {Connection, QueryRunner} from 'typeorm' +import {DB} from '../database/DB' import { ENTITY_MANAGER, ITransactionManager, } from '../database/ITransactionManager' @@ -16,11 +17,13 @@ export class TestUtils { readonly app: express.Application readonly context: string readonly transactionManager: ITransactionManager + readonly db: DB constructor(readonly bootstrap: IBootstrap) { this.app = bootstrap.application.server this.context = this.bootstrap.getConfig().app.context this.transactionManager = this.bootstrap.database.transactionManager + this.db = new DB(this.transactionManager) } /**