Fix on Presentation update process
there was an issue on presentation update and doctrine entity lifecycles Change-Id: If65a29f8a92b5581d4326a08bce66964b9239204
This commit is contained in:
parent
b2faf65f5a
commit
42f51934e0
@ -379,7 +379,7 @@ final class OAuth2SummitSpeakersApiController extends OAuth2ProtectedController
|
|||||||
$summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id);
|
$summit = SummitFinderStrategyFactory::build($this->repository, $this->resource_server_context)->find($summit_id);
|
||||||
if (is_null($summit)) return $this->error404();
|
if (is_null($summit)) return $this->error404();
|
||||||
|
|
||||||
$speaker = CheckSpeakerStrategyFactory::build(CheckSpeakerStrategyFactory::Me, $this->resource_server_context)->check($speaker_id, $summit);
|
$speaker = $this->speaker_repository->getById($speaker_id);
|
||||||
if (is_null($speaker)) return $this->error404();
|
if (is_null($speaker)) return $this->error404();
|
||||||
|
|
||||||
$rules = array
|
$rules = array
|
||||||
|
@ -116,8 +116,16 @@ class Presentation extends SummitEvent
|
|||||||
private $materials;
|
private $materials;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity="models\summit\PresentationSpeaker", mappedBy="presentations")
|
* @ORM\ManyToMany(targetEntity="models\summit\PresentationSpeaker", inversedBy="presentations")
|
||||||
* @var PresentationSpeaker[]
|
* @ORM\JoinTable(name="Presentation_Speakers",
|
||||||
|
* joinColumns={
|
||||||
|
* @ORM\JoinColumn(name="PresentationID", referencedColumnName="ID")
|
||||||
|
* },
|
||||||
|
* inverseJoinColumns={
|
||||||
|
* @ORM\JoinColumn(name="PresentationSpeakerID", referencedColumnName="ID")
|
||||||
|
*
|
||||||
|
* }
|
||||||
|
* )
|
||||||
*/
|
*/
|
||||||
private $speakers;
|
private $speakers;
|
||||||
|
|
||||||
@ -298,6 +306,13 @@ class Presentation extends SummitEvent
|
|||||||
$video->unsetPresentation();
|
$video->unsetPresentation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param PresentationSpeaker $speaker
|
||||||
|
*/
|
||||||
|
public function removeSpeaker(PresentationSpeaker $speaker){
|
||||||
|
$this->speakers->removeElement($speaker);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return PresentationSlide[]
|
* @return PresentationSlide[]
|
||||||
*/
|
*/
|
||||||
|
@ -90,15 +90,8 @@ class PresentationSpeaker extends SilverstripeBaseModel
|
|||||||
private $promo_codes;
|
private $promo_codes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToMany(targetEntity="models\summit\Presentation", inversedBy="speakers")
|
* @ORM\ManyToMany(targetEntity="models\summit\Presentation", mappedBy="speakers")
|
||||||
* @ORM\JoinTable(name="Presentation_Speakers",
|
* @var Presentation[]
|
||||||
* joinColumns={
|
|
||||||
* @ORM\JoinColumn(name="PresentationSpeakerID", referencedColumnName="ID")
|
|
||||||
* },
|
|
||||||
* inverseJoinColumns={
|
|
||||||
* @ORM\JoinColumn(name="PresentationID", referencedColumnName="ID")
|
|
||||||
* }
|
|
||||||
* )
|
|
||||||
*/
|
*/
|
||||||
private $presentations;
|
private $presentations;
|
||||||
|
|
||||||
@ -235,6 +228,13 @@ class PresentationSpeaker extends SilverstripeBaseModel
|
|||||||
$this->presentations->add($presentation);
|
$this->presentations->add($presentation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function clearPresentations(){
|
||||||
|
foreach($this->presentations as $presentation){
|
||||||
|
$presentation->removeSpeaker($this);
|
||||||
|
}
|
||||||
|
$this->presentations->clear();
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* @param SpeakerSummitRegistrationPromoCode $code
|
* @param SpeakerSummitRegistrationPromoCode $code
|
||||||
* @return $this
|
* @return $this
|
||||||
|
@ -94,6 +94,13 @@ class SummitEntityEvent extends SilverstripeBaseModel
|
|||||||
return !empty($this->metadata) ? json_decode($this->metadata, true) : array();
|
return !empty($this->metadata) ? json_decode($this->metadata, true) : array();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getRawMetadata(){
|
||||||
|
return $this->metadata;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity="models\main\Member", cascade={"persist"})
|
* @ORM\ManyToOne(targetEntity="models\main\Member", cascade={"persist"})
|
||||||
* @ORM\JoinColumn(name="OwnerID", referencedColumnName="ID")
|
* @ORM\JoinColumn(name="OwnerID", referencedColumnName="ID")
|
||||||
|
@ -52,6 +52,85 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
private static function persistsEntityEvent(SummitEntityEvent $entity_event){
|
||||||
|
$sql = <<<SQL
|
||||||
|
INSERT INTO SummitEntityEvent
|
||||||
|
(EntityID, EntityClassName, Type, Metadata, Created, LastEdited, OwnerID, SummitID)
|
||||||
|
VALUES (:EntityID, :EntityClassName, :Type, :Metadata, :Created, :LastEdited, :OwnerID, :SummitID)
|
||||||
|
SQL;
|
||||||
|
|
||||||
|
$bindings = [
|
||||||
|
'EntityID' => $entity_event->getEntityId(),
|
||||||
|
'EntityClassName' => $entity_event->getEntityClassName(),
|
||||||
|
'Type' => $entity_event->getType(),
|
||||||
|
'Metadata' => $entity_event->getRawMetadata(),
|
||||||
|
'Created' => $entity_event->getCreated(),
|
||||||
|
'LastEdited' => $entity_event->getLastEdited(),
|
||||||
|
'OwnerID' => $entity_event->getOwnerId(),
|
||||||
|
'SummitID' => $entity_event->getSummitId()
|
||||||
|
];
|
||||||
|
|
||||||
|
$types = [
|
||||||
|
'EntityID' => 'integer',
|
||||||
|
'EntityClassName' => 'string',
|
||||||
|
'Type' => 'string',
|
||||||
|
'Metadata' => 'string',
|
||||||
|
'Created' => 'datetime',
|
||||||
|
'LastEdited' => 'datetime',
|
||||||
|
'OwnerID' => 'integer',
|
||||||
|
'SummitID' => 'integer',
|
||||||
|
];
|
||||||
|
|
||||||
|
self::insert($sql, $bindings, $types);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function persistAdminSyncRequest(AdminSummitEventActionSyncWorkRequest $request){
|
||||||
|
$em = Registry::getManager('ss');
|
||||||
|
$em->persist($request);
|
||||||
|
$em->flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function persistsAssetSyncRequest(AssetsSyncRequest $assets_sync_request){
|
||||||
|
|
||||||
|
$sql = <<<SQL
|
||||||
|
INSERT INTO AssetsSyncRequest
|
||||||
|
(
|
||||||
|
ClassName,
|
||||||
|
Created,
|
||||||
|
LastEdited,
|
||||||
|
`From`,
|
||||||
|
`To`,
|
||||||
|
Processed,
|
||||||
|
ProcessedDate
|
||||||
|
)
|
||||||
|
VALUES
|
||||||
|
('AssetsSyncRequest', NOW(), NOW(), :FromFile, :ToFile, 0, NULL );
|
||||||
|
|
||||||
|
SQL;
|
||||||
|
|
||||||
|
$bindings = [
|
||||||
|
'FromFile' => $assets_sync_request->getFrom(),
|
||||||
|
'ToFile' => $assets_sync_request->getTo(),
|
||||||
|
];
|
||||||
|
|
||||||
|
$types = [
|
||||||
|
'FromFile' => 'string',
|
||||||
|
'ToFile' => 'string',
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
self::insert($sql, $bindings, $types);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $sql
|
||||||
|
* @param array $bindings
|
||||||
|
*/
|
||||||
|
private static function insert($sql, array $bindings, array $types){
|
||||||
|
$em = Registry::getManager('ss');
|
||||||
|
$em->getConnection()->executeUpdate($sql, $bindings, $types);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Register any other events for your application.
|
* Register any other events for your application.
|
||||||
* @return void
|
* @return void
|
||||||
@ -70,9 +149,8 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$entity_event->setSummit($event->getSummit());
|
$entity_event->setSummit($event->getSummit());
|
||||||
$entity_event->setMetadata('');
|
$entity_event->setMetadata('');
|
||||||
|
|
||||||
$em = Registry::getManager('ss');
|
self::persistsEntityEvent($entity_event);
|
||||||
$em->persist($entity_event);
|
|
||||||
$em->flush();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Event::listen(\App\Events\MyFavoritesAdd::class, function($event)
|
Event::listen(\App\Events\MyFavoritesAdd::class, function($event)
|
||||||
@ -85,9 +163,7 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$entity_event->setSummit($event->getSummit());
|
$entity_event->setSummit($event->getSummit());
|
||||||
$entity_event->setMetadata('');
|
$entity_event->setMetadata('');
|
||||||
|
|
||||||
$em = Registry::getManager('ss');
|
self::persistsEntityEvent($entity_event);
|
||||||
$em->persist($entity_event);
|
|
||||||
$em->flush();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Event::listen(\App\Events\MyScheduleRemove::class, function($event)
|
Event::listen(\App\Events\MyScheduleRemove::class, function($event)
|
||||||
@ -100,9 +176,7 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$entity_event->setSummit($event->getSummit());
|
$entity_event->setSummit($event->getSummit());
|
||||||
$entity_event->setMetadata('');
|
$entity_event->setMetadata('');
|
||||||
|
|
||||||
$em = Registry::getManager('ss');
|
self::persistsEntityEvent($entity_event);
|
||||||
$em->persist($entity_event);
|
|
||||||
$em->flush();
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -117,9 +191,7 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$entity_event->setSummit($event->getSummit());
|
$entity_event->setSummit($event->getSummit());
|
||||||
$entity_event->setMetadata('');
|
$entity_event->setMetadata('');
|
||||||
|
|
||||||
$em = Registry::getManager('ss');
|
self::persistsEntityEvent($entity_event);
|
||||||
$em->persist($entity_event);
|
|
||||||
$em->flush();
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -143,9 +215,7 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$entity_event->setSummit($event->getSummitEvent()->getSummit());
|
$entity_event->setSummit($event->getSummitEvent()->getSummit());
|
||||||
$entity_event->setMetadata( json_encode([ 'pub_new' => intval($event->getSummitEvent()->isPublished())]));
|
$entity_event->setMetadata( json_encode([ 'pub_new' => intval($event->getSummitEvent()->isPublished())]));
|
||||||
|
|
||||||
$em = Registry::getManager('ss');
|
self::persistsEntityEvent($entity_event);
|
||||||
$em->persist($entity_event);
|
|
||||||
$em->flush();
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -193,10 +263,9 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
else
|
else
|
||||||
$entity_event->setMetadata(json_encode([ 'pub_new' => intval($event->getSummitEvent()->getPublished())]));
|
$entity_event->setMetadata(json_encode([ 'pub_new' => intval($event->getSummitEvent()->getPublished())]));
|
||||||
|
|
||||||
$em = Registry::getManager('ss');
|
self::persistsEntityEvent($entity_event);
|
||||||
$em->persist($entity_event);
|
self::persistAdminSyncRequest($request);
|
||||||
$em->persist($request);
|
|
||||||
$em->flush();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Event::listen(\App\Events\SummitEventDeleted::class, function($event)
|
Event::listen(\App\Events\SummitEventDeleted::class, function($event)
|
||||||
@ -210,7 +279,6 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$owner_id = $resource_server_context->getCurrentUserExternalId();
|
$owner_id = $resource_server_context->getCurrentUserExternalId();
|
||||||
if(is_null($owner_id)) $owner_id = 0;
|
if(is_null($owner_id)) $owner_id = 0;
|
||||||
$params = $args->getParams();
|
$params = $args->getParams();
|
||||||
$em = Registry::getManager('ss');
|
|
||||||
|
|
||||||
$entity_event = new SummitEntityEvent;
|
$entity_event = new SummitEntityEvent;
|
||||||
$entity_event->setEntityClassName($params['class_name']);
|
$entity_event->setEntityClassName($params['class_name']);
|
||||||
@ -225,6 +293,7 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$entity_event->setSummit($params['summit']);
|
$entity_event->setSummit($params['summit']);
|
||||||
$entity_event->setMetadata('');
|
$entity_event->setMetadata('');
|
||||||
|
|
||||||
|
$request = null;
|
||||||
if(isset($params['published']) && $params['published']){
|
if(isset($params['published']) && $params['published']){
|
||||||
// just record the published state at the moment of the update
|
// just record the published state at the moment of the update
|
||||||
|
|
||||||
@ -240,11 +309,13 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$member = $member_repository->getById($owner_id);
|
$member = $member_repository->getById($owner_id);
|
||||||
$request->setCreatedBy($member);
|
$request->setCreatedBy($member);
|
||||||
}
|
}
|
||||||
$em->persist($request);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$em->persist($entity_event);
|
self::persistsEntityEvent($entity_event);
|
||||||
$em->flush();
|
|
||||||
|
if(!is_null($request))
|
||||||
|
self::persistAdminSyncRequest($request);
|
||||||
});
|
});
|
||||||
|
|
||||||
Event::listen(\App\Events\PresentationMaterialCreated::class, function($event)
|
Event::listen(\App\Events\PresentationMaterialCreated::class, function($event)
|
||||||
@ -268,9 +339,7 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$entity_event->setSummit($event->getMaterial()->getPresentation()->getSummit());
|
$entity_event->setSummit($event->getMaterial()->getPresentation()->getSummit());
|
||||||
$entity_event->setMetadata(json_encode([ 'presentation_id' => intval($event->getMaterial()->getPresentation()->getId())]));
|
$entity_event->setMetadata(json_encode([ 'presentation_id' => intval($event->getMaterial()->getPresentation()->getId())]));
|
||||||
|
|
||||||
$em = Registry::getManager('ss');
|
self::persistsEntityEvent($entity_event);
|
||||||
$em->persist($entity_event);
|
|
||||||
$em->flush();
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -295,9 +364,7 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$entity_event->setSummit($event->getMaterial()->getPresentation()->getSummit());
|
$entity_event->setSummit($event->getMaterial()->getPresentation()->getSummit());
|
||||||
$entity_event->setMetadata(json_encode([ 'presentation_id' => intval($event->getMaterial()->getPresentation()->getId())]));
|
$entity_event->setMetadata(json_encode([ 'presentation_id' => intval($event->getMaterial()->getPresentation()->getId())]));
|
||||||
|
|
||||||
$em = Registry::getManager('ss');
|
self::persistsEntityEvent($entity_event);
|
||||||
$em->persist($entity_event);
|
|
||||||
$em->flush();
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -321,9 +388,7 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
|
|
||||||
$entity_event->setSummit($event->getPresentation()->getSummit());
|
$entity_event->setSummit($event->getPresentation()->getSummit());
|
||||||
|
|
||||||
$em = Registry::getManager('ss');
|
self::persistsEntityEvent($entity_event);
|
||||||
$em->persist($entity_event);
|
|
||||||
$em->flush();
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -355,9 +420,7 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$asset_sync_request->setFrom($remote_destination);
|
$asset_sync_request->setFrom($remote_destination);
|
||||||
$asset_sync_request->setTo(sprintf("%s/%s", $folder_name, $file_name));
|
$asset_sync_request->setTo(sprintf("%s/%s", $folder_name, $file_name));
|
||||||
$asset_sync_request->setProcessed(false);
|
$asset_sync_request->setProcessed(false);
|
||||||
$em = Registry::getManager('ss');
|
self::persistsAssetSyncRequest($asset_sync_request);
|
||||||
$em->persist($asset_sync_request);
|
|
||||||
$em->flush();
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -370,8 +433,6 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$owner_id = $resource_server_context->getCurrentUserExternalId();
|
$owner_id = $resource_server_context->getCurrentUserExternalId();
|
||||||
if(is_null($owner_id)) $owner_id = 0;
|
if(is_null($owner_id)) $owner_id = 0;
|
||||||
|
|
||||||
$em = Registry::getManager('ss');
|
|
||||||
|
|
||||||
foreach($event->getPresentationSpeaker()->getRelatedSummits() as $summit) {
|
foreach($event->getPresentationSpeaker()->getRelatedSummits() as $summit) {
|
||||||
|
|
||||||
$entity_event = new SummitEntityEvent;
|
$entity_event = new SummitEntityEvent;
|
||||||
@ -387,8 +448,7 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$entity_event->setSummit($summit);
|
$entity_event->setSummit($summit);
|
||||||
$entity_event->setMetadata('');
|
$entity_event->setMetadata('');
|
||||||
|
|
||||||
$em->persist($entity_event);
|
self::persistsEntityEvent($entity_event);
|
||||||
$em->flush();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
@ -402,8 +462,6 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$owner_id = $resource_server_context->getCurrentUserExternalId();
|
$owner_id = $resource_server_context->getCurrentUserExternalId();
|
||||||
if(is_null($owner_id)) $owner_id = 0;
|
if(is_null($owner_id)) $owner_id = 0;
|
||||||
|
|
||||||
$em = Registry::getManager('ss');
|
|
||||||
|
|
||||||
foreach($event->getPresentationSpeaker()->getRelatedSummits() as $summit) {
|
foreach($event->getPresentationSpeaker()->getRelatedSummits() as $summit) {
|
||||||
|
|
||||||
$entity_event = new SummitEntityEvent;
|
$entity_event = new SummitEntityEvent;
|
||||||
@ -419,8 +477,7 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$entity_event->setSummit($summit);
|
$entity_event->setSummit($summit);
|
||||||
$entity_event->setMetadata('');
|
$entity_event->setMetadata('');
|
||||||
|
|
||||||
$em->persist($entity_event);
|
self::persistsEntityEvent($entity_event);
|
||||||
$em->flush();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
@ -436,7 +493,6 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$owner_id = $resource_server_context->getCurrentUserExternalId();
|
$owner_id = $resource_server_context->getCurrentUserExternalId();
|
||||||
if(is_null($owner_id)) $owner_id = 0;
|
if(is_null($owner_id)) $owner_id = 0;
|
||||||
$params = $args->getParams();
|
$params = $args->getParams();
|
||||||
$em = Registry::getManager('ss');
|
|
||||||
|
|
||||||
foreach($params['summits'] as $summit) {
|
foreach($params['summits'] as $summit) {
|
||||||
|
|
||||||
@ -453,8 +509,7 @@ class EventServiceProvider extends ServiceProvider
|
|||||||
$entity_event->setSummit($summit);
|
$entity_event->setSummit($summit);
|
||||||
$entity_event->setMetadata('');
|
$entity_event->setMetadata('');
|
||||||
|
|
||||||
$em->persist($entity_event);
|
self::persistsEntityEvent($entity_event);
|
||||||
$em->flush();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -333,7 +333,7 @@ final class SpeakerService implements ISpeakerService
|
|||||||
if(!empty($reg_code)){
|
if(!empty($reg_code)){
|
||||||
$this->registerSummitPromoCodeByValue($speaker, $summit, $reg_code);
|
$this->registerSummitPromoCodeByValue($speaker, $summit, $reg_code);
|
||||||
}
|
}
|
||||||
|
$speaker->clearPresentations();
|
||||||
return $speaker;
|
return $speaker;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -136,7 +136,7 @@ class OAuth2SpeakersApiTest extends ProtectedApiTest
|
|||||||
$params = [
|
$params = [
|
||||||
|
|
||||||
'id' => $summit_id,
|
'id' => $summit_id,
|
||||||
'speaker_id' => 1
|
'speaker_id' => 9161
|
||||||
];
|
];
|
||||||
|
|
||||||
$headers = [
|
$headers = [
|
||||||
@ -145,7 +145,7 @@ class OAuth2SpeakersApiTest extends ProtectedApiTest
|
|||||||
];
|
];
|
||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'title' => 'Legend!',
|
'title' => 'Legend!!!',
|
||||||
];
|
];
|
||||||
|
|
||||||
$response = $this->action
|
$response = $this->action
|
||||||
|
@ -1085,12 +1085,13 @@ final class OAuth2SummitApiTest extends ProtectedApiTest
|
|||||||
$params = array
|
$params = array
|
||||||
(
|
(
|
||||||
'id' => 23,
|
'id' => 23,
|
||||||
'event_id' => 20619,
|
'event_id' => 19255,
|
||||||
);
|
);
|
||||||
|
|
||||||
$data = array
|
$data = array
|
||||||
(
|
(
|
||||||
'title' => 'OpenStack Public Cloud Update TEST!',
|
'title' => 'Using HTTPS to Secure OpenStack Services Update',
|
||||||
|
'speakers' => [210, 9161, 202]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user