Merge pull request #75 from goteo/feat/project-categories

[feat] Project categories
This commit is contained in:
2025-03-03 11:30:51 +01:00
committed by GitHub
5 changed files with 95 additions and 5 deletions
+11 -3
View File
@@ -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;
/**
+37 -2
View File
@@ -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;
}
}
+30
View File
@@ -0,0 +1,30 @@
<?php
namespace App\Entity\Project;
enum Category: string
{
case Solidary = 'solidary';
case LibreSoftware = 'libre-software';
case Employment = 'employment';
case Design = 'design';
case Journalism = 'journalism';
case Education = 'education';
case Culture = 'culture';
case Ecology = 'ecology';
case HealthCares = 'health-and-cares';
case OpenData = 'open-data';
case Democracy = 'democracy';
case Equity = 'equity';
}
+15
View File
@@ -50,6 +50,9 @@ class Project implements UserOwnedInterface, AccountingOwnerInterface, Localized
#[Gedmo\Translatable()]
private ?string $subtitle = null;
#[ORM\Column(enumType: Category::class)]
private ?Category $category = null;
/**
* Project's territory of interest.
*/
@@ -151,6 +154,18 @@ class Project implements UserOwnedInterface, AccountingOwnerInterface, Localized
return $this;
}
public function getCategory(): ?Category
{
return $this->category;
}
public function setCategory(Category $category): static
{
$this->category = $category;
return $this;
}
public function getTerritory(): ?ProjectTerritory
{
return $this->territory;
+2
View File
@@ -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);