diff --git a/app/Http/Controllers/Apis/Protected/Summit/Factories/PresentationLinkValidationRulesFactory.php b/app/Http/Controllers/Apis/Protected/Summit/Factories/PresentationLinkValidationRulesFactory.php new file mode 100644 index 00000000..20c39e35 --- /dev/null +++ b/app/Http/Controllers/Apis/Protected/Summit/Factories/PresentationLinkValidationRulesFactory.php @@ -0,0 +1,35 @@ + 'sometimes|required|url', + ]); + } + + return array_merge($former_rules, [ + 'link' => 'required|url', + ]); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Apis/Protected/Summit/Factories/PresentationMaterialValidationRulesFactory.php b/app/Http/Controllers/Apis/Protected/Summit/Factories/PresentationMaterialValidationRulesFactory.php new file mode 100644 index 00000000..11c0069a --- /dev/null +++ b/app/Http/Controllers/Apis/Protected/Summit/Factories/PresentationMaterialValidationRulesFactory.php @@ -0,0 +1,41 @@ + 'sometimes|required|string:512', + 'description' => 'sometimes|required|string', + 'display_on_site' => 'sometimes|required|boolean', + 'featured' => 'sometimes|required|boolean', + 'order' => 'sometimes|integer|min:1', + ]; + } + + return [ + 'name' => 'sometimes|required|string:512', + 'description' => 'sometimes|required|string', + 'display_on_site' => 'sometimes|required|boolean', + 'featured' => 'sometimes|required|boolean', + ]; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Apis/Protected/Summit/Factories/PresentationSlideValidationRulesFactory.php b/app/Http/Controllers/Apis/Protected/Summit/Factories/PresentationSlideValidationRulesFactory.php new file mode 100644 index 00000000..3dffec41 --- /dev/null +++ b/app/Http/Controllers/Apis/Protected/Summit/Factories/PresentationSlideValidationRulesFactory.php @@ -0,0 +1,37 @@ + 'nullable|url', + ]); + } + + return array_merge($former_rules, [ + 'file' => 'required_without_all:link,filepath', + 'link' => 'required_without_all:file,filepath|url', + 'filepath' => 'required_without_all:link,file', + ]); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Apis/Protected/Summit/Factories/PresentationVideoValidationRulesFactory.php b/app/Http/Controllers/Apis/Protected/Summit/Factories/PresentationVideoValidationRulesFactory.php new file mode 100644 index 00000000..937aad04 --- /dev/null +++ b/app/Http/Controllers/Apis/Protected/Summit/Factories/PresentationVideoValidationRulesFactory.php @@ -0,0 +1,37 @@ + 'required_without:external_url|alpha_dash', + 'external_url' => 'required_without:youtube_id|string:512|url', + ]); + } + + return array_merge($former_rules, [ + 'youtube_id' => 'required_without:external_url|alpha_dash', + 'external_url' => 'required_without:youtube_id|string:512|url', + ]); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2PresentationApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2PresentationApiController.php index 59019ff7..3c4696d8 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2PresentationApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2PresentationApiController.php @@ -11,8 +11,10 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ + use App\Http\Utils\FileTypes; use App\Http\Utils\MultipartFormDataCleaner; +use App\Jobs\VideoStreamUrlMUXProcessingForSummitJob; use App\Models\Foundation\Main\IGroup; use Illuminate\Support\Facades\Config; use libs\utils\HTMLCleaner; @@ -32,6 +34,7 @@ use models\summit\Presentation; use models\utils\IEntity; use ModelSerializers\SerializerRegistry; use services\model\IPresentationService; + /** * Class OAuth2PresentationApiController * @package App\Http\Controllers @@ -77,16 +80,17 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController { parent::__construct($resource_server_context); $this->presentation_repository = $presentation_repository; - $this->presentation_service = $presentation_service; - $this->member_repository = $member_repository; - $this->summit_repository = $summit_repository; + $this->presentation_service = $presentation_service; + $this->member_repository = $member_repository; + $this->summit_repository = $summit_repository; } //presentations //videos - public function getPresentationVideos($summit_id, $presentation_id){ + public function getPresentationVideos($summit_id, $presentation_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); @@ -98,10 +102,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $videos = $presentation->getVideos(); $items = []; - foreach($videos as $i) - { - if($i instanceof IEntity) - { + foreach ($videos as $i) { + if ($i instanceof IEntity) { $i = SerializerRegistry::getInstance()->getSerializer($i)->serialize(); } $items[] = $i; @@ -121,7 +123,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $video_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function getPresentationVideo($summit_id, $presentation_id, $video_id){ + public function getPresentationVideo($summit_id, $presentation_id, $video_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); @@ -148,33 +151,25 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $presentation_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function addVideo(LaravelRequest $request, $summit_id, $presentation_id){ + public function addVideo(LaravelRequest $request, $summit_id, $presentation_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); - if(!Request::isJson()) return $this->error400(); + if (!Request::isJson()) return $this->error400(); $data = Input::json(); - $rules = - [ - 'youtube_id' => 'required|alpha_dash', - 'name' => 'sometimes|required|string:512', - 'description' => 'sometimes|required|string', - 'featured' => 'sometimes|required|boolean', - 'display_on_site' => 'sometimes|required|boolean', - ]; - $data = $data->all(); // Creates a Validator instance and validates the data. - $validation = Validator::make($data, $rules); + $validation = Validator::make($data, PresentationVideoValidationRulesFactory::build($data)); if ($validation->fails()) { - $ex = new ValidationException; - $ex->setMessages($validation->messages()->toArray()); - throw $ex; + $ex = new ValidationException; + $ex->setMessages($validation->messages()->toArray()); + throw $ex; } $fields = [ @@ -185,19 +180,13 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $video = $this->presentation_service->addVideoTo($presentation_id, HTMLCleaner::cleanData($data, $fields)); return $this->created(SerializerRegistry::getInstance()->getSerializer($video)->serialize()); - } - catch (EntityNotFoundException $ex1) - { + } catch (EntityNotFoundException $ex1) { Log::warning($ex1); return $this->error404(); - } - catch (ValidationException $ex2) - { + } catch (ValidationException $ex2) { Log::warning($ex2); return $this->error412($ex2->getMessages()); - } - catch (Exception $ex) - { + } catch (Exception $ex) { Log::error($ex); return $this->error500($ex); } @@ -210,28 +199,19 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $video_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function updateVideo(LaravelRequest $request, $summit_id, $presentation_id, $video_id){ + public function updateVideo(LaravelRequest $request, $summit_id, $presentation_id, $video_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); - if(!Request::isJson()) return $this->error400(); + if (!Request::isJson()) return $this->error400(); $data = Input::json(); - - $rules = [ - 'youtube_id' => 'required|alpha_dash', - 'name' => 'sometimes|required|string:512', - 'description' => 'sometimes|required|string', - 'display_on_site' => 'sometimes|required|boolean', - 'featured' => 'sometimes|required|boolean', - 'order' => 'sometimes|integer|min:1', - ]; - $data = $data->all(); // Creates a Validator instance and validates the data. - $validation = Validator::make($data, $rules); + $validation = Validator::make($data, PresentationVideoValidationRulesFactory::build($data, true)); if ($validation->fails()) { $ex = new ValidationException; @@ -247,19 +227,13 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $video = $this->presentation_service->updateVideo($presentation_id, $video_id, HTMLCleaner::cleanData($data, $fields)); return $this->updated(SerializerRegistry::getInstance()->getSerializer($video)->serialize()); - } - catch (EntityNotFoundException $ex1) - { + } catch (EntityNotFoundException $ex1) { Log::warning($ex1); return $this->error404(); - } - catch (ValidationException $ex2) - { + } catch (ValidationException $ex2) { Log::warning($ex2); return $this->error412($ex2->getMessages()); - } - catch (Exception $ex) - { + } catch (Exception $ex) { Log::error($ex); return $this->error500($ex); } @@ -271,7 +245,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $video_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function deleteVideo($summit_id, $presentation_id, $video_id){ + public function deleteVideo($summit_id, $presentation_id, $video_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -280,19 +255,13 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $this->presentation_service->deleteVideo($presentation_id, $video_id); return $this->deleted(); - } - catch (EntityNotFoundException $ex1) - { + } catch (EntityNotFoundException $ex1) { Log::warning($ex1); return $this->error404(); - } - catch (ValidationException $ex2) - { + } catch (ValidationException $ex2) { Log::warning($ex2); return $this->error412($ex2->getMessages()); - } - catch (Exception $ex) - { + } catch (Exception $ex) { Log::error($ex); return $this->error500($ex); } @@ -302,13 +271,14 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $summit_id * @return mixed */ - public function submitPresentation($summit_id){ + public function submitPresentation($summit_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); - if(!Request::isJson()) return $this->error400(); + if (!Request::isJson()) return $this->error400(); $current_member = $this->resource_server_context->getCurrentUser(); if (is_null($current_member)) return $this->error403(); @@ -334,19 +304,13 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $presentation = $this->presentation_service->submitPresentation($summit, HTMLCleaner::cleanData($data, $fields)); return $this->created(SerializerRegistry::getInstance()->getSerializer($presentation)->serialize(Request::input('expand', ''))); - } - catch (EntityNotFoundException $ex1) - { + } catch (EntityNotFoundException $ex1) { Log::warning($ex1); return $this->error404(['message' => $ex1->getMessage()]); - } - catch (ValidationException $ex2) - { + } catch (ValidationException $ex2) { Log::warning($ex2); return $this->error412($ex2->getMessages()); - } - catch (Exception $ex) - { + } catch (Exception $ex) { Log::error($ex); return $this->error500($ex); } @@ -357,13 +321,14 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $presentation_id * @return mixed */ - public function updatePresentationSubmission($summit_id, $presentation_id){ + public function updatePresentationSubmission($summit_id, $presentation_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); - if(!Request::isJson()) return $this->error400(); + if (!Request::isJson()) return $this->error400(); $current_member = $this->resource_server_context->getCurrentUser(); if (is_null($current_member)) return $this->error403(); @@ -372,7 +337,7 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $data = $data->all(); // Creates a Validator instance and validates the data. - $validation = Validator::make($data, SummitEventValidationRulesFactory::buildForSubmission($data. true)); + $validation = Validator::make($data, SummitEventValidationRulesFactory::buildForSubmission($data . true)); if ($validation->fails()) { $ex = new ValidationException; @@ -395,19 +360,13 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController ); return $this->updated(SerializerRegistry::getInstance()->getSerializer($presentation)->serialize(Request::input('expand', ''))); - } - catch (EntityNotFoundException $ex1) - { + } catch (EntityNotFoundException $ex1) { Log::warning($ex1); return $this->error404(); - } - catch (ValidationException $ex2) - { + } catch (ValidationException $ex2) { Log::warning($ex2); return $this->error412($ex2->getMessages()); - } - catch (Exception $ex) - { + } catch (Exception $ex) { Log::error($ex); return $this->error500($ex); } @@ -418,7 +377,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $presentation_id * @return mixed */ - public function completePresentationSubmission($summit_id, $presentation_id){ + public function completePresentationSubmission($summit_id, $presentation_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -434,19 +394,13 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController ); return $this->updated(SerializerRegistry::getInstance()->getSerializer($presentation)->serialize(Request::input('expand', ''))); - } - catch (EntityNotFoundException $ex1) - { + } catch (EntityNotFoundException $ex1) { Log::warning($ex1); return $this->error404(); - } - catch (ValidationException $ex2) - { + } catch (ValidationException $ex2) { Log::warning($ex2); return $this->error412($ex2->getMessages()); - } - catch (Exception $ex) - { + } catch (Exception $ex) { Log::error($ex); return $this->error500($ex); } @@ -457,7 +411,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $presentation_id * @return mixed */ - public function deletePresentation($summit_id, $presentation_id){ + public function deletePresentation($summit_id, $presentation_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -489,7 +444,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $presentation_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function getPresentationSlides($summit_id, $presentation_id){ + public function getPresentationSlides($summit_id, $presentation_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -502,10 +458,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $slides = $presentation->getSlides(); $items = []; - foreach($slides as $i) - { - if($i instanceof IEntity) - { + foreach ($slides as $i) { + if ($i instanceof IEntity) { $i = SerializerRegistry::getInstance()->getSerializer($i)->serialize(); } $items[] = $i; @@ -531,7 +485,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $slide_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function getPresentationSlide($summit_id, $presentation_id, $slide_id){ + public function getPresentationSlide($summit_id, $presentation_id, $slide_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); @@ -558,7 +513,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $presentation_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function addPresentationSlide(LaravelRequest $request, $summit_id, $presentation_id){ + public function addPresentationSlide(LaravelRequest $request, $summit_id, $presentation_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -567,12 +523,12 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $current_member = $this->resource_server_context->getCurrentUser(); if (is_null($current_member)) return $this->error403(); $isAdmin = $current_member->isAdmin() || $current_member->hasPermissionForOnGroup($summit, IGroup::SummitAdministrators); - if(!$isAdmin){ + if (!$isAdmin) { // check if we could edit presentation $presentation = $summit->getEvent($presentation_id); - if(is_null($presentation) || !$presentation instanceof Presentation) + if (is_null($presentation) || !$presentation instanceof Presentation) return $this->error404(); - if(!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) + if (!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) return $this->error403(); } @@ -580,18 +536,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $data = MultipartFormDataCleaner::cleanBool('display_on_site', $data); $data = MultipartFormDataCleaner::cleanBool('featured', $data); - $rules = [ - 'file' => 'required_without_all:link,filepath', - 'link' => 'required_without_all:file,filepath|url', - 'filepath' => 'required_without_all:link,file', - 'name' => 'required|string:512', - 'description' => 'nullable|string', - 'display_on_site' => 'nullable|boolean', - 'featured' => 'nullable|boolean', - ]; - // Creates a Validator instance and validates the data. - $validation = Validator::make($data, $rules); + $validation = Validator::make($data, PresentationSlideValidationRulesFactory::build($data)); if ($validation->fails()) { $ex = new ValidationException; @@ -614,19 +560,13 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController ); return $this->created(SerializerRegistry::getInstance()->getSerializer($slide)->serialize()); - } - catch (EntityNotFoundException $ex1) - { + } catch (EntityNotFoundException $ex1) { Log::warning($ex1); return $this->error404(); - } - catch (ValidationException $ex2) - { + } catch (ValidationException $ex2) { Log::warning($ex2); return $this->error412($ex2->getMessages()); - } - catch (Exception $ex) - { + } catch (Exception $ex) { Log::error($ex); return $this->error500($ex); } @@ -639,7 +579,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $slide_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function updatePresentationSlide(LaravelRequest $request, $summit_id, $presentation_id, $slide_id){ + public function updatePresentationSlide(LaravelRequest $request, $summit_id, $presentation_id, $slide_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -648,12 +589,12 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $current_member = $this->resource_server_context->getCurrentUser(); if (is_null($current_member)) return $this->error403(); $isAdmin = $current_member->isAdmin() || $current_member->hasPermissionForOnGroup($summit, IGroup::SummitAdministrators); - if(!$isAdmin){ + if (!$isAdmin) { // check if we could edit presentation $presentation = $summit->getEvent($presentation_id); - if(is_null($presentation) || !$presentation instanceof Presentation) + if (is_null($presentation) || !$presentation instanceof Presentation) return $this->error404(); - if(!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) + if (!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) return $this->error403(); } @@ -662,17 +603,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $data = MultipartFormDataCleaner::cleanBool('featured', $data); $data = MultipartFormDataCleaner::cleanInt('order', $data); - $rules = [ - 'link' => 'nullable|url', - 'name' => 'nullable|string:512', - 'description' => 'nullable|string', - 'display_on_site' => 'nullable|boolean', - 'featured' => 'nullable|boolean', - 'order' => 'nullable|integer|min:1', - ]; - // Creates a Validator instance and validates the data. - $validation = Validator::make($data, $rules); + $validation = Validator::make($data, PresentationSlideValidationRulesFactory::build($data, true)); if ($validation->fails()) { $ex = new ValidationException; @@ -696,19 +628,13 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController ); return $this->updated(SerializerRegistry::getInstance()->getSerializer($slide)->serialize()); - } - catch (EntityNotFoundException $ex1) - { + } catch (EntityNotFoundException $ex1) { Log::warning($ex1); return $this->error404(); - } - catch (ValidationException $ex2) - { + } catch (ValidationException $ex2) { Log::warning($ex2); return $this->error412($ex2->getMessages()); - } - catch (Exception $ex) - { + } catch (Exception $ex) { Log::error($ex); return $this->error500($ex); } @@ -720,7 +646,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $slide_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function deletePresentationSlide($summit_id, $presentation_id, $slide_id){ + public function deletePresentationSlide($summit_id, $presentation_id, $slide_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -729,31 +656,25 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $current_member = $this->resource_server_context->getCurrentUser(); if (is_null($current_member)) return $this->error403(); $isAdmin = $current_member->isAdmin() || $current_member->hasPermissionForOnGroup($summit, IGroup::SummitAdministrators); - if(!$isAdmin){ + if (!$isAdmin) { // check if we could edit presentation $presentation = $summit->getEvent($presentation_id); - if(is_null($presentation) || !$presentation instanceof Presentation) + if (is_null($presentation) || !$presentation instanceof Presentation) return $this->error404(); - if(!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) + if (!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) return $this->error403(); } $this->presentation_service->deleteSlide($presentation_id, $slide_id); return $this->deleted(); - } - catch (EntityNotFoundException $ex1) - { + } catch (EntityNotFoundException $ex1) { Log::warning($ex1); return $this->error404(); - } - catch (ValidationException $ex2) - { + } catch (ValidationException $ex2) { Log::warning($ex2); return $this->error412($ex2->getMessages()); - } - catch (Exception $ex) - { + } catch (Exception $ex) { Log::error($ex); return $this->error500($ex); } @@ -766,7 +687,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $presentation_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function getPresentationLinks($summit_id, $presentation_id){ + public function getPresentationLinks($summit_id, $presentation_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -779,10 +701,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $links = $presentation->getLinks(); $items = []; - foreach($links as $i) - { - if($i instanceof IEntity) - { + foreach ($links as $i) { + if ($i instanceof IEntity) { $i = SerializerRegistry::getInstance()->getSerializer($i)->serialize(); } $items[] = $i; @@ -808,7 +728,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $link_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function getPresentationLink($summit_id, $presentation_id, $link_id){ + public function getPresentationLink($summit_id, $presentation_id, $link_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); @@ -835,7 +756,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $presentation_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function addPresentationLink(LaravelRequest $request, $summit_id, $presentation_id){ + public function addPresentationLink(LaravelRequest $request, $summit_id, $presentation_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -844,12 +766,12 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $current_member = $this->resource_server_context->getCurrentUser(); if (is_null($current_member)) return $this->error403(); $isAdmin = $current_member->isAdmin() || $current_member->hasPermissionForOnGroup($summit, IGroup::SummitAdministrators); - if(!$isAdmin){ + if (!$isAdmin) { // check if we could edit presentation $presentation = $summit->getEvent($presentation_id); - if(is_null($presentation) || !$presentation instanceof Presentation) + if (is_null($presentation) || !$presentation instanceof Presentation) return $this->error404(); - if(!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) + if (!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) return $this->error403(); } @@ -857,16 +779,9 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $data = MultipartFormDataCleaner::cleanBool('display_on_site', $data); $data = MultipartFormDataCleaner::cleanBool('featured', $data); - $rules = [ - 'link' => 'required|url', - 'name' => 'required|string:512', - 'description' => 'nullable|string', - 'display_on_site' => 'nullable|boolean', - 'featured' => 'nullable|boolean', - ]; // Creates a Validator instance and validates the data. - $validation = Validator::make($data, $rules); + $validation = Validator::make($data, PresentationLinkValidationRulesFactory::build($data)); if ($validation->fails()) { $ex = new ValidationException; @@ -882,19 +797,13 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $link = $this->presentation_service->addLinkTo($presentation_id, HTMLCleaner::cleanData($data, $fields)); return $this->created(SerializerRegistry::getInstance()->getSerializer($link)->serialize()); - } - catch (EntityNotFoundException $ex1) - { + } catch (EntityNotFoundException $ex1) { Log::warning($ex1); return $this->error404(); - } - catch (ValidationException $ex2) - { + } catch (ValidationException $ex2) { Log::warning($ex2); return $this->error412($ex2->getMessages()); - } - catch (Exception $ex) - { + } catch (Exception $ex) { Log::error($ex); return $this->error500($ex); } @@ -907,7 +816,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $link_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function updatePresentationLink(LaravelRequest $request, $summit_id, $presentation_id, $link_id){ + public function updatePresentationLink(LaravelRequest $request, $summit_id, $presentation_id, $link_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -916,12 +826,12 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $current_member = $this->resource_server_context->getCurrentUser(); if (is_null($current_member)) return $this->error403(); $isAdmin = $current_member->isAdmin() || $current_member->hasPermissionForOnGroup($summit, IGroup::SummitAdministrators); - if(!$isAdmin){ + if (!$isAdmin) { // check if we could edit presentation $presentation = $summit->getEvent($presentation_id); - if(is_null($presentation) || !$presentation instanceof Presentation) + if (is_null($presentation) || !$presentation instanceof Presentation) return $this->error404(); - if(!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) + if (!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) return $this->error403(); } @@ -930,17 +840,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $data = MultipartFormDataCleaner::cleanBool('featured', $data); $data = MultipartFormDataCleaner::cleanInt('order', $data); - $rules = [ - 'link' => 'sometimes|required|url', - 'name' => 'sometimes|required|string:512', - 'description' => 'nullable|string', - 'display_on_site' => 'nullable|boolean', - 'featured' => 'nullable|boolean', - 'order' => 'nullable|integer|min:1', - ]; - // Creates a Validator instance and validates the data. - $validation = Validator::make($data, $rules); + $validation = Validator::make($data, PresentationLinkValidationRulesFactory::build($data, true)); if ($validation->fails()) { $ex = new ValidationException; @@ -956,19 +857,13 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $link = $this->presentation_service->updateLink($presentation_id, $link_id, HTMLCleaner::cleanData($data, $fields)); return $this->updated(SerializerRegistry::getInstance()->getSerializer($link)->serialize()); - } - catch (EntityNotFoundException $ex1) - { + } catch (EntityNotFoundException $ex1) { Log::warning($ex1); return $this->error404(); - } - catch (ValidationException $ex2) - { + } catch (ValidationException $ex2) { Log::warning($ex2); return $this->error412($ex2->getMessages()); - } - catch (Exception $ex) - { + } catch (Exception $ex) { Log::error($ex); return $this->error500($ex); } @@ -980,7 +875,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $link_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function deletePresentationLink($summit_id, $presentation_id, $link_id){ + public function deletePresentationLink($summit_id, $presentation_id, $link_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -989,31 +885,25 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $current_member = $this->resource_server_context->getCurrentUser(); if (is_null($current_member)) return $this->error403(); $isAdmin = $current_member->isAdmin() || $current_member->hasPermissionForOnGroup($summit, IGroup::SummitAdministrators); - if(!$isAdmin){ + if (!$isAdmin) { // check if we could edit presentation $presentation = $summit->getEvent($presentation_id); - if(is_null($presentation) || !$presentation instanceof Presentation) + if (is_null($presentation) || !$presentation instanceof Presentation) return $this->error404(); - if(!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) + if (!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) return $this->error403(); } $this->presentation_service->deleteLink($presentation_id, $link_id); return $this->deleted(); - } - catch (EntityNotFoundException $ex1) - { + } catch (EntityNotFoundException $ex1) { Log::warning($ex1); return $this->error404(); - } - catch (ValidationException $ex2) - { + } catch (ValidationException $ex2) { Log::warning($ex2); return $this->error412($ex2->getMessages()); - } - catch (Exception $ex) - { + } catch (Exception $ex) { Log::error($ex); return $this->error500($ex); } @@ -1026,7 +916,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $presentation_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function getPresentationMediaUploads($summit_id, $presentation_id){ + public function getPresentationMediaUploads($summit_id, $presentation_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1039,10 +930,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $mediaUploads = $presentation->getMediaUploads(); $items = []; - foreach($mediaUploads as $i) - { - if($i instanceof IEntity) - { + foreach ($mediaUploads as $i) { + if ($i instanceof IEntity) { $i = SerializerRegistry::getInstance()->getSerializer($i)->serialize(); } $items[] = $i; @@ -1068,7 +957,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $media_upload_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function getPresentationMediaUpload($summit_id, $presentation_id, $media_upload_id){ + public function getPresentationMediaUpload($summit_id, $presentation_id, $media_upload_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); if (is_null($summit)) return $this->error404(); @@ -1095,7 +985,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $presentation_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function addPresentationMediaUpload(LaravelRequest $request, $summit_id, $presentation_id){ + public function addPresentationMediaUpload(LaravelRequest $request, $summit_id, $presentation_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1106,13 +997,13 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $serializeType = SerializerRegistry::SerializerType_Private; $isAdmin = $current_member->isAdmin() || $current_member->hasPermissionForOnGroup($summit, IGroup::SummitAdministrators); - if(!$isAdmin){ + if (!$isAdmin) { $serializeType = SerializerRegistry::SerializerType_Public; // check if we could edit presentation $presentation = $summit->getEvent($presentation_id); - if(is_null($presentation) || !$presentation instanceof Presentation) + if (is_null($presentation) || !$presentation instanceof Presentation) return $this->error404(); - if(!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) + if (!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) return $this->error403(); } @@ -1156,19 +1047,13 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $relations ) ); - } - catch (EntityNotFoundException $ex1) - { + } catch (EntityNotFoundException $ex1) { Log::warning($ex1); return $this->error404(); - } - catch (ValidationException $ex2) - { + } catch (ValidationException $ex2) { Log::warning($ex2); return $this->error412($ex2->getMessages()); - } - catch (Exception $ex) - { + } catch (Exception $ex) { Log::error($ex); return $this->error500($ex); } @@ -1181,7 +1066,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $media_upload_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function updatePresentationMediaUpload(LaravelRequest $request, $summit_id, $presentation_id, $media_upload_id){ + public function updatePresentationMediaUpload(LaravelRequest $request, $summit_id, $presentation_id, $media_upload_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1191,13 +1077,13 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController if (is_null($current_member)) return $this->error403(); $serializeType = SerializerRegistry::SerializerType_Private; $isAdmin = $current_member->isAdmin() || $current_member->hasPermissionForOnGroup($summit, IGroup::SummitAdministrators); - if(!$isAdmin){ + if (!$isAdmin) { $serializeType = SerializerRegistry::SerializerType_Public; // check if we could edit presentation $presentation = $summit->getEvent($presentation_id); - if(is_null($presentation) || !$presentation instanceof Presentation) + if (is_null($presentation) || !$presentation instanceof Presentation) return $this->error404(); - if(!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) + if (!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) return $this->error403(); } @@ -1242,19 +1128,13 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $relations ) ); - } - catch (EntityNotFoundException $ex1) - { + } catch (EntityNotFoundException $ex1) { Log::warning($ex1); return $this->error404(); - } - catch (ValidationException $ex2) - { + } catch (ValidationException $ex2) { Log::warning($ex2); return $this->error412($ex2->getMessages()); - } - catch (Exception $ex) - { + } catch (Exception $ex) { Log::error($ex); return $this->error500($ex); } @@ -1266,7 +1146,8 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController * @param $media_upload_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function deletePresentationMediaUpload($summit_id, $presentation_id, $media_upload_id){ + public function deletePresentationMediaUpload($summit_id, $presentation_id, $media_upload_id) + { try { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -1275,31 +1156,76 @@ final class OAuth2PresentationApiController extends OAuth2ProtectedController $current_member = $this->resource_server_context->getCurrentUser(); if (is_null($current_member)) return $this->error403(); $isAdmin = $current_member->isAdmin() || $current_member->hasPermissionForOnGroup($summit, IGroup::SummitAdministrators); - if(!$isAdmin){ + if (!$isAdmin) { // check if we could edit presentation $presentation = $summit->getEvent($presentation_id); - if(is_null($presentation) || !$presentation instanceof Presentation) + if (is_null($presentation) || !$presentation instanceof Presentation) return $this->error404(); - if(!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) + if (!$current_member->hasSpeaker() || !$presentation->canEdit($current_member->getSpeaker())) return $this->error403(); } $this->presentation_service->deleteMediaUpload($summit, intval($presentation_id), intval($media_upload_id)); return $this->deleted(); - } - catch (EntityNotFoundException $ex1) - { + } catch (EntityNotFoundException $ex1) { Log::warning($ex1); return $this->error404(); - } - catch (ValidationException $ex2) - { + } catch (ValidationException $ex2) { Log::warning($ex2); return $this->error412($ex2->getMessages()); + } catch (Exception $ex) { + Log::error($ex); + return $this->error500($ex); } - catch (Exception $ex) - { + } + + /** + * @param $summit_id + * @return \Illuminate\Http\JsonResponse|mixed + */ + public function importAssetsFromMUX($summit_id) + { + try { + $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); + if (is_null($summit)) return $this->error404(); + + if (!Request::isJson()) return $this->error400(); + + $current_member = $this->resource_server_context->getCurrentUser(); + if (is_null($current_member)) return $this->error403(); + + $data = Input::json(); + $data = $data->all(); + // Creates a Validator instance and validates the data. + $validation = Validator::make($data,[ + 'mux_token_id' => 'required|string', + 'mux_token_secret' => 'required|string', + 'email_to' => 'sometimes|email', + ]); + + if ($validation->fails()) { + $ex = new ValidationException; + $ex->setMessages($validation->messages()->toArray()); + throw $ex; + } + + VideoStreamUrlMUXProcessingForSummitJob::dispatch( + $summit_id, + $data['mux_token_id'], + $data['mux_token_secret'], + $data['email_to'] ?? null + )->delay(now()->addMinutes(1)); + + return $this->ok(); + + } catch (EntityNotFoundException $ex1) { + Log::warning($ex1); + return $this->error404(['message' => $ex1->getMessage()]); + } catch (ValidationException $ex2) { + Log::warning($ex2); + return $this->error412($ex2->getMessages()); + } catch (Exception $ex) { Log::error($ex); return $this->error500($ex); } diff --git a/app/Http/routes.php b/app/Http/routes.php index d024a11d..4bbad850 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -440,6 +440,8 @@ Route::group([ Route::group(['prefix' => 'presentations'], function () { // opened without role CFP - valid selection plan on CFP status Route::post('', 'OAuth2PresentationApiController@submitPresentation'); + // import from mux + Route::post('all/import/mux', 'OAuth2PresentationApiController@importAssetsFromMUX'); Route::group(['prefix' => '{presentation_id}'], function () { diff --git a/app/Jobs/CreateVideosFromMUXAssetsForSummitJob.php b/app/Jobs/CreateVideosFromMUXAssetsForSummitJob.php new file mode 100644 index 00000000..408df6b2 --- /dev/null +++ b/app/Jobs/CreateVideosFromMUXAssetsForSummitJob.php @@ -0,0 +1,89 @@ +summit_id = $summit_id; + $this->email_to = $email_to; + $this->mux_token_id = $mux_token_id; + $this->mux_token_secret = $mux_token_secret; + } + + /** + * @param IPresentationVideoMediaUploadProcessor $service + */ + public function handle(IPresentationVideoMediaUploadProcessor $service){ + + Log::debug(sprintf("CreateVideosFromMUXAssetsForSummit::handle summit %s", $this->summit_id)); + + try { + $service->createVideosFromMUXAssets + ( + $this->summit_id, + new MuxCredentials( + $this->mux_token_id, + $this->mux_token_secret + ), + $this->email_to + ); + } + catch (\Exception $ex){ + Log::error($ex); + } + } +} \ No newline at end of file diff --git a/app/Jobs/VideoStreamUrlMUXProcessingForSummitJob.php b/app/Jobs/VideoStreamUrlMUXProcessingForSummitJob.php new file mode 100644 index 00000000..f3484e8c --- /dev/null +++ b/app/Jobs/VideoStreamUrlMUXProcessingForSummitJob.php @@ -0,0 +1,96 @@ +summit_id = $summit_id; + $this->email_to = $email_to; + $this->mux_token_id = $mux_token_id; + $this->mux_token_secret = $mux_token_secret; + } + + /** + * @param IPresentationVideoMediaUploadProcessor $service + */ + public function handle(IPresentationVideoMediaUploadProcessor $service){ + + Log::debug(sprintf("VideoStreamUrlMUXProcessingForSummitJob::handle summit %s", $this->summit_id)); + + try { + $service->processSummitEventsStreamURLs + ( + $this->summit_id, + new MuxCredentials( + $this->mux_token_id, + $this->mux_token_secret + ), + $this->email_to + ); + } + catch (\Exception $ex){ + Log::error($ex); + } + } +} \ No newline at end of file diff --git a/app/Mail/MUXExportExcerptMail.php b/app/Mail/MUXExportExcerptMail.php new file mode 100644 index 00000000..b8fc6a89 --- /dev/null +++ b/app/Mail/MUXExportExcerptMail.php @@ -0,0 +1,64 @@ +mail_to = $mail_to; + $this->step = $step; + $this->excerpt = $excerpt; + } + + public function build() + { + $subject = sprintf("[%s] Mux Export Process - %s", Config::get('app.tenant_name'), $this->step); + Log::warning(sprintf("MUXExportExcerptMail::build to %s", $this->mail_to)); + return $this->from(Config::get("mail.from")) + ->to($this->mail_to) + ->subject($subject) + ->view('emails.mux_export_excerpt'); + } +} diff --git a/app/ModelSerializers/Summit/Presentation/PresentationVideoSerializer.php b/app/ModelSerializers/Summit/Presentation/PresentationVideoSerializer.php index ef6aee53..e0c03f0e 100644 --- a/app/ModelSerializers/Summit/Presentation/PresentationVideoSerializer.php +++ b/app/ModelSerializers/Summit/Presentation/PresentationVideoSerializer.php @@ -11,6 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ + /** * Class PresentationVideoSerializer * @package ModelSerializers @@ -20,6 +21,7 @@ final class PresentationVideoSerializer extends PresentationMaterialSerializer protected static $array_mappings = [ 'YouTubeID' => 'youtube_id:json_text', + 'ExternalUrl' => 'external_url:json_url', 'DateUploaded' => 'data_uploaded:datetime_epoch', 'Highlighted' => 'highlighted:json_boolean', 'Views' => 'views:json_int', diff --git a/app/Models/Foundation/Summit/Events/Presentations/Materials/PresentationVideo.php b/app/Models/Foundation/Summit/Events/Presentations/Materials/PresentationVideo.php index 25c67a41..753c7006 100644 --- a/app/Models/Foundation/Summit/Events/Presentations/Materials/PresentationVideo.php +++ b/app/Models/Foundation/Summit/Events/Presentations/Materials/PresentationVideo.php @@ -36,6 +36,12 @@ class PresentationVideo extends PresentationMaterial */ private $youtube_id; + /** + * @ORM\Column(name="ExternalUrl", type="string") + * @var string + */ + private $external_url; + /** * @return string */ @@ -124,5 +130,22 @@ class PresentationVideo extends PresentationMaterial $this->highlighted = false; $this->views = 0; $this->date_uploaded = new \DateTime(); + $this->external_url = null; + } + + /** + * @return string + */ + public function getExternalUrl(): ?string + { + return $this->external_url; + } + + /** + * @param string $external_url + */ + public function setExternalUrl(?string $external_url): void + { + $this->external_url = $external_url; } } \ No newline at end of file diff --git a/app/Models/Foundation/Summit/Events/Presentations/Presentation.php b/app/Models/Foundation/Summit/Events/Presentations/Presentation.php index fa1be5d5..7c73a072 100644 --- a/app/Models/Foundation/Summit/Events/Presentations/Presentation.php +++ b/app/Models/Foundation/Summit/Events/Presentations/Presentation.php @@ -372,6 +372,12 @@ class Presentation extends SummitEvent return $this; } + public function getVideosWithExternalUrls(){ + return $this->materials->filter(function ($element) { + return $element instanceof PresentationVideo && !empty($element->getExternalUrl()); + }); + } + /** * @return bool */ diff --git a/app/Models/Foundation/Summit/Factories/PresentationVideoFactory.php b/app/Models/Foundation/Summit/Factories/PresentationVideoFactory.php index 481ac80b..b97089b6 100644 --- a/app/Models/Foundation/Summit/Factories/PresentationVideoFactory.php +++ b/app/Models/Foundation/Summit/Factories/PresentationVideoFactory.php @@ -34,8 +34,13 @@ final class PresentationVideoFactory public static function populate(PresentationVideo $video, array $data){ PresentationMaterialFactory::populate($video, $data); + if(isset($data['youtube_id'])) $video->setYoutubeId(trim($data['youtube_id'])); + + if(isset($data['external_url'])) + $video->setExternalUrl(trim($data['external_url'])); + if($video->getId() == 0) $video->setDateUploaded(new \DateTime()); return $video; diff --git a/app/Services/Apis/MuxCredentials.php b/app/Services/Apis/MuxCredentials.php new file mode 100644 index 00000000..8ef52a2f --- /dev/null +++ b/app/Services/Apis/MuxCredentials.php @@ -0,0 +1,59 @@ +/settings/access-tokens + * Class MuxCredentials + * @package App\Services\Apis + */ +final class MuxCredentials +{ + /** + * @var string + */ + private $token_id; + + /** + * @var string + */ + private $token_secret; + + /** + * MuxCredentials constructor. + * @param string $token_id + * @param string $token_secret + */ + public function __construct(string $token_id, string $token_secret) + { + $this->token_id = $token_id; + $this->token_secret = $token_secret; + } + + /** + * @return string + */ + public function getTokenId(): string + { + return $this->token_id; + } + + /** + * @return string + */ + public function getTokenSecret(): string + { + return $this->token_secret; + } +} \ No newline at end of file diff --git a/app/Services/Model/IPresentationVideoMediaUploadProcessor.php b/app/Services/Model/IPresentationVideoMediaUploadProcessor.php index 4ae018e1..038bb200 100644 --- a/app/Services/Model/IPresentationVideoMediaUploadProcessor.php +++ b/app/Services/Model/IPresentationVideoMediaUploadProcessor.php @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ - +use App\Services\Apis\MuxCredentials; /** * Interface IPresentationVideoMediaUploadProcessor @@ -21,20 +21,48 @@ interface IPresentationVideoMediaUploadProcessor { /** * @param int $summit_id + * @param MuxCredentials $credentials * @param string|null $mountingFolder * @return int */ - public function processPublishedPresentationFor(int $summit_id, ?string $mountingFolder = null):int; + public function processPublishedPresentationFor(int $summit_id, MuxCredentials $credentials, ?string $mountingFolder = null):int; /** * @param int $event_id * @param string|null $mountingFolder + * @param MuxCredentials|null $credentials * @return bool */ - public function processEvent(int $event_id, ?string $mountingFolder):bool; + public function processEvent(int $event_id, ?string $mountingFolder, ?MuxCredentials $credentials = null):bool; /** * @param int $event_id + * @param MuxCredentials|null $credentials */ - public function enableMP4Support(int $event_id):void; + public function enableMP4Support(int $event_id, ?MuxCredentials $credentials = null):void; + + /** + * @param int $summit_id + * @param MuxCredentials $credentials + * @param string|null $mail_to + * @return int + * @throws \Exception + */ + public function processSummitEventsStreamURLs + ( + int $summit_id, + MuxCredentials $credentials, + ?string $mail_to + ):int; + + /** + * @param int $summit_id + * @param MuxCredentials $credentials + * @param string|null $mail_to + * @return int + * @throws \Exception + */ + public function createVideosFromMUXAssets(int $summit_id, + MuxCredentials $credentials, + ?string $mail_to):int; } \ No newline at end of file diff --git a/app/Services/Model/Imp/PresentationVideoMediaUploadProcessor.php b/app/Services/Model/Imp/PresentationVideoMediaUploadProcessor.php index afb99607..05c66c03 100644 --- a/app/Services/Model/Imp/PresentationVideoMediaUploadProcessor.php +++ b/app/Services/Model/Imp/PresentationVideoMediaUploadProcessor.php @@ -12,18 +12,23 @@ * limitations under the License. **/ +use App\Jobs\CreateVideosFromMUXAssetsForSummitJob; +use App\Mail\MUXExportExcerptMail; +use App\Models\Foundation\Summit\Factories\PresentationVideoFactory; use App\Models\Utils\IStorageTypesConstants; +use App\Services\Apis\MuxCredentials; use App\Services\Filesystem\FileDownloadStrategyFactory; use App\Services\Model\AbstractService; use App\Services\Model\IPresentationVideoMediaUploadProcessor; -use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\Log; +use Illuminate\Support\Facades\Mail; use libs\utils\ITransactionService; use models\summit\ISummitEventRepository; -use models\summit\ISummitRepository; use models\summit\Presentation; +use MuxPhp\ApiException; use MuxPhp\Configuration as MuxConfig; use MuxPhp\Api\AssetsApi as MuxAssetApi; +use MuxPhp\Api\PlaybackIDApi as MuxPlaybackIDApi; use GuzzleHttp\Client as GuzzleHttpClient; use MuxPhp\Models\InputSettings as MuxInputSettings; use MuxPhp\Models\CreateAssetRequest as MuxCreateAssetRequest; @@ -38,11 +43,8 @@ final class PresentationVideoMediaUploadProcessor extends AbstractService implements IPresentationVideoMediaUploadProcessor { - /** - * @var ISummitRepository - */ - private $summit_repository; + const MUX_STREAM_REGEX = '/https\:\/\/stream\.mux\.com\/(.*)\.m3u8/'; /** * @var ISummitEventRepository */ @@ -53,47 +55,33 @@ final class PresentationVideoMediaUploadProcessor */ private $assets_api; + /** + * @var MuxPlaybackIDApi + */ + private $playback_api; + public function __construct ( - ISummitRepository $summit_repository, ISummitEventRepository $event_repository, ITransactionService $tx_service ) { parent::__construct($tx_service); - $this->summit_repository = $summit_repository; $this->event_repository = $event_repository; - - $mux_user = Config::get("mux.user", null); - $mux_password = Config::get("mux.password", null); - - if (empty($mux_user)) { - throw new \InvalidArgumentException("missing setting mux.user"); - } - if (empty($mux_password)) { - throw new \InvalidArgumentException("missing setting mux.password"); - } - - // Authentication Setup - $config = MuxConfig::getDefaultConfiguration() - ->setUsername($mux_user) - ->setPassword($mux_password); - - // API Client Initialization - $this->assets_api = new MuxAssetApi( - new GuzzleHttpClient, - $config - ); + $this->assets_api = null; } /** * @param int $summit_id + * @param MuxCredentials $credentials * @param string|null $mountingFolder * @return int * @throws \Exception */ - public function processPublishedPresentationFor(int $summit_id, ?string $mountingFolder = null): int + public function processPublishedPresentationFor(int $summit_id, MuxCredentials $credentials, ?string $mountingFolder = null): int { + $this->_configMux($credentials); + Log::debug(sprintf("PresentationVideoMediaUploadProcessor::processPublishedPresentationFor summit id %s mountingFolder %s", $summit_id, $mountingFolder)); $event_ids = $this->tx_service->transaction(function () use ($summit_id) { return $this->event_repository->getPublishedEventsIdsBySummit($summit_id); @@ -110,11 +98,13 @@ final class PresentationVideoMediaUploadProcessor /** * @param int $event_id * @param string|null $mountingFolder + * @param MuxCredentials|null $credentials * @return bool */ - public function processEvent(int $event_id, ?string $mountingFolder): bool + public function processEvent(int $event_id, ?string $mountingFolder, ?MuxCredentials $credentials = null): bool { try { + $this->_configMux($credentials); return $this->tx_service->transaction(function () use ($event_id, $mountingFolder) { try { $event = $this->event_repository->getByIdExclusiveLock($event_id); @@ -191,8 +181,9 @@ final class PresentationVideoMediaUploadProcessor * @param int $event_id * @throws \Exception */ - public function enableMP4Support(int $event_id): void + public function enableMP4Support(int $event_id, ?MuxCredentials $credentials = null): void { + $this->_configMux($credentials); $this->tx_service->transaction(function () use ($event_id) { $event = $this->event_repository->getByIdExclusiveLock($event_id); if (is_null($event) || !$event instanceof Presentation) { @@ -212,10 +203,256 @@ final class PresentationVideoMediaUploadProcessor return; } - $request = new MuxUpdateAssetMP4SupportRequest(['mp4_support' => MuxUpdateAssetMP4SupportRequest::MP4_SUPPORT_STANDARD]); - $result = $this->assets_api->updateAssetMp4Support($assetId, $request); - - Log::debug(sprintf("PresentationVideoMediaUploadProcessor::enableMP4Support event %s enable mp4 support response %s", $event_id, json_encode($result))); + $this->_enableMP4Support($assetId); }); } + + /** + * @param string $assetId + * @return \MuxPhp\Models\AssetResponse + * @throws \MuxPhp\ApiException + */ + private function _enableMP4Support(string $assetId) + { + try { + $request = new MuxUpdateAssetMP4SupportRequest(['mp4_support' => MuxUpdateAssetMP4SupportRequest::MP4_SUPPORT_STANDARD]); + $result = $this->assets_api->updateAssetMp4Support($assetId, $request); + $tracks = $result->getData()->getTracks(); + Log::debug + ( + sprintf + ( + "PresentationVideoMediaUploadProcessor::_enableMP4Support asset id %s enable mp4 support response %s", + $assetId, + json_encode($tracks) + ) + ); + + return $tracks; + } + catch(ApiException $ex){ + Log::warning($ex); + $response = json_decode($ex->getResponseBody()); + if(count($response->error->messages) > 0){ + if($response->error->messages[0] == "Download already exists"){ + return null; + } + } + throw $ex; + } + } + + + private function _configMux(MuxCredentials $credentials) + { + if (!is_null($this->assets_api)) return; + + // Authentication Setup + $config = MuxConfig::getDefaultConfiguration() + ->setUsername($credentials->getTokenId()) + ->setPassword($credentials->getTokenSecret()); + + // API Client Initialization + $this->assets_api = new MuxAssetApi( + new GuzzleHttpClient, + $config + ); + + $this->playback_api = new MuxPlaybackIDApi( + new GuzzleHttpClient, + $config + ); + } + + /** + * @param int $summit_id + * @param MuxCredentials $credentials + * @param string|null $mail_to + * @return int + * @throws \Exception + */ + public function processSummitEventsStreamURLs + ( + int $summit_id, + MuxCredentials $credentials, + ?string $mail_to + ): int + { + $event_ids = $this->tx_service->transaction(function () use ($summit_id) { + return $this->event_repository->getPublishedEventsIdsBySummit($summit_id); + }); + + $this->_configMux($credentials); + $excerpt = 'Starting MUX Assets Enabling MP4 Support Process.'.PHP_EOL; + + foreach ($event_ids as $event_id) { + Log::warning(sprintf("PresentationVideoMediaUploadProcessor::processMuxAssetsFromStreamUrl processing event %s", $event_id)); + try { + $this->tx_service->transaction(function () use ($event_id, $credentials, &$excerpt) { + try { + + $event = $this->event_repository->getByIdExclusiveLock($event_id); + if (is_null($event) || !$event instanceof Presentation) { + Log::warning(sprintf("PresentationVideoMediaUploadProcessor::processMuxAssetsFromStreamUrl event %s not found", $event_id)); + return false; + } + + if (!$event->isPublished()) { + Log::warning(sprintf("PresentationVideoMediaUploadProcessor::processMuxAssetsFromStreamUrl event %s not published", $event_id)); + $excerpt .= sprintf("event %s not published", $event_id) . PHP_EOL; + return false; + } + + if (!empty($event->getMuxAssetId())) { + $excerpt .= sprintf("event %s - mux asset id (%s) - already has enabled mp4 support.", $event_id, $event->getMuxAssetId()) . PHP_EOL; + return false; + } + $stream_url = $event->getStreamingUrl(); + // test $stream_url + if (!preg_match(self::MUX_STREAM_REGEX, $stream_url, $matches)) { + Log::warning(sprintf("PresentationVideoMediaUploadProcessor::processMuxAssetsFromStreamUrl event %s stream url does not match mux format (%s)", $event_id, $stream_url)); + $excerpt .= sprintf("event %s stream url does not match mux format (%s)", $event_id, $stream_url) . PHP_EOL; + } + + $playback_id = $matches[1]; + $event->setMuxPlaybackId($playback_id); + $playbackResponse = $this->playback_api->getAssetOrLivestreamId($playback_id); + $asset_id = $playbackResponse->getData()->getObject()->getId(); + $event->setMuxAssetId($asset_id); + $assetResponse = $this->assets_api->getAsset($asset_id); + $staticRenditions = $assetResponse->getData()->getStaticRenditions(); + if(!is_null($staticRenditions)){ + $excerpt .= sprintf("event %s - mux asset id (%s) - has already enabled mp4 support.", $event_id, $asset_id) . PHP_EOL; + return false; + } + $this->_enableMP4Support($asset_id); + $excerpt .= sprintf("event %s - mux asset id (%s) - has been enabled mp4 support.", $event_id, $asset_id) . PHP_EOL; + } + catch (\Exception $ex) { + $excerpt .= sprintf("event %s - error on enabling mp4 support.", $event_id) . PHP_EOL; + Log::warning($ex); + throw $ex; + } + }); + } catch (\Exception $ex) { + Log::error($ex); + } + } + + $excerpt .= sprintf("%s events processed.", count($event_ids)) . PHP_EOL; + + if (!empty($mail_to)) + Mail::queue(new MUXExportExcerptMail($mail_to, "MUX Assets MP4 Enabling Process", $excerpt)); + + // fire exporting + // @see https://docs.mux.com/guides/video/download-your-videos#download-videos + CreateVideosFromMUXAssetsForSummitJob::dispatch( + $summit_id, + $credentials->getTokenId(), + $credentials->getTokenSecret(), + $mail_to + )->delay(now()->addMinutes(30)); + + return count($event_ids); + } + + /** + * @param int $summit_id + * @param MuxCredentials $credentials + * @param string|null $mail_to + * @return int + * @throws \Exception + */ + public function createVideosFromMUXAssets(int $summit_id, + MuxCredentials $credentials, + ?string $mail_to): int + { + + $event_ids = $this->tx_service->transaction(function () use ($summit_id) { + return $this->event_repository->getPublishedEventsIdsBySummit($summit_id); + }); + + $this->_configMux($credentials); + $excerpt = 'Starting Create Videos From MUX Assets Process.'.PHP_EOL; + + foreach ($event_ids as $event_id) { + $this->tx_service->transaction(function () use ($event_id, $credentials, &$excerpt) { + try { + + $event = $this->event_repository->getByIdExclusiveLock($event_id); + if (is_null($event) || !$event instanceof Presentation) { + Log::warning(sprintf("PresentationVideoMediaUploadProcessor::createVideosFromMUXAssets event %s not found", $event_id)); + return false; + } + + if (!$event->isPublished()) { + Log::warning(sprintf("PresentationVideoMediaUploadProcessor::createVideosFromMUXAssets event %s not published", $event_id)); + $excerpt .= sprintf("event %s not published.", $event_id) . PHP_EOL; + return false; + } + + if ($event->getVideosWithExternalUrls()->count() > 0) { + $excerpt .= sprintf("event %s already processed.", $event_id) . PHP_EOL; + return false; + } + + $assetId = $event->getMuxAssetId(); + if(empty($assetId)){ + $excerpt .= sprintf("event %s not processed.", $event_id) . PHP_EOL; + return false; + } + + $result = $this->assets_api->getAsset($assetId); + $staticRenditions = $result->getData()->getStaticRenditions(); + + if(is_null($staticRenditions)){ + $excerpt .= sprintf("event %s - mp4 not enabled.", $event_id) . PHP_EOL; + return false; + } + + if ($staticRenditions->getStatus() != 'ready') { + $excerpt .= sprintf("event %s - transcoding not ready (%s)", $event_id, $staticRenditions->getStatus()) . PHP_EOL; + return false; + } + + $bestFile = null; + + $fileNames = [ + 'low.mp4', + 'medium.mp4', + 'high.mp4', + ]; + + foreach ($staticRenditions->getFiles() as $file) { + if (is_null($bestFile)) $bestFile = $file; + if (array_search($bestFile->getName(), $fileNames) < array_search($file->getName(), $fileNames)) { + $bestFile = $file; + } + } + if (is_null($bestFile)) { + $excerpt .= sprintf("event %s - transcoding not ready (%s).", $event_id, $staticRenditions->getStatus()) . PHP_EOL; + return 0; + }; + $newVideo = PresentationVideoFactory::build([ + 'name' => $event->getTitle(), + 'external_url' => sprintf("https://stream.mux.com/%s/%s", $event->getMuxPlaybackId(), $bestFile->getName()) + ]); + + $event->addVideo($newVideo); + + } catch (\Exception $ex) { + $excerpt .= sprintf("event %s - error on exporting mux asset.", $event_id) . PHP_EOL; + Log::warning($ex); + throw $ex; + } + }); + } + + $excerpt .= sprintf("%s events processed.", count($event_ids)) . PHP_EOL; + + if (!empty($mail_to)) + Mail::queue(new MUXExportExcerptMail($mail_to, "Videos Creation Process", $excerpt)); + + return count($event_ids); + } } \ No newline at end of file diff --git a/composer.json b/composer.json index f3070901..b2fff89c 100644 --- a/composer.json +++ b/composer.json @@ -27,7 +27,7 @@ "fideloper/proxy": "^4.0", "glenscott/url-normalizer": "^1.4", "google/apiclient": "^2.2", - "guzzlehttp/guzzle": "^6.3", + "guzzlehttp/guzzle": "^7", "laravel-doctrine/extensions": "1.0.*", "laravel-doctrine/migrations": "^1.2", "laravel-doctrine/orm": "1.4.*", @@ -35,15 +35,13 @@ "laravel/tinker": "^1.0", "league/csv": "^9.6", "league/oauth2-client": "^2.4", - "muxinc/mux-php": "^0.5.0", + "muxinc/mux-php": "^0.9.0", "php-amqplib/php-amqplib": "^2.11", "php-opencloud/openstack": "dev-master", "pion/laravel-chunk-upload": "^1.4", "predis/predis": "1.0.*", "s-ichikawa/laravel-sendgrid-driver": "^2.0", "simplesoftwareio/simple-qrcode": "^2.0", - "smarcet/caldavclient": "1.1.6", - "smarcet/outlook-rest-client": "dev-master", "sokil/php-isocodes": "^3.0", "spatie/flysystem-dropbox": "^1.2", "spatie/laravel-cors": "^1.6", diff --git a/composer.lock b/composer.lock index fa838e8d..608683cb 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "3fd5cdf7f2eda097e7f6ac6ea068aefb", + "content-hash": "d69d9cd7118942b7482145f29363535a", "packages": [ { "name": "aws/aws-sdk-php", - "version": "3.161.1", + "version": "3.183.9", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "4c1852e9efaef18e15f2a6c914d8dc41fda2a052" + "reference": "3b3aafdceac4cb820e2ae65a8785e4d07db471a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4c1852e9efaef18e15f2a6c914d8dc41fda2a052", - "reference": "4c1852e9efaef18e15f2a6c914d8dc41fda2a052", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/3b3aafdceac4cb820e2ae65a8785e4d07db471a7", + "reference": "3b3aafdceac4cb820e2ae65a8785e4d07db471a7", "shasum": "" }, "require": { @@ -25,9 +25,9 @@ "ext-pcre": "*", "ext-simplexml": "*", "guzzlehttp/guzzle": "^5.3.3|^6.2.1|^7.0", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.4.1", - "mtdowling/jmespath.php": "^2.5", + "guzzlehttp/promises": "^1.4.0", + "guzzlehttp/psr7": "^1.7.0", + "mtdowling/jmespath.php": "^2.6", "php": ">=5.5" }, "require-dev": { @@ -89,7 +89,7 @@ "s3", "sdk" ], - "time": "2020-11-13T19:17:55+00:00" + "time": "2021-05-28T18:28:19+00:00" }, { "name": "bacon/bacon-qr-code", @@ -281,35 +281,32 @@ }, { "name": "doctrine/annotations", - "version": "1.11.1", + "version": "1.13.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad" + "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/ce77a7ba1770462cd705a91a151b6c3746f9c6ad", - "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", + "reference": "e6e7b7d5b45a2f2abc5460cc6396480b2b1d321f", "shasum": "" }, "require": { "doctrine/lexer": "1.*", "ext-tokenizer": "*", - "php": "^7.1 || ^8.0" + "php": "^7.1 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" }, "require-dev": { - "doctrine/cache": "1.*", + "doctrine/cache": "^1.11 || ^2.0", "doctrine/coding-standard": "^6.0 || ^8.1", "phpstan/phpstan": "^0.12.20", - "phpunit/phpunit": "^7.5 || ^9.1.5" + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.1.5", + "symfony/cache": "^4.4 || ^5.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.11.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" @@ -348,44 +345,43 @@ "docblock", "parser" ], - "time": "2020-10-26T10:28:16+00:00" + "time": "2021-05-16T18:07:53+00:00" }, { "name": "doctrine/cache", - "version": "1.10.2", + "version": "1.11.3", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "13e3381b25847283a91948d04640543941309727" + "reference": "3bb5588cec00a0268829cc4a518490df6741af9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727", - "reference": "13e3381b25847283a91948d04640543941309727", + "url": "https://api.github.com/repos/doctrine/cache/zipball/3bb5588cec00a0268829cc4a518490df6741af9d", + "reference": "3bb5588cec00a0268829cc4a518490df6741af9d", "shasum": "" }, "require": { "php": "~7.1 || ^8.0" }, "conflict": { - "doctrine/common": ">2.2,<2.4" + "doctrine/common": ">2.2,<2.4", + "psr/cache": ">=3" }, "require-dev": { "alcaeus/mongo-php-adapter": "^1.1", - "doctrine/coding-standard": "^6.0", + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^8.0", "mongodb/mongodb": "^1.1", - "phpunit/phpunit": "^7.0", - "predis/predis": "~1.0" + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "predis/predis": "~1.0", + "psr/cache": "^1.0 || ^2.0", + "symfony/cache": "^4.4 || ^5.2" }, "suggest": { "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.9.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" @@ -430,7 +426,7 @@ "redis", "xcache" ], - "time": "2020-07-07T18:54:01+00:00" + "time": "2021-05-25T09:01:55+00:00" }, { "name": "doctrine/collections", @@ -582,33 +578,33 @@ }, { "name": "doctrine/dbal", - "version": "2.10.4", + "version": "2.13.1", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "47433196b6390d14409a33885ee42b6208160643" + "reference": "c800380457948e65bbd30ba92cc17cda108bf8c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/47433196b6390d14409a33885ee42b6208160643", - "reference": "47433196b6390d14409a33885ee42b6208160643", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/c800380457948e65bbd30ba92cc17cda108bf8c9", + "reference": "c800380457948e65bbd30ba92cc17cda108bf8c9", "shasum": "" }, "require": { "doctrine/cache": "^1.0", + "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.0", "ext-pdo": "*", - "php": "^7.2" + "php": "^7.1 || ^8" }, "require-dev": { - "doctrine/coding-standard": "^8.1", - "jetbrains/phpstorm-stubs": "^2019.1", - "nikic/php-parser": "^4.4", - "phpstan/phpstan": "^0.12.40", - "phpunit/phpunit": "^8.5.5", - "psalm/plugin-phpunit": "^0.10.0", + "doctrine/coding-standard": "8.2.0", + "jetbrains/phpstorm-stubs": "2020.2", + "phpstan/phpstan": "0.12.81", + "phpunit/phpunit": "^7.5.20|^8.5|9.5.0", + "squizlabs/php_codesniffer": "3.6.0", "symfony/console": "^2.0.5|^3.0|^4.0|^5.0", - "vimeo/psalm": "^3.14.2" + "vimeo/psalm": "4.6.4" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -617,12 +613,6 @@ "bin/doctrine-dbal" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.10.x-dev", - "dev-develop": "3.0.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\DBAL\\": "lib/Doctrine/DBAL" @@ -673,7 +663,46 @@ "sqlserver", "sqlsrv" ], - "time": "2020-09-12T21:20:41+00:00" + "time": "2021-04-17T17:30:19+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v0.5.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/9504165960a1f83cc1480e2be1dd0a0478561314", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0|^7.0|^8.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "time": "2021-03-21T12:59:47+00:00" }, { "name": "doctrine/event-manager", @@ -753,26 +782,26 @@ }, { "name": "doctrine/inflector", - "version": "1.4.3", + "version": "1.4.4", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c" + "reference": "4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/4650c8b30c753a76bf44fb2ed00117d6f367490c", - "reference": "4650c8b30c753a76bf44fb2ed00117d6f367490c", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9", + "reference": "4bd5c1cdfcd00e9e2d8c484f79150f67e5d355d9", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^7.0", - "phpstan/phpstan": "^0.11", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-strict-rules": "^0.11", + "doctrine/coding-standard": "^8.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "type": "library", @@ -827,7 +856,7 @@ "uppercase", "words" ], - "time": "2020-05-29T07:19:59+00:00" + "time": "2021-04-16T17:34:40+00:00" }, { "name": "doctrine/instantiator", @@ -1314,27 +1343,27 @@ }, { "name": "egulias/email-validator", - "version": "2.1.24", + "version": "3.1.1", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "ca90a3291eee1538cd48ff25163240695bd95448" + "reference": "c81f18a3efb941d8c4d2e025f6183b5c6d697307" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ca90a3291eee1538cd48ff25163240695bd95448", - "reference": "ca90a3291eee1538cd48ff25163240695bd95448", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/c81f18a3efb941d8c4d2e025f6183b5c6d697307", + "reference": "c81f18a3efb941d8c4d2e025f6183b5c6d697307", "shasum": "" }, "require": { - "doctrine/lexer": "^1.0.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.10" + "doctrine/lexer": "^1.2", + "php": ">=7.2", + "symfony/polyfill-intl-idn": "^1.15" }, "require-dev": { - "dominicsayers/isemail": "^3.0.7", - "phpunit/phpunit": "^4.8.36|^7.5.15", - "satooshi/php-coveralls": "^1.0.1" + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^8.5.8|^9.3.3", + "vimeo/psalm": "^4" }, "suggest": { "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" @@ -1342,7 +1371,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1.x-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -1368,63 +1397,7 @@ "validation", "validator" ], - "time": "2020-11-14T15:56:27+00:00" - }, - { - "name": "eluceo/ical", - "version": "0.11.6", - "source": { - "type": "git", - "url": "https://github.com/markuspoerschke/iCal.git", - "reference": "e22ef0fad1a19ad1bbffd819f21fa6a83f96531c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/markuspoerschke/iCal/zipball/e22ef0fad1a19ad1bbffd819f21fa6a83f96531c", - "reference": "e22ef0fad1a19ad1bbffd819f21fa6a83f96531c", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.3" - }, - "suggest": { - "ext-mbstring": "Massive performance enhancement of line folding" - }, - "type": "library", - "autoload": { - "psr-0": { - "Eluceo\\iCal": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Maciej Łebkowski", - "email": "m.lebkowski@gmail.com", - "role": "Contributor" - }, - { - "name": "Markus Poerschke", - "email": "markus@eluceo.de", - "role": "Developer" - } - ], - "description": "The eluceo/iCal package offers a abstraction layer for creating iCalendars. You can easily create iCal files by using PHP object instead of typing your *.ics file by hand. The output will follow RFC 2445 as best as possible.", - "homepage": "https://github.com/markuspoerschke/iCal", - "keywords": [ - "calendar", - "iCalendar", - "ical", - "ics", - "php calendar" - ], - "time": "2018-04-30T07:46:32+00:00" + "time": "2021-04-01T18:37:14+00:00" }, { "name": "erusev/parsedown", @@ -1572,16 +1545,16 @@ }, { "name": "firebase/php-jwt", - "version": "v5.2.0", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb" + "reference": "3c2d70f2e64e2922345e89f2ceae47d2463faae1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/feb0e820b8436873675fd3aca04f3728eb2185cb", - "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/3c2d70f2e64e2922345e89f2ceae47d2463faae1", + "reference": "3c2d70f2e64e2922345e89f2ceae47d2463faae1", "shasum": "" }, "require": { @@ -1618,7 +1591,7 @@ "jwt", "php" ], - "time": "2020-03-25T18:49:23+00:00" + "time": "2021-05-20T17:37:02+00:00" }, { "name": "glenscott/url-normalizer", @@ -1659,34 +1632,34 @@ }, { "name": "google/apiclient", - "version": "v2.8.2", + "version": "v2.9.1", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client.git", - "reference": "24f3ec0c79567a08c31f8271b61d79b050b25b0a" + "reference": "2fb6e702aca5d68203fa737f89f6f774022494c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/24f3ec0c79567a08c31f8271b61d79b050b25b0a", - "reference": "24f3ec0c79567a08c31f8271b61d79b050b25b0a", + "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/2fb6e702aca5d68203fa737f89f6f774022494c6", + "reference": "2fb6e702aca5d68203fa737f89f6f774022494c6", "shasum": "" }, "require": { "firebase/php-jwt": "~2.0||~3.0||~4.0||~5.0", "google/apiclient-services": "~0.13", "google/auth": "^1.10", - "guzzlehttp/guzzle": "~5.3.1||~6.0||~7.0", + "guzzlehttp/guzzle": "~5.3.3||~6.0||~7.0", "guzzlehttp/psr7": "^1.2", "monolog/monolog": "^1.17|^2.0", - "php": ">=5.4", - "phpseclib/phpseclib": "~0.3.10||~2.0" + "php": "^5.6|^7.0|^8.0", + "phpseclib/phpseclib": "~2.0||^3.0.2" }, "require-dev": { - "cache/filesystem-adapter": "^0.3.2", + "cache/filesystem-adapter": "^0.3.2|^1.1", "composer/composer": "^1.10", "dealerdirect/phpcodesniffer-composer-installer": "^0.7", "phpcompatibility/php-compatibility": "^9.2", - "phpunit/phpunit": "^4.8.36|^5.0", + "phpunit/phpunit": "^5.7||^8.5.13", "squizlabs/php_codesniffer": "~2.3", "symfony/css-selector": "~2.1", "symfony/dom-crawler": "~2.1" @@ -1720,20 +1693,20 @@ "keywords": [ "google" ], - "time": "2020-11-11T17:07:53+00:00" + "time": "2021-01-19T17:48:59+00:00" }, { "name": "google/apiclient-services", - "version": "v0.153", + "version": "v0.177.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "db62bb19f32f81c9551f223c72be0682eb58ebd8" + "reference": "316cbf9b02c575a140d8cbeca48a3ca0070fcd5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/db62bb19f32f81c9551f223c72be0682eb58ebd8", - "reference": "db62bb19f32f81c9551f223c72be0682eb58ebd8", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/316cbf9b02c575a140d8cbeca48a3ca0070fcd5a", + "reference": "316cbf9b02c575a140d8cbeca48a3ca0070fcd5a", "shasum": "" }, "require": { @@ -1757,20 +1730,20 @@ "keywords": [ "google" ], - "time": "2020-11-01T00:25:23+00:00" + "time": "2021-05-15T11:18:02+00:00" }, { "name": "google/auth", - "version": "v1.14.3", + "version": "v1.15.1", "source": { "type": "git", "url": "https://github.com/googleapis/google-auth-library-php.git", - "reference": "c1503299c779af0cbc99b43788f75930988852cf" + "reference": "4e0c9367719df9703e96f5ad613041b87742471c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/c1503299c779af0cbc99b43788f75930988852cf", - "reference": "c1503299c779af0cbc99b43788f75930988852cf", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/4e0c9367719df9703e96f5ad613041b87742471c", + "reference": "4e0c9367719df9703e96f5ad613041b87742471c", "shasum": "" }, "require": { @@ -1783,8 +1756,8 @@ }, "require-dev": { "guzzlehttp/promises": "0.1.1|^1.3", - "kelvinmo/simplejwt": "^0.2.5", - "phpseclib/phpseclib": "^2", + "kelvinmo/simplejwt": "^0.2.5|^0.5.1", + "phpseclib/phpseclib": "^2.0.31", "phpunit/phpunit": "^4.8.36|^5.7", "sebastian/comparator": ">=1.2.3", "squizlabs/php_codesniffer": "^3.5" @@ -1809,36 +1782,31 @@ "google", "oauth2" ], - "time": "2020-10-16T21:33:48+00:00" + "time": "2021-04-21T17:42:05+00:00" }, { "name": "graham-campbell/guzzle-factory", - "version": "v3.0.4", + "version": "v5.0.0", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Guzzle-Factory.git", - "reference": "618cf7220b177c6d9939a36331df937739ffc596" + "reference": "5f6eae0dba2f2a02d72d42f11f3ff9f9f61e1cc8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Guzzle-Factory/zipball/618cf7220b177c6d9939a36331df937739ffc596", - "reference": "618cf7220b177c6d9939a36331df937739ffc596", + "url": "https://api.github.com/repos/GrahamCampbell/Guzzle-Factory/zipball/5f6eae0dba2f2a02d72d42f11f3ff9f9f61e1cc8", + "reference": "5f6eae0dba2f2a02d72d42f11f3ff9f9f61e1cc8", "shasum": "" }, "require": { - "guzzlehttp/guzzle": "^6.2", - "php": "^7.0|^8.0" + "guzzlehttp/guzzle": "^7.2", + "php": "^7.2.5 || ^8.0" }, "require-dev": { - "graham-campbell/analyzer": "^2.4", - "phpunit/phpunit": "^6.5|^7.0|^8.0" + "graham-campbell/analyzer": "^3.0.4", + "phpunit/phpunit": "^8.5.8 || ^9.3.7" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, "autoload": { "psr-4": { "GrahamCampbell\\GuzzleFactory\\": "src/" @@ -1863,41 +1831,48 @@ "Guzzle-Factory", "http" ], - "time": "2020-05-02T14:45:48+00:00" + "time": "2021-01-24T20:39:09+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "6.5.5", + "version": "7.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" + "reference": "7008573787b430c1c1f650e3722d9bba59967628" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", - "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/7008573787b430c1c1f650e3722d9bba59967628", + "reference": "7008573787b430c1c1f650e3722d9bba59967628", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.6.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.17.0" + "guzzlehttp/promises": "^1.4", + "guzzlehttp/psr7": "^1.7 || ^2.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.5 || ^9.3.5", "psr/log": "^1.1" }, "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.5-dev" + "dev-master": "7.3-dev" } }, "autoload": { @@ -1917,6 +1892,11 @@ "name": "Michael Dowling", "email": "mtdowling@gmail.com", "homepage": "https://github.com/mtdowling" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], "description": "Guzzle is a PHP HTTP client library", @@ -1927,23 +1907,25 @@ "framework", "http", "http client", + "psr-18", + "psr-7", "rest", "web service" ], - "time": "2020-06-16T21:01:06+00:00" + "time": "2021-03-23T11:33:13+00:00" }, { "name": "guzzlehttp/promises", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "60d379c243457e073cff02bc323a2a86cb355631" + "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631", - "reference": "60d379c243457e073cff02bc323a2a86cb355631", + "url": "https://api.github.com/repos/guzzle/promises/zipball/8e7d04f1f6450fef59366c399cfad4b9383aa30d", + "reference": "8e7d04f1f6450fef59366c399cfad4b9383aa30d", "shasum": "" }, "require": { @@ -1981,20 +1963,20 @@ "keywords": [ "promise" ], - "time": "2020-09-30T07:37:28+00:00" + "time": "2021-03-07T09:25:29+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.7.0", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3" + "reference": "dc960a912984efb74d0a90222870c72c87f10c91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3", - "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/dc960a912984efb74d0a90222870c72c87f10c91", + "reference": "dc960a912984efb74d0a90222870c72c87f10c91", "shasum": "" }, "require": { @@ -2052,7 +2034,60 @@ "uri", "url" ], - "time": "2020-09-30T07:37:11+00:00" + "time": "2021-04-26T09:17:50+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v0.2.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/uri-template.git", + "reference": "db46525d6d8fee71033b73cc07160f3e5271a8ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/uri-template/zipball/db46525d6d8fee71033b73cc07160f3e5271a8ce", + "reference": "db46525d6d8fee71033b73cc07160f3e5271a8ce", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos", + "role": "Developer" + } + ], + "description": "A polyfill class for uri_template of PHP", + "homepage": "https://github.com/guzzlehttp/uri-template", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "time": "2020-07-21T13:45:09+00:00" }, { "name": "jakub-onderka/php-console-color", @@ -2666,22 +2701,22 @@ }, { "name": "league/csv", - "version": "9.6.1", + "version": "9.6.2", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "634322df4aed210fdfbb7c94e434dc860da733d9" + "reference": "f28da6e483bf979bac10e2add384c90ae9983e4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/634322df4aed210fdfbb7c94e434dc860da733d9", - "reference": "634322df4aed210fdfbb7c94e434dc860da733d9", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/f28da6e483bf979bac10e2add384c90ae9983e4e", + "reference": "f28da6e483bf979bac10e2add384c90ae9983e4e", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", - "php": "^7.2.5" + "php": ">=7.2.5" }, "require-dev": { "ext-curl": "*", @@ -2734,7 +2769,7 @@ "transform", "write" ], - "time": "2020-09-05T08:40:12+00:00" + "time": "2020-12-10T19:40:30+00:00" }, { "name": "league/flysystem", @@ -2870,16 +2905,16 @@ }, { "name": "league/mime-type-detection", - "version": "1.5.1", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "353f66d7555d8a90781f6f5e7091932f9a4250aa" + "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/353f66d7555d8a90781f6f5e7091932f9a4250aa", - "reference": "353f66d7555d8a90781f6f5e7091932f9a4250aa", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3", + "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3", "shasum": "" }, "require": { @@ -2887,8 +2922,9 @@ "php": "^7.2 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.36", - "phpunit/phpunit": "^8.5.8" + "friendsofphp/php-cs-fixer": "^2.18", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3" }, "type": "library", "autoload": { @@ -2907,7 +2943,7 @@ } ], "description": "Mime-type detection for Flysystem", - "time": "2020-10-18T11:50:25+00:00" + "time": "2021-01-18T20:58:21+00:00" }, { "name": "league/oauth2-client", @@ -2977,16 +3013,16 @@ }, { "name": "monolog/monolog", - "version": "1.25.5", + "version": "1.26.1", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "1817faadd1846cd08be9a49e905dc68823bc38c0" + "reference": "c6b00f05152ae2c9b04a448f99c7590beb6042f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1817faadd1846cd08be9a49e905dc68823bc38c0", - "reference": "1817faadd1846cd08be9a49e905dc68823bc38c0", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c6b00f05152ae2c9b04a448f99c7590beb6042f5", + "reference": "c6b00f05152ae2c9b04a448f99c7590beb6042f5", "shasum": "" }, "require": { @@ -3002,7 +3038,7 @@ "graylog2/gelf-php": "~1.0", "php-amqplib/php-amqplib": "~2.4", "php-console/php-console": "^3.1.3", - "php-parallel-lint/php-parallel-lint": "^1.0", + "phpstan/phpstan": "^0.12.59", "phpunit/phpunit": "~4.5", "ruflin/elastica": ">=0.90 <3.0", "sentry/sentry": "^0.13", @@ -3022,11 +3058,6 @@ "sentry/sentry": "Allow sending log messages to a Sentry server" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, "autoload": { "psr-4": { "Monolog\\": "src/Monolog" @@ -3050,7 +3081,7 @@ "logging", "psr-3" ], - "time": "2020-07-23T08:35:51+00:00" + "time": "2021-05-28T08:32:12+00:00" }, { "name": "mtdowling/jmespath.php", @@ -3111,24 +3142,24 @@ }, { "name": "muxinc/mux-php", - "version": "0.5.0", + "version": "0.9.0", "source": { "type": "git", "url": "https://github.com/muxinc/mux-php.git", - "reference": "b9894ee7003f2caf2e74366c4dfb19736832077f" + "reference": "7e7710bfc77335ca336527a3a3e26f4be6dff6f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/muxinc/mux-php/zipball/b9894ee7003f2caf2e74366c4dfb19736832077f", - "reference": "b9894ee7003f2caf2e74366c4dfb19736832077f", + "url": "https://api.github.com/repos/muxinc/mux-php/zipball/7e7710bfc77335ca336527a3a3e26f4be6dff6f5", + "reference": "7e7710bfc77335ca336527a3a3e26f4be6dff6f5", "shasum": "" }, "require": { "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "guzzlehttp/guzzle": "^6.2", - "php": ">=7.1" + "guzzlehttp/guzzle": "^7", + "php": ">=7.2.5" }, "require-dev": { "friendsofphp/php-cs-fixer": "~2.12", @@ -3161,7 +3192,7 @@ "streaming", "video" ], - "time": "2020-09-10T18:53:57+00:00" + "time": "2021-03-17T18:06:14+00:00" }, { "name": "nesbot/carbon", @@ -3221,16 +3252,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.10.2", + "version": "v4.10.5", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "658f1be311a230e0907f5dfe0213742aff0596de" + "reference": "4432ba399e47c66624bc73c8c0f811e5c109576f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/658f1be311a230e0907f5dfe0213742aff0596de", - "reference": "658f1be311a230e0907f5dfe0213742aff0596de", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4432ba399e47c66624bc73c8c0f811e5c109576f", + "reference": "4432ba399e47c66624bc73c8c0f811e5c109576f", "shasum": "" }, "require": { @@ -3269,7 +3300,7 @@ "parser", "php" ], - "time": "2020-09-26T10:30:38+00:00" + "time": "2021-05-03T19:11:20+00:00" }, { "name": "ocramius/package-versions", @@ -3391,6 +3422,68 @@ ], "time": "2019-08-10T08:37:15+00:00" }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c", + "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c", + "shasum": "" + }, + "require": { + "php": "^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "time": "2020-12-06T15:14:20+00:00" + }, { "name": "paragonie/random_compat", "version": "v9.99.99", @@ -3438,23 +3531,23 @@ }, { "name": "php-amqplib/php-amqplib", - "version": "v2.12.1", + "version": "v2.12.3", "source": { "type": "git", "url": "https://github.com/php-amqplib/php-amqplib.git", - "reference": "0eaaa9d5d45335f4342f69603288883388c2fe21" + "reference": "f746eb44df6d8f838173729867dd1d20b0265faa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/0eaaa9d5d45335f4342f69603288883388c2fe21", - "reference": "0eaaa9d5d45335f4342f69603288883388c2fe21", + "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/f746eb44df6d8f838173729867dd1d20b0265faa", + "reference": "f746eb44df6d8f838173729867dd1d20b0265faa", "shasum": "" }, "require": { "ext-mbstring": "*", "ext-sockets": "*", - "php": ">=5.6.3", - "phpseclib/phpseclib": "^2.0.0" + "php": ">=5.6.3,<8.0", + "phpseclib/phpseclib": "^2.0|^3.0" }, "conflict": { "php": "7.4.0 - 7.4.1" @@ -3466,7 +3559,7 @@ "ext-curl": "*", "nategood/httpful": "^0.2.20", "phpunit/phpunit": "^5.7|^6.5|^7.0", - "squizlabs/php_codesniffer": "^2.5" + "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { @@ -3511,7 +3604,7 @@ "queue", "rabbitmq" ], - "time": "2020-09-25T18:34:58+00:00" + "time": "2021-03-01T12:21:31+00:00" }, { "name": "php-opencloud/openstack", @@ -3528,15 +3621,16 @@ "shasum": "" }, "require": { - "guzzlehttp/guzzle": "^6.1", + "guzzlehttp/guzzle": "^7.0", + "guzzlehttp/uri-template": "0.2", "justinrainbow/json-schema": "^5.2", - "php": "~7.0" + "php": "^7.2.5|^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.13", - "jakub-onderka/php-parallel-lint": "^1.0", + "friendsofphp/php-cs-fixer": "^2.18", "php-coveralls/php-coveralls": "^2.0", - "phpunit/phpunit": "^6.5", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpunit/phpunit": "^8.0", "psr/log": "^1.0" }, "type": "library", @@ -3550,12 +3644,7 @@ "OpenStack\\": "src/" } }, - "autoload-dev": { - "psr-4": { - "OpenStack\\Test\\": "tests/unit/", - "OpenStack\\Integration\\": "tests/integration/" - } - }, + "notification-url": "https://packagist.org/downloads/", "license": [ "Apache-2.0" ], @@ -3574,36 +3663,35 @@ "description": "PHP SDK for OpenStack APIs. Supports BlockStorage, Compute, Identity, Images, Networking and Metric Gnocchi", "homepage": "https://github.com/php-opencloud/openstack", "keywords": [ + "Openstack", "api", - "openstack", "php", "sdk" ], - "support": { - "source": "https://github.com/OpenStackweb/openstack/tree/master" - }, - "time": "2019-02-04T18:27:20+00:00" + "time": "2021-04-02T15:01:50+00:00" }, { "name": "phpseclib/phpseclib", - "version": "2.0.29", + "version": "3.0.8", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "497856a8d997f640b4a516062f84228a772a48a8" + "reference": "d9615a6fb970d9933866ca8b4036ec3407b020b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/497856a8d997f640b4a516062f84228a772a48a8", - "reference": "497856a8d997f640b4a516062f84228a772a48a8", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/d9615a6fb970d9933866ca8b4036ec3407b020b6", + "reference": "d9615a6fb970d9933866ca8b4036ec3407b020b6", "shasum": "" }, "require": { - "php": ">=5.3.3" + "paragonie/constant_time_encoding": "^1|^2", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" }, "require-dev": { "phing/phing": "~2.7", - "phpunit/phpunit": "^4.8.35|^5.7|^6.0", + "phpunit/phpunit": "^5.7|^6.0|^9.4", "squizlabs/php_codesniffer": "~2.0" }, "suggest": { @@ -3618,7 +3706,7 @@ "phpseclib/bootstrap.php" ], "psr-4": { - "phpseclib\\": "phpseclib/" + "phpseclib3\\": "phpseclib/" } }, "notification-url": "https://packagist.org/downloads/", @@ -3673,34 +3761,34 @@ "x.509", "x509" ], - "time": "2020-09-08T04:24:43+00:00" + "time": "2021-04-19T03:20:48+00:00" }, { "name": "pion/laravel-chunk-upload", - "version": "v1.4.0", + "version": "v1.4.1", "source": { "type": "git", "url": "https://github.com/pionl/laravel-chunk-upload.git", - "reference": "a97902906e11da3ff26874c7fd0004625c618d44" + "reference": "149f911041f94efc6b030ee92691f075e29afb9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pionl/laravel-chunk-upload/zipball/a97902906e11da3ff26874c7fd0004625c618d44", - "reference": "a97902906e11da3ff26874c7fd0004625c618d44", + "url": "https://api.github.com/repos/pionl/laravel-chunk-upload/zipball/149f911041f94efc6b030ee92691f075e29afb9d", + "reference": "149f911041f94efc6b030ee92691f075e29afb9d", "shasum": "" }, "require": { - "illuminate/console": "5.2 - 5.8 | ^6.0 | ^7.0", - "illuminate/filesystem": "5.2 - 5.8 | ^6.0 | ^7.0", - "illuminate/http": "5.2 - 5.8 | ^6.0 | ^7.0", - "illuminate/support": "5.2 - 5.8 | ^6.0 | ^7.0" + "illuminate/console": "5.2 - 5.8 | ^6.0 | ^7.0 | ^8.0", + "illuminate/filesystem": "5.2 - 5.8 | ^6.0 | ^7.0 | ^8.0", + "illuminate/http": "5.2 - 5.8 | ^6.0 | ^7.0 | ^8.0", + "illuminate/support": "5.2 - 5.8 | ^6.0 | ^7.0 | ^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.16.0", - "laravel/laravel": "5.2 - 5.8 | ^6.0 | ^7.0", + "laravel/laravel": "5.2 - 5.8 | ^6.0 | ^7.0 | ^8.0", "mockery/mockery": "^1.1.0 | ^1.3.0", - "overtrue/phplint": "^1.1", - "phpunit/phpunit": "5.7 | 6.0 | 7.0 | 7.5 | 8.4 | ^8.5" + "overtrue/phplint": "^1.1 | ^2.0", + "phpunit/phpunit": "5.7 | 6.0 | 7.0 | 7.5 | 8.4 | ^8.5 | ^9.3" }, "type": "library", "extra": { @@ -3726,7 +3814,7 @@ } ], "description": "Service for chunked upload with several js providers", - "time": "2020-06-21T20:08:02+00:00" + "time": "2020-12-07T18:02:05+00:00" }, { "name": "predis/predis", @@ -3826,27 +3914,22 @@ }, { "name": "psr/container", - "version": "1.0.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", - "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=7.2.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -3859,7 +3942,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common Container Interface (PHP FIG PSR-11)", @@ -3871,7 +3954,56 @@ "container-interop", "psr" ], - "time": "2017-02-14T16:28:37+00:00" + "time": "2021-03-05T17:36:06+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "time": "2020-06-29T06:28:15+00:00" }, { "name": "psr/http-message", @@ -3925,16 +4057,16 @@ }, { "name": "psr/log", - "version": "1.1.3", + "version": "1.1.4", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc" + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc", - "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", "shasum": "" }, "require": { @@ -3958,7 +4090,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for logging libraries", @@ -3968,7 +4100,7 @@ "psr", "psr-3" ], - "time": "2020-03-23T09:12:05+00:00" + "time": "2021-05-03T11:20:27+00:00" }, { "name": "psr/simple-cache", @@ -4221,25 +4353,25 @@ }, { "name": "s-ichikawa/laravel-sendgrid-driver", - "version": "2.1.1", + "version": "2.1.2", "source": { "type": "git", "url": "https://github.com/s-ichikawa/laravel-sendgrid-driver.git", - "reference": "0fdb0afeefaa83eec450964341c12774c646cf15" + "reference": "f5b763824768fab5602cba9066e9eb2d34252318" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/s-ichikawa/laravel-sendgrid-driver/zipball/0fdb0afeefaa83eec450964341c12774c646cf15", - "reference": "0fdb0afeefaa83eec450964341c12774c646cf15", + "url": "https://api.github.com/repos/s-ichikawa/laravel-sendgrid-driver/zipball/f5b763824768fab5602cba9066e9eb2d34252318", + "reference": "f5b763824768fab5602cba9066e9eb2d34252318", "shasum": "" }, "require": { "guzzlehttp/guzzle": "~5.3|~6.2|~7.0", - "illuminate/mail": ">=5.5" + "illuminate/mail": "~5.5|~6.0" }, "require-dev": { - "illuminate/container": ">=5.5", - "illuminate/filesystem": ">=5.5", + "illuminate/container": "~5.5|~6.0", + "illuminate/filesystem": "~5.5|~6.0", "phpunit/phpunit": "~5.7" }, "suggest": { @@ -4273,121 +4405,7 @@ "laravel", "sendgrid" ], - "time": "2020-08-06T04:39:30+00:00" - }, - { - "name": "sabre/uri", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/sabre-io/uri.git", - "reference": "8545a3335f741d4b7700bb14efb41b4c03775dcd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sabre-io/uri/zipball/8545a3335f741d4b7700bb14efb41b4c03775dcd", - "reference": "8545a3335f741d4b7700bb14efb41b4c03775dcd", - "shasum": "" - }, - "require": { - "php": ">=5.4.7" - }, - "require-dev": { - "phpunit/phpunit": "*", - "sabre/cs": "~1.0.0" - }, - "type": "library", - "autoload": { - "files": [ - "lib/functions.php" - ], - "psr-4": { - "Sabre\\Uri\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Evert Pot", - "email": "me@evertpot.com", - "homepage": "http://evertpot.com/", - "role": "Developer" - } - ], - "description": "Functions for making sense out of URIs.", - "homepage": "http://sabre.io/uri/", - "keywords": [ - "rfc3986", - "uri", - "url" - ], - "time": "2016-12-07T01:17:59+00:00" - }, - { - "name": "sabre/xml", - "version": "1.5.0", - "source": { - "type": "git", - "url": "https://github.com/sabre-io/xml.git", - "reference": "59b20e5bbace9912607481634f97d05a776ffca7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sabre-io/xml/zipball/59b20e5bbace9912607481634f97d05a776ffca7", - "reference": "59b20e5bbace9912607481634f97d05a776ffca7", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xmlreader": "*", - "ext-xmlwriter": "*", - "lib-libxml": ">=2.6.20", - "php": ">=5.5.5", - "sabre/uri": ">=1.0,<3.0.0" - }, - "require-dev": { - "phpunit/phpunit": "*", - "sabre/cs": "~1.0.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Sabre\\Xml\\": "lib/" - }, - "files": [ - "lib/Deserializer/functions.php", - "lib/Serializer/functions.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Evert Pot", - "email": "me@evertpot.com", - "homepage": "http://evertpot.com/", - "role": "Developer" - }, - { - "name": "Markus Staab", - "email": "markus.staab@redaxo.de", - "role": "Developer" - } - ], - "description": "sabre/xml is an XML library that you may not hate.", - "homepage": "https://sabre.io/xml/", - "keywords": [ - "XMLReader", - "XMLWriter", - "dom", - "xml" - ], - "time": "2016-10-09T22:57:52+00:00" + "time": "2021-01-06T01:39:36+00:00" }, { "name": "simplesoftwareio/simple-qrcode", @@ -4450,130 +4468,38 @@ ], "time": "2017-11-26T15:27:12+00:00" }, - { - "name": "smarcet/caldavclient", - "version": "1.1.6", - "source": { - "type": "git", - "url": "https://github.com/smarcet/CalDAVClient.git", - "reference": "4713825e9d5eca5a536304dbc0b598d733c822b3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/smarcet/CalDAVClient/zipball/4713825e9d5eca5a536304dbc0b598d733c822b3", - "reference": "4713825e9d5eca5a536304dbc0b598d733c822b3", - "shasum": "" - }, - "require": { - "eluceo/ical": "^0.11.3", - "guzzlehttp/guzzle": "^6.3", - "sabre/uri": "1.2.0", - "sabre/xml": "1.5.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7" - }, - "type": "library", - "autoload": { - "psr-4": { - "CalDAVClient\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sebastian Marcet", - "email": "smarcet@gmail.com" - } - ], - "description": "CALDAV Client for PHP", - "homepage": "https://github.com/smarcet", - "keywords": [ - "CalDAV", - "calendar", - "icloud", - "synchronization" - ], - "time": "2018-10-31T23:26:19+00:00" - }, - { - "name": "smarcet/outlook-rest-client", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/smarcet/OutlookRestClient.git", - "reference": "28ddb3effb6af7e3bb7cba7e8edfc58e1b2f73dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/smarcet/OutlookRestClient/zipball/28ddb3effb6af7e3bb7cba7e8edfc58e1b2f73dd", - "reference": "28ddb3effb6af7e3bb7cba7e8edfc58e1b2f73dd", - "shasum": "" - }, - "require": { - "guzzlehttp/guzzle": "^6.3", - "league/oauth2-client": "^2.2", - "php": ">=5.6", - "vlucas/phpdotenv": "^2.4@dev" - }, - "require-dev": { - "phpunit/phpunit": "^5.7" - }, - "type": "library", - "autoload": { - "psr-4": { - "OutlookRestClient\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sebastian Marcet", - "email": "smarcet@gmail.com" - } - ], - "description": "Outlook REST Api Client", - "keywords": [ - "REST API", - "calendar", - "outlook", - "synchronization" - ], - "time": "2017-08-05T01:36:59+00:00" - }, { "name": "sokil/php-isocodes", - "version": "3.0.6", + "version": "3.3.8", "source": { "type": "git", "url": "https://github.com/sokil/php-isocodes.git", - "reference": "fefa9055d9552498e644b0d45f48615e5ea1405c" + "reference": "a3422f91ff1a0378d32e647054af79e333f6c68f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sokil/php-isocodes/zipball/fefa9055d9552498e644b0d45f48615e5ea1405c", - "reference": "fefa9055d9552498e644b0d45f48615e5ea1405c", + "url": "https://api.github.com/repos/sokil/php-isocodes/zipball/a3422f91ff1a0378d32e647054af79e333f6c68f", + "reference": "a3422f91ff1a0378d32e647054af79e333f6c68f", "shasum": "" }, "require": { - "ext-gettext": "*", "ext-json": "*", "php": ">=7.1" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0", + "ext-gettext": "*", + "infection/infection": ">=0.11.5", "php-coveralls/php-coveralls": "^2.1", - "phpbench/phpbench": "^0.16.9", "phpmd/phpmd": "@stable", - "phpunit/phpunit": "^7.0", - "slevomat/coding-standard": "^5.0", - "squizlabs/php_codesniffer": "^3.4" + "phpunit/phpunit": ">=7.5.20", + "squizlabs/php_codesniffer": "^3.4", + "symfony/translation": "^4.4.17|^5.2", + "vimeo/psalm": "^4.3" + }, + "suggest": { + "ext-gettext": "Required for gettext translation driver", + "phpbench/phpbench": "Required to run benchmarks", + "symfony/translation": "Translation driver by Symfont project" }, "type": "library", "autoload": { @@ -4594,29 +4520,29 @@ } ], "description": "ISO country, subdivision, language, currency and script definitions and their translations. Based on pythons pycountry and Debian's iso-codes.", - "time": "2020-09-22T20:35:16+00:00" + "time": "2021-05-02T07:30:10+00:00" }, { "name": "spatie/dropbox-api", - "version": "1.16.0", + "version": "1.18.0", "source": { "type": "git", "url": "https://github.com/spatie/dropbox-api.git", - "reference": "c294ce5ec69e16fb19879451e3a0944b7291f826" + "reference": "b0b5642a40552c225fca98718a73228cfcd7f2d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/dropbox-api/zipball/c294ce5ec69e16fb19879451e3a0944b7291f826", - "reference": "c294ce5ec69e16fb19879451e3a0944b7291f826", + "url": "https://api.github.com/repos/spatie/dropbox-api/zipball/b0b5642a40552c225fca98718a73228cfcd7f2d6", + "reference": "b0b5642a40552c225fca98718a73228cfcd7f2d6", "shasum": "" }, "require": { - "graham-campbell/guzzle-factory": "^3.0||^4.0", + "graham-campbell/guzzle-factory": "^3.0||^4.0||^5.0", "guzzlehttp/guzzle": "^6.2||^7.0", - "php": "^7.1" + "php": "^7.1||^8.0" }, "require-dev": { - "phpunit/phpunit": "^7.5.15|^8.5" + "phpunit/phpunit": "^7.5.15|^8.5|^9.3" }, "type": "library", "autoload": { @@ -4651,29 +4577,29 @@ "spatie", "v2" ], - "time": "2020-09-25T08:07:36+00:00" + "time": "2021-05-27T11:54:57+00:00" }, { "name": "spatie/flysystem-dropbox", - "version": "1.2.2", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/spatie/flysystem-dropbox.git", - "reference": "512e8d59b3f9b8a6710f932c421032cb490e9869" + "reference": "8b6b072f217343b875316ca6a4203dd59f04207a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/flysystem-dropbox/zipball/512e8d59b3f9b8a6710f932c421032cb490e9869", - "reference": "512e8d59b3f9b8a6710f932c421032cb490e9869", + "url": "https://api.github.com/repos/spatie/flysystem-dropbox/zipball/8b6b072f217343b875316ca6a4203dd59f04207a", + "reference": "8b6b072f217343b875316ca6a4203dd59f04207a", "shasum": "" }, "require": { "league/flysystem": "^1.0.20", - "php": "^7.0", + "php": "^7.0 || ^8.0", "spatie/dropbox-api": "^1.1.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.11 || ^9.4.3" }, "type": "library", "autoload": { @@ -4703,7 +4629,7 @@ "spatie", "v2" ], - "time": "2019-12-04T08:18:17+00:00" + "time": "2020-11-28T22:17:09+00:00" }, { "name": "spatie/laravel-cors", @@ -4823,32 +4749,31 @@ }, { "name": "swiftmailer/swiftmailer", - "version": "v6.2.3", + "version": "v6.2.7", "source": { "type": "git", "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9" + "reference": "15f7faf8508e04471f666633addacf54c0ab5933" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/149cfdf118b169f7840bbe3ef0d4bc795d1780c9", - "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/15f7faf8508e04471f666633addacf54c0ab5933", + "reference": "15f7faf8508e04471f666633addacf54c0ab5933", "shasum": "" }, "require": { - "egulias/email-validator": "~2.0", + "egulias/email-validator": "^2.0|^3.1", "php": ">=7.0.0", "symfony/polyfill-iconv": "^1.0", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, "require-dev": { - "mockery/mockery": "~0.9.1", - "symfony/phpunit-bridge": "^3.4.19|^4.1.8" + "mockery/mockery": "^1.0", + "symfony/phpunit-bridge": "^4.4|^5.0" }, "suggest": { - "ext-intl": "Needed to support internationalized email addresses", - "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed" + "ext-intl": "Needed to support internationalized email addresses" }, "type": "library", "extra": { @@ -4881,20 +4806,20 @@ "mail", "mailer" ], - "time": "2019-11-12T09:31:26+00:00" + "time": "2021-03-09T12:30:35+00:00" }, { "name": "symfony/console", - "version": "v4.4.16", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "20f73dd143a5815d475e0838ff867bce1eebd9d5" + "reference": "a62acecdf5b50e314a4f305cd01b5282126f3095" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/20f73dd143a5815d475e0838ff867bce1eebd9d5", - "reference": "20f73dd143a5815d475e0838ff867bce1eebd9d5", + "url": "https://api.github.com/repos/symfony/console/zipball/a62acecdf5b50e314a4f305cd01b5282126f3095", + "reference": "a62acecdf5b50e314a4f305cd01b5282126f3095", "shasum": "" }, "require": { @@ -4951,22 +4876,22 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Console Component", + "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", - "time": "2020-10-24T11:50:19+00:00" + "time": "2021-05-26T11:20:16+00:00" }, { "name": "symfony/css-selector", - "version": "v4.4.16", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "719506cffda9dba80c75d94ac50f1a2561520e4f" + "reference": "c1e29de6dc893b130b45d20d8051efbb040560a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/719506cffda9dba80c75d94ac50f1a2561520e4f", - "reference": "719506cffda9dba80c75d94ac50f1a2561520e4f", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/c1e29de6dc893b130b45d20d8051efbb040560a9", + "reference": "c1e29de6dc893b130b45d20d8051efbb040560a9", "shasum": "" }, "require": { @@ -4999,22 +4924,22 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony CssSelector Component", + "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", - "time": "2020-10-24T11:50:19+00:00" + "time": "2021-05-26T17:39:37+00:00" }, { "name": "symfony/debug", - "version": "v4.4.16", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "c87adf3fc1cd0bf4758316a3a150d50a8f957ef4" + "reference": "a8d2d5c94438548bff9f998ca874e202bb29d07f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/c87adf3fc1cd0bf4758316a3a150d50a8f957ef4", - "reference": "c87adf3fc1cd0bf4758316a3a150d50a8f957ef4", + "url": "https://api.github.com/repos/symfony/debug/zipball/a8d2d5c94438548bff9f998ca874e202bb29d07f", + "reference": "a8d2d5c94438548bff9f998ca874e202bb29d07f", "shasum": "" }, "require": { @@ -5051,22 +4976,72 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Debug Component", + "description": "Provides tools to ease debugging PHP code", "homepage": "https://symfony.com", - "time": "2020-10-24T11:50:19+00:00" + "time": "2021-05-26T17:39:37+00:00" }, { - "name": "symfony/error-handler", - "version": "v4.4.16", + "name": "symfony/deprecation-contracts", + "version": "v2.4.0", "source": { "type": "git", - "url": "https://github.com/symfony/error-handler.git", - "reference": "363cca01cabf98e4f1c447b14d0a68617f003613" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/363cca01cabf98e4f1c447b14d0a68617f003613", - "reference": "363cca01cabf98e4f1c447b14d0a68617f003613", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "time": "2021-03-23T23:28:01+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v4.4.25", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "310a756cec00d29d89a08518405aded046a54a8b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/310a756cec00d29d89a08518405aded046a54a8b", + "reference": "310a756cec00d29d89a08518405aded046a54a8b", "shasum": "" }, "require": { @@ -5103,22 +5078,22 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony ErrorHandler Component", + "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", - "time": "2020-10-24T11:50:19+00:00" + "time": "2021-05-26T17:39:37+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.4.16", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "4204f13d2d0b7ad09454f221bb2195fccdf1fe98" + "reference": "047773e7016e4fd45102cedf4bd2558ae0d0c32f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4204f13d2d0b7ad09454f221bb2195fccdf1fe98", - "reference": "4204f13d2d0b7ad09454f221bb2195fccdf1fe98", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/047773e7016e4fd45102cedf4bd2558ae0d0c32f", + "reference": "047773e7016e4fd45102cedf4bd2558ae0d0c32f", "shasum": "" }, "require": { @@ -5169,9 +5144,9 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony EventDispatcher Component", + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", - "time": "2020-10-24T11:50:19+00:00" + "time": "2021-05-26T17:39:37+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -5237,16 +5212,16 @@ }, { "name": "symfony/finder", - "version": "v4.4.16", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "26f63b8d4e92f2eecd90f6791a563ebb001abe31" + "reference": "ed33314396d968a8936c95f5bd1b88bd3b3e94a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/26f63b8d4e92f2eecd90f6791a563ebb001abe31", - "reference": "26f63b8d4e92f2eecd90f6791a563ebb001abe31", + "url": "https://api.github.com/repos/symfony/finder/zipball/ed33314396d968a8936c95f5bd1b88bd3b3e94a3", + "reference": "ed33314396d968a8936c95f5bd1b88bd3b3e94a3", "shasum": "" }, "require": { @@ -5275,22 +5250,22 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Finder Component", + "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", - "time": "2020-10-24T11:50:19+00:00" + "time": "2021-05-26T11:20:16+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v2.3.1", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "41db680a15018f9c1d4b23516059633ce280ca33" + "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41db680a15018f9c1d4b23516059633ce280ca33", - "reference": "41db680a15018f9c1d4b23516059633ce280ca33", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/7e82f6084d7cae521a75ef2cb5c9457bbda785f4", + "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4", "shasum": "" }, "require": { @@ -5301,9 +5276,8 @@ }, "type": "library", "extra": { - "branch-version": "2.3", "branch-alias": { - "dev-main": "2.3-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5339,26 +5313,27 @@ "interoperability", "standards" ], - "time": "2020-10-14T17:08:19+00:00" + "time": "2021-04-11T23:07:08+00:00" }, { "name": "symfony/http-foundation", - "version": "v4.4.16", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "827a00811ef699e809a201ceafac0b2b246bf38a" + "reference": "0c79d5a65ace4fe66e49702658c024a419d2438b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/827a00811ef699e809a201ceafac0b2b246bf38a", - "reference": "827a00811ef699e809a201ceafac0b2b246bf38a", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/0c79d5a65ace4fe66e49702658c024a419d2438b", + "reference": "0c79d5a65ace4fe66e49702658c024a419d2438b", "shasum": "" }, "require": { "php": ">=7.1.3", "symfony/mime": "^4.3|^5.0", - "symfony/polyfill-mbstring": "~1.1" + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.15" }, "require-dev": { "predis/predis": "~1.0", @@ -5387,22 +5362,22 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpFoundation Component", + "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", - "time": "2020-10-24T11:50:19+00:00" + "time": "2021-05-26T11:20:16+00:00" }, { "name": "symfony/http-kernel", - "version": "v4.4.16", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "109b2a46e470a487ec8b0ffea4b0bb993aaf42ed" + "reference": "3795165596fe81a52296b78c9aae938d434069cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/109b2a46e470a487ec8b0ffea4b0bb993aaf42ed", - "reference": "109b2a46e470a487ec8b0ffea4b0bb993aaf42ed", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3795165596fe81a52296b78c9aae938d434069cc", + "reference": "3795165596fe81a52296b78c9aae938d434069cc", "shasum": "" }, "require": { @@ -5422,13 +5397,13 @@ "symfony/console": ">=5", "symfony/dependency-injection": "<4.3", "symfony/translation": "<4.2", - "twig/twig": "<1.34|<2.4,>=2" + "twig/twig": "<1.43|<2.13,>=2" }, "provide": { "psr/log-implementation": "1.0" }, "require-dev": { - "psr/cache": "~1.0", + "psr/cache": "^1.0|^2.0|^3.0", "symfony/browser-kit": "^4.3|^5.0", "symfony/config": "^3.4|^4.0|^5.0", "symfony/console": "^3.4|^4.0", @@ -5443,7 +5418,7 @@ "symfony/templating": "^3.4|^4.0|^5.0", "symfony/translation": "^4.2|^5.0", "symfony/translation-contracts": "^1.1|^2", - "twig/twig": "^1.34|^2.4|^3.0" + "twig/twig": "^1.43|^2.13|^3.0.4" }, "suggest": { "symfony/browser-kit": "", @@ -5474,36 +5449,44 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpKernel Component", + "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", - "time": "2020-10-28T05:50:56+00:00" + "time": "2021-06-01T07:12:08+00:00" }, { "name": "symfony/mime", - "version": "v5.1.8", + "version": "v5.3.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "f5485a92c24d4bcfc2f3fc648744fb398482ff1b" + "reference": "ed710d297b181f6a7194d8172c9c2423d58e4852" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/f5485a92c24d4bcfc2f3fc648744fb398482ff1b", - "reference": "f5485a92c24d4bcfc2f3fc648744fb398482ff1b", + "url": "https://api.github.com/repos/symfony/mime/zipball/ed710d297b181f6a7194d8172c9c2423d58e4852", + "reference": "ed710d297b181f6a7194d8172c9c2423d58e4852", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0", "symfony/polyfill-php80": "^1.15" }, "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<4.4" }, "require-dev": { - "egulias/email-validator": "^2.1.10", - "symfony/dependency-injection": "^4.4|^5.0" + "egulias/email-validator": "^2.1.10|^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.1", + "symfony/property-info": "^4.4|^5.1", + "symfony/serializer": "^5.2" }, "type": "library", "autoload": { @@ -5528,26 +5511,26 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "A library to manipulate MIME messages", + "description": "Allows manipulating MIME messages", "homepage": "https://symfony.com", "keywords": [ "mime", "mime-type" ], - "time": "2020-10-24T12:01:57+00:00" + "time": "2021-05-26T17:43:10+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.20.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41" + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41", - "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", "shasum": "" }, "require": { @@ -5559,7 +5542,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5596,20 +5579,20 @@ "polyfill", "portable" ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.20.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "c536646fdb4f29104dd26effc2fdcb9a5b085024" + "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/c536646fdb4f29104dd26effc2fdcb9a5b085024", - "reference": "c536646fdb4f29104dd26effc2fdcb9a5b085024", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/63b5bb7db83e5673936d6e3b8b3e022ff6474933", + "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933", "shasum": "" }, "require": { @@ -5621,7 +5604,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5659,20 +5642,20 @@ "portable", "shim" ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-05-27T09:27:20+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.20.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117" + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3b75acd829741c768bc8b1f84eb33265e7cc5117", - "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", "shasum": "" }, "require": { @@ -5686,7 +5669,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5729,20 +5712,20 @@ "portable", "shim" ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-05-27T09:27:20+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.20.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "727d1096295d807c309fb01a851577302394c897" + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/727d1096295d807c309fb01a851577302394c897", - "reference": "727d1096295d807c309fb01a851577302394c897", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", "shasum": "" }, "require": { @@ -5754,7 +5737,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5796,20 +5779,20 @@ "portable", "shim" ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.20.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531" + "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531", - "reference": "39d483bdf39be819deabf04ec872eb0b2410b531", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", "shasum": "" }, "require": { @@ -5821,7 +5804,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5859,20 +5842,20 @@ "portable", "shim" ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-05-27T09:27:20+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.20.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "cede45fcdfabdd6043b3592e83678e42ec69e930" + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cede45fcdfabdd6043b3592e83678e42ec69e930", - "reference": "cede45fcdfabdd6043b3592e83678e42ec69e930", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", "shasum": "" }, "require": { @@ -5881,7 +5864,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5918,20 +5901,20 @@ "portable", "shim" ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-05-27T09:17:38+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.20.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed" + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed", - "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", "shasum": "" }, "require": { @@ -5940,7 +5923,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5980,20 +5963,20 @@ "portable", "shim" ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.20.0", + "version": "v1.23.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de" + "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de", - "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", + "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", "shasum": "" }, "require": { @@ -6002,7 +5985,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.20-dev" + "dev-main": "1.23-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6046,20 +6029,20 @@ "portable", "shim" ], - "time": "2020-10-23T14:02:19+00:00" + "time": "2021-02-19T12:13:01+00:00" }, { "name": "symfony/process", - "version": "v4.4.16", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "2f4b049fb80ca5e9874615a2a85dc2a502090f05" + "reference": "cd61e6dd273975c6625316de9d141ebd197f93c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/2f4b049fb80ca5e9874615a2a85dc2a502090f05", - "reference": "2f4b049fb80ca5e9874615a2a85dc2a502090f05", + "url": "https://api.github.com/repos/symfony/process/zipball/cd61e6dd273975c6625316de9d141ebd197f93c9", + "reference": "cd61e6dd273975c6625316de9d141ebd197f93c9", "shasum": "" }, "require": { @@ -6088,22 +6071,22 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Process Component", + "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", - "time": "2020-10-24T11:50:19+00:00" + "time": "2021-05-26T11:20:16+00:00" }, { "name": "symfony/routing", - "version": "v4.4.16", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "826794f2e9305fe73cba859c60d2a336851bd202" + "reference": "3a3c2f197ad0846ac6413225fc78868ba1c61434" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/826794f2e9305fe73cba859c60d2a336851bd202", - "reference": "826794f2e9305fe73cba859c60d2a336851bd202", + "url": "https://api.github.com/repos/symfony/routing/zipball/3a3c2f197ad0846ac6413225fc78868ba1c61434", + "reference": "3a3c2f197ad0846ac6413225fc78868ba1c61434", "shasum": "" }, "require": { @@ -6115,7 +6098,7 @@ "symfony/yaml": "<3.4" }, "require-dev": { - "doctrine/annotations": "~1.2", + "doctrine/annotations": "^1.10.4", "psr/log": "~1.0", "symfony/config": "^4.2|^5.0", "symfony/dependency-injection": "^3.4|^4.0|^5.0", @@ -6153,7 +6136,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Routing Component", + "description": "Maps an HTTP request to a set of configuration variables", "homepage": "https://symfony.com", "keywords": [ "router", @@ -6161,20 +6144,20 @@ "uri", "url" ], - "time": "2020-10-24T11:50:19+00:00" + "time": "2021-05-26T17:39:37+00:00" }, { "name": "symfony/serializer", - "version": "v4.4.16", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "2af7e86db04ee65fdf1991b17ee0b3e955c93de9" + "reference": "6db3eb4f1bb437cd3730f52353ba4b568acaddf5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/2af7e86db04ee65fdf1991b17ee0b3e955c93de9", - "reference": "2af7e86db04ee65fdf1991b17ee0b3e955c93de9", + "url": "https://api.github.com/repos/symfony/serializer/zipball/6db3eb4f1bb437cd3730f52353ba4b568acaddf5", + "reference": "6db3eb4f1bb437cd3730f52353ba4b568acaddf5", "shasum": "" }, "require": { @@ -6182,30 +6165,29 @@ "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "phpdocumentor/type-resolver": "<0.2.1", + "phpdocumentor/reflection-docblock": "<3.0|>=3.2.0,<3.2.2", + "phpdocumentor/type-resolver": "<0.3.0|1.3.*", "symfony/dependency-injection": "<3.4", "symfony/property-access": "<3.4", "symfony/property-info": "<3.4", "symfony/yaml": "<3.4" }, "require-dev": { - "doctrine/annotations": "~1.0", - "doctrine/cache": "~1.0", - "phpdocumentor/reflection-docblock": "^3.2|^4.0", + "doctrine/annotations": "^1.10.4", + "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", "symfony/cache": "^3.4|^4.0|^5.0", "symfony/config": "^3.4|^4.0|^5.0", "symfony/dependency-injection": "^3.4|^4.0|^5.0", "symfony/error-handler": "^4.4|^5.0", "symfony/http-foundation": "^3.4|^4.0|^5.0", "symfony/mime": "^4.4|^5.0", - "symfony/property-access": "^3.4|^4.0|^5.0", + "symfony/property-access": "^3.4.41|^4.4.9|^5.0.9", "symfony/property-info": "^3.4.13|~4.0|^5.0", "symfony/validator": "^3.4|^4.0|^5.0", "symfony/yaml": "^3.4|^4.0|^5.0" }, "suggest": { - "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.", - "doctrine/cache": "For using the default cached annotation reader and metadata cache.", + "doctrine/annotations": "For using the annotation mapping.", "psr/cache-implementation": "For using the metadata cache.", "symfony/config": "For using the XML mapping loader.", "symfony/http-foundation": "For using a MIME type guesser within the DataUriNormalizer.", @@ -6236,27 +6218,27 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Serializer Component", + "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", - "time": "2020-10-24T11:50:19+00:00" + "time": "2021-05-26T11:20:16+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.2.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", - "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.0" + "psr/container": "^1.1" }, "suggest": { "symfony/service-implementation": "" @@ -6264,7 +6246,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -6300,20 +6282,20 @@ "interoperability", "standards" ], - "time": "2020-09-07T11:33:47+00:00" + "time": "2021-04-01T10:43:52+00:00" }, { "name": "symfony/translation", - "version": "v4.4.16", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "73095716af79f610f3b6338b911357393fdd10ab" + "reference": "dfe132c5c6d89f90ce7f961742cc532e9ca16dd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/73095716af79f610f3b6338b911357393fdd10ab", - "reference": "73095716af79f610f3b6338b911357393fdd10ab", + "url": "https://api.github.com/repos/symfony/translation/zipball/dfe132c5c6d89f90ce7f961742cc532e9ca16dd4", + "reference": "dfe132c5c6d89f90ce7f961742cc532e9ca16dd4", "shasum": "" }, "require": { @@ -6328,7 +6310,7 @@ "symfony/yaml": "<3.4" }, "provide": { - "symfony/translation-implementation": "1.0" + "symfony/translation-implementation": "1.0|2.0" }, "require-dev": { "psr/log": "~1.0", @@ -6369,22 +6351,22 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Translation Component", + "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", - "time": "2020-10-24T11:50:19+00:00" + "time": "2021-05-26T17:39:37+00:00" }, { "name": "symfony/translation-contracts", - "version": "v2.3.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105" + "reference": "95c812666f3e91db75385749fe219c5e494c7f95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e2eaa60b558f26a4b0354e1bbb25636efaaad105", - "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95", "shasum": "" }, "require": { @@ -6396,7 +6378,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -6432,20 +6414,20 @@ "interoperability", "standards" ], - "time": "2020-09-28T13:05:58+00:00" + "time": "2021-03-23T23:28:01+00:00" }, { "name": "symfony/var-dumper", - "version": "v4.4.16", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "3718e18b68d955348ad860e505991802c09f5f73" + "reference": "31ea689a8e7d2410016b0d25fc15a1ba05a6e2e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3718e18b68d955348ad860e505991802c09f5f73", - "reference": "3718e18b68d955348ad860e505991802c09f5f73", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/31ea689a8e7d2410016b0d25fc15a1ba05a6e2e0", + "reference": "31ea689a8e7d2410016b0d25fc15a1ba05a6e2e0", "shasum": "" }, "require": { @@ -6462,7 +6444,7 @@ "ext-iconv": "*", "symfony/console": "^3.4|^4.0|^5.0", "symfony/process": "^4.4|^5.0", - "twig/twig": "^1.34|^2.4|^3.0" + "twig/twig": "^1.43|^2.13|^3.0.4" }, "suggest": { "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", @@ -6498,13 +6480,13 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony mechanism for exploring and dumping PHP variables", + "description": "Provides mechanisms for walking through any arbitrary PHP variable", "homepage": "https://symfony.com", "keywords": [ "debug", "dump" ], - "time": "2020-10-26T20:47:51+00:00" + "time": "2021-05-27T09:48:32+00:00" }, { "name": "symfony/yaml", @@ -6567,16 +6549,16 @@ }, { "name": "tecnickcom/tcpdf", - "version": "6.3.5", + "version": "6.4.1", "source": { "type": "git", "url": "https://github.com/tecnickcom/TCPDF.git", - "reference": "19a535eaa7fb1c1cac499109deeb1a7a201b4549" + "reference": "5ba838befdb37ef06a16d9f716f35eb03cb1b329" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/19a535eaa7fb1c1cac499109deeb1a7a201b4549", - "reference": "19a535eaa7fb1c1cac499109deeb1a7a201b4549", + "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/5ba838befdb37ef06a16d9f716f35eb03cb1b329", + "reference": "5ba838befdb37ef06a16d9f716f35eb03cb1b329", "shasum": "" }, "require": { @@ -6625,7 +6607,7 @@ "pdf417", "qrcode" ], - "time": "2020-02-14T14:20:12+00:00" + "time": "2021-03-27T16:00:33+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -6678,16 +6660,16 @@ }, { "name": "vlucas/phpdotenv", - "version": "v2.6.6", + "version": "v2.6.7", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "e1d57f62db3db00d9139078cbedf262280701479" + "reference": "b786088918a884258c9e3e27405c6a4cf2ee246e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/e1d57f62db3db00d9139078cbedf262280701479", - "reference": "e1d57f62db3db00d9139078cbedf262280701479", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/b786088918a884258c9e3e27405c6a4cf2ee246e", + "reference": "b786088918a884258c9e3e27405c6a4cf2ee246e", "shasum": "" }, "require": { @@ -6697,7 +6679,7 @@ "require-dev": { "ext-filter": "*", "ext-pcre": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7.27" + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20" }, "suggest": { "ext-filter": "Required to use the boolean validator.", @@ -6736,7 +6718,7 @@ "env", "environment" ], - "time": "2020-07-14T17:54:18+00:00" + "time": "2021-01-20T14:39:13+00:00" }, { "name": "zendframework/zend-code", @@ -6855,16 +6837,16 @@ "packages-dev": [ { "name": "filp/whoops", - "version": "2.9.1", + "version": "2.12.1", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "307fb34a5ab697461ec4c9db865b20ff2fd40771" + "reference": "c13c0be93cff50f88bbd70827d993026821914dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/307fb34a5ab697461ec4c9db865b20ff2fd40771", - "reference": "307fb34a5ab697461ec4c9db865b20ff2fd40771", + "url": "https://api.github.com/repos/filp/whoops/zipball/c13c0be93cff50f88bbd70827d993026821914dd", + "reference": "c13c0be93cff50f88bbd70827d993026821914dd", "shasum": "" }, "require": { @@ -6912,20 +6894,20 @@ "throwable", "whoops" ], - "time": "2020-11-01T12:00:00+00:00" + "time": "2021-04-25T12:00:00+00:00" }, { "name": "fzaninotto/faker", - "version": "v1.9.1", + "version": "v1.9.2", "source": { "type": "git", "url": "https://github.com/fzaninotto/Faker.git", - "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f" + "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/fc10d778e4b84d5bd315dad194661e091d307c6f", - "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/848d8125239d7dbf8ab25cb7f054f1a630e68c2e", + "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e", "shasum": "" }, "require": { @@ -6962,7 +6944,8 @@ "faker", "fixtures" ], - "time": "2019-12-12T13:22:17+00:00" + "abandoned": true, + "time": "2020-12-11T09:56:16+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -7062,16 +7045,16 @@ }, { "name": "mockery/mockery", - "version": "1.3.3", + "version": "1.3.4", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "60fa2f67f6e4d3634bb4a45ff3171fa52215800d" + "reference": "31467aeb3ca3188158613322d66df81cedd86626" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/60fa2f67f6e4d3634bb4a45ff3171fa52215800d", - "reference": "60fa2f67f6e4d3634bb4a45ff3171fa52215800d", + "url": "https://api.github.com/repos/mockery/mockery/zipball/31467aeb3ca3188158613322d66df81cedd86626", + "reference": "31467aeb3ca3188158613322d66df81cedd86626", "shasum": "" }, "require": { @@ -7123,7 +7106,7 @@ "test double", "testing" ], - "time": "2020-08-11T18:10:21+00:00" + "time": "2021-02-24T09:51:00+00:00" }, { "name": "myclabs/deep-copy", @@ -7487,16 +7470,16 @@ }, { "name": "phpspec/prophecy", - "version": "1.12.1", + "version": "1.13.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d" + "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/8ce87516be71aae9b956f81906aaf0338e0d8a2d", - "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", + "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", "shasum": "" }, "require": { @@ -7508,7 +7491,7 @@ }, "require-dev": { "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0 || ^9.0 <9.3" + "phpunit/phpunit": "^8.0 || ^9.0" }, "type": "library", "extra": { @@ -7546,7 +7529,7 @@ "spy", "stub" ], - "time": "2020-09-29T09:10:42+00:00" + "time": "2021-03-17T13:42:18+00:00" }, { "name": "phpunit/php-code-coverage", @@ -7613,23 +7596,23 @@ }, { "name": "phpunit/php-file-iterator", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "050bedf145a257b1ff02746c31894800e5122946" + "reference": "4b49fb70f067272b659ef0174ff9ca40fdaa6357" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", - "reference": "050bedf145a257b1ff02746c31894800e5122946", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/4b49fb70f067272b659ef0174ff9ca40fdaa6357", + "reference": "4b49fb70f067272b659ef0174ff9ca40fdaa6357", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "^7.1" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -7659,7 +7642,7 @@ "filesystem", "iterator" ], - "time": "2018-09-13T20:33:42+00:00" + "time": "2020-11-30T08:25:21+00:00" }, { "name": "phpunit/php-text-template", @@ -7704,23 +7687,23 @@ }, { "name": "phpunit/php-timer", - "version": "2.1.2", + "version": "2.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" + "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -7749,25 +7732,25 @@ "keywords": [ "timer" ], - "time": "2019-06-07T04:22:29+00:00" + "time": "2020-11-30T08:20:02+00:00" }, { "name": "phpunit/php-token-stream", - "version": "3.1.1", + "version": "3.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" + "reference": "472b687829041c24b25f475e14c2f38a09edf1c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/472b687829041c24b25f475e14c2f38a09edf1c2", + "reference": "472b687829041c24b25f475e14c2f38a09edf1c2", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { "phpunit/phpunit": "^7.0" @@ -7799,7 +7782,7 @@ "tokenizer" ], "abandoned": true, - "time": "2019-09-17T06:23:10+00:00" + "time": "2020-11-30T08:38:46+00:00" }, { "name": "phpunit/phpunit", @@ -7887,23 +7870,23 @@ }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": ">=5.6" }, "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -7928,29 +7911,29 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" + "time": "2020-11-30T08:15:22+00:00" }, { "name": "sebastian/comparator", - "version": "3.0.2", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" + "reference": "1071dfcef776a57013124ff35e1fc41ccd294758" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758", + "reference": "1071dfcef776a57013124ff35e1fc41ccd294758", "shasum": "" }, "require": { - "php": "^7.1", + "php": ">=7.1", "sebastian/diff": "^3.0", "sebastian/exporter": "^3.1" }, "require-dev": { - "phpunit/phpunit": "^7.1" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -7968,6 +7951,10 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" @@ -7979,10 +7966,6 @@ { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" } ], "description": "Provides the functionality to compare PHP values for equality", @@ -7992,24 +7975,24 @@ "compare", "equality" ], - "time": "2018-07-12T15:12:46+00:00" + "time": "2020-11-30T08:04:30+00:00" }, { "name": "sebastian/diff", - "version": "3.0.2", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" + "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211", + "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { "phpunit/phpunit": "^7.5 || ^8.0", @@ -8031,13 +8014,13 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], "description": "Diff implementation", @@ -8048,24 +8031,24 @@ "unidiff", "unified diff" ], - "time": "2019-02-04T06:01:07+00:00" + "time": "2020-11-30T07:59:04+00:00" }, { "name": "sebastian/environment", - "version": "4.2.3", + "version": "4.2.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" + "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", + "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { "phpunit/phpunit": "^7.5" @@ -8101,24 +8084,24 @@ "environment", "hhvm" ], - "time": "2019-11-20T08:46:58+00:00" + "time": "2020-11-30T07:53:42+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.2", + "version": "3.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" + "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/6b853149eab67d4da22291d36f5b0631c0fd856e", + "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e", "shasum": "" }, "require": { - "php": "^7.0", + "php": ">=7.0", "sebastian/recursion-context": "^3.0" }, "require-dev": { @@ -8168,7 +8151,7 @@ "export", "exporter" ], - "time": "2019-09-14T09:02:43+00:00" + "time": "2020-11-30T07:47:53+00:00" }, { "name": "sebastian/global-state", @@ -8223,20 +8206,20 @@ }, { "name": "sebastian/object-enumerator", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", "shasum": "" }, "require": { - "php": "^7.0", + "php": ">=7.0", "sebastian/object-reflector": "^1.1.1", "sebastian/recursion-context": "^3.0" }, @@ -8266,24 +8249,24 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-08-03T12:35:26+00:00" + "time": "2020-11-30T07:40:27+00:00" }, { "name": "sebastian/object-reflector", - "version": "1.1.1", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" + "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.0" }, "require-dev": { "phpunit/phpunit": "^6.0" @@ -8311,24 +8294,24 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2017-03-29T09:07:27+00:00" + "time": "2020-11-30T07:37:18+00:00" }, { "name": "sebastian/recursion-context", - "version": "3.0.0", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", + "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.0" }, "require-dev": { "phpunit/phpunit": "^6.0" @@ -8349,14 +8332,14 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, { "name": "Adam Harvey", "email": "aharvey@php.net" @@ -8364,24 +8347,24 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2017-03-03T06:23:57+00:00" + "time": "2020-11-30T07:34:24+00:00" }, { "name": "sebastian/resource-operations", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" + "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "type": "library", "extra": { @@ -8406,7 +8389,7 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2018-10-04T04:07:39+00:00" + "time": "2020-11-30T07:30:19+00:00" }, { "name": "sebastian/version", @@ -8453,16 +8436,16 @@ }, { "name": "symfony/dom-crawler", - "version": "v4.4.16", + "version": "v4.4.25", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "30ad9ac96a01913195bf0328d48e29d54fa53e6e" + "reference": "41d15bb6d6b95d2be763c514bb2494215d9c5eef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/30ad9ac96a01913195bf0328d48e29d54fa53e6e", - "reference": "30ad9ac96a01913195bf0328d48e29d54fa53e6e", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/41d15bb6d6b95d2be763c514bb2494215d9c5eef", + "reference": "41d15bb6d6b95d2be763c514bb2494215d9c5eef", "shasum": "" }, "require": { @@ -8503,9 +8486,9 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony DomCrawler Component", + "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", - "time": "2020-10-24T11:50:19+00:00" + "time": "2021-05-26T11:20:16+00:00" }, { "name": "theseer/tokenizer", @@ -8549,30 +8532,35 @@ }, { "name": "webmozart/assert", - "version": "1.9.1", + "version": "1.10.0", "source": { "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" + "url": "https://github.com/webmozarts/assert.git", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0 || ^8.0", + "php": "^7.2 || ^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" + "vimeo/psalm": "<4.6.1 || 4.6.2" }, "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" + "phpunit/phpunit": "^8.5.13" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" @@ -8594,14 +8582,13 @@ "check", "validate" ], - "time": "2020-07-08T17:02:28+00:00" + "time": "2021-03-09T10:59:23+00:00" } ], "aliases": [], "minimum-stability": "dev", "stability-flags": { - "php-opencloud/openstack": 20, - "smarcet/outlook-rest-client": 20 + "php-opencloud/openstack": 20 }, "prefer-stable": true, "prefer-lowest": false, diff --git a/database/migrations/model/Version20210601152355.php b/database/migrations/model/Version20210601152355.php new file mode 100644 index 00000000..921c6845 --- /dev/null +++ b/database/migrations/model/Version20210601152355.php @@ -0,0 +1,51 @@ +hasTable("PresentationVideo") && !$builder->hasColumn("PresentationVideo", "ExternalUrl")) { + $builder->table("PresentationVideo", function (Table $table) { + $table->string('ExternalUrl')->setNotnull(false); + }); + } + } + + /** + * @param Schema $schema + */ + public function down(Schema $schema):void + { + $builder = new Builder($schema); + + if ($builder->hasTable("PresentationVideo") && $builder->hasColumn("PresentationVideo", "ExternalUrl")) { + $builder->table("PresentationVideo", function (Table $table) { + $table->dropColumn('ExternalUrl'); + }); + } + } +} diff --git a/database/seeds/ApiEndpointsSeeder.php b/database/seeds/ApiEndpointsSeeder.php index e6a82fee..20e00918 100644 --- a/database/seeds/ApiEndpointsSeeder.php +++ b/database/seeds/ApiEndpointsSeeder.php @@ -4318,6 +4318,16 @@ class ApiEndpointsSeeder extends Seeder 'http_method' => 'POST', 'scopes' => [sprintf('%s/summits/confirm-external-orders', $current_realm)], ), + [ + 'name' => 'import-assets-from-mux', + 'route' => '/api/v1/summits/{id}/presentations/all/import/mux', + 'http_method' => 'POST', + 'scopes' => [ + sprintf(SummitScopes::WriteSummitData, $current_realm), + sprintf(SummitScopes::WriteEventData, $current_realm), + sprintf(SummitScopes::WritePresentationData, $current_realm) + ], + ], // presentation submissions [ 'name' => 'submit-presentation', diff --git a/resources/views/emails/mux_export_excerpt.blade.php b/resources/views/emails/mux_export_excerpt.blade.php new file mode 100644 index 00000000..bb678f2f --- /dev/null +++ b/resources/views/emails/mux_export_excerpt.blade.php @@ -0,0 +1,13 @@ + + + + + + +

MUX EXPORT RESULTS - {!! $step !!}

+

{!! $excerpt !!}

+
+
+

Cheers,
Your {!! Config::get('app.tenant_name') !!} Support Team

+ + \ No newline at end of file diff --git a/tests/MuxImportTest.php b/tests/MuxImportTest.php new file mode 100644 index 00000000..bcb6ce1e --- /dev/null +++ b/tests/MuxImportTest.php @@ -0,0 +1,102 @@ +getTimeZone(); + self::$presentations[0]->setStreamingUrl(env("MUX_STREAM_URL1")); + $begin_date = new \DateTime("now", $time_zone); + self::$presentations[0]->setStartDate($begin_date); + self::$presentations[0]->setEndDate((clone $begin_date)->add(new DateInterval("P1D"))); + self::$presentations[0]->publish(); + self::$presentations[1]->setStreamingUrl(env("MUX_STREAM_URL2")); + self::$presentations[1]->setStartDate($begin_date); + self::$presentations[1]->setEndDate((clone $begin_date)->add(new DateInterval("P1D"))); + self::$presentations[1]->publish(); + self::$em->persist(self::$presentations[0]); + self::$em->persist(self::$presentations[1]); + self::$em->flush(); + } + + public function testEnableMP4(){ + + $service = App::make(IPresentationVideoMediaUploadProcessor::class); + + $res = $service->processSummitEventsStreamURLs + ( + self::$summit->getId(), + new MuxCredentials + ( + env('MUX_TOKEN_ID'), + env('MUX_TOKEN_SECRET') + ), + env('MUX_EMAIL_TO') + ); + + $this->assertTrue($res == 2); + } + + public function testEnableMP4AndProcess(){ + + $service = App::make(IPresentationVideoMediaUploadProcessor::class); + + $res = $service->processSummitEventsStreamURLs + ( + self::$summit->getId(), + new MuxCredentials + ( + env('MUX_TOKEN_ID'), + env('MUX_TOKEN_SECRET') + ), + env('MUX_EMAIL_TO') + ); + + $this->assertTrue($res == 2); + + $res = $service->createVideosFromMUXAssets + ( + self::$summit->getId(), + new MuxCredentials + ( + env('MUX_TOKEN_ID'), + env('MUX_TOKEN_SECRET') + ), + env('MUX_EMAIL_TO') + ); + + $this->assertTrue($res == 2); + $this->assertTrue(self::$presentations[0]->getVideosWithExternalUrls()->count() > 0); + $this->assertTrue(self::$presentations[1]->getVideosWithExternalUrls()->count() > 0); + } +} \ No newline at end of file diff --git a/tests/OAuth2PresentationSubmissionTest.php b/tests/OAuth2PresentationSubmissionTest.php index c6338336..0a9e919f 100644 --- a/tests/OAuth2PresentationSubmissionTest.php +++ b/tests/OAuth2PresentationSubmissionTest.php @@ -119,4 +119,35 @@ class OAuth2PresentationSubmissionTest extends ProtectedApiTest $content = $response->getContent(); $this->assertResponseStatus(204); } + + public function testImportAssetsFromMUX(){ + $params = [ + 'id' => self::$summit->getId(), + ]; + + $data = [ + 'mux_token_id' => "TOKEN", + 'mux_token_secret' => "SECRET", + "email_to" => "test@test.com" + ]; + + $headers = [ + "HTTP_Authorization" => " Bearer " . $this->access_token, + "CONTENT_TYPE" => "application/json" + ]; + + $response = $this->action( + "POST", + "OAuth2PresentationApiController@importAssetsFromMUX", + $params, + [], + [], + [], + $headers, + json_encode($data) + ); + + $content = $response->getContent(); + $this->assertResponseStatus(200); + } } \ No newline at end of file