using Microsoft.EntityFrameworkCore; using MoonCore.Exceptions; using MoonCore.Extended.Abstractions; using MoonCore.Extended.Helpers; using MoonCore.Extended.OAuth2.LocalProvider; using Moonlight.ApiServer.Database.Entities; namespace Moonlight.ApiServer.Implementations.OAuth2; public class LocalOAuth2Provider : ILocalProviderImplementation { private readonly DatabaseRepository UserRepository; public LocalOAuth2Provider(DatabaseRepository userRepository) { UserRepository = userRepository; } public async Task SaveChanges(User model) { await UserRepository.Update(model); } public async Task LoadById(int id) { var res = await UserRepository .Get() .FirstOrDefaultAsync(x => x.Id == id); return res; } public Task Login(string email, string password) { var user = UserRepository.Get().FirstOrDefault(x => x.Email == email); if (user == null) throw new HttpApiException("Invalid email or password", 400); if(!HashHelper.Verify(password, user.Password)) throw new HttpApiException("Invalid email or password", 400); return Task.FromResult(user); } public async Task Register(string username, string email, string password) { if (UserRepository.Get().Any(x => x.Username == username)) throw new HttpApiException("A user with that username already exists", 400); if (UserRepository.Get().Any(x => x.Email == email)) throw new HttpApiException("A user with that email address already exists", 400); var user = new User() { Username = username, Email = email, Password = HashHelper.Hash(password) }; var finalUser = await UserRepository.Add(user); return finalUser; } }