Newer
Older
using ErrorOr;
using MediatR;
using SocialNetwork.Social.Application.Posts.Commands;
using SocialNetwork.Social.Application.Posts.Queries;
namespace WebApi.Endpoints;
public class PostEndpoints
{
public void Map(IEndpointRouteBuilder builder)
{
builder.MapGet("", GetAllPosts);
builder.MapGet("/{postId:guid}", GetPostById);
builder.MapPost("", CreatePost);
builder.MapPost("/{postId:guid}/comments", CommentPost);
builder.MapPost("/{postId:guid}/like", LikePost);
}
private async Task<IResult> GetAllPosts(ISender sender) =>
Results.Ok(await sender.Send(new GetPostsQuery()));
private async Task<IResult> GetPostById(Guid postId, ISender sender)
var errorOrPost = await sender.Send(new GetPostByIdQuery(postId));
Results.Ok,
error => error.Type switch
{
ErrorType.NotFound => Results.NotFound(error.Description),
_ => Results.BadRequest(error.Description)
private async Task<IResult> CreatePost(PublishPostCommand command, ISender sender)
var errorOrCreatedPost = await sender.Send(command);
return errorOrCreatedPost.MatchFirst(
createdPost => Results.Created($"/api/posts/{createdPost.Id}", createdPost),
error => error.Type switch
{
ErrorType.Validation => Results.BadRequest(error.Description),
ErrorType.Failure => Results.Problem(error.Description),
_ => Results.BadRequest(error.Description)
}
);
private async Task<IResult> CommentPost(Guid postId, CommentPostCommand command, ISender sender)
var errorOrComment = await sender.Send(command with {PostId = postId});
return errorOrComment.MatchFirst(
comment => Results.Created($"api/posts/{postId}", comment),
error => error.Type switch
{
ErrorType.Validation => Results.BadRequest(error.Description),
ErrorType.NotFound => Results.NotFound(error.Description),
_ => Results.BadRequest(error.Description)
}
);
private async Task<IResult> LikePost(Guid postId, LikePostCommand command, ISender sender)
var errorOrSuccess = await sender.Send(command with {PostId = postId});
return errorOrSuccess.MatchFirst(
_ => Results.Ok(),
error => error.Type switch
{
ErrorType.Validation => Results.BadRequest(error.Description),
ErrorType.NotFound => Results.NotFound(error.Description),
_ => Results.BadRequest(error.Description)
}
);