This commit is contained in:
Oscar
2026-06-04 13:58:24 +03:00
parent 40a281b87e
commit 2d665fab66
7 changed files with 174 additions and 51 deletions

View File

@@ -13,6 +13,8 @@ export const itemsRouter = Router()
* properties:
* id:
* type: integer
* value:
* type: string
* PaginatedItems:
* type: object
* properties:

View File

@@ -1,28 +1,54 @@
export interface Item {
id: number
value: string
}
export interface PaginatedResult {
data: { id: number }[]
data: Item[]
total: number
page: number
limit: number
hasMore: boolean
}
const allItems: number[] = Array.from({ length: 1_000_000 }, (_, i) => i + 1)
const CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
function randomString(): string {
const len = 6 + Math.floor(Math.random() * 7)
let result = ''
for (let i = 0; i < len; i++) {
result += CHARS[Math.floor(Math.random() * CHARS.length)]
}
return result
}
const itemsById = new Map<number, string>()
const allItemsOrder: number[] = []
for (let i = 1; i <= 1_000_000; i++) {
itemsById.set(i, randomString())
allItemsOrder.push(i)
}
const selectedIds = new Set<number>()
const orderedSelected: number[] = []
export function getItems(page: number, limit: number, search?: string): PaginatedResult {
let filtered: number[]
if (search) {
filtered = allItems.filter(id => !selectedIds.has(id) && String(id).includes(search))
const s = search.toLowerCase()
filtered = allItemsOrder.filter(
id => !selectedIds.has(id) && (String(id).includes(search) || itemsById.get(id)!.toLowerCase().includes(s)),
)
}
else {
filtered = allItems.filter(id => !selectedIds.has(id))
filtered = allItemsOrder.filter(id => !selectedIds.has(id))
}
const total = filtered.length
const start = (page - 1) * limit
const slice = filtered.slice(start, start + limit)
return {
data: slice.map(id => ({ id })),
data: slice.map(id => ({ id, value: itemsById.get(id)! })),
total,
page,
limit,
@@ -33,7 +59,11 @@ export function getItems(page: number, limit: number, search?: string): Paginate
export function getSelectedItems(page: number, limit: number, search?: string): PaginatedResult {
let filtered: number[]
if (search) {
filtered = orderedSelected.filter(id => String(id).includes(search))
const s = search.toLowerCase()
filtered = orderedSelected.filter((id) => {
const value = itemsById.get(id)!
return String(id).includes(search) || value.toLowerCase().includes(s)
})
}
else {
filtered = [...orderedSelected]
@@ -42,7 +72,7 @@ export function getSelectedItems(page: number, limit: number, search?: string):
const start = (page - 1) * limit
const slice = filtered.slice(start, start + limit)
return {
data: slice.map(id => ({ id })),
data: slice.map(id => ({ id, value: itemsById.get(id)! })),
total,
page,
limit,
@@ -51,13 +81,14 @@ export function getSelectedItems(page: number, limit: number, search?: string):
}
export function addItem(id: number): boolean {
if (allItems.includes(id) || selectedIds.has(id)) return false
allItems.push(id)
if (itemsById.has(id)) return false
itemsById.set(id, randomString())
allItemsOrder.push(id)
return true
}
export function selectItem(id: number): boolean {
if (selectedIds.has(id)) return false
if (selectedIds.has(id) || !itemsById.has(id)) return false
selectedIds.add(id)
orderedSelected.push(id)
return true