namespace LOC.Website.Common.Models { using System.Collections.Generic; using System.Data.Entity; using System.Linq; using Core.Model.Account; using Core.Model.Server; using Core.Tokens.Client; using Data; using System; using System.Data.SqlClient; public class PetAdministrator : IPetAdministrator { private readonly INautilusRepositoryFactory _repositoryFactory; private readonly ILogger _logger; public PetAdministrator(INautilusRepositoryFactory repositoryFactory, ILogger logger) { _repositoryFactory = repositoryFactory; _logger = logger; } public List GetPets(List petTokens) { using (var repository = _repositoryFactory.CreateRepository()) { bool added = false; foreach (var item in petTokens.Where(item => !repository.Any(x => x.PetType == item.PetType))) { repository.Add(item); added = true; } if (added) repository.CommitChanges(); return repository.GetAll().Include(x => x.SalesPackage).ToList(); } } public List GetPetExtras(List petExtraTokens) { using (var repository = _repositoryFactory.CreateRepository()) { bool added = false; foreach (var item in petExtraTokens.Where(item => !repository.Any(x => x.Name == item.Name && x.Material == item.Material))) { repository.Add(item); added = true; } if (added) repository.CommitChanges(); return repository.GetAll().Include(x => x.SalesPackage).ToList(); } } public void AddPet(PetChangeToken token) { using (var repository = _repositoryFactory.CreateRepository()) { var account = repository.Where(x => x.Name == token.Name).Include(x => x.Pets).FirstOrDefault(); if (account == null) return; account.Pets.Add(new OwnedPet { PetType = token.PetType, PetName = token.PetName }); repository.CommitChanges(); } } public void UpdatePet(PetChangeToken token) { using (var repository = _repositoryFactory.CreateRepository()) { var account = repository.Where(x => x.Name == token.Name).Include(x => x.Pets).FirstOrDefault(); if (account == null) return; var pet = account.Pets.FirstOrDefault(x => x.PetType.Equals(token.PetType)); if (pet == null) return; account.Pets.RemoveAll(x => x.PetType.Equals(token.PetType) && x.OwnedPetId != pet.OwnedPetId); pet.PetName = token.PetName; repository.Edit(pet); repository.Edit(account); repository.CommitChanges(); } } public void RemovePet(PetChangeToken token) { using (var repository = _repositoryFactory.CreateRepository()) { var account = repository.Where(x => x.Name == token.Name).Include(x => x.Pets).FirstOrDefault(); if (account == null) return; var ownedPet = account.Pets.FirstOrDefault(x => x.PetType == token.PetType); if (ownedPet == null) return; account.Pets.Remove(ownedPet); repository.CommitChanges(); } } public void AddPetNameTag(string name) { using (var repository = _repositoryFactory.CreateRepository()) { var account = repository.Where(x => x.Name == name).FirstOrDefault(); if (account == null) return; account.PetNameTagCount++; repository.CommitChanges(); } } public void RemovePetNameTag(string name) { using (var repository = _repositoryFactory.CreateRepository()) { var account = repository.Where(x => x.Name == name).FirstOrDefault(); if (account == null) return; account.PetNameTagCount--; if (account.PetNameTagCount < 0) account.PetNameTagCount = 0; repository.CommitChanges(); } } #region IPetAdministrator Members public List GetBulkPets(int start, int count) { using (var repository = _repositoryFactory.CreateRepository()) { try { return repository.Context.Database.SqlQuery(@"SELECT OwnedPetId AS PetId, Uuid, PetType, PetName FROM (SELECT OwnedPetId, A.Uuid, PetType, PetName, ROW_NUMBER() OVER (ORDER BY OwnedPetId) as row FROM Nautilus.dbo.OwnedPets INNER JOIN Nautilus.dbo.Accounts AS A ON A.AccountId = Account_AccountId) a WHERE row > " + start + @" AND row <= " + count + @";", string.Empty).ToList(); } catch (Exception ex) { _logger.Log("ERROR", ex.Message + " : " + ex.InnerException); } return new List(); } } #endregion } }