aboutsummaryrefslogtreecommitdiff
path: root/src/DevHive.Services/Services/UserService.cs
diff options
context:
space:
mode:
authorDanail Dimitrov <danaildimitrov321@gmail.com>2021-01-26 15:50:16 +0200
committerDanail Dimitrov <danaildimitrov321@gmail.com>2021-01-26 15:50:16 +0200
commitacf0e2f3908ba45dca1ff04cc1e5a892cc2cdbf0 (patch)
tree38c290bd7bad75edfdeb9631948ef654c3a282f0 /src/DevHive.Services/Services/UserService.cs
parentf61da9c07ff37cb350528e255539b4ec11181bde (diff)
parentbddc0b0566bc19e936ccae9d3aa16b6e0116b186 (diff)
downloadDevHive-acf0e2f3908ba45dca1ff04cc1e5a892cc2cdbf0.tar
DevHive-acf0e2f3908ba45dca1ff04cc1e5a892cc2cdbf0.tar.gz
DevHive-acf0e2f3908ba45dca1ff04cc1e5a892cc2cdbf0.zip
Merge branch 'dev' of https://github.com/Team-Kaleidoscope/DevHive into dev
Diffstat (limited to 'src/DevHive.Services/Services/UserService.cs')
-rw-r--r--src/DevHive.Services/Services/UserService.cs154
1 files changed, 88 insertions, 66 deletions
diff --git a/src/DevHive.Services/Services/UserService.cs b/src/DevHive.Services/Services/UserService.cs
index 1beb07f..0e3bf72 100644
--- a/src/DevHive.Services/Services/UserService.cs
+++ b/src/DevHive.Services/Services/UserService.cs
@@ -111,61 +111,7 @@ namespace DevHive.Services.Services
await this.ValidateUserCollections(updateUserServiceModel);
- /* Roles */
- int roleCount = updateUserServiceModel.Roles.Count;
- for (int i = 0; i < roleCount; i++)
- {
- Role role = await this._roleRepository.GetByNameAsync(updateUserServiceModel.Roles.ElementAt(i).Name) ??
- throw new ArgumentException("Invalid role name!");
-
- UpdateRoleServiceModel updateRoleServiceModel = this._userMapper.Map<UpdateRoleServiceModel>(role);
-
- updateUserServiceModel.Roles.Add(updateRoleServiceModel);
- }
-
- /* Languages */
- int langCount = updateUserServiceModel.Languages.Count;
- for (int i = 0; i < langCount; i++)
- {
- Language language = await this._languageRepository.GetByNameAsync(updateUserServiceModel.Languages.ElementAt(i).Name) ??
- throw new ArgumentException("Invalid language name!");
-
- UpdateLanguageServiceModel updateLanguageServiceModel = this._userMapper.Map<UpdateLanguageServiceModel>(language);
-
- updateUserServiceModel.Languages.Add(updateLanguageServiceModel);
- }
- //Clean the already replaced languages
- updateUserServiceModel.Languages.RemoveWhere(x => x.Id == Guid.Empty);
-
- /* Technologies */
- int techCount = updateUserServiceModel.Technologies.Count;
- for (int i = 0; i < techCount; i++)
- {
- Technology technology = await this._technologyRepository.GetByNameAsync(updateUserServiceModel.Technologies.ElementAt(i).Name) ??
- throw new ArgumentException("Invalid technology name!");
-
- UpdateTechnologyServiceModel updateTechnologyServiceModel = this._userMapper.Map<UpdateTechnologyServiceModel>(technology);
-
- updateUserServiceModel.Technologies.Add(updateTechnologyServiceModel);
- }
- //Clean the already replaced technologies
- updateUserServiceModel.Technologies.RemoveWhere(x => x.Id == Guid.Empty);
-
- /* Friends */
- HashSet<User> friends = new();
- int friendsCount = updateUserServiceModel.Friends.Count;
- for (int i = 0; i < friendsCount; i++)
- {
- User friend = await this._userRepository.GetByUsernameAsync(updateUserServiceModel.Friends.ElementAt(i).Name) ??
- throw new ArgumentException("Invalid friend's username!");
-
- friends.Add(friend);
- }
- //Clean the already replaced technologies
- updateUserServiceModel.Friends.RemoveWhere(x => x.Id == Guid.Empty);
-
- User user = this._userMapper.Map<User>(updateUserServiceModel);
- user.Friends = friends;
+ User user = await this.PopulateModel(updateUserServiceModel);
bool successful = await this._userRepository.EditAsync(updateUserServiceModel.Id, user);
@@ -249,30 +195,49 @@ namespace DevHive.Services.Services
private async Task ValidateUserCollections(UpdateUserServiceModel updateUserServiceModel)
{
+ //Do NOT allow a user to change his roles, unless he is an Admin
+ bool isAdmin = (await this._userRepository.GetByIdAsync(updateUserServiceModel.Id))
+ .Roles.Any(r => r.Name == Role.AdminRole);
+
+ if (isAdmin)
+ {
+ // Roles
+ foreach (var role in updateUserServiceModel.Roles)
+ {
+ Role returnedRole = await this._roleRepository.GetByNameAsync(role.Name) ??
+ throw new ArgumentException($"Role {role.Name} does not exist!");
+ }
+ }
+ //Preserve original user roles
+ else
+ {
+ HashSet<Role> roles = (await this._userRepository.GetByIdAsync(updateUserServiceModel.Id)).Roles;
+
+ foreach (var role in roles)
+ {
+ Role returnedRole = await this._roleRepository.GetByNameAsync(role.Name) ??
+ throw new ArgumentException($"Role {role.Name} does not exist!");
+ }
+ }
+
// Friends
foreach (var friend in updateUserServiceModel.Friends)
{
- User returnedFriend = await this._userRepository.GetByUsernameAsync(friend.Name);
-
- if (returnedFriend == null)
- throw new ArgumentException($"User {friend.Name} does not exist!");
+ User returnedFriend = await this._userRepository.GetByUsernameAsync(friend.UserName) ??
+ throw new ArgumentException($"User {friend.UserName} does not exist!");
}
// Languages
foreach (var language in updateUserServiceModel.Languages)
{
- Language returnedLanguage = await this._languageRepository.GetByNameAsync(language.Name);
-
- if (returnedLanguage == null)
+ Language returnedLanguage = await this._languageRepository.GetByNameAsync(language.Name) ??
throw new ArgumentException($"Language {language.Name} does not exist!");
}
// Technology
foreach (var technology in updateUserServiceModel.Technologies)
{
- Technology returnedTechnology = await this._technologyRepository.GetByNameAsync(technology.Name);
-
- if (returnedTechnology == null)
+ Technology returnedTechnology = await this._technologyRepository.GetByNameAsync(technology.Name) ??
throw new ArgumentException($"Technology {technology.Name} does not exist!");
}
}
@@ -306,12 +271,13 @@ namespace DevHive.Services.Services
}
#endregion
+ #region Misc
public async Task<Guid> SuperSecretPromotionToAdmin(Guid userId)
{
User user = await this._userRepository.GetByIdAsync(userId) ??
throw new ArgumentException("User does not exist! Can't promote shit in this country...");
- if(!await this._roleRepository.DoesNameExist("Admin"))
+ if (!await this._roleRepository.DoesNameExist("Admin"))
{
Role adminRole = new()
{
@@ -329,5 +295,61 @@ namespace DevHive.Services.Services
return admin.Id;
}
+
+ private async Task<User> PopulateModel(UpdateUserServiceModel updateUserServiceModel)
+ {
+ User user = this._userMapper.Map<User>(updateUserServiceModel);
+
+ /* Fetch Roles and replace model's*/
+ HashSet<Role> roles = new();
+ int rolesCount = updateUserServiceModel.Roles.Count;
+ for (int i = 0; i < rolesCount; i++)
+ {
+ Role role = await this._roleRepository.GetByNameAsync(updateUserServiceModel.Roles.ElementAt(i).Name) ??
+ throw new ArgumentException("Invalid role name!");
+
+ roles.Add(role);
+ }
+ user.Roles = roles;
+
+ /* Fetch Friends and replace model's*/
+ HashSet<User> friends = new();
+ int friendsCount = updateUserServiceModel.Friends.Count;
+ for (int i = 0; i < friendsCount; i++)
+ {
+ User friend = await this._userRepository.GetByUsernameAsync(updateUserServiceModel.Friends.ElementAt(i).UserName) ??
+ throw new ArgumentException("Invalid friend's username!");
+
+ friends.Add(friend);
+ }
+ user.Friends = friends;
+
+ /* Fetch Languages and replace model's*/
+ HashSet<Language> languages = new();
+ int languagesCount = updateUserServiceModel.Languages.Count;
+ for (int i = 0; i < languagesCount; i++)
+ {
+ Language language = await this._languageRepository.GetByNameAsync(updateUserServiceModel.Languages.ElementAt(i).Name) ??
+ throw new ArgumentException("Invalid language name!");
+
+ languages.Add(language);
+ }
+ user.Languages = languages;
+
+ /* Fetch Technologies and replace model's*/
+ HashSet<Technology> technologies = new();
+ int technologiesCount = updateUserServiceModel.Technologies.Count;
+ for (int i = 0; i < technologiesCount; i++)
+ {
+ Technology technology = await this._technologyRepository.GetByNameAsync(updateUserServiceModel.Technologies.ElementAt(i).Name) ??
+ throw new ArgumentException("Invalid technology name!");
+
+ technologies.Add(technology);
+ }
+ user.Technologies = technologies;
+
+ return user;
+ }
+ #endregion
}
}