aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDanail Dimitrov <danaildimitrov321@gmail.com>2020-12-30 17:48:30 +0200
committerDanail Dimitrov <danaildimitrov321@gmail.com>2020-12-30 17:48:30 +0200
commitfb56c49681746c8c47c1da43c918b37df5f214a1 (patch)
tree780a7ae16198a0649988cd4a677e984477ffb150 /src
parente2958817c79f29722fedc1ea8ddcedea894a0f20 (diff)
downloadDevHive-fb56c49681746c8c47c1da43c918b37df5f214a1.tar
DevHive-fb56c49681746c8c47c1da43c918b37df5f214a1.tar.gz
DevHive-fb56c49681746c8c47c1da43c918b37df5f214a1.zip
Adding coomment layers
Diffstat (limited to 'src')
-rw-r--r--src/DevHive.Data/ConnectionString.json2
-rw-r--r--src/DevHive.Data/DevHiveContext.cs1
-rw-r--r--src/DevHive.Data/Migrations/20201230154737_CommentMigration.Designer.cs377
-rw-r--r--src/DevHive.Data/Migrations/20201230154737_CommentMigration.cs31
-rw-r--r--src/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs20
-rw-r--r--src/DevHive.Data/Models/Comment.cs11
-rw-r--r--src/DevHive.Data/Repositories/CommentRepository.cs62
-rw-r--r--src/DevHive.Services/Configurations/Mapping/CommentMappings.cs17
-rw-r--r--src/DevHive.Services/Models/Comment/CommentServiceModel.cs10
-rw-r--r--src/DevHive.Services/Models/Comment/GetByIdCommentServiceModel.cs9
-rw-r--r--src/DevHive.Services/Models/Comment/UpdateCommnetServiceModel.cs9
-rw-r--r--src/DevHive.Services/Services/CommentService.cs62
-rw-r--r--src/DevHive.Web/Configurations/Mapping/CommentMappings.cs18
-rw-r--r--src/DevHive.Web/Controllers/CommentController.cs72
-rw-r--r--src/DevHive.Web/Models/Comment/CommentWebModel.cs10
-rw-r--r--src/DevHive.Web/Models/Comment/GetByIdCommentWebModel.cs9
16 files changed, 719 insertions, 1 deletions
diff --git a/src/DevHive.Data/ConnectionString.json b/src/DevHive.Data/ConnectionString.json
index 00e95c2..c8300b2 100644
--- a/src/DevHive.Data/ConnectionString.json
+++ b/src/DevHive.Data/ConnectionString.json
@@ -1,5 +1,5 @@
{
"ConnectionStrings": {
- "DEV": "Server=localhost;Port=5432;Database=API;User Id=postgres;Password=;"
+ "DEV": "Server=localhost;Port=5432;Database=API;User Id=postgres;Password=password;"
}
} \ No newline at end of file
diff --git a/src/DevHive.Data/DevHiveContext.cs b/src/DevHive.Data/DevHiveContext.cs
index 39d39d3..c9959dc 100644
--- a/src/DevHive.Data/DevHiveContext.cs
+++ b/src/DevHive.Data/DevHiveContext.cs
@@ -12,6 +12,7 @@ namespace DevHive.Data
public DbSet<Technology> Technologies { get; set; }
public DbSet<Language> Languages { get; set; }
+ public DbSet<Comment> Comments { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
diff --git a/src/DevHive.Data/Migrations/20201230154737_CommentMigration.Designer.cs b/src/DevHive.Data/Migrations/20201230154737_CommentMigration.Designer.cs
new file mode 100644
index 0000000..0df3199
--- /dev/null
+++ b/src/DevHive.Data/Migrations/20201230154737_CommentMigration.Designer.cs
@@ -0,0 +1,377 @@
+// <auto-generated />
+using System;
+using DevHive.Data;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+namespace DevHive.Data.Migrations
+{
+ [DbContext(typeof(DevHiveContext))]
+ [Migration("20201230154737_CommentMigration")]
+ partial class CommentMigration
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .UseIdentityByDefaultColumns()
+ .HasAnnotation("Relational:MaxIdentifierLength", 63)
+ .HasAnnotation("ProductVersion", "5.0.1");
+
+ modelBuilder.Entity("DevHive.Data.Models.Comment", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property<DateTime>("Date")
+ .HasColumnType("timestamp without time zone");
+
+ b.Property<string>("Message")
+ .HasColumnType("text");
+
+ b.Property<Guid>("UserId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.ToTable("Comments");
+ });
+
+ modelBuilder.Entity("DevHive.Data.Models.Language", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property<string>("Name")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("Languages");
+ });
+
+ modelBuilder.Entity("DevHive.Data.Models.Role", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property<string>("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasColumnType("text");
+
+ b.Property<string>("Name")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property<string>("NormalizedName")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedName")
+ .IsUnique()
+ .HasDatabaseName("RoleNameIndex");
+
+ b.ToTable("AspNetRoles");
+ });
+
+ modelBuilder.Entity("DevHive.Data.Models.Technology", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property<string>("Name")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("Technologies");
+ });
+
+ modelBuilder.Entity("DevHive.Data.Models.User", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property<int>("AccessFailedCount")
+ .HasColumnType("integer");
+
+ b.Property<string>("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasColumnType("text");
+
+ b.Property<string>("Email")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property<bool>("EmailConfirmed")
+ .HasColumnType("boolean");
+
+ b.Property<string>("FirstName")
+ .HasColumnType("text");
+
+ b.Property<string>("LastName")
+ .HasColumnType("text");
+
+ b.Property<bool>("LockoutEnabled")
+ .HasColumnType("boolean");
+
+ b.Property<DateTimeOffset?>("LockoutEnd")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property<string>("NormalizedEmail")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property<string>("NormalizedUserName")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.Property<string>("PasswordHash")
+ .HasColumnType("text");
+
+ b.Property<string>("PhoneNumber")
+ .HasColumnType("text");
+
+ b.Property<bool>("PhoneNumberConfirmed")
+ .HasColumnType("boolean");
+
+ b.Property<string>("ProfilePicture")
+ .HasColumnType("text");
+
+ b.Property<string>("SecurityStamp")
+ .HasColumnType("text");
+
+ b.Property<bool>("TwoFactorEnabled")
+ .HasColumnType("boolean");
+
+ b.Property<Guid?>("UserId")
+ .HasColumnType("uuid");
+
+ b.Property<string>("UserName")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("NormalizedEmail")
+ .HasDatabaseName("EmailIndex");
+
+ b.HasIndex("NormalizedUserName")
+ .IsUnique()
+ .HasDatabaseName("UserNameIndex");
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("UserName")
+ .IsUnique();
+
+ b.ToTable("AspNetUsers");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<System.Guid>", b =>
+ {
+ b.Property<int>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .UseIdentityByDefaultColumn();
+
+ b.Property<string>("ClaimType")
+ .HasColumnType("text");
+
+ b.Property<string>("ClaimValue")
+ .HasColumnType("text");
+
+ b.Property<Guid>("RoleId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetRoleClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<System.Guid>", b =>
+ {
+ b.Property<int>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .UseIdentityByDefaultColumn();
+
+ b.Property<string>("ClaimType")
+ .HasColumnType("text");
+
+ b.Property<string>("ClaimValue")
+ .HasColumnType("text");
+
+ b.Property<Guid>("UserId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserClaims");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<System.Guid>", b =>
+ {
+ b.Property<string>("LoginProvider")
+ .HasColumnType("text");
+
+ b.Property<string>("ProviderKey")
+ .HasColumnType("text");
+
+ b.Property<string>("ProviderDisplayName")
+ .HasColumnType("text");
+
+ b.Property<Guid>("UserId")
+ .HasColumnType("uuid");
+
+ b.HasKey("LoginProvider", "ProviderKey");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AspNetUserLogins");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<System.Guid>", b =>
+ {
+ b.Property<Guid>("UserId")
+ .HasColumnType("uuid");
+
+ b.Property<Guid>("RoleId")
+ .HasColumnType("uuid");
+
+ b.HasKey("UserId", "RoleId");
+
+ b.HasIndex("RoleId");
+
+ b.ToTable("AspNetUserRoles");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<System.Guid>", b =>
+ {
+ b.Property<Guid>("UserId")
+ .HasColumnType("uuid");
+
+ b.Property<string>("LoginProvider")
+ .HasColumnType("text");
+
+ b.Property<string>("Name")
+ .HasColumnType("text");
+
+ b.Property<string>("Value")
+ .HasColumnType("text");
+
+ b.HasKey("UserId", "LoginProvider", "Name");
+
+ b.ToTable("AspNetUserTokens");
+ });
+
+ modelBuilder.Entity("RoleUser", b =>
+ {
+ b.Property<Guid>("RolesId")
+ .HasColumnType("uuid");
+
+ b.Property<Guid>("UsersId")
+ .HasColumnType("uuid");
+
+ b.HasKey("RolesId", "UsersId");
+
+ b.HasIndex("UsersId");
+
+ b.ToTable("RoleUser");
+ });
+
+ modelBuilder.Entity("DevHive.Data.Models.User", b =>
+ {
+ b.HasOne("DevHive.Data.Models.User", null)
+ .WithMany("Friends")
+ .HasForeignKey("UserId");
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<System.Guid>", b =>
+ {
+ b.HasOne("DevHive.Data.Models.Role", null)
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<System.Guid>", b =>
+ {
+ b.HasOne("DevHive.Data.Models.User", null)
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<System.Guid>", b =>
+ {
+ b.HasOne("DevHive.Data.Models.User", null)
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<System.Guid>", b =>
+ {
+ b.HasOne("DevHive.Data.Models.Role", null)
+ .WithMany()
+ .HasForeignKey("RoleId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("DevHive.Data.Models.User", null)
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<System.Guid>", b =>
+ {
+ b.HasOne("DevHive.Data.Models.User", null)
+ .WithMany()
+ .HasForeignKey("UserId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("RoleUser", b =>
+ {
+ b.HasOne("DevHive.Data.Models.Role", null)
+ .WithMany()
+ .HasForeignKey("RolesId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("DevHive.Data.Models.User", null)
+ .WithMany()
+ .HasForeignKey("UsersId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("DevHive.Data.Models.User", b =>
+ {
+ b.Navigation("Friends");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/DevHive.Data/Migrations/20201230154737_CommentMigration.cs b/src/DevHive.Data/Migrations/20201230154737_CommentMigration.cs
new file mode 100644
index 0000000..b952be5
--- /dev/null
+++ b/src/DevHive.Data/Migrations/20201230154737_CommentMigration.cs
@@ -0,0 +1,31 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace DevHive.Data.Migrations
+{
+ public partial class CommentMigration : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "Comments",
+ columns: table => new
+ {
+ Id = table.Column<Guid>(type: "uuid", nullable: false),
+ UserId = table.Column<Guid>(type: "uuid", nullable: false),
+ Message = table.Column<string>(type: "text", nullable: true),
+ Date = table.Column<DateTime>(type: "timestamp without time zone", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Comments", x => x.Id);
+ });
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "Comments");
+ }
+ }
+}
diff --git a/src/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs b/src/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs
index b5300a9..c7ff6c6 100644
--- a/src/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs
+++ b/src/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs
@@ -19,6 +19,26 @@ namespace DevHive.Data.Migrations
.HasAnnotation("Relational:MaxIdentifierLength", 63)
.HasAnnotation("ProductVersion", "5.0.1");
+ modelBuilder.Entity("DevHive.Data.Models.Comment", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property<DateTime>("Date")
+ .HasColumnType("timestamp without time zone");
+
+ b.Property<string>("Message")
+ .HasColumnType("text");
+
+ b.Property<Guid>("UserId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.ToTable("Comments");
+ });
+
modelBuilder.Entity("DevHive.Data.Models.Language", b =>
{
b.Property<Guid>("Id")
diff --git a/src/DevHive.Data/Models/Comment.cs b/src/DevHive.Data/Models/Comment.cs
new file mode 100644
index 0000000..f949a42
--- /dev/null
+++ b/src/DevHive.Data/Models/Comment.cs
@@ -0,0 +1,11 @@
+using System;
+namespace DevHive.Data.Models
+{
+ public class Comment : IModel
+ {
+ public Guid Id { get; set; }
+ public Guid UserId { get; set; }
+ public string Message { get; set; }
+ public DateTime Date { get; set; }
+ }
+} \ No newline at end of file
diff --git a/src/DevHive.Data/Repositories/CommentRepository.cs b/src/DevHive.Data/Repositories/CommentRepository.cs
new file mode 100644
index 0000000..5a4ef17
--- /dev/null
+++ b/src/DevHive.Data/Repositories/CommentRepository.cs
@@ -0,0 +1,62 @@
+using System;
+using System.Threading.Tasks;
+using Data.Models.Interfaces.Database;
+using DevHive.Common.Models.Data;
+using DevHive.Data.Models;
+using Microsoft.EntityFrameworkCore;
+
+namespace DevHive.Data.Repositories
+{
+ public class CommentRepository : IRepository<Comment>
+ {
+ private readonly DevHiveContext _context;
+
+ public CommentRepository(DevHiveContext context)
+ {
+ this._context = context;
+ }
+
+ public async Task<bool> AddAsync(Comment entity)
+ {
+ await this._context
+ .Set<Comment>()
+ .AddAsync(entity);
+
+ return await RepositoryMethods.SaveChangesAsync(this._context);
+ }
+
+ public async Task<Comment> GetByIdAsync(Guid id)
+ {
+ return await this._context
+ .Set<Comment>()
+ .FindAsync(id);
+ }
+
+
+ public async Task<bool> EditAsync(Comment newEntity)
+ {
+ this._context
+ .Set<Comment>()
+ .Update(newEntity);
+
+ return await RepositoryMethods.SaveChangesAsync(this._context);
+ }
+
+ public async Task<bool> DoesCommentExist(Guid id)
+ {
+ return await this._context
+ .Set<Comment>()
+ .AsNoTracking()
+ .AnyAsync(r => r.Id == id);
+ }
+
+ public async Task<bool> DeleteAsync(Comment entity)
+ {
+ this._context
+ .Set<Comment>()
+ .Remove(entity);
+
+ return await RepositoryMethods.SaveChangesAsync(this._context);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/DevHive.Services/Configurations/Mapping/CommentMappings.cs b/src/DevHive.Services/Configurations/Mapping/CommentMappings.cs
new file mode 100644
index 0000000..8120488
--- /dev/null
+++ b/src/DevHive.Services/Configurations/Mapping/CommentMappings.cs
@@ -0,0 +1,17 @@
+using DevHive.Data.Models;
+using AutoMapper;
+using DevHive.Services.Models.Comment;
+
+namespace DevHive.Services.Configurations.Mapping
+{
+ public class CommentMappings : Profile
+ {
+ public CommentMappings()
+ {
+ CreateMap<CommentServiceModel, Comment>();
+ CreateMap<Language, CommentServiceModel>();
+ CreateMap<UpdateCommentServiceModel, Language>();
+ CreateMap<GetByIdCommentServiceModel, Language>();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/DevHive.Services/Models/Comment/CommentServiceModel.cs b/src/DevHive.Services/Models/Comment/CommentServiceModel.cs
new file mode 100644
index 0000000..f3638ac
--- /dev/null
+++ b/src/DevHive.Services/Models/Comment/CommentServiceModel.cs
@@ -0,0 +1,10 @@
+using System;
+
+namespace DevHive.Services.Models.Comment
+{
+ public class CommentServiceModel
+ {
+ public Guid UserId { get; set; }
+ public string Message { get; set; }
+ }
+} \ No newline at end of file
diff --git a/src/DevHive.Services/Models/Comment/GetByIdCommentServiceModel.cs b/src/DevHive.Services/Models/Comment/GetByIdCommentServiceModel.cs
new file mode 100644
index 0000000..c2b84b3
--- /dev/null
+++ b/src/DevHive.Services/Models/Comment/GetByIdCommentServiceModel.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace DevHive.Services.Models.Comment
+{
+ public class GetByIdCommentServiceModel : CommentServiceModel
+ {
+ public DateTime Date { get; set; }
+ }
+} \ No newline at end of file
diff --git a/src/DevHive.Services/Models/Comment/UpdateCommnetServiceModel.cs b/src/DevHive.Services/Models/Comment/UpdateCommnetServiceModel.cs
new file mode 100644
index 0000000..3a461c5
--- /dev/null
+++ b/src/DevHive.Services/Models/Comment/UpdateCommnetServiceModel.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace DevHive.Services.Models.Comment
+{
+ public class UpdateCommentServiceModel : CommentServiceModel
+ {
+ public Guid Id { get; set; }
+ }
+}
diff --git a/src/DevHive.Services/Services/CommentService.cs b/src/DevHive.Services/Services/CommentService.cs
new file mode 100644
index 0000000..69dbcc0
--- /dev/null
+++ b/src/DevHive.Services/Services/CommentService.cs
@@ -0,0 +1,62 @@
+using System;
+using System.Threading.Tasks;
+using AutoMapper;
+using DevHive.Data.Models;
+using DevHive.Data.Repositories;
+using DevHive.Services.Models.Comment;
+
+namespace DevHive.Services.Services
+{
+ public class CommentService
+ {
+ private readonly CommentRepository _commentRepository;
+ private readonly IMapper _commentMapper;
+
+ public CommentService(CommentRepository commentRepository, IMapper mapper)
+ {
+ this._commentRepository = commentRepository;
+ this._commentMapper = mapper;
+ }
+
+ public async Task<bool> CreateComment(CommentServiceModel commentServiceModel)
+ {
+ Comment comment = this._commentMapper.Map<Comment>(commentServiceModel);
+ comment.Date = DateTime.Now;
+ bool result = await this._commentRepository.AddAsync(comment);
+
+ return result;
+ }
+
+ public async Task<GetByIdCommentServiceModel> GetCommentById(Guid id)
+ {
+ Comment comment = await this._commentRepository.GetByIdAsync(id);
+
+ if(comment == null)
+ throw new ArgumentException("The comment does not exist");
+
+ return this._commentMapper.Map<GetByIdCommentServiceModel>(comment);
+ }
+
+ public async Task<bool> UpdateComment(UpdateCommentServiceModel commentServiceModel)
+ {
+ if (!await this._commentRepository.DoesCommentExist(commentServiceModel.Id))
+ throw new ArgumentException("Comment does not exist!");
+
+ Comment comment = this._commentMapper.Map<Comment>(commentServiceModel);
+ bool result = await this._commentRepository.EditAsync(comment);
+
+ return result;
+ }
+
+ public async Task<bool> DeleteComment(Guid id)
+ {
+ if (!await this._commentRepository.DoesCommentExist(id))
+ throw new ArgumentException("Comment does not exist!");
+
+ Comment comment = await this._commentRepository.GetByIdAsync(id);
+ bool result = await this._commentRepository.DeleteAsync(comment);
+
+ return result;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/DevHive.Web/Configurations/Mapping/CommentMappings.cs b/src/DevHive.Web/Configurations/Mapping/CommentMappings.cs
new file mode 100644
index 0000000..dd11420
--- /dev/null
+++ b/src/DevHive.Web/Configurations/Mapping/CommentMappings.cs
@@ -0,0 +1,18 @@
+using AutoMapper;
+using DevHive.Web.Models.Comment;
+using DevHive.Services.Models.Comment;
+
+namespace DevHive.Web.Configurations.Mapping
+{
+ public class CommentMappings : Profile
+ {
+ public CommentMappings()
+ {
+ CreateMap<CommentWebModel, CommentServiceModel>();
+ CreateMap<CommentWebModel, UpdateCommentServiceModel>();
+ CreateMap<CommentServiceModel, CommentWebModel>();
+ CreateMap<CommentWebModel, CommentServiceModel>();
+ CreateMap<GetByIdCommentServiceModel, GetByIdCommentWebModel>();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/DevHive.Web/Controllers/CommentController.cs b/src/DevHive.Web/Controllers/CommentController.cs
new file mode 100644
index 0000000..5b6b0ee
--- /dev/null
+++ b/src/DevHive.Web/Controllers/CommentController.cs
@@ -0,0 +1,72 @@
+using System;
+using System.Threading.Tasks;
+using AutoMapper;
+using DevHive.Data.Repositories;
+using DevHive.Services.Models.Comment;
+using DevHive.Services.Services;
+using DevHive.Web.Models.Comment;
+using Microsoft.AspNetCore.Mvc;
+
+namespace DevHive.Web.Controllers
+{
+ [ApiController]
+ [Route("/api/[controller]")]
+ public class CommentController
+ {
+ private readonly CommentService _commentService;
+ private readonly IMapper _commentMapper;
+
+ public CommentController(CommentService commentService, IMapper mapper)
+ {
+ this._commentService = commentService;
+ this._commentMapper = mapper;
+ }
+
+ [HttpPost]
+ public async Task<IActionResult> Create([FromBody] CommentWebModel commentWebModel)
+ {
+ CommentServiceModel commentServiceModel = this._commentMapper.Map<CommentServiceModel>(commentWebModel);
+
+ bool result = await this._commentService.CreateComment(commentServiceModel);
+
+ if(!result)
+ return new BadRequestObjectResult("Could not create the Comment");
+
+ return new OkResult();
+ }
+
+ [HttpGet]
+ public async Task<IActionResult> GetById(Guid id)
+ {
+ GetByIdCommentServiceModel getByIdCommentServiceModel = await this._commentService.GetCommentById(id);
+ GetByIdCommentWebModel getByIdCommentWebModel = this._commentMapper.Map<GetByIdCommentWebModel>(getByIdCommentServiceModel);
+
+ return new OkObjectResult(getByIdCommentWebModel);
+ }
+
+ [HttpPut]
+ public async Task<IActionResult> Update(Guid id, [FromBody] CommentWebModel commentWebModel)
+ {
+ UpdateCommentServiceModel updateCommentServiceModel = this._commentMapper.Map<UpdateCommentServiceModel>(commentWebModel);
+ updateCommentServiceModel.Id = id;
+
+ bool result = await this._commentService.UpdateComment(updateCommentServiceModel);
+
+ if (!result)
+ return new BadRequestObjectResult("Could not update Comment");
+
+ return new OkResult();
+ }
+
+ [HttpDelete]
+ public async Task<IActionResult> Delete(Guid id)
+ {
+ bool result = await this._commentService.DeleteComment(id);
+
+ if (!result)
+ return new BadRequestObjectResult("Could not delete Comment");
+
+ return new OkResult();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/DevHive.Web/Models/Comment/CommentWebModel.cs b/src/DevHive.Web/Models/Comment/CommentWebModel.cs
new file mode 100644
index 0000000..37806a5
--- /dev/null
+++ b/src/DevHive.Web/Models/Comment/CommentWebModel.cs
@@ -0,0 +1,10 @@
+using System;
+
+namespace DevHive.Web.Models.Comment
+{
+ public class CommentWebModel
+ {
+ public Guid UserId { get; set; }
+ public string Message { get; set; }
+ }
+} \ No newline at end of file
diff --git a/src/DevHive.Web/Models/Comment/GetByIdCommentWebModel.cs b/src/DevHive.Web/Models/Comment/GetByIdCommentWebModel.cs
new file mode 100644
index 0000000..3d03348
--- /dev/null
+++ b/src/DevHive.Web/Models/Comment/GetByIdCommentWebModel.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace DevHive.Web.Models.Comment
+{
+ public class GetByIdCommentWebModel : CommentWebModel
+ {
+ public DateTime Date { get; set; }
+ }
+} \ No newline at end of file