src/Modules/SimplCommerce.Module.Comments/Areas/Comments/Controllers/CommentApiController.cs (120 lines of code) (raw):
using System;
using System.Linq;
using System.Threading.Tasks;
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SimplCommerce.Infrastructure.Web.SmartTable;
using SimplCommerce.Module.Comments.Data;
using SimplCommerce.Module.Comments.Models;
namespace SimplCommerce.Module.Comments.Areas.Comments.Controllers
{
[Area("Comments")]
[Authorize(Roles = "admin")]
[Route("api/comments")]
public class CommentApiController : Controller
{
private readonly ICommentRepository _commentRepository;
private readonly IMediator _mediator;
public CommentApiController(ICommentRepository commentRepository, IMediator mediator)
{
_commentRepository = commentRepository;
_mediator = mediator;
}
[HttpGet]
public ActionResult Get(int status, int numRecords)
{
var reviewStatus = (CommentStatus) status;
if ((numRecords <= 0) || (numRecords > 100))
{
numRecords = 5;
}
var model = _commentRepository
.List()
.Where(x => x.Status == reviewStatus)
.OrderByDescending(x => x.CreatedOn)
.Take(numRecords)
.Select(x => new
{
x.Id,
x.CommenterName,
x.EntityName,
x.EntitySlug,
x.CommentText,
x.ParentId,
Status = x.Status.ToString(),
x.CreatedOn
});
return Json(model);
}
[HttpPost("grid")]
public ActionResult List([FromBody] SmartTableParam param)
{
var query = _commentRepository.List();
if (param.Search.PredicateObject != null)
{
dynamic search = param.Search.PredicateObject;
if (search.Id != null)
{
long id = search.Id;
query = query.Where(x => x.Id == id);
}
if (search.EntityName != null)
{
string entityName = search.EntityName;
query = query.Where(x => x.EntityName == entityName);
}
if (search.Status != null)
{
var status = (CommentStatus) search.Status;
query = query.Where(x => x.Status == status);
}
if (search.CreatedOn != null)
{
if (search.CreatedOn.before != null)
{
DateTimeOffset before = search.CreatedOn.before;
query = query.Where(x => x.CreatedOn <= before);
}
if (search.CreatedOn.after != null)
{
DateTimeOffset after = search.CreatedOn.after;
query = query.Where(x => x.CreatedOn >= after);
}
}
}
var comments = query.ToSmartTableResult(
param,
x => new
{
x.Id,
x.CommenterName,
x.CommentText,
x.EntityName,
x.EntitySlug,
x.ParentId,
Type = x.ParentId == null ? "Comment" : "Reply",
Status = x.Status.ToString(),
x.CreatedOn
});
return Json(comments);
}
[HttpPost("change-status/{id}")]
public async Task<IActionResult> ChangeStatus(long id, [FromBody] int statusId)
{
var comment = _commentRepository.Query().FirstOrDefault(x => x.Id == id);
if (comment == null)
{
return NotFound();
}
if (Enum.IsDefined(typeof(CommentStatus), statusId))
{
comment.Status = (CommentStatus) statusId;
_commentRepository.SaveChanges();
await _commentRepository.SaveChangesAsync();
return Accepted();
}
return BadRequest(new {Error = "unsupported order status"});
}
}
}