complete new audit system
This commit is contained in:
+43
-44
@@ -14,10 +14,9 @@ exports.createRole = createRole;
|
||||
exports.updateRole = updateRole;
|
||||
exports.deleteRole = deleteRole;
|
||||
exports.getAllPermissions = getAllPermissions;
|
||||
const client_1 = require("@prisma/client");
|
||||
const prisma_js_1 = __importDefault(require("../lib/prisma.js"));
|
||||
const bcryptjs_1 = __importDefault(require("bcryptjs"));
|
||||
const helpers_js_1 = require("../utils/helpers.js");
|
||||
const prisma = new client_1.PrismaClient();
|
||||
async function getAllUsers(filters) {
|
||||
const { search, isActive, roleId, page = 1, limit = 20 } = filters;
|
||||
const { skip, take } = (0, helpers_js_1.paginate)(page, limit);
|
||||
@@ -36,7 +35,7 @@ async function getAllUsers(filters) {
|
||||
];
|
||||
}
|
||||
const [users, total] = await Promise.all([
|
||||
prisma.user.findMany({
|
||||
prisma_js_1.default.user.findMany({
|
||||
where,
|
||||
skip,
|
||||
take,
|
||||
@@ -63,12 +62,12 @@ async function getAllUsers(filters) {
|
||||
},
|
||||
},
|
||||
}),
|
||||
prisma.user.count({ where }),
|
||||
prisma_js_1.default.user.count({ where }),
|
||||
]);
|
||||
// Get hidden role IDs
|
||||
const [developerRole, gdprRole] = await Promise.all([
|
||||
prisma.role.findFirst({ where: { name: 'Developer' } }),
|
||||
prisma.role.findFirst({ where: { name: 'DSGVO' } }),
|
||||
prisma_js_1.default.role.findFirst({ where: { name: 'Developer' } }),
|
||||
prisma_js_1.default.role.findFirst({ where: { name: 'DSGVO' } }),
|
||||
]);
|
||||
return {
|
||||
users: users.map((u) => {
|
||||
@@ -89,7 +88,7 @@ async function getAllUsers(filters) {
|
||||
};
|
||||
}
|
||||
async function getUserById(id) {
|
||||
const user = await prisma.user.findUnique({
|
||||
const user = await prisma_js_1.default.user.findUnique({
|
||||
where: { id },
|
||||
select: {
|
||||
id: true,
|
||||
@@ -132,7 +131,7 @@ async function getUserById(id) {
|
||||
}
|
||||
async function createUser(data) {
|
||||
const hashedPassword = await bcryptjs_1.default.hash(data.password, 10);
|
||||
const user = await prisma.user.create({
|
||||
const user = await prisma_js_1.default.user.create({
|
||||
data: {
|
||||
email: data.email,
|
||||
password: hashedPassword,
|
||||
@@ -175,7 +174,7 @@ async function updateUser(id, data) {
|
||||
const rolesAreBeingChanged = roleIds !== undefined;
|
||||
if (isBeingDeactivated || rolesAreBeingChanged) {
|
||||
// Check if user currently has admin permissions
|
||||
const currentUser = await prisma.user.findUnique({
|
||||
const currentUser = await prisma_js_1.default.user.findUnique({
|
||||
where: { id },
|
||||
include: {
|
||||
roles: {
|
||||
@@ -196,7 +195,7 @@ async function updateUser(id, data) {
|
||||
// Check if user will still be admin after role change
|
||||
let willStillBeAdmin = false;
|
||||
if (rolesAreBeingChanged) {
|
||||
const newRoles = await prisma.role.findMany({
|
||||
const newRoles = await prisma_js_1.default.role.findMany({
|
||||
where: { id: { in: roleIds } },
|
||||
include: {
|
||||
permissions: {
|
||||
@@ -211,7 +210,7 @@ async function updateUser(id, data) {
|
||||
}
|
||||
// If user is losing admin status or being deactivated, check for other admins
|
||||
if (!willStillBeAdmin || isBeingDeactivated) {
|
||||
const otherAdminCount = await prisma.user.count({
|
||||
const otherAdminCount = await prisma_js_1.default.user.count({
|
||||
where: {
|
||||
id: { not: id },
|
||||
isActive: true,
|
||||
@@ -249,7 +248,7 @@ async function updateUser(id, data) {
|
||||
// Prüfen ob Rollen geändert werden (für Zwangslogout)
|
||||
let rolesChanged = false;
|
||||
if (roleIds !== undefined) {
|
||||
const currentRoles = await prisma.userRole.findMany({
|
||||
const currentRoles = await prisma_js_1.default.userRole.findMany({
|
||||
where: { userId: id },
|
||||
select: { roleId: true },
|
||||
});
|
||||
@@ -260,7 +259,7 @@ async function updateUser(id, data) {
|
||||
!currentRoleIds.every((id, i) => id === newRoleIds[i]);
|
||||
}
|
||||
// Update user - bei Rollenänderung Token invalidieren
|
||||
await prisma.user.update({
|
||||
await prisma_js_1.default.user.update({
|
||||
where: { id },
|
||||
data: {
|
||||
...userData,
|
||||
@@ -270,8 +269,8 @@ async function updateUser(id, data) {
|
||||
});
|
||||
// Update roles if provided
|
||||
if (roleIds) {
|
||||
await prisma.userRole.deleteMany({ where: { userId: id } });
|
||||
await prisma.userRole.createMany({
|
||||
await prisma_js_1.default.userRole.deleteMany({ where: { userId: id } });
|
||||
await prisma_js_1.default.userRole.createMany({
|
||||
data: roleIds.map((roleId) => ({ userId: id, roleId })),
|
||||
});
|
||||
}
|
||||
@@ -288,20 +287,20 @@ async function updateUser(id, data) {
|
||||
// Helper to set developer access for a user
|
||||
async function setUserDeveloperAccess(userId, enabled) {
|
||||
// Get or create developer:access permission
|
||||
let developerPerm = await prisma.permission.findFirst({
|
||||
let developerPerm = await prisma_js_1.default.permission.findFirst({
|
||||
where: { resource: 'developer', action: 'access' },
|
||||
});
|
||||
if (!developerPerm) {
|
||||
developerPerm = await prisma.permission.create({
|
||||
developerPerm = await prisma_js_1.default.permission.create({
|
||||
data: { resource: 'developer', action: 'access' },
|
||||
});
|
||||
}
|
||||
// Get or create Developer role
|
||||
let developerRole = await prisma.role.findFirst({
|
||||
let developerRole = await prisma_js_1.default.role.findFirst({
|
||||
where: { name: 'Developer' },
|
||||
});
|
||||
if (!developerRole) {
|
||||
developerRole = await prisma.role.create({
|
||||
developerRole = await prisma_js_1.default.role.create({
|
||||
data: {
|
||||
name: 'Developer',
|
||||
description: 'Entwicklerzugriff auf Datenbanktools',
|
||||
@@ -312,25 +311,25 @@ async function setUserDeveloperAccess(userId, enabled) {
|
||||
});
|
||||
}
|
||||
// Check if user already has Developer role
|
||||
const hasRole = await prisma.userRole.findFirst({
|
||||
const hasRole = await prisma_js_1.default.userRole.findFirst({
|
||||
where: { userId, roleId: developerRole.id },
|
||||
});
|
||||
if (enabled && !hasRole) {
|
||||
await prisma.userRole.create({
|
||||
await prisma_js_1.default.userRole.create({
|
||||
data: { userId, roleId: developerRole.id },
|
||||
});
|
||||
// Token invalidieren bei Rechteänderung
|
||||
await prisma.user.update({
|
||||
await prisma_js_1.default.user.update({
|
||||
where: { id: userId },
|
||||
data: { tokenInvalidatedAt: new Date() },
|
||||
});
|
||||
}
|
||||
else if (!enabled && hasRole) {
|
||||
await prisma.userRole.delete({
|
||||
await prisma_js_1.default.userRole.delete({
|
||||
where: { userId_roleId: { userId, roleId: developerRole.id } },
|
||||
});
|
||||
// Token invalidieren bei Rechteänderung
|
||||
await prisma.user.update({
|
||||
await prisma_js_1.default.user.update({
|
||||
where: { id: userId },
|
||||
data: { tokenInvalidatedAt: new Date() },
|
||||
});
|
||||
@@ -339,17 +338,17 @@ async function setUserDeveloperAccess(userId, enabled) {
|
||||
// Helper to set GDPR access for a user
|
||||
async function setUserGdprAccess(userId, enabled) {
|
||||
// Get or create DSGVO role
|
||||
let gdprRole = await prisma.role.findFirst({
|
||||
let gdprRole = await prisma_js_1.default.role.findFirst({
|
||||
where: { name: 'DSGVO' },
|
||||
});
|
||||
if (!gdprRole) {
|
||||
// Create DSGVO role with all audit:* and gdpr:* permissions
|
||||
const gdprPermissions = await prisma.permission.findMany({
|
||||
const gdprPermissions = await prisma_js_1.default.permission.findMany({
|
||||
where: {
|
||||
OR: [{ resource: 'audit' }, { resource: 'gdpr' }],
|
||||
},
|
||||
});
|
||||
gdprRole = await prisma.role.create({
|
||||
gdprRole = await prisma_js_1.default.role.create({
|
||||
data: {
|
||||
name: 'DSGVO',
|
||||
description: 'DSGVO-Zugriff: Audit-Logs und Datenschutz-Verwaltung',
|
||||
@@ -360,23 +359,23 @@ async function setUserGdprAccess(userId, enabled) {
|
||||
});
|
||||
}
|
||||
// Check if user already has DSGVO role
|
||||
const hasRole = await prisma.userRole.findFirst({
|
||||
const hasRole = await prisma_js_1.default.userRole.findFirst({
|
||||
where: { userId, roleId: gdprRole.id },
|
||||
});
|
||||
if (enabled && !hasRole) {
|
||||
await prisma.userRole.create({
|
||||
await prisma_js_1.default.userRole.create({
|
||||
data: { userId, roleId: gdprRole.id },
|
||||
});
|
||||
await prisma.user.update({
|
||||
await prisma_js_1.default.user.update({
|
||||
where: { id: userId },
|
||||
data: { tokenInvalidatedAt: new Date() },
|
||||
});
|
||||
}
|
||||
else if (!enabled && hasRole) {
|
||||
await prisma.userRole.delete({
|
||||
await prisma_js_1.default.userRole.delete({
|
||||
where: { userId_roleId: { userId, roleId: gdprRole.id } },
|
||||
});
|
||||
await prisma.user.update({
|
||||
await prisma_js_1.default.user.update({
|
||||
where: { id: userId },
|
||||
data: { tokenInvalidatedAt: new Date() },
|
||||
});
|
||||
@@ -384,7 +383,7 @@ async function setUserGdprAccess(userId, enabled) {
|
||||
}
|
||||
async function deleteUser(id) {
|
||||
// Check if user is an admin
|
||||
const user = await prisma.user.findUnique({
|
||||
const user = await prisma_js_1.default.user.findUnique({
|
||||
where: { id },
|
||||
include: {
|
||||
roles: {
|
||||
@@ -407,7 +406,7 @@ async function deleteUser(id) {
|
||||
const isAdmin = user.roles.some((ur) => ur.role.permissions.some((rp) => rp.permission.resource === 'users' && rp.permission.action === 'delete'));
|
||||
if (isAdmin) {
|
||||
// Count other admins (users with users:delete permission)
|
||||
const adminCount = await prisma.user.count({
|
||||
const adminCount = await prisma_js_1.default.user.count({
|
||||
where: {
|
||||
id: { not: id },
|
||||
isActive: true,
|
||||
@@ -431,11 +430,11 @@ async function deleteUser(id) {
|
||||
throw new Error('Dieser Benutzer ist der letzte Administrator und kann nicht gelöscht werden');
|
||||
}
|
||||
}
|
||||
return prisma.user.delete({ where: { id } });
|
||||
return prisma_js_1.default.user.delete({ where: { id } });
|
||||
}
|
||||
// Role operations
|
||||
async function getAllRoles() {
|
||||
return prisma.role.findMany({
|
||||
return prisma_js_1.default.role.findMany({
|
||||
include: {
|
||||
permissions: {
|
||||
include: { permission: true },
|
||||
@@ -448,7 +447,7 @@ async function getAllRoles() {
|
||||
});
|
||||
}
|
||||
async function getRoleById(id) {
|
||||
return prisma.role.findUnique({
|
||||
return prisma_js_1.default.role.findUnique({
|
||||
where: { id },
|
||||
include: {
|
||||
permissions: {
|
||||
@@ -458,7 +457,7 @@ async function getRoleById(id) {
|
||||
});
|
||||
}
|
||||
async function createRole(data) {
|
||||
return prisma.role.create({
|
||||
return prisma_js_1.default.role.create({
|
||||
data: {
|
||||
name: data.name,
|
||||
description: data.description,
|
||||
@@ -475,13 +474,13 @@ async function createRole(data) {
|
||||
}
|
||||
async function updateRole(id, data) {
|
||||
const { permissionIds, ...roleData } = data;
|
||||
await prisma.role.update({
|
||||
await prisma_js_1.default.role.update({
|
||||
where: { id },
|
||||
data: roleData,
|
||||
});
|
||||
if (permissionIds) {
|
||||
await prisma.rolePermission.deleteMany({ where: { roleId: id } });
|
||||
await prisma.rolePermission.createMany({
|
||||
await prisma_js_1.default.rolePermission.deleteMany({ where: { roleId: id } });
|
||||
await prisma_js_1.default.rolePermission.createMany({
|
||||
data: permissionIds.map((permissionId) => ({ roleId: id, permissionId })),
|
||||
});
|
||||
}
|
||||
@@ -489,15 +488,15 @@ async function updateRole(id, data) {
|
||||
}
|
||||
async function deleteRole(id) {
|
||||
// Check if role is assigned to any users
|
||||
const count = await prisma.userRole.count({ where: { roleId: id } });
|
||||
const count = await prisma_js_1.default.userRole.count({ where: { roleId: id } });
|
||||
if (count > 0) {
|
||||
throw new Error(`Rolle kann nicht gelöscht werden, da sie ${count} Benutzern zugewiesen ist`);
|
||||
}
|
||||
return prisma.role.delete({ where: { id } });
|
||||
return prisma_js_1.default.role.delete({ where: { id } });
|
||||
}
|
||||
// Permission operations
|
||||
async function getAllPermissions() {
|
||||
return prisma.permission.findMany({
|
||||
return prisma_js_1.default.permission.findMany({
|
||||
orderBy: [{ resource: 'asc' }, { action: 'asc' }],
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user