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; /// /// Tutorial step bookkeeping. The tutorial itself runs entirely client-side /// (StoryTutorial*BattleMgr per class); the server only persists step transitions. /// 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> 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 }; } }