121 lines
3.0 KiB
C#
Raw Normal View History

2024-03-15 21:17:05 -05:00
namespace AAIntegration.SimmonsBank.API.Services;
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;
using System.Security.Cryptography;
2024-03-15 21:17:05 -05:00
public interface IUserService
{
string Create(UserCreateRequest model);
void Update(string apiKey, UserUpdateRequest model);
void Delete(string apiKey);
Dictionary<string, int> GetAllApiKeys();
User GetUser(string ApiKey);
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;
}
public string Create(UserCreateRequest model)
2024-03-15 21:17:05 -05:00
{
User user = new User();
user.SimmonsBankUsername = model.Username;
user.SimmonsBankPassword = model.Password;
user.MFAKey = model.MFAKey;
// Generate API Key
user.ApiKey = generateApiKey();
2024-03-15 21:17:05 -05:00
// save user
_context.Users.Add(user);
_context.SaveChanges();
// Return API Key
return user.ApiKey;
}
2024-03-15 21:17:05 -05:00
public void Update(string apiKey, UserUpdateRequest model)
2024-03-15 21:17:05 -05:00
{
var user = this.GetUser(apiKey);
2024-03-15 21:17:05 -05:00
// User.Username
if (model.Username != null)
user.SimmonsBankUsername = model.Username;
2024-03-15 21:17:05 -05:00
// User.Password
if (model.Password != null)
user.SimmonsBankPassword = model.Password;
2024-03-15 21:17:05 -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();
}
public void Delete(string apiKey)
2024-03-15 21:17:05 -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);
}
public User GetUser(string ApiKey)
2024-03-15 21:17:05 -05:00
{
var user = _context.Users
.Where(u => u.ApiKey == ApiKey)
.FirstOrDefault() ?? throw new KeyNotFoundException("User not found");
return user;
}
2024-03-15 21:17:05 -05:00
public IEnumerable<User> GetAll()
{
return _context.Users;
}
// helper methods
2024-03-15 21:17:05 -05:00
private User getUser(int id)
{
var user = _context.Users.Find(id) ?? throw new KeyNotFoundException("User not found");
return user;
}
2024-03-15 21:17:05 -05:00
2024-04-04 11:03:38 -05:00
private const string _prefix = "SB-";
private const int _numberOfSecureBytesToGenerate = 32;
private const int _lengthOfKey = 32;
2024-03-15 21:17:05 -05:00
private string generateApiKey()
2024-03-15 21:17:05 -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-15 21:17:05 -05:00
}