From 7acec816fe021db4a3922b70ce9b3f50e7600c79 Mon Sep 17 00:00:00 2001 From: Danail Dimitrov Date: Fri, 18 Dec 2020 09:42:13 +0200 Subject: Adding Technology Web layer --- src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs (limited to 'src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs') diff --git a/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs b/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs new file mode 100644 index 0000000..b94496e --- /dev/null +++ b/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs @@ -0,0 +1,9 @@ +using System; + +namespace DevHive.Web.Models.Technology +{ + public class UpdateTechnologyWebModel : TechnologyWebModel + { + public Guid Id { get; set; } + } +} \ No newline at end of file -- cgit v1.2.3 From 56f5578d5f93a56984deb6735dba51551868f6d8 Mon Sep 17 00:00:00 2001 From: transtrike Date: Tue, 12 Jan 2021 20:45:14 +0200 Subject: Full implementation of Language & Technologies to User --- .../Repositories/TechnologyRepository.cs | 36 +++++----- .../Technology/CreateTechnologyServiceModel.cs | 9 +++ .../Models/Technology/TechnologyServiceModel.cs | 4 +- .../Technology/UpdateTechnologyServiceModel.cs | 5 +- src/DevHive.Services/Services/TechnologyService.cs | 24 +++++-- src/DevHive.Services/Services/UserService.cs | 77 ++++++++++++++++++---- .../TechnologyRepository.Tests.cs | 10 +-- .../TechnologyService.Tests.cs | 10 +-- .../Extensions/ConfigureDependencyInjection.cs | 13 ++-- .../Controllers/TechnologyController.cs | 5 +- src/DevHive.Web/Controllers/UserController.cs | 65 ++++++++++++++++-- .../Models/Technology/CreateTechnologyWebModel.cs | 7 ++ .../Models/Technology/TechnologyWebModel.cs | 4 +- .../Models/Technology/UpdateTechnologyWebModel.cs | 4 +- src/DevHive.Web/Program.cs | 4 +- 15 files changed, 206 insertions(+), 71 deletions(-) create mode 100644 src/DevHive.Services/Models/Technology/CreateTechnologyServiceModel.cs create mode 100644 src/DevHive.Web/Models/Technology/CreateTechnologyWebModel.cs (limited to 'src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs') diff --git a/src/DevHive.Data/Repositories/TechnologyRepository.cs b/src/DevHive.Data/Repositories/TechnologyRepository.cs index cc0e642..21d69a3 100644 --- a/src/DevHive.Data/Repositories/TechnologyRepository.cs +++ b/src/DevHive.Data/Repositories/TechnologyRepository.cs @@ -7,7 +7,7 @@ using Microsoft.EntityFrameworkCore; namespace DevHive.Data.Repositories { - public abstract class TechnologyRepository : IRepository + public class TechnologyRepository : IRepository { private readonly DevHiveContext _context; @@ -18,7 +18,6 @@ namespace DevHive.Data.Repositories #region Create - public async Task AddAsync(Technology entity) { await this._context @@ -37,22 +36,6 @@ namespace DevHive.Data.Repositories .Set() .FindAsync(id); } - - public async Task DoesTechnologyNameExist(string technologyName) - { - return await this._context - .Set() - .AsNoTracking() - .AnyAsync(r => r.Name == technologyName); - } - - public async Task DoesTechnologyExist(Guid id) - { - return await this._context - .Set() - .AsNoTracking() - .AnyAsync(r => r.Id == id); - } #endregion #region Edit @@ -78,5 +61,22 @@ namespace DevHive.Data.Repositories return await RepositoryMethods.SaveChangesAsync(this._context); } #endregion + + #region Validations + + public async Task DoesTechnologyNameExist(string technologyName) + { + return await this._context + .Set() + .AsNoTracking() + .AnyAsync(r => r.Name == technologyName); + } + + public async Task DoesTechnologyExistAsync(Guid id) + { + return await this._context.Technologies + .AnyAsync(x => x.Id == id); + } + #endregion } } \ No newline at end of file diff --git a/src/DevHive.Services/Models/Technology/CreateTechnologyServiceModel.cs b/src/DevHive.Services/Models/Technology/CreateTechnologyServiceModel.cs new file mode 100644 index 0000000..ca848f9 --- /dev/null +++ b/src/DevHive.Services/Models/Technology/CreateTechnologyServiceModel.cs @@ -0,0 +1,9 @@ +using System; + +namespace DevHive.Services.Models.Technology +{ + public class CreateTechnologyServiceModel : TechnologyServiceModel + { + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/src/DevHive.Services/Models/Technology/TechnologyServiceModel.cs b/src/DevHive.Services/Models/Technology/TechnologyServiceModel.cs index 6fcc83e..afea6cf 100644 --- a/src/DevHive.Services/Models/Technology/TechnologyServiceModel.cs +++ b/src/DevHive.Services/Models/Technology/TechnologyServiceModel.cs @@ -1,7 +1,9 @@ +using System; + namespace DevHive.Services.Models.Technology { public class TechnologyServiceModel { - public string Name { get; set; } + public Guid Id { get; set; } } } \ No newline at end of file diff --git a/src/DevHive.Services/Models/Technology/UpdateTechnologyServiceModel.cs b/src/DevHive.Services/Models/Technology/UpdateTechnologyServiceModel.cs index e7ee85b..bfeae51 100644 --- a/src/DevHive.Services/Models/Technology/UpdateTechnologyServiceModel.cs +++ b/src/DevHive.Services/Models/Technology/UpdateTechnologyServiceModel.cs @@ -2,8 +2,5 @@ using System; namespace DevHive.Services.Models.Technology { - public class UpdateTechnologyServiceModel : TechnologyServiceModel - { - public Guid Id { get; set; } - } + public class UpdateTechnologyServiceModel : CreateTechnologyServiceModel {} } \ No newline at end of file diff --git a/src/DevHive.Services/Services/TechnologyService.cs b/src/DevHive.Services/Services/TechnologyService.cs index 2913a55..883b8c5 100644 --- a/src/DevHive.Services/Services/TechnologyService.cs +++ b/src/DevHive.Services/Services/TechnologyService.cs @@ -17,8 +17,10 @@ namespace DevHive.Services.Services this._technologyRepository = technologyRepository; this._technologyMapper = technologyMapper; } - - public async Task Create(TechnologyServiceModel technologyServiceModel) + + #region Create + + public async Task Create(CreateTechnologyServiceModel technologyServiceModel) { if (await this._technologyRepository.DoesTechnologyNameExist(technologyServiceModel.Name)) throw new ArgumentException("Technology already exists!"); @@ -28,7 +30,10 @@ namespace DevHive.Services.Services return result; } - + #endregion + + #region Read + public async Task GetTechnologyById(Guid id) { Technology technology = await this._technologyRepository.GetByIdAsync(id); @@ -38,10 +43,13 @@ namespace DevHive.Services.Services return this._technologyMapper.Map(technology); } + #endregion + + #region Update public async Task UpdateTechnology(UpdateTechnologyServiceModel updateTechnologyServiceModel) { - if (!await this._technologyRepository.DoesTechnologyExist(updateTechnologyServiceModel.Id)) + if (!await this._technologyRepository.DoesTechnologyExistAsync(updateTechnologyServiceModel.Id)) throw new ArgumentException("Technology does not exist!"); if (await this._technologyRepository.DoesTechnologyNameExist(updateTechnologyServiceModel.Name)) @@ -52,10 +60,13 @@ namespace DevHive.Services.Services return result; } - + #endregion + + #region Delete + public async Task DeleteTechnology(Guid id) { - if (!await this._technologyRepository.DoesTechnologyExist(id)) + if (!await this._technologyRepository.DoesTechnologyExistAsync(id)) throw new ArgumentException("Technology does not exist!"); Technology technology = await this._technologyRepository.GetByIdAsync(id); @@ -63,5 +74,6 @@ namespace DevHive.Services.Services return result; } + #endregion } } \ No newline at end of file diff --git a/src/DevHive.Services/Services/UserService.cs b/src/DevHive.Services/Services/UserService.cs index e1f925d..4fb18a0 100644 --- a/src/DevHive.Services/Services/UserService.cs +++ b/src/DevHive.Services/Services/UserService.cs @@ -13,6 +13,7 @@ using System.Collections.Generic; using DevHive.Common.Models.Identity; using DevHive.Services.Models.Language; using DevHive.Data.Repositories; +using DevHive.Services.Models.Technology; namespace DevHive.Services.Services { @@ -108,23 +109,16 @@ namespace DevHive.Services.Services public async Task AddLanguageToUser(Guid userId, LanguageServiceModel languageServiceModel) { - Task userExists = this._userRepository.DoesUserExistAsync(userId); - Task languageExists = this._languageRepository.DoesLanguageExistAsync(languageServiceModel.Id); - - await Task.WhenAll(userExists, languageExists); - - if (!userExists.Result) - throw new ArgumentException("User does not exist!"); + Tuple tuple = await ValidateUserAndLanguage(userId, languageServiceModel); - if (!languageExists.Result) - throw new ArgumentException("Language does not exist!"); - - Task user = this._userRepository.GetByIdAsync(userId); - Task language = this._languageRepository.GetByIdAsync(languageServiceModel.Id); + return await this._userRepository.AddLanguageToUserAsync(tuple.Item1, tuple.Item2); + } - await Task.WhenAll(user, language); + public async Task AddTechnologyToUser(Guid userId, TechnologyServiceModel technologyServiceModel) + { + Tuple tuple = await ValidateUserAndTechnology(userId, technologyServiceModel); - return await this._userRepository.AddLanguageToUserAsync(user.Result, language.Result); + return await this._userRepository.AddTechnologyToUserAsync(tuple.Item1, tuple.Item2); } #endregion @@ -202,6 +196,20 @@ namespace DevHive.Services.Services return await this.RemoveFriend(userId, friendId); } + + public async Task RemoveLanguageFromUser(Guid userId, LanguageServiceModel languageServiceModel) + { + Tuple tuple = await ValidateUserAndLanguage(userId, languageServiceModel); + + return await this._userRepository.RemoveLanguageFromUserAsync(tuple.Item1, tuple.Item2); + } + + public async Task RemoveTechnologyFromUser(Guid userId, TechnologyServiceModel technologyServiceModel) + { + Tuple tuple = await ValidateUserAndTechnology(userId, technologyServiceModel); + + return await this._userRepository.RemoveTechnologyFromUserAsync(tuple.Item1, tuple.Item2); + } #endregion #region Validations @@ -283,6 +291,47 @@ namespace DevHive.Services.Services return string.Join(string.Empty, SHA512.HashData(Encoding.ASCII.GetBytes(password))); } + private async Task> ValidateUserAndLanguage(Guid userId, LanguageServiceModel languageServiceModel) + { + Task userExists = this._userRepository.DoesUserExistAsync(userId); + Task 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 = this._userRepository.GetByIdAsync(userId); + Task language = this._languageRepository.GetByIdAsync(languageServiceModel.Id); + + await Task.WhenAll(user, language); + + return new Tuple(user.Result, language.Result); + } + + private async Task> ValidateUserAndTechnology(Guid userId, TechnologyServiceModel technologyServiceModel) + { + Task userExists = this._userRepository.DoesUserExistAsync(userId); + Task technologyExists = this._technologyRepository.DoesTechnologyExistAsync(technologyServiceModel.Id); + + await Task.WhenAll(userExists, technologyExists); + + if (!userExists.Result) + throw new ArgumentException("User does not exist!"); + + if (!technologyExists.Result) + throw new ArgumentException("Language does not exist!"); + + Task user = this._userRepository.GetByIdAsync(userId); + Task technology = this._technologyRepository.GetByIdAsync(technologyServiceModel.Id); + + await Task.WhenAll(user, technology); + + return new Tuple(user.Result, technology.Result); + } #endregion } } diff --git a/src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs b/src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs index beac798..54cf7c0 100644 --- a/src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs +++ b/src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs @@ -76,7 +76,7 @@ namespace DevHive.Data.Tests } #endregion - #region DoesTechnologyExist + #region DoesTechnologyExistAsync [Test] public void DoesTechnologyExist_ReturnsTrue_IfIdExists() { @@ -86,9 +86,9 @@ namespace DevHive.Data.Tests Technology technology = this.Context.Technologies.Where(x => x.Name == TECHNOLOGY_NAME).ToList().FirstOrDefault(); Guid id = technology.Id; - bool result = await this.TechnologyRepository.DoesTechnologyExist(id); + bool result = await this.TechnologyRepository.DoesTechnologyExistAsync(id); - Assert.IsTrue(result, "DoesTechnologyExist returns flase hwen technology exists"); + Assert.IsTrue(result, "DoesTechnologyExistAsync returns flase hwen technology exists"); }).GetAwaiter().GetResult(); } @@ -99,9 +99,9 @@ namespace DevHive.Data.Tests { Guid id = new Guid(); - bool result = await this.TechnologyRepository.DoesTechnologyExist(id); + bool result = await this.TechnologyRepository.DoesTechnologyExistAsync(id); - Assert.IsFalse(result, "DoesTechnologyExist returns true when technology does not exist"); + Assert.IsFalse(result, "DoesTechnologyExistAsync returns true when technology does not exist"); }).GetAwaiter().GetResult(); } #endregion diff --git a/src/DevHive.Tests/DevHive.Services.Tests/TechnologyService.Tests.cs b/src/DevHive.Tests/DevHive.Services.Tests/TechnologyService.Tests.cs index 3e26201..acb5e64 100644 --- a/src/DevHive.Tests/DevHive.Services.Tests/TechnologyService.Tests.cs +++ b/src/DevHive.Tests/DevHive.Services.Tests/TechnologyService.Tests.cs @@ -157,7 +157,7 @@ namespace DevHive.Services.Tests Id = id }; - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExist(It.IsAny())).Returns(Task.FromResult(true)); + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(true)); this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExist(It.IsAny())).Returns(Task.FromResult(false)); this.TechnologyRepositoryMock.Setup(p => p.EditAsync(It.IsAny())).Returns(Task.FromResult(shouldPass)); this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(technology); @@ -180,7 +180,7 @@ namespace DevHive.Services.Tests Id = id }; - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExist(It.IsAny())).Returns(Task.FromResult(false)); + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(false)); try { @@ -206,7 +206,7 @@ namespace DevHive.Services.Tests Id = id }; - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExist(It.IsAny())).Returns(Task.FromResult(true)); + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(true)); this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExist(It.IsAny())).Returns(Task.FromResult(true)); try @@ -233,7 +233,7 @@ namespace DevHive.Services.Tests Guid id = new Guid(); Technology technology = new Technology(); - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExist(It.IsAny())).Returns(Task.FromResult(true)); + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(true)); this.TechnologyRepositoryMock.Setup(p => p.GetByIdAsync(It.IsAny())).Returns(Task.FromResult(technology)); this.TechnologyRepositoryMock.Setup(p => p.DeleteAsync(It.IsAny())).Returns(Task.FromResult(shouldPass)); @@ -251,7 +251,7 @@ namespace DevHive.Services.Tests string exceptionMessage = "Technology does not exist!"; Guid id = new Guid(); - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExist(It.IsAny())).Returns(Task.FromResult(false)); + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(false)); try { diff --git a/src/DevHive.Web/Configurations/Extensions/ConfigureDependencyInjection.cs b/src/DevHive.Web/Configurations/Extensions/ConfigureDependencyInjection.cs index 2707d91..cce5174 100644 --- a/src/DevHive.Web/Configurations/Extensions/ConfigureDependencyInjection.cs +++ b/src/DevHive.Web/Configurations/Extensions/ConfigureDependencyInjection.cs @@ -1,3 +1,4 @@ +using DevHive.Data.Models; using DevHive.Data.Repositories; using DevHive.Services.Services; using Microsoft.Extensions.DependencyInjection; @@ -8,17 +9,19 @@ namespace DevHive.Web.Configurations.Extensions { public static void DependencyInjectionConfiguration(this IServiceCollection services) { + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + System.Console.WriteLine(services.Count); } } } \ No newline at end of file diff --git a/src/DevHive.Web/Controllers/TechnologyController.cs b/src/DevHive.Web/Controllers/TechnologyController.cs index 08d4ca8..e02ca3d 100644 --- a/src/DevHive.Web/Controllers/TechnologyController.cs +++ b/src/DevHive.Web/Controllers/TechnologyController.cs @@ -23,9 +23,9 @@ namespace DevHive.Web.Controllers } [HttpPost] - public async Task Create([FromBody] TechnologyWebModel technologyWebModel) + public async Task Create([FromBody] CreateTechnologyWebModel technologyWebModel) { - TechnologyServiceModel technologyServiceModel = this._technologyMapper.Map(technologyWebModel); + CreateTechnologyServiceModel technologyServiceModel = this._technologyMapper.Map(technologyWebModel); bool result = await this._technologyService.Create(technologyServiceModel); @@ -48,7 +48,6 @@ namespace DevHive.Web.Controllers public async Task Update(Guid id, [FromBody] UpdateTechnologyWebModel updateModel) { UpdateTechnologyServiceModel updateTechnologyWebModel = this._technologyMapper.Map(updateModel); - updateTechnologyWebModel.Id = id; bool result = await this._technologyService.UpdateTechnology(updateTechnologyWebModel); diff --git a/src/DevHive.Web/Controllers/UserController.cs b/src/DevHive.Web/Controllers/UserController.cs index ce972a5..8fa07cf 100644 --- a/src/DevHive.Web/Controllers/UserController.cs +++ b/src/DevHive.Web/Controllers/UserController.cs @@ -10,6 +10,10 @@ 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; namespace DevHive.Web.Controllers { @@ -27,6 +31,7 @@ namespace DevHive.Web.Controllers this._userMapper = mapper; } + #region Authentication [HttpPost] [Route("Login")] [AllowAnonymous] @@ -40,7 +45,6 @@ namespace DevHive.Web.Controllers return new OkObjectResult(tokenWebModel); } - //Create [HttpPost] [Route("Register")] [AllowAnonymous] @@ -53,6 +57,9 @@ namespace DevHive.Web.Controllers return new CreatedResult("Register", tokenWebModel); } + #endregion + + #region Create [HttpPost] [Route("AddAFriend")] @@ -63,7 +70,30 @@ namespace DevHive.Web.Controllers new BadRequestResult(); } - //Read + [HttpPost] + [Route("AddLanguageToUser")] + public async Task AddLanguageToUser(Guid userId, [FromBody] LanguageWebModel languageWebModel) + { + LanguageServiceModel languageServiceModel = this._userMapper.Map(languageWebModel); + + return await this._userService.AddLanguageToUser(userId, languageServiceModel) ? + new OkResult() : + new BadRequestResult(); + } + + [HttpPost] + [Route("AddTechnologyToUser")] + public async Task AddTechnologyToUser(Guid userId, [FromBody] TechnologyWebModel technologyWebModel) + { + TechnologyServiceModel technologyServiceModel = this._userMapper.Map(technologyWebModel); + + return await this._userService.AddTechnologyToUser(userId, technologyServiceModel) ? + new OkResult() : + new BadRequestResult(); + } + #endregion + + #region Read [HttpGet] public async Task GetById(Guid id, [FromHeader] string authorization) { @@ -85,8 +115,9 @@ namespace DevHive.Web.Controllers return new OkObjectResult(friend); } + #endregion - //Update + #region Update [HttpPut] public async Task Update(Guid id, [FromBody] UpdateUserWebModel updateModel, [FromHeader] string authorization) { @@ -100,10 +131,10 @@ namespace DevHive.Web.Controllers UserWebModel userWebModel = this._userMapper.Map(userServiceModel); return new AcceptedResult("UpdateUser", userWebModel); - } + #endregion - //Delete + #region Delete [HttpDelete] public async Task Delete(Guid id, [FromHeader] string authorization) { @@ -121,5 +152,29 @@ namespace DevHive.Web.Controllers await this._userService.RemoveFriend(userId, friendId); return new OkResult(); } + + [HttpPost] + [Route("RemoveLanguageFromUser")] + public async Task RemoveLanguageFromUser(Guid userId, [FromBody] LanguageWebModel languageWebModel) + { + LanguageServiceModel languageServiceModel = this._userMapper.Map(languageWebModel); + + return await this._userService.RemoveLanguageFromUser(userId, languageServiceModel) ? + new OkResult() : + new BadRequestResult(); + } + + [HttpPost] + [Route("RemoveTechnologyFromUser")] + public async Task RemoveTechnologyFromUser(Guid userId, [FromBody] TechnologyWebModel technologyWebModel) + { + TechnologyServiceModel technologyServiceModel = this._userMapper.Map(technologyWebModel); + + return await this._userService.RemoveTechnologyFromUser(userId, technologyServiceModel) ? + new OkResult() : + new BadRequestResult(); + } + + #endregion } } diff --git a/src/DevHive.Web/Models/Technology/CreateTechnologyWebModel.cs b/src/DevHive.Web/Models/Technology/CreateTechnologyWebModel.cs new file mode 100644 index 0000000..27da4a0 --- /dev/null +++ b/src/DevHive.Web/Models/Technology/CreateTechnologyWebModel.cs @@ -0,0 +1,7 @@ +namespace DevHive.Web.Models.Technology +{ + public class CreateTechnologyWebModel : TechnologyWebModel + { + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/src/DevHive.Web/Models/Technology/TechnologyWebModel.cs b/src/DevHive.Web/Models/Technology/TechnologyWebModel.cs index cb6b998..05f7af8 100644 --- a/src/DevHive.Web/Models/Technology/TechnologyWebModel.cs +++ b/src/DevHive.Web/Models/Technology/TechnologyWebModel.cs @@ -1,7 +1,9 @@ +using System; + namespace DevHive.Web.Models.Technology { public class TechnologyWebModel { - public string Name { get; set; } + public Guid Id { get; set; } } } \ No newline at end of file diff --git a/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs b/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs index b94496e..d395c9f 100644 --- a/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs +++ b/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs @@ -2,8 +2,8 @@ using System; namespace DevHive.Web.Models.Technology { - public class UpdateTechnologyWebModel : TechnologyWebModel + public class UpdateTechnologyWebModel { - public Guid Id { get; set; } + public string Name { get; set; } } } \ No newline at end of file diff --git a/src/DevHive.Web/Program.cs b/src/DevHive.Web/Program.cs index 9cbe12a..6982da9 100644 --- a/src/DevHive.Web/Program.cs +++ b/src/DevHive.Web/Program.cs @@ -5,7 +5,7 @@ namespace DevHive.Web { public class Program { - private const int HTTPS_PORT = 5000; + private const int HTTP_PORT = 5000; public static void Main(string[] args) { @@ -16,7 +16,7 @@ namespace DevHive.Web Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { - webBuilder.ConfigureKestrel(opt => opt.ListenLocalhost(HTTPS_PORT)); + webBuilder.ConfigureKestrel(opt => opt.ListenLocalhost(HTTP_PORT)); webBuilder.UseStartup(); }); } -- cgit v1.2.3 From 2948a92492141f4d807449191901f499530d8465 Mon Sep 17 00:00:00 2001 From: transtrike Date: Thu, 14 Jan 2021 00:12:48 +0200 Subject: Fixed issues in Language & Technology and their interactions with User --- src/DevHive.Data/Interfaces/ILanguageRepository.cs | 3 +- .../Interfaces/ITechnologyRepository.cs | 5 +- src/DevHive.Data/Interfaces/IUserRepository.cs | 11 +-- .../Repositories/LanguageRepository.cs | 10 ++- .../Repositories/TechnologyRepository.cs | 10 ++- src/DevHive.Data/Repositories/UserRepository.cs | 5 ++ src/DevHive.Services/Interfaces/IUserService.cs | 6 +- .../Technology/CreateTechnologyServiceModel.cs | 4 +- .../Technology/UpdateTechnologyServiceModel.cs | 7 +- src/DevHive.Services/Services/TechnologyService.cs | 6 +- src/DevHive.Services/Services/UserService.cs | 100 ++++++++++++--------- .../TechnologyRepository.Tests.cs | 14 +-- .../TechnologyServices.Tests.cs | 8 +- src/DevHive.Web/Controllers/UserController.cs | 1 - .../Models/Language/UpdateLanguageWebModel.cs | 5 +- .../Models/Technology/CreateTechnologyWebModel.cs | 4 +- .../Models/Technology/UpdateTechnologyWebModel.cs | 4 +- 17 files changed, 120 insertions(+), 83 deletions(-) (limited to 'src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs') diff --git a/src/DevHive.Data/Interfaces/ILanguageRepository.cs b/src/DevHive.Data/Interfaces/ILanguageRepository.cs index 40dd461..0612116 100644 --- a/src/DevHive.Data/Interfaces/ILanguageRepository.cs +++ b/src/DevHive.Data/Interfaces/ILanguageRepository.cs @@ -9,5 +9,6 @@ namespace DevHive.Data.Interfaces { Task DoesLanguageExistAsync(Guid id); Task DoesLanguageNameExistAsync(string languageName); + Task GetByNameAsync(string name); } -} \ No newline at end of file +} diff --git a/src/DevHive.Data/Interfaces/ITechnologyRepository.cs b/src/DevHive.Data/Interfaces/ITechnologyRepository.cs index 7c126a4..d0de096 100644 --- a/src/DevHive.Data/Interfaces/ITechnologyRepository.cs +++ b/src/DevHive.Data/Interfaces/ITechnologyRepository.cs @@ -8,6 +8,7 @@ namespace DevHive.Data.Interfaces public interface ITechnologyRepository : IRepository { Task DoesTechnologyExistAsync(Guid id); - Task DoesTechnologyNameExist(string technologyName); + Task DoesTechnologyNameExistAsync(string technologyName); + Task GetByNameAsync(string name); } -} \ No newline at end of file +} diff --git a/src/DevHive.Data/Interfaces/IUserRepository.cs b/src/DevHive.Data/Interfaces/IUserRepository.cs index 8ee5054..bca8f71 100644 --- a/src/DevHive.Data/Interfaces/IUserRepository.cs +++ b/src/DevHive.Data/Interfaces/IUserRepository.cs @@ -11,7 +11,7 @@ namespace DevHive.Data.Interfaces Task AddFriendAsync(User user, User friend); Task AddLanguageToUserAsync(User user, Language language); Task AddTechnologyToUserAsync(User user, Technology technology); - + Task GetByUsername(string username); Language GetUserLanguage(User user, Language language); IList GetUserLanguages(User user); @@ -26,12 +26,13 @@ namespace DevHive.Data.Interfaces Task RemoveLanguageFromUserAsync(User user, Language language); Task RemoveTechnologyFromUserAsync(User user, Technology technology); - bool DoesUserHaveThisLanguage(User user, Language language); - bool DoesUserHaveThisUsername(Guid id, string username); - bool DoesUserHaveFriends(User user); Task DoesEmailExistAsync(string email); Task DoesUserExistAsync(Guid id); Task DoesUserHaveThisFriendAsync(Guid userId, Guid friendId); Task DoesUsernameExistAsync(string username); + bool DoesUserHaveThisLanguage(User user, Language language); + bool DoesUserHaveThisUsername(Guid id, string username); + bool DoesUserHaveFriends(User user); + bool DoesUserHaveThisTechnology(User user, Technology technology); } -} \ No newline at end of file +} diff --git a/src/DevHive.Data/Repositories/LanguageRepository.cs b/src/DevHive.Data/Repositories/LanguageRepository.cs index c30d3bb..b867a93 100644 --- a/src/DevHive.Data/Repositories/LanguageRepository.cs +++ b/src/DevHive.Data/Repositories/LanguageRepository.cs @@ -36,6 +36,12 @@ namespace DevHive.Data.Repositories .Set() .FindAsync(id); } + + public async Task GetByNameAsync(string languageName) + { + return await this._context.Languages + .FirstOrDefaultAsync(x => x.Name == languageName); + } #endregion #region Update @@ -62,7 +68,7 @@ namespace DevHive.Data.Repositories } #endregion - #region Validations + #region Validations public async Task DoesLanguageNameExistAsync(string languageName) { @@ -77,4 +83,4 @@ namespace DevHive.Data.Repositories } #endregion } -} \ No newline at end of file +} diff --git a/src/DevHive.Data/Repositories/TechnologyRepository.cs b/src/DevHive.Data/Repositories/TechnologyRepository.cs index a8208b6..d81433c 100644 --- a/src/DevHive.Data/Repositories/TechnologyRepository.cs +++ b/src/DevHive.Data/Repositories/TechnologyRepository.cs @@ -27,6 +27,12 @@ namespace DevHive.Data.Repositories return await RepositoryMethods.SaveChangesAsync(this._context); } + + public async Task GetByNameAsync(string technologyName) + { + return await this._context.Technologies + .FirstOrDefaultAsync(x => x.Name == technologyName); + } #endregion #region Read @@ -65,7 +71,7 @@ namespace DevHive.Data.Repositories #region Validations - public async Task DoesTechnologyNameExist(string technologyName) + public async Task DoesTechnologyNameExistAsync(string technologyName) { return await this._context .Set() @@ -80,4 +86,4 @@ namespace DevHive.Data.Repositories } #endregion } -} \ No newline at end of file +} diff --git a/src/DevHive.Data/Repositories/UserRepository.cs b/src/DevHive.Data/Repositories/UserRepository.cs index 1f29bb5..b4deacd 100644 --- a/src/DevHive.Data/Repositories/UserRepository.cs +++ b/src/DevHive.Data/Repositories/UserRepository.cs @@ -226,6 +226,11 @@ namespace DevHive.Data.Repositories { return user.Langauges.Contains(language); } + + public bool DoesUserHaveThisTechnology(User user, Technology technology) + { + return user.Technologies.Contains(technology); + } #endregion } } diff --git a/src/DevHive.Services/Interfaces/IUserService.cs b/src/DevHive.Services/Interfaces/IUserService.cs index ba53563..5ef141f 100644 --- a/src/DevHive.Services/Interfaces/IUserService.cs +++ b/src/DevHive.Services/Interfaces/IUserService.cs @@ -20,12 +20,12 @@ namespace DevHive.Services.Interfaces Task GetUserById(Guid id); Task UpdateUser(UpdateUserServiceModel updateModel); - + Task DeleteUser(Guid id); Task RemoveFriend(Guid userId, Guid friendId); Task RemoveLanguageFromUser(Guid userId, LanguageServiceModel languageServiceModel); Task RemoveTechnologyFromUser(Guid userId, TechnologyServiceModel technologyServiceModel); - + Task ValidJWT(Guid id, string rawTokenData); } -} \ No newline at end of file +} diff --git a/src/DevHive.Services/Models/Technology/CreateTechnologyServiceModel.cs b/src/DevHive.Services/Models/Technology/CreateTechnologyServiceModel.cs index ca848f9..a31d160 100644 --- a/src/DevHive.Services/Models/Technology/CreateTechnologyServiceModel.cs +++ b/src/DevHive.Services/Models/Technology/CreateTechnologyServiceModel.cs @@ -2,8 +2,8 @@ using System; namespace DevHive.Services.Models.Technology { - public class CreateTechnologyServiceModel : TechnologyServiceModel + public class CreateTechnologyServiceModel { public string Name { get; set; } } -} \ No newline at end of file +} diff --git a/src/DevHive.Services/Models/Technology/UpdateTechnologyServiceModel.cs b/src/DevHive.Services/Models/Technology/UpdateTechnologyServiceModel.cs index bfeae51..a18e286 100644 --- a/src/DevHive.Services/Models/Technology/UpdateTechnologyServiceModel.cs +++ b/src/DevHive.Services/Models/Technology/UpdateTechnologyServiceModel.cs @@ -2,5 +2,8 @@ using System; namespace DevHive.Services.Models.Technology { - public class UpdateTechnologyServiceModel : CreateTechnologyServiceModel {} -} \ No newline at end of file + public class UpdateTechnologyServiceModel : TechnologyServiceModel + { + public string Name { get; set; } + } +} diff --git a/src/DevHive.Services/Services/TechnologyService.cs b/src/DevHive.Services/Services/TechnologyService.cs index cb8fdfc..2b24ed6 100644 --- a/src/DevHive.Services/Services/TechnologyService.cs +++ b/src/DevHive.Services/Services/TechnologyService.cs @@ -23,7 +23,7 @@ namespace DevHive.Services.Services public async Task Create(CreateTechnologyServiceModel technologyServiceModel) { - if (await this._technologyRepository.DoesTechnologyNameExist(technologyServiceModel.Name)) + if (await this._technologyRepository.DoesTechnologyNameExistAsync(technologyServiceModel.Name)) throw new ArgumentException("Technology already exists!"); Technology technology = this._technologyMapper.Map(technologyServiceModel); @@ -53,7 +53,7 @@ namespace DevHive.Services.Services if (!await this._technologyRepository.DoesTechnologyExistAsync(updateTechnologyServiceModel.Id)) throw new ArgumentException("Technology does not exist!"); - if (await this._technologyRepository.DoesTechnologyNameExist(updateTechnologyServiceModel.Name)) + if (await this._technologyRepository.DoesTechnologyNameExistAsync(updateTechnologyServiceModel.Name)) throw new ArgumentException("Technology name already exists!"); Technology technology = this._technologyMapper.Map(updateTechnologyServiceModel); @@ -77,4 +77,4 @@ namespace DevHive.Services.Services } #endregion } -} \ No newline at end of file +} diff --git a/src/DevHive.Services/Services/UserService.cs b/src/DevHive.Services/Services/UserService.cs index 6a6662d..012ec1b 100644 --- a/src/DevHive.Services/Services/UserService.cs +++ b/src/DevHive.Services/Services/UserService.cs @@ -111,19 +111,42 @@ namespace DevHive.Services.Services public async Task AddLanguageToUser(Guid userId, LanguageServiceModel languageServiceModel) { - Tuple tuple = await ValidateUserAndLanguage(userId, languageServiceModel); + bool userExists = await this._userRepository.DoesUserExistAsync(userId); + bool languageExists = await this._languageRepository.DoesLanguageExistAsync(languageServiceModel.Id); + + if (!userExists) + throw new ArgumentException("User does not exist!"); + + if (!languageExists) + throw new ArgumentException("Language does noy exist!"); + + User user = await this._userRepository.GetByIdAsync(userId); + Language language = await this._languageRepository.GetByIdAsync(languageServiceModel.Id); - if (this._userRepository.DoesUserHaveThisLanguage(tuple.Item1, tuple.Item2)) + if (this._userRepository.DoesUserHaveThisLanguage(user, language)) throw new ArgumentException("User already has this language!"); - return await this._userRepository.AddLanguageToUserAsync(tuple.Item1, tuple.Item2); + return await this._userRepository.AddLanguageToUserAsync(user, language); } public async Task AddTechnologyToUser(Guid userId, TechnologyServiceModel technologyServiceModel) { - Tuple tuple = await ValidateUserAndTechnology(userId, technologyServiceModel); + bool userExists = await this._userRepository.DoesUserExistAsync(userId); + bool technologyExists = await this._technologyRepository.DoesTechnologyExistAsync(technologyServiceModel.Id); + + if (!userExists) + throw new ArgumentException("User does not exist!"); + + if (!technologyExists) + throw new ArgumentException("Technology does not exist!"); + + Technology technology = await this._technologyRepository.GetByIdAsync(technologyServiceModel.Id); + User user = await this._userRepository.GetByIdAsync(userId); + + if (this._userRepository.DoesUserHaveThisTechnology(user, technology)) + throw new ArgumentException("User already has this language!"); - return await this._userRepository.AddTechnologyToUserAsync(tuple.Item1, tuple.Item2); + return await this._userRepository.AddTechnologyToUserAsync(user, technology); } #endregion @@ -204,19 +227,42 @@ namespace DevHive.Services.Services public async Task RemoveLanguageFromUser(Guid userId, LanguageServiceModel languageServiceModel) { - Tuple tuple = await ValidateUserAndLanguage(userId, languageServiceModel); + bool userExists = await this._userRepository.DoesUserExistAsync(userId); + bool languageExists = await this._languageRepository.DoesLanguageExistAsync(languageServiceModel.Id); - if (!this._userRepository.DoesUserHaveThisLanguage(tuple.Item1, tuple.Item2)) + if (!userExists) + throw new ArgumentException("User does not exist!"); + + if (!languageExists) + throw new ArgumentException("Language does not exist!"); + + User user = await this._userRepository.GetByIdAsync(userId); + Language language = await this._languageRepository.GetByIdAsync(languageServiceModel.Id); + + if (!this._userRepository.DoesUserHaveThisLanguage(user, language)) throw new ArgumentException("User does not have this language!"); - return await this._userRepository.RemoveLanguageFromUserAsync(tuple.Item1, tuple.Item2); + return await this._userRepository.RemoveLanguageFromUserAsync(user, language); } public async Task RemoveTechnologyFromUser(Guid userId, TechnologyServiceModel technologyServiceModel) { - Tuple tuple = await ValidateUserAndTechnology(userId, technologyServiceModel); + bool userExists = await this._userRepository.DoesUserExistAsync(userId); + bool technologyExists = await this._technologyRepository.DoesTechnologyExistAsync(technologyServiceModel.Id); + + if (!userExists) + throw new ArgumentException("User does not exist!"); - return await this._userRepository.RemoveTechnologyFromUserAsync(tuple.Item1, tuple.Item2); + if (!technologyExists) + throw new ArgumentException("Language does not exist!"); + + User user = await this._userRepository.GetByIdAsync(userId); + Technology technology = await this._technologyRepository.GetByIdAsync(technologyServiceModel.Id); + + if (!this._userRepository.DoesUserHaveThisTechnology(user, technology)) + throw new ArgumentException("User does not have this technology!"); + + return await this._userRepository.RemoveTechnologyFromUserAsync(user, technology); } #endregion @@ -298,40 +344,6 @@ namespace DevHive.Services.Services { return string.Join(string.Empty, SHA512.HashData(Encoding.ASCII.GetBytes(password))); } - - private async Task> ValidateUserAndLanguage(Guid userId, LanguageServiceModel languageServiceModel) - { - bool userExists = await this._userRepository.DoesUserExistAsync(userId); - bool languageExists = await this._languageRepository.DoesLanguageExistAsync(languageServiceModel.Id); - - if (!userExists) - throw new ArgumentException("User does not exist!"); - - if (!languageExists) - throw new ArgumentException("Language does not exist!"); - - User user = await this._userRepository.GetByIdAsync(userId); - Language language = await this._languageRepository.GetByIdAsync(languageServiceModel.Id); - - return new Tuple(user, language); - } - - private async Task> ValidateUserAndTechnology(Guid userId, TechnologyServiceModel technologyServiceModel) - { - bool userExists = await this._userRepository.DoesUserExistAsync(userId); - bool technologyExists = await this._technologyRepository.DoesTechnologyExistAsync(technologyServiceModel.Id); - - if (!userExists) - throw new ArgumentException("User does not exist!"); - - if (!technologyExists) - throw new ArgumentException("Language does not exist!"); - - User user = await this._userRepository.GetByIdAsync(userId); - Technology technology = await this._technologyRepository.GetByIdAsync(technologyServiceModel.Id); - - return new Tuple(user, technology); - } #endregion } } diff --git a/src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs b/src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs index 54cf7c0..6ff5fa2 100644 --- a/src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs +++ b/src/DevHive.Tests/DevHive.Data.Tests/TechnologyRepository.Tests.cs @@ -106,7 +106,7 @@ namespace DevHive.Data.Tests } #endregion - #region DoesTechnologyNameExist + #region DoesTechnologyNameExistAsync [Test] public void DoesTechnologyNameExist_ReturnsTrue_IfTechnologyExists() { @@ -114,20 +114,20 @@ namespace DevHive.Data.Tests { AddEntity(); - bool result = await this.TechnologyRepository.DoesTechnologyNameExist(TECHNOLOGY_NAME); + bool result = await this.TechnologyRepository.DoesTechnologyNameExistAsync(TECHNOLOGY_NAME); Assert.IsTrue(result, "DoesTechnologyNameExists returns true when technology name does not exist"); }).GetAwaiter().GetResult(); - } + } [Test] public void DoesTechnologyNameExist_ReturnsFalse_IfTechnologyDoesNotExists() { Task.Run(async () => { - bool result = await this.TechnologyRepository.DoesTechnologyNameExist(TECHNOLOGY_NAME); + bool result = await this.TechnologyRepository.DoesTechnologyNameExistAsync(TECHNOLOGY_NAME); - Assert.False(result, "DoesTechnologyNameExist returns true when technology name does not exist"); + Assert.False(result, "DoesTechnologyNameExistAsync returns true when technology name does not exist"); }).GetAwaiter().GetResult(); } #endregion @@ -162,7 +162,7 @@ namespace DevHive.Data.Tests #region DeleteAsync [Test] public void DeleteAsync_ReturnsTrue_IfDeletionIsSuccesfull() - { + { Task.Run(async () => { AddEntity(); @@ -173,7 +173,7 @@ namespace DevHive.Data.Tests Assert.IsTrue(result, "DeleteAsync returns false when deletion is successfull"); }).GetAwaiter().GetResult(); - } + } #endregion #region HelperMethods diff --git a/src/DevHive.Tests/DevHive.Services.Tests/TechnologyServices.Tests.cs b/src/DevHive.Tests/DevHive.Services.Tests/TechnologyServices.Tests.cs index f2232a8..e56c508 100644 --- a/src/DevHive.Tests/DevHive.Services.Tests/TechnologyServices.Tests.cs +++ b/src/DevHive.Tests/DevHive.Services.Tests/TechnologyServices.Tests.cs @@ -45,7 +45,7 @@ namespace DevHive.Services.Tests Name = technologyName }; - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExist(It.IsAny())).Returns(Task.FromResult(false)); + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); this.TechnologyRepositoryMock.Setup(p => p.AddAsync(It.IsAny())).Returns(Task.FromResult(shouldFail)); this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(technology); @@ -72,7 +72,7 @@ namespace DevHive.Services.Tests Name = technologyName }; - this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExist(It.IsAny())).Returns(Task.FromResult(true)); + this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); try { @@ -158,7 +158,7 @@ namespace DevHive.Services.Tests // }; // this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - // this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExist(It.IsAny())).Returns(Task.FromResult(false)); + // this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExistAsync(It.IsAny())).Returns(Task.FromResult(false)); // this.TechnologyRepositoryMock.Setup(p => p.EditAsync(It.IsAny())).Returns(Task.FromResult(shouldPass)); // this.MapperMock.Setup(p => p.Map(It.IsAny())).Returns(technology); @@ -207,7 +207,7 @@ namespace DevHive.Services.Tests // }; // this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyExistAsync(It.IsAny())).Returns(Task.FromResult(true)); - // this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExist(It.IsAny())).Returns(Task.FromResult(true)); + // this.TechnologyRepositoryMock.Setup(p => p.DoesTechnologyNameExistAsync(It.IsAny())).Returns(Task.FromResult(true)); // try // { diff --git a/src/DevHive.Web/Controllers/UserController.cs b/src/DevHive.Web/Controllers/UserController.cs index 26271b2..5ba382f 100644 --- a/src/DevHive.Web/Controllers/UserController.cs +++ b/src/DevHive.Web/Controllers/UserController.cs @@ -176,7 +176,6 @@ namespace DevHive.Web.Controllers new OkResult() : new BadRequestResult(); } - #endregion } } diff --git a/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs b/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs index deca0fc..ed3b37c 100644 --- a/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs +++ b/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs @@ -2,5 +2,8 @@ using System; namespace DevHive.Web.Models.Language { - public class UpdateLanguageWebModel : CreateLanguageWebModel { } + public class UpdateLanguageWebModel : LanguageWebModel + { + public string Name { get; set; } + } } diff --git a/src/DevHive.Web/Models/Technology/CreateTechnologyWebModel.cs b/src/DevHive.Web/Models/Technology/CreateTechnologyWebModel.cs index 27da4a0..13029ee 100644 --- a/src/DevHive.Web/Models/Technology/CreateTechnologyWebModel.cs +++ b/src/DevHive.Web/Models/Technology/CreateTechnologyWebModel.cs @@ -1,7 +1,7 @@ namespace DevHive.Web.Models.Technology { - public class CreateTechnologyWebModel : TechnologyWebModel + public class CreateTechnologyWebModel { public string Name { get; set; } } -} \ No newline at end of file +} diff --git a/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs b/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs index d395c9f..8bf48bf 100644 --- a/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs +++ b/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs @@ -2,8 +2,8 @@ using System; namespace DevHive.Web.Models.Technology { - public class UpdateTechnologyWebModel + public class UpdateTechnologyWebModel : TechnologyWebModel { public string Name { get; set; } } -} \ No newline at end of file +} -- cgit v1.2.3 From c43a7665b9febe890eb6dac143b62c36464cc94d Mon Sep 17 00:00:00 2001 From: transtrike Date: Sun, 17 Jan 2021 12:24:17 +0200 Subject: Moved Lang&Tech CRUD to Update in User Layer --- .../Interfaces/ILanguageService.cs | 2 +- .../Interfaces/ITechnologyService.cs | 2 +- src/DevHive.Services/Interfaces/IUserService.cs | 2 +- .../Models/Identity/User/UserServiceModel.cs | 5 +- src/DevHive.Services/Services/LanguageService.cs | 5 +- src/DevHive.Services/Services/TechnologyService.cs | 5 +- src/DevHive.Services/Services/UserService.cs | 8 +-- src/DevHive.Web/Controllers/LanguageController.cs | 3 +- .../Controllers/TechnologyController.cs | 5 +- src/DevHive.Web/Controllers/UserController.cs | 70 +--------------------- .../Models/Identity/User/FriendWebModel.cs | 7 +++ .../Models/Identity/User/UpdateUserWebModel.cs | 9 +++ .../Models/Identity/User/UserWebModel.cs | 4 +- .../Models/Language/UpdateLanguageWebModel.cs | 2 +- .../Models/Technology/UpdateTechnologyWebModel.cs | 2 +- 15 files changed, 44 insertions(+), 87 deletions(-) create mode 100644 src/DevHive.Web/Models/Identity/User/FriendWebModel.cs (limited to 'src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs') diff --git a/src/DevHive.Services/Interfaces/ILanguageService.cs b/src/DevHive.Services/Interfaces/ILanguageService.cs index eb45a8d..08b3812 100644 --- a/src/DevHive.Services/Interfaces/ILanguageService.cs +++ b/src/DevHive.Services/Interfaces/ILanguageService.cs @@ -10,7 +10,7 @@ namespace DevHive.Services.Interfaces Task GetLanguageById(Guid languageId); - Task UpdateLanguage(Guid languageId, UpdateLanguageServiceModel languageServiceModel); + Task UpdateLanguage(UpdateLanguageServiceModel languageServiceModel); Task DeleteLanguage(Guid languageId); } diff --git a/src/DevHive.Services/Interfaces/ITechnologyService.cs b/src/DevHive.Services/Interfaces/ITechnologyService.cs index 0797078..9e1e955 100644 --- a/src/DevHive.Services/Interfaces/ITechnologyService.cs +++ b/src/DevHive.Services/Interfaces/ITechnologyService.cs @@ -10,7 +10,7 @@ namespace DevHive.Services.Interfaces Task GetTechnologyById(Guid id); - Task UpdateTechnology(Guid technologyId, UpdateTechnologyServiceModel updateTechnologyServiceModel); + Task UpdateTechnology(UpdateTechnologyServiceModel updateTechnologyServiceModel); Task DeleteTechnology(Guid id); } diff --git a/src/DevHive.Services/Interfaces/IUserService.cs b/src/DevHive.Services/Interfaces/IUserService.cs index 5ef141f..0f834e9 100644 --- a/src/DevHive.Services/Interfaces/IUserService.cs +++ b/src/DevHive.Services/Interfaces/IUserService.cs @@ -16,7 +16,7 @@ namespace DevHive.Services.Interfaces Task AddLanguageToUser(Guid userId, LanguageServiceModel languageServiceModel); Task AddTechnologyToUser(Guid userId, TechnologyServiceModel technologyServiceModel); - Task GetFriendById(Guid friendId); + Task GetFriend(string username); Task GetUserById(Guid id); Task UpdateUser(UpdateUserServiceModel updateModel); diff --git a/src/DevHive.Services/Models/Identity/User/UserServiceModel.cs b/src/DevHive.Services/Models/Identity/User/UserServiceModel.cs index 8825f50..ecf8c42 100644 --- a/src/DevHive.Services/Models/Identity/User/UserServiceModel.cs +++ b/src/DevHive.Services/Models/Identity/User/UserServiceModel.cs @@ -8,8 +8,11 @@ namespace DevHive.Services.Models.Identity.User public class UserServiceModel : BaseUserServiceModel { public IList Roles { get; set; } = new List(); + public IList Friends { get; set; } = new List(); + public IList Languages { get; set; } = new List(); - public IList TechnologyServiceModels { get; set; } = new List(); + + public IList Technologies { get; set; } = new List(); } } diff --git a/src/DevHive.Services/Services/LanguageService.cs b/src/DevHive.Services/Services/LanguageService.cs index be035c2..5b697cd 100644 --- a/src/DevHive.Services/Services/LanguageService.cs +++ b/src/DevHive.Services/Services/LanguageService.cs @@ -48,9 +48,9 @@ namespace DevHive.Services.Services #region Update - public async Task UpdateLanguage(Guid languageId, UpdateLanguageServiceModel languageServiceModel) + public async Task UpdateLanguage(UpdateLanguageServiceModel languageServiceModel) { - bool langExists = await this._languageRepository.DoesLanguageExistAsync(languageId); + bool langExists = await this._languageRepository.DoesLanguageExistAsync(languageServiceModel.Id); bool newLangNameExists = await this._languageRepository.DoesLanguageNameExistAsync(languageServiceModel.Name); if (!langExists) @@ -59,7 +59,6 @@ namespace DevHive.Services.Services if (newLangNameExists) throw new ArgumentException("This name is already in our datbase!"); - languageServiceModel.Id = languageId; Language lang = this._languageMapper.Map(languageServiceModel); return await this._languageRepository.EditAsync(lang); } diff --git a/src/DevHive.Services/Services/TechnologyService.cs b/src/DevHive.Services/Services/TechnologyService.cs index d8b7262..c088281 100644 --- a/src/DevHive.Services/Services/TechnologyService.cs +++ b/src/DevHive.Services/Services/TechnologyService.cs @@ -48,15 +48,14 @@ namespace DevHive.Services.Services #region Update - public async Task UpdateTechnology(Guid technologyId, UpdateTechnologyServiceModel updateTechnologyServiceModel) + public async Task UpdateTechnology(UpdateTechnologyServiceModel updateTechnologyServiceModel) { - if (!await this._technologyRepository.DoesTechnologyExistAsync(technologyId)) + if (!await this._technologyRepository.DoesTechnologyExistAsync(updateTechnologyServiceModel.Id)) throw new ArgumentException("Technology does not exist!"); if (await this._technologyRepository.DoesTechnologyNameExistAsync(updateTechnologyServiceModel.Name)) throw new ArgumentException("Technology name already exists!"); - updateTechnologyServiceModel.Id = technologyId; Technology technology = this._technologyMapper.Map(updateTechnologyServiceModel); bool result = await this._technologyRepository.EditAsync(technology); diff --git a/src/DevHive.Services/Services/UserService.cs b/src/DevHive.Services/Services/UserService.cs index 37dbc7b..d9e87e0 100644 --- a/src/DevHive.Services/Services/UserService.cs +++ b/src/DevHive.Services/Services/UserService.cs @@ -160,12 +160,12 @@ namespace DevHive.Services.Services return this._userMapper.Map(user); } - public async Task GetFriendById(Guid friendId) + public async Task GetFriend(string username) { - if (!await _userRepository.DoesUserExistAsync(friendId)) - throw new ArgumentException("User does not exist!"); + User friend = await this._userRepository.GetByUsernameAsync(username); - User friend = await this._userRepository.GetByIdAsync(friendId); + if (default(User) == friend) + throw new ArgumentException("User does not exist!"); return this._userMapper.Map(friend); } diff --git a/src/DevHive.Web/Controllers/LanguageController.cs b/src/DevHive.Web/Controllers/LanguageController.cs index 5202f16..c503a47 100644 --- a/src/DevHive.Web/Controllers/LanguageController.cs +++ b/src/DevHive.Web/Controllers/LanguageController.cs @@ -47,8 +47,9 @@ namespace DevHive.Web.Controllers public async Task Update(Guid languageId, [FromBody] UpdateLanguageWebModel updateModel) { UpdateLanguageServiceModel updatelanguageServiceModel = this._languageMapper.Map(updateModel); + updatelanguageServiceModel.Id = languageId; - bool result = await this._languageService.UpdateLanguage(languageId, updatelanguageServiceModel); + bool result = await this._languageService.UpdateLanguage(updatelanguageServiceModel); if (!result) return new BadRequestObjectResult("Could not update Language"); diff --git a/src/DevHive.Web/Controllers/TechnologyController.cs b/src/DevHive.Web/Controllers/TechnologyController.cs index 3be3b8a..7f2f400 100644 --- a/src/DevHive.Web/Controllers/TechnologyController.cs +++ b/src/DevHive.Web/Controllers/TechnologyController.cs @@ -46,9 +46,10 @@ namespace DevHive.Web.Controllers [HttpPut] public async Task Update(Guid technologyId, [FromBody] UpdateTechnologyWebModel updateModel) { - UpdateTechnologyServiceModel updateTechnologyWebModel = this._technologyMapper.Map(updateModel); + UpdateTechnologyServiceModel updateTechnologyServiceModel = this._technologyMapper.Map(updateModel); + updateTechnologyServiceModel.Id = technologyId; - bool result = await this._technologyService.UpdateTechnology(technologyId, updateTechnologyWebModel); + bool result = await this._technologyService.UpdateTechnology(updateTechnologyServiceModel); if (!result) return new BadRequestObjectResult("Could not update Technology"); diff --git a/src/DevHive.Web/Controllers/UserController.cs b/src/DevHive.Web/Controllers/UserController.cs index b33c3b9..8d48705 100644 --- a/src/DevHive.Web/Controllers/UserController.cs +++ b/src/DevHive.Web/Controllers/UserController.cs @@ -57,40 +57,6 @@ namespace DevHive.Web.Controllers } #endregion - #region Create - - [HttpPost] - [Route("AddAFriend")] - public async Task AddAFriend(Guid userId, [FromBody] IdModel friendIdModel) - { - return await this._userService.AddFriend(userId, friendIdModel.Id) ? - new OkResult() : - new BadRequestResult(); - } - - [HttpPost] - [Route("AddLanguageToUser")] - public async Task AddLanguageToUser(Guid userId, [FromBody] LanguageWebModel languageWebModel) - { - LanguageServiceModel languageServiceModel = this._userMapper.Map(languageWebModel); - - return await this._userService.AddLanguageToUser(userId, languageServiceModel) ? - new OkResult() : - new BadRequestResult(); - } - - [HttpPost] - [Route("AddTechnologyToUser")] - public async Task AddTechnologyToUser(Guid userId, [FromBody] TechnologyWebModel technologyWebModel) - { - TechnologyServiceModel technologyServiceModel = this._userMapper.Map(technologyWebModel); - - return await this._userService.AddTechnologyToUser(userId, technologyServiceModel) ? - new OkResult() : - new BadRequestResult(); - } - #endregion - #region Read [HttpGet] @@ -107,9 +73,10 @@ namespace DevHive.Web.Controllers [HttpGet] [Route("GetAFriend")] - public async Task GetAFriend(Guid friendId) + [AllowAnonymous] + public async Task GetAFriend(string username) { - UserServiceModel friendServiceModel = await this._userService.GetFriendById(friendId); + UserServiceModel friendServiceModel = await this._userService.GetFriend(username); UserWebModel friend = this._userMapper.Map(friendServiceModel); return new OkObjectResult(friend); @@ -134,7 +101,6 @@ namespace DevHive.Web.Controllers #endregion #region Delete - [HttpDelete] public async Task Delete(Guid id, [FromHeader] string authorization) { @@ -144,36 +110,6 @@ namespace DevHive.Web.Controllers await this._userService.DeleteUser(id); return new OkResult(); } - - [HttpDelete] - [Route("RemoveAFriend")] - public async Task RemoveAFriend(Guid userId, Guid friendId) - { - await this._userService.RemoveFriend(userId, friendId); - return new OkResult(); - } - - [HttpDelete] - [Route("RemoveLanguageFromUser")] - public async Task RemoveLanguageFromUser(Guid userId, [FromBody] LanguageWebModel languageWebModel) - { - LanguageServiceModel languageServiceModel = this._userMapper.Map(languageWebModel); - - return await this._userService.RemoveLanguageFromUser(userId, languageServiceModel) ? - new OkResult() : - new BadRequestResult(); - } - - [HttpDelete] - [Route("RemoveTechnologyFromUser")] - public async Task RemoveTechnologyFromUser(Guid userId, [FromBody] TechnologyWebModel technologyWebModel) - { - TechnologyServiceModel technologyServiceModel = this._userMapper.Map(technologyWebModel); - - return await this._userService.RemoveTechnologyFromUser(userId, technologyServiceModel) ? - new OkResult() : - new BadRequestResult(); - } #endregion } } diff --git a/src/DevHive.Web/Models/Identity/User/FriendWebModel.cs b/src/DevHive.Web/Models/Identity/User/FriendWebModel.cs new file mode 100644 index 0000000..681529a --- /dev/null +++ b/src/DevHive.Web/Models/Identity/User/FriendWebModel.cs @@ -0,0 +1,7 @@ +namespace DevHive.Web.Models.Identity.User +{ + public class FriendWebModel + { + public string Username { get; set; } + } +} diff --git a/src/DevHive.Web/Models/Identity/User/UpdateUserWebModel.cs b/src/DevHive.Web/Models/Identity/User/UpdateUserWebModel.cs index 9e41eb6..782c558 100644 --- a/src/DevHive.Web/Models/Identity/User/UpdateUserWebModel.cs +++ b/src/DevHive.Web/Models/Identity/User/UpdateUserWebModel.cs @@ -1,5 +1,8 @@ +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using DevHive.Web.Models.Identity.Validation; +using DevHive.Web.Models.Language; +using DevHive.Web.Models.Technology; namespace DevHive.Web.Models.Identity.User { @@ -8,5 +11,11 @@ namespace DevHive.Web.Models.Identity.User [Required] [GoodPassword] public string Password { get; set; } + + public IList Friends { get; set; } + + public IList Languages { get; set; } + + public IList Technologies { get; set; } } } diff --git a/src/DevHive.Web/Models/Identity/User/UserWebModel.cs b/src/DevHive.Web/Models/Identity/User/UserWebModel.cs index 8f7995c..3b243e7 100644 --- a/src/DevHive.Web/Models/Identity/User/UserWebModel.cs +++ b/src/DevHive.Web/Models/Identity/User/UserWebModel.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using DevHive.Common.Models.Identity; using DevHive.Web.Models.Identity.Role; using DevHive.Web.Models.Language; using DevHive.Web.Models.Technology; @@ -9,8 +8,11 @@ namespace DevHive.Web.Models.Identity.User public class UserWebModel : BaseUserWebModel { public IList Roles { get; set; } = new List(); + public IList Friends { get; set; } = new List(); + public IList Languages { get; set; } = new List(); + public IList Technologies { get; set; } = new List(); } } diff --git a/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs b/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs index ed3b37c..18d945f 100644 --- a/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs +++ b/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs @@ -2,7 +2,7 @@ using System; namespace DevHive.Web.Models.Language { - public class UpdateLanguageWebModel : LanguageWebModel + public class UpdateLanguageWebModel { public string Name { get; set; } } diff --git a/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs b/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs index 8bf48bf..4651b9e 100644 --- a/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs +++ b/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs @@ -2,7 +2,7 @@ using System; namespace DevHive.Web.Models.Technology { - public class UpdateTechnologyWebModel : TechnologyWebModel + public class UpdateTechnologyWebModel { public string Name { get; set; } } -- cgit v1.2.3 From 8560caa13b7f7d0e80ee712c77efc59a80e8935c Mon Sep 17 00:00:00 2001 From: transtrike Date: Tue, 19 Jan 2021 21:46:06 +0200 Subject: Added attributes to the Web models for validations --- .../Attributes/GoodPasswordModelValidation.cs | 24 +++++++++++ .../Attributes/OnlyAlphanumericsModelValidation.cs | 20 +++++++++ .../Attributes/OnlyLettersModelValidation.cs | 20 +++++++++ .../Extensions/ConfigureCustomMiddleware.cs | 2 +- src/DevHive.Web/Middleware/ExceptionMiddleware.cs | 50 ++++++++++++++++++++++ .../Models/Identity/Role/CreateRoleWebModel.cs | 7 +++ .../Models/Identity/Role/RoleWebModel.cs | 7 +++ .../Models/Identity/Role/UpdateRoleWebModel.cs | 4 ++ .../Models/Identity/User/BaseUserWebModel.cs | 7 ++- .../Models/Identity/User/FriendWebModel.cs | 11 ++++- .../Models/Identity/User/LoginWebModel.cs | 13 ++++++ .../Models/Identity/User/RegisterWebModel.cs | 4 +- .../Models/Identity/User/UpdateUserWebModel.cs | 10 ++++- .../Models/Identity/User/UserWebModel.cs | 10 +++++ .../Validation/GoodPasswordModelValidation.cs | 24 ----------- .../Validation/OnlyAlphanumericsModelValidation.cs | 20 --------- .../Validation/OnlyLettersModelValidation.cs | 20 --------- .../Models/Language/CreateLanguageWebModel.cs | 9 +++- .../Models/Language/LanguageWebModel.cs | 6 ++- .../Models/Language/ReadLanguageWebModel.cs | 7 +++ .../Models/Language/UpdateLanguageWebModel.cs | 7 ++- .../Models/Middleware/ExceptionMiddleware.cs | 50 ---------------------- .../Models/Post/Comment/CommentWebModel.cs | 13 ++++++ .../Models/Post/Post/BasePostWebModel.cs | 9 +++- .../Models/Post/Post/CreatePostWebModel.cs | 6 +-- src/DevHive.Web/Models/Post/Post/PostWebModel.cs | 20 ++++++++- .../Models/Technology/CreateTechnologyWebModel.cs | 7 +++ .../Models/Technology/TechnologyWebModel.cs | 6 ++- .../Models/Technology/UpdateTechnologyWebModel.cs | 6 +++ 29 files changed, 269 insertions(+), 130 deletions(-) create mode 100644 src/DevHive.Web/Attributes/GoodPasswordModelValidation.cs create mode 100644 src/DevHive.Web/Attributes/OnlyAlphanumericsModelValidation.cs create mode 100644 src/DevHive.Web/Attributes/OnlyLettersModelValidation.cs create mode 100644 src/DevHive.Web/Middleware/ExceptionMiddleware.cs delete mode 100644 src/DevHive.Web/Models/Identity/Validation/GoodPasswordModelValidation.cs delete mode 100644 src/DevHive.Web/Models/Identity/Validation/OnlyAlphanumericsModelValidation.cs delete mode 100644 src/DevHive.Web/Models/Identity/Validation/OnlyLettersModelValidation.cs delete mode 100644 src/DevHive.Web/Models/Middleware/ExceptionMiddleware.cs (limited to 'src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs') diff --git a/src/DevHive.Web/Attributes/GoodPasswordModelValidation.cs b/src/DevHive.Web/Attributes/GoodPasswordModelValidation.cs new file mode 100644 index 0000000..7d6a1ea --- /dev/null +++ b/src/DevHive.Web/Attributes/GoodPasswordModelValidation.cs @@ -0,0 +1,24 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace DevHive.Web.Attributes +{ + public class GoodPassword : ValidationAttribute + { + public override bool IsValid(object value) + { + var stringValue = (string)value; + + for (int i = 0; i < stringValue.Length; i++) + { + if (Char.IsDigit(stringValue[i])) + { + base.ErrorMessage = "Password must be atleast 5 characters long!"; + return stringValue.Length >= 5; + } + } + base.ErrorMessage = "Password must contain atleast 1 digit!"; + return false; + } + } +} diff --git a/src/DevHive.Web/Attributes/OnlyAlphanumericsModelValidation.cs b/src/DevHive.Web/Attributes/OnlyAlphanumericsModelValidation.cs new file mode 100644 index 0000000..26e0733 --- /dev/null +++ b/src/DevHive.Web/Attributes/OnlyAlphanumericsModelValidation.cs @@ -0,0 +1,20 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace DevHive.Web.Attributes +{ + public class OnlyAlphanumerics : ValidationAttribute + { + public override bool IsValid(object value) + { + var stringValue = (string)value; + + foreach (char ch in stringValue) + { + if (!Char.IsLetterOrDigit(ch)) + return false; + } + return true; + } + } +} diff --git a/src/DevHive.Web/Attributes/OnlyLettersModelValidation.cs b/src/DevHive.Web/Attributes/OnlyLettersModelValidation.cs new file mode 100644 index 0000000..07afee9 --- /dev/null +++ b/src/DevHive.Web/Attributes/OnlyLettersModelValidation.cs @@ -0,0 +1,20 @@ +using System; +using System.ComponentModel.DataAnnotations; + +namespace DevHive.Web.Attributes +{ + public class OnlyLetters : ValidationAttribute + { + public override bool IsValid(object value) + { + var stringValue = (string)value; + + foreach (char ch in stringValue) + { + if (!Char.IsLetter(ch)) + return false; + } + return true; + } + } +} diff --git a/src/DevHive.Web/Configurations/Extensions/ConfigureCustomMiddleware.cs b/src/DevHive.Web/Configurations/Extensions/ConfigureCustomMiddleware.cs index 24c2adf..efcb8e1 100644 --- a/src/DevHive.Web/Configurations/Extensions/ConfigureCustomMiddleware.cs +++ b/src/DevHive.Web/Configurations/Extensions/ConfigureCustomMiddleware.cs @@ -1,4 +1,4 @@ -using DevHive.Web.Models.Middleware; +using DevHive.Web.Middleware; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; diff --git a/src/DevHive.Web/Middleware/ExceptionMiddleware.cs b/src/DevHive.Web/Middleware/ExceptionMiddleware.cs new file mode 100644 index 0000000..cb6d4ca --- /dev/null +++ b/src/DevHive.Web/Middleware/ExceptionMiddleware.cs @@ -0,0 +1,50 @@ +using System; +using System.Net; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; + +namespace DevHive.Web.Middleware +{ + public class ExceptionMiddleware + { + private readonly RequestDelegate _next; + // private readonly ILogger _logger; + + public ExceptionMiddleware(RequestDelegate next) + { + this._next = next; + // this._logger = logger; + } + // public ExceptionMiddleware(RequestDelegate next, ILogger logger) + // { + // this._logger = logger; + // this._next = next; + // } + + public async Task InvokeAsync(HttpContext httpContext) + { + try + { + await this._next(httpContext); + } + catch (Exception ex) + { + // this._logger.LogError($"Something went wrong: {ex}"); + await HandleExceptionAsync(httpContext, ex); + } + } + + private Task HandleExceptionAsync(HttpContext context, Exception exception) + { + context.Response.ContentType = "application/json"; + context.Response.StatusCode = (int)HttpStatusCode.BadRequest; + + return context.Response.WriteAsync(new + { + StatusCode = context.Response.StatusCode, + Message = exception.Message + }.ToString()); + } + } +} diff --git a/src/DevHive.Web/Models/Identity/Role/CreateRoleWebModel.cs b/src/DevHive.Web/Models/Identity/Role/CreateRoleWebModel.cs index e872428..859cdd9 100644 --- a/src/DevHive.Web/Models/Identity/Role/CreateRoleWebModel.cs +++ b/src/DevHive.Web/Models/Identity/Role/CreateRoleWebModel.cs @@ -1,7 +1,14 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + namespace DevHive.Web.Models.Identity.Role { public class CreateRoleWebModel { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] public string Name { get; set; } } } diff --git a/src/DevHive.Web/Models/Identity/Role/RoleWebModel.cs b/src/DevHive.Web/Models/Identity/Role/RoleWebModel.cs index 41ade23..99b0f50 100644 --- a/src/DevHive.Web/Models/Identity/Role/RoleWebModel.cs +++ b/src/DevHive.Web/Models/Identity/Role/RoleWebModel.cs @@ -1,7 +1,14 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + namespace DevHive.Web.Models.Identity.Role { public class RoleWebModel { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] public string Name { get; set; } } } diff --git a/src/DevHive.Web/Models/Identity/Role/UpdateRoleWebModel.cs b/src/DevHive.Web/Models/Identity/Role/UpdateRoleWebModel.cs index aaf0270..254affc 100644 --- a/src/DevHive.Web/Models/Identity/Role/UpdateRoleWebModel.cs +++ b/src/DevHive.Web/Models/Identity/Role/UpdateRoleWebModel.cs @@ -1,9 +1,13 @@ using System; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; namespace DevHive.Web.Models.Identity.Role { public class UpdateRoleWebModel : RoleWebModel { + [NotNull] + [Required] public Guid Id { get; set; } } } diff --git a/src/DevHive.Web/Models/Identity/User/BaseUserWebModel.cs b/src/DevHive.Web/Models/Identity/User/BaseUserWebModel.cs index 2d99786..d7d8d29 100644 --- a/src/DevHive.Web/Models/Identity/User/BaseUserWebModel.cs +++ b/src/DevHive.Web/Models/Identity/User/BaseUserWebModel.cs @@ -1,26 +1,31 @@ using System.ComponentModel.DataAnnotations; -using DevHive.Web.Models.Identity.Validation; +using System.Diagnostics.CodeAnalysis; +using DevHive.Web.Attributes; namespace DevHive.Web.Models.Identity.User { public class BaseUserWebModel { + [NotNull] [Required] [MinLength(3)] [MaxLength(50)] [OnlyAlphanumerics(ErrorMessage = "Username can only contain letters and digits!")] public string UserName { get; set; } + [NotNull] [Required] [EmailAddress] public string Email { get; set; } + [NotNull] [Required] [MinLength(3)] [MaxLength(30)] [OnlyLetters(ErrorMessage = "First name can only contain letters!")] public string FirstName { get; set; } + [NotNull] [Required] [MinLength(3)] [MaxLength(30)] diff --git a/src/DevHive.Web/Models/Identity/User/FriendWebModel.cs b/src/DevHive.Web/Models/Identity/User/FriendWebModel.cs index 681529a..d59bff5 100644 --- a/src/DevHive.Web/Models/Identity/User/FriendWebModel.cs +++ b/src/DevHive.Web/Models/Identity/User/FriendWebModel.cs @@ -1,7 +1,16 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; +using DevHive.Web.Attributes; + namespace DevHive.Web.Models.Identity.User { public class FriendWebModel { - public string Username { get; set; } + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] + [OnlyAlphanumerics(ErrorMessage = "Username can only contain letters and digits!")] + public string UserName { get; set; } } } diff --git a/src/DevHive.Web/Models/Identity/User/LoginWebModel.cs b/src/DevHive.Web/Models/Identity/User/LoginWebModel.cs index 87c7416..0395274 100644 --- a/src/DevHive.Web/Models/Identity/User/LoginWebModel.cs +++ b/src/DevHive.Web/Models/Identity/User/LoginWebModel.cs @@ -1,8 +1,21 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; +using DevHive.Web.Attributes; + namespace DevHive.Web.Models.Identity.User { public class LoginWebModel { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] + [OnlyAlphanumerics(ErrorMessage = "Username can only contain letters and digits!")] public string UserName { get; set; } + + [NotNull] + [Required] + [GoodPassword] public string Password { get; set; } } } diff --git a/src/DevHive.Web/Models/Identity/User/RegisterWebModel.cs b/src/DevHive.Web/Models/Identity/User/RegisterWebModel.cs index 04fd6bd..0fc7ec6 100644 --- a/src/DevHive.Web/Models/Identity/User/RegisterWebModel.cs +++ b/src/DevHive.Web/Models/Identity/User/RegisterWebModel.cs @@ -1,10 +1,12 @@ using System.ComponentModel.DataAnnotations; -using DevHive.Web.Models.Identity.Validation; +using System.Diagnostics.CodeAnalysis; +using DevHive.Web.Attributes; namespace DevHive.Web.Models.Identity.User { public class RegisterWebModel : BaseUserWebModel { + [NotNull] [Required] [GoodPassword] public string Password { get; set; } diff --git a/src/DevHive.Web/Models/Identity/User/UpdateUserWebModel.cs b/src/DevHive.Web/Models/Identity/User/UpdateUserWebModel.cs index 782c558..724930c 100644 --- a/src/DevHive.Web/Models/Identity/User/UpdateUserWebModel.cs +++ b/src/DevHive.Web/Models/Identity/User/UpdateUserWebModel.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -using DevHive.Web.Models.Identity.Validation; +using System.Diagnostics.CodeAnalysis; +using DevHive.Web.Attributes; using DevHive.Web.Models.Language; using DevHive.Web.Models.Technology; @@ -8,14 +9,21 @@ namespace DevHive.Web.Models.Identity.User { public class UpdateUserWebModel : BaseUserWebModel { + [NotNull] [Required] [GoodPassword] public string Password { get; set; } + [NotNull] + [Required] public IList Friends { get; set; } + [NotNull] + [Required] public IList Languages { get; set; } + [NotNull] + [Required] public IList Technologies { get; set; } } } diff --git a/src/DevHive.Web/Models/Identity/User/UserWebModel.cs b/src/DevHive.Web/Models/Identity/User/UserWebModel.cs index 3b243e7..88f199d 100644 --- a/src/DevHive.Web/Models/Identity/User/UserWebModel.cs +++ b/src/DevHive.Web/Models/Identity/User/UserWebModel.cs @@ -1,4 +1,6 @@ using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; using DevHive.Web.Models.Identity.Role; using DevHive.Web.Models.Language; using DevHive.Web.Models.Technology; @@ -7,12 +9,20 @@ namespace DevHive.Web.Models.Identity.User { public class UserWebModel : BaseUserWebModel { + [NotNull] + [Required] public IList Roles { get; set; } = new List(); + [NotNull] + [Required] public IList Friends { get; set; } = new List(); + [NotNull] + [Required] public IList Languages { get; set; } = new List(); + [NotNull] + [Required] public IList Technologies { get; set; } = new List(); } } diff --git a/src/DevHive.Web/Models/Identity/Validation/GoodPasswordModelValidation.cs b/src/DevHive.Web/Models/Identity/Validation/GoodPasswordModelValidation.cs deleted file mode 100644 index f920c35..0000000 --- a/src/DevHive.Web/Models/Identity/Validation/GoodPasswordModelValidation.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; - -namespace DevHive.Web.Models.Identity.Validation -{ - public class GoodPassword : ValidationAttribute - { - public override bool IsValid(object value) - { - var stringValue = (string)value; - - for (int i = 0; i < stringValue.Length; i++) - { - if (Char.IsDigit(stringValue[i])) - { - base.ErrorMessage = "Password must be atleast 5 characters long!"; - return stringValue.Length >= 5; - } - } - base.ErrorMessage = "Password must contain atleast 1 digit!"; - return false; - } - } -} diff --git a/src/DevHive.Web/Models/Identity/Validation/OnlyAlphanumericsModelValidation.cs b/src/DevHive.Web/Models/Identity/Validation/OnlyAlphanumericsModelValidation.cs deleted file mode 100644 index 5c8c66c..0000000 --- a/src/DevHive.Web/Models/Identity/Validation/OnlyAlphanumericsModelValidation.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; - -namespace DevHive.Web.Models.Identity.Validation -{ - public class OnlyAlphanumerics : ValidationAttribute - { - public override bool IsValid(object value) - { - var stringValue = (string)value; - - foreach (char ch in stringValue) - { - if (!Char.IsLetterOrDigit(ch)) - return false; - } - return true; - } - } -} diff --git a/src/DevHive.Web/Models/Identity/Validation/OnlyLettersModelValidation.cs b/src/DevHive.Web/Models/Identity/Validation/OnlyLettersModelValidation.cs deleted file mode 100644 index 29a995a..0000000 --- a/src/DevHive.Web/Models/Identity/Validation/OnlyLettersModelValidation.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; - -namespace DevHive.Web.Models.Identity.Validation -{ - public class OnlyLetters : ValidationAttribute - { - public override bool IsValid(object value) - { - var stringValue = (string)value; - - foreach (char ch in stringValue) - { - if (!Char.IsLetter(ch)) - return false; - } - return true; - } - } -} diff --git a/src/DevHive.Web/Models/Language/CreateLanguageWebModel.cs b/src/DevHive.Web/Models/Language/CreateLanguageWebModel.cs index d261500..a739e7f 100644 --- a/src/DevHive.Web/Models/Language/CreateLanguageWebModel.cs +++ b/src/DevHive.Web/Models/Language/CreateLanguageWebModel.cs @@ -1,9 +1,14 @@ -using System; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; namespace DevHive.Web.Models.Language { public class CreateLanguageWebModel { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] 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 455b559..7515e70 100644 --- a/src/DevHive.Web/Models/Language/LanguageWebModel.cs +++ b/src/DevHive.Web/Models/Language/LanguageWebModel.cs @@ -1,9 +1,13 @@ using System; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; namespace DevHive.Web.Models.Language { public class LanguageWebModel { + [NotNull] + [Required] public Guid Id { get; set; } } -} \ No newline at end of file +} diff --git a/src/DevHive.Web/Models/Language/ReadLanguageWebModel.cs b/src/DevHive.Web/Models/Language/ReadLanguageWebModel.cs index f1e0ecc..ab4a089 100644 --- a/src/DevHive.Web/Models/Language/ReadLanguageWebModel.cs +++ b/src/DevHive.Web/Models/Language/ReadLanguageWebModel.cs @@ -1,7 +1,14 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + namespace DevHive.Web.Models.Language { public class ReadLanguageWebModel { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] public string Name { get; set; } } } diff --git a/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs b/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs index 18d945f..128d534 100644 --- a/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs +++ b/src/DevHive.Web/Models/Language/UpdateLanguageWebModel.cs @@ -1,9 +1,14 @@ -using System; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; namespace DevHive.Web.Models.Language { public class UpdateLanguageWebModel { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] public string Name { get; set; } } } diff --git a/src/DevHive.Web/Models/Middleware/ExceptionMiddleware.cs b/src/DevHive.Web/Models/Middleware/ExceptionMiddleware.cs deleted file mode 100644 index c57452e..0000000 --- a/src/DevHive.Web/Models/Middleware/ExceptionMiddleware.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Net; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Logging; - -namespace DevHive.Web.Models.Middleware -{ - public class ExceptionMiddleware - { - private readonly RequestDelegate _next; - // private readonly ILogger _logger; - - public ExceptionMiddleware(RequestDelegate next) - { - this._next = next; - // this._logger = logger; - } - // public ExceptionMiddleware(RequestDelegate next, ILogger logger) - // { - // this._logger = logger; - // this._next = next; - // } - - public async Task InvokeAsync(HttpContext httpContext) - { - try - { - await this._next(httpContext); - } - catch (Exception ex) - { - // this._logger.LogError($"Something went wrong: {ex}"); - await HandleExceptionAsync(httpContext, ex); - } - } - - private Task HandleExceptionAsync(HttpContext context, Exception exception) - { - context.Response.ContentType = "application/json"; - context.Response.StatusCode = (int)HttpStatusCode.BadRequest; - - return context.Response.WriteAsync(new - { - StatusCode = context.Response.StatusCode, - Message = exception.Message - }.ToString()); - } - } -} diff --git a/src/DevHive.Web/Models/Post/Comment/CommentWebModel.cs b/src/DevHive.Web/Models/Post/Comment/CommentWebModel.cs index d66e5c9..590851d 100644 --- a/src/DevHive.Web/Models/Post/Comment/CommentWebModel.cs +++ b/src/DevHive.Web/Models/Post/Comment/CommentWebModel.cs @@ -1,12 +1,25 @@ using System; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; namespace DevHive.Web.Models.Post.Comment { public class CommentWebModel { + [NotNull] + [Required] public Guid IssuerId { get; set; } + + [NotNull] + [Required] public Guid PostId { get; set; } + + [NotNull] + [Required] public string Message { get; set; } + + [NotNull] + [Required] public DateTime TimeCreated { get; set; } } } diff --git a/src/DevHive.Web/Models/Post/Post/BasePostWebModel.cs b/src/DevHive.Web/Models/Post/Post/BasePostWebModel.cs index caa9925..35ddd34 100644 --- a/src/DevHive.Web/Models/Post/Post/BasePostWebModel.cs +++ b/src/DevHive.Web/Models/Post/Post/BasePostWebModel.cs @@ -1,10 +1,17 @@ using System; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; namespace DevHive.Web.Models.Post.Post { public class BasePostWebModel { + [NotNull] + [Required] public Guid IssuerId { get; set; } + + [NotNull] + [Required] public string Message { get; set; } } -} \ No newline at end of file +} diff --git a/src/DevHive.Web/Models/Post/Post/CreatePostWebModel.cs b/src/DevHive.Web/Models/Post/Post/CreatePostWebModel.cs index 7558b2c..389ff9e 100644 --- a/src/DevHive.Web/Models/Post/Post/CreatePostWebModel.cs +++ b/src/DevHive.Web/Models/Post/Post/CreatePostWebModel.cs @@ -2,7 +2,5 @@ using System; namespace DevHive.Web.Models.Post.Post { - public class CreatePostWebModel : BasePostWebModel - { - } -} \ No newline at end of file + public class CreatePostWebModel : BasePostWebModel { } +} diff --git a/src/DevHive.Web/Models/Post/Post/PostWebModel.cs b/src/DevHive.Web/Models/Post/Post/PostWebModel.cs index fa18c3a..fe35cee 100644 --- a/src/DevHive.Web/Models/Post/Post/PostWebModel.cs +++ b/src/DevHive.Web/Models/Post/Post/PostWebModel.cs @@ -1,3 +1,6 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; +using DevHive.Web.Attributes; using DevHive.Web.Models.Post.Comment; namespace DevHive.Web.Models.Post.Post @@ -6,16 +9,31 @@ namespace DevHive.Web.Models.Post.Post { //public string Picture { get; set; } + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] public string IssuerFirstName { get; set; } + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] public string IssuerLastName { get; set; } + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] + [OnlyAlphanumerics(ErrorMessage = "Username can only contain letters and digits!")] public string IssuerUsername { get; set; } + [NotNull] + [Required] public string Message { get; set; } //public Files[] Files { get; set; } public CommentWebModel[] Comments { get; set; } } -} \ No newline at end of file +} diff --git a/src/DevHive.Web/Models/Technology/CreateTechnologyWebModel.cs b/src/DevHive.Web/Models/Technology/CreateTechnologyWebModel.cs index 13029ee..ec9ec15 100644 --- a/src/DevHive.Web/Models/Technology/CreateTechnologyWebModel.cs +++ b/src/DevHive.Web/Models/Technology/CreateTechnologyWebModel.cs @@ -1,7 +1,14 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + namespace DevHive.Web.Models.Technology { public class CreateTechnologyWebModel { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] public string Name { get; set; } } } diff --git a/src/DevHive.Web/Models/Technology/TechnologyWebModel.cs b/src/DevHive.Web/Models/Technology/TechnologyWebModel.cs index 05f7af8..6e8273b 100644 --- a/src/DevHive.Web/Models/Technology/TechnologyWebModel.cs +++ b/src/DevHive.Web/Models/Technology/TechnologyWebModel.cs @@ -1,9 +1,13 @@ using System; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; namespace DevHive.Web.Models.Technology { public class TechnologyWebModel { + [NotNull] + [Required] public Guid Id { get; set; } } -} \ No newline at end of file +} diff --git a/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs b/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs index 4651b9e..3e9fe2a 100644 --- a/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs +++ b/src/DevHive.Web/Models/Technology/UpdateTechnologyWebModel.cs @@ -1,9 +1,15 @@ using System; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; namespace DevHive.Web.Models.Technology { public class UpdateTechnologyWebModel { + [NotNull] + [Required] + [MinLength(3)] + [MaxLength(50)] public string Name { get; set; } } } -- cgit v1.2.3