clqms-be/app/Controllers/Rule/RuleActionController.php

228 lines
8.2 KiB
PHP
Raw Normal View History

<?php
namespace App\Controllers\Rule;
use App\Controllers\BaseController;
use App\Models\Rule\RuleActionModel;
use App\Models\Rule\RuleDefModel;
use App\Models\Test\TestDefSiteModel;
use App\Traits\ResponseTrait;
class RuleActionController extends BaseController
{
use ResponseTrait;
protected RuleDefModel $ruleDefModel;
protected RuleActionModel $ruleActionModel;
public function __construct()
{
$this->ruleDefModel = new RuleDefModel();
$this->ruleActionModel = new RuleActionModel();
}
public function index($ruleID = null)
{
try {
if (!$ruleID || !is_numeric($ruleID)) {
return $this->failValidationErrors('RuleID is required');
}
$rule = $this->ruleDefModel->where('EndDate', null)->find((int) $ruleID);
if (!$rule) {
return $this->respond([
'status' => 'failed',
'message' => 'Rule not found',
'data' => [],
], 404);
}
$rows = $this->ruleActionModel
->where('RuleID', (int) $ruleID)
->where('EndDate', null)
->orderBy('RuleActionID', 'ASC')
->findAll();
return $this->respond([
'status' => 'success',
'message' => 'fetch success',
'data' => $rows,
], 200);
} catch (\Throwable $e) {
log_message('error', 'RuleActionController::index error: ' . $e->getMessage());
return $this->failServerError('Something went wrong: ' . $e->getMessage());
}
}
public function create($ruleID = null)
{
$input = $this->request->getJSON(true) ?? [];
if (!$ruleID || !is_numeric($ruleID)) {
$ruleID = $input['RuleID'] ?? null;
}
if (!$ruleID || !is_numeric($ruleID)) {
return $this->failValidationErrors('RuleID is required');
}
$rule = $this->ruleDefModel->where('EndDate', null)->find((int) $ruleID);
if (!$rule) {
return $this->respond([
'status' => 'failed',
'message' => 'Rule not found',
'data' => [],
], 404);
}
$validation = service('validation');
$validation->setRules([
'ActionType' => 'required|max_length[50]',
]);
if (!$validation->run($input)) {
return $this->failValidationErrors($validation->getErrors());
}
// Light validation for SET_RESULT params
$actionType = strtoupper((string) $input['ActionType']);
$params = $input['ActionParams'] ?? null;
if ($actionType === 'SET_RESULT') {
$decoded = is_array($params) ? $params : (is_string($params) ? json_decode($params, true) : null);
if (!is_array($decoded)) {
return $this->failValidationErrors(['ActionParams' => 'ActionParams must be JSON object for SET_RESULT']);
}
if (empty($decoded['testSiteID']) && empty($decoded['testSiteCode'])) {
return $this->failValidationErrors(['ActionParams' => 'SET_RESULT requires testSiteID or testSiteCode']);
}
if (!array_key_exists('value', $decoded) && !array_key_exists('valueExpr', $decoded)) {
return $this->failValidationErrors(['ActionParams' => 'SET_RESULT requires value or valueExpr']);
}
if (!empty($decoded['testSiteID']) && is_numeric($decoded['testSiteID'])) {
$testDef = new TestDefSiteModel();
$exists = $testDef->where('EndDate', null)->find((int) $decoded['testSiteID']);
if (!$exists) {
return $this->failValidationErrors(['ActionParams' => 'testSiteID not found']);
}
}
}
try {
if (is_array($params)) {
$params = json_encode($params);
}
$id = $this->ruleActionModel->insert([
'RuleID' => (int) $ruleID,
'ActionType' => $input['ActionType'],
'ActionParams' => is_string($params) ? $params : null,
], true);
return $this->respondCreated([
'status' => 'success',
'message' => 'Action created successfully',
'data' => ['RuleActionID' => $id],
], 201);
} catch (\Throwable $e) {
log_message('error', 'RuleActionController::create error: ' . $e->getMessage());
return $this->failServerError('Something went wrong: ' . $e->getMessage());
}
}
public function update($ruleID = null, $actionID = null)
{
$input = $this->request->getJSON(true) ?? [];
if (!$ruleID || !is_numeric($ruleID)) {
$ruleID = $input['RuleID'] ?? null;
}
if (!$actionID || !is_numeric($actionID)) {
$actionID = $input['RuleActionID'] ?? null;
}
if (!$ruleID || !is_numeric($ruleID) || !$actionID || !is_numeric($actionID)) {
return $this->failValidationErrors('RuleID and RuleActionID are required');
}
$rule = $this->ruleDefModel->where('EndDate', null)->find((int) $ruleID);
if (!$rule) {
return $this->respond([
'status' => 'failed',
'message' => 'Rule not found',
'data' => [],
], 404);
}
$existing = $this->ruleActionModel->where('EndDate', null)->find((int) $actionID);
if (!$existing || (int) ($existing['RuleID'] ?? 0) !== (int) $ruleID) {
return $this->respond([
'status' => 'failed',
'message' => 'Action not found',
'data' => [],
], 404);
}
$validation = service('validation');
$validation->setRules([
'ActionType' => 'permit_empty|max_length[50]',
]);
if (!$validation->run($input)) {
return $this->failValidationErrors($validation->getErrors());
}
try {
$updateData = [];
foreach (['ActionType', 'ActionParams'] as $field) {
if (array_key_exists($field, $input)) {
$updateData[$field] = $input[$field];
}
}
if (isset($updateData['ActionParams']) && is_array($updateData['ActionParams'])) {
$updateData['ActionParams'] = json_encode($updateData['ActionParams']);
}
if (!empty($updateData)) {
$this->ruleActionModel->update((int) $actionID, $updateData);
}
return $this->respond([
'status' => 'success',
'message' => 'Action updated successfully',
'data' => ['RuleActionID' => (int) $actionID],
], 200);
} catch (\Throwable $e) {
log_message('error', 'RuleActionController::update error: ' . $e->getMessage());
return $this->failServerError('Something went wrong: ' . $e->getMessage());
}
}
public function delete($ruleID = null, $actionID = null)
{
try {
if (!$ruleID || !is_numeric($ruleID) || !$actionID || !is_numeric($actionID)) {
return $this->failValidationErrors('RuleID and RuleActionID are required');
}
$existing = $this->ruleActionModel->where('EndDate', null)->find((int) $actionID);
if (!$existing || (int) ($existing['RuleID'] ?? 0) !== (int) $ruleID) {
return $this->respond([
'status' => 'failed',
'message' => 'Action not found',
'data' => [],
], 404);
}
$this->ruleActionModel->delete((int) $actionID);
return $this->respondDeleted([
'status' => 'success',
'message' => 'Action deleted successfully',
'data' => ['RuleActionID' => (int) $actionID],
]);
} catch (\Throwable $e) {
log_message('error', 'RuleActionController::delete error: ' . $e->getMessage());
return $this->failServerError('Something went wrong: ' . $e->getMessage());
}
}
}