femto-backend/Femto.Api/Controllers/Posts/PostsController.cs

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);
}
}