aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortranstrike <transtrike@gmail.com>2021-01-12 13:16:39 +0200
committertranstrike <transtrike@gmail.com>2021-01-12 13:16:39 +0200
commit11bd1d9a9760c7bc6a601d78b3d89ec9028647a2 (patch)
tree4e74a8fc10a07f58e11d3612373b17a246ec2868 /src
parentb14dc0fe3e5ecfca3a7e780a17627f823d59246c (diff)
downloadDevHive-11bd1d9a9760c7bc6a601d78b3d89ec9028647a2.tar
DevHive-11bd1d9a9760c7bc6a601d78b3d89ec9028647a2.tar.gz
DevHive-11bd1d9a9760c7bc6a601d78b3d89ec9028647a2.zip
Language layers refactored; User implements adding & removing Languages; Migrations added
Diffstat (limited to 'src')
-rw-r--r--src/DevHive.Data/Migrations/20210112111416_User_Implements_Languages.Designer.cs405
-rw-r--r--src/DevHive.Data/Migrations/20210112111416_User_Implements_Languages.cs106
-rw-r--r--src/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs38
-rw-r--r--src/DevHive.Data/Models/Technology.cs1
-rw-r--r--src/DevHive.Data/Models/User.cs12
-rw-r--r--src/DevHive.Data/Repositories/Contracts/ILanguageRepository.cs13
-rw-r--r--src/DevHive.Data/Repositories/Contracts/IPostRepository.cs21
-rw-r--r--src/DevHive.Data/Repositories/Contracts/IRoleRepository.cs15
-rw-r--r--src/DevHive.Data/Repositories/Contracts/ITechnologyRepository.cs13
-rw-r--r--src/DevHive.Data/Repositories/Contracts/IUserRepository.cs26
-rw-r--r--src/DevHive.Data/Repositories/IRepository.cs (renamed from src/DevHive.Data/Repositories/Contracts/IRepository.cs)2
-rw-r--r--src/DevHive.Data/Repositories/LanguageRepository.cs55
-rw-r--r--src/DevHive.Data/Repositories/PostRepository.cs6
-rw-r--r--src/DevHive.Data/Repositories/RoleRepository.cs3
-rw-r--r--src/DevHive.Data/Repositories/TechnologyRepository.cs5
-rw-r--r--src/DevHive.Data/Repositories/UserRepository.cs162
-rw-r--r--src/DevHive.Services/Configurations/Mapping/LanguageMappings.cs1
-rw-r--r--src/DevHive.Services/Models/Identity/User/RegisterServiceModel.cs8
-rw-r--r--src/DevHive.Services/Models/Language/CreateLanguageServiceModel.cs9
-rw-r--r--src/DevHive.Services/Models/Language/LanguageServiceModel.cs4
-rw-r--r--src/DevHive.Services/Models/Language/UpdateLanguageServiceModel.cs7
-rw-r--r--src/DevHive.Services/Services/LanguageService.cs38
-rw-r--r--src/DevHive.Services/Services/PostService.cs8
-rw-r--r--src/DevHive.Services/Services/RoleService.cs6
-rw-r--r--src/DevHive.Services/Services/TechnologyService.cs6
-rw-r--r--src/DevHive.Services/Services/UserService.cs146
-rw-r--r--src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs4
-rw-r--r--src/DevHive.Web/Configurations/Mapping/LanguageMappings.cs7
-rw-r--r--src/DevHive.Web/Controllers/LanguageController.cs4
-rw-r--r--src/DevHive.Web/Models/Language/CreateLanguageWebModel.cs9
-rw-r--r--src/DevHive.Web/Models/Language/LanguageWebModel.cs4
-rw-r--r--src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs5
32 files changed, 892 insertions, 257 deletions
diff --git a/src/DevHive.Data/Migrations/20210112111416_User_Implements_Languages.Designer.cs b/src/DevHive.Data/Migrations/20210112111416_User_Implements_Languages.Designer.cs
new file mode 100644
index 0000000..0f1aa80
--- /dev/null
+++ b/src/DevHive.Data/Migrations/20210112111416_User_Implements_Languages.Designer.cs
@@ -0,0 +1,405 @@
+// <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("20210112111416_User_Implements_Languages")]
+ partial class User_Implements_Languages
+ {
+ 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<Guid>("IssuerId")
+ .HasColumnType("uuid");
+
+ b.Property<string>("Message")
+ .HasColumnType("text");
+
+ b.Property<DateTime>("TimeCreated")
+ .HasColumnType("timestamp without time zone");
+
+ 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.Property<Guid?>("UserId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ 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.Property<Guid?>("UserId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ 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>("ProfilePictureUrl")
+ .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.Language", b =>
+ {
+ b.HasOne("DevHive.Data.Models.User", null)
+ .WithMany("Langauges")
+ .HasForeignKey("UserId");
+ });
+
+ modelBuilder.Entity("DevHive.Data.Models.Technology", b =>
+ {
+ b.HasOne("DevHive.Data.Models.User", null)
+ .WithMany("Technologies")
+ .HasForeignKey("UserId");
+ });
+
+ 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");
+
+ b.Navigation("Langauges");
+
+ b.Navigation("Technologies");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/DevHive.Data/Migrations/20210112111416_User_Implements_Languages.cs b/src/DevHive.Data/Migrations/20210112111416_User_Implements_Languages.cs
new file mode 100644
index 0000000..a51ad09
--- /dev/null
+++ b/src/DevHive.Data/Migrations/20210112111416_User_Implements_Languages.cs
@@ -0,0 +1,106 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace DevHive.Data.Migrations
+{
+ public partial class User_Implements_Languages : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.RenameColumn(
+ name: "UserId",
+ table: "Comments",
+ newName: "IssuerId");
+
+ migrationBuilder.RenameColumn(
+ name: "Date",
+ table: "Comments",
+ newName: "TimeCreated");
+
+ migrationBuilder.RenameColumn(
+ name: "ProfilePicture",
+ table: "AspNetUsers",
+ newName: "ProfilePictureUrl");
+
+ migrationBuilder.AddColumn<Guid>(
+ name: "UserId",
+ table: "Technologies",
+ type: "uuid",
+ nullable: true);
+
+ migrationBuilder.AddColumn<Guid>(
+ name: "UserId",
+ table: "Languages",
+ type: "uuid",
+ nullable: true);
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Technologies_UserId",
+ table: "Technologies",
+ column: "UserId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Languages_UserId",
+ table: "Languages",
+ column: "UserId");
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_Languages_AspNetUsers_UserId",
+ table: "Languages",
+ column: "UserId",
+ principalTable: "AspNetUsers",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_Technologies_AspNetUsers_UserId",
+ table: "Technologies",
+ column: "UserId",
+ principalTable: "AspNetUsers",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Restrict);
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropForeignKey(
+ name: "FK_Languages_AspNetUsers_UserId",
+ table: "Languages");
+
+ migrationBuilder.DropForeignKey(
+ name: "FK_Technologies_AspNetUsers_UserId",
+ table: "Technologies");
+
+ migrationBuilder.DropIndex(
+ name: "IX_Technologies_UserId",
+ table: "Technologies");
+
+ migrationBuilder.DropIndex(
+ name: "IX_Languages_UserId",
+ table: "Languages");
+
+ migrationBuilder.DropColumn(
+ name: "UserId",
+ table: "Technologies");
+
+ migrationBuilder.DropColumn(
+ name: "UserId",
+ table: "Languages");
+
+ migrationBuilder.RenameColumn(
+ name: "TimeCreated",
+ table: "Comments",
+ newName: "Date");
+
+ migrationBuilder.RenameColumn(
+ name: "IssuerId",
+ table: "Comments",
+ newName: "UserId");
+
+ migrationBuilder.RenameColumn(
+ name: "ProfilePictureUrl",
+ table: "AspNetUsers",
+ newName: "ProfilePicture");
+ }
+ }
+}
diff --git a/src/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs b/src/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs
index c7ff6c6..cc6d24d 100644
--- a/src/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs
+++ b/src/DevHive.Data/Migrations/DevHiveContextModelSnapshot.cs
@@ -25,14 +25,14 @@ namespace DevHive.Data.Migrations
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
- b.Property<DateTime>("Date")
- .HasColumnType("timestamp without time zone");
+ b.Property<Guid>("IssuerId")
+ .HasColumnType("uuid");
b.Property<string>("Message")
.HasColumnType("text");
- b.Property<Guid>("UserId")
- .HasColumnType("uuid");
+ b.Property<DateTime>("TimeCreated")
+ .HasColumnType("timestamp without time zone");
b.HasKey("Id");
@@ -48,8 +48,13 @@ namespace DevHive.Data.Migrations
b.Property<string>("Name")
.HasColumnType("text");
+ b.Property<Guid?>("UserId")
+ .HasColumnType("uuid");
+
b.HasKey("Id");
+ b.HasIndex("UserId");
+
b.ToTable("Languages");
});
@@ -89,8 +94,13 @@ namespace DevHive.Data.Migrations
b.Property<string>("Name")
.HasColumnType("text");
+ b.Property<Guid?>("UserId")
+ .HasColumnType("uuid");
+
b.HasKey("Id");
+ b.HasIndex("UserId");
+
b.ToTable("Technologies");
});
@@ -143,7 +153,7 @@ namespace DevHive.Data.Migrations
b.Property<bool>("PhoneNumberConfirmed")
.HasColumnType("boolean");
- b.Property<string>("ProfilePicture")
+ b.Property<string>("ProfilePictureUrl")
.HasColumnType("text");
b.Property<string>("SecurityStamp")
@@ -292,6 +302,20 @@ namespace DevHive.Data.Migrations
b.ToTable("RoleUser");
});
+ modelBuilder.Entity("DevHive.Data.Models.Language", b =>
+ {
+ b.HasOne("DevHive.Data.Models.User", null)
+ .WithMany("Langauges")
+ .HasForeignKey("UserId");
+ });
+
+ modelBuilder.Entity("DevHive.Data.Models.Technology", b =>
+ {
+ b.HasOne("DevHive.Data.Models.User", null)
+ .WithMany("Technologies")
+ .HasForeignKey("UserId");
+ });
+
modelBuilder.Entity("DevHive.Data.Models.User", b =>
{
b.HasOne("DevHive.Data.Models.User", null)
@@ -368,6 +392,10 @@ namespace DevHive.Data.Migrations
modelBuilder.Entity("DevHive.Data.Models.User", b =>
{
b.Navigation("Friends");
+
+ b.Navigation("Langauges");
+
+ b.Navigation("Technologies");
});
#pragma warning restore 612, 618
}
diff --git a/src/DevHive.Data/Models/Technology.cs b/src/DevHive.Data/Models/Technology.cs
index 2e0aeed..a462d20 100644
--- a/src/DevHive.Data/Models/Technology.cs
+++ b/src/DevHive.Data/Models/Technology.cs
@@ -5,7 +5,6 @@ namespace DevHive.Data.Models
public class Technology : IModel
{
public Guid Id { get; set; }
-
public string Name { get; set; }
}
}
diff --git a/src/DevHive.Data/Models/User.cs b/src/DevHive.Data/Models/User.cs
index eef0af2..fda4651 100644
--- a/src/DevHive.Data/Models/User.cs
+++ b/src/DevHive.Data/Models/User.cs
@@ -12,7 +12,17 @@ namespace DevHive.Data.Models
public string LastName { get; set; }
- public string ProfilePicture { get; set; }
+ public string ProfilePictureUrl { get; set; }
+
+ /// <summary>
+ /// Languages that the user uses or is familiar with
+ /// </summary>
+ public IList<Language> Langauges { get; set; }
+
+ /// <summary>
+ /// Technologies that the user uses or is familiar with
+ /// </summary>
+ public IList<Technology> Technologies { get; set; }
public virtual IList<Role> Roles { get; set; } = new List<Role>();
diff --git a/src/DevHive.Data/Repositories/Contracts/ILanguageRepository.cs b/src/DevHive.Data/Repositories/Contracts/ILanguageRepository.cs
deleted file mode 100644
index e44d27b..0000000
--- a/src/DevHive.Data/Repositories/Contracts/ILanguageRepository.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using DevHive.Data.Models;
-using System;
-using System.Threading.Tasks;
-
-namespace DevHive.Data.Repositories.Contracts
-{
- public interface ILanguageRepository : IRepository<Language>
- {
- public Task<bool> DoesLanguageNameExist(string languageName);
-
- public Task<bool> DoesLanguageExist(Guid id);
- }
-}
diff --git a/src/DevHive.Data/Repositories/Contracts/IPostRepository.cs b/src/DevHive.Data/Repositories/Contracts/IPostRepository.cs
deleted file mode 100644
index 930138a..0000000
--- a/src/DevHive.Data/Repositories/Contracts/IPostRepository.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using DevHive.Data.Models;
-using System;
-using System.Threading.Tasks;
-
-namespace DevHive.Data.Repositories.Contracts
-{
- public interface IPostRepository : IRepository<Post>
- {
- public Task<bool> AddCommentAsync(Comment entity);
-
- public Task<Comment> GetCommentByIdAsync(Guid id);
-
- public Task<bool> EditCommentAsync(Comment newEntity);
-
- public Task<bool> DeleteCommentAsync(Comment entity);
-
- public Task<bool> DoesPostExist(Guid postId);
-
- public Task<bool> DoesCommentExist(Guid id);
- }
-}
diff --git a/src/DevHive.Data/Repositories/Contracts/IRoleRepository.cs b/src/DevHive.Data/Repositories/Contracts/IRoleRepository.cs
deleted file mode 100644
index 6cb8a4e..0000000
--- a/src/DevHive.Data/Repositories/Contracts/IRoleRepository.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using DevHive.Data.Models;
-using System;
-using System.Threading.Tasks;
-
-namespace DevHive.Data.Repositories.Contracts
-{
- public interface IRoleRepository : IRepository<Role>
- {
- public Task<Role> GetByNameAsync(string name);
-
- public Task<bool> DoesNameExist(string name);
-
- public Task<bool> DoesRoleExist(Guid id);
- }
-}
diff --git a/src/DevHive.Data/Repositories/Contracts/ITechnologyRepository.cs b/src/DevHive.Data/Repositories/Contracts/ITechnologyRepository.cs
deleted file mode 100644
index 3c4a6b6..0000000
--- a/src/DevHive.Data/Repositories/Contracts/ITechnologyRepository.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using DevHive.Data.Models;
-using System;
-using System.Threading.Tasks;
-
-namespace DevHive.Data.Repositories.Contracts
-{
- public interface ITechnologyRepository : IRepository<Technology>
- {
- public Task<bool> DoesTechnologyNameExist(string technologyName);
-
- public Task<bool> DoesTechnologyExist(Guid id);
- }
-}
diff --git a/src/DevHive.Data/Repositories/Contracts/IUserRepository.cs b/src/DevHive.Data/Repositories/Contracts/IUserRepository.cs
deleted file mode 100644
index 74c4486..0000000
--- a/src/DevHive.Data/Repositories/Contracts/IUserRepository.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-using DevHive.Data.Models;
-using System;
-using System.Collections.Generic;
-using System.Threading.Tasks;
-
-namespace DevHive.Data.Repositories.Contracts
-{
- public interface IUserRepository : IRepository<User>
- {
- public Task<bool> AddFriendAsync(User user, User friend);
-
- public IEnumerable<User> QueryAll();
-
- public Task<User> GetByUsername(string username);
-
- public Task<bool> RemoveFriendAsync(User user, User friend);
-
- public bool DoesUserExist(Guid id);
-
- public bool DoesUserHaveThisUsername(Guid id, string username);
-
- public Task<bool> DoesUsernameExist(string username);
-
- public Task<bool> DoesEmailExist(string email);
- }
-}
diff --git a/src/DevHive.Data/Repositories/Contracts/IRepository.cs b/src/DevHive.Data/Repositories/IRepository.cs
index 37c5170..920ba13 100644
--- a/src/DevHive.Data/Repositories/Contracts/IRepository.cs
+++ b/src/DevHive.Data/Repositories/IRepository.cs
@@ -1,7 +1,7 @@
using System;
using System.Threading.Tasks;
-namespace DevHive.Data.Repositories.Contracts
+namespace DevHive.Data.Repositories
{
public interface IRepository<TEntity>
where TEntity : class
diff --git a/src/DevHive.Data/Repositories/LanguageRepository.cs b/src/DevHive.Data/Repositories/LanguageRepository.cs
index 243192a..5d8217a 100644
--- a/src/DevHive.Data/Repositories/LanguageRepository.cs
+++ b/src/DevHive.Data/Repositories/LanguageRepository.cs
@@ -1,13 +1,13 @@
using System;
+using System.Linq;
using System.Threading.Tasks;
using DevHive.Common.Models.Misc;
using DevHive.Data.Models;
-using DevHive.Data.Repositories.Contracts;
using Microsoft.EntityFrameworkCore;
namespace DevHive.Data.Repositories
{
- public class LanguageRepository : ILanguageRepository
+ public class LanguageRepository : IRepository<Language>
{
private readonly DevHiveContext _context;
@@ -16,7 +16,8 @@ namespace DevHive.Data.Repositories
this._context = context;
}
- //Create
+ #region Create
+
public async Task<bool> AddAsync(Language entity)
{
await this._context
@@ -25,42 +26,32 @@ namespace DevHive.Data.Repositories
return await RepositoryMethods.SaveChangesAsync(this._context);
}
+ #endregion
+
+ #region Read
- //Read
public async Task<Language> GetByIdAsync(Guid id)
{
return await this._context
.Set<Language>()
.FindAsync(id);
}
+ #endregion
- public async Task<bool> DoesLanguageNameExist(string languageName)
- {
- return await this._context
- .Set<Language>()
- .AsNoTracking()
- .AnyAsync(r => r.Name == languageName);
- }
-
- public async Task<bool> DoesLanguageExist(Guid id)
- {
- return await this._context
- .Set<Language>()
- .AsNoTracking()
- .AnyAsync(r => r.Id == id);
- }
+ #region Update
- //Update
public async Task<bool> EditAsync(Language newEntity)
{
- this._context
- .Set<Language>()
- .Update(newEntity);
+ this._context
+ .Set<Language>()
+ .Update(newEntity);
return await RepositoryMethods.SaveChangesAsync(this._context);
}
+ #endregion
+
+ #region Delete
- //Delete
public async Task<bool> DeleteAsync(Language entity)
{
this._context
@@ -69,5 +60,21 @@ namespace DevHive.Data.Repositories
return await RepositoryMethods.SaveChangesAsync(this._context);
}
+ #endregion
+
+ #region Validations
+
+ public async Task<bool> DoesLanguageNameExistAsync(string languageName)
+ {
+ return await this._context.Languages
+ .AnyAsync(r => r.Name == languageName);
+ }
+
+ public async Task<bool> DoesLanguageExistAsync(Guid id)
+ {
+ return await this._context.Languages
+ .AnyAsync(r => r.Id == id);
+ }
+ #endregion
}
} \ No newline at end of file
diff --git a/src/DevHive.Data/Repositories/PostRepository.cs b/src/DevHive.Data/Repositories/PostRepository.cs
index 0acfc23..002fb17 100644
--- a/src/DevHive.Data/Repositories/PostRepository.cs
+++ b/src/DevHive.Data/Repositories/PostRepository.cs
@@ -2,12 +2,11 @@ using System;
using System.Threading.Tasks;
using DevHive.Common.Models.Misc;
using DevHive.Data.Models;
-using DevHive.Data.Repositories.Contracts;
using Microsoft.EntityFrameworkCore;
namespace DevHive.Data.Repositories
{
- public class PostRepository : IPostRepository
+ public class PostRepository : IRepository<Post>
{
private readonly DevHiveContext _context;
@@ -88,6 +87,8 @@ namespace DevHive.Data.Repositories
return await RepositoryMethods.SaveChangesAsync(this._context);
}
+ #region Validations
+
public async Task<bool> DoesPostExist(Guid postId)
{
return await this._context
@@ -103,5 +104,6 @@ namespace DevHive.Data.Repositories
.AsNoTracking()
.AnyAsync(r => r.Id == id);
}
+ #endregion
}
} \ No newline at end of file
diff --git a/src/DevHive.Data/Repositories/RoleRepository.cs b/src/DevHive.Data/Repositories/RoleRepository.cs
index d6f83a8..0ca1646 100644
--- a/src/DevHive.Data/Repositories/RoleRepository.cs
+++ b/src/DevHive.Data/Repositories/RoleRepository.cs
@@ -2,12 +2,11 @@ using System;
using System.Threading.Tasks;
using DevHive.Common.Models.Misc;
using DevHive.Data.Models;
-using DevHive.Data.Repositories.Contracts;
using Microsoft.EntityFrameworkCore;
namespace DevHive.Data.Repositories
{
- public class RoleRepository : IRoleRepository
+ public class RoleRepository : IRepository<Role>
{
private readonly DevHiveContext _context;
diff --git a/src/DevHive.Data/Repositories/TechnologyRepository.cs b/src/DevHive.Data/Repositories/TechnologyRepository.cs
index 27918ca..2ed3a23 100644
--- a/src/DevHive.Data/Repositories/TechnologyRepository.cs
+++ b/src/DevHive.Data/Repositories/TechnologyRepository.cs
@@ -2,13 +2,12 @@ using System;
using System.Threading.Tasks;
using DevHive.Common.Models.Misc;
using DevHive.Data.Models;
-using DevHive.Data.Repositories.Contracts;
using Microsoft.EntityFrameworkCore;
namespace DevHive.Data.Repositories
{
- public abstract class TechnologyRepository : ITechnologyRepository
+ public abstract class TechnologyRepository : IRepository<Technology>
{
private DevHiveContext _context;
@@ -27,7 +26,7 @@ namespace DevHive.Data.Repositories
return await RepositoryMethods.SaveChangesAsync(this._context);
}
- //Read
+ //Read
public async Task<Technology> GetByIdAsync(Guid id)
{
return await this._context
diff --git a/src/DevHive.Data/Repositories/UserRepository.cs b/src/DevHive.Data/Repositories/UserRepository.cs
index 5142b82..e3c1304 100644
--- a/src/DevHive.Data/Repositories/UserRepository.cs
+++ b/src/DevHive.Data/Repositories/UserRepository.cs
@@ -4,12 +4,11 @@ using System.Linq;
using System.Threading.Tasks;
using DevHive.Common.Models.Misc;
using DevHive.Data.Models;
-using DevHive.Data.Repositories.Contracts;
using Microsoft.EntityFrameworkCore;
namespace DevHive.Data.Repositories
{
- public class UserRepository : IUserRepository
+ public class UserRepository : IRepository<User>
{
private readonly DevHiveContext _context;
@@ -18,11 +17,11 @@ namespace DevHive.Data.Repositories
this._context = context;
}
- //Create
+ #region Create
+
public async Task<bool> AddAsync(User entity)
{
- await this._context
- .Set<User>()
+ await this._context.Users
.AddAsync(entity);
return await RepositoryMethods.SaveChangesAsync(this._context);
@@ -35,12 +34,31 @@ namespace DevHive.Data.Repositories
return await RepositoryMethods.SaveChangesAsync(this._context);
}
-
- //Read
+
+ public async Task<bool> AddLanguageToUserAsync(User user, Language language)
+ {
+ this._context.Update(user);
+
+ user.Langauges.Add(language);
+
+ return await RepositoryMethods.SaveChangesAsync(this._context);
+ }
+
+ public async Task<bool> AddTechnologyToUserAsync(User user, Technology technology)
+ {
+ this._context.Update(user);
+
+ user.Technologies.Add(technology);
+
+ return await RepositoryMethods.SaveChangesAsync(this._context);
+ }
+ #endregion
+
+ #region Read
+
public IEnumerable<User> QueryAll()
{
- return this._context
- .Set<User>()
+ return this._context.Users
.Include(x => x.Roles)
.AsNoTracking()
.AsEnumerable();
@@ -48,8 +66,7 @@ namespace DevHive.Data.Repositories
public async Task<User> GetByIdAsync(Guid id)
{
- return await this._context
- .Set<User>()
+ return await this._context.Users
.Include(x => x.Roles)
.Include(x => x.Friends)
.FirstOrDefaultAsync(x => x.Id == id);
@@ -57,13 +74,36 @@ namespace DevHive.Data.Repositories
public async Task<User> GetByUsername(string username)
{
- return await this._context
- .Set<User>()
+ return await this._context.Users
.Include(u => u.Roles)
.FirstOrDefaultAsync(x => x.UserName == username);
}
- //Update
+ public IList<Language> GetUserLanguages(User user)
+ {
+ return user.Langauges;
+ }
+
+ public Language GetUserLanguage(User user, Language language)
+ {
+ return user.Langauges
+ .FirstOrDefault(x => x.Id == language.Id);
+ }
+
+ public IList<Technology> GetUserTechnologies(User user)
+ {
+ return user.Technologies;
+ }
+
+ public Technology GetUserTechnology(User user, Technology technology)
+ {
+ return user.Technologies
+ .FirstOrDefault(x => x.Id == technology.Id);
+ }
+ #endregion
+
+ #region Update
+
public async Task<bool> EditAsync(User newEntity)
{
User user = await this.GetByIdAsync(newEntity.Id);
@@ -76,11 +116,32 @@ namespace DevHive.Data.Repositories
return await RepositoryMethods.SaveChangesAsync(this._context);
}
- //Delete
+ public async Task<bool> EditUserLanguage(User user, Language oldLang, Language newLang)
+ {
+ this._context.Update(user);
+
+ user.Langauges.Remove(oldLang);
+ user.Langauges.Add(newLang);
+
+ return await RepositoryMethods.SaveChangesAsync(this._context);
+ }
+
+ public async Task<bool> EditUserTechnologies(User user, Technology oldTech, Technology newTech)
+ {
+ this._context.Update(user);
+
+ user.Technologies.Remove(oldTech);
+ user.Technologies.Add(newTech);
+
+ return await RepositoryMethods.SaveChangesAsync(this._context);
+ }
+ #endregion
+
+ #region Delete
+
public async Task<bool> DeleteAsync(User entity)
{
- this._context
- .Set<User>()
+ this._context.Users
.Remove(entity);
return await RepositoryMethods.SaveChangesAsync(this._context);
@@ -93,37 +154,70 @@ namespace DevHive.Data.Repositories
return await RepositoryMethods.SaveChangesAsync(this._context);
}
-
- //Validations
- public bool DoesUserExist(Guid id)
+
+ public async Task<bool> RemoveLanguageFromUserAsync(User user, Language language)
{
- return this._context
- .Set<User>()
- .Any(x => x.Id == id);
+ this._context.Update(user);
+
+ user.Langauges.Remove(language);
+
+ return await RepositoryMethods.SaveChangesAsync(this._context);
}
- public bool DoesUserHaveThisUsername(Guid id, string username)
+ public async Task<bool> RemoveTechnologyFromUserAsync(User user, Technology technology)
{
- return this._context
- .Set<User>()
- .Any(x => x.Id == id &&
- x.UserName == username);
+ this._context.Update(user);
+
+ user.Technologies.Remove(technology);
+
+ return await RepositoryMethods.SaveChangesAsync(this._context);
+ }
+ #endregion
+
+ #region Validations
+
+ public async Task<bool> DoesUserExistAsync(Guid id)
+ {
+ return await this._context.Users
+ .AnyAsync(x => x.Id == id);
}
- public async Task<bool> DoesUsernameExist(string username)
+ public async Task<bool> DoesUsernameExistAsync(string username)
{
- return await this._context
- .Set<User>()
+ return await this._context.Users
.AsNoTracking()
.AnyAsync(u => u.UserName == username);
}
- public async Task<bool> DoesEmailExist(string email)
+ public async Task<bool> DoesEmailExistAsync(string email)
{
- return await this._context
- .Set<User>()
+ return await this._context.Users
.AsNoTracking()
.AnyAsync(u => u.Email == email);
}
+
+ public async Task<bool> DoesUserHaveThisFriendAsync(Guid userId, Guid friendId)
+ {
+ User user = await this._context.Users
+ .FirstOrDefaultAsync(x => x.Id == userId);
+
+ User friend = await this._context.Users
+ .FirstOrDefaultAsync(x => x.Id == friendId);
+
+ return user.Friends.Contains(friend);
+ }
+
+ public bool DoesUserHaveThisUsername(Guid id, string username)
+ {
+ return this._context.Users
+ .Any(x => x.Id == id &&
+ x.UserName == username);
+ }
+
+ public bool DoesUserHaveFriends(User user)
+ {
+ return user.Friends.Count >= 1;
+ }
+ #endregion
}
}
diff --git a/src/DevHive.Services/Configurations/Mapping/LanguageMappings.cs b/src/DevHive.Services/Configurations/Mapping/LanguageMappings.cs
index 27f392d..0be9ca2 100644
--- a/src/DevHive.Services/Configurations/Mapping/LanguageMappings.cs
+++ b/src/DevHive.Services/Configurations/Mapping/LanguageMappings.cs
@@ -10,7 +10,6 @@ namespace DevHive.Services.Configurations.Mapping
{
CreateMap<LanguageServiceModel, Language>();
CreateMap<Language, LanguageServiceModel>();
- CreateMap<UpdateLanguageServiceModel, Language>();
}
}
} \ No newline at end of file
diff --git a/src/DevHive.Services/Models/Identity/User/RegisterServiceModel.cs b/src/DevHive.Services/Models/Identity/User/RegisterServiceModel.cs
index 77f2733..74f66b4 100644
--- a/src/DevHive.Services/Models/Identity/User/RegisterServiceModel.cs
+++ b/src/DevHive.Services/Models/Identity/User/RegisterServiceModel.cs
@@ -1,7 +1,13 @@
+using System.Collections.Generic;
+using DevHive.Services.Models.Language;
+using DevHive.Services.Models.Technology;
+
namespace DevHive.Services.Models.Identity.User
{
public class RegisterServiceModel : BaseUserServiceModel
- {
+ {
+ public IList<LanguageServiceModel> Languages { get; set; }
+ public IList<TechnologyServiceModel> Technologies { get; set; }
public string Password { get; set; }
}
}
diff --git a/src/DevHive.Services/Models/Language/CreateLanguageServiceModel.cs b/src/DevHive.Services/Models/Language/CreateLanguageServiceModel.cs
new file mode 100644
index 0000000..75e7714
--- /dev/null
+++ b/src/DevHive.Services/Models/Language/CreateLanguageServiceModel.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace DevHive.Services.Models.Language
+{
+ public class CreateLanguageServiceModel : LanguageServiceModel
+ {
+ public string Name { get; set; }
+ }
+}
diff --git a/src/DevHive.Services/Models/Language/LanguageServiceModel.cs b/src/DevHive.Services/Models/Language/LanguageServiceModel.cs
index f06ebb6..a07aa16 100644
--- a/src/DevHive.Services/Models/Language/LanguageServiceModel.cs
+++ b/src/DevHive.Services/Models/Language/LanguageServiceModel.cs
@@ -1,7 +1,9 @@
+using System;
+
namespace DevHive.Services.Models.Language
{
public class LanguageServiceModel
{
- public string Name { get; set; }
+ public Guid Id { get; set; }
}
}
diff --git a/src/DevHive.Services/Models/Language/UpdateLanguageServiceModel.cs b/src/DevHive.Services/Models/Language/UpdateLanguageServiceModel.cs
index 30194dd..fdc309e 100644
--- a/src/DevHive.Services/Models/Language/UpdateLanguageServiceModel.cs
+++ b/src/DevHive.Services/Models/Language/UpdateLanguageServiceModel.cs
@@ -1,9 +1,4 @@
-using System;
-
namespace DevHive.Services.Models.Language
{
- public class UpdateLanguageServiceModel : LanguageServiceModel
- {
- public Guid Id { get; set; }
- }
+ public class UpdateLanguageServiceModel : CreateLanguageServiceModel { }
}
diff --git a/src/DevHive.Services/Services/LanguageService.cs b/src/DevHive.Services/Services/LanguageService.cs
index 3c011c6..127bde4 100644
--- a/src/DevHive.Services/Services/LanguageService.cs
+++ b/src/DevHive.Services/Services/LanguageService.cs
@@ -2,25 +2,25 @@ using System;
using System.Threading.Tasks;
using AutoMapper;
using DevHive.Data.Models;
-using DevHive.Data.Repositories.Contracts;
+using DevHive.Data.Repositories;
using DevHive.Services.Models.Language;
namespace DevHive.Services.Services
{
public class LanguageService
{
- private readonly ILanguageRepository _languageRepository;
+ private readonly LanguageRepository _languageRepository;
private readonly IMapper _languageMapper;
- public LanguageService(ILanguageRepository languageRepository, IMapper mapper)
+ public LanguageService(LanguageRepository languageRepository, IMapper mapper)
{
this._languageRepository = languageRepository;
this._languageMapper = mapper;
}
- public async Task<bool> CreateLanguage(LanguageServiceModel languageServiceModel)
+ public async Task<bool> CreateLanguage(CreateLanguageServiceModel languageServiceModel)
{
- if (await this._languageRepository.DoesLanguageNameExist(languageServiceModel.Name))
+ if (await this._languageRepository.DoesLanguageNameExistAsync(languageServiceModel.Name))
throw new ArgumentException("Language already exists!");
Language language = this._languageMapper.Map<Language>(languageServiceModel);
@@ -33,7 +33,7 @@ namespace DevHive.Services.Services
{
Language language = await this._languageRepository.GetByIdAsync(id);
- if(language == null)
+ if (language == null)
throw new ArgumentException("The language does not exist");
return this._languageMapper.Map<LanguageServiceModel>(language);
@@ -41,28 +41,28 @@ namespace DevHive.Services.Services
public async Task<bool> UpdateLanguage(UpdateLanguageServiceModel languageServiceModel)
{
- if (!await this._languageRepository.DoesLanguageExist(languageServiceModel.Id))
- throw new ArgumentException("Language does not exist!");
+ Task<bool> langExist = this._languageRepository.DoesLanguageExistAsync(languageServiceModel.Id);
+ Task<bool> newLangNameExists = this._languageRepository.DoesLanguageNameExistAsync(languageServiceModel.Name);
- if (await this._languageRepository.DoesLanguageNameExist(languageServiceModel.Name))
- throw new ArgumentException("Language name already exists!");
+ await Task.WhenAny(langExist, newLangNameExists);
- Language language = this._languageMapper.Map<Language>(languageServiceModel);
- //language.Id = languageServiceModel.Id;
- bool result = await this._languageRepository.EditAsync(language);
+ if (!langExist.Result)
+ throw new ArgumentException("Language already exists!");
- return result;
+ if (newLangNameExists.Result)
+ throw new ArgumentException("This name is already in our datbase!");
+
+ Language lang = this._languageMapper.Map<Language>(languageServiceModel);
+ return await this._languageRepository.EditAsync(lang);
}
-
+
public async Task<bool> DeleteLanguage(Guid id)
{
- if (!await this._languageRepository.DoesLanguageExist(id))
+ if (!await this._languageRepository.DoesLanguageExistAsync(id))
throw new ArgumentException("Language does not exist!");
Language language = await this._languageRepository.GetByIdAsync(id);
- bool result = await this._languageRepository.DeleteAsync(language);
-
- return result;
+ return await this._languageRepository.DeleteAsync(language);
}
}
} \ No newline at end of file
diff --git a/src/DevHive.Services/Services/PostService.cs b/src/DevHive.Services/Services/PostService.cs
index e0a2be9..321c694 100644
--- a/src/DevHive.Services/Services/PostService.cs
+++ b/src/DevHive.Services/Services/PostService.cs
@@ -7,17 +7,17 @@ using DevHive.Services.Models.Post.Comment;
using DevHive.Services.Models.Post.Post;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
-using DevHive.Data.Repositories.Contracts;
+using DevHive.Data.Repositories;
namespace DevHive.Services.Services
{
public class PostService
{
- private readonly IPostRepository _postRepository;
- private readonly IUserRepository _userRepository;
+ private readonly PostRepository _postRepository;
+ private readonly UserRepository _userRepository;
private readonly IMapper _postMapper;
- public PostService(IPostRepository postRepository, IUserRepository userRepository , IMapper postMapper)
+ public PostService(PostRepository postRepository, UserRepository userRepository , IMapper postMapper)
{
this._postRepository = postRepository;
this._userRepository = userRepository;
diff --git a/src/DevHive.Services/Services/RoleService.cs b/src/DevHive.Services/Services/RoleService.cs
index 372984d..7ba0a98 100644
--- a/src/DevHive.Services/Services/RoleService.cs
+++ b/src/DevHive.Services/Services/RoleService.cs
@@ -3,16 +3,16 @@ using System.Threading.Tasks;
using AutoMapper;
using DevHive.Common.Models.Identity;
using DevHive.Data.Models;
-using DevHive.Data.Repositories.Contracts;
+using DevHive.Data.Repositories;
namespace DevHive.Services.Services
{
public class RoleService
{
- private readonly IRoleRepository _roleRepository;
+ private readonly RoleRepository _roleRepository;
private readonly IMapper _roleMapper;
- public RoleService(IRoleRepository roleRepository, IMapper mapper)
+ public RoleService(RoleRepository roleRepository, IMapper mapper)
{
this._roleRepository = roleRepository;
this._roleMapper = mapper;
diff --git a/src/DevHive.Services/Services/TechnologyService.cs b/src/DevHive.Services/Services/TechnologyService.cs
index e03d4d1..2913a55 100644
--- a/src/DevHive.Services/Services/TechnologyService.cs
+++ b/src/DevHive.Services/Services/TechnologyService.cs
@@ -2,17 +2,17 @@ using System;
using System.Threading.Tasks;
using AutoMapper;
using DevHive.Data.Models;
-using DevHive.Data.Repositories.Contracts;
+using DevHive.Data.Repositories;
using DevHive.Services.Models.Technology;
namespace DevHive.Services.Services
{
public class TechnologyService
{
- private readonly ITechnologyRepository _technologyRepository;
+ private readonly TechnologyRepository _technologyRepository;
private readonly IMapper _technologyMapper;
- public TechnologyService(ITechnologyRepository technologyRepository, IMapper technologyMapper)
+ public TechnologyService(TechnologyRepository technologyRepository, IMapper technologyMapper)
{
this._technologyRepository = technologyRepository;
this._technologyMapper = technologyMapper;
diff --git a/src/DevHive.Services/Services/UserService.cs b/src/DevHive.Services/Services/UserService.cs
index c8bcab9..e1f925d 100644
--- a/src/DevHive.Services/Services/UserService.cs
+++ b/src/DevHive.Services/Services/UserService.cs
@@ -11,28 +11,40 @@ using System.Security.Cryptography;
using System.Text;
using System.Collections.Generic;
using DevHive.Common.Models.Identity;
-using DevHive.Data.Repositories.Contracts;
+using DevHive.Services.Models.Language;
+using DevHive.Data.Repositories;
namespace DevHive.Services.Services
{
public class UserService
{
- private readonly IUserRepository _userRepository;
- private readonly IRoleRepository _roleRepository;
+ private readonly UserRepository _userRepository;
+ private readonly RoleRepository _roleRepository;
+ private readonly LanguageRepository _languageRepository;
+ private readonly TechnologyRepository _technologyRepository;
private readonly IMapper _userMapper;
private readonly JWTOptions _jwtOptions;
- public UserService(IUserRepository userRepository, IRoleRepository roleRepository, IMapper mapper, JWTOptions jwtOptions)
+ public UserService(UserRepository userRepository,
+ LanguageRepository languageRepository,
+ RoleRepository roleRepository,
+ TechnologyRepository technologyRepository,
+ IMapper mapper,
+ JWTOptions jwtOptions)
{
this._userRepository = userRepository;
this._roleRepository = roleRepository;
this._userMapper = mapper;
this._jwtOptions = jwtOptions;
+ this._languageRepository = languageRepository;
+ this._technologyRepository = technologyRepository;
}
+ #region Authentication
+
public async Task<TokenModel> LoginUser(LoginServiceModel loginModel)
{
- if (!await this._userRepository.DoesUsernameExist(loginModel.UserName))
+ if (!await this._userRepository.DoesUsernameExistAsync(loginModel.UserName))
throw new ArgumentException("Invalid username!");
User user = await this._userRepository.GetByUsername(loginModel.UserName);
@@ -45,10 +57,10 @@ namespace DevHive.Services.Services
public async Task<TokenModel> RegisterUser(RegisterServiceModel registerModel)
{
- if (await this._userRepository.DoesUsernameExist(registerModel.UserName))
+ if (await this._userRepository.DoesUsernameExistAsync(registerModel.UserName))
throw new ArgumentException("Username already exists!");
- if (await this._userRepository.DoesEmailExist(registerModel.Email))
+ if (await this._userRepository.DoesEmailExistAsync(registerModel.Email))
throw new ArgumentException("Email already exists!");
User user = this._userMapper.Map<User>(registerModel);
@@ -66,20 +78,58 @@ namespace DevHive.Services.Services
return new TokenModel(WriteJWTSecurityToken(user.UserName, user.Roles));
}
+ #endregion
+
+ #region Create
public async Task<bool> AddFriend(Guid userId, Guid friendId)
{
- User user = await this._userRepository.GetByIdAsync(userId);
- User friend = await this._userRepository.GetByIdAsync(friendId);
+ Task<bool> userExists = this._userRepository.DoesUserExistAsync(userId);
+ Task<bool> friendExists = this._userRepository.DoesUserExistAsync(friendId);
+
+ await Task.WhenAll(userExists, friendExists);
+
+ if (!userExists.Result)
+ throw new ArgumentException("User doesn't exist!");
- if (DoesUserHaveThisFriend(user, friend))
+ if (!friendExists.Result)
+ throw new ArgumentException("Friend doesn't exist!");
+
+ if (await this._userRepository.DoesUserHaveThisFriendAsync(userId, friendId))
throw new ArgumentException("Friend already exists in your friends list.");
- return user != default(User) && friend != default(User) ?
- await this._userRepository.AddFriendAsync(user, friend) :
+ User user = await this._userRepository.GetByIdAsync(userId);
+ User friend = await this._userRepository.GetByIdAsync(friendId);
+
+ return user != default(User) && friend != default(User) ?
+ await this._userRepository.AddFriendAsync(user, friend) :
throw new ArgumentException("Invalid user!");
}
+ public async Task<bool> AddLanguageToUser(Guid userId, LanguageServiceModel languageServiceModel)
+ {
+ Task<bool> userExists = this._userRepository.DoesUserExistAsync(userId);
+ Task<bool> languageExists = this._languageRepository.DoesLanguageExistAsync(languageServiceModel.Id);
+
+ await Task.WhenAll(userExists, languageExists);
+
+ if (!userExists.Result)
+ throw new ArgumentException("User does not exist!");
+
+ if (!languageExists.Result)
+ throw new ArgumentException("Language does not exist!");
+
+ Task<User> user = this._userRepository.GetByIdAsync(userId);
+ Task<Language> language = this._languageRepository.GetByIdAsync(languageServiceModel.Id);
+
+ await Task.WhenAll(user, language);
+
+ return await this._userRepository.AddLanguageToUserAsync(user.Result, language.Result);
+ }
+ #endregion
+
+ #region Read
+
public async Task<UserServiceModel> GetUserById(Guid id)
{
User user = await this._userRepository.GetByIdAsync(id)
@@ -90,21 +140,24 @@ namespace DevHive.Services.Services
public async Task<UserServiceModel> GetFriendById(Guid friendId)
{
- if(!_userRepository.DoesUserExist(friendId))
+ if (!await _userRepository.DoesUserExistAsync(friendId))
throw new ArgumentException("User does not exist!");
User friend = await this._userRepository.GetByIdAsync(friendId);
return this._userMapper.Map<UserServiceModel>(friend);
}
+ #endregion
+
+ #region Update
public async Task<UserServiceModel> UpdateUser(UpdateUserServiceModel updateModel)
{
- if (!this._userRepository.DoesUserExist(updateModel.Id))
+ if (!await this._userRepository.DoesUserExistAsync(updateModel.Id))
throw new ArgumentException("User does not exist!");
if (!this._userRepository.DoesUserHaveThisUsername(updateModel.Id, updateModel.UserName)
- && await this._userRepository.DoesUsernameExist(updateModel.UserName))
+ && await this._userRepository.DoesUsernameExistAsync(updateModel.UserName))
throw new ArgumentException("Username already exists!");
User user = this._userMapper.Map<User>(updateModel);
@@ -113,12 +166,15 @@ namespace DevHive.Services.Services
if (!result)
throw new InvalidOperationException("Unable to edit user!");
- return this._userMapper.Map<UserServiceModel>(user);;
+ return this._userMapper.Map<UserServiceModel>(user); ;
}
+ #endregion
+
+ #region Delete
public async Task DeleteUser(Guid id)
{
- if (!this._userRepository.DoesUserExist(id))
+ if (!await this._userRepository.DoesUserExistAsync(id))
throw new ArgumentException("User does not exist!");
User user = await this._userRepository.GetByIdAsync(id);
@@ -130,21 +186,25 @@ namespace DevHive.Services.Services
public async Task<bool> RemoveFriend(Guid userId, Guid friendId)
{
- if(!this._userRepository.DoesUserExist(userId) &&
- !this._userRepository.DoesUserExist(friendId))
- throw new ArgumentException("Invalid user!");
+ Task<bool> userExists = this._userRepository.DoesUserExistAsync(userId);
+ Task<bool> friendExists = this._userRepository.DoesUserExistAsync(friendId);
- User user = await this._userRepository.GetByIdAsync(userId);
- User friend = await this._userRepository.GetByIdAsync(friendId);
+ await Task.WhenAll(userExists, friendExists);
+
+ if (!userExists.Result)
+ throw new ArgumentException("User doesn't exist!");
- if(!this.DoesUserHaveFriends(user))
- throw new ArgumentException("User does not have any friends.");
+ if (!friendExists.Result)
+ throw new ArgumentException("Friend doesn't exist!");
- if (!DoesUserHaveThisFriend(user, friend))
+ if (!await this._userRepository.DoesUserHaveThisFriendAsync(userId, friendId))
throw new ArgumentException("This ain't your friend, amigo.");
- return await this.RemoveFriend(user.Id, friendId);
+ return await this.RemoveFriend(userId, friendId);
}
+ #endregion
+
+ #region Validations
public async Task<bool> ValidJWT(Guid id, string rawTokenData)
{
@@ -153,7 +213,7 @@ namespace DevHive.Services.Services
string jwtUserName = this.GetClaimTypeValues("unique_name", jwt.Claims)[0];
List<string> jwtRoleNames = this.GetClaimTypeValues("role", jwt.Claims);
-
+
User user = await this._userRepository.GetByUsername(jwtUserName)
?? throw new ArgumentException("User does not exist!");
@@ -164,9 +224,9 @@ namespace DevHive.Services.Services
return false;
/* Check roles */
-
+
// Check if jwt contains all user roles (if it doesn't, jwt is either old or tampered with)
- foreach(var role in user.Roles)
+ foreach (var role in user.Roles)
{
if (!jwtRoleNames.Contains(role.Name))
return false;
@@ -179,26 +239,11 @@ namespace DevHive.Services.Services
return true;
}
- private string GeneratePasswordHash(string password)
- {
- return string.Join(string.Empty, SHA512.HashData(Encoding.ASCII.GetBytes(password)));
- }
-
- private bool DoesUserHaveThisFriend(User user, User friend)
- {
- return user.Friends.Contains(friend);
- }
-
- private bool DoesUserHaveFriends(User user)
- {
- return user.Friends.Count >= 1;
- }
-
private List<string> GetClaimTypeValues(string type, IEnumerable<Claim> claims)
{
List<string> toReturn = new();
-
- foreach(var claim in claims)
+
+ foreach (var claim in claims)
if (claim.Type == type)
toReturn.Add(claim.Value);
@@ -214,7 +259,7 @@ namespace DevHive.Services.Services
new Claim(ClaimTypes.Name, userName),
};
- foreach(var role in roles)
+ foreach (var role in roles)
{
claims.Add(new Claim(ClaimTypes.Role, role.Name));
}
@@ -232,5 +277,12 @@ namespace DevHive.Services.Services
SecurityToken token = tokenHandler.CreateToken(tokenDescriptor);
return tokenHandler.WriteToken(token);
}
+
+ private string GeneratePasswordHash(string password)
+ {
+ return string.Join(string.Empty, SHA512.HashData(Encoding.ASCII.GetBytes(password)));
+ }
+
+ #endregion
}
}
diff --git a/src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs b/src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs
index ee0ca4b..beac798 100644
--- a/src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs
+++ b/src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs
@@ -34,7 +34,7 @@ namespace DevHive.Data.Tests
this.Context.Database.EnsureDeleted();
}
- #region AddAync
+ #region AddAsync
[Test]
public void AddAsync_AddsTheGivenTechnologyToTheDatabase()
{
@@ -127,7 +127,7 @@ namespace DevHive.Data.Tests
{
bool result = await this.TechnologyRepository.DoesTechnologyNameExist(TECHNOLOGY_NAME);
- Assert.False(result, "DoesTechnologyNameExist returns true when tehcnology name does not exist");
+ Assert.False(result, "DoesTechnologyNameExist returns true when technology name does not exist");
}).GetAwaiter().GetResult();
}
#endregion
diff --git a/src/DevHive.Web/Configurations/Mapping/LanguageMappings.cs b/src/DevHive.Web/Configurations/Mapping/LanguageMappings.cs
index 5715b13..bae8562 100644
--- a/src/DevHive.Web/Configurations/Mapping/LanguageMappings.cs
+++ b/src/DevHive.Web/Configurations/Mapping/LanguageMappings.cs
@@ -9,9 +9,12 @@ namespace DevHive.Web.Configurations.Mapping
public LanguageMappings()
{
CreateMap<LanguageWebModel, LanguageServiceModel>();
- CreateMap<UpdateLanguageWebModel, LanguageServiceModel>();
+ CreateMap<CreateLanguageWebModel, CreateLanguageServiceModel>();
+ CreateMap<UpdateLanguageWebModel, UpdateLanguageServiceModel>();
+
CreateMap<LanguageServiceModel, LanguageWebModel>();
- CreateMap<LanguageWebModel, UpdateLanguageServiceModel>();
+ CreateMap<CreateLanguageServiceModel, CreateLanguageWebModel>();
+ CreateMap<UpdateLanguageServiceModel, UpdateLanguageWebModel>();
}
}
} \ No newline at end of file
diff --git a/src/DevHive.Web/Controllers/LanguageController.cs b/src/DevHive.Web/Controllers/LanguageController.cs
index d71d622..29c1e99 100644
--- a/src/DevHive.Web/Controllers/LanguageController.cs
+++ b/src/DevHive.Web/Controllers/LanguageController.cs
@@ -23,9 +23,9 @@ namespace DevHive.Web.Controllers
}
[HttpPost]
- public async Task<IActionResult> Create([FromBody] LanguageWebModel languageWebModel)
+ public async Task<IActionResult> Create([FromBody] CreateLanguageWebModel createLanguageWebModel)
{
- LanguageServiceModel languageServiceModel = this._languageMapper.Map<LanguageServiceModel>(languageWebModel);
+ CreateLanguageServiceModel languageServiceModel = this._languageMapper.Map<CreateLanguageServiceModel>(createLanguageWebModel);
bool result = await this._languageService.CreateLanguage(languageServiceModel);
diff --git a/src/DevHive.Web/Models/Language/CreateLanguageWebModel.cs b/src/DevHive.Web/Models/Language/CreateLanguageWebModel.cs
new file mode 100644
index 0000000..111beed
--- /dev/null
+++ b/src/DevHive.Web/Models/Language/CreateLanguageWebModel.cs
@@ -0,0 +1,9 @@
+using System;
+
+namespace DevHive.Web.Models.Language
+{
+ public class CreateLanguageWebModel : LanguageWebModel
+ {
+ public string Name { get; set; }
+ }
+} \ No newline at end of file
diff --git a/src/DevHive.Web/Models/Language/LanguageWebModel.cs b/src/DevHive.Web/Models/Language/LanguageWebModel.cs
index 1ec38f3..455b559 100644
--- a/src/DevHive.Web/Models/Language/LanguageWebModel.cs
+++ b/src/DevHive.Web/Models/Language/LanguageWebModel.cs
@@ -1,7 +1,9 @@
+using System;
+
namespace DevHive.Web.Models.Language
{
public class LanguageWebModel
{
- public string Name { get; set; }
+ public Guid Id { get; set; }
}
} \ No newline at end of file
diff --git a/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs b/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs
index 26eb6c2..2da8217 100644
--- a/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs
+++ b/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs
@@ -2,8 +2,5 @@ using System;
namespace DevHive.Web.Models.Language
{
- public class UpdateLanguageWebModel : LanguageWebModel
- {
- public Guid Id { get; set; }
- }
+ public class UpdateLanguageWebModel : CreateLanguageWebModel {}
} \ No newline at end of file