| | 1 | | using Microsoft.AspNetCore.Identity; |
| | 2 | | using MUNity.Database.Context; |
| | 3 | | using MUNity.Database.Models.User; |
| | 4 | | using System; |
| | 5 | | using System.Collections.Generic; |
| | 6 | | using System.Linq; |
| | 7 | | using System.Security.Claims; |
| | 8 | | using System.Text; |
| | 9 | | using System.Threading.Tasks; |
| | 10 | | using Microsoft.Extensions.Logging; |
| | 11 | | using MUNity.Schema.Conference; |
| | 12 | | using Microsoft.EntityFrameworkCore; |
| | 13 | | using MUNity.Database.Extensions; |
| | 14 | |
|
| | 15 | | namespace MUNity.Services |
| | 16 | | { |
| | 17 | | public class UserService |
| | 18 | | { |
| | 19 | | private MunityContext context; |
| | 20 | |
|
| | 21 | | private UserManager<MunityUser> userManager; |
| | 22 | |
|
| | 23 | | private ILogger<UserService> _logger; |
| | 24 | |
|
| | 25 | | private IMailService _mailService; |
| | 26 | |
|
| | 27 | | public async Task<MunityUser> CreateUser(string username, string mail, string password) |
| 2 | 28 | | { |
| 2 | 29 | | var hasher = userManager.PasswordHasher; |
| | 30 | |
|
| 2 | 31 | | var user = new MunityUser() |
| 2 | 32 | | { |
| 2 | 33 | | UserName = username, |
| 2 | 34 | | NormalizedUserName = username.ToUpper(), |
| 2 | 35 | | Email = mail, |
| 2 | 36 | | NormalizedEmail = mail.ToUpper() |
| 2 | 37 | | }; |
| 2 | 38 | | var pass = hasher.HashPassword(user, password); |
| 2 | 39 | | user.PasswordHash = pass; |
| 2 | 40 | | var success = await userManager.CreateAsync(user); |
| 2 | 41 | | if (!success.Succeeded) |
| 0 | 42 | | { |
| | 43 | | // TODO: Log errors |
| 0 | 44 | | return null; |
| | 45 | | } |
| 2 | 46 | | return user; |
| 2 | 47 | | } |
| | 48 | |
|
| | 49 | | public async Task<MunityUser> CreateShadowUser(string mail) |
| 0 | 50 | | { |
| 0 | 51 | | var result = await userManager.CreateShadowUser(mail); |
| 0 | 52 | | if (result.Result.Succeeded) |
| 0 | 53 | | { |
| 0 | 54 | | _mailService.SendMail(mail, "Eingeladen", "Guten Tag, <br> Sie wurden zur Konferenz... eingeladen."); |
| 0 | 55 | | return result.User; |
| | 56 | |
|
| | 57 | | } |
| | 58 | | else |
| 0 | 59 | | { |
| 0 | 60 | | _logger.LogWarning($"Unable to create shadow user {mail} codes: {string.Join(", ", result.Result.Errors. |
| 0 | 61 | | } |
| 0 | 62 | | return null; |
| 0 | 63 | | } |
| | 64 | |
|
| | 65 | | public async Task<MunityUser> CreateUser(MUNity.Schema.Account.RegisterModel model) |
| 0 | 66 | | { |
| 0 | 67 | | return await CreateUser(model.Username, model.Mail, model.Password); |
| 0 | 68 | | } |
| | 69 | |
|
| | 70 | | public MunityUser GetUserByUsername(string username) |
| 1 | 71 | | { |
| 1 | 72 | | return context.Users.FirstOrDefault(n => n.UserName == username); |
| 1 | 73 | | } |
| | 74 | |
|
| | 75 | | public bool LoginValid(string username, string password) |
| 1 | 76 | | { |
| 1 | 77 | | var user = GetUserByUsername(username); |
| 1 | 78 | | if (user == null) |
| 0 | 79 | | return false; |
| | 80 | |
|
| 1 | 81 | | var result = userManager.PasswordHasher.VerifyHashedPassword(user, user.PasswordHash, password); |
| 1 | 82 | | return result == PasswordVerificationResult.Success; |
| 1 | 83 | | } |
| | 84 | |
|
| | 85 | | public async Task<string> GetForeAndLastNameAsync(ClaimsPrincipal claim) |
| 0 | 86 | | { |
| 0 | 87 | | if (claim == null) |
| 0 | 88 | | { |
| 0 | 89 | | _logger.LogWarning($"GetForeAndLastNameAsync was called with a null claim principal. Make sure you make |
| 0 | 90 | | return "-"; |
| | 91 | | } |
| 0 | 92 | | var user = await userManager.GetUserAsync(claim); |
| 0 | 93 | | if (user == null) return "-"; |
| | 94 | |
|
| 0 | 95 | | if (!string.IsNullOrEmpty(user.Forename) || !string.IsNullOrEmpty(user.Lastname)) |
| 0 | 96 | | return user.Forename + " " + user.Lastname; |
| | 97 | |
|
| 0 | 98 | | return "-"; |
| 0 | 99 | | } |
| | 100 | |
|
| | 101 | | public List<AddingToApplicationUser> GetUsersThatCanBeAddedToApplication(string conferenceId, string searchTerm) |
| 0 | 102 | | { |
| 0 | 103 | | var list = this.context.Users |
| 0 | 104 | | .Where(n => EF.Functions.Like(n.UserName, $"%{searchTerm}%")) |
| 0 | 105 | | .Select(n => new AddingToApplicationUser() |
| 0 | 106 | | { |
| 0 | 107 | | UserName = n.UserName, |
| 0 | 108 | | DisplayName = n.GetDisplayNamePublic |
| 0 | 109 | | }); |
| | 110 | |
|
| 0 | 111 | | return list.ToList(); |
| 0 | 112 | | } |
| | 113 | |
|
| | 114 | | //public async Task<object> Login(MunityUser user) |
| | 115 | | //{ |
| | 116 | | // var signIn = await signInManager.SignIn(user, true); |
| | 117 | | //} |
| | 118 | |
|
| 2 | 119 | | public UserService(MunityContext context, UserManager<MunityUser> userManager, IMailService mailService, ILogger |
| 2 | 120 | | { |
| 2 | 121 | | this.context = context; |
| 2 | 122 | | this.userManager = userManager; |
| 2 | 123 | | this._logger = logger; |
| 2 | 124 | | this._mailService = mailService; |
| 2 | 125 | | } |
| | 126 | | } |
| | 127 | | } |