complete controllers
This commit is contained in:
452
Server/Controller/EventApiController.cs
Normal file
452
Server/Controller/EventApiController.cs
Normal file
@@ -0,0 +1,452 @@
|
||||
using Blahblah.FlowerStory.Server.Data;
|
||||
using Blahblah.FlowerStory.Server.Data.Model;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace Blahblah.FlowerStory.Server.Controller;
|
||||
|
||||
/// <summary>
|
||||
/// 事件相关 API 服务
|
||||
/// </summary>
|
||||
[ApiController]
|
||||
[Produces("application/json")]
|
||||
[Route("api/event")]
|
||||
public class EventApiController : BaseController
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public EventApiController(FlowerDatabase database, ILogger<BaseController>? logger = null) : base(database, logger)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取用户相关所有符合条件的事件
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 请求示例:
|
||||
///
|
||||
/// GET /api/event/query
|
||||
/// Authorization: authorization id
|
||||
///
|
||||
/// 参数:
|
||||
///
|
||||
/// eid: int?
|
||||
/// key: string?
|
||||
/// from: long?
|
||||
/// to: long?
|
||||
/// p: bool?
|
||||
///
|
||||
/// </remarks>
|
||||
/// <param name="eventId">事件类型 id</param>
|
||||
/// <param name="key">查询关键字</param>
|
||||
/// <param name="from">起始日期</param>
|
||||
/// <param name="to">结束日期</param>
|
||||
/// <param name="includePhoto">是否包含图片</param>
|
||||
/// <returns>会话有效则返回符合条件的花草集</returns>
|
||||
/// <response code="200">返回符合条件的花草集</response>
|
||||
/// <response code="401">未找到登录会话或已过期</response>
|
||||
/// <response code="403">用户已禁用</response>
|
||||
/// <response code="404">未找到关联用户</response>
|
||||
[Route("query", Name = "queryEvents")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[HttpGet]
|
||||
[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
|
||||
public ActionResult<RecordItem[]> GetRecords(
|
||||
[FromQuery(Name = "eid")] int? eventId,
|
||||
[FromQuery] string? key,
|
||||
[FromQuery] long? from,
|
||||
[FromQuery] long? to,
|
||||
[FromQuery(Name = "p")] bool? includePhoto)
|
||||
{
|
||||
var (result, user) = CheckPermission();
|
||||
if (result != null)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
if (user == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
SaveDatabase();
|
||||
|
||||
var records = database.Records.Where(r => r.OwnerId == user.Id);
|
||||
if (eventId != null)
|
||||
{
|
||||
records = records.Where(r => r.EventId == eventId);
|
||||
}
|
||||
if (key != null)
|
||||
{
|
||||
records = records.Where(r =>
|
||||
r.ByUserName != null && r.ByUserName.ToLower().Contains(key.ToLower()) ||
|
||||
r.Memo != null && r.Memo.ToLower().Contains(key.ToLower()));
|
||||
}
|
||||
if (from != null)
|
||||
{
|
||||
records = records.Where(r => r.DateUnixTime >= from);
|
||||
}
|
||||
if (to != null)
|
||||
{
|
||||
records = records.Where(r => r.DateUnixTime <= to);
|
||||
}
|
||||
|
||||
if (includePhoto == true)
|
||||
{
|
||||
foreach (var r in records)
|
||||
{
|
||||
r.Photos = database.Photos.Where(p => p.RecordId == r.Id).ToList();
|
||||
}
|
||||
}
|
||||
|
||||
return Ok(records.ToArray());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 移除用户的事件
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 请求示例:
|
||||
///
|
||||
/// DELETE /api/event/remove
|
||||
/// Authorization: authorization id
|
||||
///
|
||||
/// 参数:
|
||||
///
|
||||
/// id: int
|
||||
///
|
||||
/// </remarks>
|
||||
/// <param name="id">事件唯一 id</param>
|
||||
/// <returns>会话有效则返回操作影响的数据库行数</returns>
|
||||
/// <response code="200">返回操作影响的数据库行数</response>
|
||||
/// <response code="401">未找到登录会话或已过期</response>
|
||||
/// <response code="403">用户已禁用</response>
|
||||
/// <response code="404">未找到关联用户</response>
|
||||
[Route("remove", Name = "removeEvent")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[HttpDelete]
|
||||
public ActionResult<int> RemoveEvent([FromQuery][Required] int id)
|
||||
{
|
||||
var (result, user) = CheckPermission();
|
||||
if (result != null)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
if (user == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
var count = database.Records.Where(r => r.OwnerId == user.Id && r.Id == id).ExecuteDelete();
|
||||
|
||||
SaveDatabase();
|
||||
|
||||
return Ok(count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 批量移除用户的事件
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 请求示例:
|
||||
///
|
||||
/// POST /api/event/remove
|
||||
/// Authorization: authorization id
|
||||
/// [
|
||||
/// 2, 4, 5, 11
|
||||
/// ]
|
||||
///
|
||||
/// </remarks>
|
||||
/// <param name="ids">要移除的事件唯一 id 的数组</param>
|
||||
/// <returns>会话有效则返回操作影响的数据库行数</returns>
|
||||
/// <response code="200">返回操作影响的数据库行数</response>
|
||||
/// <response code="401">未找到登录会话或已过期</response>
|
||||
/// <response code="403">用户已禁用</response>
|
||||
/// <response code="404">未找到关联用户</response>
|
||||
[Route("removeany", Name = "removeEvents")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[HttpPost]
|
||||
[Consumes("application/json")]
|
||||
public ActionResult<int> RemoveEvents([FromBody] int[] ids)
|
||||
{
|
||||
var (result, user) = CheckPermission();
|
||||
if (result != null)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
if (user == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
var count = database.Records.Where(r => r.OwnerId == user.Id && ids.Contains(r.Id)).ExecuteDelete();
|
||||
|
||||
SaveDatabase();
|
||||
|
||||
return Ok(count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用户添加事件
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 请求示例:
|
||||
///
|
||||
/// POST /api/event/add
|
||||
/// Authorization: authorization id
|
||||
/// {
|
||||
/// "flowerId": 1,
|
||||
/// "eventId": 4, // 浇水
|
||||
/// "byUser": "朋友",
|
||||
/// "memo": "快干死了"
|
||||
/// }
|
||||
///
|
||||
/// </remarks>
|
||||
/// <param name="event">事件参数</param>
|
||||
/// <returns>添加成功则返回已添加的事件对象</returns>
|
||||
/// <response code="200">返回已添加的事件对象</response>
|
||||
/// <response code="401">未找到登录会话或已过期</response>
|
||||
/// <response code="403">用户已禁用</response>
|
||||
/// <response code="404">未找到关联用户</response>
|
||||
[Route("add", Name = "addEvent")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[HttpPost]
|
||||
[Consumes("application/json")]
|
||||
public ActionResult<RecordItem> AddEvent([FromBody] EventParameter @event)
|
||||
{
|
||||
var (result, user) = CheckPermission();
|
||||
if (result != null)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
if (user == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
var item = new RecordItem
|
||||
{
|
||||
OwnerId = user.Id,
|
||||
FlowerId = @event.FlowerId,
|
||||
EventId = @event.EventId,
|
||||
DateUnixTime = user.ActiveDateUnixTime ?? DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(),
|
||||
ByUserId = @event.ByUser == null ? user.Id : null,
|
||||
ByUserName = @event.ByUser,
|
||||
Memo = @event.Memo
|
||||
};
|
||||
database.Records.Add(item);
|
||||
SaveDatabase();
|
||||
|
||||
return Ok(item);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 修改事件
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 请求示例:
|
||||
///
|
||||
/// PUT /api/event/update
|
||||
/// Authorization: authorization id
|
||||
/// {
|
||||
/// "id": 1,
|
||||
/// "flowerId": 1,
|
||||
/// "eventId": 5, // 施肥
|
||||
/// "byUser": null,
|
||||
/// "memo": "花多多1号"
|
||||
/// }
|
||||
///
|
||||
/// </remarks>
|
||||
/// <param name="update">修改参数</param>
|
||||
/// <returns>修改成功则返回已修改的事件对象</returns>
|
||||
/// <response code="200">返回已修改的事件对象</response>
|
||||
/// <response code="401">未找到登录会话或已过期</response>
|
||||
/// <response code="403">用户已禁用</response>
|
||||
/// <response code="404">未找到关联用户或者未找到将修改的事件对象</response>
|
||||
[Route("update", Name = "updateEvent")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[HttpPut]
|
||||
[Consumes("application/json")]
|
||||
public ActionResult<RecordItem> Update([FromBody] EventUpdateParameter update)
|
||||
{
|
||||
var (result, user) = CheckPermission();
|
||||
if (result != null)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
if (user == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
var record = database.Records.SingleOrDefault(r => r.Id == update.Id && r.OwnerId == user.Id);
|
||||
if (record == null)
|
||||
{
|
||||
SaveDatabase();
|
||||
return NotFound(update.Id);
|
||||
}
|
||||
record.FlowerId = update.FlowerId;
|
||||
record.EventId = update.EventId;
|
||||
if (update.ByUser == null)
|
||||
{
|
||||
record.ByUserId = user.Id;
|
||||
record.ByUserName = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
record.ByUserId = null;
|
||||
record.ByUserName = update.ByUser;
|
||||
}
|
||||
record.Memo = update.Memo;
|
||||
SaveDatabase();
|
||||
|
||||
return Ok(user);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 添加事件关联照片
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 请求示例:
|
||||
///
|
||||
/// POST /api/event/add_photo
|
||||
/// Authorization: authorization id
|
||||
///
|
||||
/// 参数:
|
||||
///
|
||||
/// id: int
|
||||
/// photo: IFormFile
|
||||
///
|
||||
/// </remarks>
|
||||
/// <param name="id">事件唯一 id</param>
|
||||
/// <param name="photo">图片</param>
|
||||
/// <returns>修改成功则返回 HTTP 204</returns>
|
||||
/// <response code="204">修改成功</response>
|
||||
/// <response code="400">照片格式非法</response>
|
||||
/// <response code="401">未找到登录会话或已过期</response>
|
||||
/// <response code="403">用户已禁用</response>
|
||||
/// <response code="404">未找到关联用户或者关联的事件</response>
|
||||
/// <response code="413">提交正文过大</response>
|
||||
[Route("add_photo", Name = "addEventPhoto")]
|
||||
[ProducesResponseType(StatusCodes.Status204NoContent)]
|
||||
[ProducesResponseType(StatusCodes.Status400BadRequest)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ProducesResponseType(StatusCodes.Status413PayloadTooLarge)]
|
||||
[HttpPost]
|
||||
[Consumes("multipart/form-data")]
|
||||
[RequestSizeLimit(15 * 1024 * 1024)]
|
||||
public async Task<ActionResult> UploadCovers([Required][FromQuery] int id, [Required] IFormFile photo)
|
||||
{
|
||||
var (result, user) = CheckPermission();
|
||||
if (result != null)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
if (user == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
var record = database.Records.SingleOrDefault(r => r.Id == id && r.OwnerId == user.Id);
|
||||
if (record == null)
|
||||
{
|
||||
SaveDatabase();
|
||||
return NotFound(id);
|
||||
}
|
||||
if (photo.Length > 0)
|
||||
{
|
||||
var file = WrapFormFile(photo);
|
||||
if (file == null)
|
||||
{
|
||||
SaveDatabase();
|
||||
return BadRequest();
|
||||
}
|
||||
|
||||
var p = new PhotoItem
|
||||
{
|
||||
FlowerId = record.FlowerId,
|
||||
RecordId = id,
|
||||
FileType = file.FileType,
|
||||
FileName = file.Filename,
|
||||
Path = file.Path,
|
||||
DateUploadUnixTime = user.ActiveDateUnixTime ?? DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
|
||||
};
|
||||
database.Photos.Add(p);
|
||||
|
||||
try
|
||||
{
|
||||
await WriteToFile(user.Id, id, file);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
SaveDatabase();
|
||||
return Problem(ex.ToString(), "api/event/add_photo");
|
||||
// TODO: Logger
|
||||
}
|
||||
}
|
||||
SaveDatabase();
|
||||
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取事件关联的照片列表
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 请求示例:
|
||||
///
|
||||
/// GET /api/event/photos
|
||||
/// Authorization: authorization id
|
||||
///
|
||||
/// 参数:
|
||||
///
|
||||
/// id: int
|
||||
///
|
||||
/// </remarks>
|
||||
/// <param name="id">事件唯一 id</param>
|
||||
/// <returns>验证通过则返回事件关联的照片列表</returns>
|
||||
/// <response code="200">返回事件关联的照片列表</response>
|
||||
/// <response code="401">未找到登录会话或已过期</response>
|
||||
/// <response code="403">用户已禁用</response>
|
||||
/// <response code="404">未找到关联用户或者未找到事件对象</response>
|
||||
[Route("photos", Name = "getEventPhotos")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[HttpGet]
|
||||
[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
|
||||
public ActionResult<PhotoItem[]> GetPhotos([Required][FromQuery] int id)
|
||||
{
|
||||
var (result, user) = CheckPermission();
|
||||
if (result != null)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
if (user == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
SaveDatabase();
|
||||
|
||||
var photos = database.Photos.Where(p => p.RecordId == id && database.Records.Any(r => r.Id == id && r.OwnerId == user.Id));
|
||||
|
||||
return Ok(photos);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user