Skip to content

Commit

Permalink
feat(complaint): add complaint creation
Browse files Browse the repository at this point in the history
  • Loading branch information
Khodl committed Jun 9, 2024
1 parent 811f6c3 commit 49a7e76
Show file tree
Hide file tree
Showing 20 changed files with 1,017 additions and 21 deletions.
6 changes: 6 additions & 0 deletions assets/styles/_base.scss
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,9 @@ p {
margin-top: $size-spacer-lg;
}
}

ol {
li {
margin: 1em 0;
}
}
15 changes: 12 additions & 3 deletions assets/styles/_form.scss
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@ form {
display: grid;
gap: $size-spacer-md;

// Form groups (label + input)
> div > div {
> div {
display: grid;
gap: $size-spacer-sm;
gap: $size-spacer-md;
}

// Used for errors in forms
Expand Down Expand Up @@ -40,6 +39,16 @@ form {
font-weight: bolder;
display: block;
}

.radio {

input {
vertical-align: center;
display: inline-block;
width: auto;
}

}
}

button, .btn {
Expand Down
2 changes: 1 addition & 1 deletion config/packages/twig.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
twig:
default_path: '%kernel.project_dir%/templates'
form_themes: [ 'foundation_6_layout.html.twig' ]
form_themes: [ 'bootstrap_3_layout.html.twig' ]
globals:
report_email: '%env(REPORT_EMAIL)%'
app_name: '%env(APP_NAME)%'
Expand Down
51 changes: 51 additions & 0 deletions migrations/Version20240609192945.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?php

declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20240609192945 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}

public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TABLE complaint (id UUID NOT NULL, status_id UUID NOT NULL, email VARCHAR(200) NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, money_sent DOUBLE PRECISION DEFAULT NULL, country VARCHAR(100) NOT NULL, code VARCHAR(200) NOT NULL, PRIMARY KEY(id))');
$this->addSql('CREATE INDEX IDX_5F2732B56BF700BD ON complaint (status_id)');
$this->addSql('COMMENT ON COLUMN complaint.id IS \'(DC2Type:uuid)\'');
$this->addSql('COMMENT ON COLUMN complaint.status_id IS \'(DC2Type:uuid)\'');
$this->addSql('COMMENT ON COLUMN complaint.created_at IS \'(DC2Type:datetime_immutable)\'');
$this->addSql('CREATE TABLE complaint_report (id UUID NOT NULL, complaint_id UUID NOT NULL, report_id UUID NOT NULL, PRIMARY KEY(id))');
$this->addSql('CREATE INDEX IDX_E66CBA46EDAE188E ON complaint_report (complaint_id)');
$this->addSql('CREATE UNIQUE INDEX UNIQ_E66CBA464BD2A4C0 ON complaint_report (report_id)');
$this->addSql('COMMENT ON COLUMN complaint_report.id IS \'(DC2Type:uuid)\'');
$this->addSql('COMMENT ON COLUMN complaint_report.complaint_id IS \'(DC2Type:uuid)\'');
$this->addSql('COMMENT ON COLUMN complaint_report.report_id IS \'(DC2Type:uuid)\'');
$this->addSql('CREATE TABLE complaint_status (id UUID NOT NULL, name VARCHAR(100) NOT NULL, has_replied BOOLEAN NOT NULL, has_sent_sensitive_data BOOLEAN NOT NULL, has_sent_money BOOLEAN NOT NULL, PRIMARY KEY(id))');
$this->addSql('COMMENT ON COLUMN complaint_status.id IS \'(DC2Type:uuid)\'');
$this->addSql('ALTER TABLE complaint ADD CONSTRAINT FK_5F2732B56BF700BD FOREIGN KEY (status_id) REFERENCES complaint_status (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE complaint_report ADD CONSTRAINT FK_E66CBA46EDAE188E FOREIGN KEY (complaint_id) REFERENCES complaint (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
$this->addSql('ALTER TABLE complaint_report ADD CONSTRAINT FK_E66CBA464BD2A4C0 FOREIGN KEY (report_id) REFERENCES report (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
}

public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE complaint DROP CONSTRAINT FK_5F2732B56BF700BD');
$this->addSql('ALTER TABLE complaint_report DROP CONSTRAINT FK_E66CBA46EDAE188E');
$this->addSql('ALTER TABLE complaint_report DROP CONSTRAINT FK_E66CBA464BD2A4C0');
$this->addSql('DROP TABLE complaint');
$this->addSql('DROP TABLE complaint_report');
$this->addSql('DROP TABLE complaint_status');
}
}
67 changes: 67 additions & 0 deletions src/Controller/ComplaintController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php

namespace App\Controller;

use App\Entity\Complaint\Complaint;
use App\Entity\Complaint\ComplaintReport;
use App\Form\NewComplaintType;
use App\Service\DomainService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormError;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

#[Route('/report', name: 'complaint_')]
class ComplaintController extends AbstractController
{
#[Route('/new', name: 'create')]
public function create(Request $request, EntityManagerInterface $em, DomainService $domainService): Response
{

$complaint = new Complaint();
$complaintForm = $this->createForm(NewComplaintType::class, $complaint);
$complaintForm->handleRequest($request);

if ($complaintForm->isSubmitted() && $complaintForm->isValid()) {

$element = $complaintForm->get('element');
$report = $domainService->getReport($element->getData());

if($report->isSafe()){
$element->addError(new FormError("This is not a fraudulent element."));
}else{

$complaintReport = new ComplaintReport($complaint, $report);

$em->persist($complaintReport);
$em->flush();

return $this->redirectToRoute('complaint_edit', [
'id' => $complaint->getId(),
'code' => $complaint->getCode()
]);


}
}

return $this->renderForm('complaint/index.html.twig', [
'complaintForm' => $complaintForm,
]);
}


#[Route('/{id}/{code}/edit', name: 'edit')]
public function edit(Complaint $complaint, $code): Response
{
if($complaint->getCode() !== $code) {
throw $this->createNotFoundException('The code is not valid');
}

return $this->renderForm('complaint/show.html.twig', [
'complaint' => $complaint,
]);
}
}
66 changes: 66 additions & 0 deletions src/DataFixtures/ComplaintFixtures.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?php

namespace App\DataFixtures;

use App\Entity\Complaint\Complaint;
use App\Entity\Complaint\ComplaintReport;
use App\Repository\Complaint\ComplaintStatusRepository;
use App\Repository\DomainRepository;
use App\Service\DomainService;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager;
use Symfony\Component\Intl\Countries;

class ComplaintFixtures extends Fixture implements DependentFixtureInterface
{

public function __construct(private ComplaintStatusRepository $complaintStatusRepository,
private DomainRepository $domainRepository,
private DomainService $domainService)
{
}

public function load(ObjectManager $manager): void
{

$statuses = $this->complaintStatusRepository->findAll();
$countries = Countries::getCountryCodes();
$domains = $this->domainRepository->findAll();


$letters = range("a", "z");
foreach ($letters as $letter) {

$complaint = new Complaint();
$complaint->setCountry($countries[array_rand($countries)]);

$complaint->setEmail("$letter@example.com");

$complaint->setStatus($statuses[array_rand($statuses)]);

shuffle($domains);
for ($i = 0; $i < rand(1, 5); $i++) {

$domain = $domains[$i];

$report = $this->domainService->getReport("http://$domain");
$complaintReport = new ComplaintReport($complaint, $report);
$manager->persist($complaintReport);

}

$manager->persist($complaint);
}

$manager->flush();
}

public function getDependencies()
{
return [
DomainFixtures::class,
ComplaintStatusFixtures::class,
];
}
}
34 changes: 34 additions & 0 deletions src/DataFixtures/ComplaintStatusFixtures.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

namespace App\DataFixtures;

use App\Entity\Complaint\ComplaintStatus;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;

class ComplaintStatusFixtures extends Fixture
{
public function load(ObjectManager $manager): void
{

$statuses = [
0 => "Got contacted",
1 => "Got contacted, replied",
2 => "Got contacted, replied, sent sensitive data",
3 => "Got contacted, replied, sent sensitive data, sent money",
];

foreach ($statuses as $index => $name) {
$status = new ComplaintStatus();
$status->setName($name);

$status->setHasReplied($index > 0);
$status->setHasSentSensitiveData($index > 1);
$status->setHasSentMoney($index > 2);

$manager->persist($status);
}

$manager->flush();
}
}
Loading

0 comments on commit 49a7e76

Please sign in to comment.