-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #59 from Soil-labs/features/updateProjectTeamMember
- Loading branch information
Showing
4 changed files
with
197 additions
and
42 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
66 changes: 66 additions & 0 deletions
66
server/graphql/resolvers/projects/mutation/deleteProjectTeamMember.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,66 @@ | ||
import { Projects } from "../../../../models/projectModel"; | ||
import { Members } from "../../../../models/memberModel"; | ||
import { | ||
Project, | ||
ProjectTeamMember, | ||
ProjectRole, | ||
Member, | ||
DeleteProjectTeamMemberInput, | ||
} from "../../../../generated"; | ||
import { ApolloError } from "apollo-server-express"; | ||
|
||
const deleteProjectTeamMember = async ( | ||
parent: any, | ||
args: { request: DeleteProjectTeamMemberInput }, | ||
context: any, | ||
info: any, | ||
): Promise<ProjectTeamMember> => { | ||
try { | ||
const { memberID, projectID, roleID } = args.request; | ||
console.log("Mutation > deleteProjectTeamMember > args.request = ", args.request); | ||
//get the project | ||
let [project, member] = await Promise.all([ | ||
Projects.findOne({ _id: projectID }) as Project, | ||
Members.findOne({ _id: memberID }) as Member, | ||
]); | ||
|
||
if (!project) throw new ApolloError("The project does not exist"); | ||
if (!member) throw new ApolloError("The member does not exist"); | ||
|
||
const teamMember: any = project.teamMembers?.find( | ||
(member: any) => member.memberID === memberID, | ||
); | ||
if (!teamMember) throw new ApolloError("Team member does not exist"); | ||
|
||
const projectRoles = project.roles as ProjectRole[]; | ||
|
||
const role = projectRoles.find(role => role._id === roleID) as ProjectRole; | ||
if (!role) throw new ApolloError("The role does not exist on the project"); | ||
//remove the team member | ||
const remainTeamMembers: any = project.teamMembers?.find( | ||
(member: any) => member.memberID !== memberID, | ||
); | ||
|
||
project = await Projects.findOneAndUpdate( | ||
{ | ||
_id: projectID, | ||
}, | ||
{ $set: { teamMembers: remainTeamMembers } }, | ||
|
||
{ new: true }, | ||
); | ||
|
||
console.log("project", project); | ||
return { | ||
info: member, | ||
role: role, | ||
phase: teamMember.phase, | ||
}; | ||
} catch (err: any) { | ||
throw new ApolloError(err.message, err.extensions?.code || "deleteProjectTeamMember", { | ||
component: "ProjectMutation > deleteProjectTeamMember", | ||
}); | ||
} | ||
}; | ||
|
||
export default deleteProjectTeamMember; |
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
80 changes: 80 additions & 0 deletions
80
server/graphql/resolvers/projects/mutation/updateProjectTeamMember.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,80 @@ | ||
import { Projects } from "../../../../models/projectModel"; | ||
import { Members } from "../../../../models/memberModel"; | ||
import { | ||
Project, | ||
ProjectTeamMember, | ||
ProjectRole, | ||
Member, | ||
UpdateProjectTeamMemberInput, | ||
} from "../../../../generated"; | ||
import { ApolloError } from "apollo-server-express"; | ||
|
||
const updateProjectTeamMember = async ( | ||
parent: any, | ||
args: { request: UpdateProjectTeamMemberInput }, | ||
context: any, | ||
info: any, | ||
): Promise<ProjectTeamMember> => { | ||
const { memberID, projectID, phase, roleID } = args.request; | ||
console.log("Mutation > updateProjectTeamMember > args.request = ", args.request); | ||
|
||
if (!projectID && !memberID && !roleID) | ||
throw new ApolloError("The projectID, roleID and memberID is required"); | ||
|
||
if (!phase) throw new ApolloError("The phase is required"); | ||
|
||
try { | ||
let [project, member] = await Promise.all([ | ||
Projects.findOne({ _id: projectID }) as Project, | ||
Members.findOne({ _id: memberID }) as Member, | ||
]); | ||
|
||
if (!project) throw new ApolloError("The project does not exist"); | ||
if (!member) throw new ApolloError("The member does not exist"); | ||
|
||
const projectRoles = project.roles as ProjectRole[]; | ||
|
||
const role = projectRoles.find(role => role._id === roleID) as ProjectRole; | ||
if (!role) throw new ApolloError("The role does not exist on the project"); | ||
|
||
//find the member in the teamMembers array | ||
let teamMembers: any = project.teamMembers; | ||
const teamMemberToEdit = teamMembers?.find((member: any) => member.memberID === memberID); | ||
|
||
if (!teamMemberToEdit) throw new ApolloError("The member does not exist in the project team"); | ||
|
||
//update the fields | ||
teamMemberToEdit.roleID = roleID; | ||
if (phase) { | ||
teamMemberToEdit.phase = phase; | ||
} | ||
|
||
const remainTeamMembers = teamMembers.filter((member: any) => member.memberID !== memberID); | ||
|
||
remainTeamMembers.push(teamMemberToEdit); | ||
|
||
//save the edit to the 🇩B | ||
|
||
project = await Projects.findOneAndUpdate( | ||
{ | ||
_id: projectID, | ||
}, | ||
{ $set: { teamMembers: remainTeamMembers } }, | ||
|
||
{ new: true }, | ||
); | ||
|
||
console.log("project", project); | ||
return { | ||
info: member, | ||
role: role, | ||
phase: phase, | ||
}; | ||
} catch (err: any) { | ||
throw new ApolloError(err.message, err.extensions?.code || "updateProjectTeamMember", { | ||
component: "ProjectMutation > updateProjectTeamMember", | ||
}); | ||
} | ||
}; | ||
|
||
export default updateProjectTeamMember; |