Skip to content

Commit 670a68f

Browse files
authored
Add property isAuthorModeratorInMagazine to all API content DTOs (#1704)
1 parent 48c8a53 commit 670a68f

File tree

10 files changed

+66
-4
lines changed

10 files changed

+66
-4
lines changed

src/DTO/EntryCommentResponseDto.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ class EntryCommentResponseDto implements \JsonSerializable
9393
/** @var string[]|null */
9494
#[OA\Property(type: 'array', items: new OA\Items(type: 'string'))]
9595
public ?array $bookmarks = null;
96+
public ?bool $isAuthorModeratorInMagazine = null;
9697

9798
public static function create(
9899
?int $id = null,
@@ -118,6 +119,7 @@ public static function create(
118119
int $childCount = 0,
119120
?bool $canAuthUserModerate = null,
120121
?array $bookmarks = null,
122+
?bool $isAuthorModeratorInMagazine = null,
121123
): self {
122124
$dto = new EntryCommentResponseDto();
123125
$dto->commentId = $id;
@@ -143,6 +145,7 @@ public static function create(
143145
$dto->childCount = $childCount;
144146
$dto->canAuthUserModerate = $canAuthUserModerate;
145147
$dto->bookmarks = $bookmarks;
148+
$dto->isAuthorModeratorInMagazine = $isAuthorModeratorInMagazine;
146149

147150
return $dto;
148151
}
@@ -195,6 +198,7 @@ public function jsonSerialize(): mixed
195198
'children' => $this->children,
196199
'canAuthUserModerate' => $this->canAuthUserModerate,
197200
'bookmarks' => $this->bookmarks,
201+
'isAuthorModeratorInMagazine' => $this->isAuthorModeratorInMagazine,
198202
]);
199203
}
200204
}

src/DTO/EntryResponseDto.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class EntryResponseDto implements \JsonSerializable
4747
public ?string $apId = null;
4848
public ?bool $canAuthUserModerate = null;
4949
public ?ENotificationStatus $notificationStatus = null;
50+
public ?bool $isAuthorModeratorInMagazine = null;
5051

5152
/** @var string[]|null */
5253
#[OA\Property(type: 'array', items: new OA\Items(type: 'string'))]
@@ -90,6 +91,7 @@ public static function create(
9091
?bool $canAuthUserModerate = null,
9192
?array $bookmarks = null,
9293
?array $crosspostedEntries = null,
94+
?bool $isAuthorModeratorInMagazine = null,
9395
): self {
9496
$dto = new EntryResponseDto();
9597
$dto->entryId = $id;
@@ -120,6 +122,7 @@ public static function create(
120122
$dto->canAuthUserModerate = $canAuthUserModerate;
121123
$dto->bookmarks = $bookmarks;
122124
$dto->crosspostedEntries = $crosspostedEntries;
125+
$dto->isAuthorModeratorInMagazine = $isAuthorModeratorInMagazine;
123126

124127
return $dto;
125128
}
@@ -176,6 +179,7 @@ public function jsonSerialize(): mixed
176179
'notificationStatus' => $this->notificationStatus,
177180
'bookmarks' => $this->bookmarks,
178181
'crosspostedEntries' => $this->crosspostedEntries,
182+
'isAuthorModeratorInMagazine' => $this->isAuthorModeratorInMagazine,
179183
]);
180184
}
181185
}

src/DTO/PostCommentResponseDto.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ public static function create(
112112
?\DateTime $lastActive = null,
113113
?bool $canAuthUserModerate = null,
114114
?array $bookmarks = null,
115+
?bool $isAuthorModeratorInMagazine = null,
115116
): self {
116117
$dto = new PostCommentResponseDto();
117118
$dto->commentId = $id;
@@ -137,6 +138,7 @@ public static function create(
137138
$dto->childCount = $childCount;
138139
$dto->canAuthUserModerate = $canAuthUserModerate;
139140
$dto->bookmarks = $bookmarks;
141+
$dto->isAuthorModeratorInMagazine = $isAuthorModeratorInMagazine;
140142

141143
return $dto;
142144
}
@@ -185,6 +187,7 @@ public function jsonSerialize(): mixed
185187
'children' => $this->children,
186188
'canAuthUserModerate' => $this->canAuthUserModerate,
187189
'bookmarks' => $this->bookmarks,
190+
'isAuthorModeratorInMagazine' => $this->isAuthorModeratorInMagazine,
188191
]);
189192
}
190193

src/DTO/PostResponseDto.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class PostResponseDto implements \JsonSerializable
4343
/** @var string[]|null */
4444
#[OA\Property(type: 'array', items: new OA\Items(type: 'string'))]
4545
public ?array $bookmarks = null;
46+
public ?bool $isAuthorModeratorInMagazine = null;
4647

4748
/**
4849
* @param string[] $bookmarks
@@ -70,6 +71,7 @@ public static function create(
7071
?string $slug = null,
7172
?bool $canAuthUserModerate = null,
7273
?array $bookmarks = null,
74+
?bool $isAuthorModeratorInMagazine = null,
7375
): self {
7476
$dto = new PostResponseDto();
7577
$dto->postId = $id;
@@ -94,6 +96,7 @@ public static function create(
9496
$dto->slug = $slug;
9597
$dto->canAuthUserModerate = $canAuthUserModerate;
9698
$dto->bookmarks = $bookmarks;
99+
$dto->isAuthorModeratorInMagazine = $isAuthorModeratorInMagazine;
97100

98101
return $dto;
99102
}
@@ -141,6 +144,7 @@ public function jsonSerialize(): mixed
141144
'canAuthUserModerate' => $this->canAuthUserModerate,
142145
'notificationStatus' => $this->notificationStatus,
143146
'bookmarks' => $this->bookmarks,
147+
'isAuthorModeratorInMagazine' => $this->isAuthorModeratorInMagazine,
144148
]);
145149
}
146150
}

src/Factory/EntryCommentFactory.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public function createResponseDto(EntryCommentDto|EntryComment $comment, array $
6565
$dto->lastActive,
6666
$childCount,
6767
bookmarks: $this->bookmarkListRepository->getBookmarksOfContentInterface($comment),
68+
isAuthorModeratorInMagazine: $dto->magazine->userIsModerator($dto->user),
6869
);
6970
}
7071

src/Factory/EntryFactory.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public function createResponseDto(EntryDto|Entry $entry, array $tags, ?array $cr
7575
$dto->apId,
7676
bookmarks: $this->bookmarkListRepository->getBookmarksOfContentInterface($entry),
7777
crosspostedEntries: $crosspostedEntries,
78+
isAuthorModeratorInMagazine: $dto->magazine->userIsModerator($dto->user),
7879
);
7980
}
8081

src/Factory/PostCommentFactory.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public function createResponseDto(PostCommentDto|PostComment $comment, array $ta
6464
$dto->editedAt,
6565
$dto->lastActive,
6666
bookmarks: $this->bookmarkListRepository->getBookmarksOfContentInterface($comment),
67+
isAuthorModeratorInMagazine: $dto->magazine->userIsModerator($dto->user),
6768
);
6869
}
6970

src/Factory/PostFactory.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public function createResponseDto(PostDto|Post $post, array $tags): PostResponse
5959
$dto->lastActive,
6060
$dto->slug,
6161
bookmarks: $this->bookmarkListRepository->getBookmarksOfContentInterface($post),
62+
isAuthorModeratorInMagazine: $dto->magazine->userIsModerator($dto->user),
6263
);
6364
}
6465

tests/Functional/Controller/Api/Entry/EntryRetrieveApiTest.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1118,6 +1118,7 @@ public function testApiCanGetEntriesLocal(): void
11181118
self::assertIsArray($jsonData['items'][0]);
11191119
self::assertArrayKeysMatch(self::ENTRY_RESPONSE_KEYS, $jsonData['items'][0]);
11201120
self::assertSame($first->getId(), $jsonData['items'][0]['entryId']);
1121+
self::assertTrue($jsonData['items'][0]['isAuthorModeratorInMagazine']);
11211122
}
11221123

11231124
public function testApiCanGetEntriesFederated(): void
@@ -1154,6 +1155,48 @@ public function testApiCanGetEntriesFederated(): void
11541155
self::assertIsArray($jsonData['items'][0]);
11551156
self::assertArrayKeysMatch(self::ENTRY_RESPONSE_KEYS, $jsonData['items'][0]);
11561157
self::assertSame($second->getId(), $jsonData['items'][0]['entryId']);
1158+
self::assertTrue($jsonData['items'][0]['isAuthorModeratorInMagazine']);
1159+
}
1160+
1161+
public function testApiGetAuthorNotModerator(): void
1162+
{
1163+
$first = $this->getEntryByTitle('first', body: 'test');
1164+
sleep(1);
1165+
$second = $this->getEntryByTitle('second', body: 'test2', user: $this->getUserByUsername('Jane Doe'));
1166+
1167+
$entityManager = $this->entityManager;
1168+
$entityManager->persist($first);
1169+
$entityManager->persist($second);
1170+
$entityManager->flush();
1171+
1172+
self::createOAuth2AuthCodeClient();
1173+
$this->client->loginUser($this->getUserByUsername('user'));
1174+
1175+
$codes = self::getAuthorizationCodeTokenResponse($this->client, scopes: 'read');
1176+
$token = $codes['token_type'].' '.$codes['access_token'];
1177+
1178+
$this->client->request('GET', '/api/entries?sort=oldest', server: ['HTTP_AUTHORIZATION' => $token]);
1179+
self::assertResponseIsSuccessful();
1180+
1181+
$jsonData = self::getJsonResponse($this->client);
1182+
self::assertIsArray($jsonData);
1183+
self::assertArrayKeysMatch(self::PAGINATED_KEYS, $jsonData);
1184+
1185+
self::assertIsArray($jsonData['items']);
1186+
self::assertCount(2, $jsonData['items']);
1187+
self::assertIsArray($jsonData['pagination']);
1188+
self::assertArrayKeysMatch(self::PAGINATION_KEYS, $jsonData['pagination']);
1189+
self::assertSame(2, $jsonData['pagination']['count']);
1190+
1191+
self::assertIsArray($jsonData['items'][0]);
1192+
self::assertArrayKeysMatch(self::ENTRY_RESPONSE_KEYS, $jsonData['items'][0]);
1193+
self::assertSame($first->getId(), $jsonData['items'][0]['entryId']);
1194+
self::assertTrue($jsonData['items'][0]['isAuthorModeratorInMagazine']);
1195+
1196+
self::assertIsArray($jsonData['items'][1]);
1197+
self::assertArrayKeysMatch(self::ENTRY_RESPONSE_KEYS, $jsonData['items'][1]);
1198+
self::assertSame($second->getId(), $jsonData['items'][1]['entryId']);
1199+
self::assertFalse($jsonData['items'][1]['isAuthorModeratorInMagazine']);
11571200
}
11581201

11591202
public function testApiContainsCrosspostInformation(): void

tests/WebTestCase.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,10 @@ abstract class WebTestCase extends BaseWebTestCase
7979
protected const MESSAGE_RESPONSE_KEYS = ['messageId', 'threadId', 'sender', 'body', 'status', 'createdAt'];
8080
protected const USER_RESPONSE_KEYS = ['userId', 'username', 'about', 'avatar', 'cover', 'createdAt', 'followersCount', 'apId', 'apProfileId', 'isBot', 'isFollowedByUser', 'isFollowerOfUser', 'isBlockedByUser', 'isAdmin', 'isGlobalModerator', 'serverSoftware', 'serverSoftwareVersion', 'notificationStatus'];
8181
protected const USER_SMALL_RESPONSE_KEYS = ['userId', 'username', 'isBot', 'isFollowedByUser', 'isFollowerOfUser', 'isBlockedByUser', 'avatar', 'apId', 'apProfileId', 'createdAt', 'isAdmin', 'isGlobalModerator'];
82-
protected const ENTRY_RESPONSE_KEYS = ['entryId', 'magazine', 'user', 'domain', 'title', 'url', 'image', 'body', 'lang', 'tags', 'badges', 'numComments', 'uv', 'dv', 'favourites', 'isFavourited', 'userVote', 'isOc', 'isAdult', 'isPinned', 'createdAt', 'editedAt', 'lastActive', 'visibility', 'type', 'slug', 'apId', 'canAuthUserModerate', 'notificationStatus', 'bookmarks', 'crosspostedEntries'];
83-
protected const ENTRY_COMMENT_RESPONSE_KEYS = ['commentId', 'magazine', 'user', 'entryId', 'parentId', 'rootId', 'image', 'body', 'lang', 'isAdult', 'uv', 'dv', 'favourites', 'isFavourited', 'userVote', 'visibility', 'apId', 'mentions', 'tags', 'createdAt', 'editedAt', 'lastActive', 'childCount', 'children', 'canAuthUserModerate', 'bookmarks'];
84-
protected const POST_RESPONSE_KEYS = ['postId', 'user', 'magazine', 'image', 'body', 'lang', 'isAdult', 'isPinned', 'comments', 'uv', 'dv', 'favourites', 'isFavourited', 'userVote', 'visibility', 'apId', 'tags', 'mentions', 'createdAt', 'editedAt', 'lastActive', 'slug', 'canAuthUserModerate', 'notificationStatus', 'bookmarks'];
85-
protected const POST_COMMENT_RESPONSE_KEYS = ['commentId', 'user', 'magazine', 'postId', 'parentId', 'rootId', 'image', 'body', 'lang', 'isAdult', 'uv', 'dv', 'favourites', 'isFavourited', 'userVote', 'visibility', 'apId', 'mentions', 'tags', 'createdAt', 'editedAt', 'lastActive', 'childCount', 'children', 'canAuthUserModerate', 'bookmarks'];
82+
protected const ENTRY_RESPONSE_KEYS = ['entryId', 'magazine', 'user', 'domain', 'title', 'url', 'image', 'body', 'lang', 'tags', 'badges', 'numComments', 'uv', 'dv', 'favourites', 'isFavourited', 'userVote', 'isOc', 'isAdult', 'isPinned', 'createdAt', 'editedAt', 'lastActive', 'visibility', 'type', 'slug', 'apId', 'canAuthUserModerate', 'notificationStatus', 'bookmarks', 'crosspostedEntries', 'isAuthorModeratorInMagazine'];
83+
protected const ENTRY_COMMENT_RESPONSE_KEYS = ['commentId', 'magazine', 'user', 'entryId', 'parentId', 'rootId', 'image', 'body', 'lang', 'isAdult', 'uv', 'dv', 'favourites', 'isFavourited', 'userVote', 'visibility', 'apId', 'mentions', 'tags', 'createdAt', 'editedAt', 'lastActive', 'childCount', 'children', 'canAuthUserModerate', 'bookmarks', 'isAuthorModeratorInMagazine'];
84+
protected const POST_RESPONSE_KEYS = ['postId', 'user', 'magazine', 'image', 'body', 'lang', 'isAdult', 'isPinned', 'comments', 'uv', 'dv', 'favourites', 'isFavourited', 'userVote', 'visibility', 'apId', 'tags', 'mentions', 'createdAt', 'editedAt', 'lastActive', 'slug', 'canAuthUserModerate', 'notificationStatus', 'bookmarks', 'isAuthorModeratorInMagazine'];
85+
protected const POST_COMMENT_RESPONSE_KEYS = ['commentId', 'user', 'magazine', 'postId', 'parentId', 'rootId', 'image', 'body', 'lang', 'isAdult', 'uv', 'dv', 'favourites', 'isFavourited', 'userVote', 'visibility', 'apId', 'mentions', 'tags', 'createdAt', 'editedAt', 'lastActive', 'childCount', 'children', 'canAuthUserModerate', 'bookmarks', 'isAuthorModeratorInMagazine'];
8686
protected const BAN_RESPONSE_KEYS = ['banId', 'reason', 'expired', 'expiredAt', 'bannedUser', 'bannedBy', 'magazine'];
8787
protected const LOG_ENTRY_KEYS = ['type', 'createdAt', 'magazine', 'moderator', 'subject'];
8888
protected const MAGAZINE_RESPONSE_KEYS = ['magazineId', 'owner', 'icon', 'name', 'title', 'description', 'rules', 'subscriptionsCount', 'entryCount', 'entryCommentCount', 'postCount', 'postCommentCount', 'isAdult', 'isUserSubscribed', 'isBlockedByUser', 'tags', 'badges', 'moderators', 'apId', 'apProfileId', 'serverSoftware', 'serverSoftwareVersion', 'isPostingRestrictedToMods', 'localSubscribers', 'notificationStatus'];

0 commit comments

Comments
 (0)