| Total Complexity | 23 |
| Total Lines | 216 |
| Duplicated Lines | 0 % |
| Changes | 1 | ||
| Bugs | 0 | Features | 0 |
| 1 | <?php |
||
| 23 | class InMemoryCommentsRepository implements |
||
| 24 | CommentsPostsEventsHandlingRepositoryInterface, |
||
| 25 | CommentsPostHeadersFindingRepositoryInterface, |
||
| 26 | CommentsCreationRepositoryInterface, |
||
| 27 | CommentsFindingRepositoryInterface, |
||
| 28 | CommentsDeletionRepositoryInterface, |
||
| 29 | CommentsSecurityEventsHandlingRepositoryInterface |
||
| 30 | { |
||
| 31 | |||
| 32 | private static Collection $postHeaders; |
||
| 33 | private static Collection $comments; |
||
| 34 | |||
| 35 | public function __construct() |
||
| 36 | { |
||
| 37 | self::clear(); |
||
| 38 | } |
||
| 39 | |||
| 40 | public static function clear(): void |
||
| 41 | { |
||
| 42 | self::$postHeaders = Collection::from([]); |
||
| 43 | self::$comments = Collection::from([]); |
||
| 44 | } |
||
| 45 | |||
| 46 | function createPostHeader(CreateNewCommentsPostHeaderDto $newPostHeader): void |
||
|
|
|||
| 47 | { |
||
| 48 | self::$postHeaders = self::$postHeaders->append(new InMemoryCommentPostHeader( |
||
| 49 | $newPostHeader->getId(), |
||
| 50 | $newPostHeader->getTitle(), |
||
| 51 | $newPostHeader->getSummary(), |
||
| 52 | $newPostHeader->getTags(), |
||
| 53 | $newPostHeader->getCreatedById(), |
||
| 54 | $newPostHeader->getCreatedByName(), |
||
| 55 | $newPostHeader->getCreatedAt(), |
||
| 56 | $newPostHeader->getVersion() |
||
| 57 | )); |
||
| 58 | } |
||
| 59 | |||
| 60 | function updatePostHeader(UpdateExistingCommentsPostHeaderDto $updatedPostHeader): void |
||
| 61 | { |
||
| 62 | foreach (self::$postHeaders |
||
| 63 | ->filter(function ($header) use ($updatedPostHeader) { |
||
| 64 | return $header->getId() == $updatedPostHeader->getId() && $header->getVersion() <= $updatedPostHeader->getVersion(); |
||
| 65 | }) |
||
| 66 | ->toArray() as $header) { |
||
| 67 | $header->setTitle($updatedPostHeader->getTitle()); |
||
| 68 | $header->setSummary($updatedPostHeader->getSummary()); |
||
| 69 | $header->setTags($updatedPostHeader->getTags()); |
||
| 70 | $header->setVersion($updatedPostHeader->getVersion()); |
||
| 71 | } |
||
| 72 | } |
||
| 73 | |||
| 74 | function deletePostHeader(DeleteExistingCommentsPostHeaderDto $deletedPostHeader): void |
||
| 81 | } |
||
| 82 | |||
| 83 | function findPostHeaders(?\DateTime $from = null): array |
||
| 84 | { |
||
| 85 | return self::$postHeaders |
||
| 86 | ->filter(function ($header) use ($from) { |
||
| 87 | return $from == null || $header->getCreatedAt() >= $from; |
||
| 88 | }) |
||
| 89 | ->map(function ($header) { |
||
| 90 | return new CommentsPostHeaderDto( |
||
| 91 | $header->getId(), |
||
| 92 | $header->getTitle(), |
||
| 93 | $header->getSummary(), |
||
| 94 | $header->getTags(), |
||
| 95 | $header->getCreatedById(), |
||
| 96 | $header->getCreatedByName(), |
||
| 97 | $header->getCreatedAt(), |
||
| 98 | $header->getVersion() |
||
| 99 | ); |
||
| 100 | }) |
||
| 101 | ->toArray(); |
||
| 102 | } |
||
| 103 | |||
| 104 | public function createComment(CreateNewCommentDto $newComment): Ulid |
||
| 105 | { |
||
| 106 | $id = new Ulid(); |
||
| 107 | $parentComment = null; |
||
| 108 | if ($newComment->getParentId() != null) { |
||
| 109 | $parentComment = self::$comments->find(function ($comment) use ($newComment) { |
||
|
1 ignored issue
–
show
|
|||
| 110 | return $comment->getId() == $newComment->getParentId(); |
||
| 111 | }); |
||
| 112 | } |
||
| 113 | $post = self::$postHeaders->find(function ($post) use ($newComment) { |
||
|
1 ignored issue
–
show
|
|||
| 114 | return $post->getId() == $newComment->getPostId(); |
||
| 115 | }); |
||
| 116 | $comment = new InMemoryComment( |
||
| 117 | $id, |
||
| 118 | $newComment->getAuthor(), |
||
| 119 | $newComment->getBody(), |
||
| 120 | $newComment->getCreatedAt(), |
||
| 121 | $parentComment, |
||
| 122 | $post |
||
| 123 | ); |
||
| 124 | self::$comments = self::$comments->append($comment); |
||
| 125 | $data = $post->getComments(); |
||
| 126 | array_push($data, $comment); |
||
| 127 | $post->setComments($data); |
||
| 128 | return $id; |
||
| 129 | } |
||
| 130 | |||
| 131 | public function getCommentsCount(Ulid $postId): int |
||
| 132 | { |
||
| 133 | return self::$postHeaders |
||
|
1 ignored issue
–
show
|
|||
| 134 | ->filter(function ($post) use ($postId) { |
||
| 135 | return $post->getId() == $postId; |
||
| 136 | }) |
||
| 137 | ->map(function ($post) { |
||
| 138 | return count($post->getComments()); |
||
| 139 | }) |
||
| 140 | ->first(); |
||
| 141 | } |
||
| 142 | |||
| 143 | public function findCommentsByPostId(Ulid $postId): array |
||
| 144 | { |
||
| 145 | $post = self::$postHeaders |
||
|
1 ignored issue
–
show
|
|||
| 146 | ->find(function ($post) use ($postId) { |
||
| 147 | return $post->getId() == $postId; |
||
| 148 | }); |
||
| 149 | if ($post == null) { |
||
|
1 ignored issue
–
show
|
|||
| 150 | return []; |
||
| 151 | } |
||
| 152 | return Collection::from($post->getComments()) |
||
| 153 | ->map(function ($comment) { |
||
| 154 | $parentId = $comment->getParentComment() != null ? $comment->getParentComment()->getId() : null; |
||
| 155 | return new CommentDto( |
||
| 156 | $comment->getId(), |
||
| 157 | $comment->getAuthor(), |
||
| 158 | $comment->getBody(), |
||
| 159 | $parentId, |
||
| 160 | $comment->getCreatedAt() |
||
| 161 | ); |
||
| 162 | })->toArray(); |
||
| 163 | } |
||
| 164 | |||
| 165 | public function findLatestComments(int $pageNo): Page |
||
| 166 | { |
||
| 167 | $from = ($pageNo - 1) * self::PAGE_SIZE; |
||
| 168 | $to = $from + self::PAGE_SIZE; |
||
| 169 | $data = self::$comments |
||
| 170 | ->map(function ($comment) { |
||
| 171 | $parentId = $comment->getParentComment() != null ? $comment->getParentComment()->getId() : null; |
||
| 172 | return new CommentWithPostDto( |
||
| 173 | $comment->getId(), |
||
| 174 | $comment->getAuthor(), |
||
| 175 | $comment->getBody(), |
||
| 176 | $parentId, |
||
| 177 | $comment->getCreatedAt(), |
||
| 178 | $comment->getPost()->getId(), |
||
| 179 | $comment->getPost()->getTitle(), |
||
| 180 | $comment->getPost()->getSummary(), |
||
| 181 | self::$postHeaders |
||
| 182 | ->filter(function ($post) use ($comment) { |
||
| 183 | return $post->getId() == $comment->getPost()->getId(); |
||
| 184 | })->size(), |
||
| 185 | $comment->getPost()->getTags(), |
||
| 186 | |||
| 187 | ); |
||
| 188 | }) |
||
| 189 | ->sort(function ($c1, $c2) { |
||
| 190 | return $c1->getCreatedAt() < $c2->getCreatedAt() ? 1 : -1; |
||
| 191 | }) |
||
| 192 | ->slice($from, $to) |
||
| 193 | ->toArray(); |
||
| 194 | return new Page(array_values($data), self::$comments->size(), $pageNo, self::PAGE_SIZE); |
||
| 195 | } |
||
| 196 | |||
| 197 | public function commentExists(Ulid $commentId): bool |
||
| 198 | { |
||
| 199 | return self::$comments |
||
| 200 | ->filter(function ($comment) use ($commentId) { |
||
| 201 | return $comment->getId() == $commentId; |
||
| 202 | })->sizeIsGreaterThan(0); |
||
| 203 | } |
||
| 204 | |||
| 205 | public function postExists(Ulid $postId): bool |
||
| 206 | { |
||
| 207 | return self::$postHeaders |
||
| 208 | ->filter(function ($post) use ($postId) { |
||
| 209 | return $post->getId() == $postId; |
||
| 210 | })->sizeIsGreaterThan(0); |
||
| 211 | } |
||
| 212 | |||
| 213 | public function deleteCommentsForPost(Ulid $postId) |
||
| 214 | { |
||
| 215 | self::$comments = self::$comments |
||
| 216 | ->filter(function ($comment) use ($postId) { |
||
| 217 | return $comment->getPost()->getId() != $postId; |
||
| 218 | }) |
||
| 219 | ->realize(); |
||
| 220 | $post = self::$postHeaders->find(function ($post) use ($postId) { |
||
|
1 ignored issue
–
show
|
|||
| 221 | $post->getId() == $postId; |
||
| 222 | }); |
||
| 223 | if ($post != null) { |
||
|
1 ignored issue
–
show
|
|||
| 224 | $post->setComments([]); |
||
| 225 | } |
||
| 226 | |||
| 227 | } |
||
| 228 | |||
| 229 | public function updateUserName(UpdatedCommentsPostHeadersUserNameDto $updatedUserName): void |
||
| 239 | } |
||
| 240 | } |
Adding explicit visibility (
private,protected, orpublic) is generally recommend to communicate to other developers how, and from where this method is intended to be used.