Skip to content

Commit 483d714

Browse files
committed
backend onboarding
1 parent c964dbc commit 483d714

File tree

6 files changed

+143
-1
lines changed

6 files changed

+143
-1
lines changed

backend/typescript/graphql/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import userType from "./types/userType";
1818
import dashboardType from "./types/dashboardType";
1919
import dashboardResolvers from "./resolvers/dashboardResolvers";
2020
import reviewType from "./types/reviewType";
21+
import teamMemberType from "./types/teamMemberType";
22+
import teamMemberResolvers from "./resolvers/teamMemberResolvers";
2123

2224
const query = gql`
2325
type Query {
@@ -41,13 +43,15 @@ const executableSchema = makeExecutableSchema({
4143
simpleEntityType,
4244
userType,
4345
dashboardType,
46+
teamMemberType,
4447
],
4548
resolvers: merge(
4649
authResolvers,
4750
entityResolvers,
4851
simpleEntityResolvers,
4952
userResolvers,
5053
dashboardResolvers,
54+
teamMemberResolvers,
5155
),
5256
});
5357

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import TeamMemberService from "../../services/implementations/teamMemberService";
2+
import { CreateTeamMemberDTO, TeamMemberDTO } from "../../types";
3+
import { getErrorMessage } from "../../utilities/errorUtils";
4+
5+
const teamMemberService = new TeamMemberService();
6+
7+
const teamMemberResolvers = {
8+
Query: {
9+
teamMembers: async (): Promise<TeamMemberDTO[]> => {
10+
try {
11+
return await teamMemberService.getTeamMembers();
12+
} catch (error) {
13+
throw new Error(getErrorMessage(error));
14+
}
15+
},
16+
},
17+
Mutation: {
18+
createTeamMember: async (
19+
_: unknown,
20+
{ input }: { input: CreateTeamMemberDTO },
21+
): Promise<TeamMemberDTO> => {
22+
try {
23+
return await teamMemberService.createTeamMember(input);
24+
} catch (error) {
25+
throw new Error(getErrorMessage(error));
26+
}
27+
},
28+
},
29+
};
30+
31+
export default teamMemberResolvers;
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { gql } from "apollo-server-express";
2+
3+
const teamMemberType = gql`
4+
enum TeamRole {
5+
PM
6+
DESIGNER
7+
PL
8+
DEVELOPER
9+
}
10+
11+
type TeamMemberDTO {
12+
id: ID!
13+
firstName: String!
14+
lastName: String!
15+
teamRole: TeamRole!
16+
}
17+
18+
input CreateTeamMemberDTO {
19+
firstName: String!
20+
lastName: String!
21+
teamRole: TeamRole!
22+
}
23+
24+
extend type Query {
25+
teamMembers: [TeamMemberDTO!]!
26+
}
27+
28+
extend type Mutation {
29+
createTeamMember(input: CreateTeamMemberDTO!): TeamMemberDTO!
30+
}
31+
`;
32+
33+
export default teamMemberType;
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { TeamMemberDTO, CreateTeamMemberDTO } from "../../types";
2+
import logger from "../../utilities/logger";
3+
import { ITeamMemberService } from "../interfaces/ITeamMemberService";
4+
import PgTeamMembers from "../../models/teamMember.model";
5+
6+
const Logger = logger(__filename);
7+
8+
class TeamMemberService implements ITeamMemberService {
9+
// eslint-disable-next-line class-methods-use-this
10+
async getTeamMembers(): Promise<TeamMemberDTO[]> {
11+
try {
12+
const teamMembers: Array<PgTeamMembers> = await PgTeamMembers.findAll({
13+
raw: true,
14+
});
15+
return teamMembers.map((member) => ({
16+
id: member.id,
17+
firstName: member.firstName,
18+
lastName: member.lastName,
19+
teamRole: member.teamRole,
20+
}));
21+
} catch (error: unknown) {
22+
Logger.error(`Failed to get team members ${error}`);
23+
throw error;
24+
}
25+
}
26+
27+
// eslint-disable-next-line class-methods-use-this
28+
async createTeamMember(
29+
teamMember: CreateTeamMemberDTO,
30+
): Promise<TeamMemberDTO> {
31+
try {
32+
const member = await PgTeamMembers.create(teamMember);
33+
return {
34+
id: member.id,
35+
firstName: member.firstName,
36+
lastName: member.lastName,
37+
teamRole: member.teamRole,
38+
};
39+
} catch (error: unknown) {
40+
Logger.error(`Failed to create team member: ${error}`);
41+
throw error;
42+
}
43+
}
44+
}
45+
46+
export default TeamMemberService;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { TeamMemberDTO, CreateTeamMemberDTO } from "../../types";
2+
3+
export interface ITeamMemberService {
4+
/**
5+
* retrieve the Team Member with the given id
6+
* @param id team member id
7+
* @returns requested Team Member
8+
* @throws Error if retrieval fails
9+
*/
10+
getTeamMembers(): Promise<TeamMemberDTO[]>;
11+
12+
/**
13+
* create a Team Member with the fields given in the DTO, return created Team Member
14+
* @param teamMember new Team Member
15+
* @returns the created Team Member
16+
* @throws Error if creation fails
17+
*/
18+
createTeamMember(teamMember: CreateTeamMemberDTO): Promise<TeamMemberDTO>;
19+
}

backend/typescript/types.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export type Role = "User" | "Admin";
22

33
export const teamRoleValues = ["PM", "Designer", "PL", "Developer"] as const;
4-
export type TeamRole = typeof teamRoleValues[number];
4+
export type TeamRole = (typeof teamRoleValues)[number];
55

66
export enum StatusType {
77
ACCEPTED = "accepted",
@@ -239,3 +239,12 @@ export type ReviewedApplicantRecordDTO = {
239239
review: Review;
240240
status: ReviewStatus;
241241
};
242+
243+
export type TeamMemberDTO = {
244+
id: string;
245+
firstName: string;
246+
lastName: string;
247+
teamRole: TeamRole;
248+
};
249+
250+
export type CreateTeamMemberDTO = Omit<TeamMemberDTO, "id">;

0 commit comments

Comments
 (0)