Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 16 |
CRAP | |
0.00% |
0 / 252 |
StreamService | |
0.00% |
0 / 1 |
|
0.00% |
0 / 16 |
2652.00 | |
0.00% |
0 / 252 |
__construct | |
0.00% |
0 / 1 |
2.00 | |
0.00% |
0 / 2 |
|||
saveStream | |
0.00% |
0 / 1 |
56.00 | |
0.00% |
0 / 25 |
|||
validateSaveStreamRequest | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 4 |
|||
insertStream | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 14 |
|||
updateStream | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 17 |
|||
deleteStream | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 17 |
|||
restoreStream | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 17 |
|||
searchStream | |
0.00% |
0 / 1 |
132.00 | |
0.00% |
0 / 48 |
|||
getStreamDetails | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 23 |
|||
deleteStreamPermanently | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 11 |
|||
validateStreamBeforeDelete | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 22 |
|||
findPatternDepartmentCourseByIds | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 13 |
|||
haveId | |
0.00% |
0 / 1 |
12.00 | |
0.00% |
0 / 4 |
|||
haveIds | |
0.00% |
0 / 1 |
20.00 | |
0.00% |
0 / 10 |
|||
insertPatternDeptCourse | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 12 |
|||
updatePatternDeptCourse | |
0.00% |
0 / 1 |
6.00 | |
0.00% |
0 / 13 |
<?php | |
namespace com\linways\core\ams\professional\service\academic; | |
use com\linways\base\util\SecurityUtils; | |
use com\linways\base\util\MakeSingletonTrait; | |
use com\linways\core\ams\professional\service\BaseService; | |
use com\linways\core\ams\professional\exception\ProfessionalException; | |
use com\linways\core\ams\professional\mapper\academic\StreamServiceMapper; | |
use com\linways\core\ams\professional\request\academic\SearchStreamRequest; | |
use com\linways\core\ams\professional\constant\academic\StatusConstants; | |
use com\linways\core\ams\professional\dto\api\Stream; | |
use com\linways\core\ams\professional\request\academic\SearchProgramRequest; | |
class StreamService extends BaseService | |
{ | |
use MakeSingletonTrait; | |
private function __construct() { | |
$this->mapper = StreamServiceMapper::getInstance()->getMapper(); | |
} | |
/** | |
* Save stream | |
* @param Stream $stream | |
* @return String $id | |
*/ | |
public function saveStream (Stream $stream) | |
{ | |
$stream = $this->realEscapeObject($stream); | |
$stream->createdBy = $GLOBALS['userId'] ?? $stream->createdBy; | |
$stream->updatedBy = $GLOBALS['userId'] ?? $stream->updatedBy; | |
try{ | |
$this->validateSaveStreamRequest($stream); | |
if(!empty($stream->id)) | |
{ | |
$stream->id = $this->updateStream($stream); | |
} | |
else | |
{ | |
$stream->id = $this->insertStream($stream); | |
} | |
}catch(\Exception $e) { | |
if($e->getCode() !== ProfessionalException::INVALID_PARAMETER && $e->getCode() !== ProfessionalException::EMPTY_PARAMETERS && $e->getCode() !== ProfessionalException::DUPLICATE_ENTRY) { | |
throw new ProfessionalException($e->getCode(),"Failed to save Stream! Please try again"); | |
} else if ($e->getCode() === ProfessionalException::DUPLICATE_ENTRY) { | |
throw new ProfessionalException (ProfessionalException::DUPLICATE_ENTRY,"Cannot create stream $stream->name already exists!"); | |
} else { | |
throw new ProfessionalException ($e->getCode(),$e->getMessage()); | |
} | |
} | |
return $stream->id; | |
} | |
/** | |
* Validate Stream Request Before Saving | |
* @param Stream $stream | |
* @return NULL | |
*/ | |
private function validateSaveStreamRequest(Stream $stream) | |
{ | |
if(empty($stream->name)) | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Stream name is empty! Please enter a name for stream"); | |
} | |
/** | |
* Insert Stream | |
* @param Stream $stream | |
* @return String $id | |
*/ | |
private function insertStream(Stream $stream) | |
{ | |
$properties = !empty($stream->properties) ? "'" . json_encode($stream->properties) . "'" : "NULL"; | |
$id = SecurityUtils::getRandomString(); | |
$query = | |
"INSERT INTO `stream` | |
(`id`,`name`,`properties`,`created_by`,`updated_by`) | |
VALUES ('$id','$stream->name',$properties,'$stream->createdBy','$stream->updatedBy')"; | |
try { | |
$this->executeQuery($query); | |
// $this->insertPatternDeptCourse($id); | |
return $id; | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(),$e->getMessage()); | |
} | |
} | |
/** | |
* Update Stream | |
* @param Stream $stream | |
* @return NULL | |
*/ | |
private function updateStream(Stream $stream) | |
{ | |
$properties = !empty($stream->properties) ? "'".json_encode($stream->properties)."'" : "NULL"; | |
$query = "UPDATE | |
`stream` | |
SET | |
`name` = '$stream->name', | |
`properties` = $properties, | |
`updated_by` = '$stream->updatedBy' | |
WHERE | |
`id` = '$stream->id'"; | |
try { | |
// $this->updatePatternDeptCourse($stream); | |
$this->executeQuery($query); | |
return $stream->id; | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(),$e->getMessage()); | |
} | |
} | |
/** | |
* Delete Stream (Soft Delete) | |
* @param String $id | |
* @return NULL | |
*/ | |
public function deleteStream($id) | |
{ | |
$id = $this->realEscapeString($id); | |
$updatedBy = $GLOBALS['userId']; | |
$this->haveId($id); | |
$query = "UPDATE | |
`stream` | |
SET | |
`trashed` = UTC_TIMESTAMP(), | |
`updated_by` = '$updatedBy' | |
WHERE | |
`id` = '$id'"; | |
try { | |
$this->executeQuery($query); | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_DELETING,"Error deleting stream! Please try again"); | |
} | |
} | |
/** | |
* Restore Stream | |
* @param String $id | |
* @return NULL | |
*/ | |
public function restoreStream($id) | |
{ | |
$id = $this->realEscapeString($id); | |
$updatedBy = $GLOBALS['userId']; | |
$this->haveId($id); | |
$query = "UPDATE | |
`stream` | |
SET | |
`trashed` = NULL, | |
`updated_by` = '$updatedBy' | |
WHERE | |
`id` = '$id'"; | |
try { | |
$this->executeQuery($query); | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_RESTORING,"Error restoring academic term! Please try again"); | |
} | |
} | |
/** | |
* Search Academic term Details | |
* @param SearchStreamRequest $request | |
* @return Stream | |
*/ | |
public function searchStream(SearchStreamRequest $request) | |
{ | |
$request = $this->realEscapeObject($request); | |
$whereQuery = ""; | |
$limitQuery = ""; | |
if(!empty($request->id)) { | |
$whereQuery .= " AND st.id='$request->id' "; | |
} | |
if(!empty($request->ids)) { | |
$whereQuery .= " AND st.id in ("."'".implode("','", $request->ids)."'".") "; | |
} | |
if($request->trashed === StatusConstants::ACTIVE) { | |
$whereQuery .= " AND st.trashed IS NULL "; | |
} | |
if($request->trashed === StatusConstants::TRASHED) { | |
$whereQuery .= " AND st.trashed IS NOT NULL "; | |
} | |
if(!empty($request->name)) { | |
$whereQuery .= " AND st.name LIKE '%$request->name%' "; | |
} | |
if(!empty($request->checkIsActive)) { | |
$whereQuery .= " AND st.properties->>'$.isActive' = '".($request->isActive ? '1':'0')."' "; | |
} | |
if($request->startIndex !== "" && $request->endIndex !== "") | |
{ | |
$limitQuery .= " LIMIT $request->startIndex,$request->endIndex"; | |
} | |
$orderBy = " ORDER BY st.created_date DESC "; | |
$query = "SELECT | |
st.id, | |
st.name, | |
st.properties, | |
st.departmentId, | |
st.trashed, | |
st.created_by, | |
st.created_date, | |
st.updated_by, | |
st.updated_date | |
FROM | |
`stream` st | |
WHERE | |
1 = 1"; | |
try { | |
$streams = $this->executeQueryForList($query.$whereQuery.$orderBy.$limitQuery, $this->mapper[StreamServiceMapper::SEARCH_STREAMS]); | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_FETCHING,"Cannot fetch stream details! Please try again."); | |
} | |
return $streams; | |
} | |
/** | |
* get Academic term by id | |
* @param String $id | |
* @return Stream | |
*/ | |
public function getStreamDetails($id) | |
{ | |
$id = $this->realEscapeObject($id); | |
$this->haveId($id); | |
$query = "SELECT | |
st.id, | |
st.name, | |
st.properties, | |
st.trashed, | |
st.created_by, | |
st.created_date, | |
st.updated_by, | |
st.updated_date | |
FROM | |
`stream` st | |
WHERE | |
`id` = '$id'"; | |
try { | |
$stream = $this->executeQueryForObject($query,false, $this->mapper[StreamServiceMapper::SEARCH_STREAMS]); | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_FETCHING,"Cannot fetch stream details! Please try again"); | |
} | |
return $stream; | |
} | |
/** | |
* Delete Stream (Permanently Delete) | |
* @param String $id | |
* @return NULL | |
*/ | |
public function deleteStreamPermanently($id) | |
{ | |
$id = $this->realEscapeString($id); | |
$this->haveId($id); | |
$this->validateStreamBeforeDelete($id); | |
$query = "DELETE FROM `stream` WHERE `id` = '$id';"; | |
try { | |
$this->executeQuery($query); | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_DELETING,"Error deleting stream! Please try again"); | |
} | |
} | |
/** | |
* Delete Stream (Permanently Delete) | |
* @param String $id | |
* @return NULL | |
*/ | |
public function validateStreamBeforeDelete($id) | |
{ | |
$id = $this->realEscapeString($id); | |
$this->haveId($id); | |
$request = new SearchProgramRequest(); | |
$request->streamIds [] = $id; | |
$programs = ProgramService::getInstance()->searchProgram($request); | |
if(!count($programs)){ | |
try { | |
$this->executeQuery("UPDATE pattern_deptcourses p | |
INNER JOIN (SELECT pd.patterncourseID AS id,JSON_ARRAYAGG(s2.id) AS stream_ids FROM pattern_deptcourses pd | |
INNER JOIN stream s ON json_contains(pd.stream_ids,CONCAT('\"',s.id,'\"'),'$') | |
INNER JOIN stream s2 ON json_contains(pd.stream_ids,CONCAT('\"',s2.id,'\"'),'$') AND s.id <> s2.id | |
WHERE s.id = '$id' | |
GROUP BY pd.patterncourseID) t ON p.patterncourseID = t.id | |
SET p.stream_ids = t.stream_ids;"); | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_DELETING,"Error while deleting! Please try again"); | |
} | |
}else{ | |
throw new ProfessionalException(ProfessionalException::HAVE_RELATIONS,"Cannot delete stream! Please try again."); | |
} | |
} | |
/** | |
* Find pattern-department-course | |
* @param ARRAY $ids | |
* @return NULL | |
*/ | |
public function findPatternDepartmentCourseByIds($request) | |
{ | |
$request = $this->realEscapeObject($request); | |
$streamIds = $this->haveIds($request->streamIds); | |
try { | |
return $this->executeQueryForObject( | |
"SELECT `patterncourseID` AS `id`, `patterncourseName` AS name, `patternID` AS `patternId`, `deptID` AS `departmentId`, `patterncourseCode` AS `code`, `patternAbbreviation` AS `abbreviation`, `extraSettings`, `stream_ids`, `isHide` | |
FROM `pattern_deptcourses` | |
WHERE JSON_CONTAINS(`stream_ids`,concat('\"','$streamIds[0]','\"'),'$');" | |
); | |
} catch (\Exception $e) { | |
throw new ProfessionalException(ProfessionalException::ERROR_DELETING,"Error while deleting! Please try again"); | |
} | |
} | |
public function haveId($id,$msg = null){ | |
$msg = $msg ? $msg : 'Stream'; | |
if(empty($id)) | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"$msg is invalid! Please enter a valid ".strtolower($msg)); | |
} | |
public function haveIds($ids){ | |
$returnIds = []; | |
foreach ($ids as $id) { | |
$id ? $returnIds [] = $id : ""; | |
} | |
if(count($ids)){ | |
return $returnIds; | |
}else{ | |
throw new ProfessionalException(ProfessionalException::EMPTY_PARAMETERS,"Stream is invalid! Please enter a valid streams"); | |
} | |
} | |
/** | |
* Insert pattern dept course | |
* @param Stream $id | |
*/ | |
private function insertPatternDeptCourse($streamId) | |
{ | |
$streamId = $this->realEscapeString($streamId); | |
$query = | |
"INSERT INTO `pattern_deptcourses` (`patterncourseName`, `deptID`, `patterncourseCode`, `patternAbbreviation`, `stream_ids`, `isHide`) | |
SELECT `name`, `departmentId`, s.properties->'$.code', s.properties->'$.abbreviation', json_array(`id`), if(s.properties->'$.isActive',0,1) as `isHide` | |
from `stream` s where s.id = '".$streamId."';"; | |
try { | |
$this->executeQuery($query); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(),$e->getMessage()); | |
} | |
} | |
/** | |
* Insert pattern dept course | |
* @param Stream $id | |
* @deprecated | |
*/ | |
private function updatePatternDeptCourse($stream) | |
{ | |
$stream = $this->realEscapeObject($stream); | |
$query = | |
"UPDATE `pattern_deptcourses` pdc | |
INNER JOIN `stream` s ON JSON_CONTAINS(pdc.stream_ids,concat('\"',s.id,'\"'),'$') | |
SET pdc.patternAbbreviation = REPLACE(pdc.patternAbbreviation, s.name, '$stream->name') | |
WHERE s.id = '".$stream->id."';"; | |
try { | |
$this->executeQuery($query); | |
} catch (\Exception $e) { | |
throw new ProfessionalException($e->getCode(),$e->getMessage()); | |
} | |
} | |
} |