upd: be banner

Deskripsi:
- database table banner
- api crud banner

No
Issues
This commit is contained in:
amel
2024-10-03 17:18:13 +08:00
parent 3b5d98ad27
commit 1645803e36
7 changed files with 227 additions and 2 deletions

View File

@@ -59,6 +59,7 @@ model Village {
Project Project[]
Division Division[]
ColorTheme ColorTheme[]
BannerImage BannerImage[]
}
model Group {
@@ -481,6 +482,18 @@ model ColorTheme {
updatedAt DateTime @updatedAt
}
model BannerImage {
id String @id @default(cuid())
Village Village? @relation(fields: [idVillage], references: [id])
idVillage String?
title String
extension String
image String
isActive Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Subscription {
id String @id @default(cuid())
data Json

View File

View File

@@ -0,0 +1,113 @@
import { DIR, funDeleteFile, funUploadFile, prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth";
import { createLogUser } from "@/module/user";
import { NextResponse } from "next/server";
// GET ONE BANNER
export async function GET(request: Request, context: { params: { id: string } }) {
try {
const { id } = context.params;
const user = await funGetUserByCookies()
if (user.id == undefined) {
return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 });
}
const data = await prisma.bannerImage.findUnique({
where: {
id: String(id)
}
})
return NextResponse.json({ success: true, message: "Berhasil mendapatkan banner", data }, { status: 200 });
} catch (error) {
console.error(error);
return NextResponse.json({ success: false, message: "Gagal mendapatkan banner, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
}
}
// DELETE BANNER
export async function DELETE(request: Request, context: { params: { id: string } }) {
try {
const { id } = context.params;
const user = await funGetUserByCookies()
if (user.id == undefined) {
return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 });
}
const upd = await prisma.bannerImage.update({
where: {
id: String(id)
},
data: {
isActive: false
}
})
// create log user
const log = await createLogUser({ act: 'DELETE', desc: 'User menghapus banner', table: 'bannerImage', data: id })
return NextResponse.json({ success: true, message: "Berhasil menghapus banner" }, { status: 200 });
} catch (error) {
console.error(error);
return NextResponse.json({ success: false, message: "Gagal menghapus banner, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
}
}
// UPDATE BANNER
export async function PUT(request: Request, context: { params: { id: string } }) {
try {
const { id } = context.params;
const user = await funGetUserByCookies()
if (user.id == undefined) {
return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 });
}
const body = await request.formData()
const file = body.get("file") as File
const data = body.get("data")
const { title } = JSON.parse(data as string)
const upd = await prisma.bannerImage.update({
where: {
id: String(id)
},
data: {
title
},
select: {
image: true
}
})
if (String(file) != "undefined" && String(file) != "null") {
const fExt = file.name.split(".").pop()
const fileName = id + '.' + fExt;
const newFile = new File([file], fileName, { type: file.type });
await funDeleteFile({ fileId: String(upd.image) })
const upload = await funUploadFile({ file: newFile, dirId: DIR.banner })
await prisma.bannerImage.update({
where: {
id: id
},
data: {
image: upload.data.id
}
})
}
// create log user
const log = await createLogUser({ act: 'UPDATE', desc: 'User mengupdate data banner', table: 'bannerImage', data: user.id })
return NextResponse.json({ success: true, message: "Berhasil mengupdate banner" }, { status: 200 });
} catch (error) {
console.error(error);
return NextResponse.json({ success: false, message: "Gagal mengupdate banner, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
}
}

View File

@@ -0,0 +1,74 @@
import { DIR, funUploadFile, funViewDir, prisma } from "@/module/_global";
import { funGetUserByCookies } from "@/module/auth";
import { createLogUser } from "@/module/user";
import { NextResponse } from "next/server";
// GET ALL BANNER
export async function GET() {
try {
const user = await funGetUserByCookies()
if (user.id == undefined) {
return NextResponse.json({ success: false, message: "Anda harus login untuk mengakses ini" }, { status: 401 });
}
const data = await prisma.bannerImage.findMany({
where: {
isActive: true,
idVillage: user.idVillage
},
orderBy: {
createdAt: 'desc'
}
});
return NextResponse.json({ success: true, message: "Berhasil mendapatkan banner", data }, { status: 200 });
} catch (error) {
console.error(error);
return NextResponse.json({ success: false, message: "Gagal mendapatkan data banner, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
}
}
// CREATE BANNER
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 body = await request.formData()
const file = body.get("file") as File;
const data = body.get("data");
const { title } = JSON.parse(data as string)
const fExt = file.name.split(".").pop()
const fName = file.name.replace("." + fExt, "")
const newFile = new File([file], file.name, { type: file.type });
const ini = funViewDir({ dirId: DIR.user })
const upload = await funUploadFile({ file: newFile, dirId: DIR.banner })
if (upload.success) {
const create = await prisma.bannerImage.create({
data: {
title: title,
idVillage: user.idVillage,
extension: String(fExt),
image: upload.data.id
}
})
// create log user
const log = await createLogUser({ act: 'CREATE', desc: 'User menambah data banner baru', table: 'bannerImage', data: user.id })
return Response.json({ success: true, message: 'Sukses menambah data banner' }, { status: 200 });
} else {
return Response.json({ success: false, message: 'Gagal menambah data banner' }, { status: 200 });
}
} catch (error) {
console.error(error);
return NextResponse.json({ success: false, message: "Gagal menambahkan banner, coba lagi nanti", reason: (error as Error).message, }, { status: 500 });
}
}

View File

@@ -5,15 +5,16 @@ import { RefObject } from "react";
export const pwd_key_config = "fchgvjknlmdfnbvghhujlaknsdvjbhknlkmsdbdyu567t8y9u30r4587638y9uipkoeghjvuyi89ipkoefmnrjbhtiu4or9ipkoemnjfbhjiuoijdklnjhbviufojkejnshbiuojijknehgruyu"
export const globalRole = hookstate<string>('')
export const DIR = {
parentDir: "cm0x8a1as0001bp5te7354yrp",
task: "cm0xhcqf0000dacbbixjb09yn",
project: "cm0xhc9sv000bacbb7rfikw1k",
document: "cm0xhbkf50009acbbtw03qo4l",
village: "cm0xhb91o0007acbbkx8rk8hj",
user: "cm0x8dbwn0005bp5tgmfcthzw",
banner: "cm1sxex19004938bjvyaq8vta"
}
export const keyWibu= 'padahariminggukuturutayahkekotanaikdelmanistimewakududukdimuka'
export const keyWibu = 'padahariminggukuturutayahkekotanaikdelmanistimewakududukdimuka'
export const TEMA = hookstate<IGlobalTema>({
utama: "#19345E",

View File

@@ -0,0 +1,22 @@
export async function funViewDir({ dirId }: { dirId: string }) {
try {
const res = await fetch("https://wibu-storage.wibudev.com/api/dir/" + dirId + "/tree", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.WS_APIKEY}`
}
});
if (res.ok) {
const hasil = await res.json()
return { success: true, data: hasil.data }
} else {
const errorText = await res.text();
return { success: false, data: {} }
}
} catch (error) {
console.error("Upload error:", error);
return { success: false, data: {} }
}
}

View File

@@ -25,6 +25,7 @@ import NotificationCustome from "./components/notification_custome";
import { ScrollProvider } from "./components/scroll_provider";
import SkeletonUser from "./components/skeleton_user";
import SkeletonList from "./components/skeleton_list";
import { funViewDir } from "./fun/view_dir";
export { WARNA };
export { LayoutLogin };
@@ -59,3 +60,4 @@ export { currentScroll }
export { SkeletonUser }
export { SkeletonList }
export { keyWibu }
export { funViewDir }