using System.Collections.Generic; using System.Threading.Tasks; using AutoMapper; using EstusShots.Server.Models; using EstusShots.Shared.Interfaces; using EstusShots.Shared.Interfaces.Controllers; using EstusShots.Shared.Models; using EstusShots.Shared.Models.Parameters; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Dto = EstusShots.Shared.Dto; namespace EstusShots.Server.Services { public class DrinksService : IDrinksController { private readonly ILogger _logger; private readonly IMapper _mapper; private readonly EstusShotsContext _context; public DrinksService(ILogger logger, IMapper mapper, EstusShotsContext context) { _logger = logger; _mapper = mapper; _context = context; } public async Task> GetDrinks(GetDrinksParameter parameter) { var drinks = await _context.Drinks.ToListAsync(); var dtos = _mapper.Map>(drinks); return new ApiResponse(new GetDrinksResponse(dtos)); } public async Task> GetDrinkDetails(GetDrinkDetailsParameter parameter) { var drink = await _context.Drinks.FindAsync(parameter.DrinkId); if (drink == null) { _logger.LogWarning($"Drink with ID '{parameter.DrinkId}' was not found in database"); return new ApiResponse(new OperationResult(false, "Object not found")); } var dto = _mapper.Map(drink); return new ApiResponse(new GetDrinkDetailsResponse(dto)); } public async Task> SaveDrink(SaveDrinkParameter parameter) { if (parameter.Drink.DrinkId.IsEmpty()) { var drink = _mapper.Map(parameter.Drink); _context.Drinks.Add(drink); var count = await _context.SaveChangesAsync(); _logger.LogInformation($"Created drink '{drink.DrinkId}' ({count} rows updated)"); return new ApiResponse(new SaveDrinkResponse(drink.DrinkId)); } else { var drink = await _context.Drinks.FindAsync(parameter.Drink.DrinkId); if (drink == null) { _logger.LogError($"Cannot update drink '{parameter.Drink.DrinkId}'. Not in database."); return new ApiResponse(new OperationResult(false, "Object not found")); } _context.Drinks.Update(drink); _mapper.Map(parameter.Drink, drink); var count = await _context.SaveChangesAsync(); _logger.LogInformation($"Updated drink '{drink.DrinkId}' ({count} rows updated)"); return new ApiResponse(new SaveDrinkResponse(drink.DrinkId)); } } } }