From 4ed24dd4402ccd6403cde932847a1c40fa30c854 Mon Sep 17 00:00:00 2001 From: Kevin Winkel Date: Wed, 5 Jun 2024 21:43:35 +0200 Subject: [PATCH] refactor: ownership model (#109) * stash * blyat * easy peasy drop your local database squeezy --- docker-compose.yml | 3 - global.json | 6 + src/Api/Api.csproj | 8 +- src/Api/appsettings.Development.json | 2 +- src/Application/Application.csproj | 6 +- .../Banking/Commands/DepositMoneyCommand.cs | 16 +- .../Commands/MakeTransactionCommand.cs | 2 +- .../Commands/OpenBankAccountCommand.cs | 6 +- .../Banking/Commands/WithdrawMoneyCommand.cs | 3 +- .../EventHandlers/BankingLogEventHandler.cs | 2 +- .../Banking/Queries/BankAccountsQuery.cs | 2 +- .../Characters/CharacterLogManager.cs | 4 +- src/Domain/Banking/Bank.cs | 12 +- src/Domain/Banking/BankAccount.cs | 50 +- src/Domain/Banking/BankAccountNumber.cs | 4 +- .../BankAccountTransactionExecutedEvent.cs | 6 +- src/Domain/Characters/Character.cs | 44 +- src/Domain/Characters/CharacterId.cs | 6 + .../{ => Events}/CharacterCreatedEvent.cs | 2 +- src/Domain/Common/Base/IHasCash.cs | 8 + src/Domain/Common/Base/IHuman.cs | 6 + src/Domain/Common/PaymentMethod.cs | 7 + src/Domain/Companies/Company.cs | 9 +- src/Domain/Domain.csproj | 7 +- src/Domain/GlobalUsings.cs | 2 + src/Domain/Persons/Person.cs | 38 ++ src/Domain/Properties/AssemblyInfo.cs | 3 + .../Characters/CharacterTypeConfiguration.cs | 6 - .../Common/DatabaseContextSeed.cs | 6 +- .../Companies/CompanyTypeConfiguration.cs | 6 - src/Infrastructure/Infrastructure.csproj | 14 +- ...20220527191637_InitialPGSchema.Designer.cs | 160 ----- .../20220527191637_InitialPGSchema.cs | 93 --- .../20220527211718_AddCompanies.Designer.cs | 292 ---------- .../Migrations/20220527211718_AddCompanies.cs | 112 ---- .../20220903221846_AddBanking.Designer.cs | 551 ------------------ .../Migrations/20220903221846_AddBanking.cs | 219 ------- .../20231006093426_AccountBohemiaId.cs | 38 -- ....cs => 20240522184447_Initial.Designer.cs} | 102 +++- .../Migrations/20240522184447_Initial.cs | 422 ++++++++++++++ .../DatabaseContextModelSnapshot.cs | 98 +++- .../Persons/PersonTypeConfiguration.cs | 31 + .../ServiceCollectionExtensions.cs | 33 +- src/Migrator/Migrator.csproj | 6 +- src/Migrator/appsettings.json | 3 - src/WebUI/Properties/launchSettings.json | 2 +- src/WebUI/WebUI.csproj | 6 +- src/WebUI/appsettings.Development.json | 3 +- tests/Api.UnitTests/Api.UnitTests.csproj | 10 +- .../Application.UnitTests.csproj | 10 +- .../Banking/BankAccountBookingTests.cs | 13 +- .../Banking/BankAccountTests.cs | 124 ---- .../Characters/CharacterTests.cs | 1 + .../Domain.UnitTests/Domain.UnitTests.csproj | 10 +- .../Infrastructure.UnitTests.csproj | 10 +- tests/WebUI.UniTests/WebUI.UniTests.csproj | 10 +- 56 files changed, 843 insertions(+), 1812 deletions(-) create mode 100644 global.json create mode 100644 src/Domain/Characters/CharacterId.cs rename src/Domain/Characters/{ => Events}/CharacterCreatedEvent.cs (83%) create mode 100644 src/Domain/Common/Base/IHasCash.cs create mode 100644 src/Domain/Common/Base/IHuman.cs create mode 100644 src/Domain/Common/PaymentMethod.cs create mode 100644 src/Domain/GlobalUsings.cs create mode 100644 src/Domain/Persons/Person.cs delete mode 100644 src/Infrastructure/Migrations/20220527191637_InitialPGSchema.Designer.cs delete mode 100644 src/Infrastructure/Migrations/20220527191637_InitialPGSchema.cs delete mode 100644 src/Infrastructure/Migrations/20220527211718_AddCompanies.Designer.cs delete mode 100644 src/Infrastructure/Migrations/20220527211718_AddCompanies.cs delete mode 100644 src/Infrastructure/Migrations/20220903221846_AddBanking.Designer.cs delete mode 100644 src/Infrastructure/Migrations/20220903221846_AddBanking.cs delete mode 100644 src/Infrastructure/Migrations/20231006093426_AccountBohemiaId.cs rename src/Infrastructure/Migrations/{20231006093426_AccountBohemiaId.Designer.cs => 20240522184447_Initial.Designer.cs} (88%) create mode 100644 src/Infrastructure/Migrations/20240522184447_Initial.cs create mode 100644 src/Infrastructure/Persons/PersonTypeConfiguration.cs delete mode 100644 tests/Domain.UnitTests/Banking/BankAccountTests.cs diff --git a/docker-compose.yml b/docker-compose.yml index eeeddf8..9ac2030 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,3 @@ -version: '3.1' - - networks: core: diff --git a/global.json b/global.json new file mode 100644 index 0000000..a604954 --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "8.0.104", + "rollForward": "latestMinor" + } +} \ No newline at end of file diff --git a/src/Api/Api.csproj b/src/Api/Api.csproj index 33cb588..fdaec8c 100644 --- a/src/Api/Api.csproj +++ b/src/Api/Api.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable enable ELifeRPG.Core.Api @@ -13,9 +13,9 @@ - - - + + + diff --git a/src/Api/appsettings.Development.json b/src/Api/appsettings.Development.json index 0db7426..affd1ca 100644 --- a/src/Api/appsettings.Development.json +++ b/src/Api/appsettings.Development.json @@ -2,7 +2,7 @@ "Logging": { "LogLevel": { "Default": "Information", - "Microsoft.AspNetCore": "Warning" + "Microsoft.AspNetCore": "Debug" } }, "ConnectionStrings": { diff --git a/src/Application/Application.csproj b/src/Application/Application.csproj index e0190e7..7d88aec 100644 --- a/src/Application/Application.csproj +++ b/src/Application/Application.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable enable ELifeRPG.Application @@ -9,8 +9,8 @@ - - + + diff --git a/src/Application/Banking/Commands/DepositMoneyCommand.cs b/src/Application/Banking/Commands/DepositMoneyCommand.cs index d8df849..e58efdf 100644 --- a/src/Application/Banking/Commands/DepositMoneyCommand.cs +++ b/src/Application/Banking/Commands/DepositMoneyCommand.cs @@ -23,8 +23,6 @@ public class DepositMoneyCommand : IRequest { public Guid BankAccountId { get; init; } - public Guid CharacterId { get; init; } - public decimal Amount { get; init; } } @@ -40,8 +38,10 @@ public DepositMoneyCommandHandler(IDatabaseContext databaseContext) public async Task Handle(DepositMoneyCommand request, CancellationToken cancellationToken) { var bankAccount = await _databaseContext.BankAccounts - .Include(x => x.OwningCharacter) + .Include(x => x.Owner.Character) + .Include(x => x.Owner.Company) .Include(x => x.BankCondition) + .Include(x => x.Bookings!.Take(0)) .SingleOrDefaultAsync(x => x.Id == request.BankAccountId, cancellationToken); if (bankAccount is null) @@ -49,15 +49,7 @@ public async Task Handle(DepositMoneyCommand request, throw new ELifeEntityNotFoundException(); } - var character = await _databaseContext.Characters - .SingleOrDefaultAsync(x => x.Id == request.CharacterId, cancellationToken); - - if (character is null) - { - throw new ELifeEntityNotFoundException(); - } - - var (transaction, booking) = bankAccount.DepositMoney(character, request.Amount); + var (transaction, booking) = bankAccount.DepositMoney(request.Amount); await _databaseContext.SaveChangesAsync(cancellationToken); diff --git a/src/Application/Banking/Commands/MakeTransactionCommand.cs b/src/Application/Banking/Commands/MakeTransactionCommand.cs index 6b49a46..f0ac8f6 100644 --- a/src/Application/Banking/Commands/MakeTransactionCommand.cs +++ b/src/Application/Banking/Commands/MakeTransactionCommand.cs @@ -60,7 +60,7 @@ public async Task Handle(MakeTransactionCommand re var sourceBankAccount = selectedBankAccounts.First(x => x.Id == request.SourceBankAccountId); var targetBankAccount = selectedBankAccounts.First(x => x.Id == request.TargetBankAccountId); - var transaction = sourceBankAccount.TransferMoneyTo(targetBankAccount, character, request.Amount); + var transaction = sourceBankAccount.TransferMoneyTo(targetBankAccount, request.Amount, character); await _databaseContext.SaveChangesAsync(cancellationToken); return new MakeTransactionCommandResult(transaction); diff --git a/src/Application/Banking/Commands/OpenBankAccountCommand.cs b/src/Application/Banking/Commands/OpenBankAccountCommand.cs index c745cfd..58e01d3 100644 --- a/src/Application/Banking/Commands/OpenBankAccountCommand.cs +++ b/src/Application/Banking/Commands/OpenBankAccountCommand.cs @@ -79,6 +79,7 @@ public async Task Handle(OpenBankAccountCommand re private async Task OpenAccountForCharacter(Bank bank, Guid characterId, CancellationToken cancellationToken) { var character = await _databaseContext.Characters + .Include(x => x.Person) .AsNoTracking() .SingleOrDefaultAsync(x => x.Id == characterId, cancellationToken); @@ -87,7 +88,7 @@ private async Task OpenAccountForCharacter(Bank bank, Guid characte throw new ELifeEntityNotFoundException(); } - var bankAccount = bank.OpenAccount(character); + var bankAccount = bank.OpenAccount(character.Person!); await _databaseContext.SaveChangesAsync(cancellationToken); return bankAccount; @@ -96,6 +97,7 @@ private async Task OpenAccountForCharacter(Bank bank, Guid characte private async Task OpenAccountForCompany(Bank bank, CompanyId companyId, CancellationToken cancellationToken) { var company = await _databaseContext.Companies + .Include(x => x.Person) .AsNoTracking() .SingleOrDefaultAsync(x => x.Id == companyId.Value, cancellationToken); @@ -104,7 +106,7 @@ private async Task OpenAccountForCompany(Bank bank, CompanyId compa throw new ELifeEntityNotFoundException(); } - var bankAccount = bank.OpenAccount(company); + var bankAccount = bank.OpenAccount(company.Person!); await _databaseContext.SaveChangesAsync(cancellationToken); return bankAccount; diff --git a/src/Application/Banking/Commands/WithdrawMoneyCommand.cs b/src/Application/Banking/Commands/WithdrawMoneyCommand.cs index 78e199d..98ab927 100644 --- a/src/Application/Banking/Commands/WithdrawMoneyCommand.cs +++ b/src/Application/Banking/Commands/WithdrawMoneyCommand.cs @@ -37,8 +37,9 @@ public WithdrawMoneyCommandHandler(IDatabaseContext databaseContext) public async Task Handle(WithdrawMoneyCommand request, CancellationToken cancellationToken) { var bankAccount = await _databaseContext.BankAccounts - .Include(x => x.OwningCharacter) + .Include(x => x.Owner.Character) .Include(x => x.BankCondition) + .Include(x => x.Bookings!.Take(0)) .SingleOrDefaultAsync(x => x.Id == request.BankAccountId, cancellationToken); if (bankAccount is null) diff --git a/src/Application/Banking/EventHandlers/BankingLogEventHandler.cs b/src/Application/Banking/EventHandlers/BankingLogEventHandler.cs index c5b46ff..0165501 100644 --- a/src/Application/Banking/EventHandlers/BankingLogEventHandler.cs +++ b/src/Application/Banking/EventHandlers/BankingLogEventHandler.cs @@ -51,7 +51,7 @@ public Task Handle(BankAccountTransactionExecutedEvent notification, Cancellatio BankAccountTransactionExecutedEvent( _logger, notification.Transaction.BankAccount.Id, - notification.ExecutingCharacter.Id, + notification.Character?.Id ?? default, notification.Transaction.Source!.Id, notification.Transaction.Amount, notification.Transaction.Fees, diff --git a/src/Application/Banking/Queries/BankAccountsQuery.cs b/src/Application/Banking/Queries/BankAccountsQuery.cs index e1f4382..b8a7293 100644 --- a/src/Application/Banking/Queries/BankAccountsQuery.cs +++ b/src/Application/Banking/Queries/BankAccountsQuery.cs @@ -35,7 +35,7 @@ public async Task Handle(BankAccountsQuery request, Can if (request.CharacterId is not null) { - query = query.Where(x => x.OwningCharacter!.Id == request.CharacterId); + query = query.Where(x => x.Owner.Character!.Id == request.CharacterId); } var result = await query.AsNoTracking().ToListAsync(cancellationToken); diff --git a/src/Application/Characters/CharacterLogManager.cs b/src/Application/Characters/CharacterLogManager.cs index 0e3ab0e..8e4e99b 100644 --- a/src/Application/Characters/CharacterLogManager.cs +++ b/src/Application/Characters/CharacterLogManager.cs @@ -1,4 +1,4 @@ -using ELifeRPG.Domain.Characters; +using ELifeRPG.Domain.Characters.Events; using ELifeRPG.Domain.Characters.Sessions; using MediatR; using Microsoft.Extensions.Logging; @@ -19,7 +19,7 @@ public Task Handle(CharacterCreatedEvent notification, CancellationToken cancell _logger.LogInformation("Character {CharacterId} has been created", notification.Character.Id.ToString()); return Task.CompletedTask; } - + public Task Handle(CharacterSessionCreatedEvent notification, CancellationToken cancellationToken) { _logger.LogInformation("Session for character {CharacterId} has been started", notification.Character.Id.ToString()); diff --git a/src/Domain/Banking/Bank.cs b/src/Domain/Banking/Bank.cs index 00d0644..90219f7 100644 --- a/src/Domain/Banking/Bank.cs +++ b/src/Domain/Banking/Bank.cs @@ -3,6 +3,7 @@ using ELifeRPG.Domain.Common; using ELifeRPG.Domain.Companies; using ELifeRPG.Domain.Countries; +using ELifeRPG.Domain.Persons; namespace ELifeRPG.Domain.Banking; @@ -35,16 +36,9 @@ public Bank(Country country, int? number = null) public IReadOnlyCollection? Accounts => _accounts; - public BankAccount OpenAccount(Character owningCharacter) + public BankAccount OpenAccount(Person person) { - var account = new BankAccount(this, owningCharacter); - HandleNewAccount(account); - return account; - } - - public BankAccount OpenAccount(Company owningCompany) - { - var account = new BankAccount(this, owningCompany); + var account = new BankAccount(this, person); HandleNewAccount(account); return account; } diff --git a/src/Domain/Banking/BankAccount.cs b/src/Domain/Banking/BankAccount.cs index 92069b6..8787f08 100644 --- a/src/Domain/Banking/BankAccount.cs +++ b/src/Domain/Banking/BankAccount.cs @@ -1,8 +1,10 @@ -using ELifeRPG.Domain.Banking.Events; +using System.Buffers; +using ELifeRPG.Domain.Banking.Events; using ELifeRPG.Domain.Characters; using ELifeRPG.Domain.Common; using ELifeRPG.Domain.Common.Exceptions; using ELifeRPG.Domain.Companies; +using ELifeRPG.Domain.Persons; namespace ELifeRPG.Domain.Banking; @@ -18,18 +20,11 @@ internal BankAccount() { } - public BankAccount(Bank bank, Character owningCharacter) + public BankAccount(Bank bank, Person owner) : this(bank) { - OwningCharacter = owningCharacter; - Type = BankAccountType.Personal; - } - - public BankAccount(Bank bank, Company owningCompany) - : this(bank) - { - OwningCompany = owningCompany; - Type = BankAccountType.Corporate; + Owner = owner; + Type = owner.Character is null && owner.Company is not null ? BankAccountType.Corporate : BankAccountType.Personal; } private BankAccount(Bank bank) @@ -53,23 +48,21 @@ private BankAccount(Bank bank) public Bank? Bank { get; init; } public BankCondition? BankCondition { get; init; } - - public Character? OwningCharacter { get; init; } - - public Company? OwningCompany { get; init; } - + + public Person Owner { get; init; } = null!; + public ICollection? Bookings { get; init; } public List DomainEvents { get; } = new(); - public bool Can(Character character, BankAccountCapabilities capability) + public bool Can(Person person, BankAccountCapabilities capability) { if (Type == BankAccountType.Personal) { - return character.Id == OwningCharacter!.Id; + return person.Character!.Id == Owner.Character!.Id; } - var companyMembership = OwningCompany?.Memberships!.SingleOrDefault(x => x.Character.Id == character.Id); + var companyMembership = Owner.Company!.Memberships!.SingleOrDefault(x => x.Character.Id == person.Id); return companyMembership is not null && MapFromCompanyPosition(companyMembership.Position.Permissions).Contains(capability); } @@ -77,18 +70,18 @@ public bool Can(Character character, BankAccountCapabilities capability) /// Tries to execute a transaction to the destination bank-account. /// /// The destination bank-account. - /// The executing character. - /// The amount to be transferred, without fees. + /// The amount to be transferred, without fees. + /// The executing person. /// The transaction including fees. /// Throws if the character is not allowed to execute the transaction. - public BankAccountTransaction TransferMoneyTo(BankAccount targetAccount, Character character, decimal amount) + public BankAccountTransaction TransferMoneyTo(BankAccount targetAccount, decimal amount, Character? character) { if (Bookings is null || targetAccount.Bookings is null) { throw new InvalidOperationException(); } - if (!Can(character, BankAccountCapabilities.CommitTransactions)) + if (character is not null && !Can(character.Person!, BankAccountCapabilities.CommitTransactions)) { throw new ELifeInvalidOperationException(); } @@ -127,7 +120,7 @@ public BankAccountTransaction WithdrawMoney(Character character, decimal amount) throw new InvalidOperationException(); } - if (!Can(character, BankAccountCapabilities.CommitTransactions)) + if (!Can(character.Person!, BankAccountCapabilities.CommitTransactions)) { throw new ELifeInvalidOperationException(); } @@ -148,24 +141,19 @@ public BankAccountTransaction WithdrawMoney(Character character, decimal amount) return transaction; } - public (BankAccountTransaction Transaction, BankAccountBooking Booking) DepositMoney(Character character, decimal amount) + public (BankAccountTransaction Transaction, BankAccountBooking Booking) DepositMoney(decimal amount) { if (Bookings is null) { throw new InvalidOperationException(); } - - if (!Can(character, BankAccountCapabilities.CommitTransactions)) - { - throw new ELifeInvalidOperationException(); - } var transaction = new BankAccountTransaction(this, BankAccountTransactionType.CashDeposit, amount); var booking = new BankAccountBooking(this, transaction); Bookings.Add(booking); Balance += booking.Amount; - DomainEvents.Add(new BankAccountTransactionExecutedEvent(transaction, character)); + DomainEvents.Add(new BankAccountTransactionExecutedEvent(transaction)); return (transaction, booking); } diff --git a/src/Domain/Banking/BankAccountNumber.cs b/src/Domain/Banking/BankAccountNumber.cs index 018d8f6..c039c4e 100644 --- a/src/Domain/Banking/BankAccountNumber.cs +++ b/src/Domain/Banking/BankAccountNumber.cs @@ -10,11 +10,9 @@ namespace ELifeRPG.Domain.Banking; /// public class BankAccountNumber { - private static readonly Random Random = new(); - public BankAccountNumber(Bank bank) { - var randomNumber = Random.NextInt64(1000000000, 99999999999); + var randomNumber = Random.Shared.NextInt64(1000000000, 99999999999); var checkNumber = BuildCheckNumber(bank.Country.Code, bank.Number, randomNumber); Value = BuildValue(bank.Country.Code, checkNumber, bank.Number, randomNumber); diff --git a/src/Domain/Banking/Events/BankAccountTransactionExecutedEvent.cs b/src/Domain/Banking/Events/BankAccountTransactionExecutedEvent.cs index 3a208bc..7b6d56d 100644 --- a/src/Domain/Banking/Events/BankAccountTransactionExecutedEvent.cs +++ b/src/Domain/Banking/Events/BankAccountTransactionExecutedEvent.cs @@ -5,13 +5,13 @@ namespace ELifeRPG.Domain.Banking.Events; public class BankAccountTransactionExecutedEvent : DomainEvent { - public BankAccountTransactionExecutedEvent(BankAccountTransaction transaction, Character executingCharacter) + public BankAccountTransactionExecutedEvent(BankAccountTransaction transaction, Character? character = null) { Transaction = transaction; - ExecutingCharacter = executingCharacter; + Character = character; } public BankAccountTransaction Transaction { get; } - public Character ExecutingCharacter { get; } + public Character? Character { get; } } diff --git a/src/Domain/Characters/Character.cs b/src/Domain/Characters/Character.cs index b695cfd..03867c3 100644 --- a/src/Domain/Characters/Character.cs +++ b/src/Domain/Characters/Character.cs @@ -1,16 +1,20 @@ -using ELifeRPG.Domain.Accounts; +using ELifeRPG.Domain.Accounts; using ELifeRPG.Domain.Banking; +using ELifeRPG.Domain.Characters.Events; using ELifeRPG.Domain.Characters.Sessions; using ELifeRPG.Domain.Common; +using ELifeRPG.Domain.Common.Base; using ELifeRPG.Domain.Companies; +using ELifeRPG.Domain.Persons; using ELifeRPG.Domain.ObjectPositions; namespace ELifeRPG.Domain.Characters; -public class Character : EntityBase, IHasDomainEvents +public class Character : EntityBase, IHasDomainEvents, IHuman { private CharacterName? _name; private PositionData _worldPosition; + private decimal _cash; internal Character() { @@ -19,12 +23,15 @@ internal Character() public Character(Character characterInfo) { SetValues(characterInfo); + Person = new Person(this); DomainEvents.Add(new CharacterCreatedEvent(this)); } - + public Guid Id { get; init; } = Guid.NewGuid(); public Account? Account { get; init; } + + public Person? Person { get; init; } public CharacterName? Name { @@ -38,11 +45,15 @@ public PositionData WorldPosition init => _worldPosition = value; } + public decimal Cash + { + get => _cash; + init => _cash = value; + } + public ICollection? Sessions { get; init; } public ICollection? CompanyMemberships { get; init; } - - public ICollection? BankAccounts { get; init; } public List DomainEvents { get; set; } = new(); @@ -86,4 +97,27 @@ public void EndSession(CharacterSession session) { return Sessions?.SingleOrDefault(x => x.Ended is not null); } + + public bool HasCash(decimal amount) + { + return Cash >= amount; + } + + public bool PayCash(decimal amount, IHasCash receiver) + { + if (!HasCash(amount)) + { + return false; + } + + _cash -= amount; + receiver.ReceiveCash(amount); + + return true; + } + + public void ReceiveCash(decimal amount) + { + _cash += amount; + } } diff --git a/src/Domain/Characters/CharacterId.cs b/src/Domain/Characters/CharacterId.cs new file mode 100644 index 0000000..3f6dc8f --- /dev/null +++ b/src/Domain/Characters/CharacterId.cs @@ -0,0 +1,6 @@ +using StronglyTypedIds; + +namespace ELifeRPG.Domain.Characters; + +[StronglyTypedId] +public partial struct CharacterId {} diff --git a/src/Domain/Characters/CharacterCreatedEvent.cs b/src/Domain/Characters/Events/CharacterCreatedEvent.cs similarity index 83% rename from src/Domain/Characters/CharacterCreatedEvent.cs rename to src/Domain/Characters/Events/CharacterCreatedEvent.cs index 802609f..f55ca74 100644 --- a/src/Domain/Characters/CharacterCreatedEvent.cs +++ b/src/Domain/Characters/Events/CharacterCreatedEvent.cs @@ -1,6 +1,6 @@ using ELifeRPG.Domain.Common; -namespace ELifeRPG.Domain.Characters; +namespace ELifeRPG.Domain.Characters.Events; public class CharacterCreatedEvent : DomainEvent { diff --git a/src/Domain/Common/Base/IHasCash.cs b/src/Domain/Common/Base/IHasCash.cs new file mode 100644 index 0000000..bb18f4a --- /dev/null +++ b/src/Domain/Common/Base/IHasCash.cs @@ -0,0 +1,8 @@ +namespace ELifeRPG.Domain.Common.Base; + +public interface IHasCash +{ + decimal Cash { get; init; } + + void ReceiveCash(decimal amount); +} diff --git a/src/Domain/Common/Base/IHuman.cs b/src/Domain/Common/Base/IHuman.cs new file mode 100644 index 0000000..281f66c --- /dev/null +++ b/src/Domain/Common/Base/IHuman.cs @@ -0,0 +1,6 @@ +namespace ELifeRPG.Domain.Common.Base; + +public interface IHuman : IHasCash +{ + bool PayCash(decimal amount, IHasCash receiver); +} diff --git a/src/Domain/Common/PaymentMethod.cs b/src/Domain/Common/PaymentMethod.cs new file mode 100644 index 0000000..a9c273b --- /dev/null +++ b/src/Domain/Common/PaymentMethod.cs @@ -0,0 +1,7 @@ +namespace ELifeRPG.Domain.Common; + +public enum PaymentMethod +{ + Cash = 1, + BankTransfer = 2, +} diff --git a/src/Domain/Companies/Company.cs b/src/Domain/Companies/Company.cs index d291c3b..2323f93 100644 --- a/src/Domain/Companies/Company.cs +++ b/src/Domain/Companies/Company.cs @@ -1,6 +1,6 @@ -using ELifeRPG.Domain.Banking; -using ELifeRPG.Domain.Characters; +using ELifeRPG.Domain.Characters; using ELifeRPG.Domain.Common; +using ELifeRPG.Domain.Persons; namespace ELifeRPG.Domain.Companies; @@ -16,17 +16,18 @@ public Company(string name) Name = name; Positions = new List { new() { Name = "Rookie", Ordering = 10, } }; Memberships = new List(); + Person = new Person(); } public Guid Id { get; init; } + + public Person? Person { get; init; } public string Name { get; init; } = null!; public ICollection? Positions { get; init; } public ICollection? Memberships { get; init; } - - public ICollection? BankAccounts { get; init; } public List DomainEvents { get; set; } = new(); diff --git a/src/Domain/Domain.csproj b/src/Domain/Domain.csproj index a52cdc9..33bf9c1 100644 --- a/src/Domain/Domain.csproj +++ b/src/Domain/Domain.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable enable ELifeRPG.Domain @@ -9,7 +9,10 @@ - + + + + diff --git a/src/Domain/GlobalUsings.cs b/src/Domain/GlobalUsings.cs new file mode 100644 index 0000000..c8a196b --- /dev/null +++ b/src/Domain/GlobalUsings.cs @@ -0,0 +1,2 @@ +global using OneOf; +global using OneOf.Types; diff --git a/src/Domain/Persons/Person.cs b/src/Domain/Persons/Person.cs new file mode 100644 index 0000000..0053fd7 --- /dev/null +++ b/src/Domain/Persons/Person.cs @@ -0,0 +1,38 @@ +using ELifeRPG.Domain.Characters; +using ELifeRPG.Domain.Common; +using ELifeRPG.Domain.Companies; + +namespace ELifeRPG.Domain.Persons; + +public enum PersonType +{ + Character = 1, + Company = 2, +} + +public class Person : EntityBase +{ + internal Person() + { + } + + public Person(Character character) + { + Character = character; + Type = PersonType.Character; + } + + public Person(Company company) + { + Company = company; + Type = PersonType.Company; + } + + public Guid Id { get; init; } = Guid.NewGuid(); + + public PersonType Type { get; init; } + + public Character? Character { get; init; } + + public Company? Company { get; init; } +} diff --git a/src/Domain/Properties/AssemblyInfo.cs b/src/Domain/Properties/AssemblyInfo.cs index 2f69ac6..da2b156 100644 --- a/src/Domain/Properties/AssemblyInfo.cs +++ b/src/Domain/Properties/AssemblyInfo.cs @@ -1,4 +1,7 @@ using System.Runtime.CompilerServices; +using StronglyTypedIds; [assembly:InternalsVisibleTo("ELifeRPG.Infrastructure")] [assembly:InternalsVisibleTo("ELifeRPG.Core.Domain.UnitTests")] + +[assembly:StronglyTypedIdDefaults(converters: StronglyTypedIdConverter.None)] diff --git a/src/Infrastructure/Characters/CharacterTypeConfiguration.cs b/src/Infrastructure/Characters/CharacterTypeConfiguration.cs index b7a6909..4c2327c 100644 --- a/src/Infrastructure/Characters/CharacterTypeConfiguration.cs +++ b/src/Infrastructure/Characters/CharacterTypeConfiguration.cs @@ -28,12 +28,6 @@ public void Configure(EntityTypeBuilder builder) .HasOne(x => x.Account) .WithMany(x => x.Characters) .HasConstraintName("FK_Account_Id"); - - builder - .HasMany(x => x.BankAccounts) - .WithOne(x => x.OwningCharacter) - .HasForeignKey("FK_Character_Id") - .HasConstraintName("FK_BankAccount_Character_Id"); } } diff --git a/src/Infrastructure/Common/DatabaseContextSeed.cs b/src/Infrastructure/Common/DatabaseContextSeed.cs index eb30e5b..02ffc2f 100644 --- a/src/Infrastructure/Common/DatabaseContextSeed.cs +++ b/src/Infrastructure/Common/DatabaseContextSeed.cs @@ -64,14 +64,14 @@ private static async Task SeedAccountsCharacters(IDatabaseContext context) SteamId = AccountSteam64Id, Characters = new List { - new() + new(new Character { Id = _characterJonDoeId, Name = new CharacterName("Jon", "Doe"), - }, + }), }, }); - + await context.SaveChangesAsync(); } } diff --git a/src/Infrastructure/Companies/CompanyTypeConfiguration.cs b/src/Infrastructure/Companies/CompanyTypeConfiguration.cs index 842b557..6bff102 100644 --- a/src/Infrastructure/Companies/CompanyTypeConfiguration.cs +++ b/src/Infrastructure/Companies/CompanyTypeConfiguration.cs @@ -26,11 +26,5 @@ public void Configure(EntityTypeBuilder builder) .HasMany(x => x.Memberships) .WithOne(x => x.Company) .HasConstraintName("FK_CompanyMembership_Id"); - - builder - .HasMany(x => x.BankAccounts) - .WithOne(x => x.OwningCompany) - .HasForeignKey("FK_Company_Id") - .HasConstraintName("FK_BankAccount_Company_Id"); } } diff --git a/src/Infrastructure/Infrastructure.csproj b/src/Infrastructure/Infrastructure.csproj index 2667740..0f0d2df 100644 --- a/src/Infrastructure/Infrastructure.csproj +++ b/src/Infrastructure/Infrastructure.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable enable ELifeRPG.Infrastructure @@ -14,13 +14,13 @@ - - - - - + + + + - + + diff --git a/src/Infrastructure/Migrations/20220527191637_InitialPGSchema.Designer.cs b/src/Infrastructure/Migrations/20220527191637_InitialPGSchema.Designer.cs deleted file mode 100644 index 33f4001..0000000 --- a/src/Infrastructure/Migrations/20220527191637_InitialPGSchema.Designer.cs +++ /dev/null @@ -1,160 +0,0 @@ -// - - -#nullable disable - -using System; -using ELifeRPG.Application.Common; -using ELifeRPG.Infrastructure.Common; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; -namespace ELifeRPG.Infrastructure.Migrations -{ - [DbContext(typeof(DatabaseContext))] - [Migration("20220527191637_InitialPGSchema")] - partial class InitialPGSchema - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.5") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("ELifeRPG.Domain.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("Status") - .HasColumnType("integer") - .HasColumnName("Status"); - - b.Property("SteamId") - .HasColumnType("bigint") - .HasColumnName("SteamId"); - - b.HasKey("Id") - .HasName("PK_Account_Id"); - - b.HasIndex("SteamId") - .HasDatabaseName("IDX_Account_SteamId"); - - b.ToTable("Account", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Characters.Character", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.HasKey("Id") - .HasName("PK_Character_Id"); - - b.HasIndex("AccountId"); - - b.ToTable("Character", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Characters.Sessions.CharacterSession", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("CharacterId") - .HasColumnType("uuid"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("Ended") - .HasColumnType("timestamp with time zone"); - - b.HasKey("Id") - .HasName("PK_CharacterSession_Id"); - - b.HasIndex("CharacterId"); - - b.ToTable("CharacterSession", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Characters.Character", b => - { - b.HasOne("ELifeRPG.Domain.Accounts.Account", "Account") - .WithMany("Characters") - .HasForeignKey("AccountId") - .HasConstraintName("FK_Account_Id"); - - b.OwnsOne("ELifeRPG.Domain.Characters.CharacterName", "Name", b1 => - { - b1.Property("CharacterId") - .HasColumnType("uuid"); - - b1.Property("FirstName") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("FirstName"); - - b1.Property("LastName") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("LastName"); - - b1.HasKey("CharacterId"); - - b1.ToTable("Character"); - - b1.WithOwner() - .HasForeignKey("CharacterId"); - }); - - b.Navigation("Account"); - - b.Navigation("Name"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Characters.Sessions.CharacterSession", b => - { - b.HasOne("ELifeRPG.Domain.Characters.Character", "Character") - .WithMany("Sessions") - .HasForeignKey("CharacterId") - .HasConstraintName("FK_Character_Id"); - - b.Navigation("Character"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Accounts.Account", b => - { - b.Navigation("Characters"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Characters.Character", b => - { - b.Navigation("Sessions"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/Infrastructure/Migrations/20220527191637_InitialPGSchema.cs b/src/Infrastructure/Migrations/20220527191637_InitialPGSchema.cs deleted file mode 100644 index 511141f..0000000 --- a/src/Infrastructure/Migrations/20220527191637_InitialPGSchema.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ELifeRPG.Infrastructure.Migrations -{ - public partial class InitialPGSchema : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "Account", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - SteamId = table.Column(type: "bigint", nullable: false), - Status = table.Column(type: "integer", nullable: false), - Created = table.Column(type: "timestamp with time zone", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Account_Id", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Character", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - AccountId = table.Column(type: "uuid", nullable: true), - FirstName = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), - LastName = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), - Created = table.Column(type: "timestamp with time zone", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Character_Id", x => x.Id); - table.ForeignKey( - name: "FK_Account_Id", - column: x => x.AccountId, - principalTable: "Account", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "CharacterSession", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - CharacterId = table.Column(type: "uuid", nullable: true), - Ended = table.Column(type: "timestamp with time zone", nullable: true), - Created = table.Column(type: "timestamp with time zone", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_CharacterSession_Id", x => x.Id); - table.ForeignKey( - name: "FK_Character_Id", - column: x => x.CharacterId, - principalTable: "Character", - principalColumn: "Id"); - }); - - migrationBuilder.CreateIndex( - name: "IDX_Account_SteamId", - table: "Account", - column: "SteamId"); - - migrationBuilder.CreateIndex( - name: "IX_Character_AccountId", - table: "Character", - column: "AccountId"); - - migrationBuilder.CreateIndex( - name: "IX_CharacterSession_CharacterId", - table: "CharacterSession", - column: "CharacterId"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "CharacterSession"); - - migrationBuilder.DropTable( - name: "Character"); - - migrationBuilder.DropTable( - name: "Account"); - } - } -} diff --git a/src/Infrastructure/Migrations/20220527211718_AddCompanies.Designer.cs b/src/Infrastructure/Migrations/20220527211718_AddCompanies.Designer.cs deleted file mode 100644 index e95acc4..0000000 --- a/src/Infrastructure/Migrations/20220527211718_AddCompanies.Designer.cs +++ /dev/null @@ -1,292 +0,0 @@ -// - - -#nullable disable - -using System; -using ELifeRPG.Application.Common; -using ELifeRPG.Infrastructure.Common; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; -namespace ELifeRPG.Infrastructure.Migrations -{ - [DbContext(typeof(DatabaseContext))] - [Migration("20220527211718_AddCompanies")] - partial class AddCompanies - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.5") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("ELifeRPG.Domain.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("Status") - .HasColumnType("integer") - .HasColumnName("Status"); - - b.Property("SteamId") - .HasColumnType("bigint") - .HasColumnName("SteamId"); - - b.HasKey("Id") - .HasName("PK_Account_Id"); - - b.HasIndex("SteamId") - .HasDatabaseName("IDX_Account_SteamId"); - - b.ToTable("Account", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Characters.Character", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.HasKey("Id") - .HasName("PK_Character_Id"); - - b.HasIndex("AccountId"); - - b.ToTable("Character", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Characters.Sessions.CharacterSession", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("CharacterId") - .HasColumnType("uuid"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("Ended") - .HasColumnType("timestamp with time zone"); - - b.HasKey("Id") - .HasName("PK_CharacterSession_Id"); - - b.HasIndex("CharacterId"); - - b.ToTable("CharacterSession", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Companies.Company", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("Name"); - - b.HasKey("Id") - .HasName("PK_Company_Id"); - - b.ToTable("Company", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Companies.CompanyMembership", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("CharacterId") - .HasColumnType("uuid"); - - b.Property("CompanyId") - .HasColumnType("uuid"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("PositionId") - .HasColumnType("uuid"); - - b.HasKey("Id") - .HasName("PK_CompanyMembership_Id"); - - b.HasIndex("CharacterId"); - - b.HasIndex("CompanyId"); - - b.HasIndex("PositionId"); - - b.ToTable("CompanyMembership", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Companies.CompanyPosition", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("CompanyId") - .HasColumnType("uuid"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("Name"); - - b.Property("Ordering") - .HasColumnType("integer") - .HasColumnName("Ordering"); - - b.HasKey("Id") - .HasName("PK_CompanyPosition_Id"); - - b.HasIndex("CompanyId"); - - b.ToTable("CompanyPosition", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Characters.Character", b => - { - b.HasOne("ELifeRPG.Domain.Accounts.Account", "Account") - .WithMany("Characters") - .HasForeignKey("AccountId") - .HasConstraintName("FK_Account_Id"); - - b.OwnsOne("ELifeRPG.Domain.Characters.CharacterName", "Name", b1 => - { - b1.Property("CharacterId") - .HasColumnType("uuid"); - - b1.Property("FirstName") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("FirstName"); - - b1.Property("LastName") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("LastName"); - - b1.HasKey("CharacterId"); - - b1.ToTable("Character"); - - b1.WithOwner() - .HasForeignKey("CharacterId"); - }); - - b.Navigation("Account"); - - b.Navigation("Name"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Characters.Sessions.CharacterSession", b => - { - b.HasOne("ELifeRPG.Domain.Characters.Character", "Character") - .WithMany("Sessions") - .HasForeignKey("CharacterId") - .HasConstraintName("FK_Character_Id"); - - b.Navigation("Character"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Companies.CompanyMembership", b => - { - b.HasOne("ELifeRPG.Domain.Characters.Character", "Character") - .WithMany("CompanyMemberships") - .HasForeignKey("CharacterId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_Character_Id"); - - b.HasOne("ELifeRPG.Domain.Companies.Company", "Company") - .WithMany("Memberships") - .HasForeignKey("CompanyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_CompanyMembership_Id"); - - b.HasOne("ELifeRPG.Domain.Companies.CompanyPosition", "Position") - .WithMany() - .HasForeignKey("PositionId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Character"); - - b.Navigation("Company"); - - b.Navigation("Position"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Companies.CompanyPosition", b => - { - b.HasOne("ELifeRPG.Domain.Companies.Company", "Company") - .WithMany("Positions") - .HasForeignKey("CompanyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_Position_Id"); - - b.Navigation("Company"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Accounts.Account", b => - { - b.Navigation("Characters"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Characters.Character", b => - { - b.Navigation("CompanyMemberships"); - - b.Navigation("Sessions"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Companies.Company", b => - { - b.Navigation("Memberships"); - - b.Navigation("Positions"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/Infrastructure/Migrations/20220527211718_AddCompanies.cs b/src/Infrastructure/Migrations/20220527211718_AddCompanies.cs deleted file mode 100644 index 4195db5..0000000 --- a/src/Infrastructure/Migrations/20220527211718_AddCompanies.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ELifeRPG.Infrastructure.Migrations -{ - public partial class AddCompanies : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "Company", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "text", nullable: false), - Created = table.Column(type: "timestamp with time zone", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Company_Id", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "CompanyPosition", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - CompanyId = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "text", nullable: false), - Ordering = table.Column(type: "integer", nullable: false), - Created = table.Column(type: "timestamp with time zone", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_CompanyPosition_Id", x => x.Id); - table.ForeignKey( - name: "FK_Position_Id", - column: x => x.CompanyId, - principalTable: "Company", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "CompanyMembership", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - CompanyId = table.Column(type: "uuid", nullable: false), - CharacterId = table.Column(type: "uuid", nullable: false), - PositionId = table.Column(type: "uuid", nullable: false), - Created = table.Column(type: "timestamp with time zone", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_CompanyMembership_Id", x => x.Id); - table.ForeignKey( - name: "FK_Character_Id", - column: x => x.CharacterId, - principalTable: "Character", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_CompanyMembership_CompanyPosition_PositionId", - column: x => x.PositionId, - principalTable: "CompanyPosition", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_CompanyMembership_Id", - column: x => x.CompanyId, - principalTable: "Company", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_CompanyMembership_CharacterId", - table: "CompanyMembership", - column: "CharacterId"); - - migrationBuilder.CreateIndex( - name: "IX_CompanyMembership_CompanyId", - table: "CompanyMembership", - column: "CompanyId"); - - migrationBuilder.CreateIndex( - name: "IX_CompanyMembership_PositionId", - table: "CompanyMembership", - column: "PositionId"); - - migrationBuilder.CreateIndex( - name: "IX_CompanyPosition_CompanyId", - table: "CompanyPosition", - column: "CompanyId"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "CompanyMembership"); - - migrationBuilder.DropTable( - name: "CompanyPosition"); - - migrationBuilder.DropTable( - name: "Company"); - } - } -} diff --git a/src/Infrastructure/Migrations/20220903221846_AddBanking.Designer.cs b/src/Infrastructure/Migrations/20220903221846_AddBanking.Designer.cs deleted file mode 100644 index 9d2b690..0000000 --- a/src/Infrastructure/Migrations/20220903221846_AddBanking.Designer.cs +++ /dev/null @@ -1,551 +0,0 @@ -// -using System; -using ELifeRPG.Infrastructure.Common; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace ELifeRPG.Infrastructure.Migrations -{ - [DbContext(typeof(DatabaseContext))] - [Migration("20220903221846_AddBanking")] - partial class AddBanking - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.7") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("ELifeRPG.Domain.Accounts.Account", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("Status") - .HasColumnType("integer") - .HasColumnName("Status"); - - b.Property("SteamId") - .HasColumnType("bigint") - .HasColumnName("SteamId"); - - b.HasKey("Id") - .HasName("PK_Account_Id"); - - b.HasIndex("SteamId") - .HasDatabaseName("IDX_Account_SteamId"); - - b.ToTable("Account", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Banking.Bank", b => - { - b.Property("Id") - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("FK_Country_Id") - .HasColumnType("uuid"); - - b.Property("Number") - .HasColumnType("integer") - .HasColumnName("Number"); - - b.HasKey("Id") - .HasName("PK_Bank_Id"); - - b.HasIndex("FK_Country_Id"); - - b.HasIndex("Number") - .IsUnique(); - - b.ToTable("Bank", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Banking.BankAccount", b => - { - b.Property("Id") - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("Balance") - .HasColumnType("numeric"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("FK_BankCondition_Id") - .HasColumnType("uuid"); - - b.Property("FK_Bank_Id") - .HasColumnType("uuid"); - - b.Property("FK_Character_Id") - .HasColumnType("uuid"); - - b.Property("FK_Company_Id") - .HasColumnType("uuid"); - - b.Property("Number") - .IsRequired() - .HasColumnType("text") - .HasColumnName("Number"); - - b.Property("Type") - .HasColumnType("integer") - .HasColumnName("Type"); - - b.HasKey("Id") - .HasName("PK_BankAccount_Id"); - - b.HasIndex("FK_BankCondition_Id"); - - b.HasIndex("FK_Bank_Id"); - - b.HasIndex("FK_Character_Id"); - - b.HasIndex("FK_Company_Id"); - - b.HasIndex("Number") - .IsUnique(); - - b.ToTable("BankAccount", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Banking.BankAccountBooking", b => - { - b.Property("Id") - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("Amount") - .HasColumnType("numeric") - .HasColumnName("Amount"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("FK_BankAccount_Id") - .HasColumnType("uuid"); - - b.Property("Purpose") - .HasColumnType("text"); - - b.Property("SourceId") - .HasColumnType("uuid"); - - b.Property("Type") - .HasColumnType("integer") - .HasColumnName("Type"); - - b.HasKey("Id") - .HasName("PK_BankAccountBooking_Id"); - - b.HasIndex("FK_BankAccount_Id"); - - b.HasIndex("SourceId"); - - b.ToTable("BankAccountBooking", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Banking.BankCondition", b => - { - b.Property("Id") - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("FK_Bank_Id") - .HasColumnType("uuid"); - - b.Property("TransactionFeeBase") - .HasColumnType("numeric") - .HasColumnName("TransactionFeeBase"); - - b.Property("TransactionFeeMultiplier") - .HasColumnType("numeric") - .HasColumnName("TransactionFeeMultiplier"); - - b.HasKey("Id") - .HasName("PK_BankCondition_Id"); - - b.HasIndex("FK_Bank_Id"); - - b.ToTable("BankCondition", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Characters.Character", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("AccountId") - .HasColumnType("uuid"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.HasKey("Id") - .HasName("PK_Character_Id"); - - b.HasIndex("AccountId"); - - b.ToTable("Character", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Characters.Sessions.CharacterSession", b => - { - b.Property("Id") - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("CharacterId") - .HasColumnType("uuid"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("Ended") - .HasColumnType("timestamp with time zone"); - - b.HasKey("Id") - .HasName("PK_CharacterSession_Id"); - - b.HasIndex("CharacterId"); - - b.ToTable("CharacterSession", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Companies.Company", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("Name"); - - b.HasKey("Id") - .HasName("PK_Company_Id"); - - b.ToTable("Company", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Companies.CompanyMembership", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("CharacterId") - .HasColumnType("uuid"); - - b.Property("CompanyId") - .HasColumnType("uuid"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("PositionId") - .HasColumnType("uuid"); - - b.HasKey("Id") - .HasName("PK_CompanyMembership_Id"); - - b.HasIndex("CharacterId"); - - b.HasIndex("CompanyId"); - - b.HasIndex("PositionId"); - - b.ToTable("CompanyMembership", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Companies.CompanyPosition", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("CompanyId") - .HasColumnType("uuid"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("Name"); - - b.Property("Ordering") - .HasColumnType("integer") - .HasColumnName("Ordering"); - - b.Property("Permissions") - .HasColumnType("integer"); - - b.HasKey("Id") - .HasName("PK_CompanyPosition_Id"); - - b.HasIndex("CompanyId"); - - b.ToTable("CompanyPosition", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Countries.Country", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("Id"); - - b.Property("Code") - .IsRequired() - .HasColumnType("text") - .HasColumnName("Code"); - - b.HasKey("Id") - .HasName("PK_Country_Id"); - - b.HasIndex("Code") - .IsUnique(); - - b.ToTable("Country", (string)null); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Banking.Bank", b => - { - b.HasOne("ELifeRPG.Domain.Countries.Country", "Country") - .WithMany("Banks") - .HasForeignKey("FK_Country_Id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_Bank_Country_Id"); - - b.Navigation("Country"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Banking.BankAccount", b => - { - b.HasOne("ELifeRPG.Domain.Banking.BankCondition", "BankCondition") - .WithMany("BankAccounts") - .HasForeignKey("FK_BankCondition_Id") - .HasConstraintName("FK_BankAccount_BankCondition_Id"); - - b.HasOne("ELifeRPG.Domain.Banking.Bank", "Bank") - .WithMany("Accounts") - .HasForeignKey("FK_Bank_Id") - .HasConstraintName("FK_BankAccount_Bank_Id"); - - b.HasOne("ELifeRPG.Domain.Characters.Character", "OwningCharacter") - .WithMany("BankAccounts") - .HasForeignKey("FK_Character_Id") - .HasConstraintName("FK_BankAccount_Character_Id"); - - b.HasOne("ELifeRPG.Domain.Companies.Company", "OwningCompany") - .WithMany("BankAccounts") - .HasForeignKey("FK_Company_Id") - .HasConstraintName("FK_BankAccount_Company_Id"); - - b.Navigation("Bank"); - - b.Navigation("BankCondition"); - - b.Navigation("OwningCharacter"); - - b.Navigation("OwningCompany"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Banking.BankAccountBooking", b => - { - b.HasOne("ELifeRPG.Domain.Banking.BankAccount", "BankAccount") - .WithMany("Bookings") - .HasForeignKey("FK_BankAccount_Id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_BankAccountBooking_BankAccount_Id"); - - b.HasOne("ELifeRPG.Domain.Banking.BankAccount", "Source") - .WithMany() - .HasForeignKey("SourceId"); - - b.Navigation("BankAccount"); - - b.Navigation("Source"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Banking.BankCondition", b => - { - b.HasOne("ELifeRPG.Domain.Banking.Bank", "Bank") - .WithMany("Conditions") - .HasForeignKey("FK_Bank_Id") - .HasConstraintName("FK_BankCondition_Bank_Id"); - - b.Navigation("Bank"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Characters.Character", b => - { - b.HasOne("ELifeRPG.Domain.Accounts.Account", "Account") - .WithMany("Characters") - .HasForeignKey("AccountId") - .HasConstraintName("FK_Account_Id"); - - b.OwnsOne("ELifeRPG.Domain.Characters.CharacterName", "Name", b1 => - { - b1.Property("CharacterId") - .HasColumnType("uuid"); - - b1.Property("FirstName") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("FirstName"); - - b1.Property("LastName") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)") - .HasColumnName("LastName"); - - b1.HasKey("CharacterId"); - - b1.ToTable("Character"); - - b1.WithOwner() - .HasForeignKey("CharacterId"); - }); - - b.Navigation("Account"); - - b.Navigation("Name"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Characters.Sessions.CharacterSession", b => - { - b.HasOne("ELifeRPG.Domain.Characters.Character", "Character") - .WithMany("Sessions") - .HasForeignKey("CharacterId") - .HasConstraintName("FK_Character_Id"); - - b.Navigation("Character"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Companies.CompanyMembership", b => - { - b.HasOne("ELifeRPG.Domain.Characters.Character", "Character") - .WithMany("CompanyMemberships") - .HasForeignKey("CharacterId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_Character_Id"); - - b.HasOne("ELifeRPG.Domain.Companies.Company", "Company") - .WithMany("Memberships") - .HasForeignKey("CompanyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_CompanyMembership_Id"); - - b.HasOne("ELifeRPG.Domain.Companies.CompanyPosition", "Position") - .WithMany() - .HasForeignKey("PositionId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Character"); - - b.Navigation("Company"); - - b.Navigation("Position"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Companies.CompanyPosition", b => - { - b.HasOne("ELifeRPG.Domain.Companies.Company", "Company") - .WithMany("Positions") - .HasForeignKey("CompanyId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_Position_Id"); - - b.Navigation("Company"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Accounts.Account", b => - { - b.Navigation("Characters"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Banking.Bank", b => - { - b.Navigation("Accounts"); - - b.Navigation("Conditions"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Banking.BankAccount", b => - { - b.Navigation("Bookings"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Banking.BankCondition", b => - { - b.Navigation("BankAccounts"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Characters.Character", b => - { - b.Navigation("BankAccounts"); - - b.Navigation("CompanyMemberships"); - - b.Navigation("Sessions"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Companies.Company", b => - { - b.Navigation("BankAccounts"); - - b.Navigation("Memberships"); - - b.Navigation("Positions"); - }); - - modelBuilder.Entity("ELifeRPG.Domain.Countries.Country", b => - { - b.Navigation("Banks"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/Infrastructure/Migrations/20220903221846_AddBanking.cs b/src/Infrastructure/Migrations/20220903221846_AddBanking.cs deleted file mode 100644 index 71f7774..0000000 --- a/src/Infrastructure/Migrations/20220903221846_AddBanking.cs +++ /dev/null @@ -1,219 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ELifeRPG.Infrastructure.Migrations -{ - public partial class AddBanking : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "Permissions", - table: "CompanyPosition", - type: "integer", - nullable: false, - defaultValue: 0); - - migrationBuilder.CreateTable( - name: "Country", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Code = table.Column(type: "text", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Country_Id", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Bank", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - FK_Country_Id = table.Column(type: "uuid", nullable: false), - Number = table.Column(type: "integer", nullable: false), - Created = table.Column(type: "timestamp with time zone", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Bank_Id", x => x.Id); - table.ForeignKey( - name: "FK_Bank_Country_Id", - column: x => x.FK_Country_Id, - principalTable: "Country", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "BankCondition", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - FK_Bank_Id = table.Column(type: "uuid", nullable: true), - TransactionFeeBase = table.Column(type: "numeric", nullable: false), - TransactionFeeMultiplier = table.Column(type: "numeric", nullable: false), - Created = table.Column(type: "timestamp with time zone", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_BankCondition_Id", x => x.Id); - table.ForeignKey( - name: "FK_BankCondition_Bank_Id", - column: x => x.FK_Bank_Id, - principalTable: "Bank", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "BankAccount", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Type = table.Column(type: "integer", nullable: false), - Number = table.Column(type: "text", nullable: false), - Balance = table.Column(type: "numeric", nullable: false), - FK_Bank_Id = table.Column(type: "uuid", nullable: true), - FK_BankCondition_Id = table.Column(type: "uuid", nullable: true), - FK_Character_Id = table.Column(type: "uuid", nullable: true), - FK_Company_Id = table.Column(type: "uuid", nullable: true), - Created = table.Column(type: "timestamp with time zone", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_BankAccount_Id", x => x.Id); - table.ForeignKey( - name: "FK_BankAccount_Bank_Id", - column: x => x.FK_Bank_Id, - principalTable: "Bank", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_BankAccount_BankCondition_Id", - column: x => x.FK_BankCondition_Id, - principalTable: "BankCondition", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_BankAccount_Character_Id", - column: x => x.FK_Character_Id, - principalTable: "Character", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_BankAccount_Company_Id", - column: x => x.FK_Company_Id, - principalTable: "Company", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "BankAccountBooking", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Type = table.Column(type: "integer", nullable: false), - FK_BankAccount_Id = table.Column(type: "uuid", nullable: false), - SourceId = table.Column(type: "uuid", nullable: true), - Purpose = table.Column(type: "text", nullable: true), - Amount = table.Column(type: "numeric", nullable: false), - Created = table.Column(type: "timestamp with time zone", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_BankAccountBooking_Id", x => x.Id); - table.ForeignKey( - name: "FK_BankAccountBooking_BankAccount_Id", - column: x => x.FK_BankAccount_Id, - principalTable: "BankAccount", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_BankAccountBooking_BankAccount_SourceId", - column: x => x.SourceId, - principalTable: "BankAccount", - principalColumn: "Id"); - }); - - migrationBuilder.CreateIndex( - name: "IX_Bank_FK_Country_Id", - table: "Bank", - column: "FK_Country_Id"); - - migrationBuilder.CreateIndex( - name: "IX_Bank_Number", - table: "Bank", - column: "Number", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_BankAccount_FK_Bank_Id", - table: "BankAccount", - column: "FK_Bank_Id"); - - migrationBuilder.CreateIndex( - name: "IX_BankAccount_FK_BankCondition_Id", - table: "BankAccount", - column: "FK_BankCondition_Id"); - - migrationBuilder.CreateIndex( - name: "IX_BankAccount_FK_Character_Id", - table: "BankAccount", - column: "FK_Character_Id"); - - migrationBuilder.CreateIndex( - name: "IX_BankAccount_FK_Company_Id", - table: "BankAccount", - column: "FK_Company_Id"); - - migrationBuilder.CreateIndex( - name: "IX_BankAccount_Number", - table: "BankAccount", - column: "Number", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_BankAccountBooking_FK_BankAccount_Id", - table: "BankAccountBooking", - column: "FK_BankAccount_Id"); - - migrationBuilder.CreateIndex( - name: "IX_BankAccountBooking_SourceId", - table: "BankAccountBooking", - column: "SourceId"); - - migrationBuilder.CreateIndex( - name: "IX_BankCondition_FK_Bank_Id", - table: "BankCondition", - column: "FK_Bank_Id"); - - migrationBuilder.CreateIndex( - name: "IX_Country_Code", - table: "Country", - column: "Code", - unique: true); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "BankAccountBooking"); - - migrationBuilder.DropTable( - name: "BankAccount"); - - migrationBuilder.DropTable( - name: "BankCondition"); - - migrationBuilder.DropTable( - name: "Bank"); - - migrationBuilder.DropTable( - name: "Country"); - - migrationBuilder.DropColumn( - name: "Permissions", - table: "CompanyPosition"); - } - } -} diff --git a/src/Infrastructure/Migrations/20231006093426_AccountBohemiaId.cs b/src/Infrastructure/Migrations/20231006093426_AccountBohemiaId.cs deleted file mode 100644 index 6555d1c..0000000 --- a/src/Infrastructure/Migrations/20231006093426_AccountBohemiaId.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ELifeRPG.Infrastructure.Migrations -{ - /// - public partial class AccountBohemiaId : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "BohemiaId", - table: "Account", - type: "uuid", - nullable: true); - - migrationBuilder.CreateIndex( - name: "IDX_Account_BohemiaId", - table: "Account", - column: "BohemiaId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropIndex( - name: "IDX_Account_BohemiaId", - table: "Account"); - - migrationBuilder.DropColumn( - name: "BohemiaId", - table: "Account"); - } - } -} diff --git a/src/Infrastructure/Migrations/20231006093426_AccountBohemiaId.Designer.cs b/src/Infrastructure/Migrations/20240522184447_Initial.Designer.cs similarity index 88% rename from src/Infrastructure/Migrations/20231006093426_AccountBohemiaId.Designer.cs rename to src/Infrastructure/Migrations/20240522184447_Initial.Designer.cs index 09e0bb8..8878db5 100644 --- a/src/Infrastructure/Migrations/20231006093426_AccountBohemiaId.Designer.cs +++ b/src/Infrastructure/Migrations/20240522184447_Initial.Designer.cs @@ -12,8 +12,8 @@ namespace ELifeRPG.Infrastructure.Migrations { [DbContext(typeof(DatabaseContext))] - [Migration("20231006093426_AccountBohemiaId")] - partial class AccountBohemiaId + [Migration("20240522184447_Initial")] + partial class Initial { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -104,17 +104,14 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.Property("FK_Bank_Id") .HasColumnType("uuid"); - b.Property("FK_Character_Id") - .HasColumnType("uuid"); - - b.Property("FK_Company_Id") - .HasColumnType("uuid"); - b.Property("Number") .IsRequired() .HasColumnType("text") .HasColumnName("Number"); + b.Property("OwnerId") + .HasColumnType("uuid"); + b.Property("Type") .HasColumnType("integer") .HasColumnName("Type"); @@ -126,13 +123,11 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.HasIndex("FK_Bank_Id"); - b.HasIndex("FK_Character_Id"); - - b.HasIndex("FK_Company_Id"); - b.HasIndex("Number") .IsUnique(); + b.HasIndex("OwnerId"); + b.ToTable("BankAccount", (string)null); }); @@ -210,6 +205,9 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.Property("AccountId") .HasColumnType("uuid"); + b.Property("Cash") + .HasColumnType("numeric"); + b.Property("Created") .HasColumnType("timestamp with time zone"); @@ -254,6 +252,9 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.Property("Created") .HasColumnType("timestamp with time zone"); + b.Property("FK_Person_Id") + .HasColumnType("uuid"); + b.Property("Name") .IsRequired() .HasColumnType("text") @@ -262,6 +263,9 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.HasKey("Id") .HasName("PK_Company_Id"); + b.HasIndex("FK_Person_Id") + .IsUnique(); + b.ToTable("Company", (string)null); }); @@ -350,6 +354,31 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.ToTable("Country", (string)null); }); + modelBuilder.Entity("ELifeRPG.Domain.Persons.Person", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("Id"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("FK_Person_Id") + .HasColumnType("uuid"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id") + .HasName("PK_Person_Id"); + + b.HasIndex("FK_Person_Id") + .IsUnique(); + + b.ToTable("Person", (string)null); + }); + modelBuilder.Entity("ELifeRPG.Domain.Banking.Bank", b => { b.HasOne("ELifeRPG.Domain.Countries.Country", "Country") @@ -374,23 +403,17 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) .HasForeignKey("FK_Bank_Id") .HasConstraintName("FK_BankAccount_Bank_Id"); - b.HasOne("ELifeRPG.Domain.Characters.Character", "OwningCharacter") - .WithMany("BankAccounts") - .HasForeignKey("FK_Character_Id") - .HasConstraintName("FK_BankAccount_Character_Id"); - - b.HasOne("ELifeRPG.Domain.Companies.Company", "OwningCompany") - .WithMany("BankAccounts") - .HasForeignKey("FK_Company_Id") - .HasConstraintName("FK_BankAccount_Company_Id"); + b.HasOne("ELifeRPG.Domain.Persons.Person", "Owner") + .WithMany() + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); b.Navigation("Bank"); b.Navigation("BankCondition"); - b.Navigation("OwningCharacter"); - - b.Navigation("OwningCompany"); + b.Navigation("Owner"); }); modelBuilder.Entity("ELifeRPG.Domain.Banking.BankAccountBooking", b => @@ -468,6 +491,16 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.Navigation("Character"); }); + modelBuilder.Entity("ELifeRPG.Domain.Companies.Company", b => + { + b.HasOne("ELifeRPG.Domain.Persons.Person", "Person") + .WithOne("Company") + .HasForeignKey("ELifeRPG.Domain.Companies.Company", "FK_Person_Id") + .HasConstraintName("FK_Company_Person_Id"); + + b.Navigation("Person"); + }); + modelBuilder.Entity("ELifeRPG.Domain.Companies.CompanyMembership", b => { b.HasOne("ELifeRPG.Domain.Characters.Character", "Character") @@ -509,6 +542,16 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.Navigation("Company"); }); + modelBuilder.Entity("ELifeRPG.Domain.Persons.Person", b => + { + b.HasOne("ELifeRPG.Domain.Characters.Character", "Character") + .WithOne("Person") + .HasForeignKey("ELifeRPG.Domain.Persons.Person", "FK_Person_Id") + .HasConstraintName("FK_Character_Person_Id"); + + b.Navigation("Character"); + }); + modelBuilder.Entity("ELifeRPG.Domain.Accounts.Account", b => { b.Navigation("Characters"); @@ -533,17 +576,15 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) modelBuilder.Entity("ELifeRPG.Domain.Characters.Character", b => { - b.Navigation("BankAccounts"); - b.Navigation("CompanyMemberships"); + b.Navigation("Person"); + b.Navigation("Sessions"); }); modelBuilder.Entity("ELifeRPG.Domain.Companies.Company", b => { - b.Navigation("BankAccounts"); - b.Navigation("Memberships"); b.Navigation("Positions"); @@ -553,6 +594,11 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) { b.Navigation("Banks"); }); + + modelBuilder.Entity("ELifeRPG.Domain.Persons.Person", b => + { + b.Navigation("Company"); + }); #pragma warning restore 612, 618 } } diff --git a/src/Infrastructure/Migrations/20240522184447_Initial.cs b/src/Infrastructure/Migrations/20240522184447_Initial.cs new file mode 100644 index 0000000..c7e993b --- /dev/null +++ b/src/Infrastructure/Migrations/20240522184447_Initial.cs @@ -0,0 +1,422 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ELifeRPG.Infrastructure.Migrations +{ + /// + public partial class Initial : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Account", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + SteamId = table.Column(type: "bigint", nullable: false), + BohemiaId = table.Column(type: "uuid", nullable: true), + Status = table.Column(type: "integer", nullable: false), + Created = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Account_Id", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Country", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Code = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Country_Id", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Character", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + AccountId = table.Column(type: "uuid", nullable: true), + FirstName = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), + LastName = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), + Cash = table.Column(type: "numeric", nullable: false), + Created = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Character_Id", x => x.Id); + table.ForeignKey( + name: "FK_Account_Id", + column: x => x.AccountId, + principalTable: "Account", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "Bank", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + FK_Country_Id = table.Column(type: "uuid", nullable: false), + Number = table.Column(type: "integer", nullable: false), + Created = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Bank_Id", x => x.Id); + table.ForeignKey( + name: "FK_Bank_Country_Id", + column: x => x.FK_Country_Id, + principalTable: "Country", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "CharacterSession", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + CharacterId = table.Column(type: "uuid", nullable: true), + Ended = table.Column(type: "timestamp with time zone", nullable: true), + Created = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CharacterSession_Id", x => x.Id); + table.ForeignKey( + name: "FK_Character_Id", + column: x => x.CharacterId, + principalTable: "Character", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "Person", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Type = table.Column(type: "integer", nullable: false), + FK_Person_Id = table.Column(type: "uuid", nullable: true), + Created = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Person_Id", x => x.Id); + table.ForeignKey( + name: "FK_Character_Person_Id", + column: x => x.FK_Person_Id, + principalTable: "Character", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "BankCondition", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + FK_Bank_Id = table.Column(type: "uuid", nullable: true), + TransactionFeeBase = table.Column(type: "numeric", nullable: false), + TransactionFeeMultiplier = table.Column(type: "numeric", nullable: false), + Created = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_BankCondition_Id", x => x.Id); + table.ForeignKey( + name: "FK_BankCondition_Bank_Id", + column: x => x.FK_Bank_Id, + principalTable: "Bank", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "Company", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + FK_Person_Id = table.Column(type: "uuid", nullable: true), + Name = table.Column(type: "text", nullable: false), + Created = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Company_Id", x => x.Id); + table.ForeignKey( + name: "FK_Company_Person_Id", + column: x => x.FK_Person_Id, + principalTable: "Person", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "BankAccount", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Type = table.Column(type: "integer", nullable: false), + Number = table.Column(type: "text", nullable: false), + Balance = table.Column(type: "numeric", nullable: false), + FK_Bank_Id = table.Column(type: "uuid", nullable: true), + FK_BankCondition_Id = table.Column(type: "uuid", nullable: true), + OwnerId = table.Column(type: "uuid", nullable: false), + Created = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_BankAccount_Id", x => x.Id); + table.ForeignKey( + name: "FK_BankAccount_BankCondition_Id", + column: x => x.FK_BankCondition_Id, + principalTable: "BankCondition", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_BankAccount_Bank_Id", + column: x => x.FK_Bank_Id, + principalTable: "Bank", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_BankAccount_Person_OwnerId", + column: x => x.OwnerId, + principalTable: "Person", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "CompanyPosition", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + CompanyId = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "text", nullable: false), + Ordering = table.Column(type: "integer", nullable: false), + Permissions = table.Column(type: "integer", nullable: false), + Created = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CompanyPosition_Id", x => x.Id); + table.ForeignKey( + name: "FK_Position_Id", + column: x => x.CompanyId, + principalTable: "Company", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "BankAccountBooking", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Type = table.Column(type: "integer", nullable: false), + FK_BankAccount_Id = table.Column(type: "uuid", nullable: false), + SourceId = table.Column(type: "uuid", nullable: true), + Purpose = table.Column(type: "text", nullable: true), + Amount = table.Column(type: "numeric", nullable: false), + Created = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_BankAccountBooking_Id", x => x.Id); + table.ForeignKey( + name: "FK_BankAccountBooking_BankAccount_Id", + column: x => x.FK_BankAccount_Id, + principalTable: "BankAccount", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_BankAccountBooking_BankAccount_SourceId", + column: x => x.SourceId, + principalTable: "BankAccount", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "CompanyMembership", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + CompanyId = table.Column(type: "uuid", nullable: false), + CharacterId = table.Column(type: "uuid", nullable: false), + PositionId = table.Column(type: "uuid", nullable: false), + Created = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CompanyMembership_Id", x => x.Id); + table.ForeignKey( + name: "FK_Character_Id", + column: x => x.CharacterId, + principalTable: "Character", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_CompanyMembership_CompanyPosition_PositionId", + column: x => x.PositionId, + principalTable: "CompanyPosition", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_CompanyMembership_Id", + column: x => x.CompanyId, + principalTable: "Company", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IDX_Account_BohemiaId", + table: "Account", + column: "BohemiaId"); + + migrationBuilder.CreateIndex( + name: "IDX_Account_SteamId", + table: "Account", + column: "SteamId"); + + migrationBuilder.CreateIndex( + name: "IX_Bank_FK_Country_Id", + table: "Bank", + column: "FK_Country_Id"); + + migrationBuilder.CreateIndex( + name: "IX_Bank_Number", + table: "Bank", + column: "Number", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_BankAccount_FK_Bank_Id", + table: "BankAccount", + column: "FK_Bank_Id"); + + migrationBuilder.CreateIndex( + name: "IX_BankAccount_FK_BankCondition_Id", + table: "BankAccount", + column: "FK_BankCondition_Id"); + + migrationBuilder.CreateIndex( + name: "IX_BankAccount_Number", + table: "BankAccount", + column: "Number", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_BankAccount_OwnerId", + table: "BankAccount", + column: "OwnerId"); + + migrationBuilder.CreateIndex( + name: "IX_BankAccountBooking_FK_BankAccount_Id", + table: "BankAccountBooking", + column: "FK_BankAccount_Id"); + + migrationBuilder.CreateIndex( + name: "IX_BankAccountBooking_SourceId", + table: "BankAccountBooking", + column: "SourceId"); + + migrationBuilder.CreateIndex( + name: "IX_BankCondition_FK_Bank_Id", + table: "BankCondition", + column: "FK_Bank_Id"); + + migrationBuilder.CreateIndex( + name: "IX_Character_AccountId", + table: "Character", + column: "AccountId"); + + migrationBuilder.CreateIndex( + name: "IX_CharacterSession_CharacterId", + table: "CharacterSession", + column: "CharacterId"); + + migrationBuilder.CreateIndex( + name: "IX_Company_FK_Person_Id", + table: "Company", + column: "FK_Person_Id", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_CompanyMembership_CharacterId", + table: "CompanyMembership", + column: "CharacterId"); + + migrationBuilder.CreateIndex( + name: "IX_CompanyMembership_CompanyId", + table: "CompanyMembership", + column: "CompanyId"); + + migrationBuilder.CreateIndex( + name: "IX_CompanyMembership_PositionId", + table: "CompanyMembership", + column: "PositionId"); + + migrationBuilder.CreateIndex( + name: "IX_CompanyPosition_CompanyId", + table: "CompanyPosition", + column: "CompanyId"); + + migrationBuilder.CreateIndex( + name: "IX_Country_Code", + table: "Country", + column: "Code", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Person_FK_Person_Id", + table: "Person", + column: "FK_Person_Id", + unique: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "BankAccountBooking"); + + migrationBuilder.DropTable( + name: "CharacterSession"); + + migrationBuilder.DropTable( + name: "CompanyMembership"); + + migrationBuilder.DropTable( + name: "BankAccount"); + + migrationBuilder.DropTable( + name: "CompanyPosition"); + + migrationBuilder.DropTable( + name: "BankCondition"); + + migrationBuilder.DropTable( + name: "Company"); + + migrationBuilder.DropTable( + name: "Bank"); + + migrationBuilder.DropTable( + name: "Person"); + + migrationBuilder.DropTable( + name: "Country"); + + migrationBuilder.DropTable( + name: "Character"); + + migrationBuilder.DropTable( + name: "Account"); + } + } +} diff --git a/src/Infrastructure/Migrations/DatabaseContextModelSnapshot.cs b/src/Infrastructure/Migrations/DatabaseContextModelSnapshot.cs index 3b7736b..c0683a6 100644 --- a/src/Infrastructure/Migrations/DatabaseContextModelSnapshot.cs +++ b/src/Infrastructure/Migrations/DatabaseContextModelSnapshot.cs @@ -101,17 +101,14 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("FK_Bank_Id") .HasColumnType("uuid"); - b.Property("FK_Character_Id") - .HasColumnType("uuid"); - - b.Property("FK_Company_Id") - .HasColumnType("uuid"); - b.Property("Number") .IsRequired() .HasColumnType("text") .HasColumnName("Number"); + b.Property("OwnerId") + .HasColumnType("uuid"); + b.Property("Type") .HasColumnType("integer") .HasColumnName("Type"); @@ -123,13 +120,11 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("FK_Bank_Id"); - b.HasIndex("FK_Character_Id"); - - b.HasIndex("FK_Company_Id"); - b.HasIndex("Number") .IsUnique(); + b.HasIndex("OwnerId"); + b.ToTable("BankAccount", (string)null); }); @@ -207,6 +202,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("AccountId") .HasColumnType("uuid"); + b.Property("Cash") + .HasColumnType("numeric"); + b.Property("Created") .HasColumnType("timestamp with time zone"); @@ -257,6 +255,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Created") .HasColumnType("timestamp with time zone"); + b.Property("FK_Person_Id") + .HasColumnType("uuid"); + b.Property("Name") .IsRequired() .HasColumnType("text") @@ -265,6 +266,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("Id") .HasName("PK_Company_Id"); + b.HasIndex("FK_Person_Id") + .IsUnique(); + b.ToTable("Company", (string)null); }); @@ -353,6 +357,31 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("Country", (string)null); }); + modelBuilder.Entity("ELifeRPG.Domain.Persons.Person", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("Id"); + + b.Property("Created") + .HasColumnType("timestamp with time zone"); + + b.Property("FK_Person_Id") + .HasColumnType("uuid"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("Id") + .HasName("PK_Person_Id"); + + b.HasIndex("FK_Person_Id") + .IsUnique(); + + b.ToTable("Person", (string)null); + }); + modelBuilder.Entity("ELifeRPG.Domain.Banking.Bank", b => { b.HasOne("ELifeRPG.Domain.Countries.Country", "Country") @@ -377,23 +406,17 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasForeignKey("FK_Bank_Id") .HasConstraintName("FK_BankAccount_Bank_Id"); - b.HasOne("ELifeRPG.Domain.Characters.Character", "OwningCharacter") - .WithMany("BankAccounts") - .HasForeignKey("FK_Character_Id") - .HasConstraintName("FK_BankAccount_Character_Id"); - - b.HasOne("ELifeRPG.Domain.Companies.Company", "OwningCompany") - .WithMany("BankAccounts") - .HasForeignKey("FK_Company_Id") - .HasConstraintName("FK_BankAccount_Company_Id"); + b.HasOne("ELifeRPG.Domain.Persons.Person", "Owner") + .WithMany() + .HasForeignKey("OwnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); b.Navigation("Bank"); b.Navigation("BankCondition"); - b.Navigation("OwningCharacter"); - - b.Navigation("OwningCompany"); + b.Navigation("Owner"); }); modelBuilder.Entity("ELifeRPG.Domain.Banking.BankAccountBooking", b => @@ -471,6 +494,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Character"); }); + modelBuilder.Entity("ELifeRPG.Domain.Companies.Company", b => + { + b.HasOne("ELifeRPG.Domain.Persons.Person", "Person") + .WithOne("Company") + .HasForeignKey("ELifeRPG.Domain.Companies.Company", "FK_Person_Id") + .HasConstraintName("FK_Company_Person_Id"); + + b.Navigation("Person"); + }); + modelBuilder.Entity("ELifeRPG.Domain.Companies.CompanyMembership", b => { b.HasOne("ELifeRPG.Domain.Characters.Character", "Character") @@ -512,6 +545,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Company"); }); + modelBuilder.Entity("ELifeRPG.Domain.Persons.Person", b => + { + b.HasOne("ELifeRPG.Domain.Characters.Character", "Character") + .WithOne("Person") + .HasForeignKey("ELifeRPG.Domain.Persons.Person", "FK_Person_Id") + .HasConstraintName("FK_Character_Person_Id"); + + b.Navigation("Character"); + }); + modelBuilder.Entity("ELifeRPG.Domain.Accounts.Account", b => { b.Navigation("Characters"); @@ -536,17 +579,15 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("ELifeRPG.Domain.Characters.Character", b => { - b.Navigation("BankAccounts"); - b.Navigation("CompanyMemberships"); + b.Navigation("Person"); + b.Navigation("Sessions"); }); modelBuilder.Entity("ELifeRPG.Domain.Companies.Company", b => { - b.Navigation("BankAccounts"); - b.Navigation("Memberships"); b.Navigation("Positions"); @@ -556,6 +597,11 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.Navigation("Banks"); }); + + modelBuilder.Entity("ELifeRPG.Domain.Persons.Person", b => + { + b.Navigation("Company"); + }); #pragma warning restore 612, 618 } } diff --git a/src/Infrastructure/Persons/PersonTypeConfiguration.cs b/src/Infrastructure/Persons/PersonTypeConfiguration.cs new file mode 100644 index 0000000..0728b21 --- /dev/null +++ b/src/Infrastructure/Persons/PersonTypeConfiguration.cs @@ -0,0 +1,31 @@ +using ELifeRPG.Domain.Companies; +using ELifeRPG.Domain.Persons; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace ELifeRPG.Infrastructure.Persons; + +#pragma warning disable CS8602 + +public class PersonTypeConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.ToTable("Person"); + + builder.HasKey(x => x.Id).HasName("PK_Person_Id"); + builder.Property(x => x.Id).HasColumnName("Id"); + + builder + .HasOne(x => x.Character) + .WithOne(x => x.Person) + .HasForeignKey("FK_Person_Id") + .HasConstraintName("FK_Character_Person_Id"); + + builder + .HasOne(x => x.Company) + .WithOne(x => x.Person) + .HasForeignKey("FK_Person_Id") + .HasConstraintName("FK_Company_Person_Id"); + } +} diff --git a/src/Infrastructure/ServiceCollectionExtensions.cs b/src/Infrastructure/ServiceCollectionExtensions.cs index 7a01df8..1375811 100644 --- a/src/Infrastructure/ServiceCollectionExtensions.cs +++ b/src/Infrastructure/ServiceCollectionExtensions.cs @@ -4,6 +4,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; +using OpenTelemetry; using OpenTelemetry.Metrics; using OpenTelemetry.Resources; using OpenTelemetry.Trace; @@ -23,26 +24,26 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi pgsql.MigrationsAssembly(typeof(DatabaseContext).Assembly.GetName().Name); })); - services.ConfigureOpenTelemetryMeterProvider(builder => - { - builder - .AddMeter(Metrics.SourceName) - .AddPrometheusExporter(); - }); + services.AddOpenTelemetry() + .WithMetrics(metrics => + { + metrics + .AddMeter(Metrics.SourceName) + .AddPrometheusExporter(); + }) + .WithTracing(tracing => + { + tracing.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(hostEnvironment.ApplicationName)); + tracing.AddSource(Activities.SourceName); + tracing.AddEntityFrameworkCoreInstrumentation(); + tracing.AddOtlpExporter(options => options.Endpoint = new Uri(configuration.GetConnectionString("OpenTelemetryTracingEndpoint")!)); - services.ConfigureOpenTelemetryTracerProvider(builder => - { - builder.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(hostEnvironment.ApplicationName)); - builder.AddSource(Activities.SourceName); - builder.AddEntityFrameworkCoreInstrumentation(); - builder.AddOtlpExporter(options => options.Endpoint = new Uri(configuration.GetConnectionString("OpenTelemetryTracingEndpoint")!)); - - tracingBuilder?.Invoke(builder); - }); + tracingBuilder?.Invoke(tracing); + }); return services; } - + public static WebApplication MapInternalEndpoints(this WebApplication app) { app.UseOpenTelemetryPrometheusScrapingEndpoint(); diff --git a/src/Migrator/Migrator.csproj b/src/Migrator/Migrator.csproj index 24f0f79..b2a610a 100644 --- a/src/Migrator/Migrator.csproj +++ b/src/Migrator/Migrator.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net8.0 enable enable ELifeRPG.Migrator @@ -11,11 +11,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/src/Migrator/appsettings.json b/src/Migrator/appsettings.json index 9918811..0c208ae 100644 --- a/src/Migrator/appsettings.json +++ b/src/Migrator/appsettings.json @@ -4,8 +4,5 @@ "Default": "Information", "Microsoft.AspNetCore": "Warning" } - }, - "ConnectionStrings": { - "Database": "" } } diff --git a/src/WebUI/Properties/launchSettings.json b/src/WebUI/Properties/launchSettings.json index f6f3ce3..693fce4 100644 --- a/src/WebUI/Properties/launchSettings.json +++ b/src/WebUI/Properties/launchSettings.json @@ -7,7 +7,7 @@ "launchBrowser": true, "applicationUrl": "https://localhost:7039;http://localhost:5039", "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" + "DOTNET_ENVIRONMENT": "Development" } } } diff --git a/src/WebUI/WebUI.csproj b/src/WebUI/WebUI.csproj index 570c569..b42bd70 100644 --- a/src/WebUI/WebUI.csproj +++ b/src/WebUI/WebUI.csproj @@ -1,7 +1,7 @@  - net7.0 + net8.0 enable enable ELifeRPG.Core.WebUI @@ -10,8 +10,8 @@ - - + + diff --git a/src/WebUI/appsettings.Development.json b/src/WebUI/appsettings.Development.json index 387d964..d2fcef5 100644 --- a/src/WebUI/appsettings.Development.json +++ b/src/WebUI/appsettings.Development.json @@ -7,7 +7,8 @@ } }, "ConnectionStrings": { - "Database": "Host=localhost;Database=eliferpg;Username=postgres;Password=supersecret" + "Database": "Host=localhost;Database=eliferpg;Username=postgres;Password=supersecret", + "OpenTelemetryTracingEndpoint": "http://localhost:4317" }, "ELifeRPG": { "SteamApiKey": "" diff --git a/tests/Api.UnitTests/Api.UnitTests.csproj b/tests/Api.UnitTests/Api.UnitTests.csproj index 8dac330..45af2e2 100644 --- a/tests/Api.UnitTests/Api.UnitTests.csproj +++ b/tests/Api.UnitTests/Api.UnitTests.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable false ELifeRPG.Core.Api.UnitTests @@ -9,13 +9,13 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/tests/Application.UnitTests/Application.UnitTests.csproj b/tests/Application.UnitTests/Application.UnitTests.csproj index 67e7982..b0e6567 100644 --- a/tests/Application.UnitTests/Application.UnitTests.csproj +++ b/tests/Application.UnitTests/Application.UnitTests.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable false ELifeRPG.Core.Application.UnitTests @@ -9,13 +9,13 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/tests/Domain.UnitTests/Banking/BankAccountBookingTests.cs b/tests/Domain.UnitTests/Banking/BankAccountBookingTests.cs index b21f107..edfef4b 100644 --- a/tests/Domain.UnitTests/Banking/BankAccountBookingTests.cs +++ b/tests/Domain.UnitTests/Banking/BankAccountBookingTests.cs @@ -1,5 +1,6 @@ using ELifeRPG.Domain.Banking; using ELifeRPG.Domain.Characters; +using ELifeRPG.Domain.Persons; using Xunit; namespace ELifeRPG.Core.Domain.UnitTests.Banking; @@ -13,7 +14,7 @@ public void Amount_SubtractsFeesFromAmount_WhenOfTransactionTypeDeposit() var bankAccount = new BankAccount { Type = BankAccountType.Personal, - OwningCharacter = character, + Owner = new Person(character), BankCondition = new BankCondition { TransactionFeeBase = 0.20m, @@ -34,7 +35,7 @@ public void Amount_AddsFeesToAmount_WhenOfTransactionTypeWithdrawal() var bankAccount = new BankAccount { Type = BankAccountType.Personal, - OwningCharacter = character, + Owner = new Person(character), BankCondition = new BankCondition { TransactionFeeBase = 0.20m, @@ -55,7 +56,7 @@ public void Amount_AddsFeesToAmount_WhenOfTransactionTypeTransferAndTypeOutgoing var bankAccount = new BankAccount { Type = BankAccountType.Personal, - OwningCharacter = character, + Owner = new Person(character), BankCondition = new BankCondition { TransactionFeeBase = 0.20m, @@ -66,7 +67,7 @@ public void Amount_AddsFeesToAmount_WhenOfTransactionTypeTransferAndTypeOutgoing var targetBankAccount = new BankAccount { Type = BankAccountType.Personal, - OwningCharacter = character, + Owner = new Person(character), BankCondition = new BankCondition { TransactionFeeBase = 1m, @@ -87,7 +88,7 @@ public void Amount_ReturnsTransactionAmount_WhenOfTransactionTypeTransferAndType var sourceBankAccount = new BankAccount { Type = BankAccountType.Personal, - OwningCharacter = character, + Owner = new Person(character), BankCondition = new BankCondition { TransactionFeeBase = 0.20m, @@ -98,7 +99,7 @@ public void Amount_ReturnsTransactionAmount_WhenOfTransactionTypeTransferAndType var bankAccount = new BankAccount { Type = BankAccountType.Personal, - OwningCharacter = character, + Owner = new Person(character), BankCondition = new BankCondition { TransactionFeeBase = 1m, diff --git a/tests/Domain.UnitTests/Banking/BankAccountTests.cs b/tests/Domain.UnitTests/Banking/BankAccountTests.cs deleted file mode 100644 index 5923cb6..0000000 --- a/tests/Domain.UnitTests/Banking/BankAccountTests.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System; -using System.Collections.Generic; -using ELifeRPG.Domain.Banking; -using ELifeRPG.Domain.Characters; -using ELifeRPG.Domain.Common.Exceptions; -using ELifeRPG.Domain.Companies; -using ELifeRPG.Domain.Countries; -using Xunit; - -namespace ELifeRPG.Core.Domain.UnitTests.Banking; - -public class BankAccountTests -{ - [Fact] - public void Can_ChecksCapabilities_WhenAccountIsOfOwningCharacter() - { - var character = new Character { Id = Guid.Parse("BC9B0D5B-F1CB-443D-98DA-CB5451AA09C0") }; - - var bankAccount = new BankAccount - { - Type = BankAccountType.Personal, - OwningCharacter = character, - }; - - var canManageFinances = bankAccount.Can(character, BankAccountCapabilities.CommitTransactions); - - Assert.True(canManageFinances); - } - - [Fact] - public void Can_ChecksCapabilities_WhenAccountIsOfOwningCompany() - { - var character = new Character { Id = Guid.Parse("BC9B0D5B-F1CB-443D-98DA-CB5451AA09C0") }; - - var bankAccount = new BankAccount - { - OwningCompany = new Company("Feuerstein GmbH") - { - Memberships = new List - { - new() - { - Character = character, - Position = new CompanyPosition - { - Permissions = CompanyPermissions.ManageFinances, - }, - }, - }, - }, - }; - - var canManageFinances = bankAccount.Can(character, BankAccountCapabilities.CommitTransactions); - - Assert.True(canManageFinances); - } - - [Fact] - public void TransferMoneyTo_ThrowsELifeInvalidOperationException_WhenCheckingExecutingPersonOfPersonalBankAccount() - { - var bank = new Bank(new Country("DE")); - - var owningCharacter = new Character(); - var bankAccount = new BankAccount(bank, owningCharacter){ Bookings = new List() }; - - var executingCharacter = new Character(); - var bankAccountOfExecutingCharacter = new BankAccount(bank, executingCharacter){ Bookings = new List() }; - - Assert.Throws(() => bankAccount.TransferMoneyTo(bankAccountOfExecutingCharacter, executingCharacter, 1000m)); - } - - [Fact] - public void TransferMoneyTo_AddsBooking_WhenExecutingPersonOfPersonalBankAccountIsAuthorized() - { - var bank = new Bank(new Country("DE")); - - var owningCharacter = new Character(); - var bankAccount = new BankAccount(bank, owningCharacter){ Balance = 5000m, Bookings = new List() }; - - var bankAccountOfExecutingCharacter = new BankAccount(bank, new Character()){ Bookings = new List() }; - - bankAccount.TransferMoneyTo(bankAccountOfExecutingCharacter, owningCharacter, 1000m); - - Assert.Equal(1, bankAccount.Bookings.Count); - } - - [Fact] - public void TransferMoneyTo_ThrowsELifeInvalidOperationException_WhenCheckingExecutingPersonOfCompanyBankAccount() - { - var bank = new Bank(new Country("DE")); - var owningCompany = new Company("Feuerstein GmbH"); - var bankAccount = new BankAccount(bank, owningCompany){ Bookings = new List() }; - - var bankAccountOfExecutingCharacter = new BankAccount(bank, new Company("The Empire")){ Bookings = new List() }; - - Assert.Throws(() => bankAccount.TransferMoneyTo(bankAccountOfExecutingCharacter, new Character(), 1000m)); - } - - [Fact] - public void WithdrawMoney_AddsBooking() - { - var bank = new Bank(new Country("EL")); - var owningCharacter = new Character(); - var bankAccount = new BankAccount(bank, owningCharacter){ Balance = 1000m, Bookings = new List() }; - - bankAccount.WithdrawMoney(owningCharacter, 200); - - Assert.Contains(bankAccount.Bookings, x => x.Type == BankAccountBookingType.Outgoing); - } - - [Fact] - public void TransferMoneyTo_AddsBookingsToBothAccounts() - { - var bank = new Bank(new Country("EL")); - var character = new Character(); - var bankAccount = new BankAccount(bank, character){ Balance = 1000m, Bookings = new List() }; - var targetBankAccount = new BankAccount(bank, new Character()){ Bookings = new List() }; - - bankAccount.TransferMoneyTo(targetBankAccount, character, 200); - - Assert.Contains(bankAccount.Bookings, x => x.Type == BankAccountBookingType.Outgoing); - Assert.Contains(targetBankAccount.Bookings, x => x.Type == BankAccountBookingType.Incoming); - } -} diff --git a/tests/Domain.UnitTests/Characters/CharacterTests.cs b/tests/Domain.UnitTests/Characters/CharacterTests.cs index 63da194..86c25d0 100644 --- a/tests/Domain.UnitTests/Characters/CharacterTests.cs +++ b/tests/Domain.UnitTests/Characters/CharacterTests.cs @@ -1,5 +1,6 @@ using System.Linq; using ELifeRPG.Domain.Characters; +using ELifeRPG.Domain.Characters.Events; using Xunit; namespace ELifeRPG.Core.Domain.UnitTests.Characters; diff --git a/tests/Domain.UnitTests/Domain.UnitTests.csproj b/tests/Domain.UnitTests/Domain.UnitTests.csproj index 1dd6c5a..e78b6b9 100644 --- a/tests/Domain.UnitTests/Domain.UnitTests.csproj +++ b/tests/Domain.UnitTests/Domain.UnitTests.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable false ELifeRPG.Core.Domain.UnitTests @@ -9,13 +9,13 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/tests/Infrastructure.UnitTests/Infrastructure.UnitTests.csproj b/tests/Infrastructure.UnitTests/Infrastructure.UnitTests.csproj index 70cb800..08ab4b0 100644 --- a/tests/Infrastructure.UnitTests/Infrastructure.UnitTests.csproj +++ b/tests/Infrastructure.UnitTests/Infrastructure.UnitTests.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable false ELifeRPG.Core.Infrastructure.UnitTests @@ -9,13 +9,13 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/tests/WebUI.UniTests/WebUI.UniTests.csproj b/tests/WebUI.UniTests/WebUI.UniTests.csproj index 54b3101..a5ad2f9 100644 --- a/tests/WebUI.UniTests/WebUI.UniTests.csproj +++ b/tests/WebUI.UniTests/WebUI.UniTests.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable false ELifeRPG.Core.WebUI.UnitTests @@ -9,13 +9,13 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all