Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
b2ae5d1
Add api documentation in Blog minimal api
lakatoshv Apr 10, 2026
1d7b275
Fix CQRS endpoints configurations
lakatoshv Apr 10, 2026
388f9c2
Add CQRS requests
lakatoshv Apr 10, 2026
7e35223
Add Get posts command and command handler in posts feature
lakatoshv Apr 10, 2026
4ed23fa
Add User posts endpoint
lakatoshv Apr 11, 2026
2e20bbc
Add Posts activity endpoint
lakatoshv Apr 11, 2026
b95d060
Add Get posts endpoint
lakatoshv Apr 11, 2026
d0a58d8
Add Get post by id endpoint
lakatoshv Apr 11, 2026
7dde66e
Add get sender messages endpoint
lakatoshv Apr 12, 2026
43e2f09
Add Get recipient messages endpoint
lakatoshv Apr 12, 2026
7257329
Add get by id message endpoint
lakatoshv Apr 12, 2026
77a48d2
Add Get all messages endpoint
lakatoshv Apr 12, 2026
d0975af
Add get all posts endpoint
lakatoshv Apr 13, 2026
e977375
Add Health check endpoint
lakatoshv Apr 13, 2026
5ad893e
Add get paged comments command and command handler in comments feature
lakatoshv Apr 13, 2026
76cb043
Add Get paged comments endpoint
lakatoshv Apr 13, 2026
02063bf
Add Get all users endpoint
lakatoshv Apr 14, 2026
52f3c95
Add Initialize account endpoint
lakatoshv Apr 14, 2026
8b06e39
Add send confirmation email endpoint
lakatoshv Apr 14, 2026
a03ae0f
Add users activity endpoint
lakatoshv Apr 14, 2026
847b139
Add comments activity endpoint
lakatoshv Apr 15, 2026
f2d322c
Add get all comments endpoint
lakatoshv Apr 15, 2026
a74f29d
Add get comment by id endpoint
lakatoshv Apr 15, 2026
7745555
Add Get comments by filter endpoint
lakatoshv Apr 15, 2026
bff315e
Add get comments by post endpoint
lakatoshv Apr 15, 2026
56aca40
Fix GetAllQueryHandler Mapper issue
lakatoshv Apr 16, 2026
dcfc78a
Configure HealthCheck features
lakatoshv Apr 17, 2026
54c2b1d
Configure Messages features
lakatoshv Apr 17, 2026
824f603
Configure Posts features
lakatoshv Apr 18, 2026
4ebb926
Configure carter versioning
lakatoshv May 31, 2026
9bead96
Configure swagger to not have conflicts with carter
lakatoshv May 31, 2026
928f67a
Configure Account features
lakatoshv May 31, 2026
df8f262
Configure Comments features
lakatoshv Apr 17, 2026
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
30 changes: 25 additions & 5 deletions BlogWebApp/BlogMinimalApi/ApiEndpoints/AccountsApiEndpoints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,13 @@ public void InstallApiRoutes(WebApplication app)

return Results.Ok(response);
})
.WithName("Initialize")

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test comment

.Produces<List<RoleResponse>>()
.Produces<string>(400);
.Produces(StatusCodes.Status400BadRequest)
.Produces(StatusCodes.Status404NotFound)
.WithSummary("Initialize")
.WithDescription("Initialize")
.HasApiVersion(1.0);


// Get All Users
Expand All @@ -65,7 +70,13 @@ public void InstallApiRoutes(WebApplication app)

return Results.Ok(response);
})
.Produces<List<AccountResponse>>();
.WithName("GetAllUsers")
.Produces<List<AccountResponse>>()
.Produces(StatusCodes.Status400BadRequest)
.Produces(StatusCodes.Status404NotFound)
.WithSummary("Get All Users")
.WithDescription("Get All Users")
.HasApiVersion(1.0);


// Login
Expand Down Expand Up @@ -151,7 +162,11 @@ public void InstallApiRoutes(WebApplication app)

return Results.NoContent();
})
.Produces(204);
.WithName("SendConfirmationEmail")
.Produces(StatusCodes.Status204NoContent)
.WithSummary("Send Confirmation Email")
.WithDescription("Send Confirmation Email")
.HasApiVersion(1.0);

// Users activity
privateGroup.MapGet(ApiRoutes.AccountsController.UsersActivity,
Expand All @@ -163,8 +178,13 @@ public void InstallApiRoutes(WebApplication app)
? Results.NotFound()
: Results.Ok(activity);
})
.Produces<ChartDataModel>()
.Produces(404);
.WithName("UsersActivity")
.Produces<List<ChartDataModel>>()
.Produces(StatusCodes.Status400BadRequest)
.Produces(StatusCodes.Status404NotFound)
.WithSummary("Users Activity")
.WithDescription("Users Activity")
.HasApiVersion(1.0);

// Change password
privateGroup.MapPut(ApiRoutes.AccountsController.ChangePassword,
Expand Down
39 changes: 32 additions & 7 deletions BlogWebApp/BlogMinimalApi/ApiEndpoints/CommentsApiEndpoints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,13 @@ public void InstallApiRoutes(WebApplication app)

return Results.Ok(response);
})
.Produces<List<CommentResponse>>();
.WithName("GetAll")
.Produces<List<CommentResponse>>()
.Produces(StatusCodes.Status400BadRequest)
.Produces(StatusCodes.Status404NotFound)
.WithSummary("Get All")
.WithDescription("Get All")
.HasApiVersion(1.0);


// Comments Activity
Expand All @@ -57,8 +63,13 @@ public void InstallApiRoutes(WebApplication app)
? Results.NotFound()
: Results.Ok(activity);
})
.Produces<ChartDataModel>()
.Produces(404);
.WithName("CommentsActivity")
.Produces<List<ChartDataModel>>()
.Produces(StatusCodes.Status400BadRequest)
.Produces(StatusCodes.Status404NotFound)
.WithSummary("Comments Activity")
.WithDescription("Comments Activity")
.HasApiVersion(1.0);


// Get Paged Comments
Expand All @@ -78,8 +89,13 @@ public void InstallApiRoutes(WebApplication app)
? Results.NotFound()
: Results.Ok(mapper.Map<PagedCommentsResponse>(result));
})
//.RequireAuthorization()
.WithName("GetCommentsByFilter")
.Produces<PagedCommentsResponse>()
.Produces(404);
.Produces(400)
.WithSummary("Get Comments By Filter")
.WithDescription("Get CommentsBy Filter")
.HasApiVersion(1.0);


// Get Comments By Post
Expand All @@ -101,8 +117,13 @@ public void InstallApiRoutes(WebApplication app)
? Results.NotFound()
: Results.Ok(mapper.Map<PagedCommentsResponse>(result));
})
//.RequireAuthorization()
.WithName("Get Comments By Post")
.Produces<PagedCommentsResponse>()
.Produces(404);
.Produces(400)
.WithSummary("Get Comments By Post")
.WithDescription("Get Comments By Post")
.HasApiVersion(1.0);


// Get Comment By ID
Expand All @@ -117,9 +138,13 @@ public void InstallApiRoutes(WebApplication app)
? Results.NotFound()
: Results.Ok(mapper.Map<CommentResponse>(comment));
})
.WithName(ApiRoutes.CommentsController.GetComment)
.WithName("GetCommentById")
.Produces<CommentResponse>()
.Produces(404);
.Produces(StatusCodes.Status400BadRequest)
.Produces(StatusCodes.Status404NotFound)
.WithSummary("Get Comment By Id")
.WithDescription("Get Comment By Id")
.HasApiVersion(1.0);

// -------------------------
// PRIVATE (Authorized)
Expand Down
28 changes: 24 additions & 4 deletions BlogWebApp/BlogMinimalApi/ApiEndpoints/MessagesApiEndpoints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,13 @@ public void InstallApiRoutes(WebApplication app)

return Results.Ok(response);
})
.WithName("GetAll")
.Produces<List<MessageResponse>>()
.Produces(404);
.Produces(StatusCodes.Status400BadRequest)
.Produces(StatusCodes.Status404NotFound)
.WithSummary("Get All")
.WithDescription("Get All")
.HasApiVersion(1.0);


// GET BY RECIPIENT
Expand All @@ -65,8 +70,13 @@ public void InstallApiRoutes(WebApplication app)

return Results.Ok(mapper.Map<List<MessageResponse>>(messages));
})
.WithName("GetRecipientMessages")
.Produces<List<MessageResponse>>()
.Produces(404);
.Produces(StatusCodes.Status400BadRequest)
.Produces(StatusCodes.Status404NotFound)
.WithSummary("Get Recipient Messages")
.WithDescription("Get Recipient Messages")
.HasApiVersion(1.0);


// GET BY SENDER
Expand All @@ -84,8 +94,13 @@ public void InstallApiRoutes(WebApplication app)

return Results.Ok(mapper.Map<List<MessageResponse>>(messages));
})
.WithName("GetSenderMessages")
.Produces<List<MessageResponse>>()
.Produces(404);
.Produces(StatusCodes.Status400BadRequest)
.Produces(StatusCodes.Status404NotFound)
.WithSummary("Get Sender Messages")
.WithDescription("Get Sender Messages")
.HasApiVersion(1.0);


// GET BY ID
Expand All @@ -100,8 +115,13 @@ public void InstallApiRoutes(WebApplication app)
? Results.NotFound()
: Results.Ok(mapper.Map<MessageResponse>(message));
})
.WithName("GetById")
.Produces<MessageResponse>()
.Produces(404);
.Produces(StatusCodes.Status400BadRequest)
.Produces(StatusCodes.Status404NotFound)
.WithSummary("Get By Id")
.WithDescription("Get By Id")
.HasApiVersion(1.0);


// -------------------------
Expand Down
35 changes: 29 additions & 6 deletions BlogWebApp/BlogMinimalApi/ApiEndpoints/PostsApiEndpoints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,13 @@ public void InstallApiRoutes(WebApplication app)
return Results.Ok(
mapper.Map<List<PostResponse>>(posts));
})
.WithName("GetAllPosts")
.Produces<List<PostResponse>>()
.Produces(404);
.Produces(StatusCodes.Status400BadRequest)
.Produces(StatusCodes.Status404NotFound)
.WithSummary("Get All Posts")
.WithDescription("Get All Posts")
.HasApiVersion(1.0);


// POSTS ACTIVITY
Expand All @@ -63,8 +68,13 @@ public void InstallApiRoutes(WebApplication app)
? Results.NotFound()
: Results.Ok(activity);
})
.Produces<ChartDataModel>()
.Produces(404);
.WithName("PostsActivity")
.Produces<List<ChartDataModel>>()
.Produces(StatusCodes.Status400BadRequest)
.Produces(StatusCodes.Status404NotFound)
.WithSummary("Posts Activity")
.WithDescription("Posts Activity")
.HasApiVersion(1.0);


// FILTERED POSTS
Expand All @@ -86,8 +96,12 @@ public void InstallApiRoutes(WebApplication app)
? Results.NotFound()
: Results.Ok(mapper.Map<PagedPostsResponse>(posts));
})
.WithName("GetPosts")
.Produces<PagedPostsResponse>()
.Produces(404);
.Produces(StatusCodes.Status400BadRequest)
.WithSummary("Get Posts")
.WithDescription("Get Posts")
.HasApiVersion(1.0);


// USER POSTS
Expand All @@ -111,8 +125,12 @@ public void InstallApiRoutes(WebApplication app)
? Results.NotFound()
: Results.Ok(mapper.Map<PagedPostsResponse>(posts));
})
.WithName("UserPosts")
.Produces<PagedPostsResponse>()
.Produces(404);
.Produces(StatusCodes.Status400BadRequest)
.WithSummary("User Posts")
.WithDescription("User Posts")
.HasApiVersion(1.0);


// GET POST BY ID
Expand All @@ -134,8 +152,13 @@ public void InstallApiRoutes(WebApplication app)
: Results.Ok(
mapper.Map<PostWithPagedCommentsResponse>(post));
})
.WithName("GetPostById")
.Produces<PostWithPagedCommentsResponse>()
.Produces(404);
.Produces(StatusCodes.Status400BadRequest)
.Produces(StatusCodes.Status404NotFound)
.WithSummary("Get Post By Id")
.WithDescription("Get Post By Id")
.HasApiVersion(1.0);


// -------------------------
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using Asp.Versioning.Builder;
using Carter;

namespace BlogVerticalSliceCQRSMinimalApi.CQRSExtensions;

public static class CarterExtensions
{
public static IEndpointRouteBuilder MapVersionedCarter(
this IEndpointRouteBuilder app,
ApiVersionSet versionSet)
{
var group = app.MapGroup("/api/v{version:apiVersion}")
.WithApiVersionSet(versionSet);

group.MapCarter(); // 👈 ключ

return app;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using Asp.Versioning;
using Blog.Contracts.V1;
using Blog.Contracts.V1.Responses.UsersResponses;
using Carter;
using MediatR;
using Microsoft.AspNetCore.Mvc;

namespace BlogVerticalSliceCQRSMinimalApi.Features.Accounts.GetAllUsers;

public class GetAllUsersEndpoint : ICarterModule
{
public void AddRoutes(IEndpointRouteBuilder app)
{
var group = app.MapGroup("Accounts")
.MapToApiVersion(1.0)
.WithTags("Accounts");

group.MapGet(ApiRoutes.AccountsController.GetAllUsers, async ([FromServices] ISender sender) =>
{
var result = await sender.Send(new GetAllUsersQuery());

return result == null
? Results.NotFound()
: Results.Ok(result);
})
.WithName("GetAllUsers")
.Produces<List<AccountResponse>>()
.Produces(StatusCodes.Status400BadRequest)
.Produces(StatusCodes.Status404NotFound)
.WithSummary("Get All Users")
.WithDescription("Get All Users");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using Asp.Versioning;
using Blog.Contracts.V1;
using Blog.Contracts.V1.Responses.UsersResponses;
using Carter;
using MediatR;
using Microsoft.AspNetCore.Mvc;

namespace BlogVerticalSliceCQRSMinimalApi.Features.Accounts.Initialize;
/*
public class GetAllEndpoint : ICarterModule
{
public void AddRoutes(IEndpointRouteBuilder app)
{
var group = app.MapGroup("Accounts")
.MapToApiVersion(1.0)
.WithTags("Accounts");

group.MapGet(ApiRoutes.AccountsController.Initialize, async ([FromRoute] string userId, [FromServices] ISender sender) =>
{
if (string.IsNullOrEmpty(userId))
return Results.BadRequest("Something went wrong");

var result = await sender.Send(new InitializeQuery(UserId: userId));

return result == null
? Results.NotFound()
: Results.Ok(result);
})
.WithName("Initialize")
.Produces<List<RoleResponse>>()
.Produces(StatusCodes.Status400BadRequest)
.Produces(StatusCodes.Status404NotFound)
.WithSummary("Initialize")
.WithDescription("Initialize");
}
}*/
Loading
Loading