diff --git a/src/Controllers/Common/ContentController.cs b/src/Controllers/Common/ContentController.cs index 4227481..b584175 100644 --- a/src/Controllers/Common/ContentController.cs +++ b/src/Controllers/Common/ContentController.cs @@ -223,7 +223,22 @@ public class ContentController : Controller { public IActionResult GetUserActiveMissionState([FromForm] string apiToken, [FromForm] string userId) { Session? session = ctx.Sessions.FirstOrDefault(s => s.ApiToken == apiToken); UserMissionStateResult result = new UserMissionStateResult { Missions = new List() }; - result.Missions.Add(XmlUtil.DeserializeXml(XmlUtil.ReadResourceXmlString("tutorialmission"))); + Mission tutorial = XmlUtil.DeserializeXml(XmlUtil.ReadResourceXmlString("tutorialmission")); + + // Update the mission with completed tasks + List taskStatuses = ctx.TaskStatuses.Where(e => e.VikingId == userId && e.MissionId == tutorial.MissionID).ToList(); + foreach (var task in taskStatuses) { + RuleItem? rule = tutorial.MissionRule.Criteria.RuleItems.Find(x => x.ID == task.Id); + if (rule != null && task.Completed) rule.Complete = 1; + + Schema.Task? t = tutorial.Tasks.Find(x => x.TaskID == task.Id); + if (t != null) { + if (task.Completed) t.Completed = 1; + t.Payload = task.Payload; + } + } + + result.Missions.Add(tutorial); if (session is null) return Ok("error"); @@ -249,8 +264,28 @@ public class ContentController : Controller { [HttpPost] [Produces("application/xml")] [Route("V2/ContentWebService.asmx/SetTaskState")] - public IActionResult SetTaskState([FromForm] string apiToken, [FromForm] int missionId, [FromForm] int taskId, [FromForm] bool completed) { - // TODO + public IActionResult SetTaskState([FromForm] string apiToken, [FromForm] string userId, [FromForm] int missionId, [FromForm] int taskId, [FromForm] bool completed, [FromForm] string xmlPayload) { + Session? session = ctx.Sessions.FirstOrDefault(s => s.ApiToken == apiToken); + if (session is null || session.VikingId != userId) + return Ok(new SetTaskStateResult { Success = false, Status = SetTaskStateStatus.Unknown }); + + Model.TaskStatus? status = ctx.TaskStatuses.FirstOrDefault(task => task.Id == taskId && task.MissionId == missionId && task.VikingId == userId); + + if (status is null) { + status = new Model.TaskStatus { + Id = taskId, + MissionId = missionId, + VikingId = userId, + Payload = xmlPayload, + Completed = completed + }; + ctx.TaskStatuses.Add(status); + } else { + status.Payload = xmlPayload; + status.Completed = completed; + } + ctx.SaveChanges(); + return Ok(new SetTaskStateResult { Success = true, Status = SetTaskStateStatus.TaskCanBeDone }); } } diff --git a/src/Model/DBContext.cs b/src/Model/DBContext.cs index 8f4b06f..8b0698f 100644 --- a/src/Model/DBContext.cs +++ b/src/Model/DBContext.cs @@ -7,6 +7,7 @@ public class DBContext : DbContext { public DbSet Sessions { get; set; } = null!; public DbSet Pairs { get; set; } = null!; public DbSet PairData { get; set; } = null!; + public DbSet TaskStatuses { get; set; } = null!; public string DbPath { get; } public DBContext() { @@ -49,5 +50,11 @@ public class DBContext : DbContext { .WithMany(pd => pd.Pairs) .HasForeignKey(p => p.MasterId) .HasPrincipalKey(e => e.Id); + + builder.Entity().HasKey(e => new { e.Id, e.VikingId, e.MissionId }); + + builder.Entity() + .HasOne(t => t.Viking) + .WithMany(); } } diff --git a/src/Model/TaskStatus.cs b/src/Model/TaskStatus.cs new file mode 100644 index 0000000..61d4af2 --- /dev/null +++ b/src/Model/TaskStatus.cs @@ -0,0 +1,15 @@ +namespace sodoff.Model { + public class TaskStatus { + public int Id { get; set; } + + public int MissionId { get; set; } + + public string VikingId { get; set; } = null!; + + public virtual Viking? Viking { get; set; } + + public string? Payload { get; set; } + + public bool Completed { get; set; } = false; + } +}