diff --git a/src/module/user/api/api_index.ts b/src/module/user/api/api_index.ts index d5b5ff1..5db8e68 100644 --- a/src/module/user/api/api_index.ts +++ b/src/module/user/api/api_index.ts @@ -4,6 +4,7 @@ import { getOneUser } from "./get/getOneUser"; import { updateUser } from "./post/updateUser"; import { deleteUser } from "./post/deleteUser"; import { createUser } from "./post/createUser"; +import { getRoleUser } from "./get/getRoleUser"; export const API_INDEX_USER = [ { @@ -31,4 +32,9 @@ export const API_INDEX_USER = [ method: "POST", bin: deleteUser, }, + { + path: "get-role-user", + method: "GET", + bin: getRoleUser, + }, ]; \ No newline at end of file diff --git a/src/module/user/api/get/getAllUser.ts b/src/module/user/api/get/getAllUser.ts index e2beacc..c5444da 100644 --- a/src/module/user/api/get/getAllUser.ts +++ b/src/module/user/api/get/getAllUser.ts @@ -1,20 +1,17 @@ import { prisma } from "@/module/_global"; +import _ from "lodash"; import { NextRequest } from "next/server"; export async function getAllUser(req: NextRequest) { try { const searchParams = req.nextUrl.searchParams; - const idGroup = "2"; - const idVillage = "121212"; + const idGroup = "group1"; + const idVillage = "desa1"; const active = searchParams.get("active"); - const idPosition = searchParams.get("idPosition"); - const idUserRole = searchParams.get("idUserRole"); const users = await prisma.user.findMany({ where: { isActive: active == "true" ? true : false, - idUserRole: String(idUserRole), - idPosition: String(idPosition), idVillage: String(idVillage), idGroup: String(idGroup), }, @@ -26,6 +23,11 @@ export async function getAllUser(req: NextRequest) { phone: true, email: true, gender: true, + Position: { + select: { + name: true, + }, + }, Group: { select: { name: true, @@ -34,7 +36,14 @@ export async function getAllUser(req: NextRequest) { }, }); - return Response.json(users); + const allData = users.map((v: any) => ({ + ..._.omit(v, ["Group", "Position"]), + group: v.Group.name, + position: v.Position.name, + })); + + return Response.json(allData); + } catch (error) { console.error(error); return Response.json( diff --git a/src/module/user/api/get/getRoleUser.ts b/src/module/user/api/get/getRoleUser.ts new file mode 100644 index 0000000..c9d1428 --- /dev/null +++ b/src/module/user/api/get/getRoleUser.ts @@ -0,0 +1,21 @@ +import { prisma } from "@/module/_global"; +import { NextRequest } from "next/server"; + +export async function getRoleUser(req: NextRequest) { + try { + const res = await prisma.userRole.findMany({ + select: { + id: true, + name: true, + }, + }); + + return Response.json(res); + } catch (error) { + console.error(error); + return Response.json( + { success: false, message: "Internal Server Error" }, + { status: 500 } + ); + } +} diff --git a/src/module/user/api/post/createUser.ts b/src/module/user/api/post/createUser.ts index a6c6e57..c6f5736 100644 --- a/src/module/user/api/post/createUser.ts +++ b/src/module/user/api/post/createUser.ts @@ -5,33 +5,48 @@ import { NextRequest } from "next/server"; export async function createUser(req: NextRequest) { try { const data = await req.json(); + const village = "desa1" - const users = await prisma.user.create({ - data: { + const cek = await prisma.user.count({ + where: { nik: data.nik, - name: data.name, - phone: data.phone, email: data.email, - gender: data.gender, - idGroup: data.idGroup, - idVillage: data.idVillage, - idPosition: data.idPosition, - idUserRole: data.idUserRole, - }, - select: { - id: true, - nik: true, - name: true, - phone: true, - email: true, - gender: true, + phone: data.phone }, }); - // create log user - const log = await createLogUser({ act: 'CREATE', desc: 'User membuat data user baru', table: 'user', data: users.id }) + if (cek == 0) { + const users = await prisma.user.create({ + data: { + nik: data.nik, + name: data.name, + phone: data.phone, + email: data.email, + gender: data.gender, + idGroup: data.idGroup, + idVillage: village, + idPosition: data.idPosition, + idUserRole: data.idUserRole, + }, + select: { + id: true, + nik: true, + name: true, + phone: true, + email: true, + gender: true, + }, + }); + + // create log user + const log = await createLogUser({ act: 'CREATE', desc: 'User membuat data user baru', table: 'user', data: users.id }) + + return Response.json({ success: true, message: 'Sukses membuat user' }, { status: 200 }); + } else { + return Response.json({ success: false, message: "User sudah ada" }, { status: 400 }); + } + - return Response.json({ success: true, message: 'Sukses membuat user' }, { status: 200 }); } catch (error) { console.error(error); diff --git a/src/module/user/member/component/create_member.tsx b/src/module/user/member/component/create_member.tsx index 5acea0d..f6b1703 100644 --- a/src/module/user/member/component/create_member.tsx +++ b/src/module/user/member/component/create_member.tsx @@ -1,13 +1,123 @@ 'use client' -import { WARNA } from "@/module/_global"; +import { API_ADDRESS, WARNA } from "@/module/_global"; import LayoutModal from "@/module/_global/layout/layout_modal"; import { Box, Button, Select, Stack, TextInput } from "@mantine/core"; -import { useState } from "react"; +import { useRouter } from "next/navigation"; +import { useEffect, useState } from "react"; import toast from "react-hot-toast"; import { HiUser } from "react-icons/hi2"; +type dataGroup = { + id: string; + name: string; +}; +type dataPosition = { + id: string; + name: string; +}; + +type dataROleUser = { + id: string; + name: string; +} + export default function CreateMember() { + const router = useRouter() const [isModal, setModal] = useState(false) + const [listGroup, setListGorup] = useState([]) + const [listPosition, setListPosition] = useState([]) + const [listUserRole, setListUserRole] = useState([]) + + const [listData, setListData] = useState({ + nik: "", + name: "", + phone: "", + email: "", + gender: "", + idGroup: "", + idPosition: "", + idUserRole: "", + }) + + + async function getAllGroup() { + try { + const res = await fetch(`${API_ADDRESS.apiGetAllGroup}&villageId=desa1&active=true`) + const data = await res.json() + setListGorup(data) + } catch (error) { + console.error(error) + } + } + + async function getAllPosition(val: any) { + try { + const res = await fetch(`${API_ADDRESS.apiGetAllPosition}&groupId=${val}&active=true`) + const data = await res.json() + setListPosition(data) + } catch (error) { + console.error(error) + } + } + + async function getAllUserRole() { + try { + const res = await fetch(`${API_ADDRESS.apiGetRoleUser}`) + const data = await res.json() + setListUserRole(data) + } catch (error) { + console.error(error) + } + } + + + async function changeGrup(val: any) { + + console.log(val) + setListPosition([]) + setListData({ + ...listData, + idGroup: val, + idPosition: "" + }) + + getAllPosition(val) + + } + + + async function onSubmit(val: boolean) { + try { + const res = await fetch(API_ADDRESS.apiCreateUser, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + nik: listData.nik, + name: listData.name, + phone: listData.phone, + email: listData.email, + gender: listData.gender, + idGroup: listData.idGroup, + idPosition: listData.idPosition, + idUserRole: listData.idUserRole + }) + }) + toast.success("Sukses! Data tersimpan"); + setModal(false) + router.push('/member') + } catch (error) { + toast.error('Error') + toast.error("Sukses! Data tersimpan"); + } + } + + + useEffect(() => { + getAllGroup() + getAllUserRole() + }, []) function onTrue(val: boolean) { if (val) { @@ -40,7 +150,17 @@ export default function CreateMember() { borderColor: WARNA.biruTua, }, }} - data={['Dinas', 'Adat', 'LPD', 'PKK']} + data={ + listGroup + ? listGroup.map((data) => ({ + value: data.id, + label: data.name, + })) + : [] + } + onChange={(val: any) => { + changeGrup(val) + }} /> ({ + value: data.id, + label: data.name, + })) + : [] + } + onChange={(val: any) => setListData({ + ...listData, + idUserRole: val + })} /> setListData({ + ...listData, + nik: event.target.value + })} /> setListData({ + ...listData, + name: event.target.value + })} /> setListData({ + ...listData, + email: event.target.value + })} /> setListData({ + ...listData, + phone: event.target.value + })} />