projects.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. const express = require('express');
  2. const { db } = require('../database/init');
  3. const router = express.Router();
  4. // 取得所有專案
  5. router.get('/', (req, res) => {
  6. const query = 'SELECT * FROM projects ORDER BY created_at DESC';
  7. db.all(query, [], (err, rows) => {
  8. if (err) {
  9. res.status(500).json({ success: false, message: '查詢失敗', error: err.message });
  10. } else {
  11. res.json({ success: true, data: rows });
  12. }
  13. });
  14. });
  15. // 取得單一專案
  16. router.get('/:id', (req, res) => {
  17. const { id } = req.params;
  18. const query = 'SELECT * FROM projects WHERE id = ?';
  19. db.get(query, [id], (err, row) => {
  20. if (err) {
  21. res.status(500).json({ success: false, message: '查詢失敗', error: err.message });
  22. } else if (!row) {
  23. res.status(404).json({ success: false, message: '專案不存在' });
  24. } else {
  25. res.json({ success: true, data: row });
  26. }
  27. });
  28. });
  29. // 建立新專案
  30. router.post('/', (req, res) => {
  31. const { name, description, status } = req.body;
  32. if (!name) {
  33. return res.status(400).json({ success: false, message: '專案名稱為必填欄位' });
  34. }
  35. const query = 'INSERT INTO projects (name, description, status) VALUES (?, ?, ?)';
  36. db.run(query, [name, description, status || 'active'], function(err) {
  37. if (err) {
  38. res.status(500).json({ success: false, message: '建立失敗', error: err.message });
  39. } else {
  40. res.status(201).json({
  41. success: true,
  42. message: '專案建立成功',
  43. data: { id: this.lastID }
  44. });
  45. }
  46. });
  47. });
  48. // 更新專案
  49. router.put('/:id', (req, res) => {
  50. const { id } = req.params;
  51. const { name, description, status } = req.body;
  52. const query = `
  53. UPDATE projects
  54. SET name = COALESCE(?, name),
  55. description = COALESCE(?, description),
  56. status = COALESCE(?, status),
  57. updated_at = CURRENT_TIMESTAMP
  58. WHERE id = ?
  59. `;
  60. db.run(query, [name, description, status, id], function(err) {
  61. if (err) {
  62. res.status(500).json({ success: false, message: '更新失敗', error: err.message });
  63. } else if (this.changes === 0) {
  64. res.status(404).json({ success: false, message: '專案不存在' });
  65. } else {
  66. res.json({ success: true, message: '專案更新成功' });
  67. }
  68. });
  69. });
  70. // 刪除專案
  71. router.delete('/:id', (req, res) => {
  72. const { id } = req.params;
  73. // 先檢查是否有相關的問題
  74. db.get('SELECT COUNT(*) as count FROM issues WHERE project_id = ?', [id], (err, result) => {
  75. if (err) {
  76. res.status(500).json({ success: false, message: '檢查失敗', error: err.message });
  77. } else if (result.count > 0) {
  78. res.status(400).json({
  79. success: false,
  80. message: '無法刪除專案,請先處理相關的問題'
  81. });
  82. } else {
  83. db.run('DELETE FROM projects WHERE id = ?', [id], function(err) {
  84. if (err) {
  85. res.status(500).json({ success: false, message: '刪除失敗', error: err.message });
  86. } else if (this.changes === 0) {
  87. res.status(404).json({ success: false, message: '專案不存在' });
  88. } else {
  89. res.json({ success: true, message: '專案刪除成功' });
  90. }
  91. });
  92. }
  93. });
  94. });
  95. // 取得專案統計
  96. router.get('/:id/stats', (req, res) => {
  97. const { id } = req.params;
  98. const query = `
  99. SELECT
  100. COUNT(*) as total_issues,
  101. SUM(CASE WHEN status = 'open' THEN 1 ELSE 0 END) as open_issues,
  102. SUM(CASE WHEN status = 'in_progress' THEN 1 ELSE 0 END) as in_progress_issues,
  103. SUM(CASE WHEN status = 'closed' THEN 1 ELSE 0 END) as closed_issues,
  104. SUM(CASE WHEN priority = 'high' THEN 1 ELSE 0 END) as high_priority_issues,
  105. SUM(CASE WHEN priority = 'medium' THEN 1 ELSE 0 END) as medium_priority_issues,
  106. SUM(CASE WHEN priority = 'low' THEN 1 ELSE 0 END) as low_priority_issues
  107. FROM issues
  108. WHERE project_id = ?
  109. `;
  110. db.get(query, [id], (err, row) => {
  111. if (err) {
  112. res.status(500).json({ success: false, message: '查詢統計失敗', error: err.message });
  113. } else {
  114. res.json({ success: true, data: row });
  115. }
  116. });
  117. });
  118. module.exports = router;