Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Edit unit #36

Merged
merged 2 commits into from
Dec 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/app/admin/units/create/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"use client";

import AdminLayout from "@components/layouts/adminLayout";
import CreateUnitView from "@components/units/createUnitView";
import CreateUnitView from "@components/units/create-unit-view";
import React from "react";

const CreateProgram: React.FC = (props) => {
Expand Down
4 changes: 2 additions & 2 deletions src/app/admin/units/edit/page.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
"use client";

import EditCourseView from "@components/courses/editCourseView";
import AdminLayout from "@components/layouts/adminLayout";
import EditUnitView from "@components/units/edit-unit-view";
import React from "react";

const EditSchool: React.FC = (props) => {
return (
<AdminLayout>
<EditCourseView />
<EditUnitView />
</AdminLayout>
);
};
Expand Down
12 changes: 6 additions & 6 deletions src/app/api/unit/[slug]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ import SPARKED_PROCESS_CODES from "app/shared/processCodes";
import { Session } from "next-auth";
import { getServerSession } from "next-auth/next";
import fetchUnits_, {
deleteCourse_,
fetchCourseById_,
deleteUnits_,
fetchUnitById_,
findCourseByName_,
} from "..";
import { authOptions } from "../../auth/constants";
import createUnit_ from "../create";
import editCourse_ from "../edit";
import editUnit_ from "../edit";

const schoolApiHandler_ = async function POST(
req: Request,
Expand All @@ -24,9 +24,9 @@ const schoolApiHandler_ = async function POST(
} = {
createUnit: createUnit_,
fetchUnits: fetchUnits_,
fetchCourseById: fetchCourseById_,
editCourse: editCourse_,
deleteCourse: deleteCourse_,
fetchUnitById: fetchUnitById_,
editUnit: editUnit_,
deleteUnits: deleteUnits_,
findCourseByName: findCourseByName_,
};

Expand Down
125 changes: 71 additions & 54 deletions src/app/api/unit/edit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,20 @@ import { Session } from "next-auth";
import { zfd } from "zod-form-data";
import { dbClient } from "../lib/db";
import { dbCollections } from "../lib/db/collections";
import COURSE_PROCESS_CODES from "./processCodes";
import UNIT_PROCESS_CODES from "./processCodes";

export default async function editCourse_(request: Request, session?: Session) {
export default async function editUnit_(request: Request, session?: Session) {
const schema = zfd.formData({
name: zfd.text(),
description: zfd.text(),
schoolId: zfd.text().optional(),
programId: zfd.text().optional(),
courseId: zfd.text(),
unitId: zfd.text(),
});
const formBody = await request.json();


const { name, description, schoolId, programId, courseId } =
const { name, description, schoolId, programId, courseId, unitId } =
schema.parse(formBody);
try {
const db = await dbClient();
Expand All @@ -32,89 +32,106 @@ export default async function editCourse_(request: Request, session?: Session) {
});
}

const school = schoolId
? await db.collection(dbCollections.schools.name).findOne(
{
_id: new BSON.ObjectId(schoolId),
},
{ projection: { _id: 1 } }
)
: null;

if (!school && schoolId) {
const response = {
isError: true,
code: UNIT_PROCESS_CODES.SCHOOL_NOT_FOUND,
};

const school = schoolId
? await db.collection(dbCollections.schools.name).findOne(
{
_id: new BSON.ObjectId(schoolId),
},
{ projection: { _id: 1 } }
)
: null;

if (!school && schoolId) {
const response = {
isError: true,
code: COURSE_PROCESS_CODES.SCHOOL_NOT_FOUND,
};

return new Response(JSON.stringify(response), {
status: 200,
});
}

const program = programId
? await db.collection(dbCollections.programs.name).findOne(
{
_id: new BSON.ObjectId(programId),
},
{ projection: { _id: 1 } }
)
: null;

if (!program && programId) {
const response = {
isError: true,
code: COURSE_PROCESS_CODES.PROGRAM_NOT_FOUND,
};

return new Response(JSON.stringify(response), {
status: 200,
});
}
return new Response(JSON.stringify(response), {
status: 200,
});
}

const program = programId
? await db.collection(dbCollections.programs.name).findOne(
{
_id: new BSON.ObjectId(programId),
},
{ projection: { _id: 1 } }
)
: null;

if (!program && programId) {
const response = {
isError: true,
code: UNIT_PROCESS_CODES.PROGRAM_NOT_FOUND,
};

return new Response(JSON.stringify(response), {
status: 200,
});
}

const course = courseId
? await db.collection(dbCollections.courses.name).findOne(
{
_id: new BSON.ObjectId(courseId),
},
{ projection: { _id: 1 } }
)
: null;

if (!course && courseId) {
const response = {
isError: true,
code: UNIT_PROCESS_CODES.COURSE_NOT_FOUND,
};

return new Response(JSON.stringify(response), {
status: 200,
});
}

const regexPattern = new RegExp(name, "i");

const course = await db.collection(dbCollections.courses.name).findOne({
const unit = await db.collection(dbCollections.units.name).findOne({
name: { $regex: regexPattern },
_id: { $ne: new BSON.ObjectId(courseId) },
_id: { $ne: new BSON.ObjectId(unitId) },
});

if (course) {
if (unit) {
const response = {
isError: true,
code: COURSE_PROCESS_CODES.PROGRAM_EXIST,
code: UNIT_PROCESS_CODES.UNIT_EXIST,
};

return new Response(JSON.stringify(response), {
status: 200,
});
}


const query = {
_id: new BSON.ObjectId(courseId),
_id: new BSON.ObjectId(unitId),
};



const updateQuery = {
name,
description,
updated_at: new Date(),
school_id: new BSON.ObjectId(schoolId),

course_id: new BSON.ObjectId(courseId),
program_id: new BSON.ObjectId(programId),
//@ts-ignore
updated_by_id: new BSON.ObjectId(session?.user?.id),
};

await db.collection(dbCollections.courses.name).updateOne(query, {
await db.collection(dbCollections.units.name).updateOne(query, {
$set: updateQuery,
});

const response = {
isError: false,
code: COURSE_PROCESS_CODES.PROGRAM_EDITED,
code: UNIT_PROCESS_CODES.UNIT_EDITED,
};

return new Response(JSON.stringify(response), {
Expand Down
35 changes: 16 additions & 19 deletions src/app/api/unit/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@ import { z } from "zod";
import { zfd } from "zod-form-data";
import { dbClient } from "../lib/db";
import { dbCollections } from "../lib/db/collections";
import {
p_fetchUnitsWithMetaData,
} from "./pipelines";
import { p_fetchUnitsWithMetaData } from "./pipelines";

export default async function fetchUnits_(request: Request) {
const schema = zfd.formData({
Expand Down Expand Up @@ -51,8 +49,6 @@ export default async function fetchUnits_(request: Request) {
.toArray();
}



const response = {
isError: false,
units,
Expand All @@ -73,14 +69,14 @@ export default async function fetchUnits_(request: Request) {
}
}

export async function fetchCourseById_(request: Request) {
export async function fetchUnitById_(request: Request) {
const schema = zfd.formData({
courseId: zfd.text(),
unitId: zfd.text(),
withMetaData: z.boolean(),
});
const formBody = await request.json();

const { courseId, withMetaData } = schema.parse(formBody);
const { unitId, withMetaData } = schema.parse(formBody);

try {
const db = await dbClient();
Expand All @@ -95,30 +91,31 @@ export async function fetchCourseById_(request: Request) {
});
}

let course;
let unit: { [key: string]: string } | null;

if (withMetaData) {
course = await db
const units = await db
.collection(dbCollections.units.name)
.aggregate(
p_fetchUnitsWithMetaData({
query: {
_id: new BSON.ObjectId(courseId),
_id: new BSON.ObjectId(unitId),
},
})
)
.toArray();

course = course.length ? course[0] : null;
unit = units.length ? units[0] : {};
} else {
course = await db
unit = await db
.collection(dbCollections.units.name)
.findOne({ _id: new BSON.ObjectId(courseId) });
.findOne({ _id: new BSON.ObjectId(unitId) });
}


const response = {
isError: false,
course,
unit,
};

return new Response(JSON.stringify(response), {
Expand All @@ -136,13 +133,13 @@ export async function fetchCourseById_(request: Request) {
}
}

export async function deleteCourse_(request: Request) {
export async function deleteUnits_(request: Request) {
const schema = zfd.formData({
courseIds: zfd.repeatableOfType(zfd.text()),
unitIds: zfd.repeatableOfType(zfd.text()),
});
const formBody = await request.json();

const { courseIds } = schema.parse(formBody);
const { unitIds } = schema.parse(formBody);

try {
const db = await dbClient();
Expand All @@ -159,7 +156,7 @@ export async function deleteCourse_(request: Request) {

const results = await db.collection(dbCollections.units.name).deleteMany({
_id: {
$in: courseIds.map((i) => new BSON.ObjectId(i)),
$in: unitIds.map((i) => new BSON.ObjectId(i)),
},
});

Expand Down
3 changes: 3 additions & 0 deletions src/app/links.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,7 @@ export const API_LINKS: Tlink = {
// unit links
CREATE_UNIT: "/api/unit/createUnit",
FETCH_UNIT: "/api/unit/fetchUnits",
DELETE_UNITS: "/api/unit/deleteUnits",
FETCH_UNIT_BY_ID: "/api/unit/fetchUnitById",
EDIT_UNIT: "/api/unit/editUnit",
};
Loading
Loading