Add resource rest api controller

pull/3215/head
Julio Montoya 5 years ago
parent 011926f62b
commit 7100fff4c4
  1. 28
      config/packages/fos_rest.yaml
  2. 5
      config/routes.yaml
  3. 22
      src/CoreBundle/Controller/ResourceApiController.php
  4. 2
      src/CoreBundle/Entity/Course.php
  5. 3
      src/CoreBundle/Entity/Resource/AbstractResource.php
  6. 196
      src/CoreBundle/Entity/Resource/ResourceComment.php
  7. 2
      src/CoreBundle/Entity/Resource/ResourceFile.php
  8. 47
      src/CoreBundle/Entity/Resource/ResourceNode.php
  9. 5
      src/CourseBundle/Entity/CDocument.php
  10. 7
      src/UserBundle/Entity/User.php

@ -1,12 +1,18 @@
fos_rest:
param_fetcher_listener: true
body_listener: true
format_listener: true
view:
view_response_listener: force
body_converter:
enabled: false
validate: true
# exception:
# enabled: true
# exception_controller: 'Chamilo\ThemeBundle\Controller\ExceptionController::showAction'
routing_loader:
default_format: json
param_fetcher_listener: true
format_listener:
rules:
- { path: '^/api', priorities:['json'], fallback_format: json, prefer_extension: false }
- { path: '^/', priorities: [ 'html', '*/*'], fallback_format: ~, prefer_extension: true }
view:
view_response_listener: true
# formats:
# json: true
# body_listener: true
# body_converter:
# enabled: true
# validate: true
# validation_errors_argument: validationErrors

@ -22,6 +22,11 @@ oneup_uploader:
resource: .
type: uploader
resources:
type: rest
prefix: /api/
resource: Chamilo\CoreBundle\Controller\ResourceApiController
# Resources
#app_document:

@ -17,16 +17,14 @@ use Doctrine\ORM\QueryBuilder;
use FOS\RestBundle\Controller\AbstractFOSRestController;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\Annotations\RouteResource;
use FOS\RestBundle\View\View;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* Class ResourceApiController.
*
* @RouteResource("Resource2")
* @RouteResource("resources/{tool}/{type}/{id}")
*/
class ResourceApiController extends AbstractFOSRestController implements CourseControllerInterface
{
@ -55,8 +53,6 @@ class ResourceApiController extends AbstractFOSRestController implements CourseC
$repository = $this->getRepositoryFromRequest($request);
$resourceNodeId = $request->get('id');
var_dump($resourceNodeId);
exit;
$parentNode = $repository->getResourceNodeRepository()->find($resourceNodeId);
$course = $this->getCourse();
@ -89,8 +85,20 @@ class ResourceApiController extends AbstractFOSRestController implements CourseC
$this->denyAccessUnlessValidResource($resource);
return $resource;
}
/**
* @Rest\View(serializerGroups={"list"})
*/
public function getResourceCommentsAction(Request $request)
{
$repository = $this->getRepositoryFromRequest($request);
$nodeId = $request->get('id');
/** @var AbstractResource $resource */
$resource = $repository->getResourceFromResourceNode($nodeId);
$this->denyAccessUnlessValidResource($resource);
return View::create($resource, Response::HTTP_CREATED);
//return $resource;
return $resource->getResourceNode()->getComments();
}
}

@ -172,6 +172,8 @@ class Course extends AbstractResource implements ResourceInterface
/**
* @var string
*
* @Assert\NotBlank()
*
* @Gedmo\Slug(
* fields={"title"},
* updatable = false,

@ -9,6 +9,7 @@ use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Session;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation\Groups;
/**
* @ORM\MappedSuperclass
@ -19,7 +20,7 @@ abstract class AbstractResource
{
/**
* @GRID\Column(field="resourceNode.createdAt", title="Date added", type="datetime")
*
* @Groups({"list"})
* @ORM\OneToOne(
* targetEntity="Chamilo\CoreBundle\Entity\Resource\ResourceNode", mappedBy="resource", cascade={"remove"}, orphanRemoval=true
* )

@ -0,0 +1,196 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\Entity\Resource;
use Chamilo\UserBundle\Entity\User;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Gedmo\Tree\Traits\NestedSetEntity;
use JMS\Serializer\Annotation as JMS;
use JMS\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @Gedmo\Tree(type="nested")
* @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
* @ORM\Table(name="resource_comment")
*/
class ResourceComment
{
use TimestampableEntity;
use NestedSetEntity;
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
* @Groups({"list"})
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Chamilo\CoreBundle\Entity\Resource\ResourceNode", inversedBy="comments")
* @ORM\JoinColumn(name="resource_node_id", referencedColumnName="id", onDelete="SET NULL")
*/
protected $resourceNode;
/**
* @var User
*
* @Groups({"list"})
* @ORM\ManyToOne(targetEntity="Chamilo\UserBundle\Entity\User", inversedBy="resourceComments")
* @ORM\JoinColumn(name="author_id", referencedColumnName="id", onDelete="SET NULL")
*/
protected $author;
/**
* @var string
*
* @Groups({"list"})
* @Assert\NotBlank()
*
* @ORM\Column(name="content", type="string", nullable=false)
*/
protected $content;
/**
* @Gedmo\TreeParent
*
* @ORM\ManyToOne(
* targetEntity="ResourceComment",
* inversedBy="children"
* )
* @ORM\JoinColumns({@ORM\JoinColumn(onDelete="CASCADE")})
*/
protected $parent;
/**
* @var \DateTime
* @Groups({"list"})
* @Gedmo\Timestampable(on="create")
* @ORM\Column(type="datetime")
* @JMS\Type("DateTime")
*/
protected $createdAt;
/**
* @var \DateTime
*
* @Groups({"list"})
* @Gedmo\Timestampable(on="update")
* @ORM\Column(type="datetime")
* @JMS\Type("DateTime")
*/
protected $updatedAt;
/**
* @var ResourceComment[]
*
* @ORM\OneToMany(
* targetEntity="ResourceComment",
* mappedBy="parent"
* )
* @ORM\OrderBy({"id" = "ASC"})
*/
protected $children;
public function __construct()
{
$this->content = '';
$this->children = new ArrayCollection();
}
public function getId()
{
return $this->id;
}
/**
* @return ResourceComment
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
public function getContent(): string
{
return $this->content;
}
public function setContent(string $content): self
{
$this->content = $content;
return $this;
}
public function getResourceNode()
{
return $this->resourceNode;
}
/**
* @return ResourceComment
*/
public function setResourceNode($resourceNode)
{
$this->resourceNode = $resourceNode;
return $this;
}
public function getAuthor(): User
{
return $this->author;
}
/**
* @return ResourceComment
*/
public function setAuthor(User $author)
{
$this->author = $author;
return $this;
}
public function getParent()
{
return $this->parent;
}
/**
* @return ResourceComment
*/
public function setParent($parent)
{
$this->parent = $parent;
return $this;
}
/**
* @return ResourceComment[]
*/
public function getChildren(): array
{
return $this->children;
}
/**
* @param ResourceComment[] $children
*/
public function setChildren(array $children): self
{
$this->children = $children;
return $this;
}
}

@ -6,6 +6,7 @@ namespace Chamilo\CoreBundle\Entity\Resource;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use JMS\Serializer\Annotation\Groups;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\Validator\Constraints as Assert;
@ -31,6 +32,7 @@ class ResourceFile
/**
* @Assert\NotBlank()
* @Groups({"list"})
*
* @var string
*

@ -12,6 +12,8 @@ use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use JMS\Serializer\Annotation as JMS;
use JMS\Serializer\Annotation\Groups;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Validator\Constraints as Assert;
@ -26,7 +28,26 @@ use Symfony\Component\Validator\Constraints as Assert;
*/
class ResourceNode
{
use TimestampableEntity;
//use TimestampableEntity;
/**
* @var \DateTime
* @Groups({"list"})
* @Gedmo\Timestampable(on="create")
* @ORM\Column(type="datetime")
* @JMS\Type("DateTime")
*/
protected $createdAt;
/**
* @var \DateTime
*
* @Groups({"list"})
* @Gedmo\Timestampable(on="update")
* @ORM\Column(type="datetime")
* @JMS\Type("DateTime")
*/
protected $updatedAt;
public const PATH_SEPARATOR = '`';
@ -60,6 +81,7 @@ class ResourceNode
/**
* @var ResourceFile
* @Groups({"list"})
*
* @ORM\OneToOne(targetEntity="ResourceFile", inversedBy="resourceNode", orphanRemoval=true)
* @ORM\JoinColumn(name="resource_file_id", referencedColumnName="id", onDelete="CASCADE")
@ -124,6 +146,13 @@ class ResourceNode
*/
protected $illustration;
/**
* @var ResourceComment[]
*
* @ORM\OneToMany(targetEntity="ResourceComment", mappedBy="resourceNode", cascade={"persist", "remove"})
*/
protected $comments;
//protected $pathForCreationLog = '';
/**
@ -133,6 +162,7 @@ class ResourceNode
{
$this->children = new ArrayCollection();
$this->resourceLinks = new ArrayCollection();
$this->comments = new ArrayCollection();
}
/**
@ -256,6 +286,21 @@ class ResourceNode
return $this->path;
}
/**
* @return ResourceComment[]|ArrayCollection
*/
public function getComments()
{
return $this->comments;
}
public function addComment(ResourceComment $comment)
{
$comment->setResourceNode($this);
return $this->comments->add($comment);
}
/**
* Returns the path cleaned from its ids.
* Eg.: "Root/subdir/file.txt".

@ -12,6 +12,7 @@ use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CourseBundle\Traits\ShowCourseResourcesInSessionTrait;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation\Groups;
/**
* CDocument.
@ -37,7 +38,7 @@ class CDocument extends AbstractResource implements ResourceInterface
/**
* @var int
*
* @Groups({"list"})
* @ORM\Column(name="iid", type="integer")
* @ORM\Id
* @ORM\GeneratedValue
@ -67,7 +68,7 @@ class CDocument extends AbstractResource implements ResourceInterface
/**
* @var string
*
* @Groups({"list"})
* @ORM\Column(name="title", type="string", length=255, nullable=true)
*/
protected $title;

@ -16,6 +16,7 @@ use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\Criteria;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation\Groups;
use Sonata\UserBundle\Entity\BaseUser;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\EquatableInterface;
@ -86,9 +87,15 @@ class User extends BaseUser implements ThemeUser, EquatableInterface //implement
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @Groups({"list"})
*/
protected $id;
/**
* @Groups({"list"})
*/
protected $username;
/**
* @var int
*

Loading…
Cancel
Save