api.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 router = express.Router();
  7. router.use(bodyParser.json());
  8. const WEATHER_API_KEY = process.env.WEATHER_API_KEY;
  9. const WEATHER_API_URL = process.env.WEATHER_API_URL;
  10. // 註冊 API
  11. router.post('/signup', (req, res) => {
  12. const { username, password } = req.body;
  13. if (db.createUser(username, password)) {
  14. // 註冊成功,進行自動登錄操作
  15. req.session.username = username;
  16. res.status(200).json({ success: true, data: { username } });
  17. } else {
  18. // 用戶名已存在
  19. res.status(400).json({ success: false, error: 'Username is already taken.' });
  20. }
  21. });
  22. // 登錄 API
  23. router.post('/login', (req, res) => {
  24. const { username, password } = req.body;
  25. const user = db.authenticateUser(username, password);
  26. if (user) {
  27. req.session.username = username;
  28. res.status(200).json({ success: true, data: { username } });
  29. } else {
  30. res.status(401).json({ success: false, error: 'Invalid username or password.' });
  31. }
  32. });
  33. // 登出 API
  34. router.post('/logout', (req, res) => {
  35. req.session = null;
  36. res.status(200).json({ success: true, data: null });
  37. });
  38. // 獲取會話 API
  39. router.get('/getSession', (req, res) => {
  40. if (req.session.username) {
  41. res.status(200).json({ success: true, data: { username: req.session.username } });
  42. } else {
  43. res.status(200).json({ success: true, data: null });
  44. }
  45. });
  46. // 獲取投票數據 API
  47. router.get('/votes/list', (req, res) => {
  48. const votes = db.getVotesAllDays();
  49. res.status(200).json({ success: true, data: votes });
  50. });
  51. // 設定投票 API (為SATIS Tier準備)
  52. router.post('/votes/set', (req, res) => {
  53. const { username, date, vote } = req.body;
  54. if (req.session.username === username) {
  55. db.placeVote(username, date, vote);
  56. res.status(200).json({ success: true });
  57. } else {
  58. res.status(403).json({ success: false, error: "Unauthorized" });
  59. }
  60. });
  61. router.get("/weather", async (req, res) => {
  62. const { lat, lon } = req.query;
  63. try {
  64. const weatherResponse = await fetch(
  65. `${WEATHER_API_URL}?lat=${lat}&lon=${lon}&appid=${WEATHER_API_KEY}&units=metric`
  66. );
  67. const weatherData = await weatherResponse.json();
  68. if (!weatherResponse.ok) throw new Error("Weather API request failed.");
  69. res.json({ success: true, data: weatherData });
  70. } catch (error) {
  71. console.error(error);
  72. res
  73. .status(500)
  74. .json({ success: false, error: "Failed to fetch weather data" });
  75. }
  76. });
  77. module.exports = router;