diff --git a/app/Http/Controllers/Apis/Protected/Main/Factories/CompanyValidationRulesFactory.php b/app/Http/Controllers/Apis/Protected/Main/Factories/CompanyValidationRulesFactory.php new file mode 100644 index 00000000..af69b806 --- /dev/null +++ b/app/Http/Controllers/Apis/Protected/Main/Factories/CompanyValidationRulesFactory.php @@ -0,0 +1,74 @@ + 'sometimes|string', + 'url' => 'nullable|url', + 'display_on_site' => 'nullable|boolean', + 'featured' => 'nullable|boolean', + 'city' => 'nullable|string', + 'state' => 'nullable|string', + 'country' => 'nullable|string', + 'description' => 'nullable|string', + 'industry' => 'nullable|string', + 'products' => 'nullable|string', + 'contributions' => 'nullable|string', + 'contact_email' => 'nullable|email', + 'member_level' => 'nullable|string', + 'admin_email' => 'nullable|email', + 'color' => 'nullable|hex_color', + 'overview' => 'nullable|string', + 'commitment' => 'nullable|string', + 'commitment_author' => 'nullable|string', + ]; + } + + return [ + 'name' => 'required|string', + 'url' => 'nullable|url', + 'display_on_site' => 'nullable|boolean', + 'featured' => 'nullable|boolean', + 'city' => 'nullable|string', + 'state' => 'nullable|string', + 'country' => 'nullable|string', + 'description' => 'nullable|string', + 'industry' => 'nullable|string', + 'products' => 'nullable|string', + 'contributions' => 'nullable|string', + 'contact_email' => 'nullable|email', + 'member_level' => 'nullable|string', + 'admin_email' => 'nullable|email', + 'color' => 'nullable|hex_color', + 'overview' => 'nullable|string', + 'commitment' => 'nullable|string', + 'commitment_author' => 'nullable|string', + ]; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Apis/Protected/Main/OAuth2CompaniesApiController.php b/app/Http/Controllers/Apis/Protected/Main/OAuth2CompaniesApiController.php index a76c8996..8025022c 100644 --- a/app/Http/Controllers/Apis/Protected/Main/OAuth2CompaniesApiController.php +++ b/app/Http/Controllers/Apis/Protected/Main/OAuth2CompaniesApiController.php @@ -12,11 +12,15 @@ * limitations under the License. **/ use App\Services\Model\ICompanyService; +use Illuminate\Support\Facades\Log; +use models\exceptions\EntityNotFoundException; use models\main\ICompanyRepository; use models\oauth2\IResourceServerContext; use models\utils\IEntity; use ModelSerializers\SerializerRegistry; use models\exceptions\ValidationException; +use Illuminate\Http\Request as LaravelRequest; +use Exception; /** * Class OAuth2CompaniesApiController * @package App\Http\Controllers @@ -24,6 +28,16 @@ use models\exceptions\ValidationException; final class OAuth2CompaniesApiController extends OAuth2ProtectedController { + use ParametrizedGetAll; + + use AddEntity; + + use UpdateEntity; + + use DeleteEntity; + + use GetEntity; + /** * @var ICompanyService */ @@ -47,8 +61,6 @@ final class OAuth2CompaniesApiController extends OAuth2ProtectedController $this->service = $service; } - use ParametrizedGetAll; - /** * @return mixed */ @@ -81,23 +93,13 @@ final class OAuth2CompaniesApiController extends OAuth2ProtectedController ); } - use AddEntity; - /** * @param array $payload * @return array */ function getAddValidationRules(array $payload): array { - return [ - 'name' => 'required|string', - 'description' => 'nullable|string', - 'url' => 'nullable|url', - 'industry' => 'nullable|string', - 'city' => 'nullable|string', - 'state' => 'nullable|string', - 'country' => 'nullable|string', - ]; + return CompanyValidationRulesFactory::build($payload); } /** @@ -109,4 +111,98 @@ final class OAuth2CompaniesApiController extends OAuth2ProtectedController { return $this->service->addCompany($payload); } + + /** + * @inheritDoc + */ + protected function deleteEntity(int $id): void + { + $this->service->deleteCompany($id); + } + + /** + * @inheritDoc + */ + protected function getEntity(int $id): IEntity + { + return $this->repository->getById($id); + } + + /** + * @inheritDoc + */ + function getUpdateValidationRules(array $payload): array + { + return CompanyValidationRulesFactory::build($payload, true); + } + + /** + * @inheritDoc + */ + protected function updateEntity($id, array $payload): IEntity + { + return $this->service->updateCompany($id, $payload); + } + + // Logos + + /** + * @param LaravelRequest $request + * @param $speaker_id + * @return mixed + */ + public function addCompanyLogo(LaravelRequest $request, $company_id) + { + try { + + $file = $request->file('file'); + if (is_null($file)) { + return $this->error412(array('file param not set!')); + } + + $logo = $this->service->addCompanyLogo($company_id, $file); + + return $this->created(SerializerRegistry::getInstance()->getSerializer($logo)->serialize()); + + } catch (EntityNotFoundException $ex1) { + Log::warning($ex1); + return $this->error404(); + } catch (ValidationException $ex2) { + Log::warning($ex2); + return $this->error412(array($ex2->getMessage())); + } catch (\HTTP401UnauthorizedException $ex3) { + Log::warning($ex3); + return $this->error401(); + } catch (Exception $ex) { + Log::error($ex); + return $this->error500($ex); + } + } + + /** + * @param $company_id + * @return \Illuminate\Http\JsonResponse|mixed + */ + public function deleteCompanyLogo($company_id){ + try { + + $this->service->deleteCompanyLogo($company_id); + + return $this->deleted(); + + } catch (EntityNotFoundException $ex1) { + Log::warning($ex1); + return $this->error404(); + } catch (ValidationException $ex2) { + Log::warning($ex2); + return $this->error412(array($ex2->getMessage())); + } catch (\HTTP401UnauthorizedException $ex3) { + Log::warning($ex3); + return $this->error401(); + } catch (Exception $ex) { + Log::error($ex); + return $this->error500($ex); + } + } + } \ No newline at end of file diff --git a/app/Http/routes.php b/app/Http/routes.php index c84685f2..f736bdff 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -68,9 +68,23 @@ Route::group([ }); // companies + Route::group(['prefix'=>'companies'], function(){ Route::get('', 'OAuth2CompaniesApiController@getAllCompanies'); - Route::post('', 'OAuth2CompaniesApiController@add'); + Route::post('', [ 'middleware' => 'auth.user', 'uses' => 'OAuth2CompaniesApiController@add']); + Route::group(['prefix'=>'{id}'], function(){ + Route::get('', [ 'middleware' => 'auth.user', 'uses' => 'OAuth2CompaniesApiController@get']); + Route::put('', [ 'middleware' => 'auth.user', 'uses' => 'OAuth2CompaniesApiController@update']); + Route::delete('', [ 'middleware' => 'auth.user', 'uses' => 'OAuth2CompaniesApiController@delete']); + Route::group(['prefix'=>'logo'], function(){ + Route::post('', [ 'middleware' => 'auth.user', 'uses' => 'OAuth2CompaniesApiController@addCompanyLogo']); + Route::delete('', [ 'middleware' => 'auth.user', 'uses' => 'OAuth2CompaniesApiController@deleteCompanyLogo']); + Route::group(['prefix'=>'big'], function(){ + Route::post('', [ 'middleware' => 'auth.user', 'uses' => 'OAuth2CompaniesApiController@addCompanyBigLogo']); + Route::delete('', [ 'middleware' => 'auth.user', 'uses' => 'OAuth2CompaniesApiController@deleteCompanyBigLogo']); + }); + }); + }); }); // organizations diff --git a/app/ModelSerializers/CompanySerializer.php b/app/ModelSerializers/CompanySerializer.php index 543f148c..39cc98b1 100644 --- a/app/ModelSerializers/CompanySerializer.php +++ b/app/ModelSerializers/CompanySerializer.php @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. **/ - +use models\main\Company; /** * Class CompanySerializer * @package ModelSerializers @@ -20,10 +20,47 @@ final class CompanySerializer extends SilverStripeSerializer { protected static $array_mappings = [ 'Name' => 'name:json_string', - 'LogoUrl' => 'logo:json_url', - 'BigLogoUrl' => 'big_logo:json_url', + 'Url' => 'url:json_string', + 'DisplayOnSite' => 'display_on_site:json_boolean', + 'Featured' => 'featured:json_boolean', + 'City' => 'city:json_string', + 'State' => 'state:json_string', + 'Country' => 'country:json_string', 'Description' => 'description:json_string', 'Industry' => 'industry:json_string', - 'Url' => 'url:json_string', + 'Contributions' => 'contributions:json_string', + 'ContactEmail' => 'contact_email:json_string', + 'MemberLevel' => 'member_level:json_string', + 'AdminEmail' => 'admin_email:json_string', + 'Overview' => 'overview:json_string', + 'Products' => 'products:json_string', + 'Commitment' => 'commitment:json_string', + 'CommitmentAuthor' => 'commitment_author:json_string', + 'LogoUrl' => 'logo:json_url', + 'BigLogoUrl' => 'big_logo:json_url', ]; + + /** + * @param null $expand + * @param array $fields + * @param array $relations + * @param array $params + * @return array + */ + public function serialize($expand = null, array $fields = [], array $relations = [], array $params = [] ) + { + $values = parent::serialize($expand, $fields, $relations, $params); + $company = $this->object; + if(!$company instanceof Company) return $values; + + $color = isset($values['color']) ? $values['color']:''; + if(empty($color)) + $color = 'f0f0ee'; + if (strpos($color,'#') === false) { + $color = '#'.$color; + } + $values['color'] = $color; + + return $values; + } } \ No newline at end of file diff --git a/app/Models/Foundation/Main/Company.php b/app/Models/Foundation/Main/Company.php index d7e98221..3900cd06 100644 --- a/app/Models/Foundation/Main/Company.php +++ b/app/Models/Foundation/Main/Company.php @@ -12,7 +12,10 @@ * limitations under the License. **/ +use App\Models\Foundation\Main\ICompanyMemberLevel; use Doctrine\Common\Collections\ArrayCollection; +use Illuminate\Support\Facades\Log; +use models\exceptions\ValidationException; use models\utils\SilverstripeBaseModel; use Doctrine\ORM\Mapping AS ORM; @@ -27,38 +30,119 @@ class Company extends SilverstripeBaseModel { /** * @ORM\Column(name="Name", type="string") + * @var string */ private $name; /** - * @ORM\Column(name="Description", type="string") + * @ORM\Column(name="URL", type="string") + * @var string */ - private $description; + private $url; /** - * @ORM\Column(name="Industry", type="string") + * @ORM\Column(name="DisplayOnSite", type="boolean") + * @var bool */ - private $industry; + private $display_on_site; + + /** + * @ORM\Column(name="Featured", type="boolean") + * @var bool + */ + private $featured; /** * @ORM\Column(name="City", type="string") + * @var string */ private $city; /** * @ORM\Column(name="State", type="string") + * @var string */ private $state; /** * @ORM\Column(name="Country", type="string") + * @var string */ private $country; /** - * @ORM\Column(name="URL", type="string") + * @ORM\Column(name="Description", type="string") + * @var string */ - private $url; + private $description; + + /** + * @ORM\Column(name="Industry", type="string") + * @var string + */ + private $industry; + + /** + * @ORM\Column(name="Products", type="string") + * @var string + */ + private $products; + + /** + * @ORM\Column(name="Contributions", type="string") + * @var string + */ + private $contributions; + + /** + * @ORM\Column(name="ContactEmail", type="string") + * @var string + */ + private $contact_email; + + /** + * @ORM\Column(name="MemberLevel", type="string") + * @var string + */ + private $member_level; + + /** + * @ORM\Column(name="AdminEmail", type="string") + * @var string + */ + private $admin_email; + + /** + * @ORM\Column(name="Color", type="string") + * @var string + */ + private $color; + + /** + * @ORM\Column(name="Overview", type="string") + * @var string + */ + private $overview; + + /** + * @ORM\Column(name="Commitment", type="string") + * @var string + */ + private $commitment; + + /** + * @ORM\Column(name="CommitmentAuthor", type="string") + * @var string + */ + private $commitment_author; + + /** + * @ORM\Column(name="isDeleted", type="string") + * @var bool + */ + private $is_deleted; + + // relations /** * @ORM\ManyToMany(targetEntity="models\summit\SummitEvent", mappedBy="sponsors") @@ -66,14 +150,14 @@ class Company extends SilverstripeBaseModel private $sponsorships; /** - * @ORM\ManyToOne(targetEntity="models\main\File") + * @ORM\ManyToOne(targetEntity="models\main\File", cascade={"persist", "remove"}) * @ORM\JoinColumn(name="LogoID", referencedColumnName="ID") * @var File */ private $logo; /** - * @ORM\ManyToOne(targetEntity="models\main\File") + * @ORM\ManyToOne(targetEntity="models\main\File", cascade={"persist", "remove"}) * @ORM\JoinColumn(name="BigLogoID", referencedColumnName="ID") * @var File */ @@ -86,6 +170,9 @@ class Company extends SilverstripeBaseModel { parent::__construct(); $this->sponsorships = new ArrayCollection(); + $this->featured = false; + $this->display_on_site = false; + $this->is_deleted = false; } /** @@ -216,6 +303,10 @@ class Company extends SilverstripeBaseModel $this->logo = $logo; } + public function clearLogo():void{ + $this->logo = null; + } + /** * @return File */ @@ -232,6 +323,10 @@ class Company extends SilverstripeBaseModel $this->big_logo = $big_logo; } + public function clearBigLogo():void{ + $this->big_logo = null; + } + /** * @return bool */ @@ -279,9 +374,15 @@ class Company extends SilverstripeBaseModel */ public function getLogoUrl(): ?string { + $logoUrl = null; - if ($this->hasLogo() && $logo = $this->getLogo()) { - $logoUrl = $logo->getUrl(); + try { + if ($this->hasLogo() && $logo = $this->getLogo()) { + $logoUrl = $logo->getUrl(); + } + } + catch(\Exception $ex){ + Log::warning($ex); } return $logoUrl; } @@ -292,9 +393,212 @@ class Company extends SilverstripeBaseModel public function getBigLogoUrl(): ?string { $logoUrl = null; - if ($this->hasBigLogo() && $logo = $this->getBigLogo()) { - $logoUrl = $logo->getUrl(); + try { + if ($this->hasBigLogo() && $logo = $this->getBigLogo()) { + $logoUrl = $logo->getUrl(); + } + } + catch(\Exception $ex){ + Log::warning($ex); } return $logoUrl; } + + /** + * @return bool + */ + public function isDisplayOnSite(): bool + { + return $this->display_on_site; + } + + /** + * @param bool $display_on_site + */ + public function setDisplayOnSite(bool $display_on_site): void + { + $this->display_on_site = $display_on_site; + } + + /** + * @return bool + */ + public function isFeatured(): bool + { + return $this->featured; + } + + /** + * @param bool $featured + */ + public function setFeatured(bool $featured): void + { + $this->featured = $featured; + } + + /** + * @return string + */ + public function getProducts(): ?string + { + return $this->products; + } + + /** + * @param string $products + */ + public function setProducts(string $products): void + { + $this->products = $products; + } + + /** + * @return string + */ + public function getContributions(): ?string + { + return $this->contributions; + } + + /** + * @param string $contributions + */ + public function setContributions(string $contributions): void + { + $this->contributions = $contributions; + } + + /** + * @return string + */ + public function getContactEmail(): ?string + { + return $this->contact_email; + } + + /** + * @param string $contact_email + */ + public function setContactEmail(string $contact_email): void + { + $this->contact_email = $contact_email; + } + + /** + * @return string + */ + public function getMemberLevel(): ?string + { + return $this->member_level; + } + + /** + * @param string $member_level + * @throws ValidationException + */ + public function setMemberLevel(string $member_level): void + { + if(!in_array($member_level, ICompanyMemberLevel::ValidLevels)) + throw new ValidationException(sprintf("level %s is not valid", $member_level)); + + $this->member_level = $member_level; + } + + /** + * @return string + */ + public function getAdminEmail(): ?string + { + return $this->admin_email; + } + + /** + * @param string $admin_email + */ + public function setAdminEmail(string $admin_email): void + { + $this->admin_email = $admin_email; + } + + /** + * @return string + */ + public function getColor(): ?string + { + return $this->color; + } + + /** + * @param string $color + */ + public function setColor(string $color): void + { + $this->color = $color; + } + + /** + * @return string + */ + public function getOverview(): ?string + { + return $this->overview; + } + + /** + * @param string $overview + */ + public function setOverview(string $overview): void + { + $this->overview = $overview; + } + + /** + * @return string + */ + public function getCommitment(): ?string + { + return $this->commitment; + } + + /** + * @param string $commitment + */ + public function setCommitment(string $commitment): void + { + $this->commitment = $commitment; + } + + /** + * @return string + */ + public function getCommitmentAuthor(): ?string + { + return $this->commitment_author; + } + + /** + * @param string $commitment_author + */ + public function setCommitmentAuthor(string $commitment_author): void + { + $this->commitment_author = $commitment_author; + } + + /** + * @return bool + */ + public function isIsDeleted(): bool + { + return $this->is_deleted; + } + + /** + * @param bool $is_deleted + */ + public function setIsDeleted(bool $is_deleted): void + { + $this->is_deleted = $is_deleted; + } + + } \ No newline at end of file diff --git a/app/Models/Foundation/Main/Factories/CompanyFactory.php b/app/Models/Foundation/Main/Factories/CompanyFactory.php index 27e9334b..d224e46d 100644 --- a/app/Models/Foundation/Main/Factories/CompanyFactory.php +++ b/app/Models/Foundation/Main/Factories/CompanyFactory.php @@ -1,6 +1,4 @@ setName(trim($data['name'])); - if (isset($data['description'])) - $company->setDescription(trim($data['description'])); - if (isset($data['url'])) $company->setUrl(trim($data['url'])); - if (isset($data['industry'])) - $company->setIndustry(trim($data['industry'])); + if (isset($data['display_on_site'])) + $company->setDisplayOnSite(boolval($data['display_on_site'])); + + if (isset($data['featured'])) + $company->setFeatured(boolval($data['featured'])); if (isset($data['city'])) $company->setCity(trim($data['city'])); @@ -58,6 +56,42 @@ final class CompanyFactory if (isset($data['country'])) $company->setCountry(trim($data['country'])); + if (isset($data['description'])) + $company->setDescription(trim($data['description'])); + + if (isset($data['industry'])) + $company->setIndustry(trim($data['industry'])); + + if (isset($data['products'])) + $company->setProducts(trim($data['products'])); + + if (isset($data['contributions'])) + $company->setContributions(trim($data['contributions'])); + + if (isset($data['contact_email'])) + $company->setContactEmail(trim($data['contact_email'])); + + if (isset($data['member_level'])) + $company->setMemberLevel(trim($data['member_level'])); + + if (isset($data['admin_email'])) + $company->setAdminEmail(trim($data['admin_email'])); + + if (isset($data['color'])) + $company->setColor(trim($data['color'])); + + if (isset($data['overview'])) + $company->setOverview(trim($data['overview'])); + + if (isset($data['commitment'])) + $company->setCommitment(trim($data['commitment'])); + + if (isset($data['commitment_author'])) + $company->setCommitmentAuthor(trim($data['commitment_author'])); + + if (isset($data['is_deleted'])) + $company->setIsDeleted(boolval($data['is_deleted'])); + return $company; } } \ No newline at end of file diff --git a/app/Models/Foundation/Main/ICompanyMemberLevel.php b/app/Models/Foundation/Main/ICompanyMemberLevel.php new file mode 100644 index 00000000..ebef7454 --- /dev/null +++ b/app/Models/Foundation/Main/ICompanyMemberLevel.php @@ -0,0 +1,37 @@ +repository = $repository; + $this->file_uploader = $file_uploader; } /** @@ -77,7 +86,20 @@ final class CompanyService */ public function updateCompany(int $company_id, array $payload): Company { - // TODO: Implement updateCompany() method. + return $this->tx_service->transaction(function() use($company_id, $payload){ + $company = $this->repository->getById($company_id); + if(is_null($company) || !$company instanceof Company) + throw new EntityNotFoundException(sprintf("company %s not found.", $company_id)); + + if(isset($payload['name'])){ + $former_company = $this->repository->getByName(trim($payload['name'])); + if(!is_null($former_company) && $company_id !== $former_company->getId()){ + throw new ValidationException(sprintf("company %s already exists", $payload['name'])); + } + } + + return CompanyFactory::populate($company, $payload); + }); } /** @@ -87,6 +109,106 @@ final class CompanyService */ public function deleteCompany(int $company_id): void { - // TODO: Implement deleteCompany() method. + $this->tx_service->transaction(function() use($company_id){ + $company = $this->repository->getById($company_id); + if(is_null($company)) + throw new EntityNotFoundException(sprintf("company %s not found.", $company_id)); + + $this->repository->delete($company); + }); + } + + /** + * @inheritDoc + */ + public function addCompanyLogo(int $company_id, UploadedFile $file, $max_file_size = 10485760): File + { + return $this->tx_service->transaction(function () use ($company_id, $file, $max_file_size) { + + $allowed_extensions = ['png', 'jpg', 'jpeg', 'svg']; + + $company = $this->repository->getById($company_id); + + if (is_null($company) || !$company instanceof Company) { + throw new EntityNotFoundException('company not found!'); + } + + if (!in_array($file->extension(), $allowed_extensions)) { + throw new ValidationException("file does not has a valid extension ('png', 'jpg', 'jpeg', 'svg')."); + } + + if ($file->getSize() > $max_file_size) { + throw new ValidationException(sprintf("file exceeds max_file_size (%s MB).", ($max_file_size / 1024) / 1024)); + } + + $logo = $this->file_uploader->build($file, sprintf('companies/%s/logos', $company->getId()), true); + $company->setLogo($logo); + return $logo; + }); + } + + /** + * @inheritDoc + */ + public function deleteCompanyLogo(int $company_id): void + { + $this->tx_service->transaction(function () use ($company_id) { + + $company = $this->repository->getById($company_id); + + if (is_null($company) || !$company instanceof Company) { + throw new EntityNotFoundException('company not found!'); + } + + $company->clearLogo(); + + }); + } + + /** + * @inheritDoc + */ + public function addCompanyBigLogo(int $company_id, UploadedFile $file, $max_file_size = 10485760): File + { + return $this->tx_service->transaction(function () use ($company_id, $file, $max_file_size) { + + $allowed_extensions = ['png', 'jpg', 'jpeg', 'svg']; + + $company = $this->repository->getById($company_id); + + if (is_null($company) || !$company instanceof Company) { + throw new EntityNotFoundException('company not found!'); + } + + if (!in_array($file->extension(), $allowed_extensions)) { + throw new ValidationException("file does not has a valid extension ('png', 'jpg', 'jpeg', 'svg')."); + } + + if ($file->getSize() > $max_file_size) { + throw new ValidationException(sprintf("file exceeds max_file_size (%s MB).", ($max_file_size / 1024) / 1024)); + } + + $logo = $this->file_uploader->build($file, sprintf('companies/%s/logos', $company->getId()), true); + $company->setBigLogo($logo); + return $logo; + }); + } + + /** + * @inheritDoc + */ + public function deleteCompanyBigLogo(int $company_id): void + { + $this->tx_service->transaction(function () use ($company_id) { + + $company = $this->repository->getById($company_id); + + if (is_null($company) || !$company instanceof Company) { + throw new EntityNotFoundException('company not found!'); + } + + $company->clearBigLogo(); + + }); } } \ No newline at end of file diff --git a/database/seeds/ApiEndpointsSeeder.php b/database/seeds/ApiEndpointsSeeder.php index c99e0341..77f8bdc1 100644 --- a/database/seeds/ApiEndpointsSeeder.php +++ b/database/seeds/ApiEndpointsSeeder.php @@ -19,6 +19,7 @@ use App\Security\SummitScopes; use App\Security\OrganizationScopes; use App\Security\MemberScopes; use App\Models\Foundation\Main\IGroup; +use App\Security\CompanyScopes; /** * Class ApiEndpointsSeeder */ @@ -5493,7 +5494,6 @@ class ApiEndpointsSeeder extends Seeder private function seedCompaniesEndpoints(){ $current_realm = Config::get('app.scope_base_realm'); - $this->seedApiEndpoints('companies', [ [ 'name' => 'get-companies', @@ -5502,23 +5502,102 @@ class ApiEndpointsSeeder extends Seeder 'scopes' => [ sprintf(SummitScopes::ReadAllSummitData, $current_realm), sprintf(SummitScopes::ReadSummitData, $current_realm), - sprintf('%s/companies/read', $current_realm) + sprintf(CompanyScopes::Read, $current_realm) ], ], [ - 'name' => 'add-companies', + 'name' => 'add-company', 'route' => '/api/v1/companies', 'http_method' => 'POST', 'scopes' => [ - sprintf(SummitScopes::WriteSummitData, $current_realm), - sprintf('%s/companies/write', $current_realm) + sprintf(CompanyScopes::Write, $current_realm) ], 'authz_groups' => [ IGroup::SuperAdmins, IGroup::Administrators, - IGroup::SummitAdministrators, ] - ] + ], + [ + 'name' => 'update-company', + 'route' => '/api/v1/companies/{id}', + 'http_method' => 'PUT', + 'scopes' => [ + sprintf(CompanyScopes::Write, $current_realm) + ], + 'authz_groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + ] + ], + [ + 'name' => 'delete-company', + 'route' => '/api/v1/companies/{id}', + 'http_method' => 'DELETE', + 'scopes' => [ + sprintf(CompanyScopes::Write, $current_realm) + ], + 'authz_groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + ] + ], + [ + 'name' => 'get-company', + 'route' => '/api/v1/companies/{id}', + 'http_method' => 'GET', + 'scopes' => [ + sprintf(CompanyScopes::Read, $current_realm) + ] + ], + [ + 'name' => 'add-company-logo', + 'route' => '/api/v1/companies/{id}/logo', + 'http_method' => 'POST', + 'scopes' => [ + sprintf(CompanyScopes::Write, $current_realm) + ], + 'authz_groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + ] + ], + [ + 'name' => 'delete-company-logo', + 'route' => '/api/v1/companies/{id}/logo', + 'http_method' => 'DELETE', + 'scopes' => [ + sprintf(CompanyScopes::Write, $current_realm) + ], + 'authz_groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + ] + ], + [ + 'name' => 'add-company-big-logo', + 'route' => '/api/v1/companies/{id}/logo/big', + 'http_method' => 'POST', + 'scopes' => [ + sprintf(CompanyScopes::Write, $current_realm) + ], + 'authz_groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + ] + ], + [ + 'name' => 'delete-company-big-logo', + 'route' => '/api/v1/companies/{id}/logo/big', + 'http_method' => 'DELETE', + 'scopes' => [ + sprintf(CompanyScopes::Write, $current_realm) + ], + 'authz_groups' => [ + IGroup::SuperAdmins, + IGroup::Administrators, + ] + ], + ] ); } diff --git a/tests/OAuth2CompaniesApiTest.php b/tests/OAuth2CompaniesApiTest.php index b54143c2..f2d7ce7d 100644 --- a/tests/OAuth2CompaniesApiTest.php +++ b/tests/OAuth2CompaniesApiTest.php @@ -42,6 +42,7 @@ class OAuth2CompaniesApiTest extends ProtectedApiTest } public function testAddCompany(){ + $data = [ 'name' => str_random(16).'_company', 'description' => str_random(16).'_description', @@ -70,4 +71,8 @@ class OAuth2CompaniesApiTest extends ProtectedApiTest return $company; } + public function testAddCompanyBigLogo(){ + + } + } \ No newline at end of file diff --git a/tests/ProtectedApiTest.php b/tests/ProtectedApiTest.php index 876e9d17..faf683a9 100644 --- a/tests/ProtectedApiTest.php +++ b/tests/ProtectedApiTest.php @@ -19,6 +19,7 @@ use App\Security\SummitScopes; use App\Security\OrganizationScopes; use App\Security\MemberScopes; use App\Models\Foundation\Main\IGroup; +use App\Security\CompanyScopes; /** * Class AccessTokenServiceStub */ @@ -106,6 +107,8 @@ class AccessTokenServiceStub implements IAccessTokenService sprintf(SummitScopes::LeaveEvent, $url), sprintf(SummitScopes::ReadSummitMediaFileTypes, $url), sprintf(SummitScopes::WriteSummitMediaFileTypes, $url), + sprintf(CompanyScopes::Write, $url), + sprintf(CompanyScopes::Read, $url), ); return AccessToken::createFromParams( @@ -199,6 +202,8 @@ class AccessTokenServiceStub2 implements IAccessTokenService sprintf(SummitScopes::LeaveEvent, $url), sprintf(SummitScopes::ReadSummitMediaFileTypes, $url), sprintf(SummitScopes::WriteSummitMediaFileTypes, $url), + sprintf(CompanyScopes::Write, $url), + sprintf(CompanyScopes::Read, $url), ); return AccessToken::createFromParams(