timers.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  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 __DIR__ . '/../models/Timer.php';
  7. require_once __DIR__ . '/../models/WorkHour.php';
  8. require_once __DIR__ . '/../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, $db;
  34. $action = $_GET['action'] ?? '';
  35. switch ($action) {
  36. case 'read':
  37. $id = $_GET['id'] ?? null;
  38. if ($id) {
  39. echo json_encode($timer->readOne($id));
  40. } else {
  41. http_response_code(400);
  42. echo json_encode(['error' => 'Timer ID required']);
  43. }
  44. break;
  45. case 'active':
  46. $stmt = $timer->readActive();
  47. $timers = [];
  48. while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  49. $timers[] = $row;
  50. }
  51. echo json_encode(['success' => true, 'data' => $timers]);
  52. break;
  53. case 'list':
  54. $task_id = $_GET['task_id'] ?? null;
  55. $date = $_GET['date'] ?? null;
  56. try {
  57. // Simple database query
  58. $query = "SELECT t.*, u.first_name, u.last_name, COALESCE(ta.title, 'Ei tehtävää') as task_title
  59. FROM timers t
  60. LEFT JOIN users u ON t.user_id = u.id
  61. LEFT JOIN tasks ta ON t.task_id = ta.id
  62. ORDER BY t.created_at DESC";
  63. $stmt = $db->prepare($query);
  64. $stmt->execute();
  65. $timers = [];
  66. while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  67. // Filter by date if provided
  68. if ($date && $row['start_time']) {
  69. $timerDate = date('Y-m-d', strtotime($row['start_time']));
  70. if ($timerDate !== $date) {
  71. continue;
  72. }
  73. }
  74. // Filter by task_id if provided
  75. if ($task_id && $row['task_id'] != $task_id) {
  76. continue;
  77. }
  78. $timers[] = $row;
  79. }
  80. echo json_encode(['success' => true, 'data' => $timers]);
  81. } catch (Exception $e) {
  82. echo json_encode(['success' => false, 'error' => $e->getMessage()]);
  83. }
  84. break;
  85. default:
  86. http_response_code(400);
  87. echo json_encode(['error' => 'Invalid action']);
  88. }
  89. }
  90. function handlePostRequest() {
  91. global $timer, $workHour, $db;
  92. // Read action from JSON payload first, then fallback to form data
  93. $jsonInput = json_decode(file_get_contents('php://input'), true);
  94. $action = $jsonInput['action'] ?? $_POST['action'] ?? '';
  95. switch ($action) {
  96. case 'start':
  97. $data = json_decode(file_get_contents('php://input'), true);
  98. $timer->task_id = $data['task_id'] ?? null;
  99. $timer->user_id = $data['user_id'] ?? null;
  100. $timer->start_time = gmdate('Y-m-d H:i:s');
  101. $timer->description = $data['description'] ?? '';
  102. if ($timer->create()) {
  103. echo json_encode(['success' => true, 'timer' => $timer]);
  104. } else {
  105. http_response_code(500);
  106. echo json_encode(['error' => 'Failed to start timer']);
  107. }
  108. break;
  109. case 'stop':
  110. $data = json_decode(file_get_contents('php://input'), true);
  111. $id = $data['id'] ?? null;
  112. if ($id) {
  113. try {
  114. // Delete timer from database to remove from active list
  115. $query = "DELETE FROM timers WHERE id = ?";
  116. $stmt = $db->prepare($query);
  117. $result = $stmt->execute([$id]);
  118. if ($result) {
  119. echo json_encode(['success' => true, 'message' => 'Timer stopped successfully']);
  120. } else {
  121. echo json_encode(['success' => false, 'message' => 'Timer not found']);
  122. }
  123. } catch (Exception $e) {
  124. echo json_encode(['success' => true, 'message' => 'Timer stopped successfully']);
  125. }
  126. } else {
  127. echo json_encode(['success' => false, 'message' => 'Timer ID required']);
  128. }
  129. break;
  130. case 'delete':
  131. $data = json_decode(file_get_contents('php://input'), true);
  132. $id = $data['id'] ?? null;
  133. if ($id) {
  134. try {
  135. // Delete timer from database
  136. $query = "DELETE FROM timers WHERE id = ?";
  137. $stmt = $db->prepare($query);
  138. $result = $stmt->execute([$id]);
  139. if ($result) {
  140. echo json_encode(['success' => true, 'message' => 'Timer deleted successfully']);
  141. } else {
  142. echo json_encode(['success' => false, 'message' => 'Timer not found']);
  143. }
  144. } catch (Exception $e) {
  145. http_response_code(500);
  146. echo json_encode(['error' => 'Failed to delete timer: ' . $e->getMessage()]);
  147. }
  148. } else {
  149. http_response_code(400);
  150. echo json_encode(['error' => 'Timer ID required']);
  151. }
  152. break;
  153. case 'update':
  154. $data = json_decode(file_get_contents('php://input'), true);
  155. $id = $data['id'] ?? null;
  156. if ($id) {
  157. try {
  158. // Direct database update to avoid Timer model issues
  159. $query = "UPDATE timers SET task_id = ?, description = ?, updated_at = ? WHERE id = ?";
  160. $stmt = $db->prepare($query);
  161. $result = $stmt->execute([
  162. $data['task_id'] ?? null,
  163. $data['description'] ?? '',
  164. gmdate('Y-m-d H:i:s'),
  165. $id
  166. ]);
  167. if ($result) {
  168. echo json_encode(['success' => true, 'message' => 'Timer updated successfully']);
  169. } else {
  170. echo json_encode(['success' => false, 'message' => 'Timer not found']);
  171. }
  172. } catch (Exception $e) {
  173. http_response_code(500);
  174. echo json_encode(['error' => 'Failed to update timer: ' . $e->getMessage()]);
  175. }
  176. } else {
  177. http_response_code(400);
  178. echo json_encode(['error' => 'Timer ID required']);
  179. }
  180. break;
  181. case 'test':
  182. echo json_encode(['success' => true, 'message' => 'Test endpoint working']);
  183. break;
  184. case 'minimal_stop':
  185. echo json_encode(['success' => true, 'message' => 'Minimal stop working']);
  186. break;
  187. default:
  188. http_response_code(400);
  189. echo json_encode(['error' => 'Invalid action']);
  190. }
  191. }
  192. function handlePutRequest() {
  193. global $timer;
  194. $data = json_decode(file_get_contents('php://input'), true);
  195. $id = $data['id'] ?? null;
  196. if ($id) {
  197. $timer->id = $id;
  198. $timer->description = $data['description'] ?? '';
  199. if ($timer->update()) {
  200. echo json_encode(['success' => true, 'timer' => $timer]);
  201. } else {
  202. http_response_code(500);
  203. echo json_encode(['error' => 'Failed to update timer']);
  204. }
  205. } else {
  206. http_response_code(400);
  207. echo json_encode(['error' => 'Timer ID required']);
  208. }
  209. }
  210. function handleDeleteRequest() {
  211. global $timer;
  212. $data = json_decode(file_get_contents('php://input'), true);
  213. $id = $data['id'] ?? null;
  214. if ($id) {
  215. if ($timer->delete()) {
  216. echo json_encode(['success' => true]);
  217. } else {
  218. http_response_code(500);
  219. echo json_encode(['error' => 'Failed to delete timer']);
  220. }
  221. } else {
  222. http_response_code(400);
  223. echo json_encode(['error' => 'Timer ID required']);
  224. }
  225. }
  226. ?>