Skip to content

Commit e919360

Browse files
committed
feat: Add post PostGetNavigateAction
1 parent 01b8d07 commit e919360

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<?php
2+
3+
namespace CSlant\Blog\Api\Http\Actions\Post;
4+
5+
use Botble\Blog\Repositories\Interfaces\PostInterface;
6+
use CSlant\Blog\Api\Http\Resources\Post\PostNavigateResource;
7+
use CSlant\Blog\Core\Facades\Base\SlugHelper;
8+
use CSlant\Blog\Core\Http\Responses\Base\BaseHttpResponse;
9+
use CSlant\Blog\Core\Models\Post;
10+
use CSlant\Blog\Core\Models\Slug;
11+
use Illuminate\Http\JsonResponse;
12+
use Illuminate\Http\Resources\Json\JsonResource;
13+
use Illuminate\Http\RedirectResponse;
14+
use OpenApi\Attributes\Get;
15+
use OpenApi\Attributes\Parameter;
16+
use OpenApi\Attributes\Response;
17+
use OpenApi\Attributes\Schema;
18+
19+
/**
20+
* Class PostGetNavigateAction
21+
*
22+
* @package CSlant\Blog\Api\Http\Actions\Post
23+
*
24+
* @method BaseHttpResponse httpResponse()
25+
* @method BaseHttpResponse setData(mixed $data)
26+
* @method BaseHttpResponse|JsonResource|JsonResponse|RedirectResponse toApiResponse()
27+
*/
28+
class PostGetNavigateAction
29+
{
30+
public function __construct(
31+
protected PostInterface $postRepository
32+
) {
33+
}
34+
35+
/**
36+
* @group Blog API
37+
*
38+
* @param string $slug
39+
*
40+
* @return BaseHttpResponse|JsonResource|JsonResponse|RedirectResponse
41+
*/
42+
#[
43+
Get(
44+
path: "/posts/{slug}/navigate",
45+
operationId: "postGetNavigate",
46+
description: "Get the previous and next posts by slug
47+
This API will return both previous and next posts for navigation purposes.
48+
",
49+
summary: "Get previous and next posts for navigation",
50+
tags: ["Post"],
51+
parameters: [
52+
new Parameter(
53+
name: 'slug',
54+
description: 'Post slug',
55+
in: 'path',
56+
required: true,
57+
schema: new Schema(type: 'string')
58+
),
59+
],
60+
responses: [
61+
new Response(
62+
response: 200,
63+
description: 'Navigation posts retrieved successfully',
64+
),
65+
new Response(
66+
response: 404,
67+
description: 'Post not found',
68+
),
69+
]
70+
)
71+
]
72+
public function __invoke(string $slug): BaseHttpResponse|JsonResponse|JsonResource|RedirectResponse
73+
{
74+
/** @var Slug $slug */
75+
$slug = SlugHelper::getSlug($slug, SlugHelper::getPrefix(Post::getBaseModel()));
76+
77+
if (!$slug) {
78+
return $this
79+
->httpResponse()
80+
->setError()
81+
->setCode(404)
82+
->setMessage('Post not found');
83+
}
84+
85+
$navigationPosts = $this->postRepository->getNavigatePosts($slug->reference_id);
86+
87+
return $this
88+
->httpResponse()
89+
->setData(new PostNavigateResource($navigationPosts))
90+
->toApiResponse();
91+
}
92+
93+
/**
94+
* @return BaseHttpResponse
95+
*/
96+
protected function httpResponse(): BaseHttpResponse
97+
{
98+
return new BaseHttpResponse();
99+
}
100+
}

0 commit comments

Comments
 (0)