Skip to content

Instantly share code, notes, and snippets.

@QuadradS
Last active February 17, 2020 11:22
Show Gist options
  • Save QuadradS/27f683ffaa50164d889e1825d1fe6c6c to your computer and use it in GitHub Desktop.
Save QuadradS/27f683ffaa50164d889e1825d1fe6c6c to your computer and use it in GitHub Desktop.
example of user repository
import { UserPhotoResponseDTO, UserSearchDTO } from 'goin-shared'
import { DeepPartial, EntityManager, EntityRepository, Repository } from 'typeorm'
import { UsersRepository } from '../index'
import UserModel from '../../models/user'
import { RepositoryByName } from '../../annotations/di'
import Injectables from '../../enums/injectables'
@RepositoryByName(Injectables.repos.users)
@EntityRepository(UserModel)
export default class DefaultUsersRepository extends Repository<UserModel> implements UsersRepository {
async createOrUpdateOne(entityLike: DeepPartial<UserModel>, entityManager?: EntityManager): Promise<UserModel> {
const entity = this.create(entityLike)
return entityManager ? await entityManager.save(entity) : await this.save(entity)
}
async doesExistById(id: string): Promise<boolean> {
return await this.count({ where: { id } }) >= 1
}
async findOneById(id: string): Promise<UserModel | undefined> {
return await this.createQueryBuilder('users')
.where('users.id = :id', { id })
.andWhere('users.isDeleted = :isDeleted', { isDeleted: false })
.andWhere('users.isActive = :isActive', { isActive: true })
.leftJoinAndSelect('users.email', 'user_emails')
.leftJoinAndSelect('users.phones', 'user_phones')
.leftJoinAndSelect('users.rolesInApp', 'user_roles')
.leftJoinAndSelect('users.info', 'user_info')
.getOne()
}
async findManyByIds(ids: string[]): Promise<UserModel[]> {
return await this.createQueryBuilder('users')
.whereInIds(ids)
.andWhere('users.isDeleted = :isDeleted', { isDeleted: false })
.andWhere('users.isActive = :isActive', { isActive: true })
.leftJoinAndSelect('users.email', 'user_emails')
.leftJoinAndSelect('users.phones', 'user_phones')
.leftJoinAndSelect('users.info', 'user_info')
.getMany()
}
async findOneByIdWithPassword(id: string): Promise<UserModel | undefined> {
return await this.createQueryBuilder('users')
.where('users.id = :id', { id })
.andWhere('users.isDeleted = :isDeleted', { isDeleted: false })
.andWhere('users.isActive = :isActive', { isActive: true })
.addSelect('users.password')
.leftJoinAndSelect('users.email', 'user_emails')
.leftJoinAndSelect('users.phones', 'user_phones')
.leftJoinAndSelect('users.rolesInApp', 'user_roles')
.leftJoinAndSelect('users.info', 'user_info')
.getOne()
}
async findOneByEmail(emailAddress: string): Promise<UserModel | undefined> {
return await this.createQueryBuilder('users')
.innerJoinAndSelect('users.email', 'user_emails')
.where('LOWER(email_address) = LOWER(:emailAddress)', { emailAddress })
.andWhere('users.isDeleted = :isDeleted', { isDeleted: false })
.andWhere('users.isActive = :isActive', { isActive: true })
.leftJoinAndSelect('users.phones', 'user_phones')
.leftJoinAndSelect('users.rolesInApp', 'user_roles')
.leftJoinAndSelect('users.info', 'user_info')
.getOne()
}
async findOneByEmailWithPassword(emailAddress: string): Promise<UserModel | undefined> {
return await this.createQueryBuilder('users')
.innerJoinAndSelect('users.email', 'user_emails')
.where('LOWER(email_address) = LOWER(:emailAddress)', { emailAddress })
.andWhere('users.isDeleted = :isDeleted', { isDeleted: false })
.andWhere('users.isActive = :isActive', { isActive: true })
.addSelect('users.password')
.leftJoinAndSelect('users.phones', 'user_phones')
.leftJoinAndSelect('users.rolesInApp', 'user_roles')
.leftJoinAndSelect('users.info', 'user_info')
.getOne()
}
async findOneByEmailOrUsernameWithPassword(emailOrUsername: string): Promise<UserModel | undefined> {
return await this.createQueryBuilder('users')
.where('LOWER(email_address) = LOWER(:emailOrUsername)', { emailOrUsername })
.orWhere('LOWER(users.username) = LOWER(:emailOrUsername)', { emailOrUsername })
.andWhere('users.isDeleted = :isDeleted', { isDeleted: false })
.andWhere('users.isActive = :isActive', { isActive: true })
.addSelect('users.password')
.leftJoinAndSelect('users.email', 'user_emails')
.leftJoinAndSelect('users.phones', 'user_phones')
.leftJoinAndSelect('users.rolesInApp', 'user_roles')
.leftJoinAndSelect('users.info', 'user_info')
.getOne()
}
async findOneByPhoneId(phoneId: number): Promise<UserModel | undefined> {
return await this.createQueryBuilder('users')
.innerJoinAndSelect('users.phones', 'user_phones')
.where('user_phones.id = :id', { id: phoneId })
.andWhere('users.isDeleted = :isDeleted', { isDeleted: false })
.andWhere('users.isActive = :isActive', { isActive: true })
.leftJoinAndSelect('users.email', 'user_emails')
.leftJoinAndSelect('users.rolesInApp', 'user_roles')
.leftJoinAndSelect('users.info', 'user_info')
.getOne()
}
async findOneByPhoneNumber(countryCode: string, phoneNumber: string): Promise<UserModel | undefined> {
return await this.createQueryBuilder('users')
.innerJoinAndSelect('users.phones', 'user_phones')
.where('user_phones.country_code = :countryCode', { countryCode })
.andWhere('user_phones.phone_number = :phoneNumber', { phoneNumber })
.andWhere('users.isDeleted = :isDeleted', { isDeleted: false })
.andWhere('users.isActive = :isActive', { isActive: true })
.leftJoinAndSelect('users.email', 'user_emails')
.leftJoinAndSelect('users.rolesInApp', 'user_roles')
.leftJoinAndSelect('users.info', 'user_info')
.getOne()
}
async search(dto: UserSearchDTO): Promise<UserModel[]> {
const queryBuilder = this.createQueryBuilder('users')
.innerJoinAndSelect('users.phones', 'user_phones')
if (dto.fullName) {
queryBuilder.orWhere(
'users.first_name || \' \' || users.last_name ILIKE :fullName', {
fullName: `%${dto.fullName}%`
})
}
if (dto.fullPhoneNumber) {
queryBuilder.orWhere(
'user_phones.country_code || user_phones.phone_number LIKE :fullPhoneNumber', {
fullPhoneNumber: `%${dto.fullPhoneNumber}%`
})
}
if (dto.firstName) {
queryBuilder.andWhere('users.first_name ILIKE :firstName', { firstName: `%${dto.firstName}%` })
}
if (dto.lastName) {
queryBuilder.andWhere('users.last_name ILIKE :lastName', { lastName: `%${dto.lastName}%` })
}
if (dto.ids && !!dto.ids.length) {
queryBuilder.andWhere('users.id IN (:...ids)', { ids: dto.ids })
}
return queryBuilder.leftJoinAndSelect('users.email', 'user_emails')
.leftJoinAndSelect('users.rolesInApp', 'user_roles')
.leftJoinAndSelect('users.info', 'user_info')
.getMany()
}
async updateUserPassword(userId: string, password: string): Promise<void> {
await this.createQueryBuilder()
.update()
.set({ password })
.where('id = :id', { id: userId })
.execute()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment