🏗️ Architecture

Repository Pattern

Data access layer architecture in Gauzy.

Multi-ORM Repository

Gauzy uses a repository adapter pattern to support both TypeORM and MikroORM:

// TypeORM repository
@Injectable()
export class TypeOrmEmployeeRepository extends Repository<Employee> {
  constructor(dataSource: DataSource) {
    super(Employee, dataSource.createEntityManager());
  }
}

// MikroORM repository
@Injectable()
export class MikroOrmEmployeeRepository extends BaseEntityRepository<Employee> {
  constructor(em: EntityManager) {
    super(em, Employee);
  }
}

Repository Registration

@Module({
  imports: [
    TypeOrmModule.forFeature([Employee]),
    MikroOrmModule.forFeature([Employee]),
  ],
  providers: [TypeOrmEmployeeRepository, MikroOrmEmployeeRepository],
})
export class EmployeeModule {}

Usage in Services

@Injectable()
export class EmployeeService extends TenantAwareCrudService<Employee> {
  constructor(
    readonly typeOrmRepo: TypeOrmEmployeeRepository,
    readonly mikroOrmRepo: MikroOrmEmployeeRepository,
  ) {
    super(typeOrmRepo, mikroOrmRepo);
  }
}

Custom Repository Methods

@Injectable()
export class TypeOrmEmployeeRepository extends Repository<Employee> {
  async findActiveByOrganization(orgId: string): Promise<Employee[]> {
    return this.createQueryBuilder("e")
      .leftJoinAndSelect("e.user", "u")
      .where("e.organizationId = :orgId", { orgId })
      .andWhere("e.isActive = true")
      .orderBy("u.firstName", "ASC")
      .getMany();
  }
}

Edit this page

Copyright © 2023-Present Ever Co. LTD.Docs by Sourcey