forked from SoDOff-Project/sodoff
fix dragons and images
This commit is contained in:
parent
5f7921ea6f
commit
1fdff9d27b
@ -34,8 +34,11 @@ methods = [
|
|||||||
'SetTaskState',
|
'SetTaskState',
|
||||||
'CreatePet',
|
'CreatePet',
|
||||||
'SetRaisedPet',
|
'SetRaisedPet',
|
||||||
|
'SetSelectedPet',
|
||||||
|
'GetSelectedRaisedPet',
|
||||||
'SetImage',
|
'SetImage',
|
||||||
'GetImage'
|
'GetImage',
|
||||||
|
'GetImageByUserId'
|
||||||
]
|
]
|
||||||
|
|
||||||
def routable(path):
|
def routable(path):
|
||||||
|
@ -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,
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
34
src/Controllers/Common/ImageController.cs
Normal file
34
src/Controllers/Common/ImageController.cs
Normal 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");
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
@ -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!;
|
||||||
}
|
}
|
||||||
|
@ -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; }
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user