diff --git a/src/ApiResource/Project/ProjectApiResource.php b/src/ApiResource/Project/ProjectApiResource.php index 2d72633..e61d749 100644 --- a/src/ApiResource/Project/ProjectApiResource.php +++ b/src/ApiResource/Project/ProjectApiResource.php @@ -8,6 +8,7 @@ use ApiPlatform\Metadata as API; use App\ApiResource\Accounting\AccountingApiResource; use App\ApiResource\LocalizedApiResourceTrait; use App\ApiResource\User\UserApiResource; +use App\Entity\Project\Category; use App\Entity\Project\Project; use App\Entity\Project\ProjectStatus; use App\Entity\Project\ProjectVideo; @@ -31,8 +32,8 @@ use Symfony\Component\Validator\Constraints as Assert; #[API\GetCollection()] #[API\Post(security: 'is_granted("ROLE_USER")')] #[API\Get()] -#[API\Patch(security: 'is_granted("PROJECT_EDIT", object)')] -#[API\Delete(security: 'is_granted("PROJECT_EDIT", object)')] +#[API\Patch(security: 'is_granted("PROJECT_EDIT", previous_object)')] +#[API\Delete(security: 'is_granted("PROJECT_EDIT", previous_object)')] class ProjectApiResource { use LocalizedApiResourceTrait; @@ -66,6 +67,13 @@ class ProjectApiResource #[Assert\NotBlank()] public string $subtitle; + /** + * One of the available categories. + */ + #[Assert\NotBlank()] + #[API\ApiFilter(filterClass: SearchFilter::class, strategy: 'exact')] + public Category $category; + /** * ISO 3166 data about the Project's territory of interest. */ @@ -99,7 +107,7 @@ class ProjectApiResource * The status of a Project represents how far it is in it's life-cycle. */ #[API\ApiFilter(filterClass: SearchFilter::class, strategy: 'exact')] - #[API\ApiProperty(securityPostDenormalize: 'is_granted("PROJECT_EDIT")')] + #[API\ApiProperty(securityPostDenormalize: 'is_granted("PROJECT_EDIT", previous_object)')] public ProjectStatus $status = ProjectStatus::InEditing; /** diff --git a/src/Benzina/ProjectsPump.php b/src/Benzina/ProjectsPump.php index e01d30d..1eb27e9 100644 --- a/src/Benzina/ProjectsPump.php +++ b/src/Benzina/ProjectsPump.php @@ -2,6 +2,7 @@ namespace App\Benzina; +use App\Entity\Project\Category; use App\Entity\Project\Project; use App\Entity\Project\ProjectStatus; use App\Entity\Project\ProjectTerritory; @@ -57,6 +58,7 @@ class ProjectsPump implements PumpInterface $project->setTranslatableLocale($record['lang']); $project->setTitle($record['name']); $project->setSubtitle($record['subtitle']); + $project->setCategory($this->getProjectCategory($record)); $project->setTerritory($this->getProjectTerritory($record)); $project->setDescription($record['description']); $project->setVideo($this->getProjectVideo($record)); @@ -87,8 +89,6 @@ class ProjectsPump implements PumpInterface return ProjectStatus::InEditing; case 2: return ProjectStatus::InReview; - case 0: - return ProjectStatus::Rejected; case 3: return ProjectStatus::InCampaign; case 6: @@ -97,6 +97,41 @@ class ProjectsPump implements PumpInterface return ProjectStatus::InFunding; case 5: return ProjectStatus::Fulfilled; + case 0: + default: + return ProjectStatus::Rejected; + } + } + + private function getProjectCategory(array $record): Category + { + switch ($record['social_commitment']) { + case 1: + return Category::Solidary; + case 2: + return Category::LibreSoftware; + case 3: + case 16: + return Category::Employment; + case 5: + return Category::Journalism; + case 6: + return Category::Education; + case 7: + return Category::Culture; + case 8: + case 15: + return Category::Ecology; + case 11: + case 12: + return Category::Democracy; + case 13: + return Category::Equity; + case 14: + return Category::HealthCares; + case 10: + default: + return Category::OpenData; } } diff --git a/src/Entity/Project/Category.php b/src/Entity/Project/Category.php new file mode 100644 index 0000000..2c6933c --- /dev/null +++ b/src/Entity/Project/Category.php @@ -0,0 +1,30 @@ +category; + } + + public function setCategory(Category $category): static + { + $this->category = $category; + + return $this; + } + public function getTerritory(): ?ProjectTerritory { return $this->territory; diff --git a/tests/Entity/ProjectApiTest.php b/tests/Entity/ProjectApiTest.php index a89abbb..e92b303 100644 --- a/tests/Entity/ProjectApiTest.php +++ b/tests/Entity/ProjectApiTest.php @@ -3,6 +3,7 @@ namespace App\Tests\Entity; use ApiPlatform\Symfony\Bundle\Test\ApiTestCase; +use App\Entity\Project\Category; use App\Entity\Project\Project; use App\Entity\Project\ProjectStatus; use App\Entity\Project\ProjectTerritory; @@ -42,6 +43,7 @@ class ProjectApiTest extends ApiTestCase $project = new Project(); $project->setTitle('Test Project'); $project->setSubtitle('Test Project Subtitle'); + $project->setCategory(Category::LibreSoftware); $project->setDescription('Test Project Description'); $project->setTerritory(new ProjectTerritory('ES')); $project->setOwner($owner);