-
-
Notifications
You must be signed in to change notification settings - Fork 407
Expand file tree
/
Copy pathroute.ts
More file actions
92 lines (77 loc) · 2.92 KB
/
route.ts
File metadata and controls
92 lines (77 loc) · 2.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import { NextRequest, NextResponse } from 'next/server';
import { getEmployeesStore, setEmployeesStore } from '../../employeesStore';
import type { Employee } from '../../mocks/employees';
import type { GridFilterModel, GridPaginationModel, GridSortModel } from '@mui/x-data-grid';
import type { OmitId } from '@toolpad/core/Crud';
export async function GET(req: NextRequest) {
const { searchParams } = new URL(req.url);
const page: GridPaginationModel['page'] = Number(searchParams.get('page')) || 0;
const pageSize: GridPaginationModel['pageSize'] = Number(searchParams.get('pageSize')) || 10;
const sortModel: GridSortModel = searchParams.get('sort')
? JSON.parse(searchParams.get('sort')!)
: [];
const filterModel: GridFilterModel = searchParams.get('filter')
? JSON.parse(searchParams.get('filter')!)
: [];
const employeesStore = getEmployeesStore();
let filteredEmployees = [...employeesStore];
// Apply filters (example only)
if (filterModel?.items?.length) {
filterModel.items.forEach(({ field, value, operator }) => {
if (!field || value == null) {
return;
}
filteredEmployees = filteredEmployees.filter((employee) => {
const employeeValue = employee[field];
switch (operator) {
case 'contains':
return String(employeeValue).toLowerCase().includes(String(value).toLowerCase());
case 'equals':
return employeeValue === value;
case 'startsWith':
return String(employeeValue).toLowerCase().startsWith(String(value).toLowerCase());
case 'endsWith':
return String(employeeValue).toLowerCase().endsWith(String(value).toLowerCase());
case '>':
return (employeeValue as number) > value;
case '<':
return (employeeValue as number) < value;
default:
return true;
}
});
});
}
// Apply sorting
if (sortModel?.length) {
filteredEmployees.sort((a, b) => {
for (const { field, sort } of sortModel) {
if ((a[field] as number) < (b[field] as number)) {
return sort === 'asc' ? -1 : 1;
}
if ((a[field] as number) > (b[field] as number)) {
return sort === 'asc' ? 1 : -1;
}
}
return 0;
});
}
// Apply pagination
const start = page * pageSize;
const end = start + pageSize;
const paginatedEmployees = filteredEmployees.slice(start, end);
return NextResponse.json({
items: paginatedEmployees,
itemCount: filteredEmployees.length,
});
}
export async function POST(req: NextRequest) {
const body: OmitId<Employee> = await req.json();
const employeesStore = getEmployeesStore();
const newEmployee = {
id: employeesStore.reduce((max, employee) => Math.max(max, employee.id), 0) + 1,
...body,
} as Employee;
setEmployeesStore([...employeesStore, newEmployee]);
return NextResponse.json(newEmployee, { status: 201 });
}