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
}
}