diff --git a/.vs/MyFirstBlog/DesignTimeBuild/.dtbcache.v2 b/.vs/MyFirstBlog/DesignTimeBuild/.dtbcache.v2 index e3a42a61..b3c9ddfa 100644 Binary files a/.vs/MyFirstBlog/DesignTimeBuild/.dtbcache.v2 and b/.vs/MyFirstBlog/DesignTimeBuild/.dtbcache.v2 differ diff --git a/.vs/MyFirstBlog/FileContentIndex/072c2800-8171-4354-868b-c54ef13628e3.vsidx b/.vs/MyFirstBlog/FileContentIndex/072c2800-8171-4354-868b-c54ef13628e3.vsidx new file mode 100644 index 00000000..70aef67a Binary files /dev/null and b/.vs/MyFirstBlog/FileContentIndex/072c2800-8171-4354-868b-c54ef13628e3.vsidx differ diff --git a/.vs/MyFirstBlog/FileContentIndex/1451f00c-8a3c-4b67-9988-24ae06d88ff9.vsidx b/.vs/MyFirstBlog/FileContentIndex/1451f00c-8a3c-4b67-9988-24ae06d88ff9.vsidx deleted file mode 100644 index ae1b509b..00000000 Binary files a/.vs/MyFirstBlog/FileContentIndex/1451f00c-8a3c-4b67-9988-24ae06d88ff9.vsidx and /dev/null differ diff --git a/.vs/MyFirstBlog/FileContentIndex/3671b2ea-91c1-4fa3-8590-3e73598d97ea.vsidx b/.vs/MyFirstBlog/FileContentIndex/3671b2ea-91c1-4fa3-8590-3e73598d97ea.vsidx deleted file mode 100644 index 78b55c80..00000000 Binary files a/.vs/MyFirstBlog/FileContentIndex/3671b2ea-91c1-4fa3-8590-3e73598d97ea.vsidx and /dev/null differ diff --git a/.vs/MyFirstBlog/FileContentIndex/590413e3-7154-4b05-98da-430d25a2100e.vsidx b/.vs/MyFirstBlog/FileContentIndex/590413e3-7154-4b05-98da-430d25a2100e.vsidx new file mode 100644 index 00000000..70aef67a Binary files /dev/null and b/.vs/MyFirstBlog/FileContentIndex/590413e3-7154-4b05-98da-430d25a2100e.vsidx differ diff --git a/.vs/MyFirstBlog/FileContentIndex/f331fad5-1fdf-4db8-82e5-e85f996915f8.vsidx b/.vs/MyFirstBlog/FileContentIndex/f331fad5-1fdf-4db8-82e5-e85f996915f8.vsidx new file mode 100644 index 00000000..f6ccfc74 Binary files /dev/null and b/.vs/MyFirstBlog/FileContentIndex/f331fad5-1fdf-4db8-82e5-e85f996915f8.vsidx differ diff --git a/.vs/MyFirstBlog/FileContentIndex/f9fae8e8-35cc-49c6-9613-2cbd0942b6be.vsidx b/.vs/MyFirstBlog/FileContentIndex/f9fae8e8-35cc-49c6-9613-2cbd0942b6be.vsidx new file mode 100644 index 00000000..e4bcf2db Binary files /dev/null and b/.vs/MyFirstBlog/FileContentIndex/f9fae8e8-35cc-49c6-9613-2cbd0942b6be.vsidx differ diff --git a/.vs/MyFirstBlog/v17/.futdcache.v2 b/.vs/MyFirstBlog/v17/.futdcache.v2 index 128982d8..bbb59ddd 100644 Binary files a/.vs/MyFirstBlog/v17/.futdcache.v2 and b/.vs/MyFirstBlog/v17/.futdcache.v2 differ diff --git a/.vs/MyFirstBlog/v17/.suo b/.vs/MyFirstBlog/v17/.suo index 74e1a08b..a1bf049c 100644 Binary files a/.vs/MyFirstBlog/v17/.suo and b/.vs/MyFirstBlog/v17/.suo differ diff --git a/.vs/MyFirstBlog/v17/DocumentLayout.backup.json b/.vs/MyFirstBlog/v17/DocumentLayout.backup.json new file mode 100644 index 00000000..158a5125 --- /dev/null +++ b/.vs/MyFirstBlog/v17/DocumentLayout.backup.json @@ -0,0 +1,105 @@ +{ + "Version": 1, + "WorkspaceRootPath": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\school\\term 3\\full stack web development\\assignment 3\\myfirstblogbackend\\myfirstblog\\dtos\\postdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|solutionrelative:myfirstblog\\dtos\\postdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\school\\term 3\\full stack web development\\assignment 3\\myfirstblogbackend\\myfirstblog\\controllers\\postscontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|solutionrelative:myfirstblog\\controllers\\postscontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\school\\term 3\\full stack web development\\assignment 3\\myfirstblogbackend\\myfirstblog\\entities\\post.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|solutionrelative:myfirstblog\\entities\\post.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\school\\term 3\\full stack web development\\assignment 3\\myfirstblogbackend\\myfirstblog\\services\\postservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|solutionrelative:myfirstblog\\services\\postservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, + { + "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\school\\term 3\\full stack web development\\assignment 3\\myfirstblogbackend\\myfirstblog\\dtos\\createpostdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|solutionrelative:myfirstblog\\dtos\\createpostdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 3, + "Children": [ + { + "$type": "Document", + "DocumentIndex": 2, + "Title": "Post.cs", + "DocumentMoniker": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Entities\\Post.cs", + "RelativeDocumentMoniker": "MyFirstBlog\\Entities\\Post.cs", + "ToolTip": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Entities\\Post.cs", + "RelativeToolTip": "MyFirstBlog\\Entities\\Post.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-08-12T22:29:57.471Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 3, + "Title": "PostService.cs", + "DocumentMoniker": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Services\\PostService.cs", + "RelativeDocumentMoniker": "MyFirstBlog\\Services\\PostService.cs", + "ToolTip": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Services\\PostService.cs", + "RelativeToolTip": "MyFirstBlog\\Services\\PostService.cs", + "ViewState": "AgIAACMAAAAAAAAAAADwvz8AAAAjAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-08-12T21:55:25.575Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 1, + "Title": "PostsController.cs", + "DocumentMoniker": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Controllers\\PostsController.cs", + "RelativeDocumentMoniker": "MyFirstBlog\\Controllers\\PostsController.cs", + "ToolTip": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Controllers\\PostsController.cs", + "RelativeToolTip": "MyFirstBlog\\Controllers\\PostsController.cs", + "ViewState": "AgIAAAkAAAAAAAAAAAAYwDAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-08-12T21:26:29.055Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "PostDto.cs", + "DocumentMoniker": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Dtos\\PostDto.cs", + "RelativeDocumentMoniker": "MyFirstBlog\\Dtos\\PostDto.cs", + "ToolTip": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Dtos\\PostDto.cs", + "RelativeToolTip": "MyFirstBlog\\Dtos\\PostDto.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-08-12T21:18:17.528Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 4, + "Title": "CreatePostDto.cs", + "DocumentMoniker": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Dtos\\CreatePostDto.cs", + "RelativeDocumentMoniker": "MyFirstBlog\\Dtos\\CreatePostDto.cs", + "ToolTip": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Dtos\\CreatePostDto.cs", + "RelativeToolTip": "MyFirstBlog\\Dtos\\CreatePostDto.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAUAAAAFAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-08-12T21:00:31.076Z", + "EditorCaption": "" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/.vs/MyFirstBlog/v17/DocumentLayout.json b/.vs/MyFirstBlog/v17/DocumentLayout.json index 653eb6b4..4765161d 100644 --- a/.vs/MyFirstBlog/v17/DocumentLayout.json +++ b/.vs/MyFirstBlog/v17/DocumentLayout.json @@ -1,38 +1,26 @@ { "Version": 1, - "WorkspaceRootPath": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\", + "WorkspaceRootPath": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\", "Documents": [ { - "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\00code\\fullstack\\myfirstblogbackend\\myfirstblog\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}", - "RelativeMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|solutionrelative:myfirstblog\\properties\\launchsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}" + "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\school\\term 3\\full stack web development\\assignment 3\\myfirstblogbackend\\myfirstblog\\controllers\\postscontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|solutionrelative:myfirstblog\\controllers\\postscontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" }, { - "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\00code\\fullstack\\myfirstblogbackend\\myfirstblog\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|solutionrelative:myfirstblog\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\school\\term 3\\full stack web development\\assignment 3\\myfirstblogbackend\\myfirstblog\\dtos\\postdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|solutionrelative:myfirstblog\\dtos\\postdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" }, { - "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\00code\\fullstack\\myfirstblogbackend\\myfirstblog\\entities\\post.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\school\\term 3\\full stack web development\\assignment 3\\myfirstblogbackend\\myfirstblog\\entities\\post.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "RelativeMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|solutionrelative:myfirstblog\\entities\\post.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" }, { - "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\00code\\fullstack\\myfirstblogbackend\\myfirstblog\\services\\postservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\school\\term 3\\full stack web development\\assignment 3\\myfirstblogbackend\\myfirstblog\\services\\postservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "RelativeMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|solutionrelative:myfirstblog\\services\\postservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" }, { - "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\00code\\fullstack\\myfirstblogbackend\\myfirstblog\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}", - "RelativeMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|solutionrelative:myfirstblog\\appsettings.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}" - }, - { - "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\00code\\fullstack\\myfirstblogbackend\\myfirstblog\\extensions.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|solutionrelative:myfirstblog\\extensions.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\00code\\fullstack\\myfirstblogbackend\\myfirstblog\\dtos\\postdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|solutionrelative:myfirstblog\\dtos\\postdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" - }, - { - "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\00code\\fullstack\\myfirstblogbackend\\myfirstblog\\controllers\\postscontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|solutionrelative:myfirstblog\\controllers\\postscontroller.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + "AbsoluteMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|c:\\school\\term 3\\full stack web development\\assignment 3\\myfirstblogbackend\\myfirstblog\\dtos\\createpostdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{BB64A02C-C5D9-4D64-A357-7322C54B1419}|MyFirstBlog\\MyFirstBlog.csproj|solutionrelative:myfirstblog\\dtos\\createpostdto.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" } ], "DocumentGroupContainers": [ @@ -42,104 +30,72 @@ "DocumentGroups": [ { "DockedWidth": 200, - "SelectedChildIndex": 6, + "SelectedChildIndex": 2, "Children": [ - { - "$type": "Document", - "DocumentIndex": 1, - "Title": "Program.cs", - "DocumentMoniker": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\MyFirstBlog\\Program.cs", - "RelativeDocumentMoniker": "MyFirstBlog\\Program.cs", - "ToolTip": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\MyFirstBlog\\Program.cs", - "RelativeToolTip": "MyFirstBlog\\Program.cs", - "ViewState": "AQIAAAAAAAAAAAAAAAAAAA4AAAAjAAAA", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-05-15T14:44:39.864Z" - }, { "$type": "Document", "DocumentIndex": 2, "Title": "Post.cs", - "DocumentMoniker": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\MyFirstBlog\\Entities\\Post.cs", + "DocumentMoniker": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Entities\\Post.cs", "RelativeDocumentMoniker": "MyFirstBlog\\Entities\\Post.cs", - "ToolTip": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\MyFirstBlog\\Entities\\Post.cs", + "ToolTip": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Entities\\Post.cs", "RelativeToolTip": "MyFirstBlog\\Entities\\Post.cs", - "ViewState": "AQIAAAAAAAAAAAAAAAAAAAEAAAAAAAAA", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-05-15T14:43:03.248Z" - }, - { - "$type": "Document", - "DocumentIndex": 6, - "Title": "PostDto.cs", - "DocumentMoniker": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\MyFirstBlog\\Dtos\\PostDto.cs", - "RelativeDocumentMoniker": "MyFirstBlog\\Dtos\\PostDto.cs", - "ToolTip": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\MyFirstBlog\\Dtos\\PostDto.cs", - "RelativeToolTip": "MyFirstBlog\\Dtos\\PostDto.cs", - "ViewState": "AQIAAAAAAAAAAAAAAAAAAAgAAAABAAAA", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAA==", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-05-15T14:42:47.081Z" - }, - { - "$type": "Document", - "DocumentIndex": 4, - "Title": "appsettings.json", - "DocumentMoniker": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\MyFirstBlog\\appsettings.json", - "RelativeDocumentMoniker": "MyFirstBlog\\appsettings.json", - "ToolTip": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\MyFirstBlog\\appsettings.json", - "RelativeToolTip": "MyFirstBlog\\appsettings.json", - "ViewState": "AQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", - "WhenOpened": "2024-05-15T14:49:58.169Z" + "WhenOpened": "2025-08-12T22:29:57.471Z", + "EditorCaption": "" }, { "$type": "Document", "DocumentIndex": 3, "Title": "PostService.cs", - "DocumentMoniker": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\MyFirstBlog\\Services\\PostService.cs", + "DocumentMoniker": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Services\\PostService.cs", "RelativeDocumentMoniker": "MyFirstBlog\\Services\\PostService.cs", - "ToolTip": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\MyFirstBlog\\Services\\PostService.cs", + "ToolTip": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Services\\PostService.cs", "RelativeToolTip": "MyFirstBlog\\Services\\PostService.cs", - "ViewState": "AQIAAAAAAAAAAAAAAAAAAAkAAAAkAAAA", + "ViewState": "AgIAACMAAAAAAAAAAADwvz8AAAAjAAAAAAAAAA==", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-05-15T14:45:00.15Z" + "WhenOpened": "2025-08-12T21:55:25.575Z", + "EditorCaption": "" }, { "$type": "Document", - "DocumentIndex": 5, - "Title": "Extensions.cs", - "DocumentMoniker": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\MyFirstBlog\\Extensions.cs", - "RelativeDocumentMoniker": "MyFirstBlog\\Extensions.cs", - "ToolTip": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\MyFirstBlog\\Extensions.cs", - "RelativeToolTip": "MyFirstBlog\\Extensions.cs", - "ViewState": "AQIAAAAAAAAAAAAAAAAAAAwAAAAuAAAA", + "DocumentIndex": 0, + "Title": "PostsController.cs", + "DocumentMoniker": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Controllers\\PostsController.cs", + "RelativeDocumentMoniker": "MyFirstBlog\\Controllers\\PostsController.cs", + "ToolTip": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Controllers\\PostsController.cs", + "RelativeToolTip": "MyFirstBlog\\Controllers\\PostsController.cs", + "ViewState": "AgIAABsAAAAAAAAAAAAUwDwAAAAuAAAAAAAAAA==", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-05-15T14:44:53.417Z" + "WhenOpened": "2025-08-12T21:26:29.055Z", + "EditorCaption": "" }, { "$type": "Document", - "DocumentIndex": 0, - "Title": "launchSettings.json", - "DocumentMoniker": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\MyFirstBlog\\Properties\\launchSettings.json", - "RelativeDocumentMoniker": "MyFirstBlog\\Properties\\launchSettings.json", - "ToolTip": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\MyFirstBlog\\Properties\\launchSettings.json", - "RelativeToolTip": "MyFirstBlog\\Properties\\launchSettings.json", - "ViewState": "AQIAAA8AAAAAAAAAAAAAABkAAAAfAAAA", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", - "WhenOpened": "2024-05-15T14:50:05.724Z", + "DocumentIndex": 1, + "Title": "PostDto.cs", + "DocumentMoniker": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Dtos\\PostDto.cs", + "RelativeDocumentMoniker": "MyFirstBlog\\Dtos\\PostDto.cs", + "ToolTip": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Dtos\\PostDto.cs", + "RelativeToolTip": "MyFirstBlog\\Dtos\\PostDto.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2025-08-12T21:18:17.528Z", "EditorCaption": "" }, { "$type": "Document", - "DocumentIndex": 7, - "Title": "PostsController.cs", - "DocumentMoniker": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\MyFirstBlog\\Controllers\\PostsController.cs", - "RelativeDocumentMoniker": "MyFirstBlog\\Controllers\\PostsController.cs", - "ToolTip": "C:\\00code\\FullStack\\MyFirstBlogBackEnd\\MyFirstBlog\\Controllers\\PostsController.cs", - "RelativeToolTip": "MyFirstBlog\\Controllers\\PostsController.cs", - "ViewState": "AQIAAAYAAAAAAAAAAAAAAAsAAAAAAAAA", + "DocumentIndex": 4, + "Title": "CreatePostDto.cs", + "DocumentMoniker": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Dtos\\CreatePostDto.cs", + "RelativeDocumentMoniker": "MyFirstBlog\\Dtos\\CreatePostDto.cs", + "ToolTip": "C:\\School\\Term 3\\Full Stack Web Development\\assignment 3\\MyFirstBlogBackEnd\\MyFirstBlog\\Dtos\\CreatePostDto.cs", + "RelativeToolTip": "MyFirstBlog\\Dtos\\CreatePostDto.cs", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAUAAAAFAAAAAAAAAA==", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2024-05-15T14:42:54.111Z" + "WhenOpened": "2025-08-12T21:00:31.076Z", + "EditorCaption": "" } ] } diff --git a/.vs/ProjectEvaluation/myfirstblog.metadata.v7.bin b/.vs/ProjectEvaluation/myfirstblog.metadata.v7.bin deleted file mode 100644 index a3a97897..00000000 Binary files a/.vs/ProjectEvaluation/myfirstblog.metadata.v7.bin and /dev/null differ diff --git a/.vs/ProjectEvaluation/myfirstblog.metadata.v9.bin b/.vs/ProjectEvaluation/myfirstblog.metadata.v9.bin new file mode 100644 index 00000000..9800289c Binary files /dev/null and b/.vs/ProjectEvaluation/myfirstblog.metadata.v9.bin differ diff --git a/.vs/ProjectEvaluation/myfirstblog.projects.v7.bin b/.vs/ProjectEvaluation/myfirstblog.projects.v7.bin deleted file mode 100644 index cfc3e6a4..00000000 Binary files a/.vs/ProjectEvaluation/myfirstblog.projects.v7.bin and /dev/null differ diff --git a/.vs/ProjectEvaluation/myfirstblog.projects.v9.bin b/.vs/ProjectEvaluation/myfirstblog.projects.v9.bin new file mode 100644 index 00000000..02b11763 Binary files /dev/null and b/.vs/ProjectEvaluation/myfirstblog.projects.v9.bin differ diff --git a/.vs/ProjectEvaluation/myfirstblog.strings.v9.bin b/.vs/ProjectEvaluation/myfirstblog.strings.v9.bin new file mode 100644 index 00000000..449bd952 Binary files /dev/null and b/.vs/ProjectEvaluation/myfirstblog.strings.v9.bin differ diff --git a/MyFirstBlog/Controllers/PostsController.cs b/MyFirstBlog/Controllers/PostsController.cs index 8fa6bf2c..3c7be590 100644 --- a/MyFirstBlog/Controllers/PostsController.cs +++ b/MyFirstBlog/Controllers/PostsController.cs @@ -31,4 +31,39 @@ public ActionResult GetPost(string slug) { return post; } + + // Post /posts + [HttpPost] + public IActionResult Create([FromBody] CreatePostDto dto) + { + var errors = new List(); + + if (dto is null) + { + errors.Add("Request body is required"); + } + else + { + if (string.IsNullOrWhiteSpace(dto.Title)) + { + errors.Add("Title cannot be blank"); + } + + + if (string.IsNullOrWhiteSpace(dto.Description)) + { + errors.Add("Description cannot be blank"); + } + } + + if (errors.Count > 0) + { + return BadRequest(new { errors }); + } + + + var newPost = _postService.CreatePost(dto); + + return CreatedAtAction(nameof(GetPost), new { slug = newPost.Slug }, new { post = newPost }); + } } diff --git a/MyFirstBlog/Dtos/CreatePostDto.cs b/MyFirstBlog/Dtos/CreatePostDto.cs new file mode 100644 index 00000000..c0ddd4a8 --- /dev/null +++ b/MyFirstBlog/Dtos/CreatePostDto.cs @@ -0,0 +1,10 @@ +using System.ComponentModel.DataAnnotations; + +namespace MyFirstBlog.Dtos +{ + public class CreatePostDto + { + public string Title { get; init; } = default!; + public string Description { get; init; } = default!; + } +} diff --git a/MyFirstBlog/Dtos/PostDto.cs b/MyFirstBlog/Dtos/PostDto.cs index 12ca4818..7746e930 100644 --- a/MyFirstBlog/Dtos/PostDto.cs +++ b/MyFirstBlog/Dtos/PostDto.cs @@ -1,9 +1,12 @@ +using System.Text.Json.Serialization; + namespace MyFirstBlog.Dtos; public record PostDto { public Guid Id { get; init; } public string Title { get; init; } = default!; public string Slug { get; init; } = default!; + [JsonPropertyName("description")] public string Body { get; init; } = default!; public DateTime CreatedDate { get; init; } } diff --git a/MyFirstBlog/Services/PostService.cs b/MyFirstBlog/Services/PostService.cs index 6bac099f..ab354482 100644 --- a/MyFirstBlog/Services/PostService.cs +++ b/MyFirstBlog/Services/PostService.cs @@ -9,6 +9,7 @@ public interface IPostService { IEnumerable GetPosts(); PostDto GetPost(String slug); + PostDto CreatePost(CreatePostDto _dto); } public class PostService : IPostService @@ -32,6 +33,42 @@ public PostDto GetPost(string slug) private Post getPost(string slug) { - return _context.Posts.Where(a=>a.Slug==slug.ToString()).SingleOrDefault(); + return _context.Posts.Where(a => a.Slug == slug.ToString()).SingleOrDefault(); + } + + private static string MakeSlug(string title) + { + var slug = title?.Trim().ToLowerInvariant() ?? ""; + slug = Regex.Replace(slug, @"[^a-z0-9]+", "-"); // Replace non-alphanumerics with '-' + slug = Regex.Replace(slug, "-+", "-").Trim('-'); // remove multiple '-' and trim '-' off of ends + if (string.IsNullOrEmpty(slug)) slug = "post"; + + return slug; + } + + public PostDto CreatePost(CreatePostDto _dto) + { + var baseSlug = MakeSlug(_dto.Title); + var slug = baseSlug; + + // This for loop ensures that all slugs are unique and there are no duplicate slugs + for (int i = 2; _context.Posts.Any(p => p.Slug == slug); i++) + { + slug = $"{baseSlug}-{i}"; + } + + var post = new Post + { + Id = Guid.NewGuid(), + Title = _dto.Title, + Body = _dto.Description, + Slug = slug, + CreatedDate = DateTime.UtcNow + }; + + _context.Posts.Add(post); + _context.SaveChanges(); + + return post.AsDto(); } }