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 Authenticate(LoginRequest model); Task> GetAll(); Task GetById(Guid id); Task Add(User newUser); Task UsernameIsValid(string username); Task 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 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> GetAll() { return await _dataSource.GetUsers(); } public async Task GetById(Guid id) { return await _dataSource.GetUserById(id); } public async Task Add(User newUser) { var userNameIsValid = await UsernameIsValid(newUser.UserName); if (!userNameIsValid) { throw new InvalidUserNameException(newUser.UserName); } return await _dataSource.AddUser(newUser); } public async Task 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 Update(User user) { if (user == null) return null; if ((await GetById(user.Id)) == null) { return null; } return await _dataSource.UpdateUser(user); } } }