import { Request, Response } from 'express'; 
 | 
import moment from 'moment'; 
 | 
import { parse } from 'url'; 
 | 
  
 | 
// mock tableListDataSource 
 | 
const genList = (current: number, pageSize: number) => { 
 | 
  const tableListDataSource: API.RuleListItem[] = []; 
 | 
  
 | 
  for (let i = 0; i < pageSize; i += 1) { 
 | 
    const index = (current - 1) * 10 + i; 
 | 
    tableListDataSource.push({ 
 | 
      key: index, 
 | 
      disabled: i % 6 === 0, 
 | 
      href: 'https://ant.design', 
 | 
      avatar: [ 
 | 
        'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', 
 | 
        'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', 
 | 
      ][i % 2], 
 | 
      name: `TradeCode ${index}`, 
 | 
      owner: '曲丽丽', 
 | 
      desc: '这是一段描述', 
 | 
      callNo: Math.floor(Math.random() * 1000), 
 | 
      status: Math.floor(Math.random() * 10) % 4, 
 | 
      updatedAt: moment().format('YYYY-MM-DD'), 
 | 
      createdAt: moment().format('YYYY-MM-DD'), 
 | 
      progress: Math.ceil(Math.random() * 100), 
 | 
    }); 
 | 
  } 
 | 
  tableListDataSource.reverse(); 
 | 
  return tableListDataSource; 
 | 
}; 
 | 
  
 | 
let tableListDataSource = genList(1, 100); 
 | 
  
 | 
function getRule(req: Request, res: Response, u: string) { 
 | 
  let realUrl = u; 
 | 
  if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') { 
 | 
    realUrl = req.url; 
 | 
  } 
 | 
  const { current = 1, pageSize = 10 } = req.query; 
 | 
  const params = parse(realUrl, true).query as unknown as API.PageParams & 
 | 
    API.RuleListItem & { 
 | 
      sorter: any; 
 | 
      filter: any; 
 | 
    }; 
 | 
  
 | 
  let dataSource = [...tableListDataSource].slice( 
 | 
    ((current as number) - 1) * (pageSize as number), 
 | 
    (current as number) * (pageSize as number), 
 | 
  ); 
 | 
  if (params.sorter) { 
 | 
    const sorter = JSON.parse(params.sorter); 
 | 
    dataSource = dataSource.sort((prev, next) => { 
 | 
      let sortNumber = 0; 
 | 
      (Object.keys(sorter) as Array<keyof API.RuleListItem>).forEach((key) => { 
 | 
        let nextSort = next?.[key] as number; 
 | 
        let preSort = prev?.[key] as number; 
 | 
        if (sorter[key] === 'descend') { 
 | 
          if (preSort - nextSort > 0) { 
 | 
            sortNumber += -1; 
 | 
          } else { 
 | 
            sortNumber += 1; 
 | 
          } 
 | 
          return; 
 | 
        } 
 | 
        if (preSort - nextSort > 0) { 
 | 
          sortNumber += 1; 
 | 
        } else { 
 | 
          sortNumber += -1; 
 | 
        } 
 | 
      }); 
 | 
      return sortNumber; 
 | 
    }); 
 | 
  } 
 | 
  if (params.filter) { 
 | 
    const filter = JSON.parse(params.filter as any) as { 
 | 
      [key: string]: string[]; 
 | 
    }; 
 | 
    if (Object.keys(filter).length > 0) { 
 | 
      dataSource = dataSource.filter((item) => { 
 | 
        return (Object.keys(filter) as Array<keyof API.RuleListItem>).some((key) => { 
 | 
          if (!filter[key]) { 
 | 
            return true; 
 | 
          } 
 | 
          if (filter[key].includes(`${item[key]}`)) { 
 | 
            return true; 
 | 
          } 
 | 
          return false; 
 | 
        }); 
 | 
      }); 
 | 
    } 
 | 
  } 
 | 
  
 | 
  if (params.name) { 
 | 
    dataSource = dataSource.filter((data) => data?.name?.includes(params.name || '')); 
 | 
  } 
 | 
  const result = { 
 | 
    data: dataSource, 
 | 
    total: tableListDataSource.length, 
 | 
    success: true, 
 | 
    pageSize, 
 | 
    current: parseInt(`${params.current}`, 10) || 1, 
 | 
  }; 
 | 
  
 | 
  return res.json(result); 
 | 
} 
 | 
  
 | 
function postRule(req: Request, res: Response, u: string, b: Request) { 
 | 
  let realUrl = u; 
 | 
  if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') { 
 | 
    realUrl = req.url; 
 | 
  } 
 | 
  
 | 
  const body = (b && b.body) || req.body; 
 | 
  const { method, name, desc, key } = body; 
 | 
  
 | 
  switch (method) { 
 | 
    /* eslint no-case-declarations:0 */ 
 | 
    case 'delete': 
 | 
      tableListDataSource = tableListDataSource.filter((item) => key.indexOf(item.key) === -1); 
 | 
      break; 
 | 
    case 'post': 
 | 
      (() => { 
 | 
        const i = Math.ceil(Math.random() * 10000); 
 | 
        const newRule: API.RuleListItem = { 
 | 
          key: tableListDataSource.length, 
 | 
          href: 'https://ant.design', 
 | 
          avatar: [ 
 | 
            'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', 
 | 
            'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png', 
 | 
          ][i % 2], 
 | 
          name, 
 | 
          owner: '曲丽丽', 
 | 
          desc, 
 | 
          callNo: Math.floor(Math.random() * 1000), 
 | 
          status: Math.floor(Math.random() * 10) % 2, 
 | 
          updatedAt: moment().format('YYYY-MM-DD'), 
 | 
          createdAt: moment().format('YYYY-MM-DD'), 
 | 
          progress: Math.ceil(Math.random() * 100), 
 | 
        }; 
 | 
        tableListDataSource.unshift(newRule); 
 | 
        return res.json(newRule); 
 | 
      })(); 
 | 
      return; 
 | 
  
 | 
    case 'update': 
 | 
      (() => { 
 | 
        let newRule = {}; 
 | 
        tableListDataSource = tableListDataSource.map((item) => { 
 | 
          if (item.key === key) { 
 | 
            newRule = { ...item, desc, name }; 
 | 
            return { ...item, desc, name }; 
 | 
          } 
 | 
          return item; 
 | 
        }); 
 | 
        return res.json(newRule); 
 | 
      })(); 
 | 
      return; 
 | 
    default: 
 | 
      break; 
 | 
  } 
 | 
  
 | 
  const result = { 
 | 
    list: tableListDataSource, 
 | 
    pagination: { 
 | 
      total: tableListDataSource.length, 
 | 
    }, 
 | 
  }; 
 | 
  
 | 
  res.json(result); 
 | 
} 
 | 
  
 | 
export default { 
 | 
  'GET /api/rule': getRule, 
 | 
  'POST /api/rule': postRule, 
 | 
}; 
 |