using AsbCloudApp.Data;
using AsbCloudApp.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Threading;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
namespace AsbCloudWebApi.Controllers
{
///
/// CRUD контроллер для админки.
///
///
///
[ApiController]
[Authorize]
public abstract class CrudController : ControllerBase
where T : IId
where TService : ICrudService
{
protected readonly TService service;
public List Roles { get; } = new List { "Администратор" };
public CrudController(TService service)
{
this.service = service;
}
///
/// Получить страницу с записями в PaginationContainer
///
/// пропустить skip записей
/// получить take записей
/// CancellationToken
/// страница с записями в PaginationContainer
[HttpGet()]
public virtual async Task>> GetPage(int skip = 0, int take = 32,
CancellationToken token = default)
{
if (!Roles.Any(role => User.IsInRole(role)))
return Forbid();
var result = await service.GetPageAsync(skip, take, token).ConfigureAwait(false);
return Ok(result);
}
///
/// Получить одну запись по Id
///
/// id записи
///
/// запись
[HttpGet("{id}")]
public virtual async Task> Get(int id, CancellationToken token = default)
{
if (!Roles.Any(role => User.IsInRole(role)))
return Forbid();
var result = await service.GetAsync(id, token).ConfigureAwait(false);
return Ok(result);
}
///
/// Добавить запись
///
/// запись
///
/// 1 - добавлено, 0 - нет
[HttpPost]
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
public virtual async Task Insert([FromBody] T value, CancellationToken token = default)
{
if (!Roles.Any(role => User.IsInRole(role)))
return Forbid();
var result = await service.InsertAsync(value, token).ConfigureAwait(false);
return Ok(result);
}
///
/// Редактировать запись по id
///
/// id записи
/// запись
///
/// 1 - успешно отредактировано, 0 - нет
[HttpPut("{id}")]
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
public virtual async Task Put(int id, [FromBody] T value, CancellationToken token = default)
{
if (!Roles.Any(role => User.IsInRole(role)))
return Forbid();
var result = await service.UpdateAsync(id, value, token).ConfigureAwait(false);
return Ok(result);
}
///
/// Удалить запись по id
///
/// id записи
///
/// 1 - успешно удалено, 0 - нет
[HttpDelete("{id}")]
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
public virtual async Task Delete(int id, CancellationToken token = default)
{
if (!Roles.Any(role => User.IsInRole(role)))
return Forbid();
var result = await service.DeleteAsync(id, token).ConfigureAwait(false);
return Ok(result);
}
}
}