Adding put method for /project endpoint (1st commit - still not functional)
This commit is contained in:
@@ -14,6 +14,50 @@ require_once 'classes/model/om/BaseBpmnActivity.php';
|
||||
*
|
||||
* @package classes.model
|
||||
*/
|
||||
class BpmnActivity extends BaseBpmnActivity {
|
||||
class BpmnActivity extends BaseBpmnActivity
|
||||
{
|
||||
public function create($data, $generateUid = true)
|
||||
{
|
||||
// validate foreign keys, they must be present into data array
|
||||
|
||||
if (! array_key_exists('PRJ_UID', $data)) {
|
||||
throw new PropelException("Error, required param 'PRJ_UID' is missing!");
|
||||
}
|
||||
|
||||
if (! array_key_exists('PRO_UID', $data)) {
|
||||
throw new PropelException("Error, required param 'PRO_UID' is missing!");
|
||||
}
|
||||
|
||||
$this->fromArray($data, BasePeer::TYPE_FIELDNAME);
|
||||
|
||||
if ($generateUid) {
|
||||
$this->setActUid(\ProcessMaker\Util\Hash::generateUID());
|
||||
}
|
||||
|
||||
$this->save();
|
||||
$process = BpmnProcessPeer::retrieveByPK($data['PRO_UID']);
|
||||
|
||||
// create related bound
|
||||
$bound = new Bound();
|
||||
$bound->fromArray($data, BasePeer::TYPE_FIELDNAME);
|
||||
$bound->setBouUid(\ProcessMaker\Util\Hash::generateUID());
|
||||
$bound->setPrjUid($this->getPrjUid());
|
||||
$bound->setDiaUid($process->getDiaUid());
|
||||
$bound->setElementUid($this->getActUid());
|
||||
$bound->setBouElementType('bpmnActivity');
|
||||
$bound->setBouElement('pm_canvas');
|
||||
$bound->setBouContainer('bpmnDiagram');
|
||||
$bound->save();
|
||||
}
|
||||
|
||||
public function update($data)
|
||||
{
|
||||
$this->fromArray($data, BasePeer::TYPE_FIELDNAME);
|
||||
$this->save();
|
||||
|
||||
// update related bound
|
||||
$bound = BpmnBound::findOneBy(BpmnBoundPeer::ELEMENT_UID, $this->getActUid());
|
||||
$bound->fromArray($data, BasePeer::TYPE_FIELDNAME);
|
||||
$bound->save();
|
||||
}
|
||||
} // BpmnActivity
|
||||
|
||||
@@ -14,6 +14,18 @@ require_once 'classes/model/om/BaseBpmnBound.php';
|
||||
*
|
||||
* @package classes.model
|
||||
*/
|
||||
class BpmnBound extends BaseBpmnBound {
|
||||
class BpmnBound extends BaseBpmnBound
|
||||
{
|
||||
public static function findOneBy($field, $value)
|
||||
{
|
||||
$c = new Criteria('workflow');
|
||||
|
||||
$c->add($field, $value, CRITERIA::EQUAL );
|
||||
|
||||
$rs = ContentPeer::doSelectRS($c);
|
||||
//$rs->setFetchmode(ResultSet::FETCHMODE_ASSOC);
|
||||
$rs->next();
|
||||
|
||||
return $rs->getRow();
|
||||
}
|
||||
} // BpmnBound
|
||||
|
||||
@@ -28,6 +28,7 @@ use \BpmnArtifactPeer as ArtifactPeer;
|
||||
use \ProcessMaker\Util\Hash;
|
||||
use \BasePeer;
|
||||
|
||||
|
||||
/**
|
||||
* Class Model
|
||||
*
|
||||
@@ -291,7 +292,7 @@ class Model
|
||||
return $uids;
|
||||
}
|
||||
|
||||
public function loadProject($prjUid)
|
||||
public static function loadProject($prjUid)
|
||||
{
|
||||
/*
|
||||
* 1. load object of project
|
||||
@@ -367,6 +368,127 @@ class Model
|
||||
return $projects;
|
||||
}
|
||||
|
||||
public static function updateProject($prjUid, $projectUpdated)
|
||||
{
|
||||
$project = ProjectPeer::retrieveByPK($prjUid);
|
||||
$project->setPrjName($projectUpdated['prj_name']);
|
||||
$project->setPrjUpdateDate(date("Y-m-d H:i:s"));
|
||||
$project->save();
|
||||
|
||||
$diagramData = $projectUpdated['diagrams'][0];
|
||||
|
||||
$diagram = DiagramPeer::retrieveByPK($diagramData['dia_uid']);
|
||||
$diagram->setDiaName($diagramData['dia_name']);
|
||||
|
||||
if (!empty($diagramData['dia_is_closable'])) {
|
||||
$diagram->setDiaIsClosable($diagramData['dia_is_closable']);
|
||||
}
|
||||
|
||||
$diagram->save();
|
||||
|
||||
$processData = self::getBpmnObjectBy('Process', ProcessPeer::PRJ_UID, $prjUid);
|
||||
|
||||
$process = ProcessPeer::retrieveByPK($processData['pro_uid']);
|
||||
$process->setProName($process->getProName());
|
||||
$process->save();
|
||||
|
||||
$savedProject = self::loadProject($prjUid);
|
||||
$diff = self::getDiffFromProjects($savedProject, $projectUpdated);
|
||||
|
||||
self::updateDiagram($diff);
|
||||
}
|
||||
|
||||
public static function updateDiagram($diff)
|
||||
{
|
||||
return false;
|
||||
|
||||
// Creating new objects
|
||||
foreach ($diff['new'] as $element => $items) {
|
||||
foreach ($items as $data) {
|
||||
switch ($element) {
|
||||
case 'activities':
|
||||
$data = array_change_key_case((array) $data, CASE_UPPER);
|
||||
$activity = new Activity();
|
||||
$activity->create($data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//$activity = ActivityPeer::retrieveByPK($item);
|
||||
}
|
||||
|
||||
public static function getDiffFromProjects($savedProject, $updatedProject)
|
||||
{
|
||||
// preparing target project
|
||||
$diagramElements = array(
|
||||
'act_uid' => 'activities',
|
||||
'evn_uid' => 'events',
|
||||
'flo_uid' => 'flows',
|
||||
'art_uid' => 'artifacts',
|
||||
'lns_uid' => 'laneset',
|
||||
'lan_uid' => 'lanes'
|
||||
);
|
||||
|
||||
// Getting Differences
|
||||
$newRecords = array();
|
||||
$deletedRecords = array();
|
||||
$updatedRecords = array();
|
||||
|
||||
// Get new records
|
||||
foreach ($diagramElements as $key => $element) {
|
||||
$arrayDiff = self::arrayDiff(
|
||||
$savedProject['diagrams'][0][$element],
|
||||
$updatedProject['diagrams'][0][$element],
|
||||
$key
|
||||
);
|
||||
|
||||
if (! empty($arrayDiff)) {
|
||||
$newRecords[$element] = $arrayDiff;
|
||||
}
|
||||
}
|
||||
|
||||
// Get deleted records
|
||||
foreach ($diagramElements as $key => $element) {
|
||||
$arrayDiff = self::arrayDiff(
|
||||
$updatedProject['diagrams'][0][$element],
|
||||
$savedProject['diagrams'][0][$element],
|
||||
$key
|
||||
);
|
||||
|
||||
if (! empty($arrayDiff)) {
|
||||
$deletedRecords[$element] = $arrayDiff;
|
||||
}
|
||||
}
|
||||
|
||||
// Get updated records
|
||||
$checksum = array();
|
||||
foreach ($diagramElements as $key => $element) {
|
||||
$checksum[$element] = self::getArrayChecksum($savedProject['diagrams'][0][$element], $key);
|
||||
}
|
||||
|
||||
foreach ($diagramElements as $key => $element) {
|
||||
foreach ($updatedProject['diagrams'][0][$element] as $item) {
|
||||
if (in_array($item[$key], $newRecords[$element]) || in_array($item[$key], $deletedRecords[$element])) {
|
||||
// skip new or deleted records
|
||||
continue;
|
||||
}
|
||||
|
||||
if (self::getChecksum($item) !== $checksum[$element][$item[$key]]) {
|
||||
$updatedRecords[$element][] = $item;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$diff = array(
|
||||
'new' => $newRecords,
|
||||
'deleted' => $deletedRecords,
|
||||
'updated' => $updatedRecords
|
||||
);
|
||||
|
||||
return $diff;
|
||||
}
|
||||
|
||||
public static function getRelatedFlows($actUid)
|
||||
{
|
||||
$flows = array(
|
||||
@@ -457,5 +579,49 @@ class Model
|
||||
|
||||
return empty($record) ? null : $record[0];
|
||||
}
|
||||
|
||||
private static function arrayDiff($list, $targetList, $key)
|
||||
{
|
||||
$uid = array();
|
||||
$diff = array();
|
||||
|
||||
foreach ($list as $item) {
|
||||
if (array_key_exists($key, $item)) {
|
||||
$uid[] = $item[$key];
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($targetList as $item) {
|
||||
if (! in_array($item[$key], $uid)) {
|
||||
$diff[] = $item[$key];
|
||||
}
|
||||
}
|
||||
|
||||
return $diff;
|
||||
}
|
||||
|
||||
private static function getArrayChecksum($list, $key = null)
|
||||
{
|
||||
$checksum = array();
|
||||
|
||||
foreach ($list as $k => $item) {
|
||||
if (empty($key)) {
|
||||
$checksum[$k] = self::getChecksum($item);
|
||||
} else {
|
||||
$checksum[$item[$key]] = self::getChecksum($item);
|
||||
}
|
||||
}
|
||||
|
||||
return $checksum;
|
||||
}
|
||||
|
||||
private static function getChecksum($data)
|
||||
{
|
||||
if (! is_string($data)) {
|
||||
$data = var_export($data, true);
|
||||
}
|
||||
|
||||
return sha1($data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace Services\Api\ProcessMaker;
|
||||
use Luracast\Restler\RestException;
|
||||
use ProcessMaker\Services\Api;
|
||||
use ProcessMaker\Adapter\Bpmn\Model as BpmnModel;
|
||||
use ProcessMaker\Adapter\Workflow;
|
||||
|
||||
/**
|
||||
* Class Project
|
||||
@@ -35,7 +36,7 @@ class Project extends Api
|
||||
$bpmnModel = new BpmnModel();
|
||||
$uids = $bpmnModel->createProject($request_data);
|
||||
|
||||
$wfProcess = \ProcessMaker\Adapter\Workflow::loadFromBpmnProject($uids[0]['new_uid']);
|
||||
$wfProcess = Workflow::loadFromBpmnProject($uids[0]['new_uid']);
|
||||
|
||||
$process = new \BusinessModel\Process();
|
||||
$userUid = $this->getUserId();
|
||||
@@ -53,6 +54,92 @@ class Project extends Api
|
||||
try {
|
||||
$project = BpmnModel::loadProject($prjUid);
|
||||
|
||||
return $project;
|
||||
} catch (\Exception $e) {
|
||||
throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
function put($prjUid, $request_data)
|
||||
{
|
||||
try {
|
||||
$project = BpmnModel::updateProject($prjUid, $request_data);
|
||||
|
||||
return $project;
|
||||
} catch (\Exception $e) {
|
||||
throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
function put22($prjUid, $request_data)
|
||||
{
|
||||
try {
|
||||
$project = BpmnModel::loadProject($prjUid);
|
||||
|
||||
|
||||
$projectUpdated = $project;
|
||||
$projectUpdated['diagrams'][0]['activities'][] = array(
|
||||
"act_uid" => "befd5b20508822592122970978652b05",
|
||||
"prj_uid" => "27289719452b05bef821d30070436486",
|
||||
"pro_uid" => "67771289152b05bef952892039062017",
|
||||
"act_name" => "Task # x",
|
||||
"act_type" => "TASK",
|
||||
"act_is_for_compensation" => 0,
|
||||
"act_start_quantity" => "1",
|
||||
"act_completion_quantity" => 0,
|
||||
"act_task_type" => "EMPTY",
|
||||
"act_implementation" => "",
|
||||
"act_instantiate" => 0,
|
||||
"act_script_type" => "",
|
||||
"act_script" => "",
|
||||
"act_loop_type" => "NONE",
|
||||
"act_test_before" => "",
|
||||
"act_loop_maximum" => 0,
|
||||
"act_loop_condition" => "",
|
||||
"act_loop_cardinality" => 0,
|
||||
"act_loop_behavior" => "",
|
||||
"act_is_adhoc" => 0,
|
||||
"act_is_collapsed" => 0,
|
||||
"act_completion_condition" => "",
|
||||
"act_ordering" => "",
|
||||
"act_cancel_remaining_instances" => 1,
|
||||
"act_protocol" => "",
|
||||
"act_method" =>"",
|
||||
"act_is_global" => 0,
|
||||
"act_referer" => "",
|
||||
"act_default_flow" => 0,
|
||||
"act_master_diagram" => "",
|
||||
"bou_uid" => "65717999352b05befddcaf6007443642",
|
||||
"dia_uid" => "12117099152b05bef8d4c66069408293",
|
||||
"element_uid" => "22970978652b05befd5b205088225921",
|
||||
"bou_element" => "pm_canvas",
|
||||
"bou_element_type" => "bpmnActivity",
|
||||
"bou_x" => 467,
|
||||
"bou_y" => 331,
|
||||
"bou_width" => 100,
|
||||
"bou_height" => 50,
|
||||
"bou_rel_position" => 0,
|
||||
"bou_size_identical" => 0,
|
||||
"bou_container" => "bpmnDiagram"
|
||||
);
|
||||
|
||||
|
||||
|
||||
echo 'updated: ' . $projectUpdated['diagrams'][0]['activities'][0]['act_uid'] . PHP_EOL;
|
||||
echo 'deleted: ' . $projectUpdated['diagrams'][0]['activities'][1]['act_uid'] . PHP_EOL;
|
||||
echo 'deleted: ' . $projectUpdated['diagrams'][0]['events'][0]['evn_uid'] . PHP_EOL;
|
||||
echo 'deleted: ' . $projectUpdated['diagrams'][0]['events'][1]['evn_uid'] . PHP_EOL;
|
||||
|
||||
unset($projectUpdated['diagrams'][0]['activities'][1]);
|
||||
unset($projectUpdated['diagrams'][0]['events'][0]);
|
||||
unset($projectUpdated['diagrams'][0]['events'][1]);
|
||||
|
||||
$projectUpdated['diagrams'][0]['activities'][0]['act_name'] = 'changed name';
|
||||
|
||||
|
||||
$diff = \ProcessMaker\Adapter\Bpmn\Model::getDiffFromProjects($project, $projectUpdated);
|
||||
return $diff;
|
||||
|
||||
//$WorkflowProces = \ProcessMaker\Adapter\Workflow::loadFromBpmnProject($prjUid);
|
||||
//return $WorkflowProces;
|
||||
return $project;
|
||||
|
||||
Reference in New Issue
Block a user