FlexitimeTracker/FlexitimeUI/FlexitimeAPI/Services/UserService.cs
2023-04-11 20:17:20 +01:00

104 lines
3.0 KiB
C#

using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using AutoMapper;
using Flexitime.DataAccess.Objects;
using Flexitime.Interfaces;
using Flexitime.Objects;
using FlexitimeAPI.Exceptions;
using FlexitimeAPI.Interfaces;
using FlexitimeAPI.Models;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using RandomNameGeneratorLibrary;
namespace FlexitimeAPI.Services
{
public interface IUserService
{
Task<LoginResponse> Authenticate(LoginRequest model);
Task<IEnumerable<User>> GetAll();
Task<User> GetById(Guid id);
Task<User> Add(User newUser);
Task<bool> UsernameIsValid(string username);
Task<User> Update(User user);
}
public class UserService : IUserService
{
private readonly IDataAccess _dataSource;
private readonly ILoginService _loginService;
public UserService(IDataAccess dataSource, ILoginService loginService)
{
_dataSource = dataSource;
_loginService = loginService;
}
public async Task<LoginResponse> Authenticate(LoginRequest model)
{
var user = (await _dataSource.GetUsers()).SingleOrDefault(x => x.UserName == model.Username && x.Password == model.Password);
// return null if user not found
if (user == null) return null;
// authentication successful so generate jwt token
var token = _loginService.GenerateJwtToken(user);
return new LoginResponse(user, token);
}
public async Task<IEnumerable<User>> GetAll()
{
return await _dataSource.GetUsers();
}
public async Task<User> GetById(Guid id)
{
return await _dataSource.GetUserById(id);
}
public async Task<User> Add(User newUser)
{
var userNameIsValid = await UsernameIsValid(newUser.UserName);
if (!userNameIsValid)
{
throw new InvalidUserNameException(newUser.UserName);
}
return await _dataSource.AddUser(newUser);
}
public async Task<bool> UsernameIsValid(string userName)
{
if (string.IsNullOrWhiteSpace(userName))
{
return false;
}
//TODO: blacklisted username check
var existingUser = await _dataSource.GetUserByUsername(userName);
return existingUser == null;
}
public async Task<User> Update(User user)
{
if (user == null) return null;
if ((await GetById(user.Id)) == null)
{
return null;
}
return await _dataSource.UpdateUser(user);
}
}
}