using System; using System.Linq; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using PodNoms.Api.Persistence; using PodNoms.Api.Services.Auth; using PodNoms.Api.Utils.Extensions; using Microsoft.AspNetCore.Mvc; using PodNoms.Api.Services.Gravatar; using PodNoms.Api.Models; using PodNoms.Api.Utils; using PodNoms.Api.Models.Settings; namespace PodNoms.Api.Services.Auth { public class PodNomsUserManager : UserManager { private readonly GravatarHttpClient _gravatarClient; private readonly IMailSender _mailSender; private readonly StorageSettings _storageSettings; public PodNomsUserManager(IUserStore store, IOptions optionsAccessor, IPasswordHasher passwordHasher, IEnumerable> userValidators, IEnumerable> passwordValidators, ILookupNormalizer keyNormalizer, IdentityErrorDescriber errors, IServiceProvider services, ILogger> logger, [FromServices]GravatarHttpClient gravatarClient, IOptions storageSettings, IMailSender mailSender) : base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger) { this._gravatarClient = gravatarClient; this._mailSender = mailSender; this._storageSettings = storageSettings.Value; } public override async Task CreateAsync(ApplicationUser user) { _slugify(user); _checkName(user); await _imageify(user); try { await _mailSender.SendEmailAsync("fergal.moran@gmail.com", "New user signup", $"{user.Email}\n{user.FirstName} {user.LastName}"); } catch (Exception) { } return await base.CreateAsync(user); } public override async Task UpdateAsync(ApplicationUser user) { _slugify(user); _checkName(user); await _imageify(user); return await base.UpdateAsync(user); } private void _checkName(ApplicationUser user) { if (string.IsNullOrEmpty(user.FirstName)) { user.FirstName = "PodNoms"; user.LastName = "User"; } } private async Task _imageify(ApplicationUser user) { if (string.IsNullOrEmpty(user.PictureUrl)) { var gravatar = await this._gravatarClient.GetGravatarImage(user.Email); if (!string.IsNullOrEmpty(gravatar)) { user.PictureUrl = gravatar; } else { int index = Randomisers.RandomInteger(1, 6); user.PictureUrl = $"{_storageSettings.CdnUrl}static/images/avatars/avatar-{index}.svg"; } } } private void _slugify(ApplicationUser user) { if (string.IsNullOrEmpty(user.Slug)) { var name = $"{user.FirstName} {user.LastName}"; var c = name ?? user.Email?.Split('@')[0] ?? string.Empty; if (!string.IsNullOrEmpty(c)) { user.Slug = c.Slugify( from u in Users select u.Slug); } } } } }