diff --git a/src/app/(application)/division/[id]/(fitur-division)/discussion/create/page.tsx b/src/app/(application)/division/[id]/(fitur-division)/discussion/create/page.tsx index adbe0c1..bc70708 100644 --- a/src/app/(application)/division/[id]/(fitur-division)/discussion/create/page.tsx +++ b/src/app/(application)/division/[id]/(fitur-division)/discussion/create/page.tsx @@ -1,8 +1,12 @@ -import { ViewCreateDiscussion } from "@/module/division_new"; +import { LayoutNavbarNew } from "@/module/_global"; +import { FormCreateDiscussion } from "@/module/discussion"; function Page() { return ( - + <> + } /> + + ) } diff --git a/src/app/(application)/division/[id]/(fitur-division)/discussion/page.tsx b/src/app/(application)/division/[id]/(fitur-division)/discussion/page.tsx index a7b8c80..600d9ed 100644 --- a/src/app/(application)/division/[id]/(fitur-division)/discussion/page.tsx +++ b/src/app/(application)/division/[id]/(fitur-division)/discussion/page.tsx @@ -1,9 +1,12 @@ -import { ViewListDiscussion } from '@/module/division_new'; +import { ListDiscussion, NavbarListDiscussion } from '@/module/discussion'; import React from 'react'; function Page() { return ( - +
+ + +
); } diff --git a/src/app/api/(fitur-division)/discussion/get/route.ts b/src/app/api/(fitur-division)/discussion/get/route.ts deleted file mode 100644 index f3ce008..0000000 --- a/src/app/api/(fitur-division)/discussion/get/route.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { apiDiscussion } from "@/module/division_new"; -import { NextRequest } from "next/server"; - -export async function GET(req: NextRequest) { - return apiDiscussion(req, "GET") -} \ No newline at end of file diff --git a/src/app/api/(fitur-division)/discussion/post/route.ts b/src/app/api/(fitur-division)/discussion/post/route.ts deleted file mode 100644 index e78a337..0000000 --- a/src/app/api/(fitur-division)/discussion/post/route.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { apiDiscussion } from "@/module/division_new"; -import { NextRequest } from "next/server"; - -export async function POST(req: NextRequest) { - return apiDiscussion(req, "POST") -} \ No newline at end of file diff --git a/src/app/api/discussion/route.ts b/src/app/api/discussion/route.ts new file mode 100644 index 0000000..3937f60 --- /dev/null +++ b/src/app/api/discussion/route.ts @@ -0,0 +1,119 @@ +import { prisma } from "@/module/_global"; +import { funGetUserByCookies } from "@/module/auth"; +import _ from "lodash"; +import { NextResponse } from "next/server"; + + +// GET ALL DISCUSSION DIVISION ACTIVE = TRUE +export async function GET(request: Request) { + try { + const user = await funGetUserByCookies() + if (user.id == undefined) { + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + } + + const { searchParams } = new URL(request.url); + const idDivision = searchParams.get("division"); + const title = searchParams.get('search'); + + + if (idDivision != "null" && idDivision != null && idDivision != undefined) { + const cekDivision = await prisma.division.count({ + where: { + id: idDivision, + isActive: true + } + }) + + if (cekDivision == 0) { + return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, data tidak ditemukan" }, { status: 404 }); + } + + const data = await prisma.divisionDisscussion.findMany({ + where: { + isActive: true, + idDivision: idDivision, + title: { + contains: (title == undefined || title == "null") ? "" : title, + mode: "insensitive" + } + }, + orderBy: { + createdAt: 'desc' + }, + select: { + id: true, + title: true, + desc: true, + status: true, + createdAt: true, + User: { + select: { + name: true + } + }, + DivisionDisscussionComment: { + select: { + id: true, + } + } + } + }); + + + + const fixData = data.map((v: any) => ({ + ..._.omit(v, ["User", "DivisionDisscussionComment"]), + user_name: v.User.name, + total_komentar: v.DivisionDisscussionComment.length + })) + + return NextResponse.json({ success: true, message: "Berhasil mendapatkan diskusi", data: fixData, }, { status: 200 }); + + } else { + return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, data tidak ditemukan" }, { status: 404 }); + } + + } catch (error) { + console.log(error); + return NextResponse.json({ success: false, message: "Gagal mendapatkan diskusi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + } +} + + + +// CREATE DISCUSSION +export async function POST(request: Request) { + try { + const user = await funGetUserByCookies() + if (user.id == undefined) { + return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 }); + } + + const { idDivision, desc } = (await request.json()); + + const cekDivision = await prisma.division.count({ + where: { + id: idDivision, + isActive: true + } + }) + + if (cekDivision == 0) { + return NextResponse.json({ success: false, message: "Gagal mendapatkan divisi, data tidak ditemukan" }, { status: 404 }); + } + + const data = await prisma.divisionDisscussion.create({ + data: { + idDivision, + desc, + createdBy: user.id + }, + }); + + return NextResponse.json({ success: true, message: "Berhasil menambahkan diskusi", data, }, { status: 200 }); + } catch (error) { + console.log(error); + return NextResponse.json({ success: false, message: "Gagal menambahkan diskusi, coba lagi nanti", reason: (error as Error).message, }, { status: 500 }); + } +}; \ No newline at end of file diff --git a/src/app/api/division/route.ts b/src/app/api/division/route.ts index a868884..848fdc0 100644 --- a/src/app/api/division/route.ts +++ b/src/app/api/division/route.ts @@ -19,7 +19,7 @@ export async function GET(request: Request) { const idGroup = searchParams.get("group"); const name = searchParams.get('search'); - if (idGroup == null || idGroup == undefined) { + if (idGroup == "null" || idGroup == undefined) { grup = user.idGroup } else { grup = idGroup @@ -31,7 +31,7 @@ export async function GET(request: Request) { idVillage: String(villaId), idGroup: grup, name: { - contains: (name == undefined || name == null) ? "" : name, + contains: (name == undefined || name == "null") ? "" : name, mode: "insensitive" } }, diff --git a/src/module/discussion/index.ts b/src/module/discussion/index.ts new file mode 100644 index 0000000..13e1c2f --- /dev/null +++ b/src/module/discussion/index.ts @@ -0,0 +1,7 @@ +import FormCreateDiscussion from "./ui/form_create_discussion"; +import ListDiscussion from "./ui/list_discussion"; +import NavbarListDiscussion from "./ui/navbar_list_discussion"; + +export { ListDiscussion } +export { NavbarListDiscussion } +export { FormCreateDiscussion } \ No newline at end of file diff --git a/src/module/discussion/lib/api_discussion.ts b/src/module/discussion/lib/api_discussion.ts new file mode 100644 index 0000000..68ff0d0 --- /dev/null +++ b/src/module/discussion/lib/api_discussion.ts @@ -0,0 +1,20 @@ +import { IFormDiscussion } from "./type_discussion"; + +export const funGetAllDiscussion = async (path?: string) => { + const response = await fetch(`/api/discussion${(path) ? path : ''}`, { next: { tags: ['discussion'] } }); + return await response.json().catch(() => null); +} + +export const funCreateDiscussion = async (data: IFormDiscussion) => { + if (data.desc == "") + return { success: false, message: 'Diskusi tidak boleh kosong' } + + const response = await fetch("/api/discussion", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }); + return await response.json().catch(() => null); +} \ No newline at end of file diff --git a/src/module/discussion/lib/type_discussion.ts b/src/module/discussion/lib/type_discussion.ts new file mode 100644 index 0000000..02cef86 --- /dev/null +++ b/src/module/discussion/lib/type_discussion.ts @@ -0,0 +1,14 @@ +export interface IDataDiscussion { + id: string + title: string + desc: string + status: boolean + createdAt: string + user_name: string + total_komentar: number +} + +export interface IFormDiscussion { + desc: string, + idDivision: string +} \ No newline at end of file diff --git a/src/module/division_new/_division_fitur/discussion/component/drawer_detail_discussion.tsx b/src/module/discussion/ui/drawer_detail_discussion.tsx similarity index 100% rename from src/module/division_new/_division_fitur/discussion/component/drawer_detail_discussion.tsx rename to src/module/discussion/ui/drawer_detail_discussion.tsx diff --git a/src/module/division_new/_division_fitur/discussion/component/drawer_list_discussion.tsx b/src/module/discussion/ui/drawer_list_discussion.tsx similarity index 72% rename from src/module/division_new/_division_fitur/discussion/component/drawer_list_discussion.tsx rename to src/module/discussion/ui/drawer_list_discussion.tsx index 767fae0..cf2d982 100644 --- a/src/module/division_new/_division_fitur/discussion/component/drawer_list_discussion.tsx +++ b/src/module/discussion/ui/drawer_list_discussion.tsx @@ -1,15 +1,18 @@ import { WARNA } from "@/module/_global"; import { Box, Stack, SimpleGrid, Flex, Text } from "@mantine/core"; +import { useParams } from "next/navigation"; import { IoAddCircle } from "react-icons/io5"; export default function DrawerListDiscussion() { + const param = useParams<{ id: string }>() + return ( - window.location.href = "/discussion/create"} justify={'center'} align={'center'} direction={'column'} > + window.location.href = "/division/" + param.id + "/discussion/create"} justify={'center'} align={'center'} direction={'column'} > diff --git a/src/module/division_new/_division_fitur/discussion/component/form_create_discussion.tsx b/src/module/discussion/ui/form_create_discussion.tsx similarity index 100% rename from src/module/division_new/_division_fitur/discussion/component/form_create_discussion.tsx rename to src/module/discussion/ui/form_create_discussion.tsx diff --git a/src/module/division_new/_division_fitur/discussion/component/list_discussion.tsx b/src/module/discussion/ui/list_discussion.tsx similarity index 100% rename from src/module/division_new/_division_fitur/discussion/component/list_discussion.tsx rename to src/module/discussion/ui/list_discussion.tsx diff --git a/src/module/division_new/_division_fitur/discussion/component/navbar_detail_discussion.tsx b/src/module/discussion/ui/navbar_detail_discussion.tsx similarity index 100% rename from src/module/division_new/_division_fitur/discussion/component/navbar_detail_discussion.tsx rename to src/module/discussion/ui/navbar_detail_discussion.tsx diff --git a/src/module/division_new/_division_fitur/discussion/component/navbar_list_discussion.tsx b/src/module/discussion/ui/navbar_list_discussion.tsx similarity index 100% rename from src/module/division_new/_division_fitur/discussion/component/navbar_list_discussion.tsx rename to src/module/discussion/ui/navbar_list_discussion.tsx diff --git a/src/module/division_new/_division_fitur/discussion/api/api_discussion.ts b/src/module/division_new/_division_fitur/discussion/api/api_discussion.ts deleted file mode 100644 index 9a248e1..0000000 --- a/src/module/division_new/_division_fitur/discussion/api/api_discussion.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NextRequest } from "next/server"; -import { API_INDEX_DISCUSSION } from "./api_index"; -type Method = "GET" | "POST"; - -export async function apiDiscussion(req: NextRequest, method: Method) { - const { searchParams } = new URL(req.url); - const path = searchParams.get("path"); - const act = API_INDEX_DISCUSSION.find((v) => v.path === path && v.method === method); - if (!path) - return Response.json({ message: "page not found" }, { status: 404 }); - if (act) return act.bin(req); - - return Response.json({ message: "404" }); -} diff --git a/src/module/division_new/_division_fitur/discussion/api/api_index.ts b/src/module/division_new/_division_fitur/discussion/api/api_index.ts deleted file mode 100644 index 90ad955..0000000 --- a/src/module/division_new/_division_fitur/discussion/api/api_index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import getAllDiscussion from "./get/getAllDiscussion"; -import getOneDiscussion from "./get/getOneDiscussion"; -import createCommentDiscussion from "./post/createCommentDiscussion"; -import createDiscussion from "./post/createDiscussion"; -import deleteDiscussion from "./post/deleteDiscussion"; -import updateDiscussion from "./post/updateDiscussion"; - -export const API_INDEX_DISCUSSION = [ - { - path: "get-all-discussion", - method: "GET", - bin: getAllDiscussion, - }, - { - path: "get-one-discussion", - method: "GET", - bin: getOneDiscussion, - }, - { - path: "create-discussion", - method: "POST", - bin: createDiscussion, - }, - { - path: "create-comment-discussion", - method: "POST", - bin: createCommentDiscussion, - }, - { - path: "update-discussion", - method: "POST", - bin: updateDiscussion, - }, - { - path: "delete-discussion", - method: "POST", - bin: deleteDiscussion, - }, -]; diff --git a/src/module/division_new/_division_fitur/discussion/api/get/getAllDiscussion.ts b/src/module/division_new/_division_fitur/discussion/api/get/getAllDiscussion.ts deleted file mode 100644 index 68538a1..0000000 --- a/src/module/division_new/_division_fitur/discussion/api/get/getAllDiscussion.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { prisma } from "@/module/_global"; -import { NextRequest } from "next/server"; - -export default async function getAllDiscussion(req: NextRequest) { - try { - const searchParams = req.nextUrl.searchParams - const divisionID = searchParams.get('divisionID'); - const data = await prisma.divisionDisscussion.findMany({ - where: { - isActive: true, - idDivision: String(divisionID) - } - }) - - return Response.json(data); - } catch (error) { - console.error(error); - return Response.json({ success: false, message: "Internal Server Error" }, { status: 500 }); - } -} \ No newline at end of file diff --git a/src/module/division_new/_division_fitur/discussion/api/get/getOneDiscussion.ts b/src/module/division_new/_division_fitur/discussion/api/get/getOneDiscussion.ts deleted file mode 100644 index d9abb3a..0000000 --- a/src/module/division_new/_division_fitur/discussion/api/get/getOneDiscussion.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { prisma } from "@/module/_global"; -import { NextRequest } from "next/server"; - -export default async function getOneDiscussion(req: NextRequest) { - try { - const searchParams = req.nextUrl.searchParams - const id = searchParams.get('id'); - const data = await prisma.divisionDisscussion.findUnique({ - where: { - id: String(id) - } - }) - - const comment = await prisma.divisionDisscussionComment.findMany({ - where: { - idDisscussion: String(id) - } - }) - - const allData = { - data: data, - comment: comment - } - - return Response.json(allData); - - } catch (error) { - console.error(error); - return Response.json( - { message: "Internal Server Error", success: false }, - { status: 500 } - ); - } -} \ No newline at end of file diff --git a/src/module/division_new/_division_fitur/discussion/api/post/createCommentDiscussion.ts b/src/module/division_new/_division_fitur/discussion/api/post/createCommentDiscussion.ts deleted file mode 100644 index fafe8b8..0000000 --- a/src/module/division_new/_division_fitur/discussion/api/post/createCommentDiscussion.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { prisma } from "@/module/_global"; - -export default async function createCommentDiscussion(req: Request) { - try { - const data = await req.json() - const insert = await prisma.divisionDisscussionComment.create({ - data: { - idDisscussion: data.idDiscussion, - comment: data.comment, - createdBy: data.createdBy - } - }) - return Response.json(insert, { status: 201 }); - - } catch (error) { - console.error(error); - return Response.json({ success: false, message: "Internal Server Error" }, { status: 500 }); - } -} \ No newline at end of file diff --git a/src/module/division_new/_division_fitur/discussion/api/post/createDiscussion.ts b/src/module/division_new/_division_fitur/discussion/api/post/createDiscussion.ts deleted file mode 100644 index 596ff99..0000000 --- a/src/module/division_new/_division_fitur/discussion/api/post/createDiscussion.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { prisma } from "@/module/_global"; - -export default async function createDiscussion(req: Request) { - try { - const data = await req.json(); - const insert = await prisma.divisionDisscussion.create({ - data: { - idDivision: data.idDivision, - desc: data.desc, - createdBy: data.createdBy - }, - select: { - id: true - } - }) - - return Response.json(insert, { status: 201 }); - - } catch (error) { - console.error(error); - return Response.json({ success: false, message: "Internal Server Error" }, { status: 500 }); - } -} \ No newline at end of file diff --git a/src/module/division_new/_division_fitur/discussion/api/post/deleteDiscussion.ts b/src/module/division_new/_division_fitur/discussion/api/post/deleteDiscussion.ts deleted file mode 100644 index f2667a9..0000000 --- a/src/module/division_new/_division_fitur/discussion/api/post/deleteDiscussion.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { prisma } from "@/module/_global"; - -export default async function deleteDiscussion(req: Request) { - try { - const data = await req.json() - const del = await prisma.divisionDisscussion.update({ - where: { - id: data.id - }, - data: { - isActive: false - } - }) - - return Response.json( - { success: true, message: "Sukses Delete Diskusi" }, - { status: 200 } - ); - } catch (error) { - console.error(error); - return Response.json( - { message: "Internal Server Error", success: false }, - { status: 500 } - ); - } -} \ No newline at end of file diff --git a/src/module/division_new/_division_fitur/discussion/api/post/updateDiscussion.ts b/src/module/division_new/_division_fitur/discussion/api/post/updateDiscussion.ts deleted file mode 100644 index 9bd45e5..0000000 --- a/src/module/division_new/_division_fitur/discussion/api/post/updateDiscussion.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { prisma } from "@/module/_global"; - -export default async function updateDiscussion(req: Request) { - try { - const data = await req.json() - - const update = await prisma.divisionDisscussion.update({ - where:{ - id: data.id - }, - data:{ - desc: data.desc, - } - }) - - return Response.json({ success: true, message: "Sukses Update Diskusi" }, { status: 200 }); - } catch (error) { - console.error(error); - return Response.json({ message: "Internal Server Error", success: false }, { status: 500 }); - } -} \ No newline at end of file diff --git a/src/module/division_new/_division_fitur/discussion/view/view_create_discussion.tsx b/src/module/division_new/_division_fitur/discussion/view/view_create_discussion.tsx deleted file mode 100644 index 66a67cf..0000000 --- a/src/module/division_new/_division_fitur/discussion/view/view_create_discussion.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { LayoutNavbarNew } from "@/module/_global"; -import FormCreateDiscussion from "../component/form_create_discussion"; - -export default function ViewCreateDiscussion() { - return ( - <> - } /> - - - ) -} \ No newline at end of file diff --git a/src/module/division_new/_division_fitur/discussion/view/view_detail_discussion.tsx b/src/module/division_new/_division_fitur/discussion/view/view_detail_discussion.tsx index 0a44c58..d0b3b22 100644 --- a/src/module/division_new/_division_fitur/discussion/view/view_detail_discussion.tsx +++ b/src/module/division_new/_division_fitur/discussion/view/view_detail_discussion.tsx @@ -1,6 +1,5 @@ "use client" import { Avatar, Badge, Box, Center, Divider, Flex, Grid, Group, Text, TextInput } from "@mantine/core"; -import NavbarDetailDiscussion from "../component/navbar_detail_discussion"; import { WARNA } from "@/module/_global"; import { GrChatOption } from "react-icons/gr"; import { LuSendHorizonal } from "react-icons/lu"; @@ -52,7 +51,7 @@ export default function ViewDetailDiscussion() { return ( <> - + {/* */} - - - - ); -} \ No newline at end of file diff --git a/src/module/division_new/index.ts b/src/module/division_new/index.ts index cb090e6..e2c6f07 100644 --- a/src/module/division_new/index.ts +++ b/src/module/division_new/index.ts @@ -8,11 +8,8 @@ import ViewDetailEventDivision from "./_division_fitur/calender/view/view_detail import ViewDivisionCalender from "./_division_fitur/calender/view/view_division_calender"; import ViewHistoryDivisionCalender from "./_division_fitur/calender/view/view_history_division_calender"; import ViewUpdateDivisionCalender from "./_division_fitur/calender/view/view_update_division_calender"; -import { apiDiscussion } from "./_division_fitur/discussion/api/api_discussion"; -import ViewCreateDiscussion from "./_division_fitur/discussion/view/view_create_discussion"; import ViewDetailDiscussion from "./_division_fitur/discussion/view/view_detail_discussion"; import ViewEditDiscussion from "./_division_fitur/discussion/view/view_edit_discussion"; -import ViewListDiscussion from "./_division_fitur/discussion/view/view_list_discussion"; import ViewDocumentDivision from "./_division_fitur/document/view/view_document_division"; import ViewCreateTaskDivision from "./_division_fitur/task/view/view_create_division_task"; import ViewDetailDivisionTask from "./_division_fitur/task/view/view_detail_division_task"; @@ -49,12 +46,9 @@ export { ViewDetailEventDivision }; export { ViewUpdateDivisionCalender }; export { UpdateUserDivisionCalender }; export { UpdateUlangiEvent }; -export { ViewListDiscussion }; -export { ViewCreateDiscussion }; export { ViewDetailDiscussion }; export { ViewEditDiscussion }; export { ViewDocumentDivision }; -export { apiDiscussion } export type { IFormDivision, IFormMemberDivision, IFormFixDivision, IDataDivison, IDataMemberDivision } export { ListDivision } export { CreateDivision }