Adding put method for /project endpoint (1st commit - still not functional)

This commit is contained in:
Erik Amaru Ortiz
2013-12-23 17:17:01 -04:00
parent 97e3660c26
commit 1ac6518734
4 changed files with 313 additions and 4 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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;