Fix: Cookies

Deksripsi:
- Perbaikan cookies untuk server
This commit is contained in:
2024-11-21 11:41:31 +08:00
parent a9cb6bc59b
commit abaec2c1c3
55 changed files with 1519 additions and 1401 deletions

View File

@@ -1,8 +1,12 @@
"use server";
import { prisma } from "@/app/lib";
import { RouterAuth } from "@/app/lib/router_hipmi/router_auth";
import { permanentRedirect } from "next/navigation";
export async function funGlobal_getUserById({ userId }: { userId: string }) {
if (!userId) return permanentRedirect(RouterAuth.login);
const data = await prisma.user.findFirst({
where: {
id: userId,

View File

@@ -1,18 +1,17 @@
"use server";
import { cookies } from "next/headers";
import prisma from "@/app/lib/prisma";
import { redirect } from "next/navigation";
import { RouterAuth } from "@/app/lib/router_hipmi/router_auth";
import { cookies } from "next/headers";
export async function funGetUserIdByToken() {
const c = cookies().get("ssn");
const token = c?.value
const cekToken = await prisma.userSession.findFirst({
where: {
token: c?.value,
token: token,
},
});
if (cekToken === null) return redirect(RouterAuth.login);
if (cekToken === null) return null
return cekToken.userId;
}

View File

@@ -1,12 +1,141 @@
import { AccentColor } from "@/app_modules/_global/color";
import { MODEL_USER } from "@/app_modules/home/model/interface";
import { Menu, ActionIcon, Stack, Grid, Center, Text } from "@mantine/core";
import { IconUserCircle, IconUser, IconPhone } from "@tabler/icons-react";
import { useState } from "react";
import Admin_Logout from "../logout";
"use client";
export function Admin_ComponentButtonUserCircle({ dataUser }: { dataUser: MODEL_USER }) {
import { RouterAuth } from "@/app/lib/router_hipmi/router_auth";
import { Warna } from "@/app/lib/warna";
import { AccentColor } from "@/app_modules/_global/color";
import {
ComponentGlobal_NotifikasiBerhasil,
ComponentGlobal_NotifikasiPeringatan,
} from "@/app_modules/_global/notif_global";
import { auth_Logout } from "@/app_modules/auth/fun/fun_logout";
import { gs_kodeId } from "@/app_modules/auth/state/state";
import { MODEL_USER } from "@/app_modules/home/model/interface";
import {
ActionIcon,
Button,
Center,
Divider,
Grid,
Group,
Menu,
Modal,
Popover,
Stack,
Text,
Title,
} from "@mantine/core";
import { IconPhone, IconUser, IconUserCircle } from "@tabler/icons-react";
import { useAtom } from "jotai";
import { useRouter } from "next/navigation";
import { useState } from "react";
export function Admin_ComponentButtonUserCircle({
dataUser,
}: {
dataUser: MODEL_USER;
}) {
const router = useRouter();
const [isOpenMenuUser, setOpenMenuUser] = useState(false);
const [openPop, setOpenPop] = useState(false);
const [openModal, setOpenModal] = useState(false);
const [loading, setLoading] = useState(false);
const [kodeId, setKodeId] = useAtom(gs_kodeId);
const [loadingLogout, setLoadingLogout] = useState(false);
async function onClickLogout() {
const res = await auth_Logout();
if (res.status === 200) {
console.log(res);
setLoadingLogout(true);
ComponentGlobal_NotifikasiBerhasil(res.message);
setKodeId("");
setOpenModal(false);
router.push(RouterAuth.login, { scroll: false });
} else {
ComponentGlobal_NotifikasiPeringatan(res.message);
}
}
return (
<>
<Popover opened={openPop} onChange={setOpenPop} position="right-end">
<Popover.Target>
<ActionIcon
variant="transparent"
onClick={() => {
setOpenPop((o) => !o);
}}
>
<IconUserCircle color="white" />
</ActionIcon>
</Popover.Target>
<Popover.Dropdown style={{ backgroundColor: AccentColor.blue }}>
<Stack>
<Grid>
<Grid.Col span={2}>
<IconUser />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text lineClamp={1}>{dataUser.username}</Text>
</Grid.Col>
</Grid>
<Grid>
<Grid.Col span={2}>
<IconPhone />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text lineClamp={1}>+{dataUser.nomor}</Text>
</Grid.Col>
</Grid>
<Divider />
<Center>
<Button radius={"xl"} onClick={() => setOpenModal(true)}>
Keluar
</Button>
</Center>
</Stack>
</Popover.Dropdown>
</Popover>
<Modal
opened={openModal}
onClose={() => setOpenModal(false)}
centered
withCloseButton={false}
closeOnClickOutside={false}
>
<Stack>
<Title order={6}>Anda yakin ingin keluar ?</Title>
<Group align="center" position="center">
<Button
onClick={() => {
setOpenModal(false);
setLoading(false);
}}
radius={50}
>
Batal
</Button>
<Button
loaderPosition="center"
loading={loadingLogout ? true : false}
radius={50}
bg={Warna.merah}
color="red"
onClick={() => onClickLogout()}
>
Keluar
</Button>
</Group>
</Stack>
</Modal>
</>
);
return (
<>
<Menu
@@ -35,41 +164,44 @@ export function Admin_ComponentButtonUserCircle({ dataUser }: { dataUser: MODEL_
}}
>
<Menu.Target>
<ActionIcon variant="transparent" onClick={() => console.log("test")}>
<IconUserCircle color="white" />
</ActionIcon>
<IconUserCircle color="white" />
{/* <ActionIcon variant="transparent">
</ActionIcon> */}
</Menu.Target>
<Menu.Dropdown>
<Stack spacing={5} px={"xs"}>
<Menu.Item>
<Grid>
<Grid.Col span={2}>
<IconUser />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text lineClamp={1}>{dataUser.username}</Text>
</Grid.Col>
</Grid>
</Menu.Item>
<Menu.Item>
<Grid>
<Grid.Col span={2}>
<IconPhone />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text lineClamp={1}>+{dataUser.nomor}</Text>
</Grid.Col>
</Grid>
</Menu.Item>
<Menu.Item>
<Grid>
<Grid.Col span={2}>
<IconUser />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text lineClamp={1}>{dataUser.username}</Text>
</Grid.Col>
</Grid>
</Menu.Item>
<Menu.Item>
<Grid>
<Grid.Col span={2}>
<IconPhone />
</Grid.Col>
<Grid.Col span={"auto"}>
<Text lineClamp={1}>+{dataUser.nomor}</Text>
</Grid.Col>
</Grid>
</Menu.Item>
<Menu.Divider />
<Center py={"xs"}>
<Menu.Divider />
<Menu.Item>
{/* <Center py={"xs"}>
<Admin_Logout />
</Center>
</Stack>
</Center> */}
{/* <Button>Keluar</Button> */}
<Text>Keluar</Text>
</Menu.Item>
</Menu.Dropdown>
</Menu>
</>
);
}
}

View File

@@ -26,20 +26,19 @@ export default function Admin_Logout() {
const [loadingLogout, setLoadingLogout] = useState(false);
async function onClickLogout() {
await auth_Logout().then((res) => {
if (res.status === 200) {
setLoadingLogout(true);
ComponentGlobal_NotifikasiBerhasil(res.message);
setKodeId("");
} else {
ComponentGlobal_NotifikasiPeringatan(res.message);
}
});
const res = await auth_Logout()
if (res.status === 200) {
setLoadingLogout(true);
ComponentGlobal_NotifikasiBerhasil(res.message);
setKodeId("");
} else {
ComponentGlobal_NotifikasiPeringatan(res.message);
}
}
return (
<>
<Modal
{/* <Modal
opened={opened}
onClose={() => setOpened(false)}
centered
@@ -70,7 +69,7 @@ export default function Admin_Logout() {
</Button>
</Group>
</Stack>
</Modal>
</Modal> */}
<ActionIcon variant="transparent">
{loading ? (
<Loader color="gray" />

View File

@@ -33,7 +33,7 @@ export default async function adminColab_funReportProjectById({
const updateReport = await prisma.projectCollaboration_Notifikasi.create({
data: {
projectCollaborationId: colabId,
adminId: userLoginId,
adminId: userLoginId as string,
userId: projectUpdate.userId as any,
note: "Project Anda Telah Direport Admin",
},

View File

@@ -11,22 +11,20 @@ export async function auth_Logout() {
try {
const delToken = await prisma.userSession.delete({
where: {
userId: userId,
userId: userId as string,
},
});
if (!delToken) return { status: 400, message: "Gagal Hapus User Session" };
cookies().set({
name: "ssn",
value: "",
});
cookies().delete({
name: "ssn",
});
return { status: 200, message: "Logout Berhasil" };
} catch (error) {
console.log(error);
}
revalidatePath("/");
return { status: 200, message: "Logout Berhasil" };
return { status: 200, message: "Anda Berhasil Logout" };
}

View File

@@ -9,6 +9,7 @@ import { IconLogout } from "@tabler/icons-react";
import { useRouter } from "next/navigation";
import { useState } from "react";
import { auth_Logout } from "../fun/fun_logout";
import { RouterAuth } from "@/app/lib/router_hipmi/router_auth";
export default function Component_Logout() {
const router = useRouter();
@@ -16,13 +17,13 @@ export default function Component_Logout() {
const [loading, setLoading] = useState(false);
async function onClickLogout() {
await auth_Logout().then((res) => {
if (res.status === 200) {
ComponentGlobal_NotifikasiBerhasil(res.message);
} else {
ComponentGlobal_NotifikasiPeringatan(res.message);
}
});
const res = await auth_Logout();
if (res.status === 200) {
ComponentGlobal_NotifikasiBerhasil(res.message);
router.push(RouterAuth.login, { scroll: false });
} else {
ComponentGlobal_NotifikasiPeringatan(res.message);
}
}
return (

View File

@@ -12,14 +12,14 @@ export function CheckCookies_UiLayout({
const router = useRouter();
useShallowEffect(() => {
// onCheckCookies();
onCheckCookies();
}, []);
async function onCheckCookies() {
const cek = await fetch("/api/check-cookies");
console.log(cek, "ini cek");
const result = await cek.json();
console.log(result, "ini result");
if (result.success === false) {
router.push(RouterAuth.login, { scroll: false });
}

View File

@@ -51,7 +51,7 @@ export default async function colab_funCreateRoomChat(
const createForAuthor =
await prisma.projectCollaboration_AnggotaRoomChat.create({
data: {
userId: userLoginId,
userId: userLoginId as string,
projectCollaboration_RoomChatId: createRoom.id,
},
});

View File

@@ -8,7 +8,7 @@ export default async function colab_CekNotifikasi() {
const cekNotif = await prisma.projectCollaboration_Notifikasi.findMany({
where: {
userId: userLoginId,
userId: userLoginId as string,
isRead: false,
},
select: {

View File

@@ -11,7 +11,7 @@ export default async function colab_getListNotifikasiByUserId() {
createdAt: "desc",
},
where: {
userId: userLoginId,
userId: userLoginId as string,
},
select: {
id: true,

View File

@@ -20,7 +20,7 @@ export default async function colab_getListRoomChatByAuthorId({
createdAt: "desc",
},
where: {
userId: userLoginId,
userId: userLoginId as string,
},
select: {
ProjectCollaboration_RoomChat: {

View File

@@ -2,7 +2,7 @@
import prisma from "@/app/lib/prisma";
export async function user_getOneByUserId(userId: string) {
export async function user_getOneByUserId(userId?: string) {
const data = await prisma.user.findFirst({
where: {
id: userId,

View File

@@ -1,102 +0,0 @@
"use server";
import prisma from "@/app/lib/prisma";
import { RouterInvestasi_OLD } from "@/app/lib/router_hipmi/router_investasi";
import { funGetUserIdByToken } from "@/app_modules/_global/fun/get";
import fs from "fs";
import _ from "lodash";
import { revalidatePath } from "next/cache";
import { v4 } from "uuid";
import { MODEL_INVESTASI } from "../_lib/interface";
export async function funCreateInvestasi(
fileGambar: FormData,
filePdf: FormData,
data: MODEL_INVESTASI
) {
const userLoginId = await funGetUserIdByToken();
// Function upload gambar
const gambar: any = fileGambar.get("file");
const gambarName = gambar.name;
const gambarExtention = _.lowerCase(gambar.name.split(".").pop());
const gambarRandomName = v4(gambarName) + "." + gambarExtention;
const uploadImage = await prisma.images.create({
data: {
url: gambarRandomName,
label: "INVESTASI",
},
select: {
id: true,
url: true,
},
});
if (!uploadImage)
return {
status: 400,
message: "Gambar Kosong",
};
const upFolder = Buffer.from(await gambar.arrayBuffer());
fs.writeFileSync(`./public/investasi/${uploadImage.url}`, upFolder);
const createInvest = await prisma.investasi.create({
data: {
authorId: userLoginId,
title: _.startCase(data.title),
targetDana: data.targetDana.toString(),
hargaLembar: data.hargaLembar.toString(),
totalLembar: data.totalLembar.toString(),
sisaLembar: data.totalLembar.toString(),
roi: data.roi.toString(),
masterPembagianDevidenId: data.masterPembagianDevidenId,
masterPeriodeDevidenId: data.masterPeriodeDevidenId,
masterPencarianInvestorId: data.masterPencarianInvestorId,
imagesId: uploadImage.id,
masterStatusInvestasiId: "2",
},
select: {
id: true,
title: true,
authorId: true,
MasterStatusInvestasi: {
select: {
name: true,
},
},
},
});
if (!createInvest)
return {
status: 400,
message: "Gagal Disimpan",
};
// await funUploadProspektusInvestasi(filePdf, createInvest.id);
const file: any = filePdf.get("file");
const fName = file.name;
const fExt = _.lowerCase(file.name.split(".").pop());
const fRandomName = v4(fName) + "." + fExt;
const createFile = await prisma.prospektusInvestasi.create({
data: {
investasiId: createInvest.id,
url: fRandomName,
},
});
if (!createFile) return { status: 400, message: "Gagal Upload" };
const uploadFile = Buffer.from(await file.arrayBuffer());
fs.writeFileSync(`./public/file/${createFile.url}`, uploadFile);
revalidatePath(RouterInvestasi_OLD.main_porto);
return {
data: createInvest,
status: 201,
message: "Berhasil Disimpan",
};
}

View File

@@ -37,7 +37,7 @@ export async function userSearch_getAllUser({
OR: [
{
NOT: {
id: userLoginId,
id: userLoginId as string,
},
},
],

View File

@@ -15,7 +15,7 @@ export async function Vote_funCreate(req: MODEL_VOTING, listVote: any[]) {
deskripsi: req.deskripsi,
awalVote: req.awalVote,
akhirVote: req.akhirVote,
authorId: userLoginId,
authorId: userLoginId as string,
},
select: {
id: true,

View File

@@ -18,7 +18,7 @@ export async function Vote_getAllListRiwayatSaya({ page }: { page: number }) {
},
where: {
voting_StatusId: "1",
authorId: userLoginId,
authorId: userLoginId as string,
isActive: true,
akhirVote: {
lte: new Date(),

View File

@@ -24,7 +24,7 @@ export async function vote_funGetAllByStatusId({
},
where: {
voting_StatusId: "1",
authorId: userLoginId,
authorId: userLoginId as string,
isActive: true,
akhirVote: {
gte: new Date(),
@@ -49,7 +49,7 @@ export async function vote_funGetAllByStatusId({
},
where: {
voting_StatusId: statusId,
authorId: userLoginId,
authorId: userLoginId as string,
isActive: true,
},
});

View File

@@ -17,7 +17,7 @@ export async function vote_getAllDraft({ page }: { page: number }) {
},
where: {
voting_StatusId: "3",
authorId: userLoginId,
authorId: userLoginId as string,
isActive: true,
},
});

View File

@@ -17,7 +17,7 @@ export async function vote_getAllPublish({ page }: { page: number }) {
},
where: {
voting_StatusId: "1",
authorId: userLoginId,
authorId: userLoginId as string,
isActive: true,
akhirVote: {
gte: new Date(),

View File

@@ -17,7 +17,7 @@ export async function vote_getAllReject({ page }: { page: number }) {
},
where: {
voting_StatusId: "4",
authorId: userLoginId,
authorId: userLoginId as string,
isActive: true,
},
});

View File

@@ -17,7 +17,7 @@ export async function vote_getAllReview({ page }: { page: number }) {
},
where: {
voting_StatusId: "2",
authorId: userLoginId,
authorId: userLoginId as string,
isActive: true,
},
});