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