using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Asp.Versioning; using AutoMapper; using gehGassi.Core.Interfaces; using gehGassi.Core.Services; using gehGassi.Dto; using gehGassi.Dto.DogWalkers; using gehGassi.Dto.Lookup; using gehGassi.Dto.News; using gehGassi.Web.Auth; using gehGassi.Web.Helper; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; using NuGet.Packaging; namespace gehGassi.Web.Controllers.Api { /// /// Controller der Lookups via Api ermöglicht /// [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] [ApiController] [ApiVersion(1)] [Route("api/lookup")] [Route("api/v{v:apiVersion}/lookup")] public class ApiLookupController : ApiBaseController { /// /// Erstellt eine Instanz /// /// Instanz eines IMapper /// Instanz von LocalizationOptions /// Instanz eines IDogOwnerService public ApiLookupController(IMapper mapper, IOptions localizationOptions, IAppUserService appUserService) : base(mapper, localizationOptions, appUserService) { } /// /// Gibt eine Liste von DogOwnern und DogWalkern basierend auf dem Filter zurück /// /// Filter der in Vor- oder Nachnamen enthalten sein muss /// wie viele Datensätze maximal sollen geliefert werden? /// [Route("Entities")] [HttpGet] public async Task LookupEntities(string filter, int take) { var clientOffset = GetClientDateOffset(); var result = new List(); filter = filter.ToLower(); if (User?.Identity != null && User.Identity.IsAuthenticated) { //TODO: hier noch die Relationen berücksichtigen. Mal sehen wie. var appUsersQuery = AppUserService.Query(c => string.Concat(c.FirstName, " ", c.LastName).ToLower().Contains(filter) && c.Deleted == false && c.Locked == false && c.Id != User.AppUserId()); var appUsers = await appUsersQuery.Take(take).ToListAsync().ConfigureAwait(false); result.AddRange(Mapper.Map>(appUsers)); var baseAddress = GetBaseAddress(); foreach (var item in result) { if(!string.IsNullOrWhiteSpace(item.Photo)) item.Photo = $"{baseAddress}/file/documents/thumbnails/{100}/{item.Photo}"; } //Es wird bewusst keine sortierung gemacht. Diese erfolgt in der App return Ok(result); } return NotFound(CommunicationErrors.Common_NotFound); } /// /// Gibt eine Liste von DogWalkern basierend auf der aktuellen Position zurück /// /// Längengrad /// wie viele Datensätze maximal sollen geliefert werden? /// Id des App-Users der ignoriert werden soll, falls ein DogOwner auch Walker ist /// Breitengrad /// [Route("DogWalkers")] [HttpGet] public async Task DogWalkers(string ignoreId, double lat, double lng, int take) { var clientOffset = GetClientDateOffset(); var result = new List(); if (User?.Identity != null && User.Identity.IsAuthenticated) { var walkers = await AppUserService.GetWalkersForAppAsync(ignoreId, lat, lng, take); result.AddRange(Mapper.Map>(walkers)); var baseAddress = GetBaseAddress(); foreach (var item in result) { if (!string.IsNullOrWhiteSpace(item.Photo)) item.Photo = $"{baseAddress}/file/documents/thumbnails/{100}/{item.Photo}"; } //Es wird bewusst keine sortierung gemacht. Diese erfolgt in der App return Ok(result); } return NotFound(CommunicationErrors.Common_NotFound); } /// /// Gibt Detail-Infos zu einem DogWalker zurück /// /// Id des DogWalkers /// [Route("DogWalker")] [HttpGet] public async Task DogWalker(string dogWalkerId) { var clientOffset = GetClientDateOffset(); if (User?.Identity != null && User.Identity.IsAuthenticated) { var walker = await AppUserService.GetWalkerAsync(dogWalkerId); if (walker != null) { var dto = Mapper.Map(walker); var baseAddress = GetBaseAddress(); if (!string.IsNullOrWhiteSpace(dto.Photo)) dto.Photo = $"{baseAddress}/file/documents/thumbnails/{400}/{dto.Photo}"; return Ok(dto); } } return NotFound(CommunicationErrors.Common_NotFound); } } }