diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSponsorApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSponsorApiController.php index f6ea9d3f5..388e8c8cc 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSponsorApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSponsorApiController.php @@ -1,4 +1,5 @@ -summit_repository = $summit_repository; $this->sponsor_ads_repository = $sponsor_ads_repository; @@ -167,7 +171,8 @@ protected function getOrderRules(): array * @param Filter $filter * @return Filter */ - protected function applyExtraFilters(Filter $filter):Filter { + protected function applyExtraFilters(Filter $filter): Filter + { // this is the authz code for sponsors users ... $current_member = $this->resource_server_context->getCurrentUser(); @@ -178,15 +183,17 @@ protected function applyExtraFilters(Filter $filter):Filter { if (!is_null($summit)) { // add filter for summit . - $filter->addFilterCondition(FilterElement::makeEqual("summit_id",$summit_id)); - if(!is_null($current_member)) { + $filter->addFilterCondition(FilterElement::makeEqual("summit_id", $summit_id)); + if (!is_null($current_member)) { // check AUTHZ for sponsors - if($current_member->isAuthzFor($summit)) return $filter; + if ($current_member->isAuthzFor($summit)) + return $filter; // add filter for sponsor user if ($current_member->isSponsorUser()) { $sponsor_ids = $current_member->getSponsorMembershipIds($summit); // is allowed sponsors are empty, add dummy value - if (!count($sponsor_ids)) $sponsor_ids[] = 0; + if (!count($sponsor_ids)) + $sponsor_ids[] = 0; $filter->addFilterCondition ( FilterElement::makeEqual @@ -214,39 +221,139 @@ function getAddValidationRules(array $payload): array SponsorValidationRulesFactory::buildForAddV2($payload); } - protected function serializerType():string{ + protected function serializerType(): string + { return $this->serializer_version == 1 ? SerializerRegistry::SerializerType_Public : SerializerRegistry::SerializerType_PublicV2; } - public function getChildSerializer():string{ + public function getChildSerializer(): string + { return $this->serializer_version == 1 ? SerializerRegistry::SerializerType_Public : SerializerRegistry::SerializerType_PublicV2; } - protected function addSerializerType():string{ + protected function addSerializerType(): string + { return $this->serializer_version == 1 ? SerializerRegistry::SerializerType_Public : SerializerRegistry::SerializerType_PublicV2; } - protected function updateSerializerType(): string{ + protected function updateSerializerType(): string + { return $this->serializer_version == 1 ? SerializerRegistry::SerializerType_Public : SerializerRegistry::SerializerType_PublicV2; } - /** + #[OA\Get( + path: "/api/v2/summits/{id}/sponsors", + description: "Get all sponsors for a summit", + summary: 'Read Sponsors by Summit (V2)', + operationId: 'getSponsorsBySummitV2', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::Sponsors, + IGroup::SponsorExternalUsers, + ] + ], + parameters: [ + new OA\Parameter(name: 'id', in: 'path', required: true, schema: new OA\Schema(type: 'integer'), description: 'The summit id'), + new OA\Parameter(name: 'page', in: 'query', required: false, schema: new OA\Schema(type: 'integer', default: 1), description: 'Page number'), + new OA\Parameter(name: 'per_page', in: 'query', required: false, schema: new OA\Schema(type: 'integer', default: 10), description: 'Items per page'), + new OA\Parameter(name: 'order', in: 'query', required: false, schema: new OA\Schema(type: 'string'), description: 'Order by field (e.g., +id, -company_name)'), + new OA\Parameter(name: 'expand', in: 'query', required: false, schema: new OA\Schema(type: 'string'), description: 'Expand relationships (company)'), + new OA\Parameter(name: 'fields', in: 'query', required: false, schema: new OA\Schema(type: 'string'), description: 'Fields to include (id,company_name)'), + new OA\Parameter(name: 'filter', in: 'query', required: false, schema: new OA\Schema(type: 'string'), description: 'Filter expression (e.g., is_published==true)'), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Success', + content: new OA\JsonContent(ref: '#/components/schemas/SponsorV2') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] + /** * @param $summit_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function getAllBySummitV2($summit_id){ + public function getAllBySummitV2($summit_id) + { $this->serializer_version = 2; return $this->getAllBySummit($summit_id); } + #[OA\Get( + path: "/api/public/v1/summits/all/{id}/sponsors", + description: "Get a specific sponsor by id", + summary: 'Get Sponsors by Summit ID (Public)', + operationId: 'getSponsorsV2BySummitPublic', + tags: ['Sponsors (Public)'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::Sponsors, + IGroup::SponsorExternalUsers, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Success', + content: new OA\JsonContent(ref: '#/components/schemas/SponsorV2') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param $summit_id * @return \Illuminate\Http\JsonResponse|mixed @@ -257,12 +364,38 @@ public function getAllBySummitPublic($summit_id) return $this->getAllBySummit($summit_id); } + #[OA\Get( + path: "/api/v2/summits/{id}/sponsors/{sponsor_id}", + description: "Get all sponsors for a summit (Public API)", + summary: 'Read Sponsors by Summit', + operationId: 'getSponsorsV2BySummit', + tags: ['Sponsors'], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Success', + content: new OA\JsonContent(type: 'array', items: new OA\Items(ref: '#/components/schemas/SponsorV2')) + ), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param $summit_id * @param $child_id * @return mixed */ - public function getV2($summit_id, $child_id){ + public function getV2($summit_id, $child_id) + { $this->serializer_version = 2; return $this->get($summit_id, $child_id); } @@ -280,16 +413,64 @@ protected function addChild(Summit $summit, array $payload): IEntity $is_authz = $application_type == IResourceServerContext::ApplicationType_Service || (!is_null($current_member) && $current_member->isAuthzFor($summit)); - if(!$is_authz) + if (!$is_authz) throw new HTTP403ForbiddenException("You are not allowed to perform this action."); return $this->service->addSponsor($summit, $payload); } + #[OA\Post( + path: "/api/v2/summits/{id}/sponsors", + description: "Create a new sponsor", + summary: 'Create Sponsor (V2)', + operationId: 'addSponsorV2', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/SponsorCreateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Created', + content: new OA\JsonContent(ref: '#/components/schemas/SponsorV2') + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param $summit_id * @return \Illuminate\Http\JsonResponse|mixed */ - public function addV2($summit_id){ + public function addV2($summit_id) + { $this->serializer_version = 2; $this->add_validation_rules_version = 2; return $this->add($summit_id); @@ -312,7 +493,7 @@ protected function deleteChild(Summit $summit, $child_id): void { // authz check $current_member = $this->resource_server_context->getCurrentUser(); - if(!$current_member->isAuthzFor($summit)) + if (!$current_member->isAuthzFor($summit)) throw new HTTP403ForbiddenException("You are not allowed to perform this action."); $this->service->deleteSponsor($summit, $child_id); @@ -323,12 +504,17 @@ protected function getChildFromSummit(Summit $summit, $child_id): ?IEntity $current_member = $this->resource_server_context->getCurrentUser(); $sponsor = $summit->getSummitSponsorById($child_id); - if(is_null($sponsor)) return null; + if (is_null($sponsor)) + return null; // service account - if(is_null($current_member)) return $sponsor; - if($current_member->isAdmin()) return $sponsor; - if($current_member->hasSponsorMembershipsFor($summit, $sponsor)) return $sponsor; - if($current_member->isSummitAdmin() && $current_member->isSummitAllowed($summit)) return $sponsor; + if (is_null($current_member)) + return $sponsor; + if ($current_member->isAdmin()) + return $sponsor; + if ($current_member->hasSponsorMembershipsFor($summit, $sponsor)) + return $sponsor; + if ($current_member->isSummitAdmin() && $current_member->isSummitAllowed($summit)) + return $sponsor; return null; } @@ -354,23 +540,133 @@ protected function updateChild(Summit $summit, int $child_id, array $payload): I { // authz check $current_member = $this->resource_server_context->getCurrentUser(); - if(!$current_member->isAuthzFor($summit)) + if (!$current_member->isAuthzFor($summit)) throw new HTTP403ForbiddenException("You are not allowed to perform this action"); return $this->service->updateSponsor($summit, $child_id, $payload); } - /** + #[OA\Put( + path: "/api/v2/summits/{id}/sponsors/{sponsor_id}", + description: "Update an existing sponsor", + summary: 'Update Sponsor (V2)', + operationId: 'updateSponsorV2', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/SponsorUpdateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Success', + content: new OA\JsonContent(ref: '#/components/schemas/SponsorV2') + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] + /** * @param $summit_id * @param $child_id * @return mixed */ - public function updateV2($summit_id, $child_id){ + public function updateV2($summit_id, $child_id) + { $this->serializer_version = 2; $this->add_validation_rules_version = 2; return $this->update($summit_id, $child_id); } + #[OA\Put( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/users/{member_id}", + description: "Add a user to a sponsor", + summary: 'Add Sponsor User', + operationId: 'addSponsorUser', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'member_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The member id to add' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Success', + content: new OA\JsonContent(ref: '#/components/schemas/Sponsor') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -381,14 +677,16 @@ public function addSponsorUser($summit_id, $sponsor_id, $member_id) { return $this->processRequest(function () use ($summit_id, $sponsor_id, $member_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); // authz check $current_member = $this->resource_server_context->getCurrentUser(); - if(!is_null($current_member) && !$current_member->isAuthzFor($summit)) + if (!is_null($current_member) && !$current_member->isAuthzFor($summit)) throw new HTTP403ForbiddenException("You are not allowed to perform this action"); $sponsor = $this->service->addSponsorUser($summit, $sponsor_id, $member_id); @@ -400,6 +698,61 @@ public function addSponsorUser($summit_id, $sponsor_id, $member_id) }); } + #[OA\Delete( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/users/{member_id}", + description: "Remove a user from a sponsor", + summary: 'Remove Sponsor User', + operationId: 'removeSponsorUser', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'member_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The member id to remove' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Success', + content: new OA\JsonContent(ref: '#/components/schemas/Sponsor') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -410,11 +763,12 @@ public function removeSponsorUser($summit_id, $sponsor_id, $member_id) { return $this->processRequest(function () use ($summit_id, $sponsor_id, $member_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); // authz check $current_member = $this->resource_server_context->getCurrentUser(); - if(!$current_member->isAuthzFor($summit)) + if (!$current_member->isAuthzFor($summit)) throw new HTTP403ForbiddenException("You are not allowed to perform this action"); $sponsor = $this->service->removeSponsorUser($summit, $sponsor_id, $member_id); @@ -432,12 +786,80 @@ public function removeSponsorUser($summit_id, $sponsor_id, $member_id) * @param $sponsor_id * @return mixed */ + #[OA\Post( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/side-image", + description: "Add a side image to a sponsor", + summary: 'Add Sponsor Side Image', + operationId: 'addSponsorSideImage', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\MediaType( + mediaType: 'multipart/form-data', + schema: new OA\Schema( + type: 'object', + required: ['file'], + properties: [ + new OA\Property( + property: 'file', + type: 'string', + format: 'binary', + description: 'The image file' + ), + ] + ) + ) + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Created', + content: new OA\JsonContent(ref: '#/components/schemas/File') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] public function addSponsorSideImage(LaravelRequest $request, $summit_id, $sponsor_id) { return $this->processRequest(function () use ($request, $summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $file = $request->file('file'); if (is_null($file)) { @@ -456,6 +878,53 @@ public function addSponsorSideImage(LaravelRequest $request, $summit_id, $sponso }); } + #[OA\Delete( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/side-image", + description: "Delete a sponsor side image", + summary: 'Delete Sponsor Side Image', + operationId: 'deleteSponsorSideImage', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_NO_CONTENT, + description: 'No Content' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -466,7 +935,8 @@ public function deleteSponsorSideImage($summit_id, $sponsor_id) return $this->processRequest(function () use ($summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $this->service->deleteSponsorSideImage($summit, $sponsor_id); @@ -481,12 +951,80 @@ public function deleteSponsorSideImage($summit_id, $sponsor_id) * @param $sponsor_id * @return \Illuminate\Http\JsonResponse|mixed */ + #[OA\Post( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/header-image", + description: "Add a header image to a sponsor", + summary: 'Add Sponsor Header Image', + operationId: 'addSponsorHeaderImage', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\MediaType( + mediaType: 'multipart/form-data', + schema: new OA\Schema( + type: 'object', + required: ['file'], + properties: [ + new OA\Property( + property: 'file', + type: 'string', + format: 'binary', + description: 'The image file' + ), + ] + ) + ) + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Created', + content: new OA\JsonContent(ref: '#/components/schemas/File') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] public function addSponsorHeaderImage(LaravelRequest $request, $summit_id, $sponsor_id) { return $this->processRequest(function () use ($request, $summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $file = $request->file('file'); if (is_null($file)) { @@ -505,6 +1043,53 @@ public function addSponsorHeaderImage(LaravelRequest $request, $summit_id, $spon }); } + #[OA\Delete( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/header-image", + description: "Delete a sponsor header image", + summary: 'Delete Sponsor Header Image', + operationId: 'deleteSponsorHeaderImage', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_NO_CONTENT, + description: 'No Content' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -515,7 +1100,8 @@ public function deleteSponsorHeaderImage($summit_id, $sponsor_id) return $this->processRequest(function () use ($summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $this->service->deleteSponsorHeaderImage($summit, intval($sponsor_id)); @@ -524,6 +1110,73 @@ public function deleteSponsorHeaderImage($summit_id, $sponsor_id) }); } + #[OA\Post( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/header-image/mobile", + description: "Add a mobile header image to a sponsor", + summary: 'Add Sponsor Header Image Mobile', + operationId: 'addSponsorHeaderImageMobile', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\MediaType( + mediaType: 'multipart/form-data', + schema: new OA\Schema( + type: 'object', + required: ['file'], + properties: [ + new OA\Property( + property: 'file', + type: 'string', + format: 'binary', + description: 'The image file' + ), + ] + ) + ) + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Created', + content: new OA\JsonContent(ref: '#/components/schemas/File') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param LaravelRequest $request * @param $summit_id @@ -535,7 +1188,8 @@ public function addSponsorHeaderImageMobile(LaravelRequest $request, $summit_id, return $this->processRequest(function () use ($request, $summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $file = $request->file('file'); if (is_null($file)) { @@ -554,6 +1208,53 @@ public function addSponsorHeaderImageMobile(LaravelRequest $request, $summit_id, }); } + #[OA\Delete( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/header-image/mobile", + description: "Delete a sponsor mobile header image", + summary: 'Delete Sponsor Header Image Mobile', + operationId: 'deleteSponsorHeaderImageMobile', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_NO_CONTENT, + description: 'No Content' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -564,7 +1265,8 @@ public function deleteSponsorHeaderImageMobile($summit_id, $sponsor_id) return $this->processRequest(function () use ($summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $this->service->deleteSponsorHeaderImageMobile($summit, intval($sponsor_id)); @@ -573,6 +1275,73 @@ public function deleteSponsorHeaderImageMobile($summit_id, $sponsor_id) }); } + #[OA\Post( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/carousel-advertise-image", + description: "Add a carousel advertise image to a sponsor", + summary: 'Add Sponsor Carousel Advertise Image', + operationId: 'addSponsorCarouselAdvertiseImage', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\MediaType( + mediaType: 'multipart/form-data', + schema: new OA\Schema( + type: 'object', + required: ['file'], + properties: [ + new OA\Property( + property: 'file', + type: 'string', + format: 'binary', + description: 'The image file' + ), + ] + ) + ) + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Created', + content: new OA\JsonContent(ref: '#/components/schemas/File') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param LaravelRequest $request * @param $summit_id @@ -584,7 +1353,8 @@ public function addSponsorCarouselAdvertiseImage(LaravelRequest $request, $summi return $this->processRequest(function () use ($request, $summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $file = $request->file('file'); if (is_null($file)) { @@ -603,6 +1373,53 @@ public function addSponsorCarouselAdvertiseImage(LaravelRequest $request, $summi }); } + #[OA\Delete( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/carousel-advertise-image", + description: "Delete a sponsor carousel advertise image", + summary: 'Delete Sponsor Carousel Advertise Image', + operationId: 'deleteSponsorCarouselAdvertiseImage', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_NO_CONTENT, + description: 'No Content' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -613,7 +1430,8 @@ public function deleteSponsorCarouselAdvertiseImage($summit_id, $sponsor_id) return $this->processRequest(function () use ($summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $this->service->deleteSponsorCarouselAdvertiseImage($summit, intval($sponsor_id)); @@ -628,6 +1446,84 @@ public function deleteSponsorCarouselAdvertiseImage($summit_id, $sponsor_id) // Ads + #[OA\Get( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/ads", + description: "Get all ads for a sponsor", + summary: 'Read Sponsor Ads', + operationId: 'getSponsorAds', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::Sponsors, + IGroup::SponsorExternalUsers, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'page', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer', default: 1), + description: 'Page number' + ), + new OA\Parameter( + name: 'per_page', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer', default: 10), + description: 'Items per page' + ), + new OA\Parameter( + name: 'order', + in: 'query', + required: false, + schema: new OA\Schema(type: 'string'), + description: 'Order by field (e.g., +id, -order)' + ), + new OA\Parameter( + name: 'filter', + in: 'query', + required: false, + schema: new OA\Schema(type: 'string'), + description: 'Filter expression' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Success' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -637,10 +1533,12 @@ public function getAds($summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); return $this->_getAll( function () { @@ -681,6 +1579,59 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { ); } + #[OA\Post( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/ads", + description: "Create a new sponsor ad", + summary: 'Add Sponsor Ad', + operationId: 'addSponsorAd', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/SponsorAdCreateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Created', + content: new OA\JsonContent(ref: '#/components/schemas/SponsorAd') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -690,23 +1641,99 @@ public function addAd($summit_id, $sponsor_id) { return $this->processRequest(function () use ($summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $payload = $this->getJsonPayload(SponsorAdValidationRulesFactory::buildForAdd(), true); $ad = $this->service->addSponsorAd($summit, intval($sponsor_id), $payload); - return $this->created(SerializerRegistry::getInstance() - ->getSerializer($ad, SerializerRegistry::SerializerType_Private) - ->serialize( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations() - ) + return $this->created( + SerializerRegistry::getInstance() + ->getSerializer($ad, SerializerRegistry::SerializerType_Private) + ->serialize( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations() + ) ); }); } + #[OA\Post( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/ads/{ad_id}/image", + description: "Add an image to a sponsor ad", + summary: 'Add Sponsor Ad Image', + operationId: 'addSponsorAdImage', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'ad_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The ad id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\MediaType( + mediaType: 'multipart/form-data', + schema: new OA\Schema( + type: 'object', + required: ['file'], + properties: [ + new OA\Property( + property: 'file', + type: 'string', + format: 'binary', + description: 'The image file' + ), + ] + ) + ) + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Created', + content: new OA\JsonContent(ref: '#/components/schemas/File') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param LaravelRequest $request * @param $summit_id @@ -719,7 +1746,8 @@ public function addAdImage(LaravelRequest $request, $summit_id, $sponsor_id, $ad return $this->processRequest(function () use ($request, $summit_id, $sponsor_id, $ad_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $file = $request->file('file'); if (is_null($file)) { @@ -738,6 +1766,60 @@ public function addAdImage(LaravelRequest $request, $summit_id, $sponsor_id, $ad }); } + #[OA\Delete( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/ads/{ad_id}/image", + description: "Remove an image from a sponsor ad", + summary: 'Remove Sponsor Ad Image', + operationId: 'removeSponsorAdImage', + tags: ['Sponsors'], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'ad_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The ad id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_NO_CONTENT, + description: 'No Content' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -749,7 +1831,8 @@ public function removeAdImage($summit_id, $sponsor_id, $ad_id) return $this->processRequest(function () use ($summit_id, $sponsor_id, $ad_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $this->service->deleteSponsorAdImage($summit, intval($sponsor_id), intval($ad_id)); @@ -758,6 +1841,64 @@ public function removeAdImage($summit_id, $sponsor_id, $ad_id) }); } + #[OA\Put( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/ads/{ad_id}", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Update Sponsor Ad', + operationId: 'updateSponsorAd', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'ad_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The ad id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/SponsorAdUpdateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Ad updated successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -768,23 +1909,78 @@ public function updateAd($summit_id, $sponsor_id, $ad_id) { return $this->processRequest(function () use ($summit_id, $sponsor_id, $ad_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $payload = $this->getJsonPayload(SponsorAdValidationRulesFactory::buildForUpdate(), true); $ad = $this->service->updateSponsorAd($summit, intval($sponsor_id), intval($ad_id), $payload); - return $this->updated(SerializerRegistry::getInstance() - ->getSerializer($ad, SerializerRegistry::SerializerType_Private) - ->serialize( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations() - ) + return $this->updated( + SerializerRegistry::getInstance() + ->getSerializer($ad, SerializerRegistry::SerializerType_Private) + ->serialize( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations() + ) ); }); } + #[OA\Delete( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/ads/{ad_id}", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Delete Sponsor Ad', + operationId: 'deleteSponsorAd', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'ad_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The ad id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_NO_CONTENT, + description: 'Ad deleted successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -796,7 +1992,8 @@ public function deleteAd($summit_id, $sponsor_id, $ad_id) return $this->processRequest(function () use ($summit_id, $sponsor_id, $ad_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $this->service->deleteSponsorAd($summit, intval($sponsor_id), intval($ad_id)); @@ -805,6 +2002,62 @@ public function deleteAd($summit_id, $sponsor_id, $ad_id) }); } + #[OA\Get( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/ads/{ad_id}", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators . ", " . IGroup::Sponsors . ", " . IGroup::SponsorExternalUsers, + summary: 'Read Sponsor Ad', + operationId: 'getSponsorAd', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::Sponsors, + IGroup::SponsorExternalUsers, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'ad_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The ad id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Ad retrieved successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -816,27 +2069,106 @@ public function getAd($summit_id, $sponsor_id, $ad_id) return $this->processRequest(function () use ($summit_id, $sponsor_id, $ad_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); $ad = $sponsor->getAdById(intval($ad_id)); - if (is_null($ad)) return $this->error404(); - - return $this->ok(SerializerRegistry::getInstance() - ->getSerializer($ad, SerializerRegistry::SerializerType_Private) - ->serialize( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations() - ) + if (is_null($ad)) + return $this->error404(); + + return $this->ok( + SerializerRegistry::getInstance() + ->getSerializer($ad, SerializerRegistry::SerializerType_Private) + ->serialize( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations() + ) ); }); } // Materials + #[OA\Get( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/materials", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators . ", " . IGroup::Sponsors . ", " . IGroup::SponsorExternalUsers, + summary: 'Read Sponsor Materials', + operationId: 'getSponsorMaterials', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::Sponsors, + IGroup::SponsorExternalUsers, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'page', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer', example: 1) + ), + new OA\Parameter( + name: 'per_page', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer', example: 10) + ), + new OA\Parameter( + name: 'order', + in: 'query', + required: false, + schema: new OA\Schema(type: 'string'), + description: 'Order by field (e.g., +id, -order)' + ), + new OA\Parameter( + name: 'filter', + in: 'query', + required: false, + schema: new OA\Schema(type: 'string'), + description: 'Filter expression' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Sponsor materials retrieved successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -847,10 +2179,12 @@ public function getMaterials($summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); return $this->_getAll( function () { @@ -862,7 +2196,7 @@ function () { function () { return [ 'sponsor_id' => 'sometimes|int', - 'type' => 'sometimes|string|in:'.implode(',', SponsorMaterial::ValidTypes) + 'type' => 'sometimes|string|in:' . implode(',', SponsorMaterial::ValidTypes) ]; }, function () { @@ -893,6 +2227,58 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { ); } + #[OA\Post( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/materials", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Add Sponsor Material', + operationId: 'addSponsorMaterial', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/SponsorMaterialCreateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Material created successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SponsorMaterial') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -902,23 +2288,83 @@ public function addMaterial($summit_id, $sponsor_id) { return $this->processRequest(function () use ($summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $payload = $this->getJsonPayload(SponsorMaterialValidationRulesFactory::buildForAdd(), true); $material = $this->service->addSponsorMaterial($summit, intval($sponsor_id), $payload); - return $this->created(SerializerRegistry::getInstance() - ->getSerializer($material, SerializerRegistry::SerializerType_Private) - ->serialize( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations() - ) + return $this->created( + SerializerRegistry::getInstance() + ->getSerializer($material, SerializerRegistry::SerializerType_Private) + ->serialize( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations() + ) ); }); } + #[OA\Put( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/materials/{material_id}", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Update Sponsor Material', + operationId: 'updateSponsorMaterial', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'material_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The material id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/SponsorMaterialUpdateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Material updated successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -929,23 +2375,78 @@ public function updateMaterial($summit_id, $sponsor_id, $material_id) { return $this->processRequest(function () use ($summit_id, $sponsor_id, $material_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $payload = $this->getJsonPayload(SponsorMaterialValidationRulesFactory::buildForUpdate(), true); $material = $this->service->updateSponsorMaterial($summit, intval($sponsor_id), intval($material_id), $payload); - return $this->updated(SerializerRegistry::getInstance() - ->getSerializer($material, SerializerRegistry::SerializerType_Private) - ->serialize( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations() - ) + return $this->updated( + SerializerRegistry::getInstance() + ->getSerializer($material, SerializerRegistry::SerializerType_Private) + ->serialize( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations() + ) ); }); } + #[OA\Delete( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/materials/{material_id}", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Delete Sponsor Material', + operationId: 'deleteSponsorMaterial', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'material_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The material id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_NO_CONTENT, + description: 'Material deleted successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -957,7 +2458,8 @@ public function deleteMaterial($summit_id, $sponsor_id, $material_id) return $this->processRequest(function () use ($summit_id, $sponsor_id, $material_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $this->service->deleteSponsorMaterial($summit, intval($sponsor_id), intval($material_id)); @@ -966,6 +2468,62 @@ public function deleteMaterial($summit_id, $sponsor_id, $material_id) }); } + #[OA\Get( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/materials/{material_id}", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators . ", " . IGroup::Sponsors . ", " . IGroup::SponsorExternalUsers, + summary: 'Read Sponsor Material', + operationId: 'getSponsorMaterial', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::Sponsors, + IGroup::SponsorExternalUsers, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'material_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The material id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Material retrieved successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -977,27 +2535,106 @@ public function getMaterial($summit_id, $sponsor_id, $material_id) return $this->processRequest(function () use ($summit_id, $sponsor_id, $material_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); $material = $sponsor->getMaterialById(intval($material_id)); - if (is_null($material)) return $this->error404(); - - return $this->ok(SerializerRegistry::getInstance() - ->getSerializer($material, SerializerRegistry::SerializerType_Private) - ->serialize( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations() - ) + if (is_null($material)) + return $this->error404(); + + return $this->ok( + SerializerRegistry::getInstance() + ->getSerializer($material, SerializerRegistry::SerializerType_Private) + ->serialize( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations() + ) ); }); } // Social Networks + #[OA\Get( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/social-networks", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators . ", " . IGroup::Sponsors . ", " . IGroup::SponsorExternalUsers, + summary: 'Read Sponsor Social Networks', + operationId: 'getSponsorSocialNetworks', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::Sponsors, + IGroup::SponsorExternalUsers, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'page', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer', example: 1) + ), + new OA\Parameter( + name: 'per_page', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer', example: 10) + ), + new OA\Parameter( + name: 'order', + in: 'query', + required: false, + schema: new OA\Schema(type: 'string'), + description: 'Order by field (e.g., +id)' + ), + new OA\Parameter( + name: 'filter', + in: 'query', + required: false, + schema: new OA\Schema(type: 'string'), + description: 'Filter expression' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Social networks retrieved successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -1007,10 +2644,12 @@ public function getSocialNetworks($summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); return $this->_getAll( function () { @@ -1050,6 +2689,58 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { ); } + #[OA\Post( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/social-networks", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Add Sponsor Social Network', + operationId: 'addSponsorSocialNetwork', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/SponsorSocialNetworkCreateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Social network created successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SponsorSocialNetwork') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -1059,23 +2750,81 @@ public function addSocialNetwork($summit_id, $sponsor_id) { return $this->processRequest(function () use ($summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $payload = $this->getJsonPayload(SponsorSocialNetworkValidationRulesFactory::buildForAdd(), true); $social_network = $this->service->addSponsorSocialNetwork($summit, intval($sponsor_id), $payload); - return $this->created(SerializerRegistry::getInstance() - ->getSerializer($social_network, SerializerRegistry::SerializerType_Private) - ->serialize( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations() - ) + return $this->created( + SerializerRegistry::getInstance() + ->getSerializer($social_network, SerializerRegistry::SerializerType_Private) + ->serialize( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations() + ) ); }); } + #[OA\Get( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/social-networks/{social_network_id}", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators . ", " . IGroup::Sponsors . ", " . IGroup::SponsorExternalUsers, + summary: 'Read Sponsor Social Network', + operationId: 'getSponsorSocialNetwork', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::Sponsors, + IGroup::SponsorExternalUsers, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'social_network_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The social network id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Social network retrieved successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -1087,25 +2836,87 @@ public function getSocialNetwork($summit_id, $sponsor_id, $social_network_id) return $this->processRequest(function () use ($summit_id, $sponsor_id, $social_network_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); $social_network = $sponsor->getSocialNetworkById(intval($social_network_id)); - if (is_null($social_network)) return $this->error404(); - - return $this->ok(SerializerRegistry::getInstance() - ->getSerializer($social_network, SerializerRegistry::SerializerType_Private) - ->serialize( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations() - ) + if (is_null($social_network)) + return $this->error404(); + + return $this->ok( + SerializerRegistry::getInstance() + ->getSerializer($social_network, SerializerRegistry::SerializerType_Private) + ->serialize( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations() + ) ); }); } + #[OA\Put( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/social-networks/{social_network_id}", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Update Sponsor Social Network', + operationId: 'updateSponsorSocialNetwork', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'social_network_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The social network id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/SponsorSocialNetworkUpdateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Social network updated successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -1116,23 +2927,78 @@ public function updateSocialNetwork($summit_id, $sponsor_id, $social_network_id) { return $this->processRequest(function () use ($summit_id, $sponsor_id, $social_network_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $payload = $this->getJsonPayload(SponsorSocialNetworkValidationRulesFactory::buildForUpdate(), true); $social_network = $this->service->updateSponsorSocialNetwork($summit, intval($sponsor_id), intval($social_network_id), $payload); - return $this->updated(SerializerRegistry::getInstance() - ->getSerializer($social_network, SerializerRegistry::SerializerType_Private) - ->serialize( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations() - ) + return $this->updated( + SerializerRegistry::getInstance() + ->getSerializer($social_network, SerializerRegistry::SerializerType_Private) + ->serialize( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations() + ) ); }); } + #[OA\Delete( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/social-networks/{social_network_id}", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Delete Sponsor Social Network', + operationId: 'deleteSponsorSocialNetwork', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'social_network_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The social network id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_NO_CONTENT, + description: 'Social network deleted successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -1144,7 +3010,8 @@ public function deleteSocialNetwork($summit_id, $sponsor_id, $social_network_id) return $this->processRequest(function () use ($summit_id, $sponsor_id, $social_network_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $this->service->deleteSponsorSocialNetwork($summit, intval($sponsor_id), intval($social_network_id)); @@ -1155,6 +3022,79 @@ public function deleteSocialNetwork($summit_id, $sponsor_id, $social_network_id) // Extra Questions + #[OA\Get( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/extra-questions", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Read Sponsor Extra Questions', + operationId: 'getSponsorExtraQuestions', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'page', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer', example: 1) + ), + new OA\Parameter( + name: 'per_page', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer', example: 10) + ), + new OA\Parameter( + name: 'order', + in: 'query', + required: false, + schema: new OA\Schema(type: 'string'), + description: 'Order by field (e.g., +id, -name, +order)' + ), + new OA\Parameter( + name: 'filter', + in: 'query', + required: false, + schema: new OA\Schema(type: 'string'), + description: 'Filter expression' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Extra questions retrieved successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -1163,14 +3103,16 @@ public function deleteSocialNetwork($summit_id, $sponsor_id, $social_network_id) public function getExtraQuestions($summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); // authz check $current_member = $this->resource_server_context->getCurrentUser(); - if(!$current_member->isAuthzFor($summit, $sponsor)) + if (!$current_member->isAuthzFor($summit, $sponsor)) throw new HTTP403ForbiddenException("You are not allowed to perform this action"); return $this->_getAll( @@ -1219,6 +3161,46 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { ); } + #[OA\Get( + path: "/api/v1/summits/{id}/sponsors/all/extra-questions/metadata", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Read Sponsor Extra Questions Metadata', + operationId: 'getSponsorExtraQuestionsMetadata', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Extra questions metadata retrieved successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] /** * @param $summit_id * @return mixed @@ -1226,7 +3208,8 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { public function getMetadata($summit_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); return $this->ok ( @@ -1234,6 +3217,58 @@ public function getMetadata($summit_id) ); } + #[OA\Post( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/extra-questions", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Add Sponsor Extra Question', + operationId: 'addSponsorExtraQuestion', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/SponsorExtraQuestionCreateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Extra question created successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SummitSponsorExtraQuestionType') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -1243,31 +3278,88 @@ public function addExtraQuestion($summit_id, $sponsor_id) { return $this->processRequest(function () use ($summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); // authz check $current_member = $this->resource_server_context->getCurrentUser(); - if(!$current_member->isAuthzFor($summit, $sponsor)) + if (!$current_member->isAuthzFor($summit, $sponsor)) throw new HTTP403ForbiddenException("You are not allowed to perform this action."); $payload = $this->getJsonPayload(SponsorExtraQuestionValidationRulesFactory::buildForAdd(), true); $extra_question = $this->service->addSponsorExtraQuestion($summit, intval($sponsor_id), $payload); - return $this->created(SerializerRegistry::getInstance() - ->getSerializer($extra_question, SerializerRegistry::SerializerType_Private) - ->serialize( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations() - ) + return $this->created( + SerializerRegistry::getInstance() + ->getSerializer($extra_question, SerializerRegistry::SerializerType_Private) + ->serialize( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations() + ) ); }); } + #[OA\Get( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/extra-questions/{extra_question_id}", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Read Sponsor Extra Question', + operationId: 'getSponsorExtraQuestion', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'extra_question_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The extra question id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Extra question retrieved successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -1279,30 +3371,92 @@ public function getExtraQuestion($summit_id, $sponsor_id, $extra_question_id) return $this->processRequest(function () use ($summit_id, $sponsor_id, $extra_question_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); // authz check $current_member = $this->resource_server_context->getCurrentUser(); - if(!$current_member->isAuthzFor($summit, $sponsor)) + if (!$current_member->isAuthzFor($summit, $sponsor)) throw new HTTP403ForbiddenException("You are not allowed to perform this action"); $extra_question = $sponsor->getExtraQuestionById(intval($extra_question_id)); - if (is_null($extra_question)) return $this->error404(); - - return $this->ok(SerializerRegistry::getInstance() - ->getSerializer($extra_question, SerializerRegistry::SerializerType_Private) - ->serialize( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations() - ) + if (is_null($extra_question)) + return $this->error404(); + + return $this->ok( + SerializerRegistry::getInstance() + ->getSerializer($extra_question, SerializerRegistry::SerializerType_Private) + ->serialize( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations() + ) ); }); } + #[OA\Put( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/extra-questions/{extra_question_id}", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Update Sponsor Extra Question', + operationId: 'updateSponsorExtraQuestion', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'extra_question_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The extra question id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/SponsorExtraQuestionUpdateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Extra question updated successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -1313,31 +3467,87 @@ public function updateExtraQuestion($summit_id, $sponsor_id, $extra_question_id) { return $this->processRequest(function () use ($summit_id, $sponsor_id, $extra_question_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); // authz check $current_member = $this->resource_server_context->getCurrentUser(); - if(!$current_member->isAuthzFor( $summit, $sponsor)) + if (!$current_member->isAuthzFor($summit, $sponsor)) throw new HTTP403ForbiddenException("You are not allowed to perform this action"); $payload = $this->getJsonPayload(SponsorExtraQuestionValidationRulesFactory::buildForUpdate(), true); $extra_question = $this->service->updateSponsorExtraQuestion($summit, intval($sponsor_id), intval($extra_question_id), $payload); - return $this->updated(SerializerRegistry::getInstance() - ->getSerializer($extra_question, SerializerRegistry::SerializerType_Private) - ->serialize( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations() - ) + return $this->updated( + SerializerRegistry::getInstance() + ->getSerializer($extra_question, SerializerRegistry::SerializerType_Private) + ->serialize( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations() + ) ); }); } + #[OA\Delete( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/extra-questions/{extra_question_id}", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Delete Sponsor Extra Question', + operationId: 'deleteSponsorExtraQuestion', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'extra_question_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The extra question id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_NO_CONTENT, + description: 'Extra question deleted successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -1349,14 +3559,16 @@ public function deleteExtraQuestion($summit_id, $sponsor_id, $extra_question_id) return $this->processRequest(function () use ($summit_id, $sponsor_id, $extra_question_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); // authz check $current_member = $this->resource_server_context->getCurrentUser(); - if(!$current_member->isAuthzFor($summit, $sponsor)) + if (!$current_member->isAuthzFor($summit, $sponsor)) throw new HTTP403ForbiddenException("You are not allowed to perform this action"); $this->service->deleteSponsorExtraQuestion($summit, intval($sponsor_id), intval($extra_question_id)); @@ -1368,6 +3580,65 @@ public function deleteExtraQuestion($summit_id, $sponsor_id, $extra_question_id) // Question Values use ParametrizedAddEntity; + #[OA\Post( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/extra-questions/{extra_question_id}/values", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Add Extra Question Value', + operationId: 'addSponsorExtraQuestionValue', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'extra_question_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The extra question id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/ExtraQuestionValueCreateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Question value created successfully', + content: new OA\JsonContent(ref: '#/components/schemas/ExtraQuestionTypeValue') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -1378,34 +3649,105 @@ public function addExtraQuestionValue($summit_id, $sponsor_id, $extra_question_i { return $this->processRequest(function () use ($summit_id, $sponsor_id, $extra_question_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); $args = [$summit, intval($sponsor_id), intval($extra_question_id)]; // authz check $current_member = $this->resource_server_context->getCurrentUser(); - if(!$current_member->isAuthzFor( $summit, $sponsor)) + if (!$current_member->isAuthzFor($summit, $sponsor)) throw new HTTP403ForbiddenException("You are not allowed to perform this action"); return $this->_add( function ($payload) { return ExtraQuestionTypeValueValidationRulesFactory::buildForAdd($payload); }, - function ($payload, $summit, $sponsor_id, $question_id) { + function ($payload, $summit, $sponsor_id, $question_id) { return $this->service->addExtraQuestionValue ( - $summit, intval($sponsor_id), intval($question_id), $payload + $summit, + intval($sponsor_id), + intval($question_id), + $payload ); }, - ...$args); + ...$args + ); }); } use ParametrizedUpdateEntity; + #[OA\Put( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/extra-questions/{extra_question_id}/values/{value_id}", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Update Extra Question Value', + operationId: 'updateSponsorExtraQuestionValue', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'extra_question_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The extra question id' + ), + new OA\Parameter( + name: 'value_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The question value id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/ExtraQuestionValueUpdateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Question value updated successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -1418,22 +3760,26 @@ public function updateExtraQuestionValue($summit_id, $sponsor_id, $extra_questio return $this->processRequest(function () use ($summit_id, $sponsor_id, $extra_question_id, $value_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); $args = [$summit, intval($sponsor_id), intval($extra_question_id)]; // authz check $current_member = $this->resource_server_context->getCurrentUser(); - if(!$current_member->isAuthzFor( $summit, $sponsor)) + if (!$current_member->isAuthzFor($summit, $sponsor)) throw new HTTP403ForbiddenException("You are not allowed to perform this action"); - return $this->_update($value_id, function ($payload) { - return ExtraQuestionTypeValueValidationRulesFactory::buildForUpdate($payload); - }, - function ($value_id, $payload, $summit, $sponsor_id, $extra_question_id) { + return $this->_update( + $value_id, + function ($payload) { + return ExtraQuestionTypeValueValidationRulesFactory::buildForUpdate($payload); + }, + function ($value_id, $payload, $summit, $sponsor_id, $extra_question_id) { return $this->service->updateExtraQuestionValue ( $summit, @@ -1442,11 +3788,73 @@ function ($value_id, $payload, $summit, $sponsor_id, $extra_question_id) { intval($value_id), $payload ); - }, ...$args); + }, + ...$args + ); }); } use ParametrizedDeleteEntity; + #[OA\Delete( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/extra-questions/{extra_question_id}/values/{value_id}", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Delete Extra Question Value', + operationId: 'deleteSponsorExtraQuestionValue', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + new OA\Parameter( + name: 'extra_question_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The extra question id' + ), + new OA\Parameter( + name: 'value_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The question value id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_NO_CONTENT, + description: 'Question value deleted successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param $summit_id * @param $sponsor_id @@ -1458,99 +3866,267 @@ public function deleteExtraQuestionValue($summit_id, $sponsor_id, $extra_questio { return $this->processRequest(function () use ($summit_id, $sponsor_id, $extra_question_id, $value_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); $args = [$summit, intval($sponsor_id), intval($extra_question_id)]; // authz check $current_member = $this->resource_server_context->getCurrentUser(); - if(!$current_member->isAuthzFor($summit, $sponsor)) + if (!$current_member->isAuthzFor($summit, $sponsor)) throw new HTTP403ForbiddenException("You are not allowed to perform this action"); - return $this->_delete($value_id, function ($value_id, $summit, $sponsor_id, $extra_question_id) { - $this->service->deleteExtraQuestionValue($summit, intval($sponsor_id), intval($extra_question_id), intval($value_id)); - } - , ...$args); + return $this->_delete( + $value_id, + function ($value_id, $summit, $sponsor_id, $extra_question_id) { + $this->service->deleteExtraQuestionValue($summit, intval($sponsor_id), intval($extra_question_id), intval($value_id)); + } + , + ...$args + ); }); } + #[OA\Get( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/lead-report-settings/metadata", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators . ", " . IGroup::Sponsors, + summary: 'Get Lead Report Settings Metadata', + operationId: 'getLeadReportSettingsMetadata', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + IGroup::Sponsors, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: 'Lead report settings metadata retrieved' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error") + ] + )] /** * @param $summit_id * @param $sponsor_id * @return mixed */ - public function getLeadReportSettingsMetadata($summit_id, $sponsor_id) { + public function getLeadReportSettingsMetadata($summit_id, $sponsor_id) + { return $this->processRequest(function () use ($summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); return $this->ok($summit->getLeadReportSettingsMetadata($sponsor)); }); } + #[OA\Post( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/lead-report-settings", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Add Lead Report Settings', + operationId: 'addLeadReportSettings', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/LeadReportSettingsCreateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Lead report settings created successfully', + content: new OA\JsonContent(ref: '#/components/schemas/SummitLeadReportSetting') + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error") + ] + )] /** * @param $summit_id * @param $sponsor_id * @return mixed */ - public function addLeadReportSettings($summit_id, $sponsor_id) { + public function addLeadReportSettings($summit_id, $sponsor_id) + { return $this->processRequest(function () use ($summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); $payload = $this->getJsonPayload(LeadReportSettingsValidationRulesFactory::buildForAdd(), true); $settings = $this->service->addLeadReportSettings($summit, $sponsor->getId(), $payload); - return $this->created(SerializerRegistry::getInstance() - ->getSerializer($settings) - ->serialize( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations() - ) + return $this->created( + SerializerRegistry::getInstance() + ->getSerializer($settings) + ->serialize( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations() + ) ); }); } + #[OA\Put( + path: "/api/v1/summits/{id}/sponsors/{sponsor_id}/lead-report-settings", + description: "required-groups " . IGroup::SuperAdmins . ", " . IGroup::Administrators . ", " . IGroup::SummitAdministrators, + summary: 'Update Lead Report Settings', + operationId: 'updateLeadReportSettings', + tags: ['Sponsors'], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + IGroup::SummitAdministrators, + ] + ], + security: [ + [ + 'summit_sponsor_oauth2' => [ + SummitScopes::WriteSummitData, + ] + ] + ], + parameters: [ + new OA\Parameter( + name: 'id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The summit id' + ), + new OA\Parameter( + name: 'sponsor_id', + in: 'path', + required: true, + schema: new OA\Schema(type: 'integer'), + description: 'The sponsor id' + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/LeadReportSettingsUpdateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: 'Lead report settings updated successfully' + ), + new OA\Response(response: Response::HTTP_UNAUTHORIZED, description: "Unauthorized"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not Found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error") + ] + )] /** * @param $summit_id * @param $sponsor_id * @return mixed */ - public function updateLeadReportSettings($summit_id, $sponsor_id) { + public function updateLeadReportSettings($summit_id, $sponsor_id) + { return $this->processRequest(function () use ($summit_id, $sponsor_id) { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); - if (is_null($summit)) return $this->error404(); + if (is_null($summit)) + return $this->error404(); $sponsor = $summit->getSummitSponsorById(intval($sponsor_id)); - if (is_null($sponsor)) return $this->error404(); + if (is_null($sponsor)) + return $this->error404(); $payload = $this->getJsonPayload(LeadReportSettingsValidationRulesFactory::buildForUpdate(), true); $settings = $this->service->updateLeadReportSettings($summit, $sponsor->getId(), $payload); - return $this->updated(SerializerRegistry::getInstance() - ->getSerializer($settings) - ->serialize( - SerializerUtils::getExpand(), - SerializerUtils::getFields(), - SerializerUtils::getRelations() - ) + return $this->updated( + SerializerRegistry::getInstance() + ->getSerializer($settings) + ->serialize( + SerializerUtils::getExpand(), + SerializerUtils::getFields(), + SerializerUtils::getRelations() + ) ); }); } -} +} \ No newline at end of file diff --git a/app/Swagger/Models/ExtraQuestionTypeSchema.php b/app/Swagger/Models/ExtraQuestionTypeSchema.php new file mode 100644 index 000000000..eb8cb5299 --- /dev/null +++ b/app/Swagger/Models/ExtraQuestionTypeSchema.php @@ -0,0 +1,45 @@ + 'Read Summit Sponsor Data', + SummitScopes::ReadAllSummitData => 'Read All Summit Sponsor Data', + SummitScopes::WriteSummitData => 'Write Summit Sponsor Data', + ], + ), + ], + ) +] +class SponsorOAuth2Schema {} diff --git a/app/Swagger/SponsorSchemas.php b/app/Swagger/SponsorSchemas.php new file mode 100644 index 000000000..113286c6c --- /dev/null +++ b/app/Swagger/SponsorSchemas.php @@ -0,0 +1,224 @@ +