Add GQL query for projects search in app (#38)

* Find projects based on search text

* Use get search projects client method in UI

* Fetch searched projects inside useCombobox hook

* Get searched project from project entity

* Remove non required search projects filtering

* Fetch projects if user is owner or project member

---------

Co-authored-by: neeraj <neeraj.rtly@gmail.com>
This commit is contained in:
2024-02-01 11:37:57 +05:30
committed by Ashwin Phatak
co-authored by neeraj
parent cbc394f9f8
commit c2b997a17b
13 changed files with 138 additions and 28 deletions
+16
View File
@@ -190,4 +190,20 @@ export class Database {
return projectMemberWithProject[0];
}
async getProjectsBySearchText (userId: number, searchText: string): Promise<Project[]> {
const projectRepository = this.dataSource.getRepository(Project);
const projects = await projectRepository
.createQueryBuilder('project')
.leftJoinAndSelect('project.organization', 'organization')
.leftJoin('project.projectMembers', 'projectMembers')
.where('(project.owner = :userId OR projectMembers.member.id = :userId) AND project.name LIKE :searchText', {
userId,
searchText: `%${searchText}%`
})
.getMany();
return projects;
}
}
+6 -1
View File
@@ -5,11 +5,13 @@ import {
CreateDateColumn,
UpdateDateColumn,
ManyToOne,
JoinColumn
JoinColumn,
OneToMany
} from 'typeorm';
import { User } from './User';
import { Organization } from './Organization';
import { ProjectMember } from './ProjectMember';
@Entity()
export class Project {
@@ -52,4 +54,7 @@ export class Project {
@UpdateDateColumn()
updatedAt!: Date;
@OneToMany(() => ProjectMember, projectMember => projectMember.project)
projectMembers!: ProjectMember[];
}
+2 -2
View File
@@ -21,11 +21,11 @@ export class ProjectMember {
@PrimaryGeneratedColumn()
id!: number;
@ManyToOne(() => User, { onDelete: 'CASCADE' })
@ManyToOne(() => User, (user) => user.projectMembers, { onDelete: 'CASCADE' })
@JoinColumn({ name: 'userId' })
member!: User;
@ManyToOne(() => Project, { onDelete: 'CASCADE' })
@ManyToOne(() => Project, (project) => project.projectMembers, { onDelete: 'CASCADE' })
@JoinColumn({ name: 'projectId' })
project!: Project;
+6 -1
View File
@@ -2,8 +2,10 @@ import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn
CreateDateColumn,
OneToMany
} from 'typeorm';
import { ProjectMember } from './ProjectMember';
@Entity()
export class User {
@@ -21,4 +23,7 @@ export class User {
@CreateDateColumn()
updatedAt!: Date;
@OneToMany(() => ProjectMember, projectMember => projectMember.project)
projectMembers!: ProjectMember[];
}
+10
View File
@@ -66,6 +66,16 @@ export const createResolvers = async (db: Database): Promise<any> => {
});
return projectMembers;
},
searchProjects: async (_: any, { searchText }: { searchText: string }, context: any) => {
const dbProjects = await db.getProjectsBySearchText(context.userId, searchText);
const projects = dbProjects.map((project) => {
return projectToGqlType(project, [], []);
});
return projects;
}
},
+2
View File
@@ -68,6 +68,7 @@ type Project {
environmentVariables: [EnvironmentVariable!]
createdAt: String!
updatedAt: String!
organization: Organization!
}
type ProjectMember {
@@ -116,6 +117,7 @@ type Query {
projects: [Project!]
deployments(projectId: String!): [Deployment!]
projectMembers(projectId: String!): [ProjectMember!]
searchProjects(searchText: String!): [Project!]
}
type Mutation {
+2 -1
View File
@@ -39,7 +39,8 @@ export const projectToGqlType = (dbProject: Project, projectMembers: ProjectMemb
members: projectMembers,
environmentVariables: environmentVariables,
createdAt: dbProject.createdAt,
updatedAt: dbProject.updatedAt
updatedAt: dbProject.updatedAt,
organization: dbProject.organization
};
};