Sfoglia il codice sorgente

添加一个新路由用来提交数据

flyzto 6 mesi fa
parent
commit
af1e9132d5
3 ha cambiato i file con 229 aggiunte e 1 eliminazioni
  1. 178 0
      server/models/GamesPs.js
  2. 49 0
      server/routes/pstery.js
  3. 2 1
      server/server.js

+ 178 - 0
server/models/GamesPs.js

@@ -0,0 +1,178 @@
+
+const axios = require('axios');
+const Logs = require('../libs/logs');
+
+const GAMES = {
+  Leagues: {},
+  List: {},
+  Baselist: {}
+};
+
+/**
+ * 精确浮点数字
+ * @param {number} number
+ * @param {number} x
+ * @returns {number}
+ */
+const fixFloat = (number, x=2) => {
+  return parseFloat(number.toFixed(x));
+}
+
+/**
+ * 获取市场类型
+ */
+const getMarketType = (mk) => {
+  return mk == 0 ? 'early' : 'today';
+}
+
+/**
+ * 更新联赛列表
+ */
+const syncLeaguesList = ({ mk, leagues }) => {
+  axios.post('https://api.isthe.me/api/p/syncLeague', { mk, leagues })
+  .then(res => {
+    Logs.out('syncLeaguesList', res.data);
+  })
+  .catch(err => {
+    Logs.out('syncLeaguesList', err.message);
+  });
+}
+const updateLeaguesList = ({ mk, leagues }) => {
+  const leaguesList = GAMES.Leagues;
+  if (JSON.stringify(leaguesList[mk]) != JSON.stringify(leagues)) {
+    leaguesList[mk] = leagues;
+    syncLeaguesList({ mk, leagues });
+    return leagues.length;
+  }
+  return 0;
+}
+
+/**
+ * 获取筛选过的联赛
+ */
+const getFilteredLeagues = async (mk) => {
+  return axios.get(`https://api.isthe.me/api/p/getLeagueTast?mk=${mk}`)
+  .then(res => {
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+    return Promise.reject(new Error(res.data.message));
+  });
+}
+
+/**
+ * 同步比赛列表到服务器
+ */
+const syncGamesList = ({ platform, mk, games }) => {
+  axios.post('https://api.isthe.me/api/p/syncGames', { platform, mk, games })
+  .then(res => {
+    Logs.out('syncGamesList', res.data);
+  })
+  .catch(err => {
+    Logs.out('syncGamesList', err.message);
+  });
+}
+
+/**
+ * 同步基准比赛列表
+ */
+const syncBaseList = ({ marketType, games }) => {
+  const baseList = GAMES.Baselist;
+  if (!baseList[marketType]) {
+    baseList[marketType] = games;
+  }
+
+  const newMap = new Map(games.map(item => [item.eventId, item]));
+
+  // 删除不存在的项
+  for (let i = baseList[marketType].length - 1; i >= 0; i--) {
+    if (!newMap.has(baseList[marketType][i].eventId)) {
+      baseList[marketType].splice(i, 1);
+    }
+  }
+
+  // 添加或更新
+  const oldIds = new Set(baseList[marketType].map(item => item.eventId));
+  games.forEach(game => {
+    if (!oldIds.has(game.eventId)) {
+      // 添加新项
+      baseList[marketType].push(game);
+    }
+  });
+}
+
+/**
+ * 更新比赛列表
+ */
+const updateGamesList = (({ platform, mk, games } = {}) => {
+  return new Promise((resolve, reject) => {
+    if (!platform || !games) {
+      return reject(new Error('PLATFORM_GAMES_INVALID'));
+    }
+
+    const marketType = getMarketType(mk);
+
+    syncGamesList({ platform, mk, games });
+
+    if (platform == 'ps') {
+      syncBaseList({ marketType, games });
+    }
+
+    resolve();
+  });
+});
+
+/**
+ * 同步基准盘口
+ */
+const syncBaseEvents = ({ marketType, games, outrights }) => {
+  const baseList = GAMES.Baselist;
+  if (!baseList[marketType]) {
+    return;
+  }
+
+  const baseMap = new Map(baseList[marketType].map(item => [item.eventId, item]));
+
+  games?.forEach(game => {
+    const { eventId, evtime, events } = game;
+    const baseGame = baseMap.get(eventId);
+    if (baseGame) {
+      baseGame.evtime = evtime;
+      baseGame.events = events;
+    }
+  });
+
+  outrights?.forEach(outright => {
+    const { parentId, sptime, special } = outright;
+    const baseGame = baseMap.get(parentId);
+    if (baseGame) {
+      baseGame.sptime = sptime;
+      baseGame.special = special;
+    }
+  });
+}
+
+/**
+ * 更新比赛盘口
+ */
+const updateGamesEvents = ({ platform, mk, games, outrights }) => {
+  return new Promise((resolve, reject) => {
+    if (!platform || (!games && !outrights)) {
+      return reject(new Error('PLATFORM_GAMES_INVALID'));
+    }
+
+    const marketType = getMarketType(mk);
+
+    if (platform == 'ps') {
+      syncBaseEvents({ marketType, games, outrights });
+    }
+
+    resolve();
+  });
+}
+
+
+module.exports = {
+  updateLeaguesList, getFilteredLeagues,
+  updateGamesList, updateGamesEvents,
+}

+ 49 - 0
server/routes/pstery.js

@@ -0,0 +1,49 @@
+const express = require('express');
+const router = express.Router();
+
+const Games = require('../models/GamesPs');
+
+// 更新比赛列表
+router.post('/update_games_list', (req, res) => {
+  const { platform, mk, games } = req.body ?? {};
+  Games.updateGamesList({ platform, mk, games })
+  .then(() => {
+    res.sendSuccess();
+  })
+  .catch(err => {
+    res.badRequest(err.message);
+  })
+});
+
+// 更新比赛盘口
+router.post('/update_games_events', (req, res) => {
+  const { platform, mk, games, outrights } = req.body ?? {};
+  Games.updateGamesEvents({ platform, mk, games, outrights })
+  .then(updateCount => {
+    res.sendSuccess({ updateCount });
+  })
+  .catch(err => {
+    res.badRequest(err.message);
+  })
+});
+
+// 更新联赛列表
+router.post('/update_leagues_list', (req, res) => {
+  const { mk, leagues } = req.body ?? {};
+  const updateCount = Games.updateLeaguesList({ mk, leagues });
+  res.sendSuccess({ updateCount });
+});
+
+// 获取筛选过的联赛
+router.get('/get_filtered_leagues', (req, res) => {
+  const { mk } = req.query;
+  Games.getFilteredLeagues(mk)
+  .then(filteredLeagues => {
+    res.sendSuccess(filteredLeagues);
+  })
+  .catch(err => {
+    res.badRequest(err.message);
+  });
+});
+
+module.exports = router;

+ 2 - 1
server/server.js

@@ -6,7 +6,7 @@ const Logs = require('./libs/logs');
 const userRoutes = require('./routes/user');
 const systemRoutes = require('./routes/system');
 const triangleRoutes = require('./routes/triangle');
-
+const psteryRoutes = require('./routes/pstery');
 const cookieParser = require('cookie-parser');
 const app = express();
 
@@ -54,6 +54,7 @@ app.use((req, res, next) => {
 app.use(['/api/user', '/api/auth'], userRoutes);
 app.use('/api/system', systemRoutes);
 app.use('/api/triangle', triangleRoutes);
+app.use('/api/pstery', psteryRoutes);
 
 // 启动服务
 const PORT = process.env.PORT || 9055;