Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions src/Controller/ProjectController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php

namespace App\Controller;

use App\Entity\Project;
use App\Type\ProjectType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;

class ProjectController extends AbstractController
{
/**
*
* @Route("/projects/create", name="project_create")
* @param Request $request
* @return Response
*/
public function create(Request $request): Response
{
$project = new Project();
$form = $this->createForm(ProjectType::class, $project);

$form->handleRequest($request);

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

$project->setOwner($this->getUser());
$project->setGeneratedKey();

$this->getDoctrine()->getManager()->persist($project);
$this->getDoctrine()->getManager()->flush();

return $this->redirectToRoute('projects_show');
}

return $this->render("project/create.html.twig", [
'form' => $form->createView()
]);
}

/**
*
* @Route("/projects", name="projects_show")
* @return Response
*/
public function show(Request $request): Response
{
$projects = $this->getDoctrine()->getRepository(Project::class)
->findBy([]);

return $this->render("project/projectsList.html.twig", [
'projects' => $projects
]);
}
}
92 changes: 92 additions & 0 deletions src/Entity/Project.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
<?php

namespace App\Entity;

use Symfony\Component\Security\Core\User\UserInterface;
use App\Repository\ProjectRepository;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;
use function Sodium\add;

/**
* @ORM\Entity(repositoryClass=ProjectRepository::class)
*/
class Project
{
private static $generatedKeys = [];

/**
* @ORM\Column(type="string", length=255)
*/
private $name;

/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;

/**
* @ORM\Column(type="string", length=6)
*/
private $generatedKey;

/**
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="user")
*/
private $owner;

public function getName(): ?string
{
return $this->name;
}

public function setName($name): void
{
$this->name = $name;
}

public function getId(): ?int
{
return $this->id;
}

public function getGeneratedKey(): ?string
{
return $this->generatedKey;
}

public function setGeneratedKey(): void
{
$isUnique = true;
$newKey = strval(random_int(100000, 999999));
foreach (self::$generatedKeys as $key)
{
if ($key === $newKey)
{
$isUnique = false;
break;
}
}
if ($isUnique)
{
$this->generatedKey = $newKey;
self::$generatedKeys[] = $newKey;
}
else
{
$this->setGeneratedKey();
}
}

public function getOwner()
{
return $this->owner;
}

public function setOwner(UserInterface $owner): void
{
$this->owner = $owner;
}
}
16 changes: 16 additions & 0 deletions src/Repository/ProjectRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace App\Repository;

use App\Entity\Project;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\EntityRepository;
use Doctrine\Persistence\ManagerRegistry;

class ProjectRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Project::class);
}
}
21 changes: 21 additions & 0 deletions src/Type/ProjectType.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

namespace App\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;

class ProjectType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class)
->add('save', SubmitType::class);
}
}
16 changes: 16 additions & 0 deletions templates/project/create.html.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{% extends 'base.html.twig' %}

{% block body %}

<div class="container">
<div class="row">
<div class="col">
</div>
<div class="col">
{{ form(form, {'action': path('project_create'), 'method': 'POST'}) }}
</div>
<div class="col">
</div>
</div>
</div>
{% endblock %}
35 changes: 35 additions & 0 deletions templates/project/projectsList.html.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{% extends 'base.html.twig' %}

{% block body %}
<div class="container">
<div class="row">
<div class="col">
</div>
<div class="col">
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Key</th>
<th scope="col">Name</th>
</tr>
</thead>
<tbody>
{% for project in projects %}
<tr>
<th scope="row">{{ project.id }}</th>
<td>{{ project.generatedKey }}</td>
<td>{{ project.name }}</td>
</tr>
{% endfor %}
</tbody>
</table>

<a href="{{ path("project_create") }}" title="Create project">Create project</a>

</div>
<div class="col">
</div>
</div>
</div>
{% endblock %}