upd: user dan log activity
This commit is contained in:
100
src/app.ts
100
src/app.ts
@@ -153,8 +153,8 @@ export function createApp() {
|
||||
|
||||
.get('/api/apps', () => [
|
||||
{ id: 'desa-plus', name: 'Desa+', status: 'active', users: 12450, errors: 12, version: '2.4.1' },
|
||||
{ id: 'e-commerce', name: 'E-Commerce', status: 'warning', users: 8900, errors: 45, version: '1.8.0' },
|
||||
{ id: 'fitness-app', name: 'Fitness App', status: 'error', users: 3200, errors: 128, version: '0.9.5' },
|
||||
// { id: 'e-commerce', name: 'E-Commerce', status: 'warning', users: 8900, errors: 45, version: '1.8.0' },
|
||||
// { id: 'fitness-app', name: 'Fitness App', status: 'error', users: 3200, errors: 128, version: '0.9.5' },
|
||||
])
|
||||
|
||||
.get('/api/apps/:appId', ({ params: { appId } }) => {
|
||||
@@ -164,6 +164,102 @@ export function createApp() {
|
||||
return apps[appId as keyof typeof apps] || { id: appId, name: appId, status: 'active', users: 0, errors: 0, version: '1.0.0' }
|
||||
})
|
||||
|
||||
.get('/api/logs', async ({ query }) => {
|
||||
const page = Number(query.page) || 1
|
||||
const limit = Number(query.limit) || 20
|
||||
const search = (query.search as string) || ''
|
||||
const type = query.type as any
|
||||
const userId = query.userId as string
|
||||
|
||||
const where: any = {}
|
||||
if (search) {
|
||||
where.OR = [
|
||||
{ message: { contains: search, mode: 'insensitive' } },
|
||||
{ user: { name: { contains: search, mode: 'insensitive' } } }
|
||||
]
|
||||
}
|
||||
if (type && type !== 'all') {
|
||||
where.type = type
|
||||
}
|
||||
if (userId && userId !== 'all') {
|
||||
where.userId = userId
|
||||
}
|
||||
|
||||
const [logs, total] = await Promise.all([
|
||||
prisma.log.findMany({
|
||||
where,
|
||||
include: { user: { select: { id: true, name: true, email: true, role: true, image: true } } },
|
||||
orderBy: { createdAt: 'desc' },
|
||||
skip: (page - 1) * limit,
|
||||
take: limit,
|
||||
}),
|
||||
prisma.log.count({ where })
|
||||
])
|
||||
|
||||
return {
|
||||
data: logs,
|
||||
totalPages: Math.ceil(total / limit),
|
||||
totalItems: total
|
||||
}
|
||||
})
|
||||
|
||||
.get('/api/operators', async ({ query }) => {
|
||||
const page = Number(query.page) || 1
|
||||
const limit = Number(query.limit) || 20
|
||||
const search = (query.search as string) || ''
|
||||
|
||||
const where: any = {}
|
||||
if (search) {
|
||||
where.OR = [
|
||||
{ name: { contains: search, mode: 'insensitive' } },
|
||||
{ email: { contains: search, mode: 'insensitive' } }
|
||||
]
|
||||
}
|
||||
|
||||
const [users, total] = await Promise.all([
|
||||
prisma.user.findMany({
|
||||
where,
|
||||
select: { id: true, name: true, email: true, role: true, active: true, image: true, createdAt: true },
|
||||
orderBy: { name: 'asc' },
|
||||
skip: (page - 1) * limit,
|
||||
take: limit,
|
||||
}),
|
||||
prisma.user.count({ where })
|
||||
])
|
||||
|
||||
return {
|
||||
data: users,
|
||||
totalPages: Math.ceil(total / limit),
|
||||
totalItems: total
|
||||
}
|
||||
})
|
||||
|
||||
.get('/api/operators/stats', async () => {
|
||||
const [totalStaff, activeNow, rolesGroup] = await Promise.all([
|
||||
prisma.user.count(),
|
||||
prisma.session.count({
|
||||
where: { expiresAt: { gte: new Date() } },
|
||||
}),
|
||||
prisma.user.groupBy({
|
||||
by: ['role'],
|
||||
_count: true
|
||||
})
|
||||
])
|
||||
|
||||
return {
|
||||
totalStaff,
|
||||
activeNow,
|
||||
rolesCount: rolesGroup.length
|
||||
}
|
||||
})
|
||||
|
||||
.get('/api/logs/operators', async () => {
|
||||
return await prisma.user.findMany({
|
||||
select: { id: true, name: true, image: true },
|
||||
orderBy: { name: 'asc' }
|
||||
})
|
||||
})
|
||||
|
||||
// ─── Example API ───────────────────────────────────
|
||||
.get('/api/hello', () => ({
|
||||
message: 'Hello, world!',
|
||||
|
||||
Reference in New Issue
Block a user