<?php
namespace EADPlataforma\Controller\Admin;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use EADPlataforma\Entity\CourseTeam;
use EADPlataforma\Entity\Course;
use EADPlataforma\Entity\LessonModule;
use EADPlataforma\Entity\Lesson;
use EADPlataforma\Entity\User;
use EADPlataforma\Enum\CourseTeamEnum;
use EADPlataforma\Enum\ErrorEnum;
/**
* @Route(
* path = "/admin/course/team",
* schemes = {"http|https"}
* )
* @Cache(
* maxage = "0",
* smaxage = "0",
* expires = "now",
* public = false
* )
*/
class CourseTeamController extends AbstractController {
public function getEntityClass(){
return CourseTeam::class;
}
/**
* @Route(
* path = "/list/paginate",
* methods = {"GET"}
* )
*/
public function getCourseTeamPaginate(Request $request) {
$permission = $this->userPermissionUtil->getPermission("course", "course_team", "see");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$columns = [
"ct.id",
"ct.type",
"u.id AS userId",
"u.name",
"DATE_FORMAT(ct.dateDelete, '%Y-%m-%d %H:%i:%s') AS dateDelete",
"ud.name AS userDelete"
];
$userClass = User::class;
$joins = [
"{$userClass} AS u" => "u.id = ct.user AND u.deleted = 0",
"{$userClass} AS ud" => ["LEFT", "ud.id = ct.userDelete"]
];
$courseId = $this->requestUtil->getField('course');
$orderParam = $this->requestUtil->getField('order');
$searchText = $this->requestUtil->getField('searchText');
$limit = $this->requestUtil->getField('limit');
$offset = $this->requestUtil->getField('offset');
$filter = [];
$filterDelete = $this->requestUtil->getDeletedParam();
$filter = [
"ct.course" => $courseId,
];
if($this->userPermissionUtil->isMiddle($permission)){
$course = $this->em->getRepository(Course::class)->findOneBy([
"id" => $courseId,
"deleted" => CourseTeamEnum::ITEM_NO_DELETED
]);
if($course){
$isInTeam = $this->repository->userExistInCourseTeam($course, $this->user);
$filter[CourseTeamEnum::YES] = (
$isInTeam ? CourseTeamEnum::YES : CourseTeamEnum::No
);
}
}
$order = ["ct.id" => "ASC"];
if(!empty($orderParam)){
$order = json_decode($orderParam, true);
}
$data = $this->repository->paginate(
"ct",
$searchText,
$columns,
$joins,
$filter,
$order,
$limit,
$offset,
$filterDelete
);
$lessonRepository = $this->em->getRepository(Lesson::class);
$lessonModuleRepository = $this->em->getRepository(LessonModule::class);
foreach ($data['rows'] as $key => $item) {
$item = (object)$item;
$item->lessonNumber = $lessonRepository->count([
"deleted" => CourseTeamEnum::ITEM_NO_DELETED,
"user" => $item->userId,
"course" => $courseId,
]);
$item->lessonModuleNumber = $lessonModuleRepository->count([
"deleted" => CourseTeamEnum::ITEM_NO_DELETED,
"user" => $item->userId,
"course" => $courseId,
]);
$data['rows'][$key] = $item;
}
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/list/all/{type}/{id}",
* methods = {"GET"},
* requirements = { "type": "\d+", "id": "\d+"}
* )
*/
public function getCourseTeamAll(Request $request) {
$courseId = $request->get('id');
$type = $request->get('type');
$types = [ CourseTeamEnum::TEACHER, CourseTeamEnum::TUTOR ];
if(!in_array($type, $types)){
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$courseTeams = $this->repository->findBy([
"course" => $courseId,
"type" => $type,
"deleted" => CourseTeamEnum::ITEM_NO_DELETED
]);
$data = [];
foreach ($courseTeams as $key => $courseTeam) {
$data[] = $courseTeam->toReturn();
}
return $this->eadResponse($data);
}
/**
* @Route(
* path = "/detail/{id}",
* methods = {"GET"},
* requirements = {"id": "\d+"}
* )
*/
public function getCourseTeam(Request $request) {
$permission = $this->userPermissionUtil->getPermission("course", "course_team", "see");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$courseTeamId = $request->get('id');
$courseTeam = $this->repository->findOneBy([
"id" => $courseTeamId,
"deleted" => CourseTeamEnum::ITEM_NO_DELETED
]);
if(!$courseTeam){
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$isInTeam = $this->repository->userExistInCourseTeam($courseTeam->getCourse(), $this->user);
if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
return $this->eadResponse($courseTeam->toReturn());
}
/**
* @Route(
* path = "/register",
* methods = {"POST"},
* )
*/
public function registerCourseTeam(Request $request) {
$permission = $this->userPermissionUtil->getPermission("course", "course_team", "create");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$courseTeam = new CourseTeam();
if($this->requestUtil->issetField('type')){
$courseTeam->setType((int)$this->requestUtil->getField('type'));
}
if($this->requestUtil->issetField('user')){
$userId = (int)$this->requestUtil->getField('user');
if($userId > 0){
$user = $this->em->getRepository(User::class)->findOneBy([
"id" => $userId,
"deleted" => CourseTeamEnum::ITEM_NO_DELETED
]);
if($user){
$courseTeam->setUser($user);
}
}
}
if($this->requestUtil->issetField('course')){
$courseId = (int)$this->requestUtil->getField('course');
if($courseId > 0){
$course = $this->em->getRepository(Course::class)->findOneBy([
"id" => $courseId,
"deleted" => CourseTeamEnum::ITEM_NO_DELETED
]);
if($course){
$courseTeam->setCourse($course);
}
}
}
if($course){
$isInTeam = $this->repository->userExistInCourseTeam($course, $this->user);
if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
}
$courseTeamSave = $this->repository->findOneBy([
"course" => $courseId,
"user" => $userId,
"deleted" => CourseTeamEnum::ITEM_NO_DELETED
]);
if ($courseTeamSave) {
return $this->eadResponse([ "message" => "User already in Course" ], ErrorEnum::ACTION_INVALID);
}
$errors = $this->validateEntity($courseTeam);
if($errors){
return $this->eadResponse($errors, ErrorEnum::FIELD_EMPTY);
}
$this->em->persist($courseTeam);
$this->em->flush();
$return = $courseTeam->toReturn();
$this->userLogService->logInsert("course_team", $courseTeam->getId(), $return);
return $this->eadResponse($return);
}
/**
* @Route(
* path = "/edit/{id}",
* methods = {"PUT"},
* requirements = { "id" = "\d+" }
* )
*/
public function editCourseTeam(Request $request) {
$permission = $this->userPermissionUtil->getPermission("course", "course_team", "edit");
if($this->userPermissionUtil->isLow($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$this->requestUtil->setRequest($request)->setData();
$courseTeamId = $request->get('id');
$courseTeam = $this->repository->findOneBy([
"id" => $courseTeamId,
"deleted" => CourseTeamEnum::ITEM_NO_DELETED
]);
if (!$courseTeam) {
return $this->eadResponse(null, ErrorEnum::NOT_FOUND);
}
$isInTeam = $this->repository->userExistInCourseTeam($courseTeam->getCourse(), $this->user);
if(!$isInTeam && $this->userPermissionUtil->isMiddle($permission)){
return $this->eadResponse(null, ErrorEnum::PERMISSION);
}
$type = $this->requestUtil->getField('type');
$courseTeam->setType($type);
$errors = $this->validateEntity($courseTeam);
if($errors){
return $this->eadResponse($errors, ErrorEnum::FIELD_EMPTY);
}
$this->em->flush();
$return = $courseTeam->toReturn();
$this->userLogService->logUpdate("course_team", $courseTeam->getId(), $return);
return $this->eadResponse($return);
}
}