diff --git a/src/Prospect.Server.Api/Services/CloudScript/Functions/UpdatePlayerActiveContracts.cs b/src/Prospect.Server.Api/Services/CloudScript/Functions/UpdatePlayerActiveContracts.cs new file mode 100644 index 0000000..043f9e2 --- /dev/null +++ b/src/Prospect.Server.Api/Services/CloudScript/Functions/UpdatePlayerActiveContracts.cs @@ -0,0 +1,62 @@ +using System.Text.Json; +using System.Text.Json.Serialization; +using Prospect.Server.Api.Services.Auth.Extensions; +using Prospect.Server.Api.Services.CloudScript.Models.Data; +using Prospect.Server.Api.Services.UserData; + +namespace Prospect.Server.Api.Services.CloudScript.Functions; + +// Custom request for dedicated server implementation + +public class FYUpdatePlayerActiveContractsRequest { + [JsonPropertyName("userId")] + public string UserID { get; set; } + [JsonPropertyName("contracts")] + public List Contracts { get; set; } +} + +public class FYUpdatePlayerActiveContractsResult { +} + +[CloudScriptFunction("UpdatePlayerActiveContracts")] +public class UpdatePlayerActiveContracts : ICloudScriptFunction +{ + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly UserDataService _userDataService; + private readonly TitleDataService _titleDataService; + + public UpdatePlayerActiveContracts(IHttpContextAccessor httpContextAccessor, UserDataService userDataService, TitleDataService titleDataService) + { + _httpContextAccessor = httpContextAccessor; + _userDataService = userDataService; + _titleDataService = titleDataService; + } + + public async Task ExecuteAsync(FYUpdatePlayerActiveContractsRequest request) + { + var context = _httpContextAccessor.HttpContext; + if (context == null) + { + throw new CloudScriptException("CloudScript was not called within a http request"); + } + var userId = context.User.FindAuthUserId(); + var userData = await _userDataService.FindAsync(userId, userId, new List{"ContractsActive"}); + var contractsActive = JsonSerializer.Deserialize(userData["ContractsActive"].Value); + + foreach (var contract in request.Contracts) { + var foundContract = contractsActive.Contracts.Find(item => item.ContractID == contract.ContractID); + if (foundContract == null) { + continue; + } + foundContract.Progress = contract.Progress; + } + + await _userDataService.UpdateAsync( + userId, userId, + new Dictionary{ ["ContractsActive"] = JsonSerializer.Serialize(contractsActive) } + ); + + return new FYUpdatePlayerActiveContractsResult + {}; + } +} \ No newline at end of file