Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 33
CRAP
0.00% covered (danger)
0.00%
0 / 773
CourseMaterialService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 33
34782.00
0.00% covered (danger)
0.00%
0 / 773
 __construct
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 3
 __clone
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 getInstance
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 5
 addCourseMaterial
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 32
 updateCourseMaterial
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 18
 addStaffDocument
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 17
 updateStaffDocuments
0.00% covered (danger)
0.00%
0 / 1
20.00
0.00% covered (danger)
0.00%
0 / 18
 getDocumentCategories
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getDocumentSubCategories
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 10
 getStaffDocuments
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 18
 createCourseMaterialService
0.00% covered (danger)
0.00%
0 / 1
210.00
0.00% covered (danger)
0.00%
0 / 51
 updateCourseMaterialDetails
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 21
 getAllCourseMaterials
0.00% covered (danger)
0.00%
0 / 1
506.00
0.00% covered (danger)
0.00%
0 / 97
 getResourceIdByDocumentId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 deleteCourseMaterial
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 33
 checkResourceHasCopied
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 11
 lockOrUnlockDocument
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 13
 deleteCourseMaterialLikes
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 deleteCourseMaterialComments
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 deleteCourseMaterialRatings
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 8
 getCourseMaterialDetails
0.00% covered (danger)
0.00%
0 / 1
156.00
0.00% covered (danger)
0.00%
0 / 80
 getCourseMaterialComments
0.00% covered (danger)
0.00%
0 / 1
156.00
0.00% covered (danger)
0.00%
0 / 61
 postComment
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 18
 deleteComment
0.00% covered (danger)
0.00%
0 / 1
56.00
0.00% covered (danger)
0.00%
0 / 22
 userHasPermissionToViewThisDocument
0.00% covered (danger)
0.00%
0 / 1
420.00
0.00% covered (danger)
0.00%
0 / 43
 markOrUnmarkUserLike
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 19
 copyCourseMaterials
0.00% covered (danger)
0.00%
0 / 1
182.00
0.00% covered (danger)
0.00%
0 / 37
 isDocumentShared
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 9
 getCourseMaterialsBySbsId
0.00% covered (danger)
0.00%
0 / 1
72.00
0.00% covered (danger)
0.00%
0 / 38
 getCourseMaterialById
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 17
 getVideoContentByVideoId
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 9
 getVideoMaterialsBySbsId
0.00% covered (danger)
0.00%
0 / 1
42.00
0.00% covered (danger)
0.00%
0 / 18
 getUploadedCourseMaterialByTopicId
0.00% covered (danger)
0.00%
0 / 1
12.00
0.00% covered (danger)
0.00%
0 / 12
<?php
namespace com\linways\core\ams\professional\service;
use com\linways\base\util\SecurityUtils;
use com\linways\core\ams\professional\constant\BackendTypes;
use com\linways\core\ams\professional\constant\ResourceContext;
use com\linways\core\ams\professional\constant\UserType;
use com\linways\core\ams\professional\dto\CourseMaterial;
use com\linways\core\ams\professional\exception\ProfessionalException;
use com\linways\core\ams\professional\mapper\CourseMaterialServiceMapper;
use com\linways\core\ams\professional\request\AddCourseMaterialRequest;
use com\linways\core\ams\professional\request\AddResourceRequest;
use com\linways\core\ams\professional\request\AddStaffDocumentRequest;
use com\linways\core\ams\professional\request\CheckUserCourseMaterialPermission;
use com\linways\core\ams\professional\request\CopyCourseMaterialRequest;
use com\linways\core\ams\professional\request\DeleteCommentRequest;
use com\linways\core\ams\professional\request\DeleteCourseMaterialRequest;
use com\linways\core\ams\professional\request\GetAllCourseMaterialsRequest;
use com\linways\core\ams\professional\request\GetCourseMaterialDetailsRequest;
use com\linways\core\ams\professional\request\GetCourseMaterialRequest;
use com\linways\core\ams\professional\request\GetPreSignedUrlRequest;
use com\linways\core\ams\professional\request\GetStaffDocumentsRequest;
use com\linways\core\ams\professional\request\LockOrUnlockDocumentRequest;
use com\linways\core\ams\professional\request\MarkUnMarkUserLikeRequest;
use com\linways\core\ams\professional\request\PostCommentRequest;
use com\linways\core\ams\professional\request\RemoveResourceRequest;
use com\linways\core\ams\professional\request\UpdateCourseMaterialRequest;
use com\linways\core\ams\professional\request\UpdateStaffDocumentRequest;
use com\linways\core\ams\professional\response\GetAllCourseMaterialResponse;
use com\linways\core\ams\professional\util\CommonUtil;
use com\linways\core\ams\professional\service\StaffService;
/**
 *
 * @author jithinvijayan
 * @Date 16/03/20
 */
class CourseMaterialService extends BaseService
{
    /**
     * @var null
     */
    private static $_instance = null;
    private $mapper = [];
    /**
     * Locked down the constructor|Prevent any outside instantiation of this class
     *
     * CourseMaterialService constructor.
     */
    private function __construct()
    {
        $this->mapper = CourseMaterialServiceMapper::getInstance()->getMapper();
    }
    /**
     * Prevent any object or instance of that class to be cloned | Prevent any copy of this object
     */
    private function __clone()
    {
    }
    /**
     * Have a single globally accessible static method
     *
     * @return CourseMaterialService|null
     */
    public static function getInstance()
    {
        if (!is_object(self::$_instance))
            self::$_instance = new self ();
        return self::$_instance;
    }
    /**
     * @param AddCourseMaterialRequest $request
     * @return integer|object|null
     * @throws ProfessionalException
     * @deprecated
     */
    public function addCourseMaterial(AddCourseMaterialRequest $request)
    {
        $request = $this->realEscapeObject($request);
        $documentId = null;
        $request = CommonUtil::convertObjectToUTF8Format($request);
        if (empty($request->staffId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_STAFF_ID, "Invalid staff details given");
        }
        if (empty($request->subjectId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_SUBJECT_ID, "Invalid subject details given");
        }
        if (empty($request->documentTitle)) {
            throw new ProfessionalException(ProfessionalException::INVALID_DOCUMENT_TITLE, "Invalid document title given");
        }
        if (empty($request->documentPath)) {
            throw new ProfessionalException(ProfessionalException::INVALID_DOCUMENT_TITLE, "Invalid document path given");
        }
        $sql = " INSERT INTO course_material ( materialName, materialDocPath, materialPdfPath, materialImgPath, 
                materialSwfPath, staffID, batchID, subjectID,semID) 
                VALUES ('$request->documentTitle','$request->documentPath','$request->documentPath','$request->imagePath',
                        '$request->docSWF','$request->staffId','$request->batchId', '$request->subjectId',
                        (SELECT semID FROM sbs_relation WHERE subjectID='$request->subjectId' AND batchID='$request->batchId
                            AND staffID='$request->staffId'
                            LIMIT 1
                        )
                )";
        try {
            $documentId = $this->executeQueryForObject($sql, true);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $documentId;
    }
    /**
     * Updating course material details
     *
     * @param UpdateCourseMaterialRequest $request
     * @throws ProfessionalException
     * @deprecated
     */
    public function updateCourseMaterial(UpdateCourseMaterialRequest $request)
    {
        $request = $this->realEscapeObject($request);
        $request = CommonUtil::convertObjectToUTF8Format($request);
        if (!preg_match("/[A-Za-z0-9\-\&\_\+\*]+/", $request->title)) {
            throw new ProfessionalException(ProfessionalException::INVALID_TITLE, "Title is invalid or empty");
        }
        if (!preg_match("/[A-Za-z0-9\-\&\_\+\*]+/", $request->topic)) {
            throw new ProfessionalException(ProfessionalException::INVALID_TOPIC, "Topic is invalid or empty");
        }
        $sql = "UPDATE course_material SET materialName ='$request->title',materialTopic='$request->topic',
                materialDesc ='$request->description',shareDoc =$request->isShared 
                WHERE materialID = $request->documentId";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Adding staff documents to the storage
     *
     * @param AddStaffDocumentRequest $request
     * @return Object
     * @throws ProfessionalException
     */
    public function addStaffDocument(AddStaffDocumentRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->staffId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_STAFF_ID, "Invalid staff details given");
        }
        if (empty($request->departmentId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_DEPARTMENT_ID, "Invalid department details given");
        }
        $sql = "INSERT INTO staff_document(docName, docPath, docPDFPath, docImgPath, docSWFPath, staffID, deptID, resourceId) 
                VALUES ('$request->name', '$request->path', '$request->pdfPath', '$request->imagePath', 
                        '$request->docSWF', '$request->staffId', '$request->departmentId', '$request->resourceId');";
        try {
            return $this->executeQueryForObject($sql, true);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Updating course material details
     *
     * @param UpdateStaffDocumentRequest $request
     * @throws ProfessionalException
     */
    public function updateStaffDocuments(UpdateStaffDocumentRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (!preg_match("/[A-Za-z0-9\-\&\_\+\*]+/", $request->title)) {
            throw new ProfessionalException(ProfessionalException::INVALID_TITLE, "Title is invalid or empty");
        }
        if (!preg_match("/[A-Za-z0-9\-\&\_\+\*]+/", $request->topic)) {
            throw new ProfessionalException(ProfessionalException::INVALID_TOPIC, "Subject is invalid or empty");
        }
        $sql = "UPDATE staff_document SET docName ='$request->title',docSubject='$request->topic',
                docDsc ='$request->description',docCatID ='$request->categoryId',
                docSubCatID='$request->subCategoryId'
                WHERE docID = $request->documentId";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @return array|object
     * @throws ProfessionalException
     */
    public function getDocumentCategories()
    {
        $sql = "SELECT catID as id, catName as name 
                FROM doccategory";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $categoryId
     * @return Object
     * @throws ProfessionalException
     */
    public function getDocumentSubCategories($categoryId)
    {
        $categoryId = (int)$this->realEscapeString($categoryId);
        $sql = "SELECT subCatID as id, subCatName as name 
                FROM docsubcategory WHERE catID=$categoryId";
        try {
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param GetStaffDocumentsRequest $request
     * @return Object|array
     * @throws ProfessionalException
     */
    public function getStaffDocuments(GetStaffDocumentsRequest $request)
    {
        $request = $this->realEscapeObject($request);
        $sql = "SELECT sd.docName as name,sd.docSubject as subject, sd.docCatID as categoryId, sd.docSubCatID as subCategoryId, sd.docDsc as description, lr.path, sd.resourceId, lr.backend_type, lr.storage_object FROM staff_document sd INNER JOIN lin_resource lr ON lr.id=sd.resourceId WHERE 1=1";
        if ($request->documentId) {
            $sql .= " AND docID=$request->documentId ";
        }
        if ($request->staffId) {
            $sql .= " AND staffID=$request->staffId";
        }
        try {
            if (!empty($request->documentId)) {
                return $this->executeQueryForObject($sql);
            }
            return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param AddCourseMaterialRequest $request
     * @return Object|integer
     * @throws Exception
     * @throws ProfessionalException
     */
    public function createCourseMaterialService(AddCourseMaterialRequest $request)
    {
        $jsonObject = json_decode($request->storageObject);
        $request = $this->realEscapeObject($request);
        $jsonObject = $this->realEscapeObject($jsonObject);
        if (empty($request->name)) {
            throw new ProfessionalException(ProfessionalException::INVALID_DOCUMENT_NAME, "Invalid document details given");
        }
        if (empty($request->staffId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_STAFF_ID, "Invalid staff details given");
        }
        if (empty($request->batchId) && empty($request->pseudoSubjectId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "invalid request sent");
        }
        $addResourceObject = new AddResourceRequest();
        $addResourceObject->storageObject = json_encode($jsonObject);
        $addResourceObject->backendType = $request->backendType;
        $addResourceObject->context = ResourceContext::COURSE_MATERIALS;
        if ($request->backendType === BackendTypes::S3) {
            $addResourceObject->path = $jsonObject->key;
        } elseif ($request->backendType === BackendTypes::GOOGLE_DRIVE) {
            $addResourceObject->path = $jsonObject->url;
        }
        $addResourceObject->createdBy = $request->createdBy;
        $addResourceObject->updatedBy = $request->updatedBy;
        $this->beginTransaction();
        $resourceId = ResourceService::getInstance()->addResources($addResourceObject);
        if (empty($resourceId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_RESOURCE_ID, "Invalid document details given");
        }
        $request->subjectId = $request->subjectId ? $request->subjectId : "NULL";
        $request->pseudoSubjectId = $request->pseudoSubjectId ? $request->pseudoSubjectId : "NULL";
        $request->batchId = $request->batchId ? $request->batchId : "NULL";
        $request->semesterId = $request->semesterId ? $request->semesterId : "NULL";
        $request->topicId = $request->topicId?$request->topicId:"NULL";
        $id = SecurityUtils::getRandomString();
        $sql = "INSERT INTO course_materials (id, resource_id, name, topic, staff_id, batch_id, semester_id, subject_id, 
                pseudo_subject_id, description,is_shared_document,topic_id,created_by, created_date, updated_by, updated_date) 
                VALUES ('$id','$resourceId','$request->name','$request->topic',
                        $request->staffId,$request->batchId,$request->semesterId,$request->subjectId,
                        $request->pseudoSubjectId,'$request->description',$request->isSharedDocument,
                        $request->topicId,
                        $request->createdBy,UTC_TIMESTAMP(),$request->updatedBy,UTC_TIMESTAMP())";
        try {
            $this->executeQueryForObject($sql);
            $this->commit();
            return $id;
        } catch (\Exception $e) {
            $this->rollback();
            throw new Exception($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param UpdateCourseMaterialRequest $request
     * @throws ProfessionalException
     */
    public function updateCourseMaterialDetails(UpdateCourseMaterialRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->documentId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_DOCUMENT_ID, "Invalid document details given");
        }
        if (empty($request->name)) {
            throw new ProfessionalException(ProfessionalException::INVALID_DOCUMENT_NAME, "Invalid document name given");
        }
        if (empty($request->topic)) {
            throw new ProfessionalException(ProfessionalException::INVALID_TOPIC, "Invalid document topic given");
        }
        $sql = "UPDATE course_materials 
                SET name = '$request->name',topic = '$request->topic',description ='$request->description',
                is_shared_document = $request->isShared,updated_date = UTC_TIMESTAMP(),updated_by = $request->updatedBy
                WHERE id ='$request->documentId'";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param GetAllCourseMaterialsRequest $request
     * @return GetAllCourseMaterialResponse
     * @throws ProfessionalException
     */
    public function getAllCourseMaterials(GetAllCourseMaterialsRequest $request)
    {
        $request = $this->realEscapeObject($request);
        $response = new GetAllCourseMaterialResponse();
        $limitQuery = "";
        $conditionQuery = "";
        $limitConditionQuery = "";
        if (!empty($request->staffId)) {
            $conditionQuery .= " AND cm.staff_id =$request->staffId ";
            $limitConditionQuery .= " AND staff_id =$request->staffId ";
        }
        if (!empty($request->batchId)) {
            $conditionQuery .= " AND cm.batch_id =$request->batchId ";
            $limitConditionQuery .= " AND batch_id =$request->batchId ";
        }
        if (!empty($request->semesterId)) {
            $conditionQuery .= " AND cm.semester_id =$request->semesterId ";
            $limitConditionQuery .= " AND semester_id =$request->semesterId ";
        }
        if (!empty($request->subjectId)) {
            $conditionQuery .= " AND cm.subject_id =$request->subjectId ";
            $limitConditionQuery .= " AND subject_id =$request->subjectId ";
        }
        if (!empty($request->pseudoSubjectId)) {
            $conditionQuery .= " AND cm.pseudo_subject_id =$request->pseudoSubjectId ";
            $limitConditionQuery .= " AND pseudo_subject_id =$request->pseudoSubjectId ";
        }
        if (!$request->showPrivateDocuments) {
            $conditionQuery .= " AND cm.is_private = 0 ";
            $limitConditionQuery .= " AND is_private = 0 ";
        }
        if ($request->showSharedDocumentsOnly) {
            $conditionQuery .= " AND cm.is_shared_document=1 ";
            $limitConditionQuery .= " AND is_shared_document=1 ";
        }
        if (!empty($request->excludedSubjectId)) {
            $conditionQuery .= " AND cm.subject_id!=$request->excludedSubjectId ";
            $limitConditionQuery .= " AND subject_id!=$request->excludedSubjectId ";
        }
        if (!empty($request->excludedBatchId)) {
            $conditionQuery .= " AND cm.batch_id !=$request->excludedBatchId ";
            $limitConditionQuery .= " AND batch_id !=$request->excludedBatchId ";
        }
        if (!empty($request->excludedSemesterId)) {
            $conditionQuery .= " AND cm.semester_id !=$request->excludedSemesterId ";
            $limitConditionQuery .= " AND semester_id !=$request->excludedSemesterId ";
        }
        if (!empty($request->excludedStaffId)) {
            $conditionQuery .= " AND cm.staff_id !=$request->excludedStaffId ";
            $limitConditionQuery .= " AND staff_id !=$request->excludedStaffId ";
        }
        if (!empty($request->pseudoSubjectIds)) {
            $conditionQuery .= " AND cm.pseudo_subject_id IN (" . implode(",", $request->pseudoSubjectIds) . ")";
            $limitConditionQuery .= " AND pseudo_subject_id IN (" . implode(",", $request->pseudoSubjectIds) . ")";
        }
        if ($request->toDate && $request->fromDate == "") {
            $conditionQuery .= " AND DATE(cm.created_date) <= '".$request->toDate."' ";
            $limitConditionQuery .= " AND created_date <= '".$request->toDate."' ";
        }
        if ($request->toDate == "" && $request->fromDate) {
            $conditionQuery .= " AND DATE(cm.created_date) >= '".$request->fromDate."' ";
            $limitConditionQuery .= " AND created_date >= '".$request->fromDate."' ";
        }
        if ($request->toDate && $request->toDate) {
            $conditionQuery .= " AND DATE(cm.created_date) between '".$request->fromDate."' AND '".$request->toDate."' ";
            $limitConditionQuery .= " AND created_date between '".$request->fromDate."' AND '".$request->toDate."' ";
        }
        if ($request->addPagination) {
            $limitQuery = " INNER JOIN (SELECT id FROM course_materials WHERE is_active=1 $limitConditionQuery 
                            ORDER BY updated_date DESC LIMIT $request->startIndex,$request->endIndex ) 
                            AS temp ON temp.id = cm.id ";
        }
        $request->orderType = strtolower($request->orderType) === 'asc' ? 'ASC' : 'DESC';
        $sql = "SELECT cm.id,cm.name,cm.topic,cm.description,cm.is_shared_document,cm.is_private,
                DATE_FORMAT(CONVERT_TZ(cm.created_date,'+00:00',@@global.time_zone),'%d-%m-%Y %h:%i:%s %p') as created_date,
                lr.id as resource_id,lr.context,lr.backend_type,lr.storage_object,lr.path,
                sa.staffID as staff_id,sa.staffName as staff_name,    
                b.batchID as batch_id,b.batchName as batch_name,
                s.semID as semester_id,s.semName as semester_name,cm.visitors,
                su.subjectID as subject_id,su.subjectName as subject_name,su.subjectDesc as subject_description,
                ps.pseudosubjectID as pseudo_subject_id,ps.subjectName as pseudo_subject_name
                FROM course_materials cm
                INNER JOIN lin_resource lr on cm.resource_id = lr.id
                INNER JOIN staffaccounts sa ON sa.staffID = cm.staff_id
                LEFT JOIN batches b on cm.batch_id = b.batchID
                LEFT JOIN semesters s on cm.semester_id = s.semID   
                LEFT JOIN subjects su ON su.subjectID = cm.subject_id
                LEFT JOIN pseudosubjects ps ON ps.pseudosubjectID = cm.pseudo_subject_id
                WHERE cm.is_active=1 $conditionQuery ORDER BY cm.updated_date $request->orderType ";
        $totalSql = "SELECT COUNT(id) as totalRecords FROM course_materials WHERE is_active=1 $limitConditionQuery";
        try {
            $response->documents = $this->executeQueryForList($sql, $this->mapper[CourseMaterialServiceMapper::GET_ALL_COURSE_MATERIALS]);
            $response->totalRecords = $this->executeQueryForObject($totalSql)->totalRecords;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $response;
    }
    /**
     * @param string $documentId
     * @return mixed|string
     * @throws ProfessionalException
     */
    public function getResourceIdByDocumentId($documentId)
    {
        $sql = "SELECT resource_id as id FROM course_materials WHERE id ='$documentId'";
        try {
            return $this->executeQueryForObject($sql)->id;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Deleting course material
     *
     * @param DeleteCourseMaterialRequest $request
     * @throws ProfessionalException
     */
    public function deleteCourseMaterial(DeleteCourseMaterialRequest $request)
    {
        $request = $this->realEscapeObject($request);
        $sql = "DELETE FROM course_materials WHERE id ='$request->documentId'";
        try {
            $resourceId = $this->getResourceIdByDocumentId($request->documentId);
            if (empty($request->documentId)) {
                throw new ProfessionalException(ProfessionalException::INVALID_DOCUMENT_ID, "Invalid course material details given");
            }
            if (empty($request->staffId)) {
                throw new ProfessionalException(ProfessionalException::INVALID_STAFF_ID, "Invalid staff details given");
            }
            $removeRequest = new RemoveResourceRequest();
            $removeRequest->resourceId = $resourceId;
            $removeRequest->accessKey = getenv('AWS_ACCESS_KEY');
            $removeRequest->secretKey = getenv('AWS_CLIENT_SECRET_KEY');
            $this->beginTransaction();
            SubjectPlanService::getInstance()->deleteCourseMaterialFromActualPlanByMaterialId($request->documentId);
            SubjectPlanService::getInstance()->deleteCourseMaterialFromProposesPlanMaterialId($request->documentId);
            PseudoSubjectPlanService::getInstance()->deletePseudoSubjectActualPlanCourseMaterialsByMaterialId($request->documentId);
            PseudoSubjectPlanService::getInstance()->deletePseudoSubjectProposedPlanCourseMaterialsByMaterialId($request->documentId);
            $this->deleteCourseMaterialComments($request->documentId);
            $this->deleteCourseMaterialLikes($request->documentId);
            $this->deleteCourseMaterialRatings($request->documentId);
            $this->executeQuery($sql);
            if (!$this->checkResourceHasCopied($resourceId)) {
                ResourceService::getInstance()->removeResource($removeRequest);
            }
            $this->commit();
        } catch (\Exception $e) {
            $this->rollback();
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Checking if the resource has been copied
     *
     * @param $resourceId
     * @return bool
     * @throws ProfessionalException
     */
    private function checkResourceHasCopied($resourceId)
    {
        $sql = "SELECT COUNT(id) as totalRecords 
                FROM course_materials 
                WHERE resource_id ='$resourceId'";
        try {
            $count = $this->executeQueryForObject($sql)->totalRecords;
            return !empty($count);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Making document private or not
     * @param LockOrUnlockDocumentRequest $request
     * @throws ProfessionalException
     */
    public function lockOrUnlockDocument(LockOrUnlockDocumentRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->documentId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_DOCUMENT_ID, "Invalid document details given");
        }
        $sql = "UPDATE course_materials SET is_private=$request->isLocked, updated_by = $request->updatedBy,
                updated_date = UTC_TIMESTAMP() WHERE id = '$request->documentId'";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $documentId
     * @throws ProfessionalException
     */
    private function deleteCourseMaterialLikes($documentId)
    {
        $sql = "DELETE FROM course_material_likes WHERE course_material_id = '$documentId'";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getMessage(), $e->getCode());
        }
    }
    /**
     * @param $documentId
     * @throws ProfessionalException
     */
    private function deleteCourseMaterialComments($documentId)
    {
        $sql = "DELETE FROM course_material_comments WHERE course_material_id = '$documentId'";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getMessage(), $e->getCode());
        }
    }
    /**
     * @param $documentId
     * @throws ProfessionalException
     */
    private function deleteCourseMaterialRatings($documentId)
    {
        $sql = "DELETE FROM course_material_ratings WHERE course_material_id = '$documentId'";
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getMessage(), $e->getCode());
        }
    }
    /**
     * @param GetCourseMaterialDetailsRequest $request
     * @return CourseMaterial|object
     * @throws ProfessionalException
     */
    public function getCourseMaterialDetails(GetCourseMaterialDetailsRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->documentId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_DOCUMENT_ID, "Invalid document details given");
        }
        $conditionQuery = "";
        if (!empty($request->staffId) && !$request->showSharedDocuments) {
            $conditionQuery .= " AND cm.staff_id =$request->staffId ";
        }
        if (!empty($request->batchId)) {
            $conditionQuery .= " AND cm.batch_id =$request->batchId ";
        }
        if (!empty($request->semesterId)) {
            $conditionQuery .= " AND cm.semester_id =$request->semesterId ";
        }
        if (!empty($request->subjectId)) {
            $conditionQuery .= " AND cm.subject_id =$request->subjectId ";
        }
        if (!empty($request->pseudoSubjectId)) {
            $conditionQuery .= " AND cm.pseudo_subject_id =$request->pseudoSubjectId ";
        }
        if (!$request->showPrivateDocuments) {
            $conditionQuery .= " AND cm.is_private = 0";
        }
        if ($request->showSharedDocuments) {
            $conditionQuery .= " AND (cm.is_shared_document=1 OR cm.staff_id =$request->staffId";
        }
        $sql = "SELECT cm.id,cm.name,cm.topic,cm.description,cm.is_shared_document,
                DATE_FORMAT(CONVERT_TZ(cm.created_date,'+00:00',@@global.time_zone),'%d-%m-%Y %h:%i:%s %p') as created_date,
                lr.id as resource_id,lr.context,lr.backend_type,lr.storage_object,
                sa.staffID as staff_id,sa.staffName as staff_name,    
                b.batchID as batch_id,b.batchName as batch_name,
                s.semID as semester_id,s.semName as semester_name,
                su.subjectID as subject_id,su.subjectName as subject_name,su.subjectDesc as subject_description,
                ps.pseudosubjectID as pseudo_subject_id,ps.subjectName as pseudo_subject_name,
                cmr.rating,cml.total_likes,cmc.total_comments,cmr.number_of_ratings,
                IF(cml2.id,true,false) as is_liked
                FROM course_materials cm
                INNER JOIN lin_resource lr on cm.resource_id = lr.id
                INNER JOIN staffaccounts sa ON sa.staffID = cm.staff_id
                LEFT JOIN batches b on cm.batch_id = b.batchID
                LEFT JOIN semesters s on cm.semester_id = s.semID   
                LEFT JOIN subjects su ON su.subjectID = cm.subject_id
                LEFT JOIN pseudosubjects ps ON ps.pseudosubjectID = cm.pseudo_subject_id
                LEFT JOIN (
                    SELECT AVG(rate) as rating,COUNT(id) as number_of_ratings,course_material_id 
                    FROM course_material_ratings 
                    WHERE course_material_id='$request->documentId'
                ) as cmr ON cmr.course_material_id = cm.id
                LEFT JOIN (
                    SELECT COUNT(id) as total_likes,course_material_id 
                    FROM course_material_likes 
                    WHERE course_material_id ='$request->documentId'
                ) as cml ON cml.course_material_id = cm.id
                LEFT JOIN (
                    SELECT COUNT(id) as total_comments,course_material_id 
                    FROM course_material_comments 
                    WHERE course_material_id ='$request->documentId' AND is_active=1 
                ) as cmc on cm.id = cmc.course_material_id
                LEFT JOIN course_material_likes cml2  ON cm.id = cml2.course_material_id 
                AND cml2.user_id = $request->userId AND cml2.user_type ='$request->userType'
                LEFT JOIN course_material_ratings cmr2  ON cm.id = cmr2.course_material_id
                AND cmr2.user_id = $request->userId AND cmr2.user_type ='$request->userType'
                WHERE cm.id = '$request->documentId' AND cm.is_active=1 $conditionQuery 
                ORDER BY cm.updated_date DESC ";
        try {
            $document = $this->executeQueryForObject($sql, false, $this->mapper[CourseMaterialServiceMapper::GET_ALL_COURSE_MATERIALS]);
            if ($document) {
                $getUrlRequest = new GetPreSignedUrlRequest();
                $getUrlRequest->secretKey = getenv('AWS_CLIENT_SECRET_KEY');
                $getUrlRequest->accessKey = getenv('AWS_ACCESS_KEY');
                $getUrlRequest->resourceId = $document->resource->id;
                $url = ResourceService::getInstance()->getPreSignedUrlByResourceId($getUrlRequest);
                $document->resource->url = $url->url;
            }
            return $document;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param GetCourseMaterialDetailsRequest $request
     * @return Object
     * @throws ProfessionalException
     */
    public function getCourseMaterialComments(GetCourseMaterialDetailsRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->documentId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_DOCUMENT_ID, "Invalid document details given");
        }
        $conditionQuery = "";
        if (!empty($request->staffId)) {
            $conditionQuery .= " AND cm.staff_id =$request->staffId ";
        }
        if (!empty($request->batchId)) {
            $conditionQuery .= " AND cm.batch_id =$request->batchId ";
        }
        if (!empty($request->semesterId)) {
            $conditionQuery .= " AND cm.semester_id =$request->semesterId ";
        }
        if (!empty($request->subjectId)) {
            $conditionQuery .= " AND cm.subject_id =$request->subjectId ";
        }
        if (!empty($request->pseudoSubjectId)) {
            $conditionQuery .= " AND cm.pseudo_subject_id =$request->pseudoSubjectId ";
        }
        if (!$request->showPrivateDocuments) {
            $conditionQuery .= " AND cm.is_private = 0";
        }
        if (!empty($request->commentId)) {
            $conditionQuery .= " AND cmc.id = $request->commentId ";
        }
        $staffUser = UserType::STAFF;
        $studentUser = UserType::STUDENT;
        $response = [];
        $sql = "SELECT cmc.id,cmc.comment,
                IF(sa.staffID,sa.staffName,st.studentName) as userName,
                IF(sa.staffID,'STAFF','STUDENT') as userType,
                IF(sa.staffID,sa.staffID,st.studentID) as userId,    
                IF(sa.staffID,sa.myImage,st.myImage) as userImage,    
                DATE_FORMAT(CONVERT_TZ(cmc.created_date,'+00:00',@@global.time_zone),'%d-%m-%Y %h:%i:%s %p')
                AS commentedTime,
                IF(cmc.user_id=$request->userId AND cmc.user_type='$request->userType',true,false) as isDeletable,
                sa.staffID
                FROM course_materials cm 
                INNER JOIN course_material_comments cmc on cm.id = cmc.course_material_id
                LEFT JOIN staffaccounts sa ON sa.staffID = cmc.user_id AND cmc.user_type ='$staffUser
                LEFT JOIN studentaccount st ON st.studentID = cmc.user_id AND cmc.user_type ='$studentUser
                WHERE cmc.is_active=1 AND cm.id ='$request->documentId$conditionQuery
                ORDER BY cmc.updated_date DESC ";
        try {
            $results = $this->executeQueryForList($sql);
            foreach ($results as $result) {
                if($result->staffID)
                {
                    $profilePicture = StaffService::getInstance()->getStaffProfilePic($result->staffID);
                    $imagePath = $profilePicture->docpath;
                    $result->userImage = $imagePath;
                }
                $response[] = $result;
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return $response;
    }
    /**
     * Posting comments
     *
     * @param PostCommentRequest $request
     * @return Object
     * @throws ProfessionalException
     */
    public function postComment(PostCommentRequest $request)
    {
        $comment = null;
        $sql = "INSERT INTO course_material_comments (course_material_id, user_id, user_type, comment, created_by, 
                created_date, updated_by, updated_date) 
                VALUES ('$request->documentId',$request->userId,'$request->userType','$request->comment',$request->createdBy,
                        UTC_TIMESTAMP(),$request->updatedBy,UTC_TIMESTAMP())";
        try {
            $commentId = $this->executeQueryForObject($sql, true);
            $getComment = new GetCourseMaterialDetailsRequest();
            $getComment->documentId = $request->documentId;
            $getComment->userType = $request->userType;
            $getComment->userId = $request->userId;
            $getComment->commentId = $commentId;
            return $this->getCourseMaterialComments($getComment)[0];
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * Soft deleting comments
     *
     * @param DeleteCommentRequest $request
     * @throws ProfessionalException
     */
    public function deleteComment(DeleteCommentRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->commentId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_COMMENT_ID, "Invalid comment details given");
        }
        if (empty($request->documentId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_DOCUMENT_ID, "Invalid document details given");
        }
        if (empty($request->userId) && empty($request->userType)) {
            throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Invalid request sent");
        }
        $sql = "UPDATE course_material_comments SET is_active=0,updated_date=UTC_TIMESTAMP(),updated_by = $request->updatedBy
                WHERE course_material_id='$request->documentId' AND id = $request->commentId ";
        /**
         * Checking anyone can delete anyone's comments.
         * Default false
         */
        if (!$request->userHasPermissionToDeleteComment) {
            $sql .= " AND user_id =$request->userId AND user_type ='$request->userType'";
        }
        try {
            $this->executeQuery($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param CheckUserCourseMaterialPermission $request
     * @return integer
     * @throws ProfessionalException
     */
    public function userHasPermissionToViewThisDocument(CheckUserCourseMaterialPermission $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->userType) || empty($request->documentId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Invalid request sent");
        }
        $conditionQuery = "";
        if ($request->userType === UserType::STUDENT) {
            if (empty($request->staffId) || ((empty($request->batchId) || empty($request->subjectId)) && empty($request->pseudoSubjectId))) {
                throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Invalid request sent");
            }
        } elseif ($request->userType === UserType::STAFF) {
            if (empty($request->semesterId) ||
                empty($request->staffId) ||
                empty($request->batchId) ||
                (empty($request->subjectId) && empty($request->pseudoSubjectId))) {
                throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Invalid request sent");
            }
            $conditionQuery .= " AND is_private = 0";
        } else {
            throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Invalid request sent");
        }
        if (!empty($request->staffId)) {
            $conditionQuery .= " AND staff_id =$request->staffId ";
        }
        if (!empty($request->batchId)) {
            $conditionQuery .= " AND batch_id =$request->batchId ";
        }
        if (!empty($request->semesterId)) {
            $conditionQuery .= " AND semester_id =$request->semesterId ";
        }
        if (!empty($request->subjectId)) {
            $conditionQuery .= " AND subject_id =$request->subjectId ";
        }
        if (!empty($request->pseudoSubjectId)) {
            $conditionQuery .= " AND pseudo_subject_id =$request->pseudoSubjectId ";
        }
        $sql = "SELECT id FROM course_materials WHERE is_active=1 $conditionQuery";
        try {
            return $this->executeQueryForObject($sql)->id;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param MarkUnMarkUserLikeRequest $request
     * @return Object|integer
     * @throws ProfessionalException
     */
    public function markOrUnmarkUserLike(MarkUnMarkUserLikeRequest $request)
    {
        if (empty($request->documentId) || empty($request->userType) || empty($request->userId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_REQUEST, "Invalid request sent");
        }
        try {
            if ($request->isLiked) {
                $sql = "INSERT INTO course_material_likes (course_material_id, user_id, user_type, created_by, created_date) 
                        VALUES ('$request->documentId',$request->userId,'$request->userType',$request->createdBy,UTC_TIMESTAMP())";
                return $this->executeQueryForObject($sql, true);
            } else {
                $sql = "DELETE FROM course_material_likes WHERE course_material_id = '$request->documentId
                        AND user_type ='$request->userType' AND user_id =$request->userId";
                $this->executeQuery($sql);
            }
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
        return null;
    }
    /**
     * @param CopyCourseMaterialRequest $request
     * @return String
     * @throws ProfessionalException
     */
    public function copyCourseMaterials(CopyCourseMaterialRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->pseudoSubjectId)) {
            if (empty($request->semesterId)) {
                throw new ProfessionalException(ProfessionalException::INVALID_SEMESTER_ID, "Invalid semester details given");
            }
            if (empty($request->batchId)) {
                throw new ProfessionalException(ProfessionalException::INVALID_BATCH_ID, "Invalid batch details given");
            }
        }
        if (empty($request->staffId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_STAFF_ID, "Invalid staff details given");
        }
        if (empty($request->documentId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_DOCUMENT_ID, "No document selected for copying");
        }
        if (empty($request->subjectId) && empty($request->pseudoSubjectId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_SUBJECT_ID, "Invalid subject details given");
        }
        $request->subjectId = $request->subjectId ? $request->subjectId : "NULL";
        $request->pseudoSubjectId = $request->pseudoSubjectId ? $request->pseudoSubjectId : "NULL";
        $request->batchId = $request->batchId ? $request->batchId : "NULL";
        $request->semesterId = $request->semesterId ? $request->semesterId : "NULL";
        try {
            $newId = SecurityUtils::getRandomString();
            $sql = "INSERT INTO course_materials (id, resource_id, name, topic, staff_id, batch_id, semester_id, subject_id, 
                    pseudo_subject_id, description, created_by, created_date, updated_by, updated_date) 
                    SELECT '$newId',resource_id,name,topic,$request->staffId,$request->batchId,$request->semesterId,
                    $request->subjectId$request->pseudoSubjectId,description,staff_id,UTC_TIMESTAMP(),
                    $request->staffId,UTC_TIMESTAMP() 
                    FROM course_materials WHERE id ='$request->documentId'";
            $this->executeQueryForObject($sql);
            return $newId;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param $documentId
     * @return bool
     * @throws ProfessionalException
     */
    public function isDocumentShared($documentId)
    {
        $sql = "SELECT id FROM course_materials 
                WHERE is_shared_document=1 AND is_active=1 AND id= '$documentId'";
        try {
            return $this->executeQueryForObject($sql)->id ? true : false;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    /**
     * @param GetCourseMaterialRequest $request
     * @return array|object
     * @throws ProfessionalException
     */
    public function getCourseMaterialsBySbsId(GetCourseMaterialRequest $request)
    {
        $request = $this->realEscapeObject($request);
        if (empty($request->sbsId)) {
            throw new ProfessionalException(ProfessionalException::INVALID_SBS_ID, "Invalid request sent");
        }
        if (empty($request->accessKey) || empty($request->secretKey)) {
            throw new ProfessionalException(ProfessionalException::INVALID_AWS_KEYS, "Invalid request sent");
        }
        $sql = "SELECT t1.name, t1.resource_id as resourceId, 
                        DATE_FORMAT(CONVERT_TZ(t1.created_date,'+00:00',@@global.time_zone),'%d-%m-%Y %h:%i:%s %p') as createdDate,
                        CONVERT(t1.description USING utf8) as description,
                        CONVERT(t1.topic USING utf8) as topic,t1.visitors
                        FROM course_materials t1
                        INNER JOIN sbs_relation t2 ON t1.staff_id = t2.staffID AND t1.batch_id = t2.batchID 
                        AND t1.subject_id = t2.subjectID AND t1.semester_id = t2.semID  
                        WHERE  t2.sbsID= " . $request->sbsId;
        try {
            $courseMaterials = $this->executeQueryForList($sql);
            if ($request->generateUrl) {
                foreach ($courseMaterials as $courseMaterial) {
                    $getRequest = new GetPreSignedUrlRequest();
                    $getRequest->resourceId = $courseMaterial->resourceId;
                    $getRequest->secretKey = $request->secretKey;
                    $getRequest->accessKey = $request->accessKey;
                    try {
                        $url = ResourceService::getInstance()->getPreSignedUrlByResourceId($getRequest);
                    } catch (\Throwable $th) {
                        $url = new \stdClass();
                        $url->url = "";
                    }
                    $courseMaterial->url = $url->url;
                }
            }
            return $courseMaterials;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getCourseMaterialById($id)
    {
        $id = $this->realEscapeObject($id);
        $sql = "SELECT t1.name, t1.resource_id as resourceId,
                        DATE_FORMAT(CONVERT_TZ(t1.created_date,'+00:00',@@global.time_zone),'%d-%m-%Y %h:%i:%s %p') as createdDate,
                        t1.description, t1.topic, sa.staffName, sa.staffID
                        FROM course_materials t1
                        INNER JOIN sbs_relation t2 ON t1.staff_id = t2.staffID AND t1.batch_id = t2.batchID
                        AND t1.subject_id = t2.subjectID AND t1.semester_id = t2.semID
                        INNER JOIN staffaccounts sa ON sa.staffID=t1.staff_id
                        WHERE  t1.id= '$id'";
        try {
            $courseMaterials = $this->executeQueryForObject($sql);
            return $courseMaterials;
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    
    public function getVideoContentByVideoId($videoId)
    {
        $videoId = $this->realEscapeObject($videoId);
        $sql = "SELECT * FROM batch_video_repository where id='$videoId'";
        try {
             return $this->executeQueryForObject($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getVideoMaterialsBySbsId($request)
    {
        $request = $this->realEscapeObject($request);
        $where = [];
        $request->sbsId?$where []= " sbs.sbsID = $request->sbsId ":"";
        $request->staffId?$where []= " sbs.staffID = $request->staffId ":"";
        $request = $this->realEscapeObject($request);
        $sql = "select bvr.id,bvr.title,bvr.url,bvr.description,bvr.keywords,bvr.thumbnail,bvr.batchID,bat.batchName,null as createdDate,null as resourceId
        from sbs_relation sbs
        inner join batch_video_repository bvr on bvr.batchID = sbs.batchID and bvr.staffID = sbs.staffID
        inner join batches bat on bat.batchID = sbs.batchID
        ".($where?" WHERE ".implode(' AND ',$where):"")."
        group by bvr.id;";
        try {
            return empty($where)?[]:$this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
    public function getUploadedCourseMaterialByTopicId($topicId,$psId)
    {
        $topicId = $this->realEscapeString($topicId);
        $psId = $this->realEscapeString($psId);
        $psCond = $psId?" AND pseudo_subject_id = $psId":" AND pseudo_subject_id IS NULL ";
        $sql = "SELECT id as courseMatId, name, topic, topic_id as topicId
                from course_materials where topic_id = $topicId $psCond";
        try {
             return $this->executeQueryForList($sql);
        } catch (\Exception $e) {
            throw new ProfessionalException($e->getCode(), $e->getMessage());
        }
    }
}