timers.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  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 = $db->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, $db;
  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 = $db->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 'delete':
  135. $data = json_decode(file_get_contents('php://input'), true);
  136. $id = $data['id'] ?? null;
  137. if ($id) {
  138. try {
  139. // Delete timer from database
  140. $query = "DELETE FROM timers WHERE id = ?";
  141. $stmt = $db->prepare($query);
  142. $result = $stmt->execute([$id]);
  143. if ($result) {
  144. echo json_encode(['success' => true, 'message' => 'Timer deleted successfully']);
  145. } else {
  146. echo json_encode(['success' => false, 'message' => 'Timer not found']);
  147. }
  148. } catch (Exception $e) {
  149. http_response_code(500);
  150. echo json_encode(['error' => 'Failed to delete timer: ' . $e->getMessage()]);
  151. }
  152. } else {
  153. http_response_code(400);
  154. echo json_encode(['error' => 'Timer ID required']);
  155. }
  156. break;
  157. case 'update':
  158. $data = json_decode(file_get_contents('php://input'), true);
  159. $id = $data['id'] ?? null;
  160. if ($id) {
  161. try {
  162. // Direct database update to avoid Timer model issues
  163. $query = "UPDATE timers SET task_id = ?, description = ?, updated_at = ? WHERE id = ?";
  164. $stmt = $db->prepare($query);
  165. $result = $stmt->execute([
  166. $data['task_id'] ?? null,
  167. $data['description'] ?? '',
  168. gmdate('Y-m-d H:i:s'),
  169. $id
  170. ]);
  171. if ($result) {
  172. echo json_encode(['success' => true, 'message' => 'Timer updated successfully']);
  173. } else {
  174. echo json_encode(['success' => false, 'message' => 'Timer not found']);
  175. }
  176. } catch (Exception $e) {
  177. http_response_code(500);
  178. echo json_encode(['error' => 'Failed to update timer: ' . $e->getMessage()]);
  179. }
  180. } else {
  181. http_response_code(400);
  182. echo json_encode(['error' => 'Timer ID required']);
  183. }
  184. break;
  185. case 'test':
  186. echo json_encode(['success' => true, 'message' => 'Test endpoint working']);
  187. break;
  188. case 'minimal_stop':
  189. echo json_encode(['success' => true, 'message' => 'Minimal stop working']);
  190. break;
  191. default:
  192. http_response_code(400);
  193. echo json_encode(['error' => 'Invalid action']);
  194. }
  195. }
  196. function handlePutRequest() {
  197. global $timer;
  198. $data = json_decode(file_get_contents('php://input'), true);
  199. $id = $data['id'] ?? null;
  200. if ($id) {
  201. $timer->id = $id;
  202. $timer->description = $data['description'] ?? '';
  203. if ($timer->update()) {
  204. echo json_encode(['success' => true, 'timer' => $timer]);
  205. } else {
  206. http_response_code(500);
  207. echo json_encode(['error' => 'Failed to update timer']);
  208. }
  209. } else {
  210. http_response_code(400);
  211. echo json_encode(['error' => 'Timer ID required']);
  212. }
  213. }
  214. function handleDeleteRequest() {
  215. global $timer;
  216. $data = json_decode(file_get_contents('php://input'), true);
  217. $id = $data['id'] ?? null;
  218. if ($id) {
  219. if ($timer->delete()) {
  220. echo json_encode(['success' => true]);
  221. } else {
  222. http_response_code(500);
  223. echo json_encode(['error' => 'Failed to delete timer']);
  224. }
  225. } else {
  226. http_response_code(400);
  227. echo json_encode(['error' => 'Timer ID required']);
  228. }
  229. }
  230. ?>