diff options
Diffstat (limited to 'src')
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 |
