Files
Radicade/Server/Players/PlayersV1.cs
T
2026-10-16 23:33:13 -07:00

126 lines
3.7 KiB
C#

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<List<ProgressionResponse>?> GetBulkProgression([FromForm] int[] Ids)
{
var res = new List<ProgressionResponse>();
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<IActionResult> 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<IActionResult> 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);
}
}
}