diff --git a/app/Http/Controllers/Apis/Protected/Main/OAuth2CompaniesApiController.php b/app/Http/Controllers/Apis/Protected/Main/OAuth2CompaniesApiController.php index 15b33d3c1..9650c4a08 100644 --- a/app/Http/Controllers/Apis/Protected/Main/OAuth2CompaniesApiController.php +++ b/app/Http/Controllers/Apis/Protected/Main/OAuth2CompaniesApiController.php @@ -1,4 +1,7 @@ -repository = $company_repository; $this->service = $service; } + #[OA\Get( + path: "/api/v1/companies/{id}", + operationId: "getCompany", + summary: "Get a specific company", + description: "Returns detailed information about a specific company", + security: [ + [ + "companies_oauth2" => [ + CompanyScopes::Read, + ] + ] + ], + tags: ["Companies"], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + description: "Company ID", + schema: new OA\Schema(type: "integer") + ), + new OA\Parameter( + name: "expand", + in: "query", + required: false, + description: "Expand related entities. Available expansions: sponsorships, project_sponsorships", + schema: new OA\Schema(type: "string") + ), + new OA\Parameter( + name: "relations", + in: "query", + required: false, + description: "Load relations. Available: sponsorships, project_sponsorships", + schema: new OA\Schema(type: "string") + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: "Success", + content: new OA\JsonContent(ref: "#/components/schemas/Company") + ), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Company not found"), + ] + )] /** - * @return mixed + * Class OAuth2CompaniesApiController + * @package App\Http\Controllers */ + #[OA\Get( + path: "/api/public/v1/companies/{id}", + operationId: "getCompanyPublic", + summary: "Get a specific company (Public)", + description: "Returns detailed information about a specific company", + tags: ["Companies (Public)"], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + description: "Company ID", + schema: new OA\Schema(type: "integer") + ), + new OA\Parameter( + name: "expand", + in: "query", + required: false, + description: "Expand related entities. Available expansions: sponsorships, project_sponsorships", + schema: new OA\Schema(type: "string") + ), + new OA\Parameter( + name: "relations", + in: "query", + required: false, + description: "Load relations. Available: sponsorships, project_sponsorships", + schema: new OA\Schema(type: "string") + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: "Success", + content: new OA\JsonContent(ref: "#/components/schemas/Company") + ), + new OA\Response(response: Response::HTTP_NOT_FOUND, description: "Company not found"), + ] + )] + #[OA\Post( + path: "/api/v1/companies", + operationId: "createCompany", + summary: "Create a new company", + description: "Creates a new company", + security: [ + [ + "companies_oauth2" => [ + CompanyScopes::Write, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + ] + ], + tags: ["Companies"], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/CompanyCreateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: "Created", + content: new OA\JsonContent(ref: "#/components/schemas/Company") + ), + 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_PRECONDITION_FAILED, description: "Validation Error"), + ] + )] + #[OA\Put( + path: "/api/v1/companies/{id}", + operationId: "updateCompany", + summary: "Update a company", + description: "Updates an existing company", + security: [ + [ + "companies_oauth2" => [ + CompanyScopes::Write, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + ] + ], + tags: ["Companies"], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + description: "Company ID", + schema: new OA\Schema(type: "integer") + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\JsonContent(ref: "#/components/schemas/CompanyUpdateRequest") + ), + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: "Success", + content: new OA\JsonContent(ref: "#/components/schemas/Company") + ), + 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: "Company not found"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "Validation Error"), + ] + )] + #[OA\Delete( + path: "/api/v1/companies/{id}", + operationId: "deleteCompany", + summary: "Delete a company", + description: "Deletes a company", + security: [ + [ + "companies_oauth2" => [ + CompanyScopes::Write, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + ] + ], + tags: ["Companies"], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + description: "Company ID", + schema: new OA\Schema(type: "integer") + ), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: "Deleted successfully"), + 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: "Company not found"), + ] + )] + #[OA\Get( + path: "/api/v1/companies", + operationId: "getAllCompanies", + summary: "Get all companies", + description: "Returns a paginated list of companies. Allows ordering, filtering and pagination.", + security: [ + [ + "companies_oauth2" => [ + CompanyScopes::Read, + SummitScopes::ReadSummitData, + SummitScopes::ReadAllSummitData, + ] + ] + ], + tags: ["Companies"], + parameters: [ + new OA\Parameter( + name: 'page', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer'), + description: 'The page number' + ), + new OA\Parameter( + name: 'per_page', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer'), + description: 'The number of pages in each page', + ), + new OA\Parameter( + name: "filter[]", + in: "query", + required: false, + description: "Filter companies. Available filters: name (=@, ==, @@), member_level (=@, ==, @@), display_on_site (==)", + schema: new OA\Schema(type: "array", items: new OA\Items(type: "string")), + explode: true + ), + new OA\Parameter( + name: "order", + in: "query", + required: false, + description: "Order by field. Valid fields: id, name, member_level", + schema: new OA\Schema(type: "string") + ), + new OA\Parameter( + name: "expand", + in: "query", + required: false, + description: "Expand related entities. Available expansions: sponsorships, project_sponsorships", + schema: new OA\Schema(type: "string") + ), + new OA\Parameter( + name: "relations", + in: "query", + required: false, + description: "Load relations. Available: sponsorships, project_sponsorships", + schema: new OA\Schema(type: "string") + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: "Success", + content: new OA\JsonContent(ref: "#/components/schemas/PaginatedCompaniesResponse") + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), + ] + )] + + #[OA\Get( + path: "/api/public/v1/companies", + operationId: "getAllCompaniesPublic", + summary: "Get all companies (Public)", + description: "Returns a paginated list of companies. Allows ordering, filtering and pagination.", + tags: ["Companies (Public)"], + parameters: [ + new OA\Parameter( + name: 'page', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer'), + description: 'The page number' + ), + new OA\Parameter( + name: 'per_page', + in: 'query', + required: false, + schema: new OA\Schema(type: 'integer'), + description: 'The number of pages in each page', + ), + new OA\Parameter( + name: "filter[]", + in: "query", + required: false, + description: "Filter companies. Available filters: name (=@, ==, @@), member_level (=@, ==, @@), display_on_site (==)", + schema: new OA\Schema(type: "array", items: new OA\Items(type: "string")), + explode: true + ), + new OA\Parameter( + name: "order", + in: "query", + required: false, + description: "Order by field. Valid fields: id, name, member_level", + schema: new OA\Schema(type: "string") + ), + new OA\Parameter( + name: "expand", + in: "query", + required: false, + description: "Expand related entities. Available expansions: sponsorships, project_sponsorships", + schema: new OA\Schema(type: "string") + ), + new OA\Parameter( + name: "relations", + in: "query", + required: false, + description: "Load relations. Available: sponsorships, project_sponsorships", + schema: new OA\Schema(type: "string") + ), + ], + responses: [ + new OA\Response( + response: Response::HTTP_OK, + description: "Success", + content: new OA\JsonContent(ref: "#/components/schemas/PaginatedCompaniesResponse") + ), + new OA\Response(response: Response::HTTP_BAD_REQUEST, description: "Bad Request"), + ] + )] public function getAllCompanies() { @@ -72,14 +408,14 @@ function () { return [ 'name' => ['=@', '==', '@@'], 'member_level' => ['=@', '==', '@@'], - 'display_on_site' => [ '=='], + 'display_on_site' => ['=='], ]; }, function () { return [ 'name' => 'sometimes|string', 'member_level' => 'sometimes|string', - 'display_on_site' => ['sometimes', new Boolean], + 'display_on_site' => ['sometimes', new Boolean], ]; }, function () { @@ -93,7 +429,7 @@ function ($filter) { return $filter; }, function () { - return $this->getEntitySerializerType(); + return $this->getEntitySerializerType(); } ); } @@ -117,7 +453,8 @@ protected function addEntity(array $payload): IEntity return $this->service->addCompany($payload); } - protected function addEntitySerializerType(){ + protected function addEntitySerializerType() + { return $this->getEntitySerializerType(); } @@ -145,7 +482,8 @@ protected function getEntitySerializerType() SerializerRegistry::SerializerType_Public; } - protected function updateEntitySerializerType(){ + protected function updateEntitySerializerType() + { return $this->getEntitySerializerType(); } /** @@ -168,11 +506,64 @@ protected function updateEntity($id, array $payload): IEntity // Logos - /** - * @param LaravelRequest $request - * @param $speaker_id - * @return mixed - */ + #[OA\Post( + path: "/api/v1/companies/{id}/logo", + operationId: "addCompanyLogo", + summary: "Add company logo", + description: "Uploads a logo image for the company", + security: [ + [ + "companies_oauth2" => [ + CompanyScopes::Write, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + ] + ], + tags: ["Companies"], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + description: "Company ID", + schema: new OA\Schema(type: "integer") + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\MediaType( + mediaType: "multipart/form-data", + schema: new OA\Schema( + required: ["file"], + properties: [ + new OA\Property( + property: "file", + type: "string", + format: "binary", + description: "Logo image file" + ) + ] + ) + ) + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: "Logo uploaded successfully", + content: new OA\JsonContent(type: "object") + ), + 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: "Company not found"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "File parameter not set"), + ] + )] public function addCompanyLogo(LaravelRequest $request, $company_id) { return $this->processRequest(function () use ($request, $company_id) { @@ -188,10 +579,41 @@ public function addCompanyLogo(LaravelRequest $request, $company_id) }); } - /** - * @param $company_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Delete( + path: "/api/v1/companies/{id}/logo", + operationId: "deleteCompanyLogo", + summary: "Delete company logo", + description: "Removes the logo image from the company", + security: [ + [ + "companies_oauth2" => [ + CompanyScopes::Write, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + ] + ], + tags: ["Companies"], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + description: "Company ID", + schema: new OA\Schema(type: "integer") + ), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: "Logo deleted successfully"), + 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: "Company not found"), + ] + )] public function deleteCompanyLogo($company_id) { return $this->processRequest(function () use ($company_id) { @@ -203,11 +625,64 @@ public function deleteCompanyLogo($company_id) }); } - /** - * @param LaravelRequest $request - * @param $speaker_id - * @return mixed - */ + #[OA\Post( + path: "/api/v1/companies/{id}/logo/big", + operationId: "addCompanyBigLogo", + summary: "Add company big logo", + description: "Uploads a big logo image for the company", + security: [ + [ + "companies_oauth2" => [ + CompanyScopes::Write, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + ] + ], + tags: ["Companies"], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + description: "Company ID", + schema: new OA\Schema(type: "integer") + ), + ], + requestBody: new OA\RequestBody( + required: true, + content: new OA\MediaType( + mediaType: "multipart/form-data", + schema: new OA\Schema( + required: ["file"], + properties: [ + new OA\Property( + property: "file", + type: "string", + format: "binary", + description: "Big logo image file" + ) + ] + ) + ) + ), + responses: [ + new OA\Response( + response: Response::HTTP_CREATED, + description: "Big logo uploaded successfully", + content: new OA\JsonContent(type: "object") + ), + 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: "Company not found"), + new OA\Response(response: Response::HTTP_PRECONDITION_FAILED, description: "File parameter not set"), + ] + )] public function addCompanyBigLogo(LaravelRequest $request, $company_id) { return $this->processRequest(function () use ($request, $company_id) { @@ -222,10 +697,41 @@ public function addCompanyBigLogo(LaravelRequest $request, $company_id) }); } - /** - * @param $company_id - * @return \Illuminate\Http\JsonResponse|mixed - */ + #[OA\Delete( + path: "/api/v1/companies/{id}/logo/big", + operationId: "deleteCompanyBigLogo", + summary: "Delete company big logo", + description: "Removes the big logo image from the company", + security: [ + [ + "companies_oauth2" => [ + CompanyScopes::Write, + ] + ] + ], + x: [ + 'required-groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + ] + ], + tags: ["Companies"], + parameters: [ + new OA\Parameter( + name: "id", + in: "path", + required: true, + description: "Company ID", + schema: new OA\Schema(type: "integer") + ), + ], + responses: [ + new OA\Response(response: Response::HTTP_NO_CONTENT, description: "Big logo deleted successfully"), + 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: "Company not found"), + ] + )] public function deleteCompanyBigLogo($company_id) { return $this->processRequest(function () use ($company_id) { diff --git a/app/Swagger/CompaniesSchemas.php b/app/Swagger/CompaniesSchemas.php index 6b3e2f895..58f630983 100644 --- a/app/Swagger/CompaniesSchemas.php +++ b/app/Swagger/CompaniesSchemas.php @@ -4,4 +4,136 @@ use OpenApi\Attributes as OA; -// +// Companies Schemas + +#[OA\Schema( + schema: "Company", + description: "Company", + properties: [ + new OA\Property(property: "id", type: "integer", example: 1), + new OA\Property(property: "created", type: "integer", format: "int64", description: "Creation timestamp (epoch)", example: 1234567890), + new OA\Property(property: "last_edited", type: "integer", format: "int64", description: "Last edit timestamp (epoch)", example: 1234567890), + new OA\Property(property: "name", type: "string", example: "Acme Corporation"), + new OA\Property(property: "url", type: "string", format: "uri", nullable: true, example: "https://www.acme.com"), + new OA\Property(property: "url_segment", type: "string", nullable: true, example: "acme-corporation"), + new OA\Property(property: "display_on_site", type: "boolean", example: true), + new OA\Property(property: "featured", type: "boolean", example: false), + new OA\Property(property: "city", type: "string", nullable: true, example: "San Francisco"), + new OA\Property(property: "state", type: "string", nullable: true, example: "California"), + new OA\Property(property: "country", type: "string", nullable: true, example: "United States"), + new OA\Property(property: "description", type: "string", nullable: true, example: "Leading technology company"), + new OA\Property(property: "industry", type: "string", nullable: true, example: "Technology"), + new OA\Property(property: "products", type: "string", nullable: true, example: "Cloud services, Software"), + new OA\Property(property: "contributions", type: "string", nullable: true, example: "OpenStack contributions"), + new OA\Property(property: "contact_email", type: "string", format: "email", nullable: true, example: "contact@acme.com"), + new OA\Property(property: "member_level", type: "string", nullable: true, example: "Platinum"), + new OA\Property(property: "admin_email", type: "string", format: "email", nullable: true, example: "admin@acme.com"), + new OA\Property(property: "color", type: "string", nullable: true, example: "#FF5733"), + new OA\Property(property: "logo", type: "string", format: "uri", nullable: true, example: "https://cdn.example.com/logo.png"), + new OA\Property(property: "big_logo", type: "string", format: "uri", nullable: true, example: "https://cdn.example.com/big_logo.png"), + new OA\Property(property: "overview", type: "string", nullable: true, example: "Company overview"), + new OA\Property(property: "commitment", type: "string", nullable: true, example: "Commitment to open source"), + new OA\Property(property: "commitment_author", type: "string", nullable: true, example: "John Doe, CEO"), + new OA\Property( + property: "sponsorships", + type: "array", + items: new OA\Items(oneOf: [ + new OA\Schema(type: "integer"), + new OA\Schema(ref: "#/components/schemas/SummitSponsorship"), + ]), + description: "Array of sponsorship IDs (only when relations=sponsorships)", + ), + new OA\Property( + property: "project_sponsorships", + type: "array", + items: new OA\Items(oneOf: [ + new OA\Schema(type: "integer"), + new OA\Schema(ref: "#/components/schemas/ProjectSponsorshipType"), + ]), + description: "Array of project sponsorship IDs (only when relations=project_sponsorships)", + ), + ], + type: "object" +)] +class CompanySchema +{ +} + +#[OA\Schema( + schema: "PaginatedCompaniesResponse", + description: "Paginated response for Companies", + properties: [ + new OA\Property(property: "total", type: "integer", example: 100), + new OA\Property(property: "per_page", type: "integer", example: 15), + new OA\Property(property: "current_page", type: "integer", example: 1), + new OA\Property(property: "last_page", type: "integer", example: 7), + new OA\Property( + property: "data", + type: "array", + items: new OA\Items(ref: "#/components/schemas/Company") + ), + ], + type: "object" +)] +class PaginatedCompaniesResponseSchema +{ +} + +#[OA\Schema( + schema: "CompanyCreateRequest", + description: "Request to create a Company", + required: ["name"], + properties: [ + new OA\Property(property: "name", type: "string", example: "Acme Corporation"), + new OA\Property(property: "url", type: "string", format: "uri", nullable: true, example: "https://www.acme.com"), + new OA\Property(property: "display_on_site", type: "boolean", nullable: true, example: true), + new OA\Property(property: "featured", type: "boolean", nullable: true, example: false), + new OA\Property(property: "city", type: "string", nullable: true, example: "San Francisco"), + new OA\Property(property: "state", type: "string", nullable: true, example: "California"), + new OA\Property(property: "country", type: "string", nullable: true, example: "United States"), + new OA\Property(property: "description", type: "string", nullable: true, example: "Leading technology company"), + new OA\Property(property: "industry", type: "string", nullable: true, example: "Technology"), + new OA\Property(property: "products", type: "string", nullable: true, example: "Cloud services, Software"), + new OA\Property(property: "contributions", type: "string", nullable: true, example: "OpenStack contributions"), + new OA\Property(property: "contact_email", type: "string", format: "email", nullable: true, example: "contact@acme.com"), + new OA\Property(property: "member_level", type: "string", nullable: true, example: "Platinum"), + new OA\Property(property: "admin_email", type: "string", format: "email", nullable: true, example: "admin@acme.com"), + new OA\Property(property: "color", type: "string", description: "Hex color code", nullable: true, example: "#FF5733"), + new OA\Property(property: "overview", type: "string", nullable: true, example: "Company overview"), + new OA\Property(property: "commitment", type: "string", nullable: true, example: "Commitment to open source"), + new OA\Property(property: "commitment_author", type: "string", nullable: true, example: "John Doe, CEO"), + ], + type: "object" +)] +class CompanyCreateRequestSchema +{ +} + +#[OA\Schema( + schema: "CompanyUpdateRequest", + description: "Request to update a Company", + properties: [ + new OA\Property(property: "name", type: "string", nullable: true, example: "Acme Corporation"), + new OA\Property(property: "url", type: "string", format: "uri", nullable: true, example: "https://www.acme.com"), + new OA\Property(property: "display_on_site", type: "boolean", nullable: true, example: true), + new OA\Property(property: "featured", type: "boolean", nullable: true, example: false), + new OA\Property(property: "city", type: "string", nullable: true, example: "San Francisco"), + new OA\Property(property: "state", type: "string", nullable: true, example: "California"), + new OA\Property(property: "country", type: "string", nullable: true, example: "United States"), + new OA\Property(property: "description", type: "string", nullable: true, example: "Leading technology company"), + new OA\Property(property: "industry", type: "string", nullable: true, example: "Technology"), + new OA\Property(property: "products", type: "string", nullable: true, example: "Cloud services, Software"), + new OA\Property(property: "contributions", type: "string", nullable: true, example: "OpenStack contributions"), + new OA\Property(property: "contact_email", type: "string", format: "email", nullable: true, example: "contact@acme.com"), + new OA\Property(property: "member_level", type: "string", nullable: true, example: "Platinum"), + new OA\Property(property: "admin_email", type: "string", format: "email", nullable: true, example: "admin@acme.com"), + new OA\Property(property: "color", type: "string", description: "Hex color code", nullable: true, example: "#FF5733"), + new OA\Property(property: "overview", type: "string", nullable: true, example: "Company overview"), + new OA\Property(property: "commitment", type: "string", nullable: true, example: "Commitment to open source"), + new OA\Property(property: "commitment_author", type: "string", nullable: true, example: "John Doe, CEO"), + ], + type: "object" +)] +class CompanyUpdateRequestSchema +{ +} \ No newline at end of file diff --git a/app/Swagger/Security/CompaniesOAuth2Schema.php b/app/Swagger/Security/CompaniesOAuth2Schema.php new file mode 100644 index 000000000..3edb5a593 --- /dev/null +++ b/app/Swagger/Security/CompaniesOAuth2Schema.php @@ -0,0 +1,30 @@ + 'Read Data', + CompanyScopes::Write => 'Write Data', + SummitScopes::ReadSummitData => 'Read Summit Data', + SummitScopes::ReadAllSummitData => 'Read All Summit Data', + SummitScopes::WriteSummitData => 'Write Summit Data', + ], + ), + ], +) +] +class CompaniesOAuth2Schema +{ +}