api.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. //router/api.js
  2. const cookieSession = require("cookie-session");
  3. const express = require("express");
  4. const bodyParser = require("body-parser");
  5. let db = require("../pass_db");
  6. const WebSocket = require('ws');
  7. const router = express.Router();
  8. router.use(bodyParser.json());
  9. const WEATHER_API_KEY = process.env.WEATHER_API_KEY;
  10. const WEATHER_API_URL = process.env.WEATHER_API_URL;
  11. // 註冊 API
  12. router.post('/signup', (req, res) => {
  13. const { username, password } = req.body;
  14. if (db.createUser(username, password)) {
  15. // 註冊成功,進行自動登錄操作
  16. req.session.username = username;
  17. res.status(200).json({ success: true, data: { username } });
  18. } else {
  19. // 用戶名已存在
  20. res.status(400).json({ success: false, error: 'Username is already taken.' });
  21. }
  22. });
  23. // 登錄 API
  24. router.post('/login', (req, res) => {
  25. const { username, password } = req.body;
  26. const user = db.authenticateUser(username, password);
  27. if (user) {
  28. req.session.username = username;
  29. res.status(200).json({ success: true, data: { username } });
  30. } else {
  31. res.status(401).json({ success: false, error: 'Invalid username or password.' });
  32. }
  33. });
  34. // 登出 API
  35. router.post('/logout', (req, res) => {
  36. req.session = null;
  37. res.status(200).json({ success: true, data: null });
  38. });
  39. // 獲取會話 API
  40. router.get('/getSession', (req, res) => {
  41. if (req.session.username) {
  42. res.status(200).json({ success: true, data: { username: req.session.username } });
  43. } else {
  44. res.status(200).json({ success: true, data: null });
  45. }
  46. });
  47. // 獲取投票數據 API
  48. router.get('/votes/list', (req, res) => {
  49. const votes = db.getVotesAllDays();
  50. res.status(200).json({ success: true, data: votes });
  51. });
  52. // 設定投票 API (為SATIS Tier準備)
  53. router.post('/votes/set', (req, res) => {
  54. const { username, date, vote } = req.body;
  55. if (req.session.username === username) {
  56. db.placeVote(username, date, vote);
  57. global.wss.clients.forEach(client => {
  58. if (client.readyState === WebSocket.OPEN) {
  59. client.send(JSON.stringify({
  60. type: 'voteUpdate',
  61. message: 'A vote has been updated.'
  62. }));
  63. // client.send('A vote has been updated.');
  64. }
  65. });
  66. res.status(200).json({ success: true });
  67. } else {
  68. res.status(403).json({ success: false, error: "Unauthorized" });
  69. }
  70. });
  71. router.get("/weather", async (req, res) => {
  72. const { lat, lon } = req.query;
  73. try {
  74. const weatherResponse = await fetch(
  75. `${WEATHER_API_URL}?lat=${lat}&lon=${lon}&appid=${WEATHER_API_KEY}&units=metric`
  76. );
  77. const weatherData = await weatherResponse.json();
  78. if (!weatherResponse.ok) throw new Error("Weather API request failed.");
  79. res.json({ success: true, data: weatherData });
  80. } catch (error) {
  81. console.error(error);
  82. res
  83. .status(500)
  84. .json({ success: false, error: "Failed to fetch weather data" });
  85. }
  86. });
  87. router.post('/websocket-test', (req, res) => { //這邊做一個測試
  88. const message = req.body.message || 'Test message from server';
  89. global.wss.clients.forEach(client => {
  90. if (client.readyState === WebSocket.OPEN) {
  91. client.send(JSON.stringify({
  92. type: 'testMessage',
  93. message: message
  94. }));
  95. }
  96. });
  97. res.json({ success: true, message: 'Broadcast message sent successfully.' });
  98. });
  99. module.exports = router;