2024-03-15 21:17:05 -05:00
|
|
|
namespace AAIntegration.SimmonsBank.API.Services;
|
|
|
|
|
2024-03-15 21:35:24 -05:00
|
|
|
using AAIntegration.SimmonsBank.API.Entities;
|
|
|
|
using AAIntegration.SimmonsBank.API.Config;
|
|
|
|
using AAIntegration.SimmonsBank.API.Models.Users;
|
2024-03-15 21:17:05 -05:00
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
2024-03-19 21:21:27 -05:00
|
|
|
using System.Security.Cryptography;
|
2024-03-15 21:17:05 -05:00
|
|
|
|
|
|
|
public interface IUserService
|
|
|
|
{
|
2024-03-19 21:21:27 -05:00
|
|
|
string Create(UserCreateRequest model);
|
|
|
|
void Update(string apiKey, UserUpdateRequest model);
|
|
|
|
void Delete(string apiKey);
|
|
|
|
Dictionary<string, int> GetAllApiKeys();
|
2024-03-19 22:39:11 -05:00
|
|
|
User GetUser(string ApiKey);
|
2024-03-29 12:39:29 -05:00
|
|
|
IEnumerable<User> GetAll();
|
2024-03-15 21:17:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
public class UserService : IUserService
|
|
|
|
{
|
|
|
|
private DataContext _context;
|
|
|
|
|
|
|
|
public UserService(
|
2024-04-04 11:03:38 -05:00
|
|
|
DataContext context)
|
2024-03-15 21:17:05 -05:00
|
|
|
{
|
|
|
|
_context = context;
|
2024-03-15 21:35:24 -05:00
|
|
|
}
|
|
|
|
|
2024-03-19 21:21:27 -05:00
|
|
|
public string Create(UserCreateRequest model)
|
2024-03-15 21:17:05 -05:00
|
|
|
{
|
2024-03-19 21:21:27 -05:00
|
|
|
User user = new User();
|
|
|
|
user.SimmonsBankUsername = model.Username;
|
|
|
|
user.SimmonsBankPassword = model.Password;
|
|
|
|
user.MFAKey = model.MFAKey;
|
2024-03-15 21:35:24 -05:00
|
|
|
|
2024-03-19 21:21:27 -05:00
|
|
|
// Generate API Key
|
|
|
|
user.ApiKey = generateApiKey();
|
2024-03-15 21:17:05 -05:00
|
|
|
|
|
|
|
// save user
|
|
|
|
_context.Users.Add(user);
|
|
|
|
_context.SaveChanges();
|
|
|
|
|
2024-03-19 21:21:27 -05:00
|
|
|
// Return API Key
|
|
|
|
return user.ApiKey;
|
2024-03-15 21:35:24 -05:00
|
|
|
}
|
2024-03-15 21:17:05 -05:00
|
|
|
|
2024-03-19 21:21:27 -05:00
|
|
|
public void Update(string apiKey, UserUpdateRequest model)
|
2024-03-15 21:17:05 -05:00
|
|
|
{
|
2024-03-19 22:39:11 -05:00
|
|
|
var user = this.GetUser(apiKey);
|
2024-03-15 21:17:05 -05:00
|
|
|
|
2024-03-19 21:21:27 -05:00
|
|
|
// User.Username
|
|
|
|
if (model.Username != null)
|
|
|
|
user.SimmonsBankUsername = model.Username;
|
2024-03-15 21:17:05 -05:00
|
|
|
|
2024-03-19 21:21:27 -05:00
|
|
|
// User.Password
|
|
|
|
if (model.Password != null)
|
|
|
|
user.SimmonsBankPassword = model.Password;
|
2024-03-15 21:17:05 -05:00
|
|
|
|
2024-03-19 21:21:27 -05:00
|
|
|
// User.MFAKey
|
|
|
|
if (model.MFAKey != null)
|
|
|
|
user.MFAKey = model.MFAKey;
|
2024-03-15 21:17:05 -05:00
|
|
|
|
|
|
|
_context.Users.Update(user);
|
|
|
|
_context.SaveChanges();
|
|
|
|
}
|
|
|
|
|
2024-03-19 21:21:27 -05:00
|
|
|
public void Delete(string apiKey)
|
2024-03-15 21:17:05 -05:00
|
|
|
{
|
2024-03-19 22:39:11 -05:00
|
|
|
var user = this.GetUser(apiKey);
|
2024-03-15 21:17:05 -05:00
|
|
|
_context.Users.Remove(user);
|
|
|
|
_context.SaveChanges();
|
|
|
|
}
|
|
|
|
|
|
|
|
public Dictionary<string, int> GetAllApiKeys()
|
|
|
|
{
|
|
|
|
return _context.Users
|
|
|
|
.Where(u => u.ApiKey != null)
|
|
|
|
.ToDictionary(u => u.ApiKey, u => u.Id);
|
|
|
|
}
|
|
|
|
|
2024-03-19 22:39:11 -05:00
|
|
|
public User GetUser(string ApiKey)
|
2024-03-15 21:17:05 -05:00
|
|
|
{
|
2024-03-19 22:39:11 -05:00
|
|
|
var user = _context.Users
|
|
|
|
.Where(u => u.ApiKey == ApiKey)
|
|
|
|
.FirstOrDefault() ?? throw new KeyNotFoundException("User not found");
|
|
|
|
|
2024-03-19 21:21:27 -05:00
|
|
|
return user;
|
2024-03-15 21:35:24 -05:00
|
|
|
}
|
2024-03-15 21:17:05 -05:00
|
|
|
|
2024-03-29 12:39:29 -05:00
|
|
|
public IEnumerable<User> GetAll()
|
|
|
|
{
|
|
|
|
return _context.Users;
|
|
|
|
}
|
|
|
|
|
2024-03-19 22:39:11 -05:00
|
|
|
// helper methods
|
2024-03-15 21:17:05 -05:00
|
|
|
|
2024-03-19 22:39:11 -05:00
|
|
|
private User getUser(int id)
|
|
|
|
{
|
|
|
|
var user = _context.Users.Find(id) ?? throw new KeyNotFoundException("User not found");
|
2024-03-19 21:21:27 -05:00
|
|
|
return user;
|
2024-03-15 21:35:24 -05:00
|
|
|
}
|
2024-03-15 21:17:05 -05:00
|
|
|
|
2024-04-04 11:03:38 -05:00
|
|
|
private const string _prefix = "SB-";
|
2024-03-19 21:21:27 -05:00
|
|
|
private const int _numberOfSecureBytesToGenerate = 32;
|
|
|
|
private const int _lengthOfKey = 32;
|
2024-03-15 21:17:05 -05:00
|
|
|
|
2024-03-19 21:21:27 -05:00
|
|
|
private string generateApiKey()
|
2024-03-15 21:17:05 -05:00
|
|
|
{
|
2024-03-19 21:21:27 -05:00
|
|
|
var bytes = RandomNumberGenerator.GetBytes(_numberOfSecureBytesToGenerate);
|
|
|
|
|
|
|
|
string base64String = Convert.ToBase64String(bytes)
|
|
|
|
.Replace("+", "-")
|
|
|
|
.Replace("/", "_");
|
|
|
|
|
|
|
|
var keyLength = _lengthOfKey - _prefix.Length;
|
|
|
|
|
|
|
|
return _prefix + base64String[..keyLength];
|
2024-03-15 21:17:05 -05:00
|
|
|
}
|
2024-03-19 21:21:27 -05:00
|
|
|
|
2024-03-15 21:17:05 -05:00
|
|
|
}
|