| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- //router/api.js
- const cookieSession = require("cookie-session");
- const express = require("express");
- const bodyParser = require("body-parser");
- let db = require("../pass_db");
- const WebSocket = require('ws');
- const router = express.Router();
- router.use(bodyParser.json());
- const WEATHER_API_KEY = process.env.WEATHER_API_KEY;
- const WEATHER_API_URL = process.env.WEATHER_API_URL;
- // 註冊 API
- router.post('/signup', (req, res) => {
- const { username, password } = req.body;
- if (db.createUser(username, password)) {
- // 註冊成功,進行自動登錄操作
- req.session.username = username;
- res.status(200).json({ success: true, data: { username } });
- } else {
- // 用戶名已存在
- res.status(400).json({ success: false, error: 'Username is already taken.' });
- }
- });
- // 登錄 API
- router.post('/login', (req, res) => {
- const { username, password } = req.body;
- const user = db.authenticateUser(username, password);
- if (user) {
- req.session.username = username;
- res.status(200).json({ success: true, data: { username } });
- } else {
- res.status(401).json({ success: false, error: 'Invalid username or password.' });
- }
- });
- // 登出 API
- router.post('/logout', (req, res) => {
- req.session = null;
- res.status(200).json({ success: true, data: null });
- });
- // 獲取會話 API
- router.get('/getSession', (req, res) => {
- if (req.session.username) {
- res.status(200).json({ success: true, data: { username: req.session.username } });
- } else {
- res.status(200).json({ success: true, data: null });
- }
- });
- // 獲取投票數據 API
- router.get('/votes/list', (req, res) => {
- const votes = db.getVotesAllDays();
- res.status(200).json({ success: true, data: votes });
- });
- // 設定投票 API (為SATIS Tier準備)
- router.post('/votes/set', (req, res) => {
- const { username, date, vote } = req.body;
- if (req.session.username === username) {
- db.placeVote(username, date, vote);
- global.wss.clients.forEach(client => {
- if (client.readyState === WebSocket.OPEN) {
- client.send(JSON.stringify({
- type: 'voteUpdate',
- message: 'A vote has been updated.'
- }));
- // client.send('A vote has been updated.');
- }
- });
- res.status(200).json({ success: true });
- } else {
- res.status(403).json({ success: false, error: "Unauthorized" });
- }
- });
- router.get("/weather", async (req, res) => {
- const { lat, lon } = req.query;
- try {
- const weatherResponse = await fetch(
- `${WEATHER_API_URL}?lat=${lat}&lon=${lon}&appid=${WEATHER_API_KEY}&units=metric`
- );
- const weatherData = await weatherResponse.json();
- if (!weatherResponse.ok) throw new Error("Weather API request failed.");
- res.json({ success: true, data: weatherData });
- } catch (error) {
- console.error(error);
- res
- .status(500)
- .json({ success: false, error: "Failed to fetch weather data" });
- }
- });
- router.post('/websocket-test', (req, res) => { //這邊做一個測試
- const message = req.body.message || 'Test message from server';
- global.wss.clients.forEach(client => {
- if (client.readyState === WebSocket.OPEN) {
- client.send(JSON.stringify({
- type: 'testMessage',
- message: message
- }));
- }
- });
- res.json({ success: true, message: 'Broadcast message sent successfully.' });
- });
- module.exports = router;
|