upd: user staff
Deskripsi: - connected to database pada halaman user - tambah user - delete user - update user No Issues
This commit is contained in:
95
src/app.ts
95
src/app.ts
@@ -285,7 +285,7 @@ export function createApp() {
|
||||
|
||||
.get('/api/operators/stats', async () => {
|
||||
const [totalStaff, activeNow, rolesGroup] = await Promise.all([
|
||||
prisma.user.count(),
|
||||
prisma.user.count({where: {active: true}}),
|
||||
prisma.session.count({
|
||||
where: { expiresAt: { gte: new Date() } },
|
||||
}),
|
||||
@@ -302,6 +302,99 @@ export function createApp() {
|
||||
}
|
||||
})
|
||||
|
||||
.post('/api/operators', async ({ request, set }) => {
|
||||
const cookie = request.headers.get('cookie') ?? ''
|
||||
const token = cookie.match(/session=([^;]+)/)?.[1]
|
||||
let userId: string | undefined
|
||||
if (token) {
|
||||
const session = await prisma.session.findUnique({ where: { token } })
|
||||
if (session && session.expiresAt > new Date()) userId = session.userId
|
||||
}
|
||||
|
||||
const body = (await request.json()) as { name: string; email: string; password: string; role: string }
|
||||
|
||||
const existing = await prisma.user.findUnique({ where: { email: body.email } })
|
||||
if (existing) {
|
||||
set.status = 400
|
||||
return { error: 'Email sudah terdaftar' }
|
||||
}
|
||||
|
||||
const hashedPassword = await Bun.password.hash(body.password)
|
||||
const user = await prisma.user.create({
|
||||
data: {
|
||||
name: body.name,
|
||||
email: body.email,
|
||||
password: hashedPassword,
|
||||
role: body.role as any,
|
||||
},
|
||||
})
|
||||
|
||||
if (userId) {
|
||||
await createSystemLog(userId, 'CREATE', `Created new user: ${body.name} (${body.email})`)
|
||||
}
|
||||
|
||||
return { id: user.id, name: user.name, email: user.email, role: user.role }
|
||||
})
|
||||
|
||||
.patch('/api/operators/:id', async ({ params: { id }, request, set }) => {
|
||||
const cookie = request.headers.get('cookie') ?? ''
|
||||
const token = cookie.match(/session=([^;]+)/)?.[1]
|
||||
let userId: string | undefined
|
||||
if (token) {
|
||||
const session = await prisma.session.findUnique({ where: { token } })
|
||||
if (session && session.expiresAt > new Date()) userId = session.userId
|
||||
}
|
||||
|
||||
const body = (await request.json()) as { name?: string; email?: string; role?: string; active?: boolean }
|
||||
|
||||
const user = await prisma.user.update({
|
||||
where: { id },
|
||||
data: {
|
||||
...(body.name !== undefined && { name: body.name }),
|
||||
...(body.email !== undefined && { email: body.email }),
|
||||
...(body.role !== undefined && { role: body.role as any }),
|
||||
...(body.active !== undefined && { active: body.active }),
|
||||
},
|
||||
})
|
||||
|
||||
if (userId) {
|
||||
await createSystemLog(userId, 'UPDATE', `Updated user: ${user.name} (${user.email})`)
|
||||
}
|
||||
|
||||
return { id: user.id, name: user.name, email: user.email, role: user.role, active: user.active }
|
||||
})
|
||||
|
||||
.delete('/api/operators/:id', async ({ params: { id }, request, set }) => {
|
||||
const cookie = request.headers.get('cookie') ?? ''
|
||||
const token = cookie.match(/session=([^;]+)/)?.[1]
|
||||
let userId: string | undefined
|
||||
if (token) {
|
||||
const session = await prisma.session.findUnique({ where: { token } })
|
||||
if (session && session.expiresAt > new Date()) userId = session.userId
|
||||
}
|
||||
|
||||
const user = await prisma.user.findUnique({ where: { id } })
|
||||
if (!user) {
|
||||
set.status = 404
|
||||
return { error: 'User not found' }
|
||||
}
|
||||
|
||||
// Prevent deleting self
|
||||
if (userId === id) {
|
||||
set.status = 400
|
||||
return { error: 'Cannot delete your own account' }
|
||||
}
|
||||
|
||||
await prisma.session.deleteMany({ where: { userId: id } })
|
||||
await prisma.user.update({ where: { id }, data: { active: false } })
|
||||
|
||||
if (userId) {
|
||||
await createSystemLog(userId, 'DELETE', `Deactivated user: ${user.name} (${user.email})`)
|
||||
}
|
||||
|
||||
return { ok: true }
|
||||
})
|
||||
|
||||
.get('/api/logs/operators', async () => {
|
||||
return await prisma.user.findMany({
|
||||
select: { id: true, name: true, image: true },
|
||||
|
||||
Reference in New Issue
Block a user