POST /tutorial/update echoes tutorial_step back and saves it to Viewer.MissionData.TutorialState. is_skip=1 is handled server-side by honoring whatever tutorial_step value the client sends (client already sends 100 when skipping). Adds TutorialUpdateRequest DTO, TutorialUpdateResponse DTO, injects SVSimDbContext into TutorialController, and adds GetViewerTutorialStateAsync helper to SVSimTestFactory. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
45 lines
1.5 KiB
C#
45 lines
1.5 KiB
C#
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using SVSim.Database;
|
|
using SVSim.EmulatedEntrypoint.Models.Dtos.Requests.Tutorial;
|
|
using SVSim.EmulatedEntrypoint.Models.Dtos.Responses.Tutorial;
|
|
|
|
namespace SVSim.EmulatedEntrypoint.Controllers;
|
|
|
|
/// <summary>
|
|
/// Tutorial step bookkeeping. The tutorial itself runs entirely client-side
|
|
/// (StoryTutorial*BattleMgr per class); the server only persists step transitions.
|
|
/// </summary>
|
|
public class TutorialController : SVSimController
|
|
{
|
|
private readonly SVSimDbContext _db;
|
|
|
|
public TutorialController(SVSimDbContext db)
|
|
{
|
|
_db = db;
|
|
}
|
|
|
|
[HttpPost("update_action")]
|
|
public IActionResult UpdateAction([FromBody] TutorialUpdateActionRequest request)
|
|
{
|
|
// Fire-and-forget. Client uses SkipAllNetworkChecks; response body is ignored.
|
|
// We still emit an empty object so the translation middleware has a `data` payload to wrap.
|
|
return new JsonResult(new { });
|
|
}
|
|
|
|
[HttpPost("update")]
|
|
public async Task<ActionResult<TutorialUpdateResponse>> Update([FromBody] TutorialUpdateRequest request)
|
|
{
|
|
if (!TryGetViewerId(out long viewerId)) return Unauthorized();
|
|
|
|
var viewer = await _db.Viewers
|
|
.Include(v => v.MissionData)
|
|
.FirstAsync(v => v.Id == viewerId);
|
|
|
|
viewer.MissionData.TutorialState = request.TutorialStep;
|
|
await _db.SaveChangesAsync();
|
|
|
|
return new TutorialUpdateResponse { TutorialStep = request.TutorialStep };
|
|
}
|
|
}
|