Current File : /home/mdkeenpw/www/wp-content/plugins/extendify/app/Agent/Controllers/WorkflowHistoryController.php |
<?php
/**
* Store info about messages/events from chat
*/
namespace Extendify\Agent\Controllers;
defined('ABSPATH') || die('No direct access.');
use Extendify\Shared\Services\Sanitizer;
/**
* The controller
*/
class WorkflowHistoryController
{
/**
* Initialize the controller and set up the database table.
*
* @return \WP_REST_Response
*/
public static function init()
{
self::setupWorkflowsTable();
}
/**
* Get the last 5 workflows
*
* @return array
*/
public static function getWorkflowHistory($user_id = null)
{
global $wpdb;
$table = $wpdb->prefix . 'extendify_agent_workflows';
$user_id = $user_id ?: get_current_user_id();
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM $table WHERE user_id = %d ORDER BY created_at DESC LIMIT 5",
$user_id
),
ARRAY_A
);
return array_map(function ($item) {
return [
'workflowId' => $item['workflow_id'],
'answerId' => $item['answer_id'],
'summary' => $item['summary'],
'status' => $item['status'],
'errorMsg' => $item['error_msg'],
'agentName' => $item['agent_name'],
'createdAt' => $item['created_at'],
];
}, $results);
}
/**
* Persist the data
*
* @param \WP_REST_Request $request - The request.
* @return \WP_REST_Response
*/
public static function add($request)
{
global $wpdb;
$table = $wpdb->prefix . 'extendify_agent_workflows';
$user_id = get_current_user_id();
$wpdb->insert($table, [
'workflow_id' => Sanitizer::sanitizeText($request->get_param('workflowId')),
'answer_id' => Sanitizer::sanitizeText($request->get_param('answerId')),
'summary' => Sanitizer::sanitizeTextarea($request->get_param('summary')),
'status' => Sanitizer::sanitizeText($request->get_param('status')),
'error_msg' => Sanitizer::sanitizeText($request->get_param('errorMsg')),
'agent_name' => Sanitizer::sanitizeText($request->get_param('agentName')),
'user_id' => $user_id,
'created_at' => current_time('mysql'),
]);
return new \WP_REST_Response(null, 204);
}
/**
* Ensures the custom table exists and is up to date for MySQL.
* Creates the table if missing, adds missing columns, and ensures an index on user_id.
*
* @return void
*/
private static function setupWorkflowsTable()
{
global $wpdb;
$table = $wpdb->prefix . 'extendify_agent_workflows';
$columns = [
'id' => "BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY",
'workflow_id' => "VARCHAR(64) NOT NULL",
'answer_id' => "VARCHAR(64) NOT NULL",
'summary' => "TEXT",
'error_msg' => "TEXT",
'agent_name' => "VARCHAR(64) NOT NULL",
'status' => "VARCHAR(20) NOT NULL",
'user_id' => "BIGINT UNSIGNED NOT NULL",
'created_at' => "DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP"
];
$exists = $wpdb->get_var("SHOW TABLES LIKE '$table'");
if (!$exists) {
$cols = [];
foreach ($columns as $name => $type) {
$cols[] = "$name $type";
}
$sql = "CREATE TABLE $table (" . implode(',', $cols) . ", INDEX(user_id)) ";
$sql .= $wpdb->get_charset_collate() . ";";
$wpdb->query($sql);
return;
}
$existingCols = array_column($wpdb->get_results("SHOW COLUMNS FROM $table", ARRAY_A), 'Field');
foreach ($columns as $name => $type) {
if (!in_array($name, $existingCols, true)) {
$wpdb->query("ALTER TABLE $table ADD COLUMN $name $type");
}
}
// Indexes
$userIndex = $wpdb->get_results("SHOW INDEX FROM $table WHERE Key_name = 'user_id'", ARRAY_A);
if (empty($userIndex)) {
$wpdb->query("CREATE INDEX user_id ON $table(user_id)");
}
}
}