generated from corrad-software/corrad-af-2024
88 lines
1.9 KiB
JavaScript
88 lines
1.9 KiB
JavaScript
import prisma from "../../utils/prisma";
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
try {
|
|
// Get query parameters
|
|
const query = getQuery(event);
|
|
const page = parseInt(query.page) || 1;
|
|
const limit = parseInt(query.limit) || 10;
|
|
const search = query.search || '';
|
|
const orgId = query.org_id ? parseInt(query.org_id) : null;
|
|
|
|
// Calculate pagination
|
|
const skip = (page - 1) * limit;
|
|
|
|
// Define filters
|
|
const filters = {
|
|
where: {}
|
|
};
|
|
|
|
// Filter by organization if provided
|
|
if (orgId) {
|
|
filters.where.org_id = orgId;
|
|
}
|
|
|
|
// Add search filter if provided
|
|
if (search) {
|
|
filters.where = {
|
|
...filters.where,
|
|
dp_name: {
|
|
contains: search
|
|
}
|
|
};
|
|
}
|
|
|
|
// Get departments with pagination
|
|
const [departments, total] = await Promise.all([
|
|
prisma.department.findMany({
|
|
...filters,
|
|
skip,
|
|
take: limit,
|
|
orderBy: {
|
|
dp_name: 'asc'
|
|
},
|
|
include: {
|
|
organization: {
|
|
select: {
|
|
org_id: true,
|
|
org_name: true
|
|
}
|
|
},
|
|
_count: {
|
|
select: {
|
|
cabinets: true,
|
|
user: true
|
|
}
|
|
}
|
|
}
|
|
}),
|
|
prisma.department.count(filters)
|
|
]);
|
|
|
|
// Calculate pagination metadata
|
|
const totalPages = Math.ceil(total / limit);
|
|
const hasNextPage = page < totalPages;
|
|
const hasPrevPage = page > 1;
|
|
|
|
return {
|
|
statusCode: 200,
|
|
data: departments,
|
|
meta: {
|
|
page,
|
|
limit,
|
|
total,
|
|
totalPages,
|
|
hasNextPage,
|
|
hasPrevPage
|
|
}
|
|
};
|
|
} catch (error) {
|
|
console.error("Error fetching departments:", error);
|
|
|
|
return {
|
|
statusCode: 500,
|
|
message: "Internal server error",
|
|
error: error.message
|
|
};
|
|
}
|
|
});
|