65 lines
2.5 KiB
C#
65 lines
2.5 KiB
C#
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using SVSim.Database;
|
|
using SVSim.EmulatedEntrypoint.Models.Dtos.Requests.LeaderSkin;
|
|
using SVSim.EmulatedEntrypoint.Models.Dtos.Responses.LeaderSkin;
|
|
|
|
namespace SVSim.EmulatedEntrypoint.Controllers;
|
|
|
|
/// <summary>
|
|
/// /leader_skin/* — per-class "active leader skin" preference. The per-CLASS setting is the
|
|
/// fallback used when a deck has <c>leader_skin_id == 0</c>; per-deck overrides go through
|
|
/// /deck/update_leader_skin instead.
|
|
/// </summary>
|
|
[Route("leader_skin")]
|
|
public class LeaderSkinController : SVSimController
|
|
{
|
|
private readonly SVSimDbContext _db;
|
|
|
|
public LeaderSkinController(SVSimDbContext db)
|
|
{
|
|
_db = db;
|
|
}
|
|
|
|
[HttpPost("set")]
|
|
public async Task<ActionResult<LeaderSkinSetResponse>> Set(LeaderSkinSetRequest request)
|
|
{
|
|
if (!TryGetViewerId(out long viewerId)) return Unauthorized();
|
|
|
|
if (request.IsRandomLeaderSkin)
|
|
{
|
|
// Random-skin mode needs a per-viewer per-class shuffle pool, which we don't
|
|
// persist yet (ViewerClassData has no list field for it). Punt for now.
|
|
return StatusCode(StatusCodes.Status501NotImplemented,
|
|
new { error = "random_leader_skin_not_implemented" });
|
|
}
|
|
|
|
var viewer = await _db.Viewers
|
|
.Include(v => v.Classes).ThenInclude(c => c.Class)
|
|
.Include(v => v.Classes).ThenInclude(c => c.LeaderSkin)
|
|
.Include(v => v.LeaderSkins)
|
|
.FirstOrDefaultAsync(v => v.Id == viewerId);
|
|
if (viewer is null) return Unauthorized();
|
|
|
|
var classData = viewer.Classes.FirstOrDefault(c => c.Class.Id == request.ClassId);
|
|
if (classData is null) return BadRequest(new { error = "unknown_class" });
|
|
|
|
// Skin must (a) exist in the catalog, (b) match the target class, (c) be owned by the viewer.
|
|
var skin = await _db.LeaderSkins.FindAsync(request.LeaderSkinId);
|
|
if (skin is null) return BadRequest(new { error = "unknown_skin" });
|
|
if (skin.ClassId != request.ClassId) return BadRequest(new { error = "skin_class_mismatch" });
|
|
if (viewer.LeaderSkins.All(s => s.Id != skin.Id))
|
|
return BadRequest(new { error = "skin_not_owned" });
|
|
|
|
classData.LeaderSkin = skin;
|
|
await _db.SaveChangesAsync();
|
|
|
|
return new LeaderSkinSetResponse
|
|
{
|
|
IsRandomLeaderSkin = false,
|
|
LeaderSkinId = skin.Id,
|
|
LeaderSkinIdList = new(),
|
|
};
|
|
}
|
|
}
|