Я создаю API-интерфейс graphql, используя nest js, type-graphql и typeorm. У меня проблемы с поиском того, как выполнить определенный запрос. Допустим, у меня есть следующие объекты:
@Entity()
@ObjectType({ description: 'The user model' })
export class User extends BaseEntity {
@Field(type => ID)
@PrimaryGeneratedColumn('uuid')
readonly id: string;
@Field()
@Column()
@IsNotEmpty()
@IsEmail()
email: string;
@Field()
@IsNotEmpty()
@Column()
password: string;
@Field(type => [Project], { nullable: true })
@ManyToMany(type => Project)
@JoinTable()
projects?: Project[];
}
@Entity()
@ObjectType({ description: 'The project model' })
export class Project extends BaseEntity {
@Field(type => ID)
@PrimaryGeneratedColumn('uuid')
readonly id: string;
@Field()
@Column()
@IsNotEmpty()
description: string;
@Field(type => [User], { nullable: true })
@ManyToMany(type => User)
@JoinTable()
participants?: User[];
}
У меня есть следующий сервис:
import { includes } from 'lodash';
@Injectable()
export class ProjectService {
constructor(
@InjectRepository(Project)
private projectRepository: Repository<Project>,
@InjectRepository(User)
private userRepository: Repository<User>,
) {}
async loadAllForUser(
userId: string
): Promise<Project[]> {
const projects = await this.projectRepository.find(
{
relations: ['participants'],
},
);
return projects.filter(project =>
includes(
project.participants.map(participant => participant.id),
userId,
),
);
}
}
И это будет мой распознаватель:
@Resolver( of => Project)
export class ProjectResolver {
constructor(
private projectService: ProjectService,
private userService: UserService,
) {}
@Query(returns => [Project])
@UseGuards(GqlAuthGuard)
async myProjects(
@GqlUser() user: User,
) {
return await this.projectService.loadAllForUser(
user.id,
);
}
}
Как вы можете видеть в моем сервисе проектов, я просто выбираю все проекты с помощью метода find, а затем фильтрую этот список, используя include из loda sh в отфильтровать только проекты, содержащие идентификатор пользователя. Разве нет способа добавить какую-либо операцию внутри метода find репозитория проекта, например, «где» или «in», чтобы я мог отфильтровать его непосредственно оттуда вместо ручной фильтрации и использования включений из loda sh? Я даже не знаю, правильно ли это, как я вручную фильтрую?
С уважением,
Джерри