style: apply consistent code formatting across project files

This commit is contained in:
Firman Ramdhani
2026-09-16 13:14:02 +07:00
parent d5791e759e
commit 51d05653c6
48 changed files with 3585 additions and 2575 deletions
+243 -191
View File
@@ -21,21 +21,21 @@ export async function loginUser(username: string, password: string) {
username: user.username,
name: user.name,
role: user.role,
photo: user.photo
photo: user.photo,
}
const sessionToken = await encrypt(sessionData);
(await cookies()).set('session', sessionToken, {
const sessionToken = await encrypt(sessionData)
;(await cookies()).set('session', sessionToken, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'lax',
path: '/'
path: '/',
})
return { success: true, user: sessionData }
} catch (e) {
console.error("Login Error:", e)
console.error('Login Error:', e)
return { success: false, error: 'Terjadi kesalahan saat login.' }
}
}
@@ -44,7 +44,7 @@ export async function registerUser(name: string, username: string, password: str
try {
const hashedPassword = await hashPassword(password)
const user = await prisma.user.create({
data: { name, username, password: hashedPassword }
data: { name, username, password: hashedPassword },
})
const sessionData = {
@@ -52,28 +52,28 @@ export async function registerUser(name: string, username: string, password: str
username: user.username,
name: user.name,
role: user.role,
photo: user.photo
photo: user.photo,
}
const sessionToken = await encrypt(sessionData);
(await cookies()).set('session', sessionToken, {
const sessionToken = await encrypt(sessionData)
;(await cookies()).set('session', sessionToken, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'lax',
path: '/'
path: '/',
})
return { success: true, user: sessionData }
} catch (error: any) {
console.error("Register Error:", error)
console.error('Register Error:', error)
if (error.code === 'P2002') return { success: false, error: 'Username sudah digunakan.' }
return { success: false, error: 'Terjadi kesalahan.' }
}
}
export async function logoutUser() {
(await cookies()).delete('session')
;(await cookies()).delete('session')
return { success: true }
}
@@ -87,7 +87,7 @@ export async function updateProfile(id: string, name: string, photo?: string | n
try {
const user = await prisma.user.update({
where: { id },
data: { name, photo: photo === undefined ? undefined : (photo || null) }
data: { name, photo: photo === undefined ? undefined : photo || null },
})
// Update session cookie with new data
@@ -96,14 +96,14 @@ export async function updateProfile(id: string, name: string, photo?: string | n
username: user.username,
name: user.name,
role: user.role,
photo: user.photo
photo: user.photo,
}
const sessionToken = await encrypt(sessionData);
(await cookies()).set('session', sessionToken, {
const sessionToken = await encrypt(sessionData)
;(await cookies()).set('session', sessionToken, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'lax',
path: '/'
path: '/',
})
revalidatePath('/')
@@ -118,16 +118,16 @@ export async function changePassword(id: string, oldPass: string, newPass: strin
try {
const user = await prisma.user.findUnique({ where: { id } })
if (!user) return { success: false, error: 'User tidak ditemukan.' }
const isMatch = await verifyPassword(oldPass, user.password)
if (!isMatch) return { success: false, error: 'Password lama salah.' }
const hashed = await hashPassword(newPass)
await prisma.user.update({
where: { id },
data: { password: hashed }
data: { password: hashed },
})
return { success: true }
} catch (e) {
return { success: false, error: 'Gagal mengganti password.' }
@@ -139,16 +139,21 @@ export async function getUsers(page = 1, limit = 10) {
const skip = (page - 1) * limit
const [users, total] = await Promise.all([
prisma.user.findMany({ skip, take: limit, orderBy: { created_at: 'desc' } }),
prisma.user.count()
prisma.user.count(),
])
return { users, total, totalPages: Math.ceil(total / limit) }
}
export async function createUserByAdmin(name: string, username: string, password: string, role: string) {
export async function createUserByAdmin(
name: string,
username: string,
password: string,
role: string
) {
try {
const hashedPassword = await hashPassword(password)
await prisma.user.create({
data: { name, username, password: hashedPassword, role }
data: { name, username, password: hashedPassword, role },
})
revalidatePath('/users')
return { success: true }
@@ -161,11 +166,12 @@ export async function createUserByAdmin(name: string, username: string, password
export async function toggleUserActive(id: string, is_active: boolean) {
try {
const user = await prisma.user.findUnique({ where: { id } })
if (user?.role === 'superadmin') return { success: false, error: 'Data Superadmin tidak bisa dinonaktifkan.' }
if (user?.role === 'superadmin')
return { success: false, error: 'Data Superadmin tidak bisa dinonaktifkan.' }
await prisma.user.update({
where: { id },
data: { is_active }
data: { is_active },
})
revalidatePath('/users')
return { success: true }
@@ -177,7 +183,8 @@ export async function toggleUserActive(id: string, is_active: boolean) {
export async function deleteUser(id: string) {
try {
const user = await prisma.user.findUnique({ where: { id } })
if (user?.role === 'superadmin') return { success: false, error: 'Data Superadmin tidak bisa dihapus.' }
if (user?.role === 'superadmin')
return { success: false, error: 'Data Superadmin tidak bisa dihapus.' }
await prisma.user.delete({ where: { id } })
revalidatePath('/users')
@@ -192,7 +199,7 @@ export async function resetUserPassword(id: string, newPass: string) {
const hashed = await hashPassword(newPass)
await prisma.user.update({
where: { id },
data: { password: hashed }
data: { password: hashed },
})
revalidatePath('/users')
return { success: true }
@@ -205,21 +212,21 @@ export async function resetUserPassword(id: string, newPass: string) {
export async function getAvailableOrders() {
const startOfDay = new Date()
startOfDay.setHours(0, 0, 0, 0)
const endOfDay = new Date()
endOfDay.setHours(23, 59, 59, 999)
return await prisma.order.findMany({
where: {
status: 'OPEN',
date: { gte: startOfDay, lte: endOfDay }
date: { gte: startOfDay, lte: endOfDay },
},
include: {
creator: true,
available_items: true,
submissions: { select: { user_id: true } }
submissions: { select: { user_id: true } },
},
orderBy: { date: 'desc' }
orderBy: { date: 'desc' },
})
}
@@ -228,19 +235,19 @@ export async function getMyOrders(creator_id: string) {
where: { creator_id },
include: {
available_items: true,
submissions: { select: { id: true, payment_status: true } }
submissions: { select: { id: true, payment_status: true } },
},
orderBy: { date: 'desc' }
orderBy: { date: 'desc' },
})
}
export async function createOrder(data: {
creator_id: string;
title: string;
description?: string;
date: Date;
allow_custom: boolean;
available_items: string[];
creator_id: string
title: string
description?: string
date: Date
allow_custom: boolean
available_items: string[]
}) {
try {
const order = await prisma.order.create({
@@ -252,14 +259,14 @@ export async function createOrder(data: {
creator_id: data.creator_id,
status: 'DRAFT',
available_items: {
create: data.available_items.map(name => ({ name }))
}
}
create: data.available_items.map((name) => ({ name })),
},
},
})
revalidatePath('/my-orders')
return { success: true, order }
} catch (error) {
console.error("Create Order Error:", error)
console.error('Create Order Error:', error)
return { success: false, error: 'Gagal membuat order.' }
}
}
@@ -268,10 +275,10 @@ export async function duplicateOrder(order_id: string) {
try {
const oldOrder = await prisma.order.findUnique({
where: { id: order_id },
include: { available_items: true }
include: { available_items: true },
})
if (!oldOrder) return { success: false, error: 'Order tidak ditemukan' }
const newOrder = await prisma.order.create({
data: {
title: oldOrder.title + ' (Copy)',
@@ -281,9 +288,12 @@ export async function duplicateOrder(order_id: string) {
creator_id: oldOrder.creator_id,
status: 'DRAFT',
available_items: {
create: oldOrder.available_items.map(ai => ({ name: ai.name, is_sold_out: ai.is_sold_out }))
}
}
create: oldOrder.available_items.map((ai) => ({
name: ai.name,
is_sold_out: ai.is_sold_out,
})),
},
},
})
revalidatePath('/my-orders')
return { success: true, order: newOrder }
@@ -292,33 +302,38 @@ export async function duplicateOrder(order_id: string) {
}
}
export async function updateOrder(order_id: string, data: {
title: string;
description?: string;
allow_custom: boolean;
available_items: { name: string; is_sold_out: boolean }[];
}) {
export async function updateOrder(
order_id: string,
data: {
title: string
description?: string
allow_custom: boolean
available_items: { name: string; is_sold_out: boolean }[]
}
) {
try {
const order = await prisma.order.findUnique({
where: { id: order_id }
where: { id: order_id },
})
if (!order) return { success: false, error: 'Order tidak ditemukan' }
if (order.status === 'CLOSE') {
return { success: false, error: 'Order dengan status CLOSE tidak dapat diedit.' }
}
// Check if order date is today
const orderDate = new Date(order.date)
const today = new Date()
if (orderDate.getDate() !== today.getDate() ||
orderDate.getMonth() !== today.getMonth() ||
orderDate.getFullYear() !== today.getFullYear()) {
if (
orderDate.getDate() !== today.getDate() ||
orderDate.getMonth() !== today.getMonth() ||
orderDate.getFullYear() !== today.getFullYear()
) {
return { success: false, error: 'Hanya pesanan hari ini yang dapat diedit.' }
}
// Delete existing available items and insert updated ones
await prisma.availableItem.deleteMany({
where: { order_id }
where: { order_id },
})
const updatedOrder = await prisma.order.update({
@@ -328,9 +343,12 @@ export async function updateOrder(order_id: string, data: {
description: data.description || null,
allow_custom: data.allow_custom,
available_items: {
create: data.available_items.map(item => ({ name: item.name, is_sold_out: item.is_sold_out }))
}
}
create: data.available_items.map((item) => ({
name: item.name,
is_sold_out: item.is_sold_out,
})),
},
},
})
revalidatePath('/my-orders')
@@ -338,7 +356,7 @@ export async function updateOrder(order_id: string, data: {
revalidatePath('/')
return { success: true, order: updatedOrder }
} catch (error: any) {
console.error("Update Order Error:", error)
console.error('Update Order Error:', error)
return { success: false, error: 'Gagal memperbarui order: ' + error?.message }
}
}
@@ -347,7 +365,7 @@ export async function updateOrderStatus(order_id: string, status: string) {
try {
await prisma.order.update({
where: { id: order_id },
data: { status }
data: { status },
})
revalidatePath('/my-orders')
revalidatePath('/')
@@ -360,15 +378,18 @@ export async function updateOrderStatus(order_id: string, status: string) {
export async function deleteOrder(order_id: string) {
try {
const order = await prisma.order.findUnique({
where: { id: order_id }
where: { id: order_id },
})
if (!order) return { success: false, error: 'Order tidak ditemukan.' }
if (order.status === 'OPEN') {
return { success: false, error: 'Order berstatus OPEN tidak dapat dihapus. Silakan tutup (CLOSE) terlebih dahulu.' }
return {
success: false,
error: 'Order berstatus OPEN tidak dapat dihapus. Silakan tutup (CLOSE) terlebih dahulu.',
}
}
await prisma.order.delete({
where: { id: order_id }
where: { id: order_id },
})
revalidatePath('/my-orders')
@@ -389,18 +410,24 @@ export async function getOrderDetail(order_id: string) {
submissions: {
include: {
user: true,
items: true
}
}
}
items: true,
},
},
},
})
}
export async function updateSubmissionPayment(submission_id: string, bill: number | null, payment_status: string, paid_amount: number | null = null, saldo_used: number = 0) {
export async function updateSubmissionPayment(
submission_id: string,
bill: number | null,
payment_status: string,
paid_amount: number | null = null,
saldo_used: number = 0
) {
try {
await prisma.submission.update({
where: { id: submission_id },
data: { bill, payment_status, paid_amount, saldo_used }
data: { bill, payment_status, paid_amount, saldo_used },
})
revalidatePath(`/my-orders`)
revalidatePath(`/my-purchases`)
@@ -408,27 +435,40 @@ export async function updateSubmissionPayment(submission_id: string, bill: numbe
revalidatePath(`/balances`)
return { success: true }
} catch (e) {
console.error(e); return { success: false, error: 'Gagal menyimpan tagihan.' }
console.error(e)
return { success: false, error: 'Gagal menyimpan tagihan.' }
}
}
export async function updateBulkSubmissionPayment(submission_ids: string[], payment_status: string, use_balance: boolean = false) {
export async function updateBulkSubmissionPayment(
submission_ids: string[],
payment_status: string,
use_balance: boolean = false
) {
try {
if (payment_status === 'LUNAS') {
const submissions = await prisma.submission.findMany({ where: { id: { in: submission_ids } } })
const ops = submissions.map(sub => prisma.submission.update({
where: { id: sub.id },
data: {
payment_status,
paid_amount: use_balance ? (sub.paid_amount || 0) : (sub.paid_amount != null ? sub.paid_amount : sub.bill),
saldo_used: use_balance ? Math.max(0, (sub.bill || 0) - (sub.paid_amount || 0)) : 0
}
}))
const submissions = await prisma.submission.findMany({
where: { id: { in: submission_ids } },
})
const ops = submissions.map((sub) =>
prisma.submission.update({
where: { id: sub.id },
data: {
payment_status,
paid_amount: use_balance
? sub.paid_amount || 0
: sub.paid_amount != null
? sub.paid_amount
: sub.bill,
saldo_used: use_balance ? Math.max(0, (sub.bill || 0) - (sub.paid_amount || 0)) : 0,
},
})
)
await prisma.$transaction(ops)
} else {
await prisma.submission.updateMany({
where: { id: { in: submission_ids } },
data: { payment_status }
data: { payment_status },
})
}
revalidatePath(`/my-orders`)
@@ -443,25 +483,25 @@ export async function updateBulkSubmissionPayment(submission_ids: string[], paym
}
export async function processBulkPayment(data: {
submission_ids: string[];
cash_amount: number;
use_balance: boolean;
creator_id: string;
user_id: string;
submission_ids: string[]
cash_amount: number
use_balance: boolean
creator_id: string
user_id: string
}) {
try {
let currentBalance = 0
if (data.use_balance) {
const balanceData = await getBalancesAsCreator(data.creator_id)
const userBalance = balanceData.find(b => b.user.id === data.user_id)
const userBalance = balanceData.find((b) => b.user.id === data.user_id)
if (userBalance) currentBalance = userBalance.amount
}
const submissions = await prisma.submission.findMany({
where: { id: { in: data.submission_ids } },
include: { order: { select: { date: true } } }
include: { order: { select: { date: true } } },
})
// Sort by order date ascending (oldest first)
submissions.sort((a, b) => new Date(a.order.date).getTime() - new Date(b.order.date).getTime())
@@ -474,16 +514,16 @@ export async function processBulkPayment(data: {
for (let i = 0; i < submissions.length; i++) {
const sub = submissions[i]
const isLast = i === submissions.length - 1
const subBill = sub.bill || 0
const prevPaid = sub.paid_amount || 0
const amountToCover = Math.max(0, subBill - prevPaid)
if (totalAvailable >= amountToCover && amountToCover > 0) {
// Fully covered -> LUNAS
let balanceToUse = Math.min(remainingBalance, amountToCover)
remainingBalance -= balanceToUse
let cashToUse = amountToCover - balanceToUse
remainingCash -= cashToUse
totalAvailable -= amountToCover
@@ -494,47 +534,55 @@ export async function processBulkPayment(data: {
remainingCash = 0
}
ops.push(prisma.submission.update({
where: { id: sub.id },
data: { payment_status: 'LUNAS', paid_amount: finalPaid }
}))
ops.push(
prisma.submission.update({
where: { id: sub.id },
data: { payment_status: 'LUNAS', paid_amount: finalPaid },
})
)
} else if (totalAvailable >= amountToCover && amountToCover === 0) {
// It's already fully paid somehow, just mark LUNAS. Give excess cash if last.
let finalPaid = prevPaid
if (isLast && remainingCash > 0) {
finalPaid += remainingCash
remainingCash = 0
finalPaid += remainingCash
remainingCash = 0
}
ops.push(prisma.submission.update({
where: { id: sub.id },
data: { payment_status: 'LUNAS', paid_amount: finalPaid }
}))
ops.push(
prisma.submission.update({
where: { id: sub.id },
data: { payment_status: 'LUNAS', paid_amount: finalPaid },
})
)
} else if (totalAvailable > 0) {
// Partially covered -> BELUM_BAYAR. Only use cash.
let finalPaid = prevPaid + remainingCash
remainingCash = 0
totalAvailable = remainingBalance // only balance left, which can't be used
ops.push(prisma.submission.update({
where: { id: sub.id },
data: { payment_status: 'BELUM_BAYAR', paid_amount: finalPaid }
}))
ops.push(
prisma.submission.update({
where: { id: sub.id },
data: { payment_status: 'BELUM_BAYAR', paid_amount: finalPaid },
})
)
} else {
// totalAvailable == 0. No more money. Just leave it as is, or update to BELUM_BAYAR.
ops.push(prisma.submission.update({
where: { id: sub.id },
data: { payment_status: 'BELUM_BAYAR' }
}))
ops.push(
prisma.submission.update({
where: { id: sub.id },
data: { payment_status: 'BELUM_BAYAR' },
})
)
}
}
await prisma.$transaction(ops)
revalidatePath(`/my-orders`)
revalidatePath(`/my-purchases`)
revalidatePath(`/reports`)
revalidatePath(`/balances`)
return { success: true }
} catch (e) {
console.error(e)
@@ -546,7 +594,7 @@ export async function processBulkPayment(data: {
export async function getUserSubmission(order_id: string, user_id: string) {
return await prisma.submission.findFirst({
where: { order_id, user_id },
include: { items: true }
include: { items: true },
})
}
@@ -557,21 +605,21 @@ export async function getMyPurchases(user_id: string) {
order: {
include: {
creator: true,
available_items: true
}
available_items: true,
},
},
items: true
items: true,
},
orderBy: {
order: { date: 'desc' }
}
order: { date: 'desc' },
},
})
}
export async function submitOrder(data: {
order_id: string;
user_id: string;
items: Array<{ name: string; qty: number; is_custom: boolean; note?: string }>;
order_id: string
user_id: string
items: Array<{ name: string; qty: number; is_custom: boolean; note?: string }>
}) {
try {
if (data.items.length === 0) {
@@ -580,17 +628,18 @@ export async function submitOrder(data: {
const order = await prisma.order.findUnique({ where: { id: data.order_id } })
if (!order) return { success: false, error: 'Pesanan tidak ditemukan.' }
if (order.status !== 'OPEN') return { success: false, error: 'Pesanan sudah ditutup atau masih draft.' }
if (order.status !== 'OPEN')
return { success: false, error: 'Pesanan sudah ditutup atau masih draft.' }
const itemsToCreate = data.items.map(item => ({
const itemsToCreate = data.items.map((item) => ({
name: item.name,
qty: item.qty,
is_custom: item.is_custom,
note: item.note || null
note: item.note || null,
}))
const existing = await prisma.submission.findFirst({
where: { order_id: data.order_id, user_id: data.user_id }
where: { order_id: data.order_id, user_id: data.user_id },
})
if (existing) {
@@ -599,9 +648,9 @@ export async function submitOrder(data: {
where: { id: existing.id },
data: {
items: {
create: itemsToCreate
}
}
create: itemsToCreate,
},
},
})
} else {
await prisma.submission.create({
@@ -609,16 +658,16 @@ export async function submitOrder(data: {
order_id: data.order_id,
user_id: data.user_id,
items: {
create: itemsToCreate
}
}
create: itemsToCreate,
},
},
})
}
revalidatePath('/')
revalidatePath('/my-purchases')
revalidatePath(`/my-orders/${data.order_id}`)
return { success: true }
} catch (error) {
console.error(error)
@@ -633,18 +682,18 @@ export async function getSubmittorReport(user_id: string, startDate?: Date, endD
user_id,
order: {
status: 'CLOSE',
...(startDate && endDate ? { date: { gte: startDate, lte: endDate } } : {})
}
...(startDate && endDate ? { date: { gte: startDate, lte: endDate } } : {}),
},
},
include: {
order: {
include: { creator: true }
include: { creator: true },
},
items: true
items: true,
},
orderBy: {
order: { date: 'desc' }
}
order: { date: 'desc' },
},
})
}
@@ -653,17 +702,17 @@ export async function getCreatorReport(creator_id: string, startDate?: Date, end
where: {
creator_id,
status: 'CLOSE',
...(startDate && endDate ? { date: { gte: startDate, lte: endDate } } : {})
...(startDate && endDate ? { date: { gte: startDate, lte: endDate } } : {}),
},
include: {
submissions: {
include: {
user: true,
items: true
}
}
items: true,
},
},
},
orderBy: { date: 'desc' }
orderBy: { date: 'desc' },
})
}
@@ -671,25 +720,25 @@ export async function getCreatorReport(creator_id: string, startDate?: Date, end
export async function getBalancesAsCreator(creator_id: string) {
const submissions = await prisma.submission.findMany({
where: {
order: { creator_id }
order: { creator_id },
},
include: {
user: { select: { id: true, name: true, photo: true } }
}
user: { select: { id: true, name: true, photo: true } },
},
})
const balanceMap = new Map<string, { user: any, amount: number }>()
submissions.forEach(sub => {
let diff = 0;
const balanceMap = new Map<string, { user: any; amount: number }>()
submissions.forEach((sub) => {
let diff = 0
if (sub.payment_status === 'LUNAS') {
if (sub.bill != null) {
diff = (sub.paid_amount || 0) - sub.bill;
diff = (sub.paid_amount || 0) - sub.bill
}
} else {
diff = -(sub.saldo_used || 0);
diff = -(sub.saldo_used || 0)
}
if (diff !== 0) {
if (!balanceMap.has(sub.user.id)) {
balanceMap.set(sub.user.id, { user: sub.user, amount: diff })
@@ -699,33 +748,33 @@ export async function getBalancesAsCreator(creator_id: string) {
}
})
return Array.from(balanceMap.values()).filter(b => b.amount !== 0)
return Array.from(balanceMap.values()).filter((b) => b.amount !== 0)
}
export async function getBalancesAsSubmittor(user_id: string) {
const submissions = await prisma.submission.findMany({
where: {
user_id
user_id,
},
include: {
order: {
include: {
creator: { select: { id: true, name: true, photo: true } }
}
}
}
creator: { select: { id: true, name: true, photo: true } },
},
},
},
})
const balanceMap = new Map<string, { creator: any, amount: number }>()
submissions.forEach(sub => {
let diff = 0;
const balanceMap = new Map<string, { creator: any; amount: number }>()
submissions.forEach((sub) => {
let diff = 0
if (sub.payment_status === 'LUNAS') {
if (sub.bill != null) {
diff = (sub.paid_amount || 0) - sub.bill;
diff = (sub.paid_amount || 0) - sub.bill
}
} else {
diff = -(sub.saldo_used || 0);
diff = -(sub.saldo_used || 0)
}
if (diff !== 0) {
@@ -738,26 +787,27 @@ export async function getBalancesAsSubmittor(user_id: string) {
}
})
return Array.from(balanceMap.values()).filter(b => b.amount !== 0)
return Array.from(balanceMap.values()).filter((b) => b.amount !== 0)
}
export async function deleteSubmission(submission_id: string, user_id: string) {
try {
const submission = await prisma.submission.findUnique({
where: { id: submission_id },
include: { order: true }
});
include: { order: true },
})
if (!submission) return { success: false, error: 'Pesanan tidak ditemukan' };
if (submission.user_id !== user_id) return { success: false, error: 'Tidak ada akses' };
if (submission.order.status !== 'OPEN') return { success: false, error: 'Hanya bisa membatalkan PO yang OPEN' };
if (!submission) return { success: false, error: 'Pesanan tidak ditemukan' }
if (submission.user_id !== user_id) return { success: false, error: 'Tidak ada akses' }
if (submission.order.status !== 'OPEN')
return { success: false, error: 'Hanya bisa membatalkan PO yang OPEN' }
await prisma.submission.delete({
where: { id: submission_id }
});
return { success: true };
where: { id: submission_id },
})
return { success: true }
} catch (error) {
return { success: false, error: 'Gagal membatalkan pesanan' };
return { success: false, error: 'Gagal membatalkan pesanan' }
}
}
@@ -766,7 +816,7 @@ export async function deleteSubmission(submission_id: string, user_id: string) {
export async function getSettings() {
const settings = await prisma.setting.findMany()
const obj: Record<string, string> = {}
settings.forEach(s => {
settings.forEach((s) => {
obj[s.key] = s.value
})
return obj
@@ -778,7 +828,7 @@ export async function updateSettings(settings: Record<string, string>) {
await prisma.setting.upsert({
where: { key },
update: { value: settings[key] },
create: { key, value: settings[key] }
create: { key, value: settings[key] },
})
}
return { success: true }
@@ -793,22 +843,24 @@ export async function updateSettings(settings: Record<string, string>) {
export async function broadcastToMattermost(orderId: string, orderUrl: string) {
try {
const order = await prisma.order.findUnique({
where: { id: orderId }
where: { id: orderId },
})
if (!order) return { success: false, error: 'Order not found' }
const settings = await getSettings()
const webhookUrl = settings.MATTERMOST_WEBHOOK_URL
let template = settings.MATTERMOST_TEMPLATE || 'Halo tim! Lagi ada orderan open nih untuk {title}. Mumpung belum di-checkout, yang mau ikutan nitip bisa langsung cek ke sini ya: {url}'
let template =
settings.MATTERMOST_TEMPLATE ||
'Halo tim! Lagi ada orderan open nih untuk {title}. Mumpung belum di-checkout, yang mau ikutan nitip bisa langsung cek ke sini ya: {url}'
if (!webhookUrl) return { success: false, error: 'Webhook URL belum di-setting' }
const message = template.replace('{title}', order.title).replace('{url}', orderUrl)
const res = await fetch(webhookUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ text: message })
body: JSON.stringify({ text: message }),
})
if (!res.ok) {