71 lines
2.1 KiB
C#
71 lines
2.1 KiB
C#
using Femto.Api.Controllers.Posts.Dto;
|
|
using Femto.Modules.Blog;
|
|
using Femto.Modules.Blog.Application;
|
|
using Femto.Modules.Blog.Application.Commands.CreatePost;
|
|
using Femto.Modules.Blog.Application.Queries.GetPosts;
|
|
using MediatR;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
namespace Femto.Api.Controllers.Posts;
|
|
|
|
[ApiController]
|
|
[Route("posts")]
|
|
public class PostsController(IBlogModule blogModule) : ControllerBase
|
|
{
|
|
[HttpGet]
|
|
public async Task<ActionResult<GetAllPublicPostsResponse>> GetAllPublicPosts(
|
|
[FromQuery] GetPublicPostsSearchParams searchParams,
|
|
CancellationToken cancellationToken
|
|
)
|
|
{
|
|
var res = await blogModule.PostQuery(
|
|
new GetPostsQuery
|
|
{
|
|
From = searchParams.From,
|
|
Amount = searchParams.Amount ?? 20,
|
|
AuthorId = searchParams.AuthorId,
|
|
Author = searchParams.Author,
|
|
},
|
|
cancellationToken
|
|
);
|
|
|
|
return new GetAllPublicPostsResponse(
|
|
res.Posts.Select(p => new PublicPostDto(
|
|
new PublicPostAuthorDto(p.Author.AuthorId, p.Author.Username),
|
|
p.PostId,
|
|
p.Text,
|
|
p.Media.Select(m => new PublicPostMediaDto(m.Url, m.Width, m.Height)),
|
|
p.CreatedAt
|
|
)),
|
|
res.Next
|
|
);
|
|
}
|
|
|
|
[HttpPost]
|
|
public async Task<ActionResult<CreatePostResponse>> Post(
|
|
[FromBody] CreatePostRequest req,
|
|
CancellationToken cancellationToken
|
|
)
|
|
{
|
|
var guid = await blogModule.PostCommand(
|
|
new CreatePostCommand(
|
|
req.AuthorId,
|
|
req.Content,
|
|
req.Media.Select(
|
|
(media, idx) =>
|
|
new CreatePostMedia(
|
|
media.MediaId,
|
|
media.Url,
|
|
media.Type,
|
|
idx,
|
|
media.Width,
|
|
media.Height
|
|
)
|
|
)
|
|
),
|
|
cancellationToken
|
|
);
|
|
|
|
return new CreatePostResponse(guid);
|
|
}
|
|
}
|