using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Props.Data; using Props.Models.Search; using Props.Models.User; using Props.Shop.Framework; namespace Props.Controllers { public class SearchOutlineController : ApiControllerBase { private ApplicationDbContext dbContext; private UserManager userManager; public SearchOutlineController(UserManager userManager, ApplicationDbContext dbContext) { this.userManager = userManager; this.dbContext = dbContext; } [HttpDelete] [Authorize] [Route("{name:required}")] public async Task DeleteSearchOutline(string name) { if (string.IsNullOrEmpty(name)) { return BadRequest(); } ApplicationUser user = await userManager.GetUserAsync(User); SearchOutlinePreferences searchOutlinePrefs = user.searchOutlinePreferences; searchOutlinePrefs.SearchOutlines.Remove(searchOutlinePrefs.SearchOutlines.Single((outline) => name.Equals(outline.Name))); await userManager.UpdateAsync(user); return NoContent(); } [HttpPost] [Authorize] [Route("{name:required}")] public async Task PostSearchOutline(string name) { if (string.IsNullOrEmpty(name)) return BadRequest(); ApplicationUser user = await userManager.GetUserAsync(User); SearchOutline searchOutline = user.searchOutlinePreferences.SearchOutlines.SingleOrDefault((outline) => name.Equals(outline.Name)); if (searchOutline != null) return BadRequest(); searchOutline = new SearchOutline(); searchOutline.Name = name; user.searchOutlinePreferences.SearchOutlines.Add(searchOutline); await userManager.UpdateAsync(user); return NoContent(); } [HttpPut] [Authorize] [Route("{name:required}/Filters")] public async Task PutFilters(string name, Filters filters) { if (string.IsNullOrEmpty(name)) return BadRequest(); ApplicationUser user = await userManager.GetUserAsync(User); SearchOutline searchOutline = await GetSearchOutlineByName(name); if (searchOutline == null) return BadRequest(); searchOutline.Filters = filters; await userManager.UpdateAsync(user); return NoContent(); } [HttpPut] [Authorize] [Route("{outlineName:required}/DisabledShops")] public async Task PutShopSelection(string outlineName, ISet disabledShops) { if (string.IsNullOrEmpty(outlineName)) return BadRequest(); if (disabledShops == null) return BadRequest(); ApplicationUser user = await userManager.GetUserAsync(User); SearchOutline searchOutline = await GetSearchOutlineByName(outlineName); if (searchOutline == null) return BadRequest(); searchOutline.DisabledShops.Clear(); searchOutline.DisabledShops.UnionWith(disabledShops); await userManager.UpdateAsync(user); return NoContent(); } [HttpPut] [Authorize] [Route("{oldName:required}/Name/{newName:required}")] public async Task PutName(string oldName, string newName) { if (oldName == newName) return BadRequest(); ApplicationUser user = await userManager.GetUserAsync(User); SearchOutline outline = await GetSearchOutlineByName(oldName); if (outline == null) return BadRequest(); if (user.searchOutlinePreferences.SearchOutlines.Any((outline) => outline.Name.Equals(newName))) return BadRequest(); outline.Name = newName; if (user.searchOutlinePreferences.NameOfLastUsed == oldName) { user.searchOutlinePreferences.NameOfLastUsed = newName; } await userManager.UpdateAsync(user); return NoContent(); } [HttpPut] [Authorize] [Route("{name:required}/LastUsed")] public async Task PutLastUsed(string name) { SearchOutline outline = await GetSearchOutlineByName(name); if (outline == null) return BadRequest(); ApplicationUser user = await userManager.GetUserAsync(User); user.searchOutlinePreferences.NameOfLastUsed = name; await userManager.UpdateAsync(user); return NoContent(); } [HttpGet] [Authorize] [Route("{name:required}/Filters")] public async Task GetFilters(string name) { Filters filters = (await GetSearchOutlineByName(name))?.Filters; if (filters == null) return BadRequest(); return Ok(filters); } [HttpGet] [Authorize] [Route("{name:required}/DisabledShops")] public async Task GetDisabledShops(string name) { SearchOutline searchOutline = await GetSearchOutlineByName(name); if (searchOutline == null) { return BadRequest(); } return Ok(searchOutline.DisabledShops); } [HttpGet] [Authorize] [Route("Names")] public async Task GetSearchOutlineNames() { ApplicationUser user = await userManager.GetUserAsync(User); return Ok(user.searchOutlinePreferences.SearchOutlines.Select((outline, Index) => outline.Name)); } [HttpGet] [Authorize] [Route("LastUsed")] public async Task GetLastSearchOutlineName() { SearchOutline searchOutline = await GetLastUsedSearchOutline(); return Ok(searchOutline?.Name); } [HttpGet] [Route("DefaultDisabledShops")] public IActionResult GetDefaultDisabledShops() { return Ok(new SearchOutline.ShopSelector()); } [HttpGet] [Route("DefaultFilters")] public IActionResult GetDefaultFilter() { return Ok(new Filters()); } [HttpGet] [Route("DefaultName")] public async Task GetDefaultName() { string nameTemplate = "Search Outline {0}"; if (User.Identity.IsAuthenticated) { ApplicationUser user = await userManager.GetUserAsync(User); int number = user.searchOutlinePreferences.SearchOutlines.Count; string name = null; do { name = string.Format(nameTemplate, number); number += 1; } while (user.searchOutlinePreferences.SearchOutlines.Any((outline) => name.Equals(outline.Name))); return Ok(name); } return Ok("Search Outline"); } private async Task GetLastUsedSearchOutline() { if (!User.Identity.IsAuthenticated) return null; ApplicationUser user = await userManager.GetUserAsync(User); return user.searchOutlinePreferences.SearchOutlines.SingleOrDefault((outline) => outline.Name.Equals(user.searchOutlinePreferences.NameOfLastUsed)); } private async Task GetSearchOutlineByName(string name) { if (name == null) throw new ArgumentNullException("name"); if (!User.Identity.IsAuthenticated) return null; ApplicationUser user = await userManager.GetUserAsync(User); return user.searchOutlinePreferences.SearchOutlines.SingleOrDefault(outline => outline.Name.Equals(name)); } } }