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

View courses #25

Merged
merged 2 commits into from
Oct 30, 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
15 changes: 15 additions & 0 deletions src/app/admin/courses/create/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
"use client";

import CreateCourseView from "@components/courses/createCourseView";
import AdminLayout from "@components/layouts/adminLayout";
import React from "react";

const CreateProgram: React.FC = (props) => {
return (
<AdminLayout>
<CreateCourseView />
</AdminLayout>
);
};

export default CreateProgram;
15 changes: 15 additions & 0 deletions src/app/admin/courses/edit/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
"use client";

import AdminLayout from "@components/layouts/adminLayout";
import EditProgramView from "@components/programs/editProgramView";
import React from "react";

const CreateSchool: React.FC = (props) => {
return (
<AdminLayout>
<EditProgramView />
</AdminLayout>
);
};

export default CreateSchool;
15 changes: 15 additions & 0 deletions src/app/admin/courses/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
"use client";

import CourseListView from "@components/courses/programListView";
import AdminLayout from "@components/layouts/adminLayout";
import React from "react";

const AdminSchools: React.FC = (props) => {
return (
<AdminLayout>
<CourseListView />
</AdminLayout>
);
};

export default AdminSchools;
47 changes: 47 additions & 0 deletions src/app/api/course/[slug]/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import SPARKED_PROCESS_CODES from "app/shared/processCodes";
import { Session } from "next-auth";
import { getServerSession } from "next-auth/next";
import fetchCourses_, {
deletePrograms_,
fetchProgramById_,
findProgramsByName_
} from "..";
import { authOptions } from "../../auth/constants";
import editProgram_ from "../edit";
import createCourse_ from "../create";

const schoolApiHandler_ = async function POST(
req: Request,

{ params }: { params: { slug: string } }
) {
const session = await getServerSession(authOptions);

const slug = params.slug;

const schoolFunctions: {
[key: string]: (request: Request, session?: Session) => {};
} = {
createCourse: createCourse_,
fetchCourses: fetchCourses_,
fetchProgramById: fetchProgramById_,
editProgram: editProgram_,
deletePrograms: deletePrograms_,
findProgramsByName: findProgramsByName_,
};

if (schoolFunctions[slug] && session) {
return schoolFunctions[slug](req, session);
} else {
const response = {
isError: true,
code: SPARKED_PROCESS_CODES.METHOD_NOT_FOUND,
};

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

export { schoolApiHandler_ as POST };
31 changes: 31 additions & 0 deletions src/app/api/course/constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import NextAuth, { NextAuthOptions } from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";

export const authOptions: NextAuthOptions = {
providers: [
CredentialsProvider({
name: "Credentials",

credentials: {
username: { label: "Username", type: "text", placeholder: "jsmith" },
password: { label: "Password", type: "password" },
},
async authorize(credentials, req) {
//@ts-ignore
const { user } = credentials;

if (user) {
return user;
} else {
return null;
}
},
}),
],
theme: {
colorScheme: "light",
},
callbacks: {},
};

export default NextAuth(authOptions);
121 changes: 121 additions & 0 deletions src/app/api/course/create.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
import SPARKED_PROCESS_CODES from "app/shared/processCodes";
import { BSON } from "mongodb";
import { Session } from "next-auth";
import { zfd } from "zod-form-data";
import { dbClient } from "../lib/db";
import { dbCollections } from "../lib/db/collections";
import { default as COURSE_PROCESS_CODES } from "./processCodes";

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

const { name, description, schoolId, programId } = schema.parse(formBody);

try {
const db = await dbClient();

if (!db) {
const response = {
isError: true,
code: SPARKED_PROCESS_CODES.DB_CONNECTION_FAILED,
};
return new Response(JSON.stringify(response), {
status: 200,
});
}
const regexPattern = new RegExp(name, "i");

const course = await db.collection(dbCollections.courses.name).findOne({
name: { $regex: regexPattern },
});

if (course) {
const response = {
isError: true,
code: COURSE_PROCESS_CODES.COURSE_EXIST,
};

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

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,
});
}

await db.collection(dbCollections.courses.name).insertOne({
name,
description,
created_at: new Date(),
updated_at: new Date(),
//@ts-ignore
created_by_id: new BSON.ObjectId(session?.user?.id),
school_id: new BSON.ObjectId(schoolId),
program_id: new BSON.ObjectId(programId),
});

const response = {
isError: false,
code: COURSE_PROCESS_CODES.COURSE_CREATED,
};

return new Response(JSON.stringify(response), {
status: 200,
});
} catch (error) {
const resp = {
isError: true,
code: SPARKED_PROCESS_CODES.UNKOWN_ERROR,
};

return new Response(JSON.stringify(resp), {
status: 200,
});
}
}
107 changes: 107 additions & 0 deletions src/app/api/course/edit.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import SPARKED_PROCESS_CODES from "app/shared/processCodes";
import { BSON } from "mongodb";
import { Session } from "next-auth";
import { zfd } from "zod-form-data";
import { dbClient } from "../lib/db";
import { dbCollections } from "../lib/db/collections";
import PROGRAM_PROCESS_CODES from "./processCodes";

export default async function editProgram_(request: Request, session?: Session) {
const schema = zfd.formData({
name: zfd.text(),
_id: zfd.text(),
description: zfd.text(),
schoolId: zfd.text(),
});
const formBody = await request.json();

const { name, description, _id, schoolId } = schema.parse(formBody);

try {
const db = await dbClient();

if (!db) {
const response = {
isError: true,
code: SPARKED_PROCESS_CODES.DB_CONNECTION_FAILED,
};
return new Response(JSON.stringify(response), {
status: 200,
});
}

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

const program = await db.collection(dbCollections.programs.name).findOne({
name: { $regex: regexPattern},
_id: { $ne: new BSON.ObjectId(_id) },

});

if (program) {
const response = {
isError: true,
code: PROGRAM_PROCESS_CODES.PROGRAM_EXIST,
};

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


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

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

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

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

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

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

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

const response = {
isError: false,
code: PROGRAM_PROCESS_CODES.PROGRAM_EDITED,
};

return new Response(JSON.stringify(response), {
status: 200,
});
} catch (error) {
const resp = {
isError: true,
code: SPARKED_PROCESS_CODES.UNKOWN_ERROR,
};

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