Skip to content
This repository was archived by the owner on Jul 2, 2022. It is now read-only.

Commit ed6df99

Browse files
author
Tischa
committed
Add skill to project
1 parent e042d2e commit ed6df99

File tree

7 files changed

+100
-13
lines changed

7 files changed

+100
-13
lines changed

server/src/applicants/applicants.resolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ export class ApplicantsResolver {
8282
return true;
8383
}
8484

85-
// test
85+
// todo: refactor
8686
@Mutation(() => Boolean)
8787
async addSkillToApplicant(
8888
@Args('applicantId', { type: () => Int }) applicantId: number,

server/src/projects/models/project.model.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { IProject } from 'common';
33
import { Profile } from '../../profiles/models/profile.model';
44
import { Applicant } from '../../applicants/models/applicant.model';
55
import { User } from '../../users/models/user.model';
6+
import { Skill } from '../../skills/models/skill.model';
67

78
@ObjectType()
89
export class Project implements IProject {
@@ -36,6 +37,9 @@ export class Project implements IProject {
3637
@Field((type) => [Profile], { nullable: true })
3738
profiles?: Profile[];
3839

40+
@Field((type) => [Skill], { nullable: true })
41+
skills?: Skill[];
42+
3943
@Field()
4044
createdAt: Date;
4145

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { Module } from '@nestjs/common';
2+
import { SkillsModule } from '../skills/skills.module';
23
import { PrismaModule } from '../prisma.module';
34
import { ProjectsResolver } from './projects.resolver';
45
import { ProjectsService } from './projects.service';
56

67
@Module({
7-
imports: [PrismaModule],
8+
imports: [PrismaModule, SkillsModule],
89
providers: [ProjectsResolver, ProjectsService]
910
})
1011
export class ProjectsModule {}

server/src/projects/projects.resolver.ts

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
1-
import { Resolver, Query, Args, Mutation, Subscription, ResolveField } from '@nestjs/graphql';
1+
import {
2+
Resolver,
3+
Query,
4+
Args,
5+
Mutation,
6+
Subscription,
7+
ResolveField,
8+
Parent,
9+
Int
10+
} from '@nestjs/graphql';
211
import { PubSub } from 'graphql-subscriptions';
12+
import { SkillsService } from '../skills/skills.service';
313
import { CreateProjectInput } from './dto/createProject.input';
414
import { UpdateProjectInput } from './dto/updateProject.input';
515
import { Project } from './models/project.model';
@@ -9,7 +19,7 @@ import { ProjectsService } from './projects.service';
919
export class ProjectsResolver {
1020
private pubSub: PubSub;
1121

12-
constructor(private projectsService: ProjectsService) {
22+
constructor(private projectsService: ProjectsService, private skillsService: SkillsService) {
1323
this.pubSub = new PubSub();
1424
}
1525

@@ -23,6 +33,11 @@ export class ProjectsResolver {
2333
return this.projectsService.findOneByUuid(uuid);
2434
}
2535

36+
@ResolveField()
37+
async skills(@Parent() project: Project) {
38+
return this.skillsService.findProjectSkills(project);
39+
}
40+
2641
@Mutation(() => Project)
2742
async createProject(@Args('input') createProjectData: CreateProjectInput): Promise<Project> {
2843
const project = await this.projectsService.create(createProjectData);
@@ -48,6 +63,15 @@ export class ProjectsResolver {
4863
return true;
4964
}
5065

66+
@Mutation(() => Boolean)
67+
async addSkillToProject(
68+
@Args('projectId', { type: () => Int }) projectId: number,
69+
@Args('skill', { type: () => String }) skill: string
70+
) {
71+
await this.projectsService.addSkill(projectId, skill);
72+
return true;
73+
}
74+
5175
@Subscription((returns) => Project, {
5276
name: 'projectsChanged'
5377
})

server/src/projects/projects.service.ts

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,11 @@ export class ProjectsService {
8787
description: createProjectData.description,
8888
client: createProjectData.client,
8989
templateUrl: createProjectData.templateUrl,
90-
leadCoach: {
91-
connect: { id: createProjectData.leadCoachId }
92-
}
90+
leadCoach: createProjectData.leadCoachId
91+
? {
92+
connect: { id: createProjectData.leadCoachId }
93+
}
94+
: undefined
9395
}
9496
});
9597
}
@@ -116,4 +118,38 @@ export class ProjectsService {
116118

117119
throw new NotFoundException(`Project with uuid ${uuid} cannot be`);
118120
}
121+
122+
async addSkill(projectId: number, skill: string): Promise<boolean> {
123+
await this.prisma.projectSkill.create({
124+
data: {
125+
project: {
126+
connect: {
127+
id: projectId
128+
}
129+
},
130+
skill: {
131+
connectOrCreate: {
132+
where: {
133+
name: skill
134+
},
135+
create: {
136+
name: skill
137+
}
138+
}
139+
}
140+
}
141+
});
142+
143+
return true;
144+
}
145+
146+
async removeSkill(projectId: number, skillId: number): Promise<boolean> {
147+
await this.prisma.projectSkill.delete({
148+
where: {
149+
projectId_skillId: { projectId, skillId }
150+
}
151+
});
152+
153+
return true;
154+
}
119155
}

server/src/schema.gql

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ A date-time string at UTC, such as 2019-12-03T09:54:33Z, compliant with the date
3636
"""
3737
scalar DateTime
3838

39+
type Skill {
40+
id: Int!
41+
name: String!
42+
}
43+
3944
type Project {
4045
id: Int!
4146
uuid: String!
@@ -47,6 +52,7 @@ type Project {
4752
coaches: [User!]
4853
applicants: [Applicant!]
4954
profiles: [Profile!]
55+
skills: [Skill!]
5056
createdAt: DateTime!
5157
updatedAt: DateTime!
5258
}
@@ -87,11 +93,6 @@ type Applicant {
8793
skillset: [Skillset!]
8894
}
8995

90-
type Skill {
91-
id: Int!
92-
name: String!
93-
}
94-
9596
type Query {
9697
applicants: [Applicant!]!
9798
applicant(uuid: String!): Applicant!
@@ -124,6 +125,7 @@ type Mutation {
124125
createProject(input: CreateProjectInput!): Project!
125126
updateProject(input: UpdateProjectInput!, uuid: String!): Project!
126127
deleteProject(uuid: String!): Boolean!
128+
addSkillToProject(skill: String!, projectId: Int!): Boolean!
127129
createProfile(input: CreateProfileInput!): Profile!
128130
updateProfile(input: UpdateProfileInput!, id: Float!): Profile!
129131
deleteProfile(id: Float!): Boolean!

server/src/skills/skills.service.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Injectable } from '@nestjs/common';
2-
import { Project } from '@prisma/client';
2+
import { Project } from '../projects/models/project.model';
33
import { Applicant } from '../applicants/models/applicant.model';
44
import { PrismaService } from '../prisma.service';
55
import { Skill } from './models/skill.model';
@@ -42,4 +42,24 @@ export class SkillsService {
4242
};
4343
});
4444
}
45+
46+
async findProjectSkills(project: Project): Promise<Skill[]> {
47+
const { id } = project;
48+
49+
const skillsets = await this.prisma.projectSkill.findMany({
50+
where: {
51+
projectId: id
52+
},
53+
include: {
54+
skill: true
55+
}
56+
});
57+
58+
return skillsets.map((skillset) => {
59+
return {
60+
id: skillset.skill.id,
61+
name: skillset.skill.name
62+
};
63+
});
64+
}
4565
}

0 commit comments

Comments
 (0)