false, 'ERROR' => 'missing_params', 'MESSAGE' => 'TaskID is required']); } if (empty($message)) { apiAbort(['OK' => false, 'ERROR' => 'missing_params', 'MESSAGE' => 'Message is required']); } if ($userID <= 0) { apiAbort(['OK' => false, 'ERROR' => 'missing_params', 'MESSAGE' => 'UserID is required']); } if ($senderType !== 'customer' && $senderType !== 'worker') { $senderType = 'customer'; } try { // Verify task exists and is still open $taskQuery = queryOne(" SELECT ID, ClaimedByUserID, CompletedOn FROM Tasks WHERE ID = ? ", [$taskID]); if (!$taskQuery) { apiAbort(['OK' => false, 'ERROR' => 'not_found', 'MESSAGE' => 'Task not found']); } if (!empty(trim($taskQuery['CompletedOn'] ?? ''))) { apiAbort(['OK' => false, 'ERROR' => 'chat_closed', 'MESSAGE' => 'This chat has ended']); } // Insert message queryTimed(" INSERT INTO ChatMessages (TaskID, SenderUserID, SenderType, MessageBody) VALUES (?, ?, ?, ?) ", [$taskID, $userID, $senderType, $message]); $messageID = (int) lastInsertId(); jsonResponse([ 'OK' => true, 'MessageID' => $messageID, 'MESSAGE' => 'Message sent', ]); } catch (Exception $e) { jsonResponse(['OK' => false, 'ERROR' => 'server_error', 'MESSAGE' => $e->getMessage()]); }