diff --git a/BlogPlatform/BlogPlatform/BlogPlatform.csproj b/BlogPlatform/BlogPlatform/BlogPlatform.csproj
index 980decb..482161e 100644
--- a/BlogPlatform/BlogPlatform/BlogPlatform.csproj
+++ b/BlogPlatform/BlogPlatform/BlogPlatform.csproj
@@ -15,14 +15,9 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
+
-
-
-
-
-
-
diff --git a/BlogPlatform/BlogPlatform/DTO/User/Request/CreateUserDto.cs b/BlogPlatform/BlogPlatform/DTO/User/Request/CreateUserDto.cs
index 94529ab..d814675 100644
--- a/BlogPlatform/BlogPlatform/DTO/User/Request/CreateUserDto.cs
+++ b/BlogPlatform/BlogPlatform/DTO/User/Request/CreateUserDto.cs
@@ -5,5 +5,4 @@ public class CreateUserDto
public string? Username { get; set; }
public string? Email { get; set; }
public string? Password { get; set; }
- public string? Salt { get; set; }
}
\ No newline at end of file
diff --git a/BlogPlatform/BlogPlatform/Endpoints/Comment/CreateCommentEndpoint.cs b/BlogPlatform/BlogPlatform/Endpoints/Comment/CreateCommentEndpoint.cs
new file mode 100644
index 0000000..7ac93ff
--- /dev/null
+++ b/BlogPlatform/BlogPlatform/Endpoints/Comment/CreateCommentEndpoint.cs
@@ -0,0 +1,57 @@
+
+using BlogPlatform.DTO.Comment.Request;
+using BlogPlatform.DTO.Comment.Response;
+using BlogPlatform.Models;
+using FastEndpoints;
+
+namespace BlogPlatform.Endpoints.Comment;
+
+public class CreateCommentEndpoint(BlogPlatformDbContext db) : Endpoint
+{
+ public override void Configure()
+ {
+ Post("/api/comments");
+ }
+
+ public override async Task HandleAsync(CreateCommentDto req, CancellationToken ct)
+ {
+ // Checking if the user and post IDs exist in our database
+ Models.User? checkingUser = await db.Users.FindAsync(req.UserId);
+ Models.Post? checkingPost = await db.Posts.FindAsync(req.PostId);
+
+ if (checkingUser == null || checkingPost == null)
+ {
+ await Send.StringAsync("You must add a comment on a Post that exist and of a User that exists", 400);
+ return;
+ }
+
+ // User and Post exists adding the comment
+ Models.Comment newComment = new()
+ {
+ Content = req.Content,
+ PostId = req.PostId,
+ Post = checkingPost,
+ UserId = req.UserId,
+ User = checkingUser,
+
+ };
+
+ db.Comments.Add(newComment);
+ await db.SaveChangesAsync(ct);
+
+
+ // Returning the response with DTO
+ GetCommentDto dto = new()
+ {
+ Id = newComment.Id,
+ Content = newComment.Content,
+ PostId = newComment.PostId,
+ PostTitle = checkingPost.Title,
+ UserId = newComment.UserId,
+ UserUsername = checkingUser.Username
+
+ };
+
+ await Send.OkAsync(dto, ct);
+ }
+}
\ No newline at end of file
diff --git a/BlogPlatform/BlogPlatform/Endpoints/Comment/GetCommentEndpoint.cs b/BlogPlatform/BlogPlatform/Endpoints/Comment/GetCommentEndpoint.cs
new file mode 100644
index 0000000..e40e97d
--- /dev/null
+++ b/BlogPlatform/BlogPlatform/Endpoints/Comment/GetCommentEndpoint.cs
@@ -0,0 +1,48 @@
+using BlogPlatform.DTO.Comment.Response;
+using FastEndpoints;
+using Microsoft.EntityFrameworkCore;
+
+namespace BlogPlatform.Endpoints.Comment;
+
+
+public class GetCommentRequest
+{
+ public int Id { get; set; }
+}
+
+
+public class GetCommentEndpoint(BlogPlatformDbContext db) : Endpoint
+{
+ public override void Configure()
+ {
+ Get("/api/comments/{@id}", x => new{x.Id});
+ }
+
+ public override async Task HandleAsync(GetCommentRequest req, CancellationToken ct)
+ {
+ Models.Comment? comment = await db.Comments
+ .Include(comment => comment.User)
+ .Include(comment => comment.Post)
+ .FirstOrDefaultAsync(x => x.Id == req.Id);
+
+ if (comment == null)
+ {
+ await Send.NotFoundAsync(ct);
+ return;
+ }
+
+ // Returning the response with DTO
+ GetCommentDto dto = new()
+ {
+ Id = comment.Id,
+ Content = comment.Content,
+ PostId = comment.PostId,
+ PostTitle = comment.Post.Title,
+ UserId = comment.UserId,
+ UserUsername = comment.User.Username
+
+ };
+
+ await Send.OkAsync(dto, ct);
+ }
+}
diff --git a/BlogPlatform/BlogPlatform/Endpoints/Post/CreatePostEndpoint.cs b/BlogPlatform/BlogPlatform/Endpoints/Post/CreatePostEndpoint.cs
new file mode 100644
index 0000000..579deab
--- /dev/null
+++ b/BlogPlatform/BlogPlatform/Endpoints/Post/CreatePostEndpoint.cs
@@ -0,0 +1,52 @@
+using BlogPlatform.DTO.Comment.Request;
+using BlogPlatform.DTO.Comment.Response;
+using BlogPlatform.DTO.Post.Request;
+using BlogPlatform.DTO.Post.Response;
+using FastEndpoints;
+
+namespace BlogPlatform.Endpoints.Post;
+
+public class CreatePostEndpoint(BlogPlatformDbContext db) : Endpoint
+{
+ public override void Configure()
+ {
+ Post("/api/posts");
+ }
+
+ public override async Task HandleAsync(CreatePostDto req, CancellationToken ct)
+ {
+ Models.User checkingUser = await db.Users.FindAsync(req.UserId);
+
+ if (checkingUser == null)
+ {
+ await Send.StringAsync("You must create a post with an existing user", 400);
+ return;
+ }
+
+ Models.Post newPost = new()
+ {
+ Title = req.Title,
+ Content = req.Content,
+ Likes = req.Likes,
+ UserId = req.UserId,
+ User = checkingUser
+ };
+
+ db.Posts.Add(newPost);
+ await db.SaveChangesAsync(ct);
+
+ GetPostDto dto = new()
+ {
+ Id = newPost.Id,
+ Title = req.Title,
+ Content = req.Content,
+ Likes = req.Likes,
+ UserId = req.UserId,
+ UserUsername = checkingUser.Username,
+ UserEmail = checkingUser.Email,
+ };
+
+ await Send.OkAsync(dto, ct);
+
+ }
+}
\ No newline at end of file
diff --git a/BlogPlatform/BlogPlatform/Endpoints/Post/GetPostEndpoint.cs b/BlogPlatform/BlogPlatform/Endpoints/Post/GetPostEndpoint.cs
new file mode 100644
index 0000000..99d96cd
--- /dev/null
+++ b/BlogPlatform/BlogPlatform/Endpoints/Post/GetPostEndpoint.cs
@@ -0,0 +1,44 @@
+using BlogPlatform.DTO.Post.Response;
+using FastEndpoints;
+using Microsoft.EntityFrameworkCore;
+
+namespace BlogPlatform.Endpoints.Post;
+
+public class GetPostRequest
+{
+ public int Id { get; set; }
+}
+
+public class GetPostEndpoint(BlogPlatformDbContext db) : Endpoint
+{
+ public override void Configure()
+ {
+ Get("/api/posts/{@id}", x => new{x.Id});
+ }
+
+ public override async Task HandleAsync(GetPostRequest req, CancellationToken ct)
+ {
+ Models.Post post = await db.Posts
+ .Include(post => post.User)
+ .SingleOrDefaultAsync(x => x.Id == req.Id);
+
+ if (post == null)
+ {
+ await Send.NotFoundAsync(ct);
+ return;
+ }
+
+ GetPostDto dto = new()
+ {
+ Id = post.Id,
+ Title = req.Title,
+ Content = req.Content,
+ Likes = req.Likes,
+ UserId = req.UserId,
+ UserUsername = checkingUser.Username,
+ UserEmail = checkingUser.Email,
+ };
+
+ await Send.OkAsync(dto, ct);
+ }
+}
\ No newline at end of file
diff --git a/BlogPlatform/BlogPlatform/Endpoints/User/CreateUserEndpoint.cs b/BlogPlatform/BlogPlatform/Endpoints/User/CreateUserEndpoint.cs
new file mode 100644
index 0000000..576460d
--- /dev/null
+++ b/BlogPlatform/BlogPlatform/Endpoints/User/CreateUserEndpoint.cs
@@ -0,0 +1,38 @@
+using BlogPlatform.DTO.Comment.Request;
+using BlogPlatform.DTO.Comment.Response;
+using BlogPlatform.DTO.User.Request;
+using BlogPlatform.DTO.User.Response;
+using BlogPlatform.Models;
+using FastEndpoints;
+using PasswordGenerator;
+
+namespace BlogPlatform.Endpoints.User;
+
+public class CreateUserEndpoint(BlogPlatformDbContext db) : Endpoint
+{
+ public override void Configure()
+ {
+ Post("/api/users");
+ AllowAnonymous();
+ }
+
+ public override async Task HandleAsync(CreateUserDto req, CancellationToken ct)
+ {
+ string? salt = new Password()
+ .IncludeLowercase()
+ .IncludeUppercase()
+ .IncludeNumeric()
+ .IncludeSpecial()
+ .LengthRequired(24)
+ .Next();
+
+ Models.User user = new()
+ {
+ Username = req.Username,
+ Email = req.Email,
+ Password = Singulink.Cryptography.PasswordHasher(req.Password+ salt, salt),
+ Salt = salt,
+
+ }
+ }
+}
diff --git a/BlogPlatform/BlogPlatform/obj/BlogPlatform.csproj.nuget.dgspec.json b/BlogPlatform/BlogPlatform/obj/BlogPlatform.csproj.nuget.dgspec.json
index 49e78de..1eb901a 100644
--- a/BlogPlatform/BlogPlatform/obj/BlogPlatform.csproj.nuget.dgspec.json
+++ b/BlogPlatform/BlogPlatform/obj/BlogPlatform.csproj.nuget.dgspec.json
@@ -60,6 +60,10 @@
"target": "Package",
"version": "[8.0.20, )"
},
+ "PasswordGenerator": {
+ "target": "Package",
+ "version": "[2.1.0, )"
+ },
"Singulink.Cryptography.PasswordHasher": {
"target": "Package",
"version": "[3.0.2, )"
diff --git a/BlogPlatform/BlogPlatform/obj/Debug/net8.0/BlogPlatform.AssemblyInfo.cs b/BlogPlatform/BlogPlatform/obj/Debug/net8.0/BlogPlatform.AssemblyInfo.cs
index eccc5ef..9b80588 100644
--- a/BlogPlatform/BlogPlatform/obj/Debug/net8.0/BlogPlatform.AssemblyInfo.cs
+++ b/BlogPlatform/BlogPlatform/obj/Debug/net8.0/BlogPlatform.AssemblyInfo.cs
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("BlogPlatform")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
-[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+3fa5289fb179c6531ef666b66d5fb77eba91f166")]
+[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+2369cdbc398561b187eafbf4f208541a0bf6ebd8")]
[assembly: System.Reflection.AssemblyProductAttribute("BlogPlatform")]
[assembly: System.Reflection.AssemblyTitleAttribute("BlogPlatform")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
diff --git a/BlogPlatform/BlogPlatform/obj/Debug/net8.0/BlogPlatform.AssemblyInfoInputs.cache b/BlogPlatform/BlogPlatform/obj/Debug/net8.0/BlogPlatform.AssemblyInfoInputs.cache
index 297c83d..95d6bdd 100644
--- a/BlogPlatform/BlogPlatform/obj/Debug/net8.0/BlogPlatform.AssemblyInfoInputs.cache
+++ b/BlogPlatform/BlogPlatform/obj/Debug/net8.0/BlogPlatform.AssemblyInfoInputs.cache
@@ -1 +1 @@
-0f79a8820730bb50db3f741ae20cc71e5fd45452fc8efc9b4577dd707ee51130
+399cf2c58589a118a3fb968eb6106a6f5f0387106b36b127abb19a5be52197f6
diff --git a/BlogPlatform/BlogPlatform/obj/Debug/net8.0/BlogPlatform.assets.cache b/BlogPlatform/BlogPlatform/obj/Debug/net8.0/BlogPlatform.assets.cache
index 4ec452a..e08a5ed 100644
Binary files a/BlogPlatform/BlogPlatform/obj/Debug/net8.0/BlogPlatform.assets.cache and b/BlogPlatform/BlogPlatform/obj/Debug/net8.0/BlogPlatform.assets.cache differ
diff --git a/BlogPlatform/BlogPlatform/obj/Debug/net8.0/BlogPlatform.csproj.AssemblyReference.cache b/BlogPlatform/BlogPlatform/obj/Debug/net8.0/BlogPlatform.csproj.AssemblyReference.cache
index a314214..c5da7c2 100644
Binary files a/BlogPlatform/BlogPlatform/obj/Debug/net8.0/BlogPlatform.csproj.AssemblyReference.cache and b/BlogPlatform/BlogPlatform/obj/Debug/net8.0/BlogPlatform.csproj.AssemblyReference.cache differ
diff --git a/BlogPlatform/BlogPlatform/obj/project.assets.json b/BlogPlatform/BlogPlatform/obj/project.assets.json
index 01887ed..70400b0 100644
--- a/BlogPlatform/BlogPlatform/obj/project.assets.json
+++ b/BlogPlatform/BlogPlatform/obj/project.assets.json
@@ -982,6 +982,15 @@
"lib/netstandard2.0/Mono.TextTemplating.dll": {}
}
},
+ "PasswordGenerator/2.1.0": {
+ "type": "package",
+ "compile": {
+ "lib/netstandard2.0/PasswordGenerator.dll": {}
+ },
+ "runtime": {
+ "lib/netstandard2.0/PasswordGenerator.dll": {}
+ }
+ },
"Singulink.Cryptography.PasswordHasher/3.0.2": {
"type": "package",
"dependencies": {
@@ -3364,6 +3373,18 @@
"mono.texttemplating.nuspec"
]
},
+ "PasswordGenerator/2.1.0": {
+ "sha512": "G70cCeAOYCk/uTuFw5PBGpYY9kmBZyzld7tphachvyU514PowMRDYyKwTefxIHNGWrhXY2d1DV5B1tDEnTtY3A==",
+ "type": "package",
+ "path": "passwordgenerator/2.1.0",
+ "files": [
+ ".nupkg.metadata",
+ ".signature.p7s",
+ "lib/netstandard2.0/PasswordGenerator.dll",
+ "passwordgenerator.2.1.0.nupkg.sha512",
+ "passwordgenerator.nuspec"
+ ]
+ },
"Singulink.Cryptography.PasswordHasher/3.0.2": {
"sha512": "LJsc3CSD5M4UoIOwf3henpUzjJIv6A6UhEHMKxIqzhqtsOF92eOvEtyc3wyl28sr63xJfb6v7vnM4y69SUYk0g==",
"type": "package",
@@ -4587,6 +4608,7 @@
"Microsoft.EntityFrameworkCore >= 8.0.20",
"Microsoft.EntityFrameworkCore.Design >= 8.0.20",
"Microsoft.EntityFrameworkCore.SqlServer >= 8.0.20",
+ "PasswordGenerator >= 2.1.0",
"Singulink.Cryptography.PasswordHasher >= 3.0.2",
"Swashbuckle.AspNetCore >= 6.6.2"
]
@@ -4650,6 +4672,10 @@
"target": "Package",
"version": "[8.0.20, )"
},
+ "PasswordGenerator": {
+ "target": "Package",
+ "version": "[2.1.0, )"
+ },
"Singulink.Cryptography.PasswordHasher": {
"target": "Package",
"version": "[3.0.2, )"
diff --git a/BlogPlatform/BlogPlatform/obj/project.nuget.cache b/BlogPlatform/BlogPlatform/obj/project.nuget.cache
index 2e74f6a..394c3b0 100644
--- a/BlogPlatform/BlogPlatform/obj/project.nuget.cache
+++ b/BlogPlatform/BlogPlatform/obj/project.nuget.cache
@@ -1,6 +1,6 @@
{
"version": 2,
- "dgSpecHash": "J6GHh76bgMQ=",
+ "dgSpecHash": "O3btQBsvLxE=",
"success": true,
"projectFilePath": "/home/cristiano/Documents/BTS-SIO2/DS-Cristiano/BlogPlatform/BlogPlatform/BlogPlatform.csproj",
"expectedPackageFiles": [
@@ -52,6 +52,7 @@
"/home/cristiano/.nuget/packages/microsoft.sqlserver.server/1.0.0/microsoft.sqlserver.server.1.0.0.nupkg.sha512",
"/home/cristiano/.nuget/packages/microsoft.win32.systemevents/6.0.0/microsoft.win32.systemevents.6.0.0.nupkg.sha512",
"/home/cristiano/.nuget/packages/mono.texttemplating/2.2.1/mono.texttemplating.2.2.1.nupkg.sha512",
+ "/home/cristiano/.nuget/packages/passwordgenerator/2.1.0/passwordgenerator.2.1.0.nupkg.sha512",
"/home/cristiano/.nuget/packages/singulink.cryptography.passwordhasher/3.0.2/singulink.cryptography.passwordhasher.3.0.2.nupkg.sha512",
"/home/cristiano/.nuget/packages/swashbuckle.aspnetcore/6.6.2/swashbuckle.aspnetcore.6.6.2.nupkg.sha512",
"/home/cristiano/.nuget/packages/swashbuckle.aspnetcore.swagger/6.6.2/swashbuckle.aspnetcore.swagger.6.6.2.nupkg.sha512",
diff --git a/BlogPlatform/BlogPlatform/obj/project.packagespec.json b/BlogPlatform/BlogPlatform/obj/project.packagespec.json
index 153f84b..ae30444 100644
--- a/BlogPlatform/BlogPlatform/obj/project.packagespec.json
+++ b/BlogPlatform/BlogPlatform/obj/project.packagespec.json
@@ -1 +1 @@
-"restore":{"projectUniqueName":"/home/cristiano/Documents/BTS-SIO2/DS-Cristiano/BlogPlatform/BlogPlatform/BlogPlatform.csproj","projectName":"BlogPlatform","projectPath":"/home/cristiano/Documents/BTS-SIO2/DS-Cristiano/BlogPlatform/BlogPlatform/BlogPlatform.csproj","outputPath":"/home/cristiano/Documents/BTS-SIO2/DS-Cristiano/BlogPlatform/BlogPlatform/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["net8.0"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net8.0":{"targetAlias":"net8.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]}}"frameworks":{"net8.0":{"targetAlias":"net8.0","dependencies":{"FastEndpoints":{"target":"Package","version":"[7.0.1, )"},"Microsoft.AspNetCore.OpenApi":{"target":"Package","version":"[8.0.20, )"},"Microsoft.EntityFrameworkCore":{"target":"Package","version":"[8.0.20, )"},"Microsoft.EntityFrameworkCore.Design":{"include":"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive","suppressParent":"All","target":"Package","version":"[8.0.20, )"},"Microsoft.EntityFrameworkCore.SqlServer":{"target":"Package","version":"[8.0.20, )"},"Singulink.Cryptography.PasswordHasher":{"target":"Package","version":"[3.0.2, )"},"Swashbuckle.AspNetCore":{"target":"Package","version":"[6.6.2, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.AspNetCore.App":{"privateAssets":"none"},"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/usr/lib/dotnet/sdk/8.0.121/PortableRuntimeIdentifierGraph.json"}}
\ No newline at end of file
+"restore":{"projectUniqueName":"/home/cristiano/Documents/BTS-SIO2/DS-Cristiano/BlogPlatform/BlogPlatform/BlogPlatform.csproj","projectName":"BlogPlatform","projectPath":"/home/cristiano/Documents/BTS-SIO2/DS-Cristiano/BlogPlatform/BlogPlatform/BlogPlatform.csproj","outputPath":"/home/cristiano/Documents/BTS-SIO2/DS-Cristiano/BlogPlatform/BlogPlatform/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["net8.0"],"sources":{"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net8.0":{"targetAlias":"net8.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]}}"frameworks":{"net8.0":{"targetAlias":"net8.0","dependencies":{"FastEndpoints":{"target":"Package","version":"[7.0.1, )"},"Microsoft.AspNetCore.OpenApi":{"target":"Package","version":"[8.0.20, )"},"Microsoft.EntityFrameworkCore":{"target":"Package","version":"[8.0.20, )"},"Microsoft.EntityFrameworkCore.Design":{"include":"Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive","suppressParent":"All","target":"Package","version":"[8.0.20, )"},"Microsoft.EntityFrameworkCore.SqlServer":{"target":"Package","version":"[8.0.20, )"},"PasswordGenerator":{"target":"Package","version":"[2.1.0, )"},"Singulink.Cryptography.PasswordHasher":{"target":"Package","version":"[3.0.2, )"},"Swashbuckle.AspNetCore":{"target":"Package","version":"[6.6.2, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.AspNetCore.App":{"privateAssets":"none"},"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/usr/lib/dotnet/sdk/8.0.121/PortableRuntimeIdentifierGraph.json"}}
\ No newline at end of file
diff --git a/BlogPlatform/BlogPlatform/obj/rider.project.model.nuget.info b/BlogPlatform/BlogPlatform/obj/rider.project.model.nuget.info
index e0f3655..93953d1 100644
--- a/BlogPlatform/BlogPlatform/obj/rider.project.model.nuget.info
+++ b/BlogPlatform/BlogPlatform/obj/rider.project.model.nuget.info
@@ -1 +1 @@
-17606848202915370
\ No newline at end of file
+17606871115387461
\ No newline at end of file
diff --git a/BlogPlatform/BlogPlatform/obj/rider.project.restore.info b/BlogPlatform/BlogPlatform/obj/rider.project.restore.info
index f81f637..71514f9 100644
--- a/BlogPlatform/BlogPlatform/obj/rider.project.restore.info
+++ b/BlogPlatform/BlogPlatform/obj/rider.project.restore.info
@@ -1 +1 @@
-17606848204795382
\ No newline at end of file
+17606871117347472
\ No newline at end of file