fix dragons and images

This commit is contained in:
hictooth 2023-06-22 10:39:06 +01:00
parent 5f7921ea6f
commit 1fdff9d27b
6 changed files with 122 additions and 26 deletions

View File

@ -34,8 +34,11 @@ methods = [
'SetTaskState', 'SetTaskState',
'CreatePet', 'CreatePet',
'SetRaisedPet', 'SetRaisedPet',
'SetSelectedPet',
'GetSelectedRaisedPet',
'SetImage', 'SetImage',
'GetImage' 'GetImage',
'GetImageByUserId'
] ]
def routable(path): def routable(path):

View File

@ -199,6 +199,7 @@ public class ContentController : Controller {
[HttpPost] [HttpPost]
[Produces("application/xml")] [Produces("application/xml")]
[Route("V2/ContentWebService.asmx/CreatePet")] [Route("V2/ContentWebService.asmx/CreatePet")]
[SignResponse]
public IActionResult CreatePet([FromForm] string apiToken, [FromForm] string request) { public IActionResult CreatePet([FromForm] string apiToken, [FromForm] string request) {
Viking? viking = ctx.Sessions.FirstOrDefault(e => e.ApiToken == apiToken)?.Viking; Viking? viking = ctx.Sessions.FirstOrDefault(e => e.ApiToken == apiToken)?.Viking;
if (viking is null) { if (viking is null) {
@ -225,23 +226,23 @@ public class ContentController : Controller {
Viking = viking, Viking = viking,
RaisedPetData = XmlUtil.SerializeXml(raisedPetRequest.RaisedPetData), RaisedPetData = XmlUtil.SerializeXml(raisedPetRequest.RaisedPetData),
}; };
if (raisedPetRequest.SetAsSelectedPet == true) {
viking.SelectedDragon = dragon;
ctx.Update(viking);
}
ctx.Dragons.Add(dragon); ctx.Dragons.Add(dragon);
ctx.SaveChanges(); ctx.SaveChanges();
// Now update the RaisedPetData with the dragon id
raisedPetRequest.RaisedPetData.RaisedPetID = dragon.Id;
dragon.RaisedPetData = XmlUtil.SerializeXml(raisedPetRequest.RaisedPetData);
ctx.Dragons.Update(dragon);
ctx.SaveChanges();
return Ok(new CreatePetResponse { return Ok(new CreatePetResponse {
RaisedPetData = raisedPetRequest.RaisedPetData RaisedPetData = GetRaisedPetDataFromDragon(dragon)
}); });
} }
[HttpPost] [HttpPost]
[Produces("application/xml")] [Produces("application/xml")]
[Route("v3/ContentWebService.asmx/SetRaisedPet")] [Route("v3/ContentWebService.asmx/SetRaisedPet")]
[SignResponse]
public IActionResult SetRaisedPet([FromForm] string apiToken, [FromForm] string request) { public IActionResult SetRaisedPet([FromForm] string apiToken, [FromForm] string request) {
Viking? viking = ctx.Sessions.FirstOrDefault(e => e.ApiToken == apiToken)?.Viking; Viking? viking = ctx.Sessions.FirstOrDefault(e => e.ApiToken == apiToken)?.Viking;
if (viking is null) { if (viking is null) {
@ -260,6 +261,7 @@ public class ContentController : Controller {
} }
dragon.RaisedPetData = XmlUtil.SerializeXml(raisedPetRequest.RaisedPetData); dragon.RaisedPetData = XmlUtil.SerializeXml(raisedPetRequest.RaisedPetData);
ctx.Update(dragon);
ctx.SaveChanges(); ctx.SaveChanges();
return Ok(new SetRaisedPetResponse { return Ok(new SetRaisedPetResponse {
@ -270,6 +272,7 @@ public class ContentController : Controller {
[HttpPost] [HttpPost]
[Produces("application/xml")] [Produces("application/xml")]
[Route("ContentWebService.asmx/SetSelectedPet")] [Route("ContentWebService.asmx/SetSelectedPet")]
[SignResponse]
public IActionResult SetSelectedPet([FromForm] string apiToken, [FromForm] int raisedPetID) { public IActionResult SetSelectedPet([FromForm] string apiToken, [FromForm] int raisedPetID) {
Viking? viking = ctx.Sessions.FirstOrDefault(e => e.ApiToken == apiToken)?.Viking; Viking? viking = ctx.Sessions.FirstOrDefault(e => e.ApiToken == apiToken)?.Viking;
if (viking is null) { if (viking is null) {
@ -286,13 +289,10 @@ public class ContentController : Controller {
} }
// Set the dragon as selected // Set the dragon as selected
RaisedPetData dragonData = XmlUtil.DeserializeXml<RaisedPetData>(dragon.RaisedPetData); viking.SelectedDragon = dragon;
dragonData.IsSelected = true; ctx.Update(viking);
dragon.RaisedPetData = XmlUtil.SerializeXml(dragonData);
ctx.SaveChanges(); ctx.SaveChanges();
// TODO: make all other dragons unselected
return Ok(new SetRaisedPetResponse { return Ok(new SetRaisedPetResponse {
RaisedPetSetResult = RaisedPetSetResult.Success RaisedPetSetResult = RaisedPetSetResult.Success
}); });
@ -301,19 +301,16 @@ public class ContentController : Controller {
[HttpPost] [HttpPost]
[Produces("application/xml")] [Produces("application/xml")]
[Route("V2/ContentWebService.asmx/GetAllActivePetsByuserId")] [Route("V2/ContentWebService.asmx/GetAllActivePetsByuserId")]
[Route("ContentWebService.asmx/GetSelectedRaisedPet")] [SignResponse]
public RaisedPetData[]? GetAllActivePetsByuserId([FromForm] string apiToken, [FromForm] string userId, [FromForm] bool active, [FromForm] bool isActive) { public RaisedPetData[]? GetAllActivePetsByuserId([FromForm] string apiToken, [FromForm] string userId, [FromForm] bool active) {
Viking? viking = ctx.Sessions.FirstOrDefault(e => e.ApiToken == apiToken)?.Viking; Viking? viking = ctx.Sessions.FirstOrDefault(e => e.ApiToken == apiToken)?.Viking;
if (viking is null) { if (viking is null) {
return null; return null;
} }
// GetAllActivePetsByuserId uses active, and GetSelectedRaisedPet uses active, so OR them together
bool isActiveSet = active || isActive;
RaisedPetData[] dragons = viking.Dragons RaisedPetData[] dragons = viking.Dragons
.Where(d => d.RaisedPetData is not null) .Where(d => d.RaisedPetData is not null)
.Select(d => XmlUtil.DeserializeXml<RaisedPetData>(d.RaisedPetData)) .Select(GetRaisedPetDataFromDragon)
.ToArray(); .ToArray();
if (dragons.Length == 0) { if (dragons.Length == 0) {
@ -322,6 +319,26 @@ public class ContentController : Controller {
return dragons; return dragons;
} }
[HttpPost]
[Produces("application/xml")]
[Route("ContentWebService.asmx/GetSelectedRaisedPet")]
[SignResponse]
public RaisedPetData[]? GetSelectedRaisedPet([FromForm] string apiToken, [FromForm] string userId, [FromForm] bool isActive) {
Viking? viking = ctx.Sessions.FirstOrDefault(e => e.ApiToken == apiToken)?.Viking;
if (viking is null) {
return null;
}
Dragon? dragon = viking.SelectedDragon;
if (dragon is null) {
return null;
}
return new RaisedPetData[] {
GetRaisedPetDataFromDragon(dragon)
};
}
[HttpPost] [HttpPost]
[Produces("application/xml")] [Produces("application/xml")]
[Route("ContentWebService.asmx/SetImage")] [Route("ContentWebService.asmx/SetImage")]
@ -342,6 +359,7 @@ public class ContentController : Controller {
ImageSlot = ImageSlot, ImageSlot = ImageSlot,
Viking = viking, Viking = viking,
}; };
newImage = true;
} }
// Save the image in the db // Save the image in the db
@ -367,16 +385,21 @@ public class ContentController : Controller {
return null; return null;
} }
Image? image = viking.Images.FirstOrDefault(e => e.ImageType == ImageType && e.ImageSlot == ImageSlot); return GetImageData(viking, ImageType, ImageSlot);
if (image is null) { }
[HttpPost]
[Produces("application/xml")]
[Route("ContentWebService.asmx/GetImageByUserId")]
public ImageData? GetImageByUserId([FromForm] string userId, [FromForm] string ImageType, [FromForm] int ImageSlot) {
Viking? viking = ctx.Vikings.FirstOrDefault(e => e.Id == userId);
if (viking is null || viking.Images is null) {
return null; return null;
} }
// TODO: test this // TODO: should we restrict images to only those the caller owns?
return new ImageData {
ImageURL = image.ImageData, return GetImageData(viking, ImageType, ImageSlot);
TemplateName = image.TemplateName,
};
} }
[HttpPost] [HttpPost]
@ -464,4 +487,26 @@ public class ContentController : Controller {
return Ok(new SetTaskStateResult { Success = true, Status = SetTaskStateStatus.TaskCanBeDone }); return Ok(new SetTaskStateResult { Success = true, Status = SetTaskStateStatus.TaskCanBeDone });
} }
private RaisedPetData GetRaisedPetDataFromDragon (Dragon dragon) {
RaisedPetData data = XmlUtil.DeserializeXml<RaisedPetData>(dragon.RaisedPetData);
data.RaisedPetID = dragon.Id;
data.EntityID = Guid.Parse(dragon.EntityId);
data.IsSelected = dragon.SelectedViking is not null;
return data;
}
private ImageData? GetImageData (Viking viking, String ImageType, int ImageSlot) {
Image? image = viking.Images.FirstOrDefault(e => e.ImageType == ImageType && e.ImageSlot == ImageSlot);
if (image is null) {
return null;
}
string imageUrl = string.Format("{0}://{1}/RawImage/{2}/{3}/{4}", HttpContext.Request.Scheme, HttpContext.Request.Host, viking.Id, ImageType, ImageSlot);
return new ImageData {
ImageURL = imageUrl,
TemplateName = image.TemplateName,
};
}
} }

View File

@ -0,0 +1,34 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using sodoff.Attributes;
using sodoff.Model;
using sodoff.Schema;
using sodoff.Services;
using sodoff.Util;
using System;
namespace sodoff.Controllers.Common;
public class ImageController : Controller {
private readonly DBContext ctx;
private KeyValueService keyValueService;
public ImageController(DBContext ctx, KeyValueService keyValueService) {
this.ctx = ctx;
this.keyValueService = keyValueService;
}
// SetImage and GetImage are defined in ContentController
[HttpGet]
[Route("RawImage/{VikingId}/{ImageType}/{ImageSlot}")]
public IActionResult RawImage(String VikingId, String ImageType, int ImageSlot) {
Image? image = ctx.Images.FirstOrDefault(e => e.VikingId == VikingId && e.ImageType == ImageType && e.ImageSlot == ImageSlot);
if (image is null) {
return null;
}
byte[] imageBytes = Convert.FromBase64String(image.ImageData);
var imageStream = new MemoryStream(imageBytes, 0, imageBytes.Length);
return File(imageStream, "image/jpeg");
}
}

View File

@ -48,6 +48,14 @@ public class DBContext : DbContext {
builder.Entity<Viking>().HasMany(u => u.Dragons) builder.Entity<Viking>().HasMany(u => u.Dragons)
.WithOne(e => e.Viking); .WithOne(e => e.Viking);
builder.Entity<Viking>().HasOne(s => s.SelectedDragon)
.WithOne(e => e.SelectedViking)
.HasForeignKey<Dragon>(e => e.SelectedVikingId);
builder.Entity<Dragon>().HasOne(s => s.SelectedViking)
.WithOne(e => e.SelectedDragon)
.HasForeignKey<Viking>(e => e.SelectedDragonId);
builder.Entity<Image>().HasOne(s => s.Viking) builder.Entity<Image>().HasOne(s => s.Viking)
.WithMany(e => e.Images) .WithMany(e => e.Images)
.HasForeignKey(e => e.VikingId); .HasForeignKey(e => e.VikingId);

View File

@ -14,7 +14,10 @@ public class Dragon {
[Required] [Required]
public string VikingId { get; set; } = null!; public string VikingId { get; set; } = null!;
public string? SelectedVikingId { get; set; }
public string? RaisedPetData { get; set; } public string? RaisedPetData { get; set; }
public virtual Viking Viking { get; set; } = null!; public virtual Viking Viking { get; set; } = null!;
public virtual Viking SelectedViking { get; set; } = null!;
} }

View File

@ -13,8 +13,11 @@ public class Viking {
public string? AvatarSerialized { get; set; } public string? AvatarSerialized { get; set; }
public int? SelectedDragonId { get; set; }
public virtual ICollection<Session> Sessions { get; set; } = null!; public virtual ICollection<Session> Sessions { get; set; } = null!;
public virtual User User { get; set; } = null!; public virtual User User { get; set; } = null!;
public virtual ICollection<Dragon> Dragons { get; set; } = null!; public virtual ICollection<Dragon> Dragons { get; set; } = null!;
public virtual ICollection<Image> Images { get; set; } = null!; public virtual ICollection<Image> Images { get; set; } = null!;
public virtual Dragon? SelectedDragon { get; set; }
} }