Skip to content

Commit 1c99f63

Browse files
authored
Add tag to comments (#858)
1 parent e444e3a commit 1c99f63

24 files changed

+299
-48
lines changed

config/packages/doctrine.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use DR\Review\Doctrine\Type\CodeReviewType;
99
use DR\Review\Doctrine\Type\ColorThemeType;
1010
use DR\Review\Doctrine\Type\CommentStateType;
11+
use DR\Review\Doctrine\Type\CommentTagType;
1112
use DR\Review\Doctrine\Type\DiffAlgorithmType;
1213
use DR\Review\Doctrine\Type\FilterType;
1314
use DR\Review\Doctrine\Type\FrequencyType;
@@ -36,6 +37,7 @@
3637
$dbal->type(CodeReviewerStateType::TYPE)->class(CodeReviewerStateType::class);
3738
$dbal->type(ColorThemeType::TYPE)->class(ColorThemeType::class);
3839
$dbal->type(CommentStateType::TYPE)->class(CommentStateType::class);
40+
$dbal->type(CommentTagType::TYPE)->class(CommentTagType::class);
3941
$dbal->type(DiffAlgorithmType::TYPE)->class(DiffAlgorithmType::class);
4042
$dbal->type(FilterType::TYPE)->class(FilterType::class);
4143
$dbal->type(FrequencyType::TYPE)->class(FrequencyType::class);
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace DoctrineMigrations;
6+
7+
use Doctrine\DBAL\Schema\Schema;
8+
use Doctrine\Migrations\AbstractMigration;
9+
10+
/**
11+
* Auto-generated Migration: Please modify to your needs!
12+
*/
13+
final class Version20240919190124 extends AbstractMigration
14+
{
15+
public function getDescription(): string
16+
{
17+
return '';
18+
}
19+
20+
public function up(Schema $schema): void
21+
{
22+
$this->addSql('ALTER TABLE comment ADD tag ENUM(\'change_request\', \'explanation\', \'nice_to_have\', \'suggestion\') DEFAULT NULL');
23+
$this->addSql('ALTER TABLE comment_reply ADD tag ENUM(\'change_request\', \'explanation\', \'nice_to_have\', \'suggestion\') DEFAULT NULL');
24+
}
25+
26+
public function down(Schema $schema): void
27+
{
28+
$this->addSql('ALTER TABLE comment DROP tag');
29+
$this->addSql('ALTER TABLE comment_reply DROP tag');
30+
}
31+
}

src/Controller/App/Review/Comment/AddCommentController.php

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@
66
use DR\Review\Controller\AbstractController;
77
use DR\Review\Entity\Review\CodeReview;
88
use DR\Review\Entity\Review\Comment;
9-
use DR\Review\Entity\Review\LineReference;
109
use DR\Review\Form\Review\AddCommentFormType;
1110
use DR\Review\Repository\Review\CommentRepository;
1211
use DR\Review\Security\Role\Roles;
13-
use DR\Utils\Assert;
1412
use Symfony\Bridge\Doctrine\Attribute\MapEntity;
1513
use Symfony\Component\HttpFoundation\JsonResponse;
1614
use Symfony\Component\HttpFoundation\Request;
@@ -28,27 +26,21 @@ public function __construct(private readonly CommentRepository $commentRepositor
2826
#[IsGranted(Roles::ROLE_USER)]
2927
public function __invoke(Request $request, #[MapEntity] CodeReview $review): JsonResponse
3028
{
31-
$form = $this->createForm(AddCommentFormType::class, null, ['review' => $review]);
32-
$form->handleRequest($request);
33-
if ($form->isSubmitted() === false || $form->isValid() === false) {
34-
return $this->json(['success' => false], Response::HTTP_BAD_REQUEST);
35-
}
36-
37-
/** @var array{lineReference: string, message: string} $data */
38-
$data = $form->getData();
39-
40-
$lineReference = LineReference::fromString($data['lineReference']);
41-
4229
$user = $this->getUser();
4330
$comment = new Comment();
4431
$comment->setUser($user);
32+
$comment->setMessage('');
33+
$comment->setTag(null);
4534
$comment->setReview($review);
46-
$comment->setFilePath(Assert::notNull($lineReference->oldPath ?? $lineReference->newPath));
47-
$comment->setLineReference($lineReference);
48-
$comment->setMessage($data['message']);
4935
$comment->setCreateTimestamp(time());
5036
$comment->setUpdateTimestamp(time());
5137

38+
$form = $this->createForm(AddCommentFormType::class, $comment, ['review' => $review]);
39+
$form->handleRequest($request);
40+
if ($form->isSubmitted() === false || $form->isValid() === false) {
41+
return $this->json(['success' => false], Response::HTTP_BAD_REQUEST);
42+
}
43+
5244
$this->commentRepository->save($comment, true);
5345

5446
$url = $this->generateUrl(GetCommentThreadController::class, ['id' => (int)$comment->getId()]);

src/Controller/App/Review/Comment/AddCommentReplyController.php

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,31 +36,29 @@ public function __invoke(Request $request, #[MapEntity] ?Comment $comment): Json
3636
return $this->json(['success' => false, 'error' => $this->translator->trans('comment.was.deleted.meanwhile')], Response::HTTP_NOT_FOUND);
3737
}
3838

39-
$form = $this->createForm(AddCommentReplyFormType::class, null, ['comment' => $comment]);
40-
$form->handleRequest($request);
41-
if ($form->isSubmitted() === false || $form->isValid() === false) {
42-
return $this->json(['success' => false], Response::HTTP_BAD_REQUEST);
43-
}
44-
45-
/** @var array{message: string} $data */
46-
$data = $form->getData();
47-
4839
$user = $this->getUser();
4940
$reply = new CommentReply();
5041
$reply->setUser($user);
42+
$reply->setMessage('');
43+
$reply->setTag(null);
5144
$reply->setComment($comment);
52-
$reply->setMessage($data['message']);
5345
$reply->setCreateTimestamp(time());
5446
$reply->setUpdateTimestamp(time());
5547

48+
$form = $this->createForm(AddCommentReplyFormType::class, $reply, ['comment' => $comment]);
49+
$form->handleRequest($request);
50+
if ($form->isSubmitted() === false || $form->isValid() === false) {
51+
return $this->json(['success' => false], Response::HTTP_BAD_REQUEST);
52+
}
53+
5654
$this->replyRepository->save($reply, true);
5755

5856
$this->bus->dispatch(
5957
new CommentReplyAdded(
6058
(int)$comment->getReview()->getId(),
6159
(int)$reply->getId(),
6260
$user->getId(),
63-
$data['message'],
61+
$reply->getMessage(),
6462
$comment->getFilePath()
6563
)
6664
);
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace DR\Review\Doctrine\Type;
5+
6+
use DR\Review\Entity\Review\CommentTagEnum;
7+
8+
class CommentTagType extends AbstractEnumType
9+
{
10+
public const TYPE = 'enum_comment_tag_type';
11+
public const VALUES = [
12+
CommentTagEnum::ChangeRequest->value,
13+
CommentTagEnum::Explanation->value,
14+
CommentTagEnum::NiceToHave->value,
15+
CommentTagEnum::Suggestion->value
16+
];
17+
}

src/Entity/Review/Comment.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Doctrine\DBAL\Types\Types;
99
use Doctrine\ORM\Mapping as ORM;
1010
use DR\Review\Doctrine\Type\CommentStateType;
11+
use DR\Review\Doctrine\Type\CommentTagType;
1112
use DR\Review\Entity\User\User;
1213
use DR\Review\Repository\Review\CommentRepository;
1314

@@ -36,6 +37,9 @@ class Comment
3637
#[ORM\Column(type: Types::TEXT)]
3738
private string $message;
3839

40+
#[ORM\Column(type: CommentTagType::TYPE, nullable: true, enumType: CommentTagEnum::class)]
41+
private ?CommentTagEnum $tag;
42+
3943
#[ORM\Column]
4044
private int $createTimestamp;
4145

@@ -139,6 +143,18 @@ public function setMessage(string $message): self
139143
return $this;
140144
}
141145

146+
public function getTag(): ?CommentTagEnum
147+
{
148+
return $this->tag;
149+
}
150+
151+
public function setTag(?CommentTagEnum $tag): self
152+
{
153+
$this->tag = $tag;
154+
155+
return $this;
156+
}
157+
142158
public function getCreateTimestamp(): int
143159
{
144160
return $this->createTimestamp;

src/Entity/Review/CommentReply.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
use Doctrine\DBAL\Types\Types;
77
use Doctrine\ORM\Mapping as ORM;
8+
use DR\Review\Doctrine\Type\CommentTagType;
89
use DR\Review\Entity\User\User;
910
use DR\Review\Repository\Review\CommentReplyRepository;
1011

@@ -19,6 +20,9 @@ class CommentReply
1920
#[ORM\Column(type: Types::TEXT)]
2021
private string $message;
2122

23+
#[ORM\Column(type: CommentTagType::TYPE, nullable: true, enumType: CommentTagEnum::class)]
24+
private ?CommentTagEnum $tag;
25+
2226
#[ORM\Column(type: 'string', length: 255, nullable: true)]
2327
private ?string $extReferenceId = null;
2428

@@ -61,6 +65,18 @@ public function setMessage(string $message): void
6165
$this->message = $message;
6266
}
6367

68+
public function getTag(): ?CommentTagEnum
69+
{
70+
return $this->tag;
71+
}
72+
73+
public function setTag(?CommentTagEnum $tag): self
74+
{
75+
$this->tag = $tag;
76+
77+
return $this;
78+
}
79+
6480
public function getExtReferenceId(): ?string
6581
{
6682
return $this->extReferenceId;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace DR\Review\Entity\Review;
5+
6+
enum CommentTagEnum: string
7+
{
8+
case Suggestion = 'suggestion';
9+
case NiceToHave = 'nice_to_have';
10+
case ChangeRequest = 'change_request';
11+
case Explanation = 'explanation';
12+
}

src/Form/Review/AddCommentFormType.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55

66
use DR\Review\Controller\App\Review\Comment\AddCommentController;
77
use DR\Review\Entity\Review\CodeReview;
8+
use DR\Review\Entity\Review\Comment;
89
use DR\Review\Entity\Review\LineReference;
10+
use DR\Utils\Assert;
911
use Symfony\Component\Form\AbstractType;
1012
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
1113
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
@@ -38,7 +40,11 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
3840

3941
$builder->setAction($this->urlGenerator->generate(AddCommentController::class, ['id' => $review->getId()]));
4042
$builder->setMethod('POST');
41-
$builder->add('lineReference', HiddenType::class, ['data' => (string)$lineReference]);
43+
$builder->add(
44+
'lineReference',
45+
HiddenType::class,
46+
['data' => (string)$lineReference, 'setter' => $this->setter(...)]
47+
);
4248
$builder->add(
4349
'message',
4450
CommentType::class,
@@ -47,6 +53,14 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
4753
'attr' => ['placeholder' => 'leave.a.comment.on.line'],
4854
]
4955
);
56+
$builder->add('tag', CommentTagType::class);
5057
$builder->add('save', SubmitType::class, ['label' => 'add.comment']);
5158
}
59+
60+
public function setter(Comment $comment, string $value): void
61+
{
62+
$lineReference = LineReference::fromString($value);
63+
$comment->setLineReference($lineReference);
64+
$comment->setFilePath(Assert::notNull($lineReference->oldPath ?? $lineReference->newPath));
65+
}
5266
}

src/Form/Review/AddCommentReplyFormType.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
3434
$builder->setAction($this->urlGenerator->generate(AddCommentReplyController::class, ['id' => $comment->getId()]));
3535
$builder->setMethod('POST');
3636
$builder->add('message', CommentType::class, ['attr' => ['placeholder' => 'leave.a.reply']]);
37+
$builder->add('tag', CommentTagType::class);
3738
$builder->add('save', SubmitType::class, ['label' => 'reply']);
3839
}
3940
}

0 commit comments

Comments
 (0)