using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using RadicadeServer.DB; using RadicadeServer.Extensions; using RadicadeServer.RecNet.Accounts.Local; using RadicadeServer.RecNet.Progression; using RadicadeServer.RecNet.Responses; namespace RadicadeServer.API.Players.V1 { [Route("api/players/v1")] public class PlayersV1(RecDBContext db) : Controller { [HttpGet("progression/{id}")] public ProgressionResponse? GetProgression(long id) { var data = db.Progression.FirstOrDefault((x) => x.PlayerId == id); data ??= new ProgressionData { PlayerId = id }; return new ProgressionResponse(data); } [HttpPost("progression/bulk")] public async Task?> GetBulkProgression([FromForm] int[] Ids) { var res = new List(); foreach (int id in Ids) { var data = await db.Progression.FirstOrDefaultAsync((x) => x.PlayerId == id); data ??= new ProgressionData { PlayerId = id }; res.Add(new ProgressionResponse(data)); } return res; } private const string PhotoTaggingKey = "playerPhotoTaggingSetting"; [HttpGet("playerPhotoTaggingSetting"), Authorize] public async Task GetPhotoTaggingSetting() { var userId = User.GetUserId(); if (userId == null) return Unauthorized(); var settings = await db.PlayerSettings.AsNoTracking() .FirstOrDefaultAsync(x => x.AccountId == userId); var value = settings?.DeserializeSettings() ?.FirstOrDefault(x => string.Equals(x.Key, PhotoTaggingKey, StringComparison.OrdinalIgnoreCase)) ?.Value; return Ok(int.TryParse(value, out var parsed) ? parsed : 0); } [HttpPut("playerPhotoTaggingSetting"), Authorize] [HttpPost("playerPhotoTaggingSetting"), Authorize] public async Task SetPhotoTaggingSetting() { var userId = User.GetUserId(); if (userId == null) return Unauthorized(); int? setting = null; if (Request.HasFormContentType) { var form = await Request.ReadFormAsync(); foreach (var key in new[] { "Setting", "setting" }) { if (int.TryParse(form[key], out var parsed)) { setting = parsed; break; } } } else { try { using var doc = await System.Text.Json.JsonDocument.ParseAsync(Request.Body); var root = doc.RootElement; foreach (var key in new[] { "Setting", "setting" }) { if (root.ValueKind == System.Text.Json.JsonValueKind.Object && root.TryGetProperty(key, out var prop) && prop.ValueKind == System.Text.Json.JsonValueKind.Number && prop.TryGetInt32(out var parsed)) { setting = parsed; break; } } } catch (System.Text.Json.JsonException) { } } var settings = await db.PlayerSettings.FirstOrDefaultAsync(x => x.AccountId == userId); if (settings == null) { settings = new PlayerSettings { AccountId = userId.Value, Settings = "[]" }; await db.PlayerSettings.AddAsync(settings); } var actualSettings = settings.DeserializeSettings(); var found = actualSettings.FirstOrDefault(x => string.Equals(x.Key, PhotoTaggingKey, StringComparison.OrdinalIgnoreCase)); if (setting.HasValue) { if (found != null) found.Value = setting.Value.ToString(); else actualSettings.Add(new Setting { Key = PhotoTaggingKey, Value = setting.Value.ToString() }); settings.Settings = actualSettings.ToJson(); await db.SaveChangesAsync(); } var storedValue = actualSettings .FirstOrDefault(x => string.Equals(x.Key, PhotoTaggingKey, StringComparison.OrdinalIgnoreCase)) ?.Value; return Ok(int.TryParse(storedValue, out var stored) ? stored : 0); } } }