Compare commits

...

3 Commits

  1. 60
      Controllers/BlogPostController.cs
  2. 2
      Controllers/UserController.cs
  3. 6
      Models/BlogPost.cs
  4. 1
      Program.cs
  5. 57
      Services/BlogPostService.cs

60
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<List<BlogPost>> Get() =>
await _blogPostService.GetAllPostsAsync();
[HttpGet("{id:length(24)}")]
public async Task<BlogPost?> Get(string id) =>
await _blogPostService.GetPostAsync(id);
[HttpGet("newest/{n}")]
public async Task<List<BlogPost>> GetLast(int n) =>
await _blogPostService.GetLastNPostsAsync(n);
[HttpPost]
public async Task<IActionResult> Post([FromBody]BlogPost post)
{
await _blogPostService.CreatePostAsync(post);
return CreatedAtAction(nameof(Get), new {id = post.Id}, post);
}
[HttpPut("{id:length(24)}")]
public async Task<IActionResult> 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<IActionResult> Delete(string id)
{
var postToDelete = await _blogPostService.GetPostAsync(id);
if (postToDelete == null)
{
return NotFound();
}
await _blogPostService.DeletePostAsync(id);
return NoContent();
}
}

2
Controllers/UserController.cs

@ -16,7 +16,7 @@ public class UserController : ControllerBase
} }
//API endpoints //API endpoints
[HttpGet] [HttpGet]
public Task<List<User>> Get() => _userService.Get(); public async Task<List<User>> Get() => await _userService.Get();
[HttpGet("{id:length(24)}")] [HttpGet("{id:length(24)}")]
public async Task<ActionResult<User>> Get(string id) public async Task<ActionResult<User>> Get(string id)

6
Models/BlogPost.cs

@ -15,7 +15,9 @@ public class BlogPost
//Meta data //Meta data
[BsonRepresentation(BsonType.DateTime)] [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<string> Tags { get; set; } public List<string> Tags { get; set; }
} }

1
Program.cs

@ -8,6 +8,7 @@ var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<BlogDatabaseSettings>(builder.Configuration.GetSection("BlogDatabase")); builder.Services.Configure<BlogDatabaseSettings>(builder.Configuration.GetSection("BlogDatabase"));
builder.Services.AddSingleton<UserService>(); builder.Services.AddSingleton<UserService>();
builder.Services.AddSingleton<BlogPostService>();
builder.Services.AddControllers(); builder.Services.AddControllers();

57
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<BlogPost> _posts;
public BlogPostService(IOptions<BlogDatabaseSettings> settings)
{
var client = new MongoClient(settings.Value.ConnectionString);
var database = client.GetDatabase(settings.Value.DatabaseName);
_posts = database.GetCollection<BlogPost>(settings.Value.PostsCollectionName);
}
public async Task<BlogPost?> GetPostAsync(string id)
{
var post = await _posts.Find(p => p.Id == id).FirstOrDefaultAsync();
return post;
}
public async Task<List<BlogPost>> GetLastNPostsAsync(int n)
{
var posts = await _posts.Find(p => true).SortByDescending(p => p.CreatedAt).Limit(n).ToListAsync();
return posts;
}
public async Task<List<BlogPost>> 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);
}
}
Loading…
Cancel
Save