Updated endpoints POST/PUT track by summit

POST /api/v1/summits/{id}/tracks
PUT /api/v1/summits/{id}/tracks/{track_id}

added allowed_tags param

collection of tags ( restricted by tag track groups)

Change-Id: I5733c60a887f08d34c0ce775087ec9bfb677b072
This commit is contained in:
Sebastian Marcet 2018-09-05 15:29:02 -03:00
parent 1539d2cd51
commit 92bd96de5b
6 changed files with 108 additions and 3 deletions

View File

@ -384,6 +384,7 @@ final class OAuth2SummitTracksApiController extends OAuth2ProtectedController
'lightning_alternate_count' => 'sometimes|integer',
'voting_visible' => 'sometimes|boolean',
'chair_visible' => 'sometimes|boolean',
'allowed_tags' => 'sometimes|string_array',
];
// Creates a Validator instance and validates the data.
@ -482,6 +483,7 @@ final class OAuth2SummitTracksApiController extends OAuth2ProtectedController
'lightning_alternate_count' => 'sometimes|integer',
'voting_visible' => 'sometimes|boolean',
'chair_visible' => 'sometimes|boolean',
'allowed_tags' => 'sometimes|string_array',
];
// Creates a Validator instance and validates the data.

View File

@ -248,6 +248,18 @@ class PresentationCategory extends SilverstripeBaseModel
return $this->allowed_tags;
}
public function clearAllowedTags(){
$this->allowed_tags->clear();
}
/**
* @param Tag $tag
*/
public function addAllowedTag(Tag $tag){
if($this->allowed_tags->contains($tag)) return;
$this->allowed_tags->add($tag);
}
/**
* @param int $group_id
* @return PresentationCategoryGroup|null

View File

@ -665,6 +665,7 @@ class SummitEvent extends SilverstripeBaseModel
*/
public function addTag(Tag $tag)
{
if($this->tags->contains($tag)) return;
$this->tags->add($tag);
}

View File

@ -16,6 +16,7 @@ use App\Http\Utils\DateUtils;
use App\Models\Foundation\Summit\Events\RSVP\RSVPTemplate;
use App\Models\Foundation\Summit\SelectionPlan;
use App\Models\Foundation\Summit\TrackTagGroup;
use App\Models\Foundation\Summit\TrackTagGroupAllowedTag;
use App\Models\Utils\TimeZoneEntity;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
@ -2225,6 +2226,56 @@ SQL;
return count($res) > 0 ? $res[0] : null;
}
/**
* @param string $tag_value
* @return bool
* @throws \Doctrine\ORM\NoResultException
* @throws \Doctrine\ORM\NonUniqueResultException
*/
public function isTagValueAllowedOnTrackTagGroups($tag_value){
$query = <<<SQL
SELECT COUNT(tg.id)
FROM App\Models\Foundation\Summit\TrackTagGroup tg
JOIN tg.allowed_tags t
JOIN t.tag tag
WHERE
tg.summit = :summit
AND tag.tag = :tag_value
SQL;
$native_query = $this->getEM()->createQuery($query);
$native_query->setParameter("summit", $this);
$native_query->setParameter("tag_value", $tag_value);
$res = $native_query->getSingleScalarResult();
return $res > 0;
}
/**
* @param string $tag_value
* @return null|TrackTagGroupAllowedTag
*/
public function getAllowedTagOnTagTrackGroup($tag_value){
$query = <<<SQL
SELECT allowed_tag
FROM App\Models\Foundation\Summit\TrackTagGroupAllowedTag allowed_tag
JOIN allowed_tag.track_tag_group tg
JOIN allowed_tag.tag tag
WHERE
tg.summit = :summit
AND tag.tag = :tag_value
SQL;
$native_query = $this->getEM()->createQuery($query);
$native_query->setParameter("summit", $this);
$native_query->setParameter("tag_value", $tag_value);
$res = $native_query->getResult();
return count($res) > 0 ? $res[0] : null;
}
/**
* @param int $tag_id
* @return TrackTagGroup|null

View File

@ -21,6 +21,7 @@ use Illuminate\Support\Facades\Event;
use libs\utils\ITransactionService;
use models\exceptions\EntityNotFoundException;
use models\exceptions\ValidationException;
use models\main\ITagRepository;
use models\summit\PresentationCategory;
use models\summit\Summit;
/**
@ -36,14 +37,26 @@ final class SummitTrackService
*/
private $repository;
/**
* @var ITagRepository
*/
private $tag_repository;
/**
* SummitTrackService constructor.
* @param ISummitTrackRepository $repository
* @param ITagRepository $tag_repository
* @param ITransactionService $tx_service
*/
public function __construct(ISummitTrackRepository $repository, ITransactionService $tx_service)
public function __construct
(
ISummitTrackRepository $repository,
ITagRepository $tag_repository,
ITransactionService $tx_service
)
{
parent::__construct($tx_service);
$this->tag_repository = $tag_repository;
$this->repository = $repository;
}
@ -70,6 +83,18 @@ final class SummitTrackService
$track = PresentationCategoryFactory::build($summit, $data);
if(isset($data['allowed_tags'])){
foreach($data['allowed_tags'] as $tag_value) {
$tackTagGroupAllowedTag = $summit->getAllowedTagOnTagTrackGroup($tag_value);
if(is_null($tackTagGroupAllowedTag)){
throw new ValidationException(
sprintf("allowed_tags : tag value %s is not allowed on current track tag groups for summit %s", $tag_value, $summit->getId())
);
}
$track->addAllowedTag($tackTagGroupAllowedTag->getTag());
}
}
$summit->addPresentationCategory($track);
return $track;
@ -114,6 +139,19 @@ final class SummitTrackService
$track = PresentationCategoryFactory::populate($track, $data);
if(isset($data['allowed_tags'])){
$track->clearAllowedTags();
foreach($data['allowed_tags'] as $tag_value) {
$tackTagGroupAllowedTag = $summit->getAllowedTagOnTagTrackGroup($tag_value);
if(is_null($tackTagGroupAllowedTag)){
throw new ValidationException(
sprintf("allowed_tags : tag value %s is not allowed on current track tag groups for summit %s", $tag_value, $summit->getId())
);
}
$track->addAllowedTag($tackTagGroupAllowedTag->getTag());
}
}
Event::fire(new TrackUpdated($track->getSummitId(), $track->getId()));
return $track;

View File

@ -195,16 +195,17 @@ final class OAuth2TracksApiTest extends ProtectedApiTest
* @param int $summit_id
* @return mixed
*/
public function testAddTrack($summit_id = 23){
public function testAddTrack($summit_id = 25){
$params = [
'id' => $summit_id,
];
$name = str_random(16).'_track';
$data = [
'title' => $name,
'name' => $name,
'description' => 'test desc',
'code' => '',
'allowed_tags' => ['101','Case Study', 'Demo'],
];
$headers = [