index.js
4.48 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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import is from '@sindresorhus/is'
import destr from 'destr'
import { HttpResponse, http } from 'msw'
import { db } from '@db/apps/users/db'
import { paginateArray } from '@api-utils/paginateArray'
export const handlerAppsUsers = [
// Get Users Details
http.get(('/api/apps/users'), ({ request }) => {
const url = new URL(request.url)
const q = url.searchParams.get('q')
const role = url.searchParams.get('role')
const plan = url.searchParams.get('plan')
const status = url.searchParams.get('status')
const sortBy = url.searchParams.get('sortBy')
const itemsPerPage = url.searchParams.get('itemsPerPage')
const page = url.searchParams.get('page')
const orderBy = url.searchParams.get('orderBy')
const searchQuery = is.string(q) ? q : undefined
const queryLower = (searchQuery ?? '').toString().toLowerCase()
const parsedSortBy = destr(sortBy)
const sortByLocal = is.string(parsedSortBy) ? parsedSortBy : ''
const parsedOrderBy = destr(orderBy)
const orderByLocal = is.string(parsedOrderBy) ? parsedOrderBy : ''
const parsedItemsPerPage = destr(itemsPerPage)
const parsedPage = destr(page)
const itemsPerPageLocal = is.number(parsedItemsPerPage) ? parsedItemsPerPage : 10
const pageLocal = is.number(parsedPage) ? parsedPage : 1
// filter users
let filteredUsers = db.users.filter(user => ((user.fullName.toLowerCase().includes(queryLower) || user.email.toLowerCase().includes(queryLower)) && user.role === (role || user.role) && user.currentPlan === (plan || user.currentPlan) && user.status === (status || user.status))).reverse()
// sort users
if (sortByLocal) {
if (sortByLocal === 'user') {
filteredUsers = filteredUsers.sort((a, b) => {
if (orderByLocal === 'asc')
return a.fullName.localeCompare(b.fullName)
else
return b.fullName.localeCompare(a.fullName)
})
}
if (sortByLocal === 'email') {
filteredUsers = filteredUsers.sort((a, b) => {
if (orderByLocal === 'asc')
return a.email.localeCompare(b.email)
else
return b.email.localeCompare(a.email)
})
}
if (sortByLocal === 'role') {
filteredUsers = filteredUsers.sort((a, b) => {
if (orderByLocal === 'asc')
return a.role.localeCompare(b.role)
else
return b.role.localeCompare(a.role)
})
}
if (sortByLocal === 'plan') {
filteredUsers = filteredUsers.sort((a, b) => {
if (orderByLocal === 'asc')
return a.currentPlan.localeCompare(b.currentPlan)
else
return b.currentPlan.localeCompare(a.currentPlan)
})
}
if (sortByLocal === 'status') {
filteredUsers = filteredUsers.sort((a, b) => {
if (orderByLocal === 'asc')
return a.status.localeCompare(b.status)
else
return b.status.localeCompare(a.status)
})
}
}
const totalUsers = filteredUsers.length
// total pages
const totalPages = Math.ceil(totalUsers / itemsPerPageLocal)
return HttpResponse.json({
users: paginateArray(filteredUsers, itemsPerPageLocal, pageLocal),
totalPages,
totalUsers,
page: pageLocal > Math.ceil(totalUsers / itemsPerPageLocal) ? 1 : page,
}, { status: 200 })
}),
// Get Single User Detail
http.get(('/api/apps/users/:id'), ({ params }) => {
const userId = Number(params.id)
const user = db.users.find(e => e.id === userId)
if (!user) {
return HttpResponse.json({ message: 'User not found' }, { status: 404 })
}
else {
return HttpResponse.json({
...user,
...{
taskDone: 1230,
projectDone: 568,
taxId: 'Tax-8894',
language: 'English',
},
}, { status: 200 })
}
}),
// Delete User
http.delete(('/api/apps/users/:id'), ({ params }) => {
const userId = Number(params.id)
const userIndex = db.users.findIndex(e => e.id === userId)
if (userIndex === -1) {
return HttpResponse.json('User not found', { status: 404 })
}
else {
db.users.splice(userIndex, 1)
return new HttpResponse(null, {
status: 204,
})
}
}),
// 👉 Add user
http.post(('/api/apps/users'), async ({ request }) => {
const user = await request.json()
db.users.push({
...user,
id: db.users.length + 1,
})
return HttpResponse.json({ body: user }, { status: 201 })
}),
]