server.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. 'use strict';
  2. const express = require('express');
  3. const rateLimit = require('express-rate-limit');
  4. const db = new Map();
  5. const app = express();
  6. const limiter1 = rateLimit({
  7. windowMs: 60 * 1000,
  8. max: 300, // Limit each IP to 300 requests per `window`
  9. standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers
  10. legacyHeaders: false, // Disable the `X-RateLimit-*` headers
  11. });
  12. const limiter2 = rateLimit({
  13. windowMs: 60 * 1000,
  14. max: 2,
  15. standardHeaders: true,
  16. legacyHeaders: false,
  17. });
  18. app.use(limiter1);
  19. app.use('/create', limiter2);
  20. app.get('/', (req, res) => {
  21. res.sendStatus(403);
  22. });
  23. app.get('/create', (req, res) => {
  24. const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  25. let code = "";
  26. do {
  27. for(let i = 0; i < 4; i += 1) {
  28. code += characters.charAt(Math.floor(Math.random() * characters.length));
  29. }
  30. } while(db.has(code));
  31. // It's a set because it was originally idx-only, too late to change now
  32. db.set(code, {
  33. x: -1.0,
  34. y: -1.0,
  35. set: new Set()
  36. });
  37. res.send(code);
  38. });
  39. app.get('/verify/:code', (req, res) => {
  40. const code = req.params.code.toUpperCase();
  41. if(db.has(code)) {
  42. res.send(`${code}`);
  43. } else {
  44. res.sendStatus(404);
  45. }
  46. });
  47. app.get('/order/:code/:bagel/:x/:y', (req, res) => {
  48. const code = req.params.code.toUpperCase();
  49. if(db.has(code)) {
  50. db.get(code).set.add({
  51. type: req.params.bagel,
  52. x: req.params.x,
  53. y: req.params.y
  54. });
  55. res.send("OK");
  56. } else {
  57. res.sendStatus(404);
  58. }
  59. });
  60. app.get('/getpos/:code', (req, res) => {
  61. const code = req.params.code.toUpperCase();
  62. if(db.has(code)) {
  63. const {x, y} = db.get(code);
  64. res.send({x, y});
  65. } else {
  66. res.sendStatus(404);
  67. }
  68. });
  69. app.get('/take/:code/:x/:y', (req, res) => {
  70. const code = req.params.code.toUpperCase();
  71. if(db.has(code)) {
  72. db.get(code).x = req.params.x;
  73. db.get(code).y = req.params.y;
  74. const v = [...db.get(code).set.values()];
  75. db.get(code).set.clear();
  76. res.send(v);
  77. } else {
  78. res.sendStatus(404);
  79. }
  80. });
  81. app.listen(42137);