using System.Text.Json; using Prospect.Server.Api.Services.Auth.Extensions; using Prospect.Server.Api.Services.CloudScript.Models; using Prospect.Server.Api.Services.CloudScript.Models.Data; using Prospect.Server.Api.Services.UserData; namespace Prospect.Server.Api.Services.CloudScript.Functions; [CloudScriptFunction("GetCraftingInProgressData")] public class GetCraftingInProgressData : ICloudScriptFunction { private readonly IHttpContextAccessor _httpContextAccessor; private readonly UserDataService _userDataService; public GetCraftingInProgressData(IHttpContextAccessor httpContextAccessor, UserDataService userDataService) { _httpContextAccessor = httpContextAccessor; _userDataService = userDataService; } public async Task ExecuteAsync(FYGetCraftingInProgressDataRequest request) { var context = _httpContextAccessor.HttpContext; if (context == null) { throw new CloudScriptException("CloudScript was not called within a http request"); } var userId = context.User.FindAuthUserId(); // Return the persisted in-progress craft (written by StartItemCraftingClient) // instead of an empty stub, so the crafting timer survives a menu reopen / relog. var userData = await _userDataService.FindAsync(userId, userId, new List { "CraftingTimer__2022_05_12" }); // Fully qualified: a different FYItemCurrentlyBeingCrafted also exists in this namespace. var craft = JsonSerializer.Deserialize(userData["CraftingTimer__2022_05_12"].Value) ?? new Models.Data.FYItemCurrentlyBeingCrafted(); return new FYGetCraftingInProgressDataResult { UserId = userId, Error = string.Empty, ItemCurrentlyBeingCrafted = craft, }; } }