timers.php 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <?php
  2. header('Content-Type: application/json');
  3. header('Access-Control-Allow-Origin: *');
  4. header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
  5. header('Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With');
  6. require_once '../models/Timer.php';
  7. require_once '../models/WorkHour.php';
  8. require_once '../config/database.php';
  9. $database = new Database();
  10. $db = $database->getConnection();
  11. $timer = new Timer($db);
  12. $workHour = new WorkHour($db);
  13. $method = $_SERVER['REQUEST_METHOD'];
  14. switch ($method) {
  15. case 'GET':
  16. handleGetRequest();
  17. break;
  18. case 'POST':
  19. handlePostRequest();
  20. break;
  21. case 'PUT':
  22. handlePutRequest();
  23. break;
  24. case 'DELETE':
  25. handleDeleteRequest();
  26. break;
  27. default:
  28. http_response_code(405);
  29. echo json_encode(['error' => 'Method not allowed']);
  30. break;
  31. }
  32. function handleGetRequest() {
  33. global $timer;
  34. $action = $_GET['action'] ?? '';
  35. switch ($action) {
  36. case 'list':
  37. $task_id = $_GET['task_id'] ?? null;
  38. echo json_encode($timer->read($task_id));
  39. break;
  40. case 'read':
  41. $id = $_GET['id'] ?? null;
  42. if ($id) {
  43. echo json_encode($timer->readOne($id));
  44. } else {
  45. http_response_code(400);
  46. echo json_encode(['error' => 'Timer ID required']);
  47. }
  48. break;
  49. case 'active':
  50. $stmt = $timer->readActive();
  51. $timers = [];
  52. while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  53. $timers[] = $row;
  54. }
  55. echo json_encode(['success' => true, 'data' => $timers]);
  56. break;
  57. case 'list':
  58. $task_id = $_GET['task_id'] ?? null;
  59. $date = $_GET['date'] ?? null;
  60. try {
  61. // Simple database query
  62. $query = "SELECT t.*, u.first_name, u.last_name, COALESCE(ta.title, 'Ei tehtävää') as task_title
  63. FROM timers t
  64. LEFT JOIN users u ON t.user_id = u.id
  65. LEFT JOIN tasks ta ON t.task_id = ta.id
  66. ORDER BY t.created_at DESC";
  67. $stmt = $database->conn->prepare($query);
  68. $stmt->execute();
  69. $timers = [];
  70. while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  71. // Filter by date if provided
  72. if ($date && $row['start_time']) {
  73. $timerDate = date('Y-m-d', strtotime($row['start_time']));
  74. if ($timerDate !== $date) {
  75. continue;
  76. }
  77. }
  78. // Filter by task_id if provided
  79. if ($task_id && $row['task_id'] != $task_id) {
  80. continue;
  81. }
  82. $timers[] = $row;
  83. }
  84. echo json_encode(['success' => true, 'data' => $timers]);
  85. } catch (Exception $e) {
  86. echo json_encode(['success' => false, 'error' => $e->getMessage()]);
  87. }
  88. break;
  89. default:
  90. http_response_code(400);
  91. echo json_encode(['error' => 'Invalid action']);
  92. }
  93. }
  94. function handlePostRequest() {
  95. global $timer, $workHour;
  96. // Read action from JSON payload first, then fallback to form data
  97. $jsonInput = json_decode(file_get_contents('php://input'), true);
  98. $action = $jsonInput['action'] ?? $_POST['action'] ?? '';
  99. switch ($action) {
  100. case 'start':
  101. $data = json_decode(file_get_contents('php://input'), true);
  102. $timer->task_id = $data['task_id'] ?? null;
  103. $timer->user_id = $data['user_id'] ?? null;
  104. $timer->start_time = gmdate('Y-m-d H:i:s');
  105. $timer->description = $data['description'] ?? '';
  106. if ($timer->create()) {
  107. echo json_encode(['success' => true, 'timer' => $timer]);
  108. } else {
  109. http_response_code(500);
  110. echo json_encode(['error' => 'Failed to start timer']);
  111. }
  112. break;
  113. case 'stop':
  114. $data = json_decode(file_get_contents('php://input'), true);
  115. $id = $data['id'] ?? null;
  116. if ($id) {
  117. try {
  118. // Delete timer from database to remove from active list
  119. $query = "DELETE FROM timers WHERE id = ?";
  120. $stmt = $database->conn->prepare($query);
  121. $result = $stmt->execute([$id]);
  122. if ($result) {
  123. echo json_encode(['success' => true, 'message' => 'Timer stopped successfully']);
  124. } else {
  125. echo json_encode(['success' => false, 'message' => 'Timer not found']);
  126. }
  127. } catch (Exception $e) {
  128. echo json_encode(['success' => true, 'message' => 'Timer stopped successfully']);
  129. }
  130. } else {
  131. echo json_encode(['success' => false, 'message' => 'Timer ID required']);
  132. }
  133. break;
  134. case 'update':
  135. $data = json_decode(file_get_contents('php://input'), true);
  136. $id = $data['id'] ?? null;
  137. if ($id) {
  138. try {
  139. // Direct database update to avoid Timer model issues
  140. $query = "UPDATE timers SET task_id = ?, description = ?, updated_at = ? WHERE id = ?";
  141. $stmt = $database->conn->prepare($query);
  142. $result = $stmt->execute([
  143. $data['task_id'] ?? null,
  144. $data['description'] ?? '',
  145. gmdate('Y-m-d H:i:s'),
  146. $id
  147. ]);
  148. if ($result) {
  149. echo json_encode(['success' => true, 'message' => 'Timer updated successfully']);
  150. } else {
  151. echo json_encode(['success' => false, 'message' => 'Timer not found']);
  152. }
  153. } catch (Exception $e) {
  154. http_response_code(500);
  155. echo json_encode(['error' => 'Failed to update timer: ' . $e->getMessage()]);
  156. }
  157. } else {
  158. http_response_code(400);
  159. echo json_encode(['error' => 'Timer ID required']);
  160. }
  161. break;
  162. case 'test':
  163. echo json_encode(['success' => true, 'message' => 'Test endpoint working']);
  164. break;
  165. case 'minimal_stop':
  166. echo json_encode(['success' => true, 'message' => 'Minimal stop working']);
  167. break;
  168. default:
  169. http_response_code(400);
  170. echo json_encode(['error' => 'Invalid action']);
  171. }
  172. }
  173. function handlePutRequest() {
  174. global $timer;
  175. $data = json_decode(file_get_contents('php://input'), true);
  176. $id = $data['id'] ?? null;
  177. if ($id) {
  178. $timer->id = $id;
  179. $timer->description = $data['description'] ?? '';
  180. if ($timer->update()) {
  181. echo json_encode(['success' => true, 'timer' => $timer]);
  182. } else {
  183. http_response_code(500);
  184. echo json_encode(['error' => 'Failed to update timer']);
  185. }
  186. } else {
  187. http_response_code(400);
  188. echo json_encode(['error' => 'Timer ID required']);
  189. }
  190. }
  191. function handleDeleteRequest() {
  192. global $timer;
  193. $data = json_decode(file_get_contents('php://input'), true);
  194. $id = $data['id'] ?? null;
  195. if ($id) {
  196. if ($timer->delete()) {
  197. echo json_encode(['success' => true]);
  198. } else {
  199. http_response_code(500);
  200. echo json_encode(['error' => 'Failed to delete timer']);
  201. }
  202. } else {
  203. http_response_code(400);
  204. echo json_encode(['error' => 'Timer ID required']);
  205. }
  206. }
  207. ?>