feat(admin): read-only back-office at /admin (LAN-only)
Build & Deploy / build (push) Successful in 38s
Build & Deploy / build (push) Successful in 38s
Filament-style dark UI served directly by the API:
- Dashboard: player/entity/userdata/titledata counts + recent players
- /admin/players: searchable player list (name/id/steam)
- /admin/players/{id}: full player view — balance/faction/Fortuna cards, inventory
table, and every UserData key pretty-printed (collapsible)
- /admin/titledata + /admin/titledata/{key}: browse in-memory title data
Restricted to LAN/loopback callers (RemoteIpAddress check) so it is never reachable
from the public internet even though :8443 is port-forwarded.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,12 @@ public class DbEntityService : BaseDbService<PlayFabEntity>
|
||||
return await Collection.Find(user => user.UserId == userId).SingleOrDefaultAsync();
|
||||
}
|
||||
|
||||
// Admin back-office: list every entity (title_player_account).
|
||||
public async Task<List<PlayFabEntity>> GetAllAsync()
|
||||
{
|
||||
return await Collection.Find(_ => true).ToListAsync();
|
||||
}
|
||||
|
||||
private async Task<PlayFabEntity> CreateAsync(string userId)
|
||||
{
|
||||
var user = new PlayFabEntity
|
||||
|
||||
@@ -46,6 +46,19 @@ public class DbUserDataService : BaseDbService<PlayFabUserData>
|
||||
return await query.ToCursorAsync();
|
||||
}
|
||||
|
||||
// Admin back-office: every key/value stored for a player.
|
||||
public async Task<List<PlayFabUserData>> GetAllForUserAsync(string playFabId)
|
||||
{
|
||||
return await Collection.Find(data => data.PlayFabId == playFabId)
|
||||
.SortBy(data => data.Key).ToListAsync();
|
||||
}
|
||||
|
||||
// Admin back-office: total stored key/value documents.
|
||||
public async Task<long> CountAsync()
|
||||
{
|
||||
return await Collection.CountDocumentsAsync(_ => true);
|
||||
}
|
||||
|
||||
public async Task UpdateValueAsync(string dataId, string value)
|
||||
{
|
||||
var update = Builders<PlayFabUserData>.Update
|
||||
|
||||
@@ -24,6 +24,12 @@ public class DbUserService : BaseDbService<PlayFabUser>
|
||||
return await Collection.Find(user => user.Id == id).FirstOrDefaultAsync();
|
||||
}
|
||||
|
||||
// Admin back-office: list every player.
|
||||
public async Task<List<PlayFabUser>> GetAllAsync()
|
||||
{
|
||||
return await Collection.Find(_ => true).ToListAsync();
|
||||
}
|
||||
|
||||
// Persist a display-name change (UpdateUserTitleDisplayName). Without this the rename
|
||||
// is echoed back to the client but lost on next login.
|
||||
public async Task UpdateDisplayNameAsync(string id, string displayName)
|
||||
|
||||
Reference in New Issue
Block a user