src/Modules/SimplCommerce.Module.Cms/Areas/Cms/Controllers/MenuApiController.cs (182 lines of code) (raw):
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using SimplCommerce.Infrastructure.Data;
using SimplCommerce.Module.Cms.Areas.Cms.ViewModels;
using SimplCommerce.Module.Cms.Models;
namespace SimplCommerce.Module.Cms.Areas.Cms.Controllers
{
[Area("Cms")]
[Authorize(Roles = "admin")]
[Route("api/menus")]
public class MenuApiController : Controller
{
private readonly IRepository<Menu> _menuRepository;
private readonly IRepository<MenuItem> _menuItemRepository;
public MenuApiController(IRepository<Menu> menuRepository, IRepository<MenuItem> menuItemRepository)
{
_menuRepository = menuRepository;
_menuItemRepository = menuItemRepository;
}
[HttpGet]
public async Task<IActionResult> Get()
{
var menuList = await _menuRepository.Query()
.Select(x => new
{
x.Id,
x.Name,
x.IsPublished,
x.IsSystem
})
.ToListAsync();
return Json(menuList);
}
[HttpGet("{id}")]
public async Task<IActionResult> Get(long id)
{
var menu = await _menuRepository.Query()
.Include(x => x.MenuItems)
.ThenInclude(m => m.Entity)
.FirstOrDefaultAsync(x => x.Id == id);
if(menu == null)
{
return NotFound();
}
var model = new MenuForm
{
Id = menu.Id,
Name = menu.Name,
IsPublished = menu.IsPublished,
Items = menu.MenuItems.Select(x => new MenuItemForm
{
Id = x.Id,
EntityId = x.EntityId,
ParentId = x.ParentId,
Name = x.Entity == null ? x.Name : x.Entity.Name,
CustomLink = x.CustomLink,
DisplayOrder = x.DisplayOrder,
}).OrderBy(x => x.DisplayOrder).ToList()
};
return Json(model);
}
[HttpPost("{id}/add-items")]
public async Task<IActionResult> AddItem(long id, [FromBody] IList<MenuItemForm> model)
{
if (ModelState.IsValid)
{
var menu = await _menuRepository.Query().Include(x => x.MenuItems).FirstOrDefaultAsync(x => x.Id == id);
if(menu == null)
{
return NotFound();
}
var addedMenuItems = new List<MenuItem>();
foreach (var item in model)
{
var menuItem = new MenuItem
{
Menu = menu,
CustomLink = item.CustomLink,
Name = item.Name,
EntityId = item.EntityId,
ParentId = item.ParentId,
DisplayOrder = item.DisplayOrder,
};
menu.MenuItems.Add(menuItem);
addedMenuItems.Add(menuItem);
}
await _menuRepository.SaveChangesAsync();
return Ok(addedMenuItems.Select(x => new MenuItemForm
{
Id = x.Id,
EntityId = x.EntityId,
Name = x.Name,
CustomLink = x.CustomLink
}));
}
return BadRequest(ModelState);
}
[HttpDelete("delete-item/{id}")]
public async Task<IActionResult> DeleteItem(long id)
{
var menuItem = await _menuItemRepository.Query().FirstOrDefaultAsync(x => x.Id == id);
if (menuItem == null)
{
return NotFound();
}
_menuItemRepository.Remove(menuItem);
await _menuItemRepository.SaveChangesAsync();
return NoContent();
}
[HttpPost]
public async Task<IActionResult> Post([FromBody] MenuForm model)
{
if (ModelState.IsValid)
{
var menu = new Menu
{
Name = model.Name,
IsPublished = model.IsPublished
};
_menuRepository.Add(menu);
await _menuRepository.SaveChangesAsync();
return Json(menu);
}
return BadRequest(ModelState);
}
[HttpPut("{id}")]
public async Task<IActionResult> Put(long id, [FromBody] MenuForm model)
{
if (ModelState.IsValid)
{
var menu = await _menuRepository.Query().Include(x => x.MenuItems).FirstOrDefaultAsync(x => x.Id == id);
if(menu == null)
{
return NotFound();
}
menu.Name = model.Name;
menu.IsPublished = model.IsPublished;
foreach(var item in menu.MenuItems)
{
var modelMenuItem = model.Items.FirstOrDefault(x => x.Id == item.Id);
if (modelMenuItem == null)
{
continue;
}
item.EntityId = modelMenuItem.EntityId;
item.Name = modelMenuItem.Name;
item.CustomLink = modelMenuItem.CustomLink;
item.ParentId = modelMenuItem.ParentId;
item.DisplayOrder = modelMenuItem.DisplayOrder;
}
var deletedMenuItems = menu.MenuItems.Where(x => !model.Items.Any(m => m.Id == x.Id));
foreach (var item in deletedMenuItems)
{
_menuItemRepository.Remove(item);
}
await _menuRepository.SaveChangesAsync();
return Accepted();
}
return BadRequest(ModelState);
}
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(long id)
{
var menu = await _menuRepository.Query().FirstOrDefaultAsync(x => x.Id == id);
if (menu == null)
{
return NotFound();
}
if (menu.IsSystem)
{
return BadRequest(new { Error = "A system menu cannot be deleted." });
}
_menuRepository.Remove(menu);
await _menuRepository.SaveChangesAsync();
return NoContent();
}
}
}