From 42b448ff8a4df8ee113080d9da6e727d30776237 Mon Sep 17 00:00:00 2001 From: Dmytro Doronin <138795636+Dmytro-Doronin@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:19:29 +0100 Subject: [PATCH 1/3] feat: subject schema and controller --- server/src/app.ts | 2 ++ server/src/composition/composition.types.ts | 3 +++ server/src/composition/compositionRoot.ts | 5 ++++ server/src/controllers/subjects.controller.ts | 24 +++++++++++++++++++ server/src/db/schemes/subjects.schema.ts | 15 ++++++++++++ server/src/db/schemes/types/subjects.types.ts | 4 ++++ .../queryRepositories/subjects.query.ts | 17 +++++++++++++ server/src/routes/subjectRoute.ts | 14 +++++++++++ server/src/types/subjects/subjects.type.ts | 4 ++++ server/src/utils/mappers/subject.mapper.ts | 12 ++++++++++ 10 files changed, 100 insertions(+) create mode 100644 server/src/controllers/subjects.controller.ts create mode 100644 server/src/db/schemes/subjects.schema.ts create mode 100644 server/src/db/schemes/types/subjects.types.ts create mode 100644 server/src/repositories/queryRepositories/subjects.query.ts create mode 100644 server/src/routes/subjectRoute.ts create mode 100644 server/src/types/subjects/subjects.type.ts create mode 100644 server/src/utils/mappers/subject.mapper.ts diff --git a/server/src/app.ts b/server/src/app.ts index 477c18c..e2648fb 100644 --- a/server/src/app.ts +++ b/server/src/app.ts @@ -10,6 +10,7 @@ import { chatRouter } from "./routes/chatRoute.js"; import { streamRouter } from "./routes/streamRoute.js"; import { videoCallRouter } from "./routes/videoCallRoute.js"; +import { subjectRouter } from "./routes/subjectRoute.js"; // Create an express server const app = express(); @@ -23,6 +24,7 @@ app.use(express.json()); * As we also host our client code on heroku we want to separate the API endpoints. */ app.use("/api/auth", authRouter); +app.use("/api", subjectRouter); app.use("/api/appointments", appointmentRouter); app.use("/api/teachers", teacherRouter); app.use("/api/reviews", reviewRouter); diff --git a/server/src/composition/composition.types.ts b/server/src/composition/composition.types.ts index 45ae974..a3020cb 100644 --- a/server/src/composition/composition.types.ts +++ b/server/src/composition/composition.types.ts @@ -43,4 +43,7 @@ export const TYPES = { VideoCallQuery: Symbol.for("VideoCallQuery"), VideoCallService: Symbol.for("VideoCallService"), VideoCallController: Symbol.for("VideoCallController"), + //subjects + SubjectsController: Symbol.for("SubjectsController"), + SubjectsQuery: Symbol.for("SubjectsQuery"), }; diff --git a/server/src/composition/compositionRoot.ts b/server/src/composition/compositionRoot.ts index 5a7b7e2..e04824e 100644 --- a/server/src/composition/compositionRoot.ts +++ b/server/src/composition/compositionRoot.ts @@ -33,6 +33,8 @@ import { VideoCallCommand } from "../repositories/commandRepositories/videoCall. import { VideoCallController } from "../controllers/videoCall.controller.js"; import { VideoCallQuery } from "../repositories/queryRepositories/videoCall.query.js"; import { VideoCallService } from "../services/video/videoCall.service.js"; +import { SubjectsController } from "../controllers/subjects.controller.js"; +import { SubjectsQuery } from "../repositories/queryRepositories/subjects.query.js"; export const container = new Container(); @@ -90,6 +92,9 @@ container.bind(TYPES.ChatQuery).to(ChatQuery); container.bind(TYPES.ChatCommand).to(ChatCommand); container.bind(TYPES.ChatController).to(ChatController); container.bind(TYPES.ConversationCommand).to(ConversationCommand); +//subjects +container.bind(TYPES.SubjectsController).to(SubjectsController); +container.bind(TYPES.SubjectsQuery).to(SubjectsQuery); //video call container.bind(TYPES.StreamController).to(StreamController); diff --git a/server/src/controllers/subjects.controller.ts b/server/src/controllers/subjects.controller.ts new file mode 100644 index 0000000..2016948 --- /dev/null +++ b/server/src/controllers/subjects.controller.ts @@ -0,0 +1,24 @@ +import { TYPES } from "../composition/composition.types.js"; +import { inject, injectable } from "inversify"; +import { NextFunction, Response, Request } from "express"; +import { SubjectsQuery } from "../repositories/queryRepositories/subjects.query.js"; + +@injectable() +export class SubjectsController { + constructor( + @inject(TYPES.SubjectsQuery) private studentService: SubjectsQuery, + ) {} + + async getSubjects(req: Request, res: Response, next: NextFunction) { + try { + const subjects = await this.studentService.getAllSubjects(); + if (!subjects) { + return res.status(404).json({ message: "Subjects not found" }); + } + + return res.status(200).json(subjects); + } catch (err) { + return next(err); + } + } +} diff --git a/server/src/db/schemes/subjects.schema.ts b/server/src/db/schemes/subjects.schema.ts new file mode 100644 index 0000000..4bb6a71 --- /dev/null +++ b/server/src/db/schemes/subjects.schema.ts @@ -0,0 +1,15 @@ +import mongoose from "mongoose"; +import { WithId } from "mongodb"; +import { SchemaDb } from "./types/subjects.types.js"; + +const SubjectsSchema = new mongoose.Schema( + { + id: { type: String, required: true, unique: true, index: true }, + name: { type: String, required: true, index: true }, + }, + { versionKey: false }, +); +export const SubjectsModel = mongoose.model>( + "subjects", + SubjectsSchema, +); diff --git a/server/src/db/schemes/types/subjects.types.ts b/server/src/db/schemes/types/subjects.types.ts new file mode 100644 index 0000000..5f64603 --- /dev/null +++ b/server/src/db/schemes/types/subjects.types.ts @@ -0,0 +1,4 @@ +export type SchemaDb = { + id: string; + name: string; +}; diff --git a/server/src/repositories/queryRepositories/subjects.query.ts b/server/src/repositories/queryRepositories/subjects.query.ts new file mode 100644 index 0000000..92ed3f2 --- /dev/null +++ b/server/src/repositories/queryRepositories/subjects.query.ts @@ -0,0 +1,17 @@ +import { injectable } from "inversify"; +import { SubjectsModel } from "../../db/schemes/subjects.schema.js"; +import { subjectsMapper } from "../../utils/mappers/subject.mapper.js"; + +@injectable() +export class SubjectsQuery { + async getAllSubjects() { + try { + const subjects = await SubjectsModel.find().lean(); + return subjects.map(subjectsMapper); + } catch (err: unknown) { + throw new Error("Something went wrong with getting all subjects", { + cause: err, + }); + } + } +} diff --git a/server/src/routes/subjectRoute.ts b/server/src/routes/subjectRoute.ts new file mode 100644 index 0000000..7bb9f31 --- /dev/null +++ b/server/src/routes/subjectRoute.ts @@ -0,0 +1,14 @@ +import { Router } from "express"; +import { container } from "../composition/compositionRoot.js"; +import { SubjectsController } from "../controllers/subjects.controller.js"; +import { TYPES } from "../composition/composition.types.js"; + +export const subjectRouter = Router(); +const subjectsController = container.get( + TYPES.SubjectsController, +); + +subjectRouter.get( + "/subjects", + subjectsController.getSubjects.bind(subjectsController), +); diff --git a/server/src/types/subjects/subjects.type.ts b/server/src/types/subjects/subjects.type.ts new file mode 100644 index 0000000..d347861 --- /dev/null +++ b/server/src/types/subjects/subjects.type.ts @@ -0,0 +1,4 @@ +export type SubjectsViewType = { + id: string; + name: string; +}; diff --git a/server/src/utils/mappers/subject.mapper.ts b/server/src/utils/mappers/subject.mapper.ts new file mode 100644 index 0000000..501aea8 --- /dev/null +++ b/server/src/utils/mappers/subject.mapper.ts @@ -0,0 +1,12 @@ +import { WithId } from "mongodb"; +import { SchemaDb } from "../../db/schemes/types/subjects.types.js"; +import { SubjectsViewType } from "../../types/subjects/subjects.type.js"; + +export const subjectsMapper = ( + subjects: WithId, +): SubjectsViewType => { + return { + id: subjects.id, + name: subjects.name, + }; +}; From f69801dc7de1dafb7000f54990519abc3b813d79 Mon Sep 17 00:00:00 2001 From: Dmytro Doronin <138795636+Dmytro-Doronin@users.noreply.github.com> Date: Thu, 26 Feb 2026 18:35:54 +0100 Subject: [PATCH 2/3] feat: added subjects to filter from db --- client/src/App.tsx | 9 ---- client/src/api/subjects/subjects.api.ts | 7 +++ client/src/api/subjects/subjects.type.ts | 4 ++ client/src/components/filters/Filters.tsx | 8 +-- .../components/skeletons/FiltersSkeleton.tsx | 51 +++++++++++++++++++ .../teacherProfileSection/LessonForm.tsx | 2 +- .../ProfileExperienceEducation.tsx | 2 +- .../teacherSchedule/TeacherSchedule.tsx | 2 +- .../ui/select/{select.tsx => Select.tsx} | 0 client/src/features/queryKeys.ts | 5 +- .../subjects/query/useSubjectsQuery.tsx | 24 +++++++++ .../chat/chatDialogPage/ChatDialogPage.tsx | 2 +- .../src/pages/teachersPage/TeachersPage.tsx | 39 ++++++++++++-- client/src/util/createTestIdFilePath.js | 8 --- .../src/util/{data.util.ts => date.util.ts} | 0 client/src/util/mapSubjectToOptions.util.ts | 13 +++++ 16 files changed, 146 insertions(+), 30 deletions(-) delete mode 100644 client/src/App.tsx create mode 100644 client/src/api/subjects/subjects.api.ts create mode 100644 client/src/api/subjects/subjects.type.ts create mode 100644 client/src/components/skeletons/FiltersSkeleton.tsx rename client/src/components/ui/select/{select.tsx => Select.tsx} (100%) create mode 100644 client/src/features/subjects/query/useSubjectsQuery.tsx delete mode 100644 client/src/util/createTestIdFilePath.js rename client/src/util/{data.util.ts => date.util.ts} (100%) create mode 100644 client/src/util/mapSubjectToOptions.util.ts diff --git a/client/src/App.tsx b/client/src/App.tsx deleted file mode 100644 index 4eff5a1..0000000 --- a/client/src/App.tsx +++ /dev/null @@ -1,9 +0,0 @@ -const App = () => { - return ( - <> -
App
- - ); -}; - -export default App; diff --git a/client/src/api/subjects/subjects.api.ts b/client/src/api/subjects/subjects.api.ts new file mode 100644 index 0000000..addb5d2 --- /dev/null +++ b/client/src/api/subjects/subjects.api.ts @@ -0,0 +1,7 @@ +import { apiPublic } from "../api.ts"; +import { SubjectsType } from "./subjects.type.ts"; + +export const getAllSubjects = async (): Promise => { + const response = await apiPublic.get("/api/subjects"); + return response.data; +}; diff --git a/client/src/api/subjects/subjects.type.ts b/client/src/api/subjects/subjects.type.ts new file mode 100644 index 0000000..0cc6852 --- /dev/null +++ b/client/src/api/subjects/subjects.type.ts @@ -0,0 +1,4 @@ +export type SubjectsType = { + id: string; + name: string; +}; diff --git a/client/src/components/filters/Filters.tsx b/client/src/components/filters/Filters.tsx index 5661648..1feb184 100644 --- a/client/src/components/filters/Filters.tsx +++ b/client/src/components/filters/Filters.tsx @@ -6,10 +6,12 @@ import { Checkbox } from "../ui/checkbox/Checkbox"; import { SliderRange } from "../ui/sliderRange/SliderRange"; import { useTeachersFiltersStore } from "../../store/filters.store.ts"; import { useShallow } from "zustand/react/shallow"; -import { Subjects } from "../../constants/subjects.ts"; import { useSearchParams } from "react-router-dom"; +type FiltersProps = { + radioGroupValues: { label: string; value: string }[]; +}; -export const Filters = () => { +export const Filters = ({ radioGroupValues }: FiltersProps) => { const [, setSearchParams] = useSearchParams(); const { subjectDraft, @@ -64,7 +66,7 @@ export const Filters = () => { >
Tutors
setSubjectDraft(v || undefined)} /> diff --git a/client/src/components/skeletons/FiltersSkeleton.tsx b/client/src/components/skeletons/FiltersSkeleton.tsx new file mode 100644 index 0000000..2779b6e --- /dev/null +++ b/client/src/components/skeletons/FiltersSkeleton.tsx @@ -0,0 +1,51 @@ +const Skeleton = ({ className }: { className?: string }) => ( +
+); + +export const FiltersSkeleton = () => { + return ( +
+ + +
+ + +
+ + + + + + + +
+
+ +
+ + +
+ +
+ +
+ {[1, 2, 3, 4, 5].map((i) => ( + + ))} +
+
+ +
+ + +
+
+ ); +}; diff --git a/client/src/components/teacherProfileSection/LessonForm.tsx b/client/src/components/teacherProfileSection/LessonForm.tsx index e29e1af..ef4eca8 100644 --- a/client/src/components/teacherProfileSection/LessonForm.tsx +++ b/client/src/components/teacherProfileSection/LessonForm.tsx @@ -1,5 +1,5 @@ import { Button } from "../ui/button/Button"; -import { SelectComponent } from "../ui/select/select"; +import { SelectComponent } from "../ui/select/Select"; import { LEVELS, SUBJECTS } from "./constants"; import { useState } from "react"; import { useModalStore } from "../../store/modals.store"; diff --git a/client/src/components/teacherProfileSection/ProfileExperienceEducation.tsx b/client/src/components/teacherProfileSection/ProfileExperienceEducation.tsx index 0feff71..e857c66 100644 --- a/client/src/components/teacherProfileSection/ProfileExperienceEducation.tsx +++ b/client/src/components/teacherProfileSection/ProfileExperienceEducation.tsx @@ -1,4 +1,4 @@ -import { SelectComponent } from "../ui/select/select"; +import { SelectComponent } from "../ui/select/Select.tsx"; import { EXPERIENCE_OPTIONS, EDUCATION_OPTIONS } from "./constants"; type ProfileExperienceEducationProps = { diff --git a/client/src/components/teacherSection/teacherSchedule/TeacherSchedule.tsx b/client/src/components/teacherSection/teacherSchedule/TeacherSchedule.tsx index b23a500..dea329d 100644 --- a/client/src/components/teacherSection/teacherSchedule/TeacherSchedule.tsx +++ b/client/src/components/teacherSection/teacherSchedule/TeacherSchedule.tsx @@ -5,7 +5,7 @@ import { TeacherType } from "../../../api/teacher/teacher.type"; import { useModalStore } from "../../../store/modals.store"; import { useAuthSessionStore } from "../../../store/authSession.store"; import { useTeacherAppointmentsQuery } from "../../../features/appointments/query/useTeacherAppointmentsQuery"; -import { SelectComponent } from "../../ui/select/select"; +import { SelectComponent } from "../../ui/select/Select.tsx"; import { Button } from "../../ui/button/Button"; interface TeacherScheduleProps { diff --git a/client/src/components/ui/select/select.tsx b/client/src/components/ui/select/Select.tsx similarity index 100% rename from client/src/components/ui/select/select.tsx rename to client/src/components/ui/select/Select.tsx diff --git a/client/src/features/queryKeys.ts b/client/src/features/queryKeys.ts index 027be8f..5a53718 100644 --- a/client/src/features/queryKeys.ts +++ b/client/src/features/queryKeys.ts @@ -10,7 +10,6 @@ export const queryKeys = { teachers: { all: ["teachers"] as const, myProfile: () => ["teachers", "me"] as const, - detail: (id: string) => ["teachers", id] as const, list: (params: TeachersQuery) => ["teachers", "list", params] as const, }, teacher: (id: string) => ["teachers", id] as const, @@ -27,3 +26,7 @@ export const chatKeys = { messages: (conversationId: string) => ["chat", "messages", conversationId] as const, }; + +export const subjectsKey = { + all: ["subjects"] as const, +}; diff --git a/client/src/features/subjects/query/useSubjectsQuery.tsx b/client/src/features/subjects/query/useSubjectsQuery.tsx new file mode 100644 index 0000000..8e13071 --- /dev/null +++ b/client/src/features/subjects/query/useSubjectsQuery.tsx @@ -0,0 +1,24 @@ +import { useNotificationStore } from "../../../store/notification.store.ts"; +import { useQuery } from "@tanstack/react-query"; +import { subjectsKey } from "../../queryKeys.ts"; +import { useEffect } from "react"; +import { getErrorMessage } from "../../../util/ErrorUtil.ts"; +import { getAllSubjects } from "../../../api/subjects/subjects.api.ts"; + +export function useSubjectsQuery() { + const notifyError = useNotificationStore((s) => s.error); + + const query = useQuery({ + queryKey: subjectsKey.all, + queryFn: getAllSubjects, + }); + + useEffect(() => { + if (query.isError) { + const msg = getErrorMessage(query.error); + notifyError(msg ?? "Failed to load teachers"); + } + }, [query.isError, query.isSuccess, query.error, notifyError]); + + return query; +} diff --git a/client/src/pages/chat/chatDialogPage/ChatDialogPage.tsx b/client/src/pages/chat/chatDialogPage/ChatDialogPage.tsx index 0dc89e9..48e2e79 100644 --- a/client/src/pages/chat/chatDialogPage/ChatDialogPage.tsx +++ b/client/src/pages/chat/chatDialogPage/ChatDialogPage.tsx @@ -1,7 +1,7 @@ import { useParams } from "react-router-dom"; import { ChatSideBarItem } from "../../../components/chat/chatSidebarItem/ChatSideBarItem.tsx"; import { useMemo, useState } from "react"; -import { formatDate } from "../../../util/data.util.ts"; +import { formatDate } from "../../../util/date.util.ts"; import { TextField } from "../../../components/ui/textField/TextField.tsx"; import { Button } from "../../../components/ui/button/Button.tsx"; import { diff --git a/client/src/pages/teachersPage/TeachersPage.tsx b/client/src/pages/teachersPage/TeachersPage.tsx index e9af15d..91e1da0 100644 --- a/client/src/pages/teachersPage/TeachersPage.tsx +++ b/client/src/pages/teachersPage/TeachersPage.tsx @@ -3,17 +3,33 @@ import { CardsList } from "../../components/cardsList/CardsList"; import { Pagination } from "../../components/ui/pagination/Pagination"; import { useTeachersQuery } from "../../features/teachers/query/useTeachersQuery.tsx"; import { useTeachersFiltersStore } from "../../store/filters.store.ts"; -import { useEffect, useMemo } from "react"; +import { useEffect, useMemo, useRef } from "react"; import { TeachersQuery } from "../../api/teacher/teacher.type.ts"; import { useShallow } from "zustand/react/shallow"; import { useSearchParams } from "react-router-dom"; import { TeachersCardsSkeletonList } from "../../components/skeletons/TeachersCardsSkeletonList.tsx"; +import { useSubjectsQuery } from "../../features/subjects/query/useSubjectsQuery.tsx"; +import { mapSubjectsToOptions } from "../../util/mapSubjectToOptions.util.ts"; +import { FiltersSkeleton } from "../../components/skeletons/FiltersSkeleton.tsx"; + export const TeachersPage = () => { const [sp] = useSearchParams(); const setFromExternalQuery = useTeachersFiltersStore( (s) => s.setFromExternalQuery, ); + const listTopRef = useRef(null); + + const handlePageChange = (page: number) => { + setPage(page); + + requestAnimationFrame(() => { + listTopRef.current?.scrollIntoView({ + block: "start", + }); + }); + }; + const { subject, minPrice, @@ -62,12 +78,15 @@ export const TeachersPage = () => { pageSize, ]); const { data, isFetching } = useTeachersQuery(params); + const { data: radioGroupSubjects, isLoading: radioGroupSubjectsLoading } = + useSubjectsQuery(); useEffect(() => { setFromExternalQuery({ subject: sp.get("subject") || undefined }); }, [sp, setFromExternalQuery]); - const showSkeleton = isFetching; + return (
- + {radioGroupSubjectsLoading ? ( + + ) : ( + + )}
- {showSkeleton ? ( + {isFetching ? ( ) : data?.items?.length ? ( @@ -101,7 +130,7 @@ export const TeachersPage = () => { theme="primary" shape="round" activeIndex={pageNumber} - onIndexChange={setPage} + onIndexChange={handlePageChange} totalPages={data?.pagesCount ?? 1} />
diff --git a/client/src/util/createTestIdFilePath.js b/client/src/util/createTestIdFilePath.js deleted file mode 100644 index e4aed8c..0000000 --- a/client/src/util/createTestIdFilePath.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * This file is used to create the TEST_ID file paths - */ -const createTestIdFilePath = (...args) => { - return args.join("/"); -}; - -export default createTestIdFilePath; diff --git a/client/src/util/data.util.ts b/client/src/util/date.util.ts similarity index 100% rename from client/src/util/data.util.ts rename to client/src/util/date.util.ts diff --git a/client/src/util/mapSubjectToOptions.util.ts b/client/src/util/mapSubjectToOptions.util.ts new file mode 100644 index 0000000..5d3bcee --- /dev/null +++ b/client/src/util/mapSubjectToOptions.util.ts @@ -0,0 +1,13 @@ +import { SubjectsType } from "../api/subjects/subjects.type.ts"; + +export type Option = { + label: string; + value: string; +}; + +export const mapSubjectsToOptions = (subjects: SubjectsType[]): Option[] => { + return subjects.map(({ id, name }) => ({ + label: name, + value: id, + })); +}; From 9488a6b8ee68e13c97074b98e48d66abf9524b4d Mon Sep 17 00:00:00 2001 From: Dmytro Doronin <138795636+Dmytro-Doronin@users.noreply.github.com> Date: Thu, 26 Feb 2026 19:06:11 +0100 Subject: [PATCH 3/3] fix: copilot suggestions --- client/src/features/subjects/query/useSubjectsQuery.tsx | 2 +- server/src/app.ts | 2 +- server/src/controllers/subjects.controller.ts | 7 ++----- server/src/db/schemes/subjects.schema.ts | 6 +++--- server/src/db/schemes/types/subjects.types.ts | 2 +- .../src/repositories/queryRepositories/subjects.query.ts | 2 +- server/src/routes/subjectRoute.ts | 5 +---- server/src/utils/mappers/subject.mapper.ts | 8 ++++---- 8 files changed, 14 insertions(+), 20 deletions(-) diff --git a/client/src/features/subjects/query/useSubjectsQuery.tsx b/client/src/features/subjects/query/useSubjectsQuery.tsx index 8e13071..20faf4f 100644 --- a/client/src/features/subjects/query/useSubjectsQuery.tsx +++ b/client/src/features/subjects/query/useSubjectsQuery.tsx @@ -16,7 +16,7 @@ export function useSubjectsQuery() { useEffect(() => { if (query.isError) { const msg = getErrorMessage(query.error); - notifyError(msg ?? "Failed to load teachers"); + notifyError(msg ?? "Failed to load subjects"); } }, [query.isError, query.isSuccess, query.error, notifyError]); diff --git a/server/src/app.ts b/server/src/app.ts index e2648fb..c5cce65 100644 --- a/server/src/app.ts +++ b/server/src/app.ts @@ -24,7 +24,7 @@ app.use(express.json()); * As we also host our client code on heroku we want to separate the API endpoints. */ app.use("/api/auth", authRouter); -app.use("/api", subjectRouter); +app.use("/api/subjects", subjectRouter); app.use("/api/appointments", appointmentRouter); app.use("/api/teachers", teacherRouter); app.use("/api/reviews", reviewRouter); diff --git a/server/src/controllers/subjects.controller.ts b/server/src/controllers/subjects.controller.ts index 2016948..c0820aa 100644 --- a/server/src/controllers/subjects.controller.ts +++ b/server/src/controllers/subjects.controller.ts @@ -6,15 +6,12 @@ import { SubjectsQuery } from "../repositories/queryRepositories/subjects.query. @injectable() export class SubjectsController { constructor( - @inject(TYPES.SubjectsQuery) private studentService: SubjectsQuery, + @inject(TYPES.SubjectsQuery) private subjectsQuery: SubjectsQuery, ) {} async getSubjects(req: Request, res: Response, next: NextFunction) { try { - const subjects = await this.studentService.getAllSubjects(); - if (!subjects) { - return res.status(404).json({ message: "Subjects not found" }); - } + const subjects = await this.subjectsQuery.getAllSubjects(); return res.status(200).json(subjects); } catch (err) { diff --git a/server/src/db/schemes/subjects.schema.ts b/server/src/db/schemes/subjects.schema.ts index 4bb6a71..0c8a4ca 100644 --- a/server/src/db/schemes/subjects.schema.ts +++ b/server/src/db/schemes/subjects.schema.ts @@ -1,15 +1,15 @@ import mongoose from "mongoose"; import { WithId } from "mongodb"; -import { SchemaDb } from "./types/subjects.types.js"; +import { SubjectsTypeDB } from "./types/subjects.types.js"; -const SubjectsSchema = new mongoose.Schema( +const SubjectsSchema = new mongoose.Schema( { id: { type: String, required: true, unique: true, index: true }, name: { type: String, required: true, index: true }, }, { versionKey: false }, ); -export const SubjectsModel = mongoose.model>( +export const SubjectsModel = mongoose.model>( "subjects", SubjectsSchema, ); diff --git a/server/src/db/schemes/types/subjects.types.ts b/server/src/db/schemes/types/subjects.types.ts index 5f64603..e6fb1bf 100644 --- a/server/src/db/schemes/types/subjects.types.ts +++ b/server/src/db/schemes/types/subjects.types.ts @@ -1,4 +1,4 @@ -export type SchemaDb = { +export type SubjectsTypeDB = { id: string; name: string; }; diff --git a/server/src/repositories/queryRepositories/subjects.query.ts b/server/src/repositories/queryRepositories/subjects.query.ts index 92ed3f2..1201ed6 100644 --- a/server/src/repositories/queryRepositories/subjects.query.ts +++ b/server/src/repositories/queryRepositories/subjects.query.ts @@ -4,7 +4,7 @@ import { subjectsMapper } from "../../utils/mappers/subject.mapper.js"; @injectable() export class SubjectsQuery { - async getAllSubjects() { + async getAllSubjects(): Promise[]> { try { const subjects = await SubjectsModel.find().lean(); return subjects.map(subjectsMapper); diff --git a/server/src/routes/subjectRoute.ts b/server/src/routes/subjectRoute.ts index 7bb9f31..bc14e38 100644 --- a/server/src/routes/subjectRoute.ts +++ b/server/src/routes/subjectRoute.ts @@ -8,7 +8,4 @@ const subjectsController = container.get( TYPES.SubjectsController, ); -subjectRouter.get( - "/subjects", - subjectsController.getSubjects.bind(subjectsController), -); +subjectRouter.get("/", subjectsController.getSubjects.bind(subjectsController)); diff --git a/server/src/utils/mappers/subject.mapper.ts b/server/src/utils/mappers/subject.mapper.ts index 501aea8..652e24b 100644 --- a/server/src/utils/mappers/subject.mapper.ts +++ b/server/src/utils/mappers/subject.mapper.ts @@ -1,12 +1,12 @@ import { WithId } from "mongodb"; -import { SchemaDb } from "../../db/schemes/types/subjects.types.js"; +import { SubjectsTypeDB } from "../../db/schemes/types/subjects.types.js"; import { SubjectsViewType } from "../../types/subjects/subjects.type.js"; export const subjectsMapper = ( - subjects: WithId, + subject: WithId, ): SubjectsViewType => { return { - id: subjects.id, - name: subjects.name, + id: subject.id, + name: subject.name, }; };