using AuthApi.Models; using MongoDB.Driver; namespace AuthApi.Services; public class SteamAuthTransactionService { private readonly IMongoCollection _transactions; public SteamAuthTransactionService(IConfiguration cfg) { var connectionString = cfg["MongoDB:ConnectionString"] ?? "mongodb://127.0.0.1:27017"; var databaseName = cfg["MongoDB:DatabaseName"] ?? "GameDb"; var database = new MongoClient(connectionString).GetDatabase(databaseName); _transactions = database.GetCollection("SteamAuthTransactions"); var ttl = Builders.IndexKeys.Ascending(x => x.ExpiresUtc); _transactions.Indexes.CreateOne(new CreateIndexModel(ttl, new CreateIndexOptions { ExpireAfter = TimeSpan.Zero })); } public Task CreateAsync(SteamAuthTransaction transaction) => _transactions.InsertOneAsync(transaction); public async Task GetAsync(string id) => await _transactions.Find(x => x.Id == id).FirstOrDefaultAsync(); public async Task MarkVerifiedAsync(string id, string steamId, string status, string? userId) { var filter = Builders.Filter.Eq(x => x.Id, id) & Builders.Filter.Eq(x => x.Status, "pending") & Builders.Filter.Gt(x => x.ExpiresUtc, DateTime.UtcNow); var update = Builders.Update .Set(x => x.SteamId, steamId) .Set(x => x.Status, status) .Set(x => x.UserId, userId); return (await _transactions.UpdateOneAsync(filter, update)).ModifiedCount == 1; } public async Task MarkCompleteAsync(string id, string steamId, string userId) { var filter = Builders.Filter.Eq(x => x.Id, id) & Builders.Filter.Eq(x => x.Status, "requires_account") & Builders.Filter.Eq(x => x.SteamId, steamId) & Builders.Filter.Gt(x => x.ExpiresUtc, DateTime.UtcNow); var update = Builders.Update .Set(x => x.Status, "complete") .Set(x => x.UserId, userId); return (await _transactions.UpdateOneAsync(filter, update)).ModifiedCount == 1; } }