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