From d3f082760560aab3a576ef2b0a312df517877dcd Mon Sep 17 00:00:00 2001 From: di-vad <147934298+di-vad@users.noreply.github.com> Date: Sat, 2 Aug 2025 15:14:47 -0600 Subject: [PATCH 1/3] input model for POST --- MyFirstBlog/Dtos/CreatePostRequest.cs | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 MyFirstBlog/Dtos/CreatePostRequest.cs diff --git a/MyFirstBlog/Dtos/CreatePostRequest.cs b/MyFirstBlog/Dtos/CreatePostRequest.cs new file mode 100644 index 00000000..c1934490 --- /dev/null +++ b/MyFirstBlog/Dtos/CreatePostRequest.cs @@ -0,0 +1,8 @@ +namespace MyFirstBlog.Dtos +{ + public record CreatePostRequest + { + public string Title { get; init; } = default!; + public string Description { get; init; } = default!; + } +} From 1660cc9dfea0db82ee41a031e8ea966320fdb277 Mon Sep 17 00:00:00 2001 From: di-vad <147934298+di-vad@users.noreply.github.com> Date: Sat, 2 Aug 2025 15:16:15 -0600 Subject: [PATCH 2/3] PostsController modified --- MyFirstBlog/Controllers/PostsController.cs | 34 +++++++++++--------- MyFirstBlog/Services/PostService.cs | 37 ++++++++++++++++++---- 2 files changed, 49 insertions(+), 22 deletions(-) diff --git a/MyFirstBlog/Controllers/PostsController.cs b/MyFirstBlog/Controllers/PostsController.cs index 8fa6bf2c..91acb54e 100644 --- a/MyFirstBlog/Controllers/PostsController.cs +++ b/MyFirstBlog/Controllers/PostsController.cs @@ -1,34 +1,38 @@ -namespace MyFirstBlog.Controllers; - using Microsoft.AspNetCore.Mvc; using MyFirstBlog.Dtos; using MyFirstBlog.Services; [ApiController] [Route("posts")] +public class PostsController : ControllerBase +{ + private readonly IPostService _postService; -public class PostsController : ControllerBase { - private IPostService _postService; - - public PostsController(IPostService postService) { + public PostsController(IPostService postService) + { _postService = postService; } - // Get /posts [HttpGet] - public IEnumerable GetPosts() { - return _postService.GetPosts(); - } + public IEnumerable GetPosts() => _postService.GetPosts(); - // Get /posts/:slug [HttpGet("{slug}")] - public ActionResult GetPost(string slug) { + public ActionResult GetPost(string slug) + { var post = _postService.GetPost(slug); + if (post == null) return NotFound(); + return post; + } - if (post is null) { - return NotFound(); + [HttpPost] + public ActionResult CreatePost([FromBody] CreatePostRequest request) + { + if (string.IsNullOrWhiteSpace(request.Title)) + { + return BadRequest(new { errors = new[] { "Title cannot be blank" } }); } - return post; + var createdPost = _postService.CreatePost(request.Title, request.Description); + return Created(string.Empty, new { post = createdPost }); } } diff --git a/MyFirstBlog/Services/PostService.cs b/MyFirstBlog/Services/PostService.cs index 6bac099f..5ef6f23c 100644 --- a/MyFirstBlog/Services/PostService.cs +++ b/MyFirstBlog/Services/PostService.cs @@ -8,30 +8,53 @@ namespace MyFirstBlog.Services; public interface IPostService { IEnumerable GetPosts(); - PostDto GetPost(String slug); + PostDto GetPost(string slug); + PostDto CreatePost(string title, string description); } public class PostService : IPostService { - private DataContext _context; + private readonly DataContext _context; public PostService(DataContext context) { _context = context; } - public IEnumerable GetPosts() - { - return _context.Posts.Select(post => post.AsDto()); - } + public IEnumerable GetPosts() => + _context.Posts.Select(post => post.AsDto()); public PostDto GetPost(string slug) { return getPost(slug).AsDto(); } + public PostDto CreatePost(string title, string description) + { + var slug = GenerateSlug(title); + var newPost = new Post + { + Id = Guid.NewGuid(), + Title = title, + Slug = slug, + Body = description, + CreatedDate = DateTime.UtcNow + }; + + _context.Posts.Add(newPost); + _context.SaveChanges(); + + return newPost.AsDto(); + } + + private string GenerateSlug(string title) + { + return Regex.Replace(title.ToLower(), @"\s+", "-"); + } + private Post getPost(string slug) { - return _context.Posts.Where(a=>a.Slug==slug.ToString()).SingleOrDefault(); + return _context.Posts.SingleOrDefault(p => p.Slug == slug); } } + From 50cbdeb16e8b7a4a88ca849adcf819a55468a1e8 Mon Sep 17 00:00:00 2001 From: di-vad <147934298+di-vad@users.noreply.github.com> Date: Sat, 2 Aug 2025 16:35:08 -0600 Subject: [PATCH 3/3] database connection rework --- MyFirstBlog/Program.cs | 7 +++++-- MyFirstBlog/appsettings.Development.json | 2 +- MyFirstBlog/appsettings.json | 7 ++++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/MyFirstBlog/Program.cs b/MyFirstBlog/Program.cs index 4042b610..75976ae9 100644 --- a/MyFirstBlog/Program.cs +++ b/MyFirstBlog/Program.cs @@ -1,16 +1,19 @@ +using Microsoft.EntityFrameworkCore; using MyFirstBlog.Helpers; using MyFirstBlog.Services; var MyAllowLocalhostOrigins = "_myAllowLocalhostOrigins"; var builder = WebApplication.CreateBuilder(args); - +Console.WriteLine("CNSTR => " + builder.Configuration.GetConnectionString("DefaultConnection")); var services = builder.Services; var env = builder.Environment; // Add services to the container. -services.AddDbContext(); +services.AddDbContext(options => + options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"))); + services.AddCors(policyBuilder => { policyBuilder.AddPolicy( MyAllowLocalhostOrigins, diff --git a/MyFirstBlog/appsettings.Development.json b/MyFirstBlog/appsettings.Development.json index 68bd7dc3..75dfafa3 100644 --- a/MyFirstBlog/appsettings.Development.json +++ b/MyFirstBlog/appsettings.Development.json @@ -1,6 +1,6 @@ { "ConnectionStrings": { - "DefaultConnection": "Host=localhost; Database=bvc-blog; Username=postgres; Password=postgres" + "DefaultConnection": "Host=localhost; Database=bvc-blog; Username=postgres; Password=1234" }, "Logging": { "LogLevel": { diff --git a/MyFirstBlog/appsettings.json b/MyFirstBlog/appsettings.json index 10f68b8c..ce545901 100644 --- a/MyFirstBlog/appsettings.json +++ b/MyFirstBlog/appsettings.json @@ -5,5 +5,10 @@ "Microsoft.AspNetCore": "Warning" } }, - "AllowedHosts": "*" + "AllowedHosts": "*", + "ConnectionStrings": { + "DefaultConnection": "Host=localhost;Port=5432;Database=bvc-blog;Username=postgres;Password=1234" + } + + }