using AutoMapper; using gehGassi.Core.Interfaces; using gehGassi.Core.Services; using gehGassi.Dto; using gehGassi.Dto.Common; using gehGassi.Dto.Listings; using gehGassi.Web.Helper; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System.Collections.Generic; using System.Threading.Tasks; using gehGassi.Dto.Advertisements; using Asp.Versioning; namespace gehGassi.Web.Controllers.Api { /// /// Controller der Zugriff auf Werbungen via API ermöglicht /// [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] [ApiController] [ApiVersion(1)] [Route("api/advertisements")] [Route("api/v{v:apiVersion}/advertisements")] public class ApiAdvertisementsController : ApiBaseController { private readonly ILogger _logger; private readonly IGeoLocationService _geoLocationService; private readonly IAdvertisementService _advertisementService; private readonly IAdvertisementCategoryService _advertisementCategoryService; /// /// Erstellt eine Instanz /// /// Instanz eines IMapper /// Instanz eines ILogger /// Instanz von LocalizationOptions /// Instanz eines IDogOwnerService /// Instanz eines IGeoLocationService /// Instanz eines IAdvertisementService /// Instanz eines IAdvertisementCategoryService public ApiAdvertisementsController(IMapper mapper, ILogger logger, IOptions localizationOptions, IAppUserService appUserService, IGeoLocationService geoLocationService, IAdvertisementService advertisementService, IAdvertisementCategoryService advertisementCategoryService) : base(mapper, localizationOptions, appUserService) { _logger = logger; _geoLocationService = geoLocationService; _advertisementService = advertisementService; _advertisementCategoryService = advertisementCategoryService; } /// /// Gibt eine Liste von Werbungen zurück, welche bald ablaufen und basierend auf der Geo-einschränkung zur Verfügung stehen /// /// Abfragemodel /// HTTP 200 wenn erfolgreich [Route("GetAdvertisementsNearEnd")] [HttpPost] public async Task GetAdvertisementsNearEnd(QueryDto model) { var clientOffset = GetClientDateOffset(); if (User?.Identity != null && User.Identity.IsAuthenticated) { var response = new ListResponseDto(); //Geodaten holen. //Entweder wurde lat und lng geliefert, oder wir müssen über den benutzer und den app-mode entscheiden var (country, state) = await GetGeoDataAsync(model); var queryResult = await _advertisementService.GetNearEndForAppAsync(country, state, model.Location.Lat.Value, model.Location.Lng.Value, model.Language, LocalizationOptions.Value.DefaultCulture, model.Skip, model.Take); response.Total = queryResult.total; var dtoList = Mapper.Map>(queryResult.list); var baseAddress = GetBaseAddress(); foreach (var dtoItem in dtoList) { if(!string.IsNullOrWhiteSpace(dtoItem.Image)) dtoItem.Image = $"{baseAddress}/file/documents/thumbnails/{400}/{dtoItem.Image}"; if (!string.IsNullOrWhiteSpace(dtoItem.Image2)) dtoItem.Image2 = $"{baseAddress}/file/documents/thumbnails/{400}/{dtoItem.Image2}"; if (!string.IsNullOrWhiteSpace(dtoItem.ImageLanguage)) dtoItem.ImageLanguage = $"{baseAddress}/file/documents/thumbnails/{400}/{dtoItem.ImageLanguage}"; if (!string.IsNullOrWhiteSpace(dtoItem.Image2Language)) dtoItem.Image2Language = $"{baseAddress}/file/documents/thumbnails/{400}/{dtoItem.Image2Language}"; } response.List = dtoList; response.Take = model.Take; response.Skip = model.Skip; return Ok(response); } return NotFound(CommunicationErrors.Common_NotFound); } /// /// Gibt eine Werbung zurück. /// Diese muss laufen, darf nicht gelöscht sein und das Enddatum darf nicht erreicht sein /// /// Id der gesuchten Werbung /// Gewünschte Sprache /// HTTP 200 OK wenn erfolgreich [Route("GetRunningAdvertisement")] [HttpGet] public async Task GetRunningAdvertisement(string id, string language) { var clientOffset = GetClientDateOffset(); if (User?.Identity != null && User.Identity.IsAuthenticated) { var advertisement = await _advertisementService.GetRunningWithNamesAsync(id, language, LocalizationOptions.Value.DefaultCulture); if (advertisement != null) { var dto = Mapper.Map(advertisement); var baseAddress = GetBaseAddress(); if (!string.IsNullOrWhiteSpace(dto.Image)) dto.Image = $"{baseAddress}/file/documents/thumbnails/{400}/{dto.Image}"; if (!string.IsNullOrWhiteSpace(dto.Image2)) dto.Image2 = $"{baseAddress}/file/documents/thumbnails/{400}/{dto.Image2}"; if (!string.IsNullOrWhiteSpace(dto.ImageLanguage)) dto.ImageLanguage = $"{baseAddress}/file/documents/thumbnails/{400}/{dto.ImageLanguage}"; if (!string.IsNullOrWhiteSpace(dto.Image2Language)) dto.Image2Language = $"{baseAddress}/file/documents/thumbnails/{400}/{dto.Image2Language}"; return Ok(dto); } } return NotFound(CommunicationErrors.Common_NotFound); } /// /// Gibt die Liste der Werbungskategorien zurück /// Diese müssen den Status ONLINE haben /// /// Gewünschte Sprache /// HTTP 200 OK wenn erfolgreich [Route("GetCategoriesOnline")] [HttpGet] public async Task GetCategoriesOnline(string language) { var clientOffset = GetClientDateOffset(); if (User?.Identity != null && User.Identity.IsAuthenticated) { var categories = await _advertisementCategoryService.GetOnlineWithNamesAsync(language, LocalizationOptions.Value.DefaultCulture); if (categories != null) { var dtoList = Mapper.Map>(categories); var baseAddress = GetBaseAddress(); foreach (var dtoItem in dtoList) { if (!string.IsNullOrWhiteSpace(dtoItem.Image)) dtoItem.Image = $"{baseAddress}/file/documents/thumbnails/{400}/{dtoItem.Image}"; if (!string.IsNullOrWhiteSpace(dtoItem.ImageLanguage)) dtoItem.ImageLanguage = $"{baseAddress}/file/documents/thumbnails/{400}/{dtoItem.ImageLanguage}"; } return Ok(dtoList); } } return NotFound(CommunicationErrors.Common_NotFound); } /// /// Gibt eine Liste von Werbungen in einer Kategorie zurück /// /// Abfragemodel /// HTTP 200 wenn erfolgreich [Route("GetAdvertisementsByCategory")] [HttpPost] public async Task GetAdvertisementsByCategory(AdvertisementQueryDto model) { var clientOffset = GetClientDateOffset(); if (User?.Identity != null && User.Identity.IsAuthenticated) { var response = new ListResponseDto(); //Geodaten holen. //Entweder wurde lat und lng geliefert, oder wir müssen über den benutzer und den app-mode entscheiden var (country, state) = await GetGeoDataAsync(model); var queryResult = await _advertisementService.GetByCategoryForAppAsync(model.CategoryId, country, state, model.Location.Lat.Value, model.Location.Lng.Value, model.Language, LocalizationOptions.Value.DefaultCulture, model.Skip, model.Take); response.Total = queryResult.total; var dtoList = Mapper.Map>(queryResult.list); var baseAddress = GetBaseAddress(); foreach (var dtoItem in dtoList) { if (!string.IsNullOrWhiteSpace(dtoItem.Image)) dtoItem.Image = $"{baseAddress}/file/documents/thumbnails/{400}/{dtoItem.Image}"; if (!string.IsNullOrWhiteSpace(dtoItem.Image2)) dtoItem.Image2 = $"{baseAddress}/file/documents/thumbnails/{400}/{dtoItem.Image2}"; if (!string.IsNullOrWhiteSpace(dtoItem.ImageLanguage)) dtoItem.ImageLanguage = $"{baseAddress}/file/documents/thumbnails/{400}/{dtoItem.ImageLanguage}"; if (!string.IsNullOrWhiteSpace(dtoItem.Image2Language)) dtoItem.Image2Language = $"{baseAddress}/file/documents/thumbnails/{400}/{dtoItem.Image2Language}"; } response.List = dtoList; response.Take = model.Take; response.Skip = model.Skip; return Ok(response); } return NotFound(CommunicationErrors.Common_NotFound); } } }