#region imports using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using AutoMapper; using Hangfire; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using PodNoms.Api.Models; using PodNoms.Api.Models.ViewModels; using PodNoms.Api.Persistence; using PodNoms.Api.Services.Auth; using PodNoms.Api.Services.Processor; using PodNoms.Api.Utils.Extensions; #endregion namespace PodNoms.Api.Controllers { [Authorize] [Route("[controller]")] public class PodcastController : Controller { private readonly IPodcastRepository _repository; private readonly IUserRepository _userRepository; private readonly IOptions _settings; private readonly IMapper _mapper; private readonly IUnitOfWork _uow; public PodcastController(IPodcastRepository repository, IUserRepository userRepository, IOptions options, IMapper mapper, IUnitOfWork unitOfWork) { this._uow = unitOfWork; this._repository = repository; this._userRepository = userRepository; this._settings = options; this._mapper = mapper; } [HttpGet] public async Task> Get() { var email = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email)?.Value; if (!string.IsNullOrEmpty(email)) { var podcasts = await _repository.GetAllAsync(email); var ret = _mapper.Map, List>(podcasts.ToList()); return ret; } throw new Exception("No local user stored!"); } [HttpGet("{slug}")] public async Task GetBySlug(string slug) { var email = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email)?.Value; if (!string.IsNullOrEmpty(email)) { var podcast = await _repository.GetAsync(email, slug); if (podcast == null) return NotFound(); return new OkObjectResult(_mapper.Map(podcast)); } throw new Exception("No local user stored!"); } [HttpPost] public async Task Post([FromBody] PodcastViewModel vm) { var email = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email)?.Value; var user = _userRepository.Get(email); if (string.IsNullOrEmpty(email) || user == null) return new BadRequestObjectResult("Unable to look up user profile"); if (ModelState.IsValid) { var item = _mapper.Map(vm); item.User = user; var ret = await _repository.AddOrUpdateAsync(item); await _uow.CompleteAsync(); return new OkObjectResult(_mapper.Map(ret)); } return BadRequest("Invalid request data"); } [HttpPut] public async Task Put([FromBody] PodcastViewModel vm) { var email = User.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Email)?.Value; var user = _userRepository.Get(email); if (string.IsNullOrEmpty(email) || user == null) return new BadRequestObjectResult("Unable to look up user profile"); if (ModelState.IsValid) { var podcast = await _repository.GetAsync(vm.Id); if (podcast != null) { var item = _mapper.Map(vm, podcast); await _uow.CompleteAsync(); return new OkObjectResult(_mapper.Map(podcast)); } } return BadRequest("Invalid request data"); } [HttpDelete("{id}")] public async Task Delete(int id) { await this._repository.DeleteAsync(id); await _uow.CompleteAsync(); return Ok(); } } }