-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
14 changed files
with
173 additions
and
51 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,4 @@ | ||
export interface WelcomeTemplateProps extends BaseEmailTemplatesProps { | ||
firstName: string; | ||
link: string; | ||
} | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
import { CreateDateColumn, PrimaryGeneratedColumn } from 'typeorm'; | ||
|
||
export abstract class BaseEntity { | ||
@PrimaryGeneratedColumn('uuid') | ||
public id: string; | ||
|
||
@CreateDateColumn({ | ||
type: 'timestamp', | ||
}) | ||
public createdAt: number; | ||
|
||
@CreateDateColumn({ | ||
type: 'timestamp', | ||
}) | ||
public updatedAt: number; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
19 changes: 19 additions & 0 deletions
19
packages/api/src/modules/database/migrations/1616345466388-AddBaseEntity.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
import { MigrationInterface, QueryRunner } from 'typeorm'; | ||
|
||
export class AddBaseEntity1616345466388 implements MigrationInterface { | ||
name = 'AddBaseEntity1616345466388'; | ||
|
||
public async up(queryRunner: QueryRunner): Promise<void> { | ||
await queryRunner.query( | ||
'ALTER TABLE "invitations" ADD "updatedAt" TIMESTAMP NOT NULL DEFAULT now()', | ||
); | ||
await queryRunner.query( | ||
'ALTER TABLE "refresh_tokens" ADD "updatedAt" TIMESTAMP NOT NULL DEFAULT now()', | ||
); | ||
} | ||
|
||
public async down(queryRunner: QueryRunner): Promise<void> { | ||
await queryRunner.query('ALTER TABLE "refresh_tokens" DROP COLUMN "updatedAt"'); | ||
await queryRunner.query('ALTER TABLE "invitations" DROP COLUMN "updatedAt"'); | ||
} | ||
} |
4 changes: 2 additions & 2 deletions
4
packages/api/src/modules/password-reset/password-reset.module.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
import { Type } from '@nestjs/common'; | ||
import { InjectRepository } from '@nestjs/typeorm'; | ||
import { DeepPartial, FindManyOptions, FindOneOptions, Repository } from 'typeorm'; | ||
|
||
import { BaseEntity } from '../database/entities/base.entity'; | ||
|
||
export interface BaseRepositoryType<T> { | ||
readonly repository: Repository<T>; | ||
|
||
create: (dataToCreate: DeepPartial<T>) => Promise<T>; | ||
|
||
findById: (id: string) => Promise<T | undefined>; | ||
findByIdOrFail: (id: string) => Promise<T>; | ||
|
||
findOne: (options: FindOneOptions) => Promise<T | undefined>; | ||
findOneOrFail: (options: FindOneOptions) => Promise<T>; | ||
|
||
find: (options: FindManyOptions) => Promise<T[]>; | ||
|
||
update: (id: string, dataToUpdate: DeepPartial<T>) => Promise<T>; | ||
} | ||
|
||
type Constructor<T> = new (...args: never[]) => T; | ||
|
||
export function BaseRepository<T extends BaseEntity>( | ||
entityType: Constructor<T>, | ||
): Type<BaseRepositoryType<T>> { | ||
class BaseRepositoryHost implements BaseRepositoryType<T> { | ||
@InjectRepository(entityType) | ||
public readonly repository: Repository<T>; | ||
|
||
async create(dataToCreate: DeepPartial<T>): Promise<T> { | ||
try { | ||
return this.repository.save(dataToCreate); | ||
} catch (err) { | ||
throw new Error(`Cannot create entity with data ${dataToCreate}`); | ||
} | ||
} | ||
|
||
async findById(id: string): Promise<T | undefined> { | ||
return this.repository.findOne({ where: { id } }); | ||
} | ||
|
||
async findByIdOrFail(id: string): Promise<T> { | ||
try { | ||
return this.repository.findOneOrFail({ where: { id } }); | ||
} catch (err) { | ||
throw new Error(`Entity with id: '${id}' dose not exists!`); | ||
} | ||
} | ||
|
||
async findOne(options: FindOneOptions): Promise<T | undefined> { | ||
return this.repository.findOne(options); | ||
} | ||
|
||
async findOneOrFail(options: FindOneOptions): Promise<T> { | ||
return this.repository.findOneOrFail(options); | ||
} | ||
|
||
async find(options: FindManyOptions): Promise<T[]> { | ||
return this.repository.find(options); | ||
} | ||
|
||
async update(id: string, dataToUpdate: DeepPartial<T>): Promise<T> { | ||
const entityToUpdate: DeepPartial<T> = { | ||
id, | ||
...dataToUpdate, | ||
updatedAt: new Date(), | ||
}; | ||
|
||
try { | ||
return await this.repository.save(entityToUpdate); | ||
} catch (err) { | ||
throw new Error( | ||
`Entity with id: '${id}' cannot be updated with data: '${JSON.stringify( | ||
entityToUpdate, | ||
)}'`, | ||
); | ||
} | ||
} | ||
} | ||
|
||
return BaseRepositoryHost; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
import { InvitationEntity } from '../database/entities/invitation.entity'; | ||
import { BaseRepository } from './base.repository'; | ||
|
||
export class InvitationRepository extends BaseRepository(InvitationEntity) {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
import { Module } from '@nestjs/common'; | ||
import { TypeOrmModule } from '@nestjs/typeorm'; | ||
|
||
import entities from '../database/entities'; | ||
import { InvitationRepository } from './invitation.repository'; | ||
import { UserRepository } from './user.repository'; | ||
|
||
@Module({ | ||
imports: [TypeOrmModule.forFeature(entities)], | ||
providers: [UserRepository, InvitationRepository], | ||
exports: [UserRepository, InvitationRepository], | ||
}) | ||
export class RepositoryModule {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
import { UserEntity } from '../database/entities/user.entity'; | ||
import { BaseRepository } from './base.repository'; | ||
|
||
export class UserRepository extends BaseRepository(UserEntity) { | ||
async findOneByEmail(email: string): Promise<UserEntity | undefined> { | ||
return this.findOne({ where: { email } }); | ||
} | ||
|
||
async findOneByEmailOrFail(email: string): Promise<UserEntity> { | ||
return this.findOneOrFail({ where: { email } }); | ||
} | ||
|
||
async updatePassword(email: string, hashPassword: string): Promise<UserEntity> { | ||
const { id } = await this.findOneByEmailOrFail(email); | ||
return this.update(id, { password: hashPassword }); | ||
} | ||
} |