Rough character selection screen + API

This commit is contained in:
2025-12-24 00:00:24 -06:00
parent 9a56091e8e
commit d9eededbfa
169 changed files with 5643 additions and 189 deletions
@@ -0,0 +1,36 @@
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;
namespace AuthApi.Services;
public class BlacklistedToken
{
[BsonId] public string Jti { get; set; } = default!;
public DateTime ExpiresAt { get; set; }
}
public class BlacklistService
{
private readonly IMongoCollection<BlacklistedToken> _col;
public BlacklistService(IConfiguration cfg)
{
var cs = cfg["MongoDB:ConnectionString"] ?? "mongodb://127.0.0.1:27017";
var dbName = cfg["MongoDB:DatabaseName"] ?? "GameDb";
var client = new MongoClient(cs);
var db = client.GetDatabase(dbName);
_col = db.GetCollection<BlacklistedToken>("BlacklistedTokens");
// TTL index so revocations expire automatically
var keys = Builders<BlacklistedToken>.IndexKeys.Ascending(x => x.ExpiresAt);
_col.Indexes.CreateOne(new CreateIndexModel<BlacklistedToken>(keys, new CreateIndexOptions { ExpireAfter = TimeSpan.Zero }));
}
public Task AddToBlacklistAsync(string jti, DateTime expiresAt) =>
_col.ReplaceOneAsync(x => x.Jti == jti,
new BlacklistedToken { Jti = jti, ExpiresAt = expiresAt },
new ReplaceOptions { IsUpsert = true });
public Task<bool> IsBlacklistedAsync(string jti) =>
_col.Find(x => x.Jti == jti).AnyAsync();
}
@@ -0,0 +1,32 @@
using AuthApi.Models;
using MongoDB.Driver;
namespace AuthApi.Services;
public class UserService
{
private readonly IMongoCollection<User> _col;
public UserService(IConfiguration cfg)
{
var cs = cfg["MongoDB:ConnectionString"] ?? "mongodb://127.0.0.1:27017";
var dbName = cfg["MongoDB:DatabaseName"] ?? "GameDb";
var client = new MongoClient(cs);
var db = client.GetDatabase(dbName);
_col = db.GetCollection<User>("Users");
var keys = Builders<User>.IndexKeys.Ascending(u => u.Username);
_col.Indexes.CreateOne(new CreateIndexModel<User>(keys, new CreateIndexOptions { Unique = true }));
}
public Task<User?> GetByUsernameAsync(string username) =>
_col.Find(u => u.Username == username).FirstOrDefaultAsync();
public Task CreateAsync(User user) => _col.InsertOneAsync(user);
public Task UpdateAsync(User user) =>
_col.ReplaceOneAsync(u => u.Id == user.Id, user);
public Task<List<User>> GetAllAsync() =>
_col.Find(FilterDefinition<User>.Empty).ToListAsync();
}