From c98678b250cd9dbea87c0b15b596f7f079b6a49b Mon Sep 17 00:00:00 2001 From: KerelOlivier Date: Tue, 24 May 2022 20:44:03 +0200 Subject: [PATCH 1/2] add: blog post service --- Controllers/PostController.cs | 15 +++++++++ Models/BlogPost.cs | 3 +- Services/PostService.cs | 57 +++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 Controllers/PostController.cs create mode 100644 Services/PostService.cs diff --git a/Controllers/PostController.cs b/Controllers/PostController.cs new file mode 100644 index 0000000..2879e1c --- /dev/null +++ b/Controllers/PostController.cs @@ -0,0 +1,15 @@ +using backend.Services; +using Microsoft.AspNetCore.Mvc; + +namespace backend.Controllers; +[ApiController] +[Route("blog/api[controller]")] +public class PostController: ControllerBase +{ + private readonly PostService _postService; + + public PostController(PostService postService) + { + _postService = postService; + } +} \ No newline at end of file diff --git a/Models/BlogPost.cs b/Models/BlogPost.cs index 6191fa6..9741b99 100644 --- a/Models/BlogPost.cs +++ b/Models/BlogPost.cs @@ -15,7 +15,8 @@ public class BlogPost //Meta data [BsonRepresentation(BsonType.DateTime)] - public DateTime CreatedAt { get; set; } + public DateTime? CreatedAt { get; set; } + public DateTime? UpdatedAt { get; set; } [BsonRepresentation(BsonType.Array)] public List Tags { get; set; } } \ No newline at end of file diff --git a/Services/PostService.cs b/Services/PostService.cs new file mode 100644 index 0000000..f7d54ef --- /dev/null +++ b/Services/PostService.cs @@ -0,0 +1,57 @@ +using backend.Models; +using Microsoft.Extensions.Options; +using MongoDB.Driver; + +namespace backend.Services; + +public class PostService +{ + private readonly IMongoCollection _posts; + + public PostService(IOptions settings) + { + var client = new MongoClient(settings.Value.ConnectionString); + var database = client.GetDatabase(settings.Value.DatabaseName); + + _posts = database.GetCollection(settings.Value.PostsCollectionName); + } + + public async Task GetPostAsync(string id) + { + var post = await _posts.Find(p => p.Id == id).FirstOrDefaultAsync(); + return post; + } + + public async Task> GetLastNPostsAsync(int n) + { + var posts = await _posts.Find(p => true).SortByDescending(p => p.CreatedAt).Limit(n).ToListAsync(); + return posts; + } + + public async Task> GetAllPostsAsync() + { + var posts = await _posts.Find(p => true).ToListAsync(); + return posts; + } + + public async Task CreatePostAsync(BlogPost post) + { + post.CreatedAt = DateTime.UtcNow; + await _posts.InsertOneAsync(post); + } + + public async Task UpdatePostAsync(string id, BlogPost postIn) + { + var oldPost = await _posts.Find(p => p.Id == id).FirstOrDefaultAsync(); + //Set timestamps + postIn.CreatedAt = oldPost.CreatedAt; + postIn.UpdatedAt = DateTime.UtcNow; + await _posts.ReplaceOneAsync(p => p.Id == id, postIn); + } + + public async Task DeletePostAsync(string id) + { + await _posts.DeleteOneAsync(p => p.Id == id); + } + +} \ No newline at end of file -- 2.30.2 From 7586f2cc3f0b6a2488f888178242f666e411b1c1 Mon Sep 17 00:00:00 2001 From: KerelOlivier Date: Tue, 24 May 2022 21:16:49 +0200 Subject: [PATCH 2/2] add: blog post controller and simple CRUD --- Controllers/BlogPostController.cs | 60 +++++++++++++++++++ Controllers/PostController.cs | 15 ----- Controllers/UserController.cs | 2 +- Models/BlogPost.cs | 3 +- Program.cs | 1 + .../{PostService.cs => BlogPostService.cs} | 4 +- 6 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 Controllers/BlogPostController.cs delete mode 100644 Controllers/PostController.cs rename Services/{PostService.cs => BlogPostService.cs} (94%) diff --git a/Controllers/BlogPostController.cs b/Controllers/BlogPostController.cs new file mode 100644 index 0000000..dc2f0e2 --- /dev/null +++ b/Controllers/BlogPostController.cs @@ -0,0 +1,60 @@ +using backend.Models; +using backend.Services; +using Microsoft.AspNetCore.Mvc; + +namespace backend.Controllers; +[ApiController] +[Route("blog/api/[controller]")] +public class BlogPostController: ControllerBase +{ + private readonly BlogPostService _blogPostService; + + public BlogPostController(BlogPostService blogPostService) + { + _blogPostService = blogPostService; + } + + [HttpGet] + public async Task> Get() => + await _blogPostService.GetAllPostsAsync(); + + [HttpGet("{id:length(24)}")] + public async Task Get(string id) => + await _blogPostService.GetPostAsync(id); + + [HttpGet("newest/{n}")] + public async Task> GetLast(int n) => + await _blogPostService.GetLastNPostsAsync(n); + + [HttpPost] + public async Task Post([FromBody]BlogPost post) + { + await _blogPostService.CreatePostAsync(post); + return CreatedAtAction(nameof(Get), new {id = post.Id}, post); + } + + [HttpPut("{id:length(24)}")] + public async Task Put(string id, [FromBody]BlogPost post) + { + var postToUpdate = await _blogPostService.GetPostAsync(id); + if (postToUpdate == null) + { + return NotFound(); + } + await _blogPostService.UpdatePostAsync(id, post); + return NoContent(); + } + + [HttpDelete("{id:length(24)}")] + public async Task Delete(string id) + { + var postToDelete = await _blogPostService.GetPostAsync(id); + if (postToDelete == null) + { + return NotFound(); + } + await _blogPostService.DeletePostAsync(id); + return NoContent(); + } + +} \ No newline at end of file diff --git a/Controllers/PostController.cs b/Controllers/PostController.cs deleted file mode 100644 index 2879e1c..0000000 --- a/Controllers/PostController.cs +++ /dev/null @@ -1,15 +0,0 @@ -using backend.Services; -using Microsoft.AspNetCore.Mvc; - -namespace backend.Controllers; -[ApiController] -[Route("blog/api[controller]")] -public class PostController: ControllerBase -{ - private readonly PostService _postService; - - public PostController(PostService postService) - { - _postService = postService; - } -} \ No newline at end of file diff --git a/Controllers/UserController.cs b/Controllers/UserController.cs index c9e207b..0eb9146 100644 --- a/Controllers/UserController.cs +++ b/Controllers/UserController.cs @@ -16,7 +16,7 @@ public class UserController : ControllerBase } //API endpoints [HttpGet] - public Task> Get() => _userService.Get(); + public async Task> Get() => await _userService.Get(); [HttpGet("{id:length(24)}")] public async Task> Get(string id) diff --git a/Models/BlogPost.cs b/Models/BlogPost.cs index 9741b99..021bd2d 100644 --- a/Models/BlogPost.cs +++ b/Models/BlogPost.cs @@ -16,7 +16,8 @@ public class BlogPost //Meta data [BsonRepresentation(BsonType.DateTime)] public DateTime? CreatedAt { get; set; } + [BsonRepresentation(BsonType.DateTime)] public DateTime? UpdatedAt { get; set; } - [BsonRepresentation(BsonType.Array)] public List Tags { get; set; } + public List Tags { get; set; } } \ No newline at end of file diff --git a/Program.cs b/Program.cs index db12bd5..6f3f1a9 100644 --- a/Program.cs +++ b/Program.cs @@ -8,6 +8,7 @@ var builder = WebApplication.CreateBuilder(args); builder.Services.Configure(builder.Configuration.GetSection("BlogDatabase")); builder.Services.AddSingleton(); +builder.Services.AddSingleton(); builder.Services.AddControllers(); diff --git a/Services/PostService.cs b/Services/BlogPostService.cs similarity index 94% rename from Services/PostService.cs rename to Services/BlogPostService.cs index f7d54ef..3c31171 100644 --- a/Services/PostService.cs +++ b/Services/BlogPostService.cs @@ -4,11 +4,11 @@ using MongoDB.Driver; namespace backend.Services; -public class PostService +public class BlogPostService { private readonly IMongoCollection _posts; - public PostService(IOptions settings) + public BlogPostService(IOptions settings) { var client = new MongoClient(settings.Value.ConnectionString); var database = client.GetDatabase(settings.Value.DatabaseName); -- 2.30.2