Prebuilt deck purchasing and fixes
This commit is contained in:
64
SVSim.EmulatedEntrypoint/Controllers/LeaderSkinController.cs
Normal file
64
SVSim.EmulatedEntrypoint/Controllers/LeaderSkinController.cs
Normal file
@@ -0,0 +1,64 @@
|
||||
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(),
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user