Skip to content

Commit

Permalink
fix: global favorite service
Browse files Browse the repository at this point in the history
  • Loading branch information
GloireMutaliko21 committed Sep 10, 2024
1 parent 099b9ea commit 1555681
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 10 deletions.
5 changes: 4 additions & 1 deletion packages/core/src/core/decorators/is-favoritable.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { FavoriteTypeEnum } from '@gauzy/contracts';
import { SetMetadata } from '@nestjs/common';

export const FAVORITE_SERVICE = 'FAVORITE_SERVICE';
export const FavoriteService = () => SetMetadata(FAVORITE_SERVICE, true);
export const FAVORITABLE_TYPE = 'favoritableType';

export const FavoriteService = (type: FavoriteTypeEnum) => SetMetadata(FAVORITABLE_TYPE, type);
22 changes: 19 additions & 3 deletions packages/core/src/favorite/favorite.controller.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Body, Controller, HttpCode, HttpStatus, Post, UseGuards } from '@nestjs/common';
import { Body, Controller, Get, HttpCode, HttpStatus, Post, Query, UseGuards } from '@nestjs/common';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { IFavorite, PermissionsEnum } from '@gauzy/contracts';
import { FavoriteTypeEnum, IFavorite, PermissionsEnum } from '@gauzy/contracts';
import { UseValidationPipe } from './../shared/pipes';
import { PermissionGuard, TenantPermissionGuard } from '../shared/guards';
import { Permissions } from '../shared/decorators';
Expand All @@ -11,7 +11,7 @@ import { CreateFavoriteDTO } from './dto';

@ApiTags('Favorites')
@UseGuards(TenantPermissionGuard, PermissionGuard)
@Permissions(PermissionsEnum.ALL_ORG_EDIT)
@Permissions(PermissionsEnum.ALL_ORG_EDIT, PermissionsEnum.ORG_PROJECT_ADD)
@Controller()
export class FavoriteController extends CrudController<Favorite> {
constructor(private readonly favoriteService: FavoriteService) {
Expand All @@ -33,4 +33,20 @@ export class FavoriteController extends CrudController<Favorite> {
async create(@Body() entity: CreateFavoriteDTO): Promise<IFavorite> {
return await this.favoriteService.create(entity);
}

@ApiOperation({ summary: 'Find favorite entity records.' })
@ApiResponse({
status: HttpStatus.OK,
description: 'Found favorite records',
type: Favorite
})
@ApiResponse({
status: HttpStatus.NOT_FOUND,
description: 'Records not found'
})
@Get('/type')
@UseValidationPipe({ transform: true })
async getEmployeeProjectModules(@Query('type') favoritableType: FavoriteTypeEnum) {
return await this.favoriteService.getFavoriteDetails(favoritableType);
}
}
10 changes: 7 additions & 3 deletions packages/core/src/favorite/favorite.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,15 @@ export class FavoriteService extends TenantAwareCrudService<Favorite> {
relatedEntityId
};

let favorite = await this.findOneByWhereOptions(findOptions);
let favorite = await this.typeOrmRepository.findOneBy(findOptions);
if (!favorite) {
favorite = new Favorite(entity);
}

// If favorite element not exists, create and return new one
return this.save(favorite);
return await this.save(favorite);
} catch (error) {
console.log(error);
throw new BadRequestException('Favorite creation failed', error);
}
}
Expand Down Expand Up @@ -84,8 +85,11 @@ export class FavoriteService extends TenantAwareCrudService<Favorite> {
async getFavoriteDetails(favoritableType: FavoriteTypeEnum) {
try {
const service = this.favoriteDiscoveryService.getService(favoritableType);

console.log({ service });

if (!service) {
throw new Error(`Service pour l'entité de type ${favoritableType} non trouvé.`);
throw new BadRequestException(`Service for entity of type ${favoritableType} not found.`);
}
const items = service.getAll();
console.log(items);
Expand Down
7 changes: 4 additions & 3 deletions packages/core/src/favorite/global-favorite-service.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Injectable, OnModuleInit } from '@nestjs/common';
import { DiscoveryService, Reflector } from '@nestjs/core';
import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
import { FavoriteTypeEnum } from '@gauzy/contracts';
import { FAVORITE_SERVICE } from '../core/decorators/is-favoritable';
import { FAVORITABLE_TYPE } from '../core/decorators/is-favoritable';

@Injectable()
export class GlobalFavoriteDiscoveryService implements OnModuleInit {
Expand All @@ -13,14 +13,15 @@ export class GlobalFavoriteDiscoveryService implements OnModuleInit {
// Scan all app providers
onModuleInit() {
const providers = this.discoveryService.getProviders();

providers.forEach((wrapper: InstanceWrapper) => {
const { instance, metatype } = wrapper;
if (!instance || !metatype) {
return;
}

// Add service to "Favoritable" services map if has specified favorite decorator
const isFavoriteService = this.reflector.get(FAVORITE_SERVICE, metatype);
const isFavoriteService = this.reflector.get(FAVORITABLE_TYPE, metatype);
if (isFavoriteService) {
const type = this.extractTypeFromProvider(metatype);
if (type) {
Expand All @@ -32,7 +33,7 @@ export class GlobalFavoriteDiscoveryService implements OnModuleInit {

// Extract service favorite type
private extractTypeFromProvider(metatype: any): FavoriteTypeEnum | null {
return Reflect.getMetadata('favoritableType', metatype);
return Reflect.getMetadata(FAVORITABLE_TYPE, metatype);
}

// Get "Favoritable" service
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Injectable } from '@nestjs/common';
import { Brackets, In, IsNull, SelectQueryBuilder, WhereExpressionBuilder } from 'typeorm';
import {
FavoriteTypeEnum,
ID,
IEmployee,
IOrganizationGithubRepository,
Expand All @@ -15,7 +16,9 @@ import { RequestContext } from '../core/context';
import { OrganizationProject } from './organization-project.entity';
import { prepareSQLQuery as p } from './../database/database.helper';
import { MikroOrmOrganizationProjectRepository, TypeOrmOrganizationProjectRepository } from './repository';
import { FavoriteService } from '../core/decorators';

@FavoriteService(FavoriteTypeEnum.PROJECT)
@Injectable()
export class OrganizationProjectService extends TenantAwareCrudService<OrganizationProject> {
constructor(
Expand Down

0 comments on commit 1555681

Please sign in to comment.