Skip to content

Commit c7397e7

Browse files
committed
onboarding
1 parent 2ad9c57 commit c7397e7

File tree

7 files changed

+113
-13
lines changed

7 files changed

+113
-13
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import type { MigrationFn } from 'umzug';
2+
3+
export const up: MigrationFn = async params => {};
4+
export const down: MigrationFn = async params => {};

backend/typescript/rest/userRoutes.ts

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -112,19 +112,7 @@ userRouter.get("/", async (req, res) => {
112112
/* Create a user */
113113
userRouter.post("/", createUserDtoValidator, async (req, res) => {
114114
try {
115-
const accessToken = getAccessToken(req);
116-
if (!accessToken) {
117-
res.status(404).json({ error: "Access token not found" });
118-
return;
119-
}
120-
const canCreateUser = await authService.isAuthorizedByRole(
121-
accessToken,
122-
new Set([Role.ADMINISTRATOR, Role.ANIMAL_BEHAVIOURIST]),
123-
);
124-
if (!canCreateUser) {
125-
res.status(403).json({ error: "Not authorized to create user" });
126-
return;
127-
}
115+
128116

129117
const newUser = await userService.createUser({
130118
firstName: req.body.firstName,
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { TeamMember, TeamRole } from "../types/TeamMemberTypes";
2+
import baseAPIClient from "./BaseAPIClient";
3+
4+
const get = async (): Promise<TeamMember[] | null> => {
5+
try {
6+
const { data } = await baseAPIClient.get("team-member/");
7+
return data;
8+
} catch (error: unknown) {
9+
return null;
10+
}
11+
};
12+
13+
const create = async (
14+
firstName: string,
15+
lastName: string,
16+
teamRole: TeamRole,
17+
): Promise<TeamMember[] | null> => {
18+
try {
19+
const { data } = await baseAPIClient.post("team-member/", {
20+
firstName,
21+
lastName,
22+
teamRole,
23+
});
24+
return data;
25+
} catch (error: unknown) {
26+
return null;
27+
}
28+
};
29+
30+
export default { get, create };

frontend/src/App.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import AddTaskTemplatePage from "./pages/AddTaskTemplatePage";
1818
import NotFoundPage from "./pages/NotFoundPage";
1919
import UpdatePage from "./pages/UpdatePage";
2020
import SimpleEntityUpdatePage from "./pages/SimpleEntityUpdatePage";
21+
import TeamMembersPage from "./pages/TeamMembersPage";
2122
import CreatePasswordPage from "./pages/CreatePasswordPage";
2223
import * as Routes from "./constants/Routes";
2324
import * as AuthConstants from "./constants/AuthConstants";
@@ -72,6 +73,7 @@ const App = (): React.ReactElement => {
7273
<Router>
7374
<PageTitleUpdater />
7475
<Switch>
76+
<Route exact path={Routes.TEAM_MEMBERS} component={TeamMembersPage} />
7577
<Route exact path={Routes.LOGIN_PAGE} component={LoginPage} />
7678
<Route exact path={Routes.SIGNUP_PAGE} component={Signup} />
7779
<Route

frontend/src/constants/Routes.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,6 @@ export const HOOKS_PAGE = "/hooks";
4848
export const DEV_FILE_STORAGE_UPLOAD_PAGE = "/dev-file-upload";
4949

5050
export const VOLUNTEER_EDIT_USER_PROFILE_PAGE = "/edit-user-profile";
51+
52+
export const TEAM_MEMBERS = "/team-members";
53+
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import React, { useEffect, useState } from "react";
2+
import {
3+
Table,
4+
Thead,
5+
Tbody,
6+
Tr,
7+
Th,
8+
Td,
9+
TableContainer,
10+
VStack,
11+
Button,
12+
} from "@chakra-ui/react";
13+
import TeamMembersAPIClient from "../APIClients/TeamMembersAPIClient";
14+
import { TeamMember } from "../types/TeamMemberTypes";
15+
16+
const TeamMembersPage = (): React.ReactElement => {
17+
const [teamMembers, setTeamMembers] = useState<TeamMember[]>([]);
18+
19+
const getTeamMembers = async () => {
20+
const teamMembersData = await TeamMembersAPIClient.get();
21+
if (teamMembersData) {
22+
setTeamMembers(teamMembersData);
23+
}
24+
};
25+
26+
const addTeamMember = async () => {
27+
await TeamMembersAPIClient.create("Artyom", "Gabtraupov", "DEVELOPER");
28+
await getTeamMembers(); // updates table with latest data
29+
};
30+
31+
useEffect(() => {
32+
getTeamMembers();
33+
}, []);
34+
35+
return (
36+
<VStack spacing="24px" style={{ margin: "24px auto" }}>
37+
<h1>Team Members Page</h1>
38+
<TableContainer>
39+
<Table colorScheme="blue">
40+
<Thead>
41+
<Tr>
42+
<Th>First Name</Th>
43+
<Th>Last Name</Th>
44+
<Th>Team Role</Th>
45+
</Tr>
46+
</Thead>
47+
<Tbody>
48+
{teamMembers.map((teamMember, index) => (
49+
<Tr key={index}>
50+
<Td>{teamMember.firstName}</Td>
51+
<Td>{teamMember.lastName}</Td>
52+
<Td>{teamMember.teamRole}</Td>
53+
</Tr>
54+
))}
55+
</Tbody>
56+
</Table>
57+
</TableContainer>
58+
<Button colorScheme="blue" onClick={addTeamMember}>
59+
+ Add a member
60+
</Button>
61+
</VStack>
62+
);
63+
};
64+
65+
export default TeamMembersPage;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export type TeamRole = "PM" | "DESIGNER" | "PL" | "DEVELOPER";
2+
3+
export type TeamMember = {
4+
id: string;
5+
firstName: string;
6+
lastName: string;
7+
teamRole: TeamRole;
8+
};

0 commit comments

Comments
 (0)