using skydiveLogs_api.Domain; using skydiveLogs_api.DomainBusiness.Interfaces; using skydiveLogs_api.DomainService.Repositories; using System; using System.Collections.Generic; using System.Linq; namespace skydiveLogs_api.DomainBusiness { public class DropZoneService : IDropZoneService { #region Public Constructors public DropZoneService(IDropZoneRepository dropZoneRepository, IFavoriteDropZoneRepository favoriteDropZoneRepository, IIdentityService identityService, ICacheService cacheService) { _dropZoneRepository = dropZoneRepository; _favoriteDropZoneRepository = favoriteDropZoneRepository; _identityService = identityService; _cacheService = cacheService; } #endregion Public Constructors #region Public Methods /// /// Adds a new drop zone to the system. /// /// The DropZone entity containing the new drop zone data. public void AddNewDz(DropZone newdropZone) { _dropZoneRepository.Add(newdropZone); _cacheService.Delete(CacheType.DropZone); } /// /// Adds a drop zone to the user's favorites. /// /// The drop zone ID to add to favorites. /// True if the drop zone was added to favorites, false otherwise. public bool AddToFavorite(int dzId) { var dzToAddToFavorite = GetDzById(dzId); var favoriteDz = new FavoriteDropZone { DropZone = dzToAddToFavorite, User = _identityService.ConnectedUser }; var result = _favoriteDropZoneRepository.Add(favoriteDz); return result > 0; } /// /// Deletes a drop zone by its ID. /// /// The drop zone ID to delete. public void DeleteDzById(int id) { throw new NotImplementedException(); } /// /// Retrieves a list of all drop zones with favorites status. /// /// A collection of DropZone entities containing all drop zones with their favorite status. public IEnumerable GetAllDzs() { var results = Enumerable.Empty(); var dropzones = GetAllRefDzs(); var favorites = _favoriteDropZoneRepository.GetAll(_identityService.ConnectedUser); results = from dropZone in dropzones join favorite in favorites on dropZone.Id equals favorite.DropZone.Id into tmp from favoriteDz in tmp.DefaultIfEmpty() select new DropZone { Id = dropZone.Id, Address = dropZone.Address, Email = dropZone.Email, Latitude = dropZone.Latitude, Longitude = dropZone.Longitude, Name = dropZone.Name, Type = dropZone.Type, Website = dropZone.Website, IsFavorite = !(favoriteDz == null) }; return results.ToList(); } /// /// Retrieves a drop zone by its ID. /// /// The drop zone ID to retrieve. /// A DropZone entity containing the drop zone details. public DropZone GetDzById(int id) { var allDzs = GetAllRefDzs(); return allDzs.Single(g => g.Id == id); } /// /// Removes a drop zone from the user's favorites. /// /// The drop zone ID to remove from favorites. /// True if the drop zone was removed from favorites, false otherwise. public bool RemoveToFavorite(int dzId) { var result = _favoriteDropZoneRepository.Delete(dzId, _identityService.ConnectedUser.Id); _cacheService.Delete(CacheType.DropZone); return result > 0; } /// /// Updates an existing drop zone. /// /// The drop zone ID to update. /// DropZone entity containing the updated drop zone data. /// Whether to reset the cache after update. /// True if the update was successful, false otherwise. public bool UpdateDz(int id, DropZone dropZone, bool resetCache = true) { dropZone.Id = id; var result = _dropZoneRepository.Update(dropZone); if (resetCache && result) _cacheService.Delete(CacheType.DropZone); return result; } private IEnumerable GetAllRefDzs() { if (!_cacheService.Contains(CacheType.DropZone)) _cacheService.Put(CacheType.DropZone, _dropZoneRepository.GetAll(), 5 * 60 * 1000); return _cacheService.Get>(CacheType.DropZone); } #endregion Public Methods #region Private Fields private readonly ICacheService _cacheService; private readonly IDropZoneRepository _dropZoneRepository; private readonly IFavoriteDropZoneRepository _favoriteDropZoneRepository; private readonly IIdentityService _identityService; #endregion Private Fields } }