feat(admin): added backend for admin pages

This commit is contained in:
Fishandchips321 2026-03-05 17:19:24 +00:00
parent 54cfc05b88
commit 56ea7fb7f0
26 changed files with 662 additions and 42 deletions

View file

@ -49,19 +49,87 @@ public class AuthService : IAuthService
var session = await _sessionRepo.GetUserSession(sessionToken);
if (session == null)
if (session == null) //session doesn't exist
{
return false;
}
else if (session.ExpiresOn < DateTime.Now)
else if (session.ExpiresOn < DateTime.Now) //session has timed out
{
await _sessionRepo.DeleteSession(sessionToken);
return false;
}
else
else //session exists and hasn't timed out
{
await _sessionRepo.RefreshSessionExpiry(sessionToken);
return true;
}
}
public async Task<bool> IsAdmin(string sessionToken)
{
var session = await _sessionRepo.GetUserSession(sessionToken);
if (session == null)
{
throw new SessionNotFoundException();
}
return session.Login.IsAdmin;
}
public async Task<UserLoginDTO[]> GetLogins()
{
var logins = await _loginRepo.GetUserLogins();
var loginDTOs = new List<UserLoginDTO>();
foreach (var login in logins)
{
loginDTOs.Add(new UserLoginDTO(login));
}
return loginDTOs.ToArray();
}
public async Task<UserLoginDTO> GetLogin(string username)
{
var login = await _loginRepo.GetUserLogin(username);
return new UserLoginDTO(login);
}
public async Task<UserLoginDTO> CreateLogin(string username, string password)
{
var hashedPassword = BCrypt.Net.BCrypt.HashPassword(password);
var newLogin = await _loginRepo.CreateLogin(username, hashedPassword, false);
return new UserLoginDTO(newLogin);
}
public async Task UpdateLoginOwnPassword(string username, string newPassword, string oldPassword)
{
var login = await _loginRepo.GetUserLogin(username);
if (!BCrypt.Net.BCrypt.Verify(oldPassword, login.HashedPassword))
{
throw new LoginFailedException();
}
await UpdateLoginPassword(username, newPassword);
}
public async Task UpdateLoginPassword(string username, string newPassword)
{
var hashedNewPassword = BCrypt.Net.BCrypt.HashPassword(newPassword);
await _loginRepo.ChangeUserPassword(username, hashedNewPassword);
}
public async Task<UserLoginDTO> DeleteLogin(string username)
{
var deletedLogin = await _loginRepo.DeleteLogin(username);
return new UserLoginDTO(deletedLogin);
}
}

View file

@ -6,4 +6,11 @@ public interface IAuthService
{
public Task<UserSessionDTO> AuthenticateUser(string username, string password);
public Task<bool> IsAuthenticated(string? sessionToken);
public Task<bool> IsAdmin(string sessionToken);
public Task<UserLoginDTO[]> GetLogins();
public Task<UserLoginDTO> GetLogin(string username);
public Task<UserLoginDTO> CreateLogin(string username, string password);
public Task UpdateLoginOwnPassword(string username, string newPassword, string oldPassword);
public Task UpdateLoginPassword(string username, string newPassword);
public Task<UserLoginDTO> DeleteLogin(string username);
}

View file

@ -7,4 +7,8 @@ namespace JellyGlass.Services;
public interface IServerService
{
public Task<ServerDTO[]> GetServers();
public Task<ServerDTO> GetServerByID(int id);
public Task<ServerDTO> CreateServer(string owner, string url, string apiToken);
public Task<ServerDTO> UpdateServer(int id, string owner, string url, string apiToken);
public Task<ServerDTO> DeleteServer(int id);
}

View file

@ -28,11 +28,9 @@ public class ServerService : IServerService
{
_logger.LogInformation($"ID for server {client.InstanceUrl} is {client.ID}");
var dto = new ServerDTO();
var server = servers.First(s => s.Url == client.InstanceUrl);
dto.Id = client.ID;
dto.Url = client.InstanceUrl;
dto.Owner = server.Owner;
var dto = new ServerDTO(server);
dto.JellyfinServerID = client.ID;
dtos.Add(dto);
}
@ -51,17 +49,31 @@ public class ServerService : IServerService
return dtos.ToArray();
}
public async Task<ServerDTO[]> GetServers2()
public async Task<ServerDTO> GetServerByID(int id)
{
var servers = await _repository.GetServers();
var server = await _repository.GetServerById(id);
var dtos = new List<ServerDTO>();
return new ServerDTO(server);
}
foreach (var s in servers)
{
dtos.Add(new ServerDTO(s));
}
public async Task<ServerDTO> CreateServer(string owner, string url, string apiToken)
{
var newServer = await _repository.CreateServer(owner, url, apiToken);
return dtos.ToArray();
return new ServerDTO(newServer);
}
public async Task<ServerDTO> UpdateServer(int id, string owner, string url, string apiToken)
{
var updatedServer = await _repository.UpdateServer(id, owner, url, apiToken);
return new ServerDTO(updatedServer);
}
public async Task<ServerDTO> DeleteServer(int id)
{
var deletedServer = await _repository.DeleteServer(id);
return new ServerDTO(deletedServer);
}
}