using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.Options; using MongoDB.Driver; using SharpCompress.Common; using UGQDatabase.Models; using UGQDataAccess.Settings; using ServerCommon.UGQ; using System.Drawing; using UGQDataAccess.Repository.Models; using UGQDataAccess.Repository.Query; namespace UGQDataAccess.Repository; public class AdminAccountRepository : BaseRepository { private const string CollectionName = "AdminAccount"; public AdminAccountRepository(IMongoClient mongoClient, IOptions settings) : base(mongoClient, settings.Value.DatabaseName, CollectionName) { } public async Task get(string username) { var filter = Builders.Filter .Eq(x => x.Username, username); return await Collection.Find(filter).FirstOrDefaultAsync(); } public async Task signup(string username, string password, UGQAccountRole role) { var filter = Builders.Filter .Eq(x => x.Username, username); var update = Builders.Update .SetOnInsert(x => x.Username, username) .SetOnInsert(x => x.Password, password) .SetOnInsert(x => x.Role, role) .SetOnInsert(x => x.UpdatedAt, DateTime.UtcNow) .SetOnInsert(x => x.CreatedAt, DateTime.UtcNow); var option = new FindOneAndUpdateOptions { IsUpsert = true, ReturnDocument = ReturnDocument.After }; return await Collection.FindOneAndUpdateAsync(filter, update, option); } public async Task changePassword(string username, string newPassword) { var filter = Builders.Filter .Eq(x => x.Username, username); var update = Builders.Update .Set(x => x.Password, newPassword) .Set(x => x.UpdatedAt, DateTime.UtcNow); var option = new FindOneAndUpdateOptions { IsUpsert = true, ReturnDocument = ReturnDocument.After }; return await Collection.FindOneAndUpdateAsync(filter, update, option); } public async Task saveRefreshToken(string id, string refreshToken, DateTime? refreshTokenExpryTime) { var filter = Builders.Filter .Eq(x => x.Id, id); var updateBuilder = Builders.Update; var update = Builders.Update .Set(x => x.UpdatedAt, DateTime.UtcNow) .Set(x => x.RefreshToken, refreshToken); if (refreshTokenExpryTime != null) update = updateBuilder.Combine(update, updateBuilder.Set(x => x.RefreshTokenExpiryTime, refreshTokenExpryTime)); var options = new FindOneAndUpdateOptions { ReturnDocument = ReturnDocument.After, }; var updated = await Collection.FindOneAndUpdateAsync(filter, update, options); return updated; } public async Task deleteRefreshToken(string username) { var filter = Builders.Filter .Eq(x => x.Username, username); var updateBuilder = Builders.Update; var update = Builders.Update .Set(x => x.UpdatedAt, DateTime.UtcNow) .Set(x => x.RefreshToken, "") .Set(x => x.RefreshTokenExpiryTime, DateTime.Now); var options = new FindOneAndUpdateOptions { ReturnDocument = ReturnDocument.After, }; var updated = await Collection.FindOneAndUpdateAsync(filter, update, options); return updated; } }