using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Logging; using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Identity; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement { internal class ExternalLoginRepository : NPocoRepositoryBase, IExternalLoginRepository { public ExternalLoginRepository(IScopeAccessor scopeAccessor, AppCaches cache, ILogger logger) : base(scopeAccessor, cache, logger) { } public void DeleteUserLogins(int memberId) { Database.Execute("DELETE FROM ExternalLogins WHERE UserId=@userId", new { userId = memberId }); } public void SaveUserLogins(int memberId, IEnumerable logins) { //clear out logins for member Database.Execute("DELETE FROM umbracoExternalLogin WHERE userId=@userId", new { userId = memberId }); //add them all foreach (var l in logins) { Database.Insert(new ExternalLoginDto { LoginProvider = l.LoginProvider, ProviderKey = l.ProviderKey, UserId = memberId, CreateDate = DateTime.Now }); } } protected override IIdentityUserLogin PerformGet(int id) { var sql = GetBaseQuery(false); sql.Where(GetBaseWhereClause(), new { id = id }); var dto = Database.Fetch(SqlSyntax.SelectTop(sql, 1)).FirstOrDefault(); if (dto == null) return null; var entity = ExternalLoginFactory.BuildEntity(dto); // reset dirty initial properties (U4-1946) entity.ResetDirtyProperties(false); return entity; } protected override IEnumerable PerformGetAll(params int[] ids) { if (ids.Any()) { return PerformGetAllOnIds(ids); } var sql = GetBaseQuery(false); return ConvertFromDtos(Database.Fetch(sql)) .ToArray();// we don't want to re-iterate again! } private IEnumerable PerformGetAllOnIds(params int[] ids) { if (ids.Any() == false) yield break; foreach (var id in ids) { yield return Get(id); } } private IEnumerable ConvertFromDtos(IEnumerable dtos) { foreach (var entity in dtos.Select(ExternalLoginFactory.BuildEntity)) { // reset dirty initial properties (U4-1946) ((BeingDirtyBase)entity).ResetDirtyProperties(false); yield return entity; } } protected override IEnumerable PerformGetByQuery(IQuery query) { var sqlClause = GetBaseQuery(false); var translator = new SqlTranslator(sqlClause, query); var sql = translator.Translate(); var dtos = Database.Fetch(sql); foreach (var dto in dtos) { yield return Get(dto.Id); } } protected override Sql GetBaseQuery(bool isCount) { var sql = Sql(); if (isCount) sql.SelectCount(); else sql.SelectAll(); sql.From(); return sql; } protected override string GetBaseWhereClause() { return "umbracoExternalLogin.id = @id"; } protected override IEnumerable GetDeleteClauses() { var list = new List { "DELETE FROM umbracoExternalLogin WHERE id = @id" }; return list; } protected override Guid NodeObjectTypeId { get { throw new NotImplementedException(); } } protected override void PersistNewItem(IIdentityUserLogin entity) { entity.AddingEntity(); var dto = ExternalLoginFactory.BuildDto(entity); var id = Convert.ToInt32(Database.Insert(dto)); entity.Id = id; entity.ResetDirtyProperties(); } protected override void PersistUpdatedItem(IIdentityUserLogin entity) { entity.UpdatingEntity(); var dto = ExternalLoginFactory.BuildDto(entity); Database.Update(dto); entity.ResetDirtyProperties(); } } }