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/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 6191fa6..021bd2d 100644 --- a/Models/BlogPost.cs +++ b/Models/BlogPost.cs @@ -15,7 +15,9 @@ public class BlogPost //Meta data [BsonRepresentation(BsonType.DateTime)] - public DateTime CreatedAt { get; set; } + 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 8eea6e6..5344603 100644 --- a/Program.cs +++ b/Program.cs @@ -12,7 +12,9 @@ builder.Services.Configure(builder.Configuration.GetSectio //Authentication builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(); + builder.Services.AddSingleton(); +builder.Services.AddSingleton(); builder.Services.AddControllers(); diff --git a/Services/BlogPostService.cs b/Services/BlogPostService.cs new file mode 100644 index 0000000..3c31171 --- /dev/null +++ b/Services/BlogPostService.cs @@ -0,0 +1,57 @@ +using backend.Models; +using Microsoft.Extensions.Options; +using MongoDB.Driver; + +namespace backend.Services; + +public class BlogPostService +{ + private readonly IMongoCollection _posts; + + public BlogPostService(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