Migrate from User to Account domain concept

Renames core domain entities and services from "User" to "Account"

Refactors project-wide namespaces, classes, and database tables to use "Account" terminology
Updates related components, services, and database schema to reflect new domain naming
Standardizes naming conventions across authentication and organization setup features
This commit is contained in:
Janus C. H. Knudsen 2026-01-09 22:14:46 +01:00
parent e5e7c1c19f
commit 88812177a9
29 changed files with 288 additions and 298 deletions

View file

@ -5,38 +5,39 @@ using PlanTempus.X.Services;
using Shouldly;
namespace PlanTempus.X.BDD.FeatureFixtures;
[TestClass]
[FeatureDescription(@"As a user with confirmed email
I want to set up my organization
So I can start using the system with my team")]
public partial class OrganizationSetupSpecs : FeatureFixture
{
IUserService _userService;
IAccountService _accountService;
IEmailService _emailService;
IOrganizationService _organizationService;
IUserOrganizationService _userOrganizationService;
IAccountOrganizationService _accountOrganizationService;
ITenantService _tenantService;
IAuthService _authService;
protected User _currentUser;
protected Account _currentAccount;
protected Organization _organization;
protected Exception _setupError;
protected List<Organization> _userOrganizations;
protected List<Organization> _accountOrganizations;
public async Task Given_user_has_confirmed_their_email(string email)
public async Task Given_account_has_confirmed_their_email(string email)
{
// Create a user with confirmed email
_currentUser = await _userService.CreateUserAsync(email, "Test User");
// Create an account with confirmed email
_currentAccount = await _accountService.CreateAccountAsync(email, "TestPassword123!");
var confirmationLink = await _emailService.GetConfirmationLinkForEmail(email);
await _userService.ConfirmEmailAsync(confirmationLink);
_currentUser.EmailConfirmed.ShouldBeTrue();
await _accountService.ConfirmEmailAsync(confirmationLink);
_currentAccount.EmailConfirmed.ShouldBeTrue();
}
public async Task When_user_submit_organization_name_and_valid_password(string orgName, string password)
public async Task When_account_submit_organization_name_and_valid_password(string orgName, string password)
{
try
{
_organization = await _organizationService.SetupOrganizationAsync(_currentUser.Id, orgName, password);
_organization = await _organizationService.SetupOrganizationAsync(_currentAccount.Id, orgName, password);
}
catch (Exception ex)
{
@ -48,18 +49,17 @@ public partial class OrganizationSetupSpecs : FeatureFixture
{
_organization.ShouldNotBeNull();
_organization.Name.ShouldBe("Acme Corp");
_organization.CreatedBy.ShouldBe(_currentUser.Id);
_organization.CreatedBy.ShouldBe(_currentAccount.Id);
await Task.CompletedTask;
}
public async Task And_the_user_should_be_linked_to_the_organization_in_user_organizations()
public async Task And_the_account_should_be_linked_to_the_organization_in_account_organizations()
{
var userOrg = _userOrganizationService.GetUserOrganization(_currentUser.Id, _organization.Id);
userOrg.ShouldNotBeNull();
var accountOrg = _accountOrganizationService.GetAccountOrganization(_currentAccount.Id, _organization.Id);
accountOrg.ShouldNotBeNull();
await Task.CompletedTask;
}
public async Task And_tenant_tables_should_be_created_for_the_organization()
@ -68,23 +68,21 @@ public partial class OrganizationSetupSpecs : FeatureFixture
tenantTablesExist.ShouldBeTrue();
await Task.CompletedTask;
}
public async Task And_user_should_be_logged_into_the_system()
public async Task And_account_should_be_logged_into_the_system()
{
var isAuthenticated = _authService.IsUserAuthenticated(_currentUser.Id);
var isAuthenticated = _authService.IsAccountAuthenticated(_currentAccount.Id);
isAuthenticated.ShouldBeTrue();
await Task.CompletedTask;
}
public async Task When_user_submit_organization_name_without_password(string orgName)
public async Task When_account_submit_organization_name_without_password(string orgName)
{
try
{
await _organizationService.SetupOrganizationAsync(_currentUser.Id, orgName, "");
await _organizationService.SetupOrganizationAsync(_currentAccount.Id, orgName, "");
}
catch (Exception ex)
{
@ -98,37 +96,34 @@ public partial class OrganizationSetupSpecs : FeatureFixture
_setupError.Message.ShouldBe(expectedErrorMessage);
await Task.CompletedTask;
}
public async Task Given_user_has_completed_initial_setup(string email)
public async Task Given_account_has_completed_initial_setup(string email)
{
await Given_user_has_confirmed_their_email(email);
await When_user_submit_organization_name_and_valid_password("First Org", "ValidP@ssw0rd");
_userOrganizations = new List<Organization> { _organization };
await Given_account_has_confirmed_their_email(email);
await When_account_submit_organization_name_and_valid_password("First Org", "ValidP@ssw0rd");
_accountOrganizations = new List<Organization> { _organization };
}
public async Task When_user_create_a_new_organization(string orgName)
public async Task When_account_create_a_new_organization(string orgName)
{
var newOrg = await _organizationService.CreateOrganizationAsync(_currentUser.Id, orgName);
_userOrganizations.Add(newOrg);
var newOrg = await _organizationService.CreateOrganizationAsync(_currentAccount.Id, orgName);
_accountOrganizations.Add(newOrg);
}
public async Task Then_a_new_organization_entry_should_be_created()
{
_userOrganizations.Count.ShouldBe(2);
_userOrganizations[1].Name.ShouldBe("Second Org");
_accountOrganizations.Count.ShouldBe(2);
_accountOrganizations[1].Name.ShouldBe("Second Org");
await Task.CompletedTask;
}
public async Task And_the_user_should_be_linked_to_both_organizations()
public async Task And_the_account_should_be_linked_to_both_organizations()
{
var userOrgs = _userOrganizationService.GetUserOrganizations(_currentUser.Id);
userOrgs.Count.ShouldBe(2);
var accountOrgs = _accountOrganizationService.GetAccountOrganizations(_currentAccount.Id);
accountOrgs.Count.ShouldBe(2);
await Task.CompletedTask;
}
}
}