add some APIs
This commit is contained in:
@@ -2,9 +2,7 @@
|
||||
using Blahblah.FlowerStory.Server.Data.Model;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Blahblah.FlowerStory.Server.Controller;
|
||||
|
||||
@@ -68,6 +66,7 @@ public class FlowerApiController : BaseController
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ProducesErrorResponseType(typeof(ErrorResponse))]
|
||||
[HttpGet]
|
||||
[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
|
||||
public ActionResult<FlowerResult> GetFlowers(
|
||||
@@ -96,7 +95,88 @@ public class FlowerApiController : BaseController
|
||||
|
||||
SaveDatabase();
|
||||
|
||||
IEnumerable<FlowerItem> flowers = database.Flowers.Where(f => f.OwnerId == user.Id);
|
||||
var flowers = GetFlowerResult(user.Id, null, categoryId, key, buyFrom, buyTo, costFrom, costTo, includePhoto, latitude, longitude, distance, page, pageSize);
|
||||
return Ok(flowers);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取最新、最近的花草
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 请求示例:
|
||||
///
|
||||
/// GET /api/flower/latest
|
||||
///
|
||||
/// 参数:
|
||||
///
|
||||
/// cid: int?
|
||||
/// key: string?
|
||||
/// from: long?
|
||||
/// to: long?
|
||||
/// cfrom: decimal?
|
||||
/// cto: decimal?
|
||||
/// photo: bool?
|
||||
/// lon: double?
|
||||
/// lat: double?
|
||||
/// distance: int?
|
||||
/// p: int?
|
||||
/// size: int?
|
||||
///
|
||||
/// </remarks>
|
||||
/// <param name="categoryId">类别 id</param>
|
||||
/// <param name="key">查询关键字</param>
|
||||
/// <param name="buyFrom">起始购买日期</param>
|
||||
/// <param name="buyTo">结束购买日期</param>
|
||||
/// <param name="costFrom">开销最小值</param>
|
||||
/// <param name="costTo">开销最大值</param>
|
||||
/// <param name="includePhoto">是否包含封面图片</param>
|
||||
/// <param name="latitude">纬度</param>
|
||||
/// <param name="longitude">经度</param>
|
||||
/// <param name="distance">距离(米)</param>
|
||||
/// <param name="page">页数</param>
|
||||
/// <param name="pageSize">分页大小</param>
|
||||
/// <returns>会话有效则返回符合条件的花草集</returns>
|
||||
/// <response code="200">返回符合条件的花草集</response>
|
||||
/// <response code="401">未找到登录会话或已过期</response>
|
||||
/// <response code="403">用户已禁用</response>
|
||||
/// <response code="404">未找到关联用户</response>
|
||||
[Route("latest", Name = "queryLatestFlowers")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[HttpGet]
|
||||
[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
|
||||
public ActionResult<FlowerResult> GetLatestFlowers(
|
||||
[FromQuery(Name = "cid")] int? categoryId,
|
||||
[FromQuery] string? key,
|
||||
[FromQuery(Name = "from")] long? buyFrom,
|
||||
[FromQuery(Name = "to")] long? buyTo,
|
||||
[FromQuery(Name = "cfrom")] decimal? costFrom,
|
||||
[FromQuery(Name = "cto")] decimal? costTo,
|
||||
[FromQuery(Name = "photo")] bool? includePhoto,
|
||||
[FromQuery(Name = "lat")] double? latitude,
|
||||
[FromQuery(Name = "lon")] double? longitude,
|
||||
[FromQuery] int? distance,
|
||||
[FromQuery(Name = "p")] int? page = 0,
|
||||
[FromQuery(Name = "size")] int? pageSize = 20)
|
||||
{
|
||||
var result = GetFlowerResult(null, (int)EventTypes.Share, categoryId, key, buyFrom, buyTo, costFrom, costTo, includePhoto, latitude, longitude, distance, page, pageSize);
|
||||
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
private FlowerResult GetFlowerResult(int? userId, int? eventId, int? categoryId, string? key,
|
||||
long? buyFrom, long? buyTo, decimal? costFrom, decimal? costTo,
|
||||
bool? includePhoto, double? latitude, double? longitude, int? distance,
|
||||
int? page = 0, int? pageSize = 20)
|
||||
{
|
||||
IEnumerable<FlowerItem> flowers;
|
||||
if (userId != null)
|
||||
{
|
||||
flowers = database.Flowers.Where(f => f.OwnerId == userId);
|
||||
}
|
||||
else
|
||||
{
|
||||
flowers = database.Flowers;
|
||||
}
|
||||
if (categoryId != null)
|
||||
{
|
||||
flowers = flowers.Where(f => f.CategoryId == categoryId);
|
||||
@@ -125,6 +205,11 @@ public class FlowerApiController : BaseController
|
||||
flowers = flowers.Where(f => f.Cost != null && f.Cost <= costTo);
|
||||
}
|
||||
|
||||
if (eventId != null)
|
||||
{
|
||||
flowers = flowers.Where(f => database.Records.Any(r => r.FlowerId == f.Id && r.EventId == eventId));
|
||||
}
|
||||
|
||||
if (distance != null && latitude != null && longitude != null)
|
||||
{
|
||||
flowers = flowers.Where(f => f.Latitude != null && f.Longitude != null)
|
||||
@@ -157,11 +242,11 @@ public class FlowerApiController : BaseController
|
||||
}
|
||||
}
|
||||
|
||||
return Ok(new FlowerResult
|
||||
return new()
|
||||
{
|
||||
Flowers = flowers.ToArray(),
|
||||
Count = count
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -191,6 +276,7 @@ public class FlowerApiController : BaseController
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ProducesErrorResponseType(typeof(ErrorResponse))]
|
||||
[HttpGet]
|
||||
[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
|
||||
public ActionResult<FlowerItem> GetFlower(
|
||||
@@ -254,6 +340,7 @@ public class FlowerApiController : BaseController
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ProducesErrorResponseType(typeof(ErrorResponse))]
|
||||
[HttpDelete]
|
||||
public ActionResult<int> RemoveFlower([FromQuery][Required] int id)
|
||||
{
|
||||
@@ -299,9 +386,10 @@ public class FlowerApiController : BaseController
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ProducesErrorResponseType(typeof(ErrorResponse))]
|
||||
[HttpPost]
|
||||
[Consumes("application/json")]
|
||||
public ActionResult<int> RemoveFlower([FromBody] int[] ids)
|
||||
public ActionResult<int> RemoveFlowers([FromBody] int[] ids)
|
||||
{
|
||||
var (result, user) = CheckPermission();
|
||||
if (result != null)
|
||||
@@ -337,22 +425,29 @@ public class FlowerApiController : BaseController
|
||||
/// dateBuy: 1684919954743
|
||||
/// cost: 5.00
|
||||
/// purchase: "花鸟市场"
|
||||
/// memo: "备注信息"
|
||||
/// lon: 29.5462794
|
||||
/// lat: 106.5380034
|
||||
/// cid: 1
|
||||
/// cover: <photo>
|
||||
///
|
||||
/// </remarks>
|
||||
/// <param name="flower">花草参数</param>
|
||||
/// <returns>添加成功则返回已添加的花草对象</returns>
|
||||
/// <response code="200">返回已添加的花草对象</response>
|
||||
/// <response code="400">提交的内容不合法</response>
|
||||
/// <response code="401">未找到登录会话或已过期</response>
|
||||
/// <response code="403">用户已禁用</response>
|
||||
/// <response code="404">未找到关联用户</response>
|
||||
/// <response code="413">提交正文过大</response>
|
||||
[Route("add", Name = "addFlower")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status400BadRequest)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ProducesResponseType(StatusCodes.Status413PayloadTooLarge)]
|
||||
[ProducesErrorResponseType(typeof(ErrorResponse))]
|
||||
[HttpPost]
|
||||
[Consumes("multipart/form-data")]
|
||||
[RequestSizeLimit(5 * 1024 * 1024)]
|
||||
@@ -375,11 +470,15 @@ public class FlowerApiController : BaseController
|
||||
Name = flower.Name,
|
||||
DateBuyUnixTime = flower.DateBuy,
|
||||
Cost = flower.Cost,
|
||||
Purchase = flower.Purchase
|
||||
Purchase = flower.Purchase,
|
||||
Memo = flower.Memo,
|
||||
Latitude = flower.Latitude,
|
||||
Longitude = flower.Longitude
|
||||
};
|
||||
database.Flowers.Add(item);
|
||||
SaveDatabase();
|
||||
|
||||
var now = user.ActiveDateUnixTime ?? DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
||||
if (flower.Cover?.Length > 0)
|
||||
{
|
||||
var file = WrapFormFile(flower.Cover);
|
||||
@@ -388,7 +487,6 @@ public class FlowerApiController : BaseController
|
||||
return BadRequest();
|
||||
}
|
||||
|
||||
var now = user.ActiveDateUnixTime ?? DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
||||
var record = database.Records.SingleOrDefault(r => r.FlowerId == item.Id && r.EventId == EventCover);
|
||||
if (record == null)
|
||||
{
|
||||
@@ -399,8 +497,10 @@ public class FlowerApiController : BaseController
|
||||
EventId = EventCover,
|
||||
DateUnixTime = now,
|
||||
ByUserId = user.Id,
|
||||
ByUserName = user.Name
|
||||
//Memo = ""
|
||||
ByUserName = user.Name,
|
||||
//Memo = flower.Memo,
|
||||
Latitude = flower.Latitude,
|
||||
Longitude = flower.Longitude
|
||||
};
|
||||
database.Records.Add(record);
|
||||
}
|
||||
@@ -412,6 +512,7 @@ public class FlowerApiController : BaseController
|
||||
{
|
||||
var cover = new PhotoItem
|
||||
{
|
||||
OwnerId = user.Id,
|
||||
FlowerId = item.Id,
|
||||
RecordId = record.Id,
|
||||
FileType = file.FileType,
|
||||
@@ -426,14 +527,135 @@ public class FlowerApiController : BaseController
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return Problem(ex.ToString(), "api/flower/add");
|
||||
return Problem(ex.ToString(), "api/flower/add#WriteToFile");
|
||||
// TODO: Logger
|
||||
}
|
||||
}
|
||||
else if (flower.CoverId is int coverId)
|
||||
{
|
||||
var photo = database.Photos.SingleOrDefault(p => p.Id == coverId && p.OwnerId == user.Id);
|
||||
if (photo != null)
|
||||
{
|
||||
var record = database.Records.SingleOrDefault(r => r.FlowerId == item.Id && r.EventId == EventCover);
|
||||
if (record == null)
|
||||
{
|
||||
record = new RecordItem
|
||||
{
|
||||
OwnerId = user.Id,
|
||||
FlowerId = item.Id,
|
||||
EventId = EventCover,
|
||||
DateUnixTime = now,
|
||||
ByUserId = user.Id,
|
||||
ByUserName = user.Name,
|
||||
//Memo = flower.Memo,
|
||||
Latitude = flower.Latitude,
|
||||
Longitude = flower.Longitude
|
||||
};
|
||||
database.Records.Add(record);
|
||||
SaveDatabase();
|
||||
}
|
||||
|
||||
photo.FlowerId = item.Id;
|
||||
photo.RecordId = record.Id;
|
||||
SaveDatabase();
|
||||
|
||||
try
|
||||
{
|
||||
MoveTempFileToFlower(item.Id, photo.Path);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return Problem(ex.ToString(), "api/flower/add#MoveTempFileToFlower");
|
||||
// TODO: Logger
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Ok(item);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用户上传封面
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 请求示例:
|
||||
///
|
||||
/// POST /api/flower/cover_upload
|
||||
/// Authorization: authorization id
|
||||
///
|
||||
/// 参数:
|
||||
///
|
||||
/// cover: <photo>
|
||||
///
|
||||
/// </remarks>
|
||||
/// <param name="p">封面参数</param>
|
||||
/// <returns>添加成功则返回封面 id</returns>
|
||||
/// <response code="200">返回已添加的封面 id</response>
|
||||
/// <response code="400">提交的内容不合法</response>
|
||||
/// <response code="401">未找到登录会话或已过期</response>
|
||||
/// <response code="403">用户已禁用</response>
|
||||
/// <response code="404">未找到关联用户</response>
|
||||
/// <response code="413">提交正文过大</response>
|
||||
[Route("cover_upload", Name = "uploadCover")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status400BadRequest)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ProducesResponseType(StatusCodes.Status413PayloadTooLarge)]
|
||||
[ProducesErrorResponseType(typeof(ErrorResponse))]
|
||||
[HttpPost]
|
||||
[Consumes("multipart/form-data")]
|
||||
[RequestSizeLimit(5 * 1024 * 1024)]
|
||||
public async Task<ActionResult<int>> UploadCover([FromForm] CoverParameter p)
|
||||
{
|
||||
var (result, user) = CheckPermission();
|
||||
if (result != null)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
if (user == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
if (p.Cover?.Length > 0)
|
||||
{
|
||||
var file = WrapFormFile(p.Cover);
|
||||
if (file == null)
|
||||
{
|
||||
return BadRequest();
|
||||
}
|
||||
|
||||
var now = user.ActiveDateUnixTime ?? DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
||||
|
||||
try
|
||||
{
|
||||
await WriteToFile(TempId, file);
|
||||
|
||||
var item = new PhotoItem
|
||||
{
|
||||
OwnerId = user.Id,
|
||||
FileType = file.FileType,
|
||||
FileName = file.Filename,
|
||||
Path = file.Path,
|
||||
DateUploadUnixTime = now
|
||||
};
|
||||
database.Photos.Add(item);
|
||||
SaveDatabase();
|
||||
|
||||
return Ok(item.Id);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return Problem(ex.ToString(), "api/flower/cover_upload");
|
||||
// TODO: Logger
|
||||
}
|
||||
}
|
||||
|
||||
return BadRequest();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 修改花草
|
||||
/// </summary>
|
||||
@@ -451,22 +673,28 @@ public class FlowerApiController : BaseController
|
||||
/// dateBuy: 1684935276117
|
||||
/// cost: 15.40
|
||||
/// purchase: null
|
||||
/// memo: "备注"
|
||||
/// lon: 29.5462794
|
||||
/// lat: 106.5380034
|
||||
/// cover: <photo>
|
||||
///
|
||||
/// </remarks>
|
||||
/// <param name="update">修改参数</param>
|
||||
/// <returns>修改成功则返回已修改的花草对象</returns>
|
||||
/// <response code="200">返回已修改的花草对象</response>
|
||||
/// <response code="400">提交的内容不合法</response>
|
||||
/// <response code="401">未找到登录会话或已过期</response>
|
||||
/// <response code="403">用户已禁用</response>
|
||||
/// <response code="404">未找到关联用户或者未找到将修改的花草对象</response>
|
||||
/// <response code="413">提交正文过大</response>
|
||||
[Route("update", Name = "updateFlower")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status400BadRequest)]
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ProducesResponseType(StatusCodes.Status413PayloadTooLarge)]
|
||||
[ProducesErrorResponseType(typeof(ErrorResponse))]
|
||||
[HttpPut]
|
||||
[Consumes("multipart/form-data")]
|
||||
[RequestSizeLimit(5 * 1024 * 1024)]
|
||||
@@ -492,6 +720,9 @@ public class FlowerApiController : BaseController
|
||||
flower.DateBuyUnixTime = update.DateBuy;
|
||||
flower.Cost = update.Cost;
|
||||
flower.Purchase = update.Purchase;
|
||||
flower.Memo = update.Memo;
|
||||
flower.Latitude = update.Latitude;
|
||||
flower.Longitude = update.Longitude;
|
||||
|
||||
if (update.Cover?.Length > 0)
|
||||
{
|
||||
@@ -512,8 +743,10 @@ public class FlowerApiController : BaseController
|
||||
EventId = EventCover,
|
||||
DateUnixTime = now,
|
||||
ByUserId = user.Id,
|
||||
ByUserName = user.Name
|
||||
//Memo = ""
|
||||
ByUserName = user.Name,
|
||||
//Memo = flower.Memo,
|
||||
Latitude = flower.Latitude,
|
||||
Longitude = flower.Longitude
|
||||
};
|
||||
database.Records.Add(record);
|
||||
}
|
||||
@@ -537,6 +770,7 @@ public class FlowerApiController : BaseController
|
||||
{
|
||||
var cover = new PhotoItem
|
||||
{
|
||||
OwnerId = user.Id,
|
||||
FlowerId = update.Id,
|
||||
RecordId = record.Id,
|
||||
FileType = file.FileType,
|
||||
@@ -575,11 +809,12 @@ public class FlowerApiController : BaseController
|
||||
/// 参数:
|
||||
///
|
||||
/// id: int
|
||||
/// lon: double?
|
||||
/// lat: double?
|
||||
/// photo: IFormFile
|
||||
///
|
||||
/// </remarks>
|
||||
/// <param name="id">花草唯一 id</param>
|
||||
/// <param name="photo">封面图片</param>
|
||||
/// <param name="param">封面修改参数</param>
|
||||
/// <returns>修改成功则返回 HTTP 204</returns>
|
||||
/// <response code="204">修改成功</response>
|
||||
/// <response code="400">照片格式非法</response>
|
||||
@@ -594,10 +829,11 @@ public class FlowerApiController : BaseController
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ProducesResponseType(StatusCodes.Status413PayloadTooLarge)]
|
||||
[ProducesErrorResponseType(typeof(ErrorResponse))]
|
||||
[HttpPost]
|
||||
[Consumes("multipart/form-data")]
|
||||
[RequestSizeLimit(5 * 1024 * 1024)]
|
||||
public async Task<ActionResult> UploadCovers([Required][FromQuery] int id, [Required] IFormFile photo)
|
||||
public async Task<ActionResult> UploadCovers([FromForm] FlowerCoverParameter param)
|
||||
{
|
||||
var (result, user) = CheckPermission();
|
||||
if (result != null)
|
||||
@@ -609,35 +845,40 @@ public class FlowerApiController : BaseController
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
var flower = database.Flowers.SingleOrDefault(f => f.Id == id && f.OwnerId == user.Id);
|
||||
var flower = database.Flowers.SingleOrDefault(f => f.Id == param.Id && f.OwnerId == user.Id);
|
||||
if (flower == null)
|
||||
{
|
||||
return NotFound($"Flower id {id} not found");
|
||||
return NotFound($"Flower id {param.Id} not found");
|
||||
}
|
||||
if (photo.Length > 0)
|
||||
if (param.Cover?.Length > 0)
|
||||
{
|
||||
var file = WrapFormFile(photo);
|
||||
var file = WrapFormFile(param.Cover);
|
||||
if (file == null)
|
||||
{
|
||||
return BadRequest();
|
||||
}
|
||||
|
||||
var now = user.ActiveDateUnixTime ?? DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
||||
var record = database.Records.SingleOrDefault(r => r.FlowerId == id && r.EventId == EventCover);
|
||||
var record = database.Records.SingleOrDefault(r => r.FlowerId == param.Id && r.EventId == EventCover);
|
||||
if (record == null)
|
||||
{
|
||||
record = new RecordItem
|
||||
{
|
||||
OwnerId = user.Id,
|
||||
FlowerId = id,
|
||||
FlowerId = param.Id,
|
||||
EventId = EventCover,
|
||||
DateUnixTime = now,
|
||||
ByUserId = user.Id,
|
||||
ByUserName = user.Name
|
||||
//Memo = ""
|
||||
ByUserName = user.Name,
|
||||
//Memo = "",
|
||||
Latitude = param.Latitude,
|
||||
Longitude = param.Longitude
|
||||
};
|
||||
database.Records.Add(record);
|
||||
}
|
||||
|
||||
flower.Latitude = param.Latitude;
|
||||
flower.Longitude = param.Longitude;
|
||||
SaveDatabase();
|
||||
|
||||
try
|
||||
@@ -646,7 +887,8 @@ public class FlowerApiController : BaseController
|
||||
{
|
||||
var cover = new PhotoItem
|
||||
{
|
||||
FlowerId = id,
|
||||
OwnerId = user.Id,
|
||||
FlowerId = param.Id,
|
||||
RecordId = record.Id,
|
||||
FileType = file.FileType,
|
||||
FileName = file.Filename,
|
||||
@@ -655,7 +897,7 @@ public class FlowerApiController : BaseController
|
||||
};
|
||||
AddPhotoItem(cover);
|
||||
|
||||
await WriteToFile(id, file, token);
|
||||
await WriteToFile(param.Id, file, token);
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -695,6 +937,7 @@ public class FlowerApiController : BaseController
|
||||
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
|
||||
[ProducesResponseType(StatusCodes.Status403Forbidden)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ProducesErrorResponseType(typeof(ErrorResponse))]
|
||||
[HttpGet]
|
||||
[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
|
||||
public ActionResult<PhotoItem[]> GetCovers([Required][FromQuery] int id, [FromQuery(Name = "eid")] int? eventId = 0)
|
||||
|
Reference in New Issue
Block a user