From f35a7aecd313547a6f6478a056fb2d5593f1c07b Mon Sep 17 00:00:00 2001 From: Syndamia Date: Sat, 15 May 2021 22:20:53 +0300 Subject: Big daddy refactor --- .../Services/Configurations/ServiceUserMappings.cs | 15 --- .../BaseServiceModel.cs | 9 ++ .../ExamTemplate.Services.Models.csproj | 7 ++ .../User/LoginUserServiceModel.cs | 8 ++ .../User/RegisterUserServiceModel.cs | 10 ++ .../User/UserServiceModel.cs | 9 ++ .../Configurations/ServiceUserMappings.cs | 15 +++ .../ExamTemplate.Services.csproj | 20 ++++ .../Interfaces/IBaseService.cs | 21 ++++ .../Interfaces/ICloudinaryService.cs | 11 ++ .../Interfaces/IUserService.cs | 25 ++++ .../ExamTemplate.Services/Services/BaseService.cs | 91 +++++++++++++++ .../Services/CloudinaryService.cs | 50 ++++++++ .../ExamTemplate.Services/Services/UserService.cs | 129 +++++++++++++++++++++ ExamTemplate/Services/Interfaces/IBaseService.cs | 21 ---- .../Services/Interfaces/ICloudinaryService.cs | 11 -- ExamTemplate/Services/Interfaces/IUserService.cs | 25 ---- ExamTemplate/Services/Models/BaseServiceModel.cs | 9 -- .../Services/Models/User/LoginUserServiceModel.cs | 8 -- .../Models/User/RegisterUserServiceModel.cs | 10 -- .../Services/Models/User/UserServiceModel.cs | 9 -- ExamTemplate/Services/Services.csproj | 18 --- ExamTemplate/Services/Services/BaseService.cs | 91 --------------- .../Services/Services/CloudinaryService.cs | 50 -------- ExamTemplate/Services/Services/UserService.cs | 129 --------------------- 25 files changed, 405 insertions(+), 396 deletions(-) delete mode 100644 ExamTemplate/Services/Configurations/ServiceUserMappings.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services.Models/BaseServiceModel.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services.Models/ExamTemplate.Services.Models.csproj create mode 100644 ExamTemplate/Services/ExamTemplate.Services.Models/User/LoginUserServiceModel.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services.Models/User/RegisterUserServiceModel.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services.Models/User/UserServiceModel.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services/Configurations/ServiceUserMappings.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services/ExamTemplate.Services.csproj create mode 100644 ExamTemplate/Services/ExamTemplate.Services/Interfaces/IBaseService.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services/Interfaces/ICloudinaryService.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services/Interfaces/IUserService.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services/Services/BaseService.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services/Services/CloudinaryService.cs create mode 100644 ExamTemplate/Services/ExamTemplate.Services/Services/UserService.cs delete mode 100644 ExamTemplate/Services/Interfaces/IBaseService.cs delete mode 100644 ExamTemplate/Services/Interfaces/ICloudinaryService.cs delete mode 100644 ExamTemplate/Services/Interfaces/IUserService.cs delete mode 100644 ExamTemplate/Services/Models/BaseServiceModel.cs delete mode 100644 ExamTemplate/Services/Models/User/LoginUserServiceModel.cs delete mode 100644 ExamTemplate/Services/Models/User/RegisterUserServiceModel.cs delete mode 100644 ExamTemplate/Services/Models/User/UserServiceModel.cs delete mode 100644 ExamTemplate/Services/Services.csproj delete mode 100644 ExamTemplate/Services/Services/BaseService.cs delete mode 100644 ExamTemplate/Services/Services/CloudinaryService.cs delete mode 100644 ExamTemplate/Services/Services/UserService.cs (limited to 'ExamTemplate/Services') diff --git a/ExamTemplate/Services/Configurations/ServiceUserMappings.cs b/ExamTemplate/Services/Configurations/ServiceUserMappings.cs deleted file mode 100644 index 787b90f..0000000 --- a/ExamTemplate/Services/Configurations/ServiceUserMappings.cs +++ /dev/null @@ -1,15 +0,0 @@ -using AutoMapper; -using ExamTemplate.Data.Models; -using ExamTemplate.Services.Models.User; - -namespace ExamTemplate.Services.Configurations -{ - public class ServiceUserMappings : Profile - { - public ServiceUserMappings() - { - CreateMap(); - CreateMap(); - } - } -} diff --git a/ExamTemplate/Services/ExamTemplate.Services.Models/BaseServiceModel.cs b/ExamTemplate/Services/ExamTemplate.Services.Models/BaseServiceModel.cs new file mode 100644 index 0000000..62d0da3 --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services.Models/BaseServiceModel.cs @@ -0,0 +1,9 @@ +using System; + +namespace ExamTemplate.Services.Models +{ + public abstract class BaseServiceModel + { + public Guid Id { get; set; } + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services.Models/ExamTemplate.Services.Models.csproj b/ExamTemplate/Services/ExamTemplate.Services.Models/ExamTemplate.Services.Models.csproj new file mode 100644 index 0000000..563e6f9 --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services.Models/ExamTemplate.Services.Models.csproj @@ -0,0 +1,7 @@ + + + + net5.0 + + + diff --git a/ExamTemplate/Services/ExamTemplate.Services.Models/User/LoginUserServiceModel.cs b/ExamTemplate/Services/ExamTemplate.Services.Models/User/LoginUserServiceModel.cs new file mode 100644 index 0000000..20aaaeb --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services.Models/User/LoginUserServiceModel.cs @@ -0,0 +1,8 @@ +namespace ExamTemplate.Services.Models.User +{ + public class LoginUserServiceModel + { + public string Username { get; set; } + public string Password { get; set; } + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services.Models/User/RegisterUserServiceModel.cs b/ExamTemplate/Services/ExamTemplate.Services.Models/User/RegisterUserServiceModel.cs new file mode 100644 index 0000000..b08d5ba --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services.Models/User/RegisterUserServiceModel.cs @@ -0,0 +1,10 @@ +namespace ExamTemplate.Services.Models.User +{ + public class RegisterUserServiceModel + { + public string FirstName { get; set; } + public string LastName { get; set; } + public string Username { get; set; } + public string Password { get; set; } + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services.Models/User/UserServiceModel.cs b/ExamTemplate/Services/ExamTemplate.Services.Models/User/UserServiceModel.cs new file mode 100644 index 0000000..0e8b939 --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services.Models/User/UserServiceModel.cs @@ -0,0 +1,9 @@ +namespace ExamTemplate.Services.Models.User +{ + public class UserServiceModel + { + public string FirstName { get; set; } + public string LastName { get; set; } + public string Username { get; set; } + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services/Configurations/ServiceUserMappings.cs b/ExamTemplate/Services/ExamTemplate.Services/Configurations/ServiceUserMappings.cs new file mode 100644 index 0000000..787b90f --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services/Configurations/ServiceUserMappings.cs @@ -0,0 +1,15 @@ +using AutoMapper; +using ExamTemplate.Data.Models; +using ExamTemplate.Services.Models.User; + +namespace ExamTemplate.Services.Configurations +{ + public class ServiceUserMappings : Profile + { + public ServiceUserMappings() + { + CreateMap(); + CreateMap(); + } + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services/ExamTemplate.Services.csproj b/ExamTemplate/Services/ExamTemplate.Services/ExamTemplate.Services.csproj new file mode 100644 index 0000000..b84928f --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services/ExamTemplate.Services.csproj @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + net5.0 + + + diff --git a/ExamTemplate/Services/ExamTemplate.Services/Interfaces/IBaseService.cs b/ExamTemplate/Services/ExamTemplate.Services/Interfaces/IBaseService.cs new file mode 100644 index 0000000..66de7b8 --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services/Interfaces/IBaseService.cs @@ -0,0 +1,21 @@ +using System; +using System.Threading.Tasks; +using System.Collections.Generic; + +namespace ExamTemplate.Services.Interfaces +{ + public interface IBaseService + where DbModel : class + where ServiceModel : class + { + Task CreateAsync(ServiceModel serviceModel); + + Task GetByIdAsync(Guid id); + + Task> GetAllAsync(); + + Task EditAsync(ServiceModel serviceModel); + + Task DeleteAsync(Guid id); + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services/Interfaces/ICloudinaryService.cs b/ExamTemplate/Services/ExamTemplate.Services/Interfaces/ICloudinaryService.cs new file mode 100644 index 0000000..9c4d884 --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services/Interfaces/ICloudinaryService.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; + +namespace ExamTemplate.Services.Interfaces +{ + public interface ICloudinaryService + { + Task> UploadFilesToCloud(List formFiles); + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services/Interfaces/IUserService.cs b/ExamTemplate/Services/ExamTemplate.Services/Interfaces/IUserService.cs new file mode 100644 index 0000000..35f14e3 --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services/Interfaces/IUserService.cs @@ -0,0 +1,25 @@ +using System.Security.Claims; +using System.Threading.Tasks; +using ExamTemplate.Services.Models.User; + +namespace ExamTemplate.Services.Interfaces +{ + public interface IUserService + { + Task RegisterUserAsync(RegisterUserServiceModel registerUserServiceModel); + + Task LoginUserAsync(LoginUserServiceModel loginUserServiceModel); + + Task LogoutAsync(); + + Task GetUserByUsernameAsync(string username); + + Task GetUserByClaimsAsync(ClaimsPrincipal claimsPrincipal); + + Task EditUserAsync(ClaimsPrincipal claimsPrincipal, UserServiceModel userServiceModel); + + Task DeleteUserAsync(ClaimsPrincipal claimsPrincipal); + + bool IsSignedIn(ClaimsPrincipal claimsPrincipal); + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services/Services/BaseService.cs b/ExamTemplate/Services/ExamTemplate.Services/Services/BaseService.cs new file mode 100644 index 0000000..b1b823e --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services/Services/BaseService.cs @@ -0,0 +1,91 @@ +using System; +using System.Threading.Tasks; +using AutoMapper; +using ExamTemplate.Data; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; +using System.Linq; +using ExamTemplate.Services.Interfaces; +using ExamTemplate.Common; + +namespace ExamTemplate.Services.Services +{ + public abstract class BaseService : IBaseService + where DbModel : class + where ServiceModel : class + { + protected IMapper _autoMapper { get; private set; } + protected TemplateContext _context { get; private set; } + + protected BaseService(IMapper autoMapper, TemplateContext context) + { + this._autoMapper = autoMapper; + this._context = context; + } + + public virtual async Task CreateAsync(ServiceModel serviceModel) + { + if (serviceModel == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ServiceModel))); + + DbModel newEntity = this._autoMapper.Map(serviceModel); + + await this.GetDbSet() + .AddAsync(newEntity); + + return await this.SaveChangesAsync(); + } + + public virtual async Task GetByIdAsync(Guid id) + { + if (id == Guid.Empty) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(Guid))); + + DbModel entity = await this.GetDbSet() + .FindAsync(id); + + return this._autoMapper.Map(entity); + } + + public virtual async Task> GetAllAsync() + { + return await this.GetDbSet() + .Select(x => this._autoMapper.Map(x)) + .ToListAsync(); + } + + public virtual async Task EditAsync(ServiceModel serviceModel) + { + if (serviceModel == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ServiceModel))); + + DbModel entity = this._autoMapper.Map(serviceModel); + + this._context.Update(entity); + + return await this.SaveChangesAsync(); + } + + public virtual async Task DeleteAsync(Guid id) + { + DbModel entity = this.GetDbSet() + .Find(id); + + this._context.Remove(entity); + + return await this.SaveChangesAsync(); + } + + /// Get, Create, Edit and Delete use this method + /// Override it to add include statements (and so all other methods will work with includes too) + protected virtual DbSet GetDbSet() + { + return this._context.Set(); + } + + protected async Task SaveChangesAsync() + { + return await this._context.SaveChangesAsync() >= 1; + } + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services/Services/CloudinaryService.cs b/ExamTemplate/Services/ExamTemplate.Services/Services/CloudinaryService.cs new file mode 100644 index 0000000..40772d9 --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services/Services/CloudinaryService.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.IO; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using CloudinaryDotNet; +using CloudinaryDotNet.Actions; +using Microsoft.AspNetCore.Http; +using ExamTemplate.Services.Interfaces; + +namespace ExamTemplate.Services.Services +{ + public class CloudinaryService : ICloudinaryService + { + // Regex for getting the filename without (final) filename extension + // So, from image.png, it will match image, and from doc.my.txt will match doc.my + private static readonly Regex s_imageRegex = new(".*(?=\\.)"); + + private readonly Cloudinary _cloudinary; + + public CloudinaryService(string cloudName, string apiKey, string apiSecret) + { + this._cloudinary = new Cloudinary(new Account(cloudName, apiKey, apiSecret)); + } + + public async Task> UploadFilesToCloud(List formFiles) + { + List fileUrls = new(); + foreach (var formFile in formFiles) + { + string fileName = s_imageRegex.Match(formFile.FileName).ToString(); + + using var ms = new MemoryStream(); + formFile.CopyTo(ms); + byte[] formBytes = ms.ToArray(); + + RawUploadParams rawUploadParams = new() + { + File = new FileDescription(fileName, new MemoryStream(formBytes)), + PublicId = fileName, + UseFilename = true + }; + + RawUploadResult rawUploadResult = await this._cloudinary.UploadAsync(rawUploadParams); + fileUrls.Add(rawUploadResult.Url.AbsoluteUri); + } + + return fileUrls; + } + } +} diff --git a/ExamTemplate/Services/ExamTemplate.Services/Services/UserService.cs b/ExamTemplate/Services/ExamTemplate.Services/Services/UserService.cs new file mode 100644 index 0000000..4e85688 --- /dev/null +++ b/ExamTemplate/Services/ExamTemplate.Services/Services/UserService.cs @@ -0,0 +1,129 @@ +using System; +using System.Security.Claims; +using System.Threading.Tasks; +using AutoMapper; +using ExamTemplate.Data; +using ExamTemplate.Data.Models; +using ExamTemplate.Services.Models.User; +using Microsoft.AspNetCore.Identity; +using Microsoft.EntityFrameworkCore; +using ExamTemplate.Services.Interfaces; +using ExamTemplate.Common; + +namespace ExamTemplate.Services.Services +{ + public class UserService : IUserService + { + private readonly IMapper _autoMapper; + private readonly TemplateContext _context; + private readonly SignInManager _signInManager; + private readonly UserManager _userManager; + private readonly RoleManager> _roleManager; + + public UserService(IMapper autoMapper, TemplateContext templateContext, SignInManager signInManager, UserManager userManager, RoleManager> roleManager) + { + this._autoMapper = autoMapper; + this._context = templateContext; + this._signInManager = signInManager; + this._userManager = userManager; + this._roleManager = roleManager; + } + + public async Task RegisterUserAsync(RegisterUserServiceModel registerUserServiceModel) + { + if (registerUserServiceModel == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(RegisterUserServiceModel))); + + User user = this._autoMapper.Map(registerUserServiceModel); + + user.PasswordHash = this._userManager.PasswordHasher.HashPassword(user, registerUserServiceModel.Password); + IdentityResult userCreateResult = await this._userManager.CreateAsync(user); + + if (!userCreateResult.Succeeded) + { + await this._userManager.DeleteAsync(user); + return false; + } + + IdentityResult addRoleResult; + if (await this._userManager.Users.CountAsync() == 1) // 1, because we added the user in line 37 + addRoleResult = await this._userManager.AddToRoleAsync(user, RoleConst.Admin); + else + addRoleResult = await this._userManager.AddToRoleAsync(user, RoleConst.User); + + return addRoleResult.Succeeded; + } + + public async Task LoginUserAsync(LoginUserServiceModel loginUserServiceModel) + { + if (loginUserServiceModel == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(LoginUserServiceModel))); + + SignInResult result = await this._signInManager.PasswordSignInAsync(loginUserServiceModel.Username, loginUserServiceModel.Password, false, false); + + return result.Succeeded; + } + + public async Task LogoutAsync() + { + await this._signInManager.SignOutAsync(); + } + + public async Task GetUserByUsernameAsync(string username) + { + if (username == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(string))); + + User user = await this._userManager.Users + .FirstOrDefaultAsync(x => x.UserName == username); + + return this._autoMapper.Map(user); + } + + public async Task GetUserByClaimsAsync(ClaimsPrincipal claimsPrincipal) + { + if (claimsPrincipal == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ClaimsPrincipal))); + + User user = await this._userManager.GetUserAsync(claimsPrincipal); + + return this._autoMapper.Map(user); + } + + public async Task EditUserAsync(ClaimsPrincipal claimsPrincipal, UserServiceModel userServiceModel) + { + if (claimsPrincipal == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ClaimsPrincipal))); + if (userServiceModel == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(UserServiceModel))); + + User user = await this._userManager.GetUserAsync(claimsPrincipal); + + user.UserName = userServiceModel.Username; + user.FirstName = userServiceModel.FirstName; + user.LastName = userServiceModel.LastName; + + IdentityResult result = await this._userManager.UpdateAsync(user); + return result.Succeeded; + } + + public async Task DeleteUserAsync(ClaimsPrincipal claimsPrincipal) + { + if (claimsPrincipal == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ClaimsPrincipal))); + + User user = await this._userManager.GetUserAsync(claimsPrincipal); + + IdentityResult result = await this._userManager.DeleteAsync(user); + return result.Succeeded; + } + + public bool IsSignedIn(ClaimsPrincipal claimsPrincipal) + { + if (claimsPrincipal == null) + throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ClaimsPrincipal))); + + return this._signInManager.IsSignedIn(claimsPrincipal); + } + } +} diff --git a/ExamTemplate/Services/Interfaces/IBaseService.cs b/ExamTemplate/Services/Interfaces/IBaseService.cs deleted file mode 100644 index 66de7b8..0000000 --- a/ExamTemplate/Services/Interfaces/IBaseService.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Threading.Tasks; -using System.Collections.Generic; - -namespace ExamTemplate.Services.Interfaces -{ - public interface IBaseService - where DbModel : class - where ServiceModel : class - { - Task CreateAsync(ServiceModel serviceModel); - - Task GetByIdAsync(Guid id); - - Task> GetAllAsync(); - - Task EditAsync(ServiceModel serviceModel); - - Task DeleteAsync(Guid id); - } -} diff --git a/ExamTemplate/Services/Interfaces/ICloudinaryService.cs b/ExamTemplate/Services/Interfaces/ICloudinaryService.cs deleted file mode 100644 index 9c4d884..0000000 --- a/ExamTemplate/Services/Interfaces/ICloudinaryService.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; - -namespace ExamTemplate.Services.Interfaces -{ - public interface ICloudinaryService - { - Task> UploadFilesToCloud(List formFiles); - } -} diff --git a/ExamTemplate/Services/Interfaces/IUserService.cs b/ExamTemplate/Services/Interfaces/IUserService.cs deleted file mode 100644 index 35f14e3..0000000 --- a/ExamTemplate/Services/Interfaces/IUserService.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Security.Claims; -using System.Threading.Tasks; -using ExamTemplate.Services.Models.User; - -namespace ExamTemplate.Services.Interfaces -{ - public interface IUserService - { - Task RegisterUserAsync(RegisterUserServiceModel registerUserServiceModel); - - Task LoginUserAsync(LoginUserServiceModel loginUserServiceModel); - - Task LogoutAsync(); - - Task GetUserByUsernameAsync(string username); - - Task GetUserByClaimsAsync(ClaimsPrincipal claimsPrincipal); - - Task EditUserAsync(ClaimsPrincipal claimsPrincipal, UserServiceModel userServiceModel); - - Task DeleteUserAsync(ClaimsPrincipal claimsPrincipal); - - bool IsSignedIn(ClaimsPrincipal claimsPrincipal); - } -} diff --git a/ExamTemplate/Services/Models/BaseServiceModel.cs b/ExamTemplate/Services/Models/BaseServiceModel.cs deleted file mode 100644 index 62d0da3..0000000 --- a/ExamTemplate/Services/Models/BaseServiceModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System; - -namespace ExamTemplate.Services.Models -{ - public abstract class BaseServiceModel - { - public Guid Id { get; set; } - } -} diff --git a/ExamTemplate/Services/Models/User/LoginUserServiceModel.cs b/ExamTemplate/Services/Models/User/LoginUserServiceModel.cs deleted file mode 100644 index 20aaaeb..0000000 --- a/ExamTemplate/Services/Models/User/LoginUserServiceModel.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace ExamTemplate.Services.Models.User -{ - public class LoginUserServiceModel - { - public string Username { get; set; } - public string Password { get; set; } - } -} diff --git a/ExamTemplate/Services/Models/User/RegisterUserServiceModel.cs b/ExamTemplate/Services/Models/User/RegisterUserServiceModel.cs deleted file mode 100644 index b08d5ba..0000000 --- a/ExamTemplate/Services/Models/User/RegisterUserServiceModel.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace ExamTemplate.Services.Models.User -{ - public class RegisterUserServiceModel - { - public string FirstName { get; set; } - public string LastName { get; set; } - public string Username { get; set; } - public string Password { get; set; } - } -} diff --git a/ExamTemplate/Services/Models/User/UserServiceModel.cs b/ExamTemplate/Services/Models/User/UserServiceModel.cs deleted file mode 100644 index 0e8b939..0000000 --- a/ExamTemplate/Services/Models/User/UserServiceModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace ExamTemplate.Services.Models.User -{ - public class UserServiceModel - { - public string FirstName { get; set; } - public string LastName { get; set; } - public string Username { get; set; } - } -} diff --git a/ExamTemplate/Services/Services.csproj b/ExamTemplate/Services/Services.csproj deleted file mode 100644 index eb60f3d..0000000 --- a/ExamTemplate/Services/Services.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - net5.0 - - - diff --git a/ExamTemplate/Services/Services/BaseService.cs b/ExamTemplate/Services/Services/BaseService.cs deleted file mode 100644 index b1b823e..0000000 --- a/ExamTemplate/Services/Services/BaseService.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System; -using System.Threading.Tasks; -using AutoMapper; -using ExamTemplate.Data; -using System.Collections.Generic; -using Microsoft.EntityFrameworkCore; -using System.Linq; -using ExamTemplate.Services.Interfaces; -using ExamTemplate.Common; - -namespace ExamTemplate.Services.Services -{ - public abstract class BaseService : IBaseService - where DbModel : class - where ServiceModel : class - { - protected IMapper _autoMapper { get; private set; } - protected TemplateContext _context { get; private set; } - - protected BaseService(IMapper autoMapper, TemplateContext context) - { - this._autoMapper = autoMapper; - this._context = context; - } - - public virtual async Task CreateAsync(ServiceModel serviceModel) - { - if (serviceModel == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ServiceModel))); - - DbModel newEntity = this._autoMapper.Map(serviceModel); - - await this.GetDbSet() - .AddAsync(newEntity); - - return await this.SaveChangesAsync(); - } - - public virtual async Task GetByIdAsync(Guid id) - { - if (id == Guid.Empty) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(Guid))); - - DbModel entity = await this.GetDbSet() - .FindAsync(id); - - return this._autoMapper.Map(entity); - } - - public virtual async Task> GetAllAsync() - { - return await this.GetDbSet() - .Select(x => this._autoMapper.Map(x)) - .ToListAsync(); - } - - public virtual async Task EditAsync(ServiceModel serviceModel) - { - if (serviceModel == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ServiceModel))); - - DbModel entity = this._autoMapper.Map(serviceModel); - - this._context.Update(entity); - - return await this.SaveChangesAsync(); - } - - public virtual async Task DeleteAsync(Guid id) - { - DbModel entity = this.GetDbSet() - .Find(id); - - this._context.Remove(entity); - - return await this.SaveChangesAsync(); - } - - /// Get, Create, Edit and Delete use this method - /// Override it to add include statements (and so all other methods will work with includes too) - protected virtual DbSet GetDbSet() - { - return this._context.Set(); - } - - protected async Task SaveChangesAsync() - { - return await this._context.SaveChangesAsync() >= 1; - } - } -} diff --git a/ExamTemplate/Services/Services/CloudinaryService.cs b/ExamTemplate/Services/Services/CloudinaryService.cs deleted file mode 100644 index 40772d9..0000000 --- a/ExamTemplate/Services/Services/CloudinaryService.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using CloudinaryDotNet; -using CloudinaryDotNet.Actions; -using Microsoft.AspNetCore.Http; -using ExamTemplate.Services.Interfaces; - -namespace ExamTemplate.Services.Services -{ - public class CloudinaryService : ICloudinaryService - { - // Regex for getting the filename without (final) filename extension - // So, from image.png, it will match image, and from doc.my.txt will match doc.my - private static readonly Regex s_imageRegex = new(".*(?=\\.)"); - - private readonly Cloudinary _cloudinary; - - public CloudinaryService(string cloudName, string apiKey, string apiSecret) - { - this._cloudinary = new Cloudinary(new Account(cloudName, apiKey, apiSecret)); - } - - public async Task> UploadFilesToCloud(List formFiles) - { - List fileUrls = new(); - foreach (var formFile in formFiles) - { - string fileName = s_imageRegex.Match(formFile.FileName).ToString(); - - using var ms = new MemoryStream(); - formFile.CopyTo(ms); - byte[] formBytes = ms.ToArray(); - - RawUploadParams rawUploadParams = new() - { - File = new FileDescription(fileName, new MemoryStream(formBytes)), - PublicId = fileName, - UseFilename = true - }; - - RawUploadResult rawUploadResult = await this._cloudinary.UploadAsync(rawUploadParams); - fileUrls.Add(rawUploadResult.Url.AbsoluteUri); - } - - return fileUrls; - } - } -} diff --git a/ExamTemplate/Services/Services/UserService.cs b/ExamTemplate/Services/Services/UserService.cs deleted file mode 100644 index 4e85688..0000000 --- a/ExamTemplate/Services/Services/UserService.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System; -using System.Security.Claims; -using System.Threading.Tasks; -using AutoMapper; -using ExamTemplate.Data; -using ExamTemplate.Data.Models; -using ExamTemplate.Services.Models.User; -using Microsoft.AspNetCore.Identity; -using Microsoft.EntityFrameworkCore; -using ExamTemplate.Services.Interfaces; -using ExamTemplate.Common; - -namespace ExamTemplate.Services.Services -{ - public class UserService : IUserService - { - private readonly IMapper _autoMapper; - private readonly TemplateContext _context; - private readonly SignInManager _signInManager; - private readonly UserManager _userManager; - private readonly RoleManager> _roleManager; - - public UserService(IMapper autoMapper, TemplateContext templateContext, SignInManager signInManager, UserManager userManager, RoleManager> roleManager) - { - this._autoMapper = autoMapper; - this._context = templateContext; - this._signInManager = signInManager; - this._userManager = userManager; - this._roleManager = roleManager; - } - - public async Task RegisterUserAsync(RegisterUserServiceModel registerUserServiceModel) - { - if (registerUserServiceModel == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(RegisterUserServiceModel))); - - User user = this._autoMapper.Map(registerUserServiceModel); - - user.PasswordHash = this._userManager.PasswordHasher.HashPassword(user, registerUserServiceModel.Password); - IdentityResult userCreateResult = await this._userManager.CreateAsync(user); - - if (!userCreateResult.Succeeded) - { - await this._userManager.DeleteAsync(user); - return false; - } - - IdentityResult addRoleResult; - if (await this._userManager.Users.CountAsync() == 1) // 1, because we added the user in line 37 - addRoleResult = await this._userManager.AddToRoleAsync(user, RoleConst.Admin); - else - addRoleResult = await this._userManager.AddToRoleAsync(user, RoleConst.User); - - return addRoleResult.Succeeded; - } - - public async Task LoginUserAsync(LoginUserServiceModel loginUserServiceModel) - { - if (loginUserServiceModel == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(LoginUserServiceModel))); - - SignInResult result = await this._signInManager.PasswordSignInAsync(loginUserServiceModel.Username, loginUserServiceModel.Password, false, false); - - return result.Succeeded; - } - - public async Task LogoutAsync() - { - await this._signInManager.SignOutAsync(); - } - - public async Task GetUserByUsernameAsync(string username) - { - if (username == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(string))); - - User user = await this._userManager.Users - .FirstOrDefaultAsync(x => x.UserName == username); - - return this._autoMapper.Map(user); - } - - public async Task GetUserByClaimsAsync(ClaimsPrincipal claimsPrincipal) - { - if (claimsPrincipal == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ClaimsPrincipal))); - - User user = await this._userManager.GetUserAsync(claimsPrincipal); - - return this._autoMapper.Map(user); - } - - public async Task EditUserAsync(ClaimsPrincipal claimsPrincipal, UserServiceModel userServiceModel) - { - if (claimsPrincipal == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ClaimsPrincipal))); - if (userServiceModel == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(UserServiceModel))); - - User user = await this._userManager.GetUserAsync(claimsPrincipal); - - user.UserName = userServiceModel.Username; - user.FirstName = userServiceModel.FirstName; - user.LastName = userServiceModel.LastName; - - IdentityResult result = await this._userManager.UpdateAsync(user); - return result.Succeeded; - } - - public async Task DeleteUserAsync(ClaimsPrincipal claimsPrincipal) - { - if (claimsPrincipal == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ClaimsPrincipal))); - - User user = await this._userManager.GetUserAsync(claimsPrincipal); - - IdentityResult result = await this._userManager.DeleteAsync(user); - return result.Succeeded; - } - - public bool IsSignedIn(ClaimsPrincipal claimsPrincipal) - { - if (claimsPrincipal == null) - throw new ArgumentNullException(ErrorMessages.NullObject(typeof(ClaimsPrincipal))); - - return this._signInManager.IsSignedIn(claimsPrincipal); - } - } -} -- cgit v1.2.3