list.ts 2.08 KB
import { faker } from '@faker-js/faker';
import { eventHandler, getQuery } from 'h3';
import { verifyAccessToken } from '~/utils/jwt-utils';
import {
  sleep,
  unAuthorizedResponse,
  usePageResponseSuccess,
} from '~/utils/response';

function createPhone() {
  const suffix = faker.string.numeric({ length: 8 });
  return `1${faker.helpers.arrayElement(['3', '5', '6', '7', '8', '9'])}${suffix}`;
}

function createCustomers(count: number) {
  return Array.from({ length: count }, () => ({
    id: faker.string.uuid(),
    name: faker.person.fullName(),
    phone: createPhone(),
    status: faker.helpers.arrayElement(['active', 'disabled']),
    createdAt: faker.date.past().toISOString().slice(0, 19).replace('T', ' '),
  }));
}

const mockData = createCustomers(120);

export default eventHandler(async (event) => {
  const userinfo = verifyAccessToken(event);
  if (!userinfo) {
    return unAuthorizedResponse(event);
  }

  await sleep(300);

  const { keyword, page, pageSize, status } = getQuery(event);
  const keyword_raw = Array.isArray(keyword) ? keyword[0] : keyword;
  const status_raw = Array.isArray(status) ? status[0] : status;
  const page_raw = Array.isArray(page) ? page[0] : page;
  const page_size_raw = Array.isArray(pageSize) ? pageSize[0] : pageSize;

  const page_number = Math.max(
    1,
    Number.parseInt(String(page_raw ?? '1'), 10) || 1,
  );
  const page_size_number = Math.min(
    100,
    Math.max(1, Number.parseInt(String(page_size_raw ?? '10'), 10) || 10),
  );

  const list_data = structuredClone(mockData);

  const keyword_str = typeof keyword_raw === 'string' ? keyword_raw.trim() : '';
  const status_str =
    status_raw === 'active' || status_raw === 'disabled' ? status_raw : '';

  const filtered = list_data.filter((item) => {
    const keyword_ok =
      !keyword_str ||
      item.name.includes(keyword_str) ||
      item.phone.includes(keyword_str);
    const status_ok = !status_str || item.status === status_str;
    return keyword_ok && status_ok;
  });

  return usePageResponseSuccess(
    String(page_number),
    String(page_size_number),
    filtered,
  );
});