diff --git a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSponsorshipsApiController.php b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSponsorshipsApiController.php index 7c61bc348..68c9f5b6b 100644 --- a/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSponsorshipsApiController.php +++ b/app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitSponsorshipsApiController.php @@ -16,10 +16,14 @@ use App\Models\Foundation\Summit\Repositories\ISummitSponsorshipRepository; use App\ModelSerializers\SerializerUtils; use App\Services\Model\ISummitSponsorshipService; +use App\Swagger\Summit\SummitSponsorshipAddOnSchema; +use App\Swagger\Summit\SummitSponsorshipSchema; use Illuminate\Http\JsonResponse; use models\oauth2\IResourceServerContext; use models\summit\ISummitRepository; use ModelSerializers\SerializerRegistry; +use OpenApi\Attributes as OA; +use Symfony\Component\HttpFoundation\Response; use utils\Filter; use utils\FilterElement; use utils\PagingInfo; @@ -28,6 +32,7 @@ * Class OAuth2SummitSponsorshipsApiController * @package App\Http\Controllers */ +#[OA\Tag(name: "Sponsorships", description: "Sponsorships endpoints")] final class OAuth2SummitSponsorshipsApiController extends OAuth2ProtectedController { @@ -77,6 +82,36 @@ public function __construct * @param $sponsor_id * @return JsonResponse|mixed */ + #[OA\Get( + path: "/summits/{id}/sponsors/{sponsor_id}/sponsorships", + operationId: "getAllSponsorships", + description: "Get all sponsorships for a sponsor", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "sponsor_id", description: "Sponsor ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "page", description: "Page number", in: "query", schema: new OA\Schema(type: "integer", default: 1)), + new OA\Parameter(name: "per_page", description: "Items per page", in: "query", schema: new OA\Schema(type: "integer", default: 10)), + new OA\Parameter(name: "expand", description: "Expand relations", in: "query", schema: new OA\Schema(type: "string")), + new OA\Parameter(name: "fields", description: "Fields to return", in: "query", schema: new OA\Schema(type: "string")), + new OA\Parameter(name: "filter", description: "Filter conditions", in: "query", schema: new OA\Schema(type: "string")), + new OA\Parameter(name: "order", description: "Order by", in: "query", schema: new OA\Schema(type: "string")), + ], + tags: ["Sponsorships"], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: "List of sponsorships", content: new OA\JsonContent( + type: "object", + properties: [ + new OA\Property(property: "data", type: "array", items: new OA\Items(ref: "#/components/schemas/SummitSponsorship")), + new OA\Property(property: "page", type: "integer"), + new OA\Property(property: "per_page", type: "integer"), + new OA\Property(property: "total", type: "integer"), + ] + )), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not found"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function getAll($summit_id, $sponsor_id): mixed { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -132,6 +167,25 @@ function ($filter) use ($summit, $sponsor) { * @param $sponsorship_id * @return mixed */ + #[OA\Get( + path: "/summits/{id}/sponsors/{sponsor_id}/sponsorships/{sponsorship_id}", + operationId: "getSponsorshipById", + description: "Get sponsorship by ID", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "sponsor_id", description: "Sponsor ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "sponsorship_id", description: "Sponsorship ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "expand", description: "Expand relations", in: "query", schema: new OA\Schema(type: "string")), + new OA\Parameter(name: "fields", description: "Fields to return", in: "query", schema: new OA\Schema(type: "string")), + ], + tags: ["Sponsorships"], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: "Sponsorship data", content: new OA\JsonContent(ref: "#/components/schemas/SummitSponsorship")), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not found"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function getById($summit_id, $sponsor_id, $sponsorship_id): mixed { return $this->processRequest(function () use ($summit_id, $sponsor_id, $sponsorship_id) { @@ -165,6 +219,36 @@ public function getById($summit_id, $sponsor_id, $sponsorship_id): mixed * @param $sponsor_id * @return mixed */ + #[OA\Post( + path: "/summits/{id}/sponsors/{sponsor_id}/sponsorships", + operationId: "addSponsorshipsFromTypes", + description: "Add sponsorships from types", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "sponsor_id", description: "Sponsor ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent( + type: "object", + required: ["type_ids"], + properties: [ + new OA\Property(property: "type_ids", type: "array", items: new OA\Items(type: "integer")), + ] + ) + ), + tags: ["Sponsorships"], + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: "Sponsorships created", content: new OA\JsonContent( + type: "array", + items: new OA\Items(ref: "#/components/schemas/SummitSponsorship") + )), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not found"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + 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 addFromTypes($summit_id, $sponsor_id): mixed { return $this->processRequest(function () use ($summit_id, $sponsor_id) { @@ -202,6 +286,23 @@ public function addFromTypes($summit_id, $sponsor_id): mixed * @param $sponsorship_id * @return mixed */ + #[OA\Delete( + path: "/summits/{id}/sponsors/{sponsor_id}/sponsorships/{sponsorship_id}", + operationId: "removeSponsorships", + description: "Remove a sponsorship", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "sponsor_id", description: "Sponsor ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "sponsorship_id", description: "Sponsorship ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + tags: ["Sponsorships"], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: "Sponsorship deleted"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not found"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function remove($summit_id, $sponsor_id, $sponsorship_id): mixed { return $this->processRequest(function () use ($summit_id, $sponsor_id, $sponsorship_id) { @@ -227,6 +328,37 @@ public function remove($summit_id, $sponsor_id, $sponsorship_id): mixed * @param $sponsorship_id * @return mixed */ + #[OA\Get( + path: "/summits/{id}/sponsors/{sponsor_id}/sponsorships/{sponsorship_id}/add-ons", + operationId: "getAllAddOns", + description: "Get all add-ons for a sponsorship", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "sponsor_id", description: "Sponsor ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "sponsorship_id", description: "Sponsorship ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "page", description: "Page number", in: "query", schema: new OA\Schema(type: "integer", default: 1)), + new OA\Parameter(name: "per_page", description: "Items per page", in: "query", schema: new OA\Schema(type: "integer", default: 10)), + new OA\Parameter(name: "expand", description: "Expand relations", in: "query", schema: new OA\Schema(type: "string")), + new OA\Parameter(name: "fields", description: "Fields to return", in: "query", schema: new OA\Schema(type: "string")), + new OA\Parameter(name: "filter", description: "Filter conditions", in: "query", schema: new OA\Schema(type: "string")), + new OA\Parameter(name: "order", description: "Order by", in: "query", schema: new OA\Schema(type: "string")), + ], + tags: ["Sponsorships Add-Ons"], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: "List of add-ons", content: new OA\JsonContent( + type: "object", + properties: [ + new OA\Property(property: "data", type: "array", items: new OA\Items(ref: "#/components/schemas/SummitSponsorshipAddOn")), + new OA\Property(property: "page", type: "integer"), + new OA\Property(property: "per_page", type: "integer"), + new OA\Property(property: "total", type: "integer"), + ] + )), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not found"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function getAllAddOns($summit_id, $sponsor_id, $sponsorship_id): mixed { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); @@ -292,6 +424,37 @@ function ($page, $per_page, $filter, $order, $applyExtraFilters) { * @param $sponsorship_id * @return mixed */ + #[OA\Post( + path: "/summits/{id}/sponsors/{sponsor_id}/sponsorships/{sponsorship_id}/add-ons", + operationId: "addNewAddOn", + description: "Add a new add-on to a sponsorship", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "sponsor_id", description: "Sponsor ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "sponsorship_id", description: "Sponsorship ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent( + type: "object", + required: ["name", "type"], + properties: [ + new OA\Property(property: "name", type: "string"), + new OA\Property(property: "type", type: "string"), + new OA\Property(property: "label", type: "string"), + new OA\Property(property: "size", type: "string"), + ] + ) + ), + tags: ["Sponsorships Add-Ons"], + responses: [ + new OA\Response(response: Response::HTTP_CREATED, description: "Add-on created", content: new OA\JsonContent(ref: "#/components/schemas/SummitSponsorshipAddOn")), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not found"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + 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 addNewAddOn($summit_id, $sponsor_id, $sponsorship_id): mixed { return $this->processRequest(function () use ($summit_id, $sponsor_id, $sponsorship_id) { @@ -324,6 +487,26 @@ public function addNewAddOn($summit_id, $sponsor_id, $sponsorship_id): mixed * @param $add_on_id * @return mixed */ + #[OA\Get( + path: "/summits/{id}/sponsors/{sponsor_id}/sponsorships/{sponsorship_id}/add-ons/{add_on_id}", + operationId: "getAddOnById", + description: "Get add-on by ID", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "sponsor_id", description: "Sponsor ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "sponsorship_id", description: "Sponsorship ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "add_on_id", description: "Add-on ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "expand", description: "Expand relations", in: "query", schema: new OA\Schema(type: "string")), + new OA\Parameter(name: "fields", description: "Fields to return", in: "query", schema: new OA\Schema(type: "string")), + ], + tags: ["Sponsorships Add-Ons"], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: "Add-on data", content: new OA\JsonContent(ref: "#/components/schemas/SummitSponsorshipAddOn")), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not found"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function getAddOnById($summit_id, $sponsor_id, $sponsorship_id, $add_on_id): mixed { return $this->processRequest(function () use ($summit_id, $sponsor_id, $sponsorship_id, $add_on_id) { @@ -360,6 +543,37 @@ public function getAddOnById($summit_id, $sponsor_id, $sponsorship_id, $add_on_i * @param $add_on_id * @return mixed */ + #[OA\Put( + path: "/summits/{id}/sponsors/{sponsor_id}/sponsorships/{sponsorship_id}/add-ons/{add_on_id}", + operationId: "updateAddOn", + description: "Update an add-on", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "sponsor_id", description: "Sponsor ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "sponsorship_id", description: "Sponsorship ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "add_on_id", description: "Add-on ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent( + type: "object", + properties: [ + new OA\Property(property: "name", type: "string"), + new OA\Property(property: "type", type: "string"), + new OA\Property(property: "label", type: "string"), + new OA\Property(property: "size", type: "string"), + ] + ) + ), + tags: ["Sponsorships Add-Ons"], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: "Add-on updated", content: new OA\JsonContent(ref: "#/components/schemas/SummitSponsorshipAddOn")), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not found"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + 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 updateAddOn($summit_id, $sponsor_id, $sponsorship_id, $add_on_id): mixed { return $this->processRequest(function () use ($summit_id, $sponsor_id, $sponsorship_id, $add_on_id) { @@ -392,6 +606,24 @@ public function updateAddOn($summit_id, $sponsor_id, $sponsorship_id, $add_on_id * @param $add_on_id * @return mixed */ + #[OA\Delete( + path: "/summits/{id}/sponsors/{sponsor_id}/sponsorships/{sponsorship_id}/add-ons/{add_on_id}", + operationId: "removeAddOn", + description: "Remove an add-on", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "sponsor_id", description: "Sponsor ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "sponsorship_id", description: "Sponsorship ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + new OA\Parameter(name: "add_on_id", description: "Add-on ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + tags: ["Sponsorships Add-Ons"], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: "Add-on deleted"), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not found"), + new OA\Response(response: Response::HTTP_FORBIDDEN, description: "Forbidden"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function removeAddOn($summit_id, $sponsor_id, $sponsorship_id, $add_on_id): mixed { return $this->processRequest(function () use ($summit_id, $sponsor_id, $sponsorship_id, $add_on_id) { @@ -415,6 +647,20 @@ public function removeAddOn($summit_id, $sponsor_id, $sponsorship_id, $add_on_id * @param $summit_id * @return mixed */ + #[OA\Get( + path: "/summits/{id}/add-ons/metadata", + operationId: "getAddOnsMetadata", + description: "Get add-ons metadata", + parameters: [ + new OA\Parameter(name: "id", description: "Summit ID", in: "path", required: true, schema: new OA\Schema(type: "integer")), + ], + tags: ["Sponsorships Add-Ons"], + responses: [ + new OA\Response(response: Response::HTTP_OK, description: "Add-ons metadata", content: new OA\JsonContent(type: "object")), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Not found"), + new OA\Response(response: Response::HTTP_INTERNAL_SERVER_ERROR, description: "Server Error"), + ] + )] public function getMetadata($summit_id): mixed { $summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->resource_server_context)->find($summit_id); diff --git a/app/Swagger/SummitSponsorshipAddOnSchemas.php b/app/Swagger/SummitSponsorshipAddOnSchemas.php new file mode 100644 index 000000000..82b049981 --- /dev/null +++ b/app/Swagger/SummitSponsorshipAddOnSchemas.php @@ -0,0 +1,18 @@ +