Skip to content
Merged
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
27 changes: 24 additions & 3 deletions backend/src-dev/OpenApi/openapi-admin.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -326,10 +326,10 @@ components:
data:
type: array
items:
properties: { title: { type: string, description: Заголовок }, alias: { type: string, description: Алиас }, body: { type: string, description: Контент, nullable: true } }
$ref: '#/components/schemas/adminArticleListItem'
example:
- { title: 'Первая статья', alias: first-article, body: 'Контент первой статьи' }
- { title: 'Вторая статья', alias: second-article, body: 'Контент второй статьи' }
- { id: 0196a05e-f2bc-7ee0-b394-642978a036ec, title: 'Первая статья', alias: first-article, createdAt: 2025-05-05T15:15:12+00:00 }
- { id: 0196a05e-da4a-7209-821a-d860ec58f714, title: 'Вторая статья', alias: second-article, createdAt: 2025-05-04T15:15:12+00:00 }
headers:
X-Request-TraceId:
$ref: '#/components/headers/requestTraceId'
Expand Down Expand Up @@ -461,8 +461,10 @@ components:
required:
- id
- title
- body
- alias
- createdAt
- updatedAt
properties:
id:
type: string
Expand All @@ -484,6 +486,25 @@ components:
$ref: '#/components/schemas/updatedAt'
status:
$ref: '#/components/schemas/succeedStatus'
adminArticleListItem:
type: object
required:
- id
- title
- alias
- createdAt
properties:
id:
type: string
format: uuid
description: ID
example: dc8dbada-b154-4ffb-b21c-da70162e2704
title:
$ref: '#/components/schemas/adminArticleTitle'
alias:
$ref: '#/components/schemas/adminArticleAlias'
createdAt:
$ref: '#/components/schemas/createdAt'
adminArticleTitle:
type: string
description: Заголовок
Expand Down
27 changes: 24 additions & 3 deletions backend/src-dev/OpenApi/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1093,10 +1093,10 @@ components:
data:
type: array
items:
properties: { title: { type: string, description: Заголовок }, alias: { type: string, description: Алиас }, body: { type: string, description: Контент, nullable: true } }
$ref: '#/components/schemas/adminArticleListItem'
example:
- { title: 'Первая статья', alias: first-article, body: 'Контент первой статьи' }
- { title: 'Вторая статья', alias: second-article, body: 'Контент второй статьи' }
- { id: 0196a05e-f2bc-7ee0-b394-642978a036ec, title: 'Первая статья', alias: first-article, createdAt: 2025-05-05T15:15:12+00:00 }
- { id: 0196a05e-da4a-7209-821a-d860ec58f714, title: 'Вторая статья', alias: second-article, createdAt: 2025-05-04T15:15:12+00:00 }
headers:
X-Request-TraceId:
$ref: '#/components/headers/requestTraceId'
Expand Down Expand Up @@ -1294,8 +1294,10 @@ components:
required:
- id
- title
- body
- alias
- createdAt
- updatedAt
properties:
id:
type: string
Expand All @@ -1317,6 +1319,25 @@ components:
$ref: '#/components/schemas/updatedAt'
status:
$ref: '#/components/schemas/succeedStatus'
adminArticleListItem:
type: object
required:
- id
- title
- alias
- createdAt
properties:
id:
type: string
format: uuid
description: ID
example: dc8dbada-b154-4ffb-b21c-da70162e2704
title:
$ref: '#/components/schemas/adminArticleTitle'
alias:
$ref: '#/components/schemas/adminArticleAlias'
createdAt:
$ref: '#/components/schemas/createdAt'
adminArticleTitle:
type: string
description: Заголовок
Expand Down
43 changes: 28 additions & 15 deletions backend/src-dev/OpenApi/resources/admin/article.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -193,24 +193,16 @@ components:
data:
type: array
items:
properties:
title:
type: string
description: Заголовок
alias:
type: string
description: Алиас
body:
type: string
description: Контент
nullable: true
$ref: '#/components/schemas/adminArticleListItem'
example:
- title: Первая статья
- id: 0196a05e-f2bc-7ee0-b394-642978a036ec
title: Первая статья
alias: first-article
body: Контент первой статьи
- title: Вторая статья
createdAt: 2025-05-05T15:15:12+00:00
- id: 0196a05e-da4a-7209-821a-d860ec58f714
title: Вторая статья
alias: second-article
body: Контент второй статьи
createdAt: 2025-05-04T15:15:12+00:00
headers:
X-Request-TraceId:
$ref: '../common.yaml#/components/headers/requestTraceId'
Expand Down Expand Up @@ -256,8 +248,10 @@ components:
required:
- id
- title
- body
- alias
- createdAt
- updatedAt
properties:
id:
type: string
Expand All @@ -279,6 +273,25 @@ components:
$ref: '../common.yaml#/components/schemas/updatedAt'
status:
$ref: '../common.yaml#/components/schemas/succeedStatus'
adminArticleListItem:
type: object
required:
- id
- title
- alias
- createdAt
properties:
id:
type: string
format: uuid
description: ID
example: dc8dbada-b154-4ffb-b21c-da70162e2704
title:
$ref: '#/components/schemas/adminArticleTitle'
alias:
$ref: '#/components/schemas/adminArticleAlias'
createdAt:
$ref: '../common.yaml#/components/schemas/createdAt'
adminArticleTitle:
type: string
description: Заголовок
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,7 @@ public function testSuccess(): void
* id: string,
* title: string,
* alias: string,
* body: string,
* createdAt: string|null,
* updatedAt: string|null
* createdAt: string|null
* }>,
* pagination: array{total: int},
* } $articles
Expand All @@ -69,16 +67,12 @@ public function testSuccess(): void
self::assertSame($articleId2, $articles['data'][0]['id']);
self::assertSame($title2, $articles['data'][0]['title']);
self::assertSame($alias2, $articles['data'][0]['alias']);
self::assertSame($content2, $articles['data'][0]['body']);
self::assertNotEmpty($articles['data'][0]['createdAt']);
self::assertNull($articles['data'][0]['updatedAt']);

self::assertSame($articleId1, $articles['data'][1]['id']);
self::assertSame($title1, $articles['data'][1]['title']);
self::assertSame($alias1, $articles['data'][1]['alias']);
self::assertSame($content1, $articles['data'][1]['body']);
self::assertNotEmpty($articles['data'][1]['createdAt']);
self::assertNull($articles['data'][1]['updatedAt']);

self::assertSame(2, $articles['pagination']['total']);
}
Expand Down Expand Up @@ -115,9 +109,7 @@ public function testArticleNotFound(): void
* id: string,
* title: string,
* alias: string,
* body: string,
* createdAt: string|null,
* updatedAt: string|null
* createdAt: string|null
* }>,
* pagination: array{total: int},
* } $articles
Expand All @@ -129,9 +121,7 @@ public function testArticleNotFound(): void
self::assertSame($articleId, $articles['data'][0]['id']);
self::assertSame($title, $articles['data'][0]['title']);
self::assertSame($alias, $articles['data'][0]['alias']);
self::assertSame($content, $articles['data'][0]['body']);
self::assertNotEmpty($articles['data'][0]['createdAt']);
self::assertNull($articles['data'][0]['updatedAt']);

self::assertSame(1, $articles['pagination']['total']);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,7 @@ public function testSuccess(): void
self::assertContains($article['id'], [$articleId1, $articleId2]);
self::assertContains($article['title'], [$title1, $title2]);
self::assertNotEmpty($article['alias']);
self::assertNotEmpty($article['body']);
self::assertNotEmpty($article['createdAt']);
self::assertNull($article['updatedAt']);
}
}

Expand Down
24 changes: 22 additions & 2 deletions backend/src/Article/Http/Admin/ArticleListAction.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace App\Article\Http\Admin;

use App\Article\Domain\Article;
use App\Article\Domain\ArticleRepository;
use App\Infrastructure\Response\ApiListObjectResponse;
use App\Infrastructure\Response\PaginationResponse;
Expand All @@ -21,7 +22,9 @@
#[AsController]
final readonly class ArticleListAction
{
public function __construct(private ArticleRepository $articleRepository) {}
public function __construct(
private ArticleRepository $articleRepository,
) {}

public function __invoke(): ApiListObjectResponse
{
Expand All @@ -31,8 +34,25 @@ public function __invoke(): ApiListObjectResponse
$pagination = new PaginationResponse($articlesCount);

return new ApiListObjectResponse(
data: $articles,
data: $this->buildResponseData($articles),
pagination: $pagination,
);
}

/**
* @param list<Article> $articleList
*
* @return iterable<ArticleListData>
*/
private function buildResponseData(array $articleList): iterable
{
foreach ($articleList as $article) {
yield new ArticleListData(
id: $article->getId(),
title: $article->getTitle(),
alias: $article->getAlias(),
createdAt: $article->getCreatedAt(),
);
}
}
}
9 changes: 7 additions & 2 deletions backend/src/Article/Http/Admin/ArticleListByIdsAction.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public function __invoke(
* @param non-empty-list<Uuid> $ids
* @param list<Article> $articles
*
* @return iterable<Article>
* @return iterable<ArticleListData>
*/
private function buildResponseData(array $ids, array $articles): iterable
{
Expand All @@ -71,7 +71,12 @@ private function buildResponseData(array $ids, array $articles): iterable
continue;
}

yield $article;
yield new ArticleListData(
id: $article->getId(),
title: $article->getTitle(),
alias: $article->getAlias(),
createdAt: $article->getCreatedAt(),
);
}
}
}
21 changes: 21 additions & 0 deletions backend/src/Article/Http/Admin/ArticleListData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

declare(strict_types=1);

namespace App\Article\Http\Admin;

use DateTimeImmutable;
use Symfony\Component\Uid\Uuid;

/**
* Данные статьи для списка
*/
final readonly class ArticleListData
{
public function __construct(
public Uuid $id,
public string $title,
public string $alias,
public DateTimeImmutable $createdAt,
) {}
}
27 changes: 18 additions & 9 deletions backend/src/Article/Http/Site/ArticleListAction.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace App\Article\Http\Site;

use App\Article\Domain\Article;
use App\Article\Domain\ArticleRepository;
use App\Infrastructure\Request\Pagination\PaginationRequest;
use App\Infrastructure\Request\Pagination\PaginationRequestArgumentResolver;
Expand Down Expand Up @@ -31,22 +32,30 @@ public function __invoke(
limit: $paginationRequest->limit,
offset: $paginationRequest->offset,
);

$articlesCount = $this->articleRepository->countAll();

$data = [];
$pagination = new PaginationResponse($articlesCount);

return new ApiListObjectResponse(
data: $this->buildResponseData($articles),
pagination: $pagination,
);
}

/**
* @param list<Article> $articles
*
* @return iterable<ArticleListData>
*/
private function buildResponseData(array $articles): iterable
{
foreach ($articles as $article) {
$data[] = new ArticleListData(
yield new ArticleListData(
title: $article->getTitle(),
alias: $article->getAlias(),
body: $article->getBody(),
);
}

$pagination = new PaginationResponse($articlesCount);

return new ApiListObjectResponse(
data: $data,
pagination: $pagination,
);
}
}