aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/DevHive.Common/Models/Misc/PasswordModifications.cs13
-rw-r--r--src/DevHive.Common/Models/Misc/Patch.cs9
-rw-r--r--src/DevHive.Data/Repositories/UserRepository.cs7
-rw-r--r--src/DevHive.Services/Configurations/Mapping/RoleMapings.cs3
-rw-r--r--src/DevHive.Services/Configurations/Mapping/UserCollectionMappings.cs17
-rw-r--r--src/DevHive.Services/Configurations/Mapping/UserMappings.cs6
-rw-r--r--src/DevHive.Services/Interfaces/IUserService.cs6
-rw-r--r--src/DevHive.Services/Models/Identity/User/BaseUserServiceModel.cs1
-rw-r--r--src/DevHive.Services/Models/Technology/ReadTechnologyServiceModel.cs7
-rw-r--r--src/DevHive.Services/Services/UserService.cs78
-rw-r--r--src/DevHive.Web/Configurations/Mapping/TechnologyMappings.cs2
-rw-r--r--src/DevHive.Web/Controllers/UserController.cs19
-rw-r--r--src/DevHive.Web/Models/Technology/ReadTechnologyWebModel.cs14
13 files changed, 113 insertions, 69 deletions
diff --git a/src/DevHive.Common/Models/Misc/PasswordModifications.cs b/src/DevHive.Common/Models/Misc/PasswordModifications.cs
new file mode 100644
index 0000000..f10a334
--- /dev/null
+++ b/src/DevHive.Common/Models/Misc/PasswordModifications.cs
@@ -0,0 +1,13 @@
+using System.Security.Cryptography;
+using System.Text;
+
+namespace DevHive.Common.Models.Misc
+{
+ public static class PasswordModifications
+ {
+ public static string GeneratePasswordHash(string password)
+ {
+ return string.Join(string.Empty, SHA512.HashData(Encoding.ASCII.GetBytes(password)));
+ }
+ }
+}
diff --git a/src/DevHive.Common/Models/Misc/Patch.cs b/src/DevHive.Common/Models/Misc/Patch.cs
new file mode 100644
index 0000000..ea5a4f1
--- /dev/null
+++ b/src/DevHive.Common/Models/Misc/Patch.cs
@@ -0,0 +1,9 @@
+namespace DevHive.Common.Models.Misc
+{
+ public class Patch
+ {
+ public string Name { get; set; }
+ public object Value { get; set; }
+ public string Action { get; set; }
+ }
+}
diff --git a/src/DevHive.Data/Repositories/UserRepository.cs b/src/DevHive.Data/Repositories/UserRepository.cs
index 492d46b..3f9af70 100644
--- a/src/DevHive.Data/Repositories/UserRepository.cs
+++ b/src/DevHive.Data/Repositories/UserRepository.cs
@@ -109,13 +109,6 @@ namespace DevHive.Data.Repositories
public async Task<bool> EditAsync(User newEntity)
{
- // User user = await this.GetByIdAsync(newEntity.Id);
-
- // this._context
- // .Entry(user)
- // .CurrentValues
- // .SetValues(newEntity);
-
this._context.Update(newEntity);
return await this.SaveChangesAsync(this._context);
diff --git a/src/DevHive.Services/Configurations/Mapping/RoleMapings.cs b/src/DevHive.Services/Configurations/Mapping/RoleMapings.cs
index 4ddd253..b5541f9 100644
--- a/src/DevHive.Services/Configurations/Mapping/RoleMapings.cs
+++ b/src/DevHive.Services/Configurations/Mapping/RoleMapings.cs
@@ -9,6 +9,9 @@ namespace DevHive.Services.Configurations.Mapping
public RoleMappings()
{
CreateMap<RoleServiceModel, Role>();
+ CreateMap<UpdateRoleServiceModel, Role>();
+
+ CreateMap<Role, RoleServiceModel>();
CreateMap<Role, RoleServiceModel>();
}
}
diff --git a/src/DevHive.Services/Configurations/Mapping/UserCollectionMappings.cs b/src/DevHive.Services/Configurations/Mapping/UserCollectionMappings.cs
index ee505a2..7a773e8 100644
--- a/src/DevHive.Services/Configurations/Mapping/UserCollectionMappings.cs
+++ b/src/DevHive.Services/Configurations/Mapping/UserCollectionMappings.cs
@@ -8,14 +8,15 @@ namespace DevHive.Services.Configurations.Mapping
{
public UserCollectionMappings()
{
- CreateMap<UpdateUserCollectionServiceModel, User>()
- .ForMember(up => up.UserName, u => u.MapFrom(src => src.Name));
- CreateMap<UpdateUserCollectionServiceModel, Role>()
- .ForMember(r => r.Name, u => u.MapFrom(src => src.Name));
- CreateMap<UpdateUserCollectionServiceModel, Language>()
- .ForMember(r => r.Name, u => u.MapFrom(src => src.Name));
- CreateMap<UpdateUserCollectionServiceModel, Technology>()
- .ForMember(r => r.Name, u => u.MapFrom(src => src.Name));
+ CreateMap<UpdateUserCollectionServiceModel, User>();
+ CreateMap<UpdateUserCollectionServiceModel, Role>();
+ CreateMap<UpdateUserCollectionServiceModel, Language>();
+ CreateMap<UpdateUserCollectionServiceModel, Technology>();
+
+ CreateMap<User, UpdateUserCollectionServiceModel>();
+ CreateMap<Role, UpdateUserCollectionServiceModel>();
+ CreateMap<Language, UpdateUserCollectionServiceModel>();
+ CreateMap<Technology, UpdateUserCollectionServiceModel>();
}
}
}
diff --git a/src/DevHive.Services/Configurations/Mapping/UserMappings.cs b/src/DevHive.Services/Configurations/Mapping/UserMappings.cs
index 541e16e..5d9e41c 100644
--- a/src/DevHive.Services/Configurations/Mapping/UserMappings.cs
+++ b/src/DevHive.Services/Configurations/Mapping/UserMappings.cs
@@ -1,6 +1,7 @@
using DevHive.Data.Models;
using AutoMapper;
using DevHive.Services.Models.Identity.User;
+using DevHive.Common.Models.Misc;
namespace DevHive.Services.Configurations.Mapping
{
@@ -10,10 +11,13 @@ namespace DevHive.Services.Configurations.Mapping
{
CreateMap<UserServiceModel, User>();
CreateMap<RegisterServiceModel, User>();
- CreateMap<UpdateUserServiceModel, User>();
+ CreateMap<UpdateUserServiceModel, User>()
+ .AfterMap((src, dest) => dest.PasswordHash = PasswordModifications.GeneratePasswordHash(src.Password));
CreateMap<FriendServiceModel, User>();
CreateMap<User, UserServiceModel>();
+ CreateMap<User, UpdateUserServiceModel>()
+ .ForMember(x => x.Password, opt => opt.Ignore());
CreateMap<User, FriendServiceModel>();
}
}
diff --git a/src/DevHive.Services/Interfaces/IUserService.cs b/src/DevHive.Services/Interfaces/IUserService.cs
index 121fec3..88be0c8 100644
--- a/src/DevHive.Services/Interfaces/IUserService.cs
+++ b/src/DevHive.Services/Interfaces/IUserService.cs
@@ -1,9 +1,9 @@
using System;
+using System.Collections.Generic;
using System.Threading.Tasks;
using DevHive.Common.Models.Identity;
-using DevHive.Data.Models;
+using DevHive.Common.Models.Misc;
using DevHive.Services.Models.Identity.User;
-using Microsoft.AspNetCore.JsonPatch;
namespace DevHive.Services.Interfaces
{
@@ -18,7 +18,7 @@ namespace DevHive.Services.Interfaces
Task<UserServiceModel> GetUserById(Guid id);
Task<UserServiceModel> UpdateUser(UpdateUserServiceModel updateModel);
- Task<UserServiceModel> PatchUser(Guid id, JsonPatchDocument<User> jsonPatch);
+ Task<UserServiceModel> PatchUser(Guid id, List<Patch> patch);
Task DeleteUser(Guid id);
Task<bool> RemoveFriend(Guid userId, Guid friendId);
diff --git a/src/DevHive.Services/Models/Identity/User/BaseUserServiceModel.cs b/src/DevHive.Services/Models/Identity/User/BaseUserServiceModel.cs
index 514f82a..7a160f8 100644
--- a/src/DevHive.Services/Models/Identity/User/BaseUserServiceModel.cs
+++ b/src/DevHive.Services/Models/Identity/User/BaseUserServiceModel.cs
@@ -6,5 +6,6 @@ namespace DevHive.Services.Models.Identity.User
public string Email { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
+ public string Password { get; set; }
}
}
diff --git a/src/DevHive.Services/Models/Technology/ReadTechnologyServiceModel.cs b/src/DevHive.Services/Models/Technology/ReadTechnologyServiceModel.cs
new file mode 100644
index 0000000..cbfdc7d
--- /dev/null
+++ b/src/DevHive.Services/Models/Technology/ReadTechnologyServiceModel.cs
@@ -0,0 +1,7 @@
+namespace DevHive.Services.Models.Technology
+{
+ public class ReadTechnologyServiceModel
+ {
+ public string Name { get; set; }
+ }
+}
diff --git a/src/DevHive.Services/Services/UserService.cs b/src/DevHive.Services/Services/UserService.cs
index 51c4432..629b489 100644
--- a/src/DevHive.Services/Services/UserService.cs
+++ b/src/DevHive.Services/Services/UserService.cs
@@ -7,15 +7,14 @@ using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;
-using System.Security.Cryptography;
using System.Text;
using System.Collections.Generic;
using DevHive.Common.Models.Identity;
using DevHive.Services.Interfaces;
using DevHive.Data.Interfaces.Repositories;
-using Microsoft.AspNetCore.JsonPatch;
using System.Linq;
-using Newtonsoft.Json;
+using DevHive.Common.Models.Misc;
+using System.Reflection;
namespace DevHive.Services.Services
{
@@ -52,7 +51,7 @@ namespace DevHive.Services.Services
User user = await this._userRepository.GetByUsernameAsync(loginModel.UserName);
- if (user.PasswordHash != GeneratePasswordHash(loginModel.Password))
+ if (user.PasswordHash != PasswordModifications.GeneratePasswordHash(loginModel.Password))
throw new ArgumentException("Incorrect password!");
return new TokenModel(WriteJWTSecurityToken(user.Id, user.Roles));
@@ -67,7 +66,7 @@ namespace DevHive.Services.Services
throw new ArgumentException("Email already exists!");
User user = this._userMapper.Map<User>(registerModel);
- user.PasswordHash = GeneratePasswordHash(registerModel.Password);
+ user.PasswordHash = PasswordModifications.GeneratePasswordHash(registerModel.Password);
// Make sure the default role exists
if (!await this._roleRepository.DoesNameExist(Role.DefaultRole))
@@ -135,6 +134,7 @@ namespace DevHive.Services.Services
public async Task<UserServiceModel> UpdateUser(UpdateUserServiceModel updateUserServiceModel)
{
+ //Method: ValidateUserOnUpdate
if (!await this._userRepository.DoesUserExistAsync(updateUserServiceModel.Id))
throw new ArgumentException("User does not exist!");
@@ -144,6 +144,7 @@ namespace DevHive.Services.Services
await this.ValidateUserCollections(updateUserServiceModel);
+ //Method: Insert collections to user
HashSet<Language> languages = new();
foreach (UpdateUserCollectionServiceModel lang in updateUserServiceModel.Languages)
languages.Add(await this._languageRepository.GetByNameAsync(lang.Name) ??
@@ -159,51 +160,35 @@ namespace DevHive.Services.Services
user.Languages = languages;
user.Technologies = technologies;
- bool success = await this._userRepository.EditAsync(user);
+ bool successful = await this._userRepository.EditAsync(user);
- if (!success)
+ if (!successful)
throw new InvalidOperationException("Unable to edit user!");
return this._userMapper.Map<UserServiceModel>(user); ;
}
- public async Task<UserServiceModel> PatchUser(Guid id, JsonPatchDocument<User> jsonPatch)
+ public async Task<UserServiceModel> PatchUser(Guid id, List<Patch> patchList)
{
User user = await this._userRepository.GetByIdAsync(id) ??
throw new ArgumentException("User does not exist!");
- object password = jsonPatch.Operations
- .Where(x => x.path == "/password")
- .Select(x => x.value)
- .FirstOrDefault();
-
- IEnumerable<object> friends = jsonPatch.Operations
- .Where(x => x.path == "/friends")
- .Select(x => x.value);
-
- if(password != null)
- {
- string passwordHash = this.GeneratePasswordHash(password.ToString());
- user.PasswordHash = passwordHash;
- }
+ UpdateUserServiceModel updateUserServiceModel = this._userMapper.Map<UpdateUserServiceModel>(user);
- if (friends != null)
+ foreach (Patch patch in patchList)
{
- foreach (object friendObj in friends)
+ bool successful = patch.Action switch
{
- FriendServiceModel friendServiceModel =
- JsonConvert.DeserializeObject<FriendServiceModel>(friendObj.ToString());
-
- User amigo = await this._userRepository.GetByUsernameAsync(friendServiceModel.UserName)
- ?? throw new ArgumentException($"User {friendServiceModel.UserName} does not exist!");
-
- user.Friends.Add(amigo);
- }
+ "replace" => ReplacePatch(updateUserServiceModel, patch),
+ "add" => AddPatch(updateUserServiceModel, patch),
+ "remove" => RemovePatch(updateUserServiceModel, patch),
+ _ => throw new ArgumentException("Invalid patch operation!"),
+ };
+
+ if (!successful)
+ throw new ArgumentException("A problem occurred while applying patch");
}
- //Remove password and friends peace from the request patch before applying the rest
- // jsonPatch.ApplyTo(user);
-
bool success = await this._userRepository.EditAsync(user);
if (success)
{
@@ -326,6 +311,11 @@ namespace DevHive.Services.Services
}
}
+ private async Task ValidateUserOnUpdate(UpdateUserServiceModel updateUserServiceModel)
+ {
+
+ }
+
private string WriteJWTSecurityToken(Guid userId, HashSet<Role> roles)
{
byte[] signingKey = Encoding.ASCII.GetBytes(_jwtOptions.Secret);
@@ -354,9 +344,23 @@ namespace DevHive.Services.Services
return tokenHandler.WriteToken(token);
}
- private string GeneratePasswordHash(string password)
+ private bool AddPatch(UpdateUserServiceModel updateUserServiceModel, Patch patch)
+ {
+ // Type type = typeof(UpdateUserServiceModel);
+ // PropertyInfo property = type.GetProperty(patch.Name);
+
+ // property.SetValue(updateUserServiceModel, patch.Value);
+ throw new NotImplementedException();
+ }
+
+ private bool RemovePatch(UpdateUserServiceModel updateUserServiceModel, Patch patch)
+ {
+ throw new NotImplementedException();
+ }
+
+ private bool ReplacePatch(UpdateUserServiceModel updateUserServiceModel, Patch patch)
{
- return string.Join(string.Empty, SHA512.HashData(Encoding.ASCII.GetBytes(password)));
+ throw new NotImplementedException();
}
#endregion
}
diff --git a/src/DevHive.Web/Configurations/Mapping/TechnologyMappings.cs b/src/DevHive.Web/Configurations/Mapping/TechnologyMappings.cs
index 828dac1..4ecd5f3 100644
--- a/src/DevHive.Web/Configurations/Mapping/TechnologyMappings.cs
+++ b/src/DevHive.Web/Configurations/Mapping/TechnologyMappings.cs
@@ -9,10 +9,12 @@ namespace DevHive.Web.Configurations.Mapping
public TechnologyMappings()
{
CreateMap<CreateTechnologyWebModel, CreateTechnologyServiceModel>();
+ CreateMap<ReadTechnologyWebModel, ReadTechnologyServiceModel>();
CreateMap<UpdateTechnologyWebModel, UpdateTechnologyServiceModel>();
CreateMap<TechnologyWebModel, TechnologyServiceModel>();
CreateMap<CreateTechnologyServiceModel, CreateTechnologyWebModel>();
+ CreateMap<ReadTechnologyServiceModel, ReadTechnologyWebModel>();
CreateMap<UpdateTechnologyServiceModel, UpdateTechnologyWebModel>();
CreateMap<TechnologyServiceModel, TechnologyWebModel>();
}
diff --git a/src/DevHive.Web/Controllers/UserController.cs b/src/DevHive.Web/Controllers/UserController.cs
index 471d2bb..7121ac8 100644
--- a/src/DevHive.Web/Controllers/UserController.cs
+++ b/src/DevHive.Web/Controllers/UserController.cs
@@ -6,14 +6,10 @@ using DevHive.Web.Models.Identity.User;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using DevHive.Common.Models.Identity;
-using DevHive.Common.Models.Misc;
-using DevHive.Web.Models.Language;
-using DevHive.Services.Models.Language;
-using DevHive.Web.Models.Technology;
-using DevHive.Services.Models.Technology;
using DevHive.Services.Interfaces;
-using DevHive.Data.Models;
using Microsoft.AspNetCore.JsonPatch;
+using DevHive.Common.Models.Misc;
+using System.Collections.Generic;
namespace DevHive.Web.Controllers
{
@@ -87,15 +83,12 @@ namespace DevHive.Web.Controllers
#region Update
[HttpPut]
- public async Task<IActionResult> Update(Guid id, [FromBody] UpdateUserWebModel updateModel, [FromHeader] string authorization)
+ public async Task<IActionResult> Update(Guid id, [FromBody] UpdateUserWebModel updateUserWebModel, [FromHeader] string authorization)
{
if (!await this._userService.ValidJWT(id, authorization))
return new UnauthorizedResult();
- // if (!ModelState.IsValid)
- // return BadRequest("Not a valid model!");
-
- UpdateUserServiceModel updateUserServiceModel = this._userMapper.Map<UpdateUserServiceModel>(updateModel);
+ UpdateUserServiceModel updateUserServiceModel = this._userMapper.Map<UpdateUserServiceModel>(updateUserWebModel);
updateUserServiceModel.Id = id;
UserServiceModel userServiceModel = await this._userService.UpdateUser(updateUserServiceModel);
@@ -105,12 +98,12 @@ namespace DevHive.Web.Controllers
}
[HttpPatch]
- public async Task<IActionResult> Patch(Guid id, [FromBody] JsonPatchDocument<User> jsonPatch, [FromHeader] string authorization)
+ public async Task<IActionResult> Patch(Guid id, [FromBody] List<Patch> patch, [FromHeader] string authorization)
{
if (!await this._userService.ValidJWT(id, authorization))
return new UnauthorizedResult();
- UserServiceModel userServiceModel = await this._userService.PatchUser(id, jsonPatch);
+ UserServiceModel userServiceModel = await this._userService.PatchUser(id, patch);
if (userServiceModel == null)
return new BadRequestObjectResult("Wrong patch properties");
diff --git a/src/DevHive.Web/Models/Technology/ReadTechnologyWebModel.cs b/src/DevHive.Web/Models/Technology/ReadTechnologyWebModel.cs
new file mode 100644
index 0000000..edaaaef
--- /dev/null
+++ b/src/DevHive.Web/Models/Technology/ReadTechnologyWebModel.cs
@@ -0,0 +1,14 @@
+using System.ComponentModel.DataAnnotations;
+using System.Diagnostics.CodeAnalysis;
+
+namespace DevHive.Web.Models.Technology
+{
+ public class ReadTechnologyWebModel
+ {
+ [NotNull]
+ [Required]
+ [MinLength(3)]
+ [MaxLength(50)]
+ public string Name { get; set; }
+ }
+}