From 0725e4f7cf4c6f723264b6d461b91c660d144cb7 Mon Sep 17 00:00:00 2001 From: ivarlovlie Date: Sun, 30 Oct 2022 22:40:03 +0700 Subject: feat: Apiwork --- code/api/src/Data/AppDbContext.cs | 51 ------------- code/api/src/Data/Database/Api/ApiAccessToken.cs | 31 ++++++++ code/api/src/Data/Database/ApiAccessToken.cs | 31 -------- code/api/src/Data/Database/Base.cs | 11 ++- code/api/src/Data/Database/BaseWithOwner.cs | 31 ++++++-- code/api/src/Data/Database/Customer.cs | 6 -- code/api/src/Data/Database/Customer/Customer.cs | 29 ++++++++ .../src/Data/Database/Customer/CustomerContact.cs | 12 +++ .../src/Data/Database/Customer/CustomerEvent.cs | 8 ++ .../src/Data/Database/Customer/CustomerGroup.cs | 7 ++ .../Database/Customer/CustomerGroupMembership.cs | 7 ++ code/api/src/Data/Database/CustomerContact.cs | 12 --- code/api/src/Data/Database/CustomerEvent.cs | 7 -- .../api/src/Data/Database/ForgotPasswordRequest.cs | 23 ------ .../Database/Internal/ForgotPasswordRequest.cs | 23 ++++++ code/api/src/Data/Database/Internal/Tenant.cs | 11 +++ code/api/src/Data/Database/Internal/User.cs | 37 ++++++++++ code/api/src/Data/Database/MainAppDatabase.cs | 85 ++++++++++++++++++++++ code/api/src/Data/Database/Project.cs | 12 --- code/api/src/Data/Database/Project/Project.cs | 15 ++++ code/api/src/Data/Database/Project/ProjectLabel.cs | 8 ++ .../api/src/Data/Database/Project/ProjectMember.cs | 8 ++ code/api/src/Data/Database/ProjectLabel.cs | 8 -- code/api/src/Data/Database/Tenant.cs | 11 --- code/api/src/Data/Database/Time/TimeCategory.cs | 32 ++++++++ code/api/src/Data/Database/Time/TimeEntry.cs | 46 ++++++++++++ code/api/src/Data/Database/Time/TimeLabel.cs | 32 ++++++++ code/api/src/Data/Database/TimeCategory.cs | 31 -------- code/api/src/Data/Database/TimeEntry.cs | 45 ------------ code/api/src/Data/Database/TimeLabel.cs | 31 -------- code/api/src/Data/Database/Todo.cs | 13 ---- code/api/src/Data/Database/Todo/Todo.cs | 13 ++++ code/api/src/Data/Database/Todo/TodoComment.cs | 7 ++ code/api/src/Data/Database/Todo/TodoLabel.cs | 8 ++ code/api/src/Data/Database/Todo/TodoProject.cs | 8 ++ .../Data/Database/Todo/TodoProjectAccessControl.cs | 11 +++ code/api/src/Data/Database/Todo/TodoStatus.cs | 37 ++++++++++ code/api/src/Data/Database/TodoComment.cs | 7 -- code/api/src/Data/Database/TodoLabel.cs | 8 -- code/api/src/Data/Database/TodoProject.cs | 8 -- .../src/Data/Database/TodoProjectAccessControl.cs | 11 --- code/api/src/Data/Database/TodoStatus.cs | 45 ------------ code/api/src/Data/Database/User.cs | 37 ---------- code/api/src/Data/Enums/ProjectRole.cs | 9 +++ code/api/src/Data/Enums/StringsLang.cs | 7 -- code/api/src/Data/Models/AppConfiguration.cs | 58 +++++++++++++++ code/api/src/Data/Models/LoggedInUserModel.cs | 7 +- code/api/src/Data/Static/AppConfiguration.cs | 58 --------------- 48 files changed, 578 insertions(+), 475 deletions(-) delete mode 100644 code/api/src/Data/AppDbContext.cs create mode 100644 code/api/src/Data/Database/Api/ApiAccessToken.cs delete mode 100644 code/api/src/Data/Database/ApiAccessToken.cs delete mode 100644 code/api/src/Data/Database/Customer.cs create mode 100644 code/api/src/Data/Database/Customer/Customer.cs create mode 100644 code/api/src/Data/Database/Customer/CustomerContact.cs create mode 100644 code/api/src/Data/Database/Customer/CustomerEvent.cs create mode 100644 code/api/src/Data/Database/Customer/CustomerGroup.cs create mode 100644 code/api/src/Data/Database/Customer/CustomerGroupMembership.cs delete mode 100644 code/api/src/Data/Database/CustomerContact.cs delete mode 100644 code/api/src/Data/Database/CustomerEvent.cs delete mode 100644 code/api/src/Data/Database/ForgotPasswordRequest.cs create mode 100644 code/api/src/Data/Database/Internal/ForgotPasswordRequest.cs create mode 100644 code/api/src/Data/Database/Internal/Tenant.cs create mode 100644 code/api/src/Data/Database/Internal/User.cs create mode 100644 code/api/src/Data/Database/MainAppDatabase.cs delete mode 100644 code/api/src/Data/Database/Project.cs create mode 100644 code/api/src/Data/Database/Project/Project.cs create mode 100644 code/api/src/Data/Database/Project/ProjectLabel.cs create mode 100644 code/api/src/Data/Database/Project/ProjectMember.cs delete mode 100644 code/api/src/Data/Database/ProjectLabel.cs delete mode 100644 code/api/src/Data/Database/Tenant.cs create mode 100644 code/api/src/Data/Database/Time/TimeCategory.cs create mode 100644 code/api/src/Data/Database/Time/TimeEntry.cs create mode 100644 code/api/src/Data/Database/Time/TimeLabel.cs delete mode 100644 code/api/src/Data/Database/TimeCategory.cs delete mode 100644 code/api/src/Data/Database/TimeEntry.cs delete mode 100644 code/api/src/Data/Database/TimeLabel.cs delete mode 100644 code/api/src/Data/Database/Todo.cs create mode 100644 code/api/src/Data/Database/Todo/Todo.cs create mode 100644 code/api/src/Data/Database/Todo/TodoComment.cs create mode 100644 code/api/src/Data/Database/Todo/TodoLabel.cs create mode 100644 code/api/src/Data/Database/Todo/TodoProject.cs create mode 100644 code/api/src/Data/Database/Todo/TodoProjectAccessControl.cs create mode 100644 code/api/src/Data/Database/Todo/TodoStatus.cs delete mode 100644 code/api/src/Data/Database/TodoComment.cs delete mode 100644 code/api/src/Data/Database/TodoLabel.cs delete mode 100644 code/api/src/Data/Database/TodoProject.cs delete mode 100644 code/api/src/Data/Database/TodoProjectAccessControl.cs delete mode 100644 code/api/src/Data/Database/TodoStatus.cs delete mode 100644 code/api/src/Data/Database/User.cs create mode 100644 code/api/src/Data/Enums/ProjectRole.cs delete mode 100644 code/api/src/Data/Enums/StringsLang.cs create mode 100644 code/api/src/Data/Models/AppConfiguration.cs delete mode 100644 code/api/src/Data/Static/AppConfiguration.cs (limited to 'code/api/src/Data') diff --git a/code/api/src/Data/AppDbContext.cs b/code/api/src/Data/AppDbContext.cs deleted file mode 100644 index c970429..0000000 --- a/code/api/src/Data/AppDbContext.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Microsoft.AspNetCore.DataProtection.EntityFrameworkCore; - -namespace IOL.GreatOffice.Api.Data; - -public class AppDbContext : DbContext, IDataProtectionKeyContext -{ - public AppDbContext(DbContextOptions options) : base(options) { } - public DbSet Users { get; set; } - public DbSet ForgotPasswordRequests { get; set; } - public DbSet TimeLabels { get; set; } - public DbSet TimeEntries { get; set; } - public DbSet TimeCategories { get; set; } - public DbSet AccessTokens { get; set; } - public DbSet Tenants { get; set; } - public DbSet DataProtectionKeys { get; set; } - - protected override void OnModelCreating(ModelBuilder modelBuilder) { - modelBuilder.Entity(e => { - e.ToTable("users"); - }); - - modelBuilder.Entity(e => { - e.HasOne(c => c.User); - e.ToTable("forgot_password_requests"); - }); - - modelBuilder.Entity(e => { - e.ToTable("time_categories"); - }); - - modelBuilder.Entity(e => { - e.ToTable("time_labels"); - }); - - modelBuilder.Entity(e => { - e.HasOne(c => c.Category); - e.HasMany(c => c.Labels); - e.ToTable("time_entries"); - }); - - modelBuilder.Entity(e => { - e.ToTable("api_access_tokens"); - }); - - modelBuilder.Entity(e => { - e.ToTable("tenants"); - }); - - base.OnModelCreating(modelBuilder); - } -} diff --git a/code/api/src/Data/Database/Api/ApiAccessToken.cs b/code/api/src/Data/Database/Api/ApiAccessToken.cs new file mode 100644 index 0000000..9582869 --- /dev/null +++ b/code/api/src/Data/Database/Api/ApiAccessToken.cs @@ -0,0 +1,31 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class ApiAccessToken : Base +{ + public User User { get; set; } + public DateTime ExpiryDate { get; set; } + public bool AllowRead { get; set; } + public bool AllowCreate { get; set; } + public bool AllowUpdate { get; set; } + public bool AllowDelete { get; set; } + public bool HasExpired => ExpiryDate < AppDateTime.UtcNow; + public ApiAccessTokenDto AsDto => new(this); + + public class ApiAccessTokenDto + { + public ApiAccessTokenDto(ApiAccessToken source) { + ExpiryDate = source.ExpiryDate; + AllowRead = source.AllowRead; + AllowCreate = source.AllowCreate; + AllowUpdate = source.AllowUpdate; + AllowDelete = source.AllowDelete; + } + + public DateTime ExpiryDate { get; set; } + public bool AllowRead { get; set; } + public bool AllowCreate { get; set; } + public bool AllowUpdate { get; set; } + public bool AllowDelete { get; set; } + public bool HasExpired => ExpiryDate < AppDateTime.UtcNow; + } +} \ No newline at end of file diff --git a/code/api/src/Data/Database/ApiAccessToken.cs b/code/api/src/Data/Database/ApiAccessToken.cs deleted file mode 100644 index 9582869..0000000 --- a/code/api/src/Data/Database/ApiAccessToken.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class ApiAccessToken : Base -{ - public User User { get; set; } - public DateTime ExpiryDate { get; set; } - public bool AllowRead { get; set; } - public bool AllowCreate { get; set; } - public bool AllowUpdate { get; set; } - public bool AllowDelete { get; set; } - public bool HasExpired => ExpiryDate < AppDateTime.UtcNow; - public ApiAccessTokenDto AsDto => new(this); - - public class ApiAccessTokenDto - { - public ApiAccessTokenDto(ApiAccessToken source) { - ExpiryDate = source.ExpiryDate; - AllowRead = source.AllowRead; - AllowCreate = source.AllowCreate; - AllowUpdate = source.AllowUpdate; - AllowDelete = source.AllowDelete; - } - - public DateTime ExpiryDate { get; set; } - public bool AllowRead { get; set; } - public bool AllowCreate { get; set; } - public bool AllowUpdate { get; set; } - public bool AllowDelete { get; set; } - public bool HasExpired => ExpiryDate < AppDateTime.UtcNow; - } -} \ No newline at end of file diff --git a/code/api/src/Data/Database/Base.cs b/code/api/src/Data/Database/Base.cs index ae9efa2..900b923 100644 --- a/code/api/src/Data/Database/Base.cs +++ b/code/api/src/Data/Database/Base.cs @@ -10,6 +10,13 @@ public class Base public Guid Id { get; init; } public DateTime CreatedAt { get; init; } public DateTime? ModifiedAt { get; private set; } - public bool Deleted { get; set; } - public void Modified() => ModifiedAt = AppDateTime.UtcNow; + public DateTime? DeletedAt { get; private set; } + public bool Deleted { get; private set; } + + public void SetModified() => ModifiedAt = AppDateTime.UtcNow; + + public void SetDeleted() { + Deleted = true; + DeletedAt = AppDateTime.UtcNow; + } } \ No newline at end of file diff --git a/code/api/src/Data/Database/BaseWithOwner.cs b/code/api/src/Data/Database/BaseWithOwner.cs index 1eb99f4..84b5bfe 100644 --- a/code/api/src/Data/Database/BaseWithOwner.cs +++ b/code/api/src/Data/Database/BaseWithOwner.cs @@ -1,19 +1,34 @@ namespace IOL.GreatOffice.Api.Data.Database; /// -/// Base class for all entities. +/// Base class for all entities with ownership. /// public class BaseWithOwner : Base { protected BaseWithOwner() { } - protected BaseWithOwner(Guid userId) { - UserId = userId; + protected BaseWithOwner(LoggedInUserModel loggedInUser) { + CreatedBy = loggedInUser.Id; } - public Guid? UserId { get; set; } - public Guid? TenantId { get; init; } - public Guid? ModifiedById { get; init; } - public Guid? CreatedById { get; init; } - public Guid? DeletedById { get; init; } + public Guid? UserId { get; private set; } + public Guid? TenantId { get; private set; } + public Guid? ModifiedBy { get; private set; } + public Guid? CreatedBy { get; private set; } + public Guid? DeletedBy { get; private set; } + + public void SetDeleted(Guid userId) { + DeletedBy = userId; + SetDeleted(); + } + + public void SetModified(Guid userId) { + ModifiedBy = userId; + SetModified(); + } + + public void SetOwnerIds(Guid userId = default, Guid tenantId = default) { + if (tenantId != default) TenantId = tenantId; + if (userId != default) UserId = userId; + } } \ No newline at end of file diff --git a/code/api/src/Data/Database/Customer.cs b/code/api/src/Data/Database/Customer.cs deleted file mode 100644 index c6b06a4..0000000 --- a/code/api/src/Data/Database/Customer.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class Customer : BaseWithOwner -{ - public string Name { get; set; } -} \ No newline at end of file diff --git a/code/api/src/Data/Database/Customer/Customer.cs b/code/api/src/Data/Database/Customer/Customer.cs new file mode 100644 index 0000000..f9953da --- /dev/null +++ b/code/api/src/Data/Database/Customer/Customer.cs @@ -0,0 +1,29 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class Customer : BaseWithOwner +{ + public Customer() { } + public Customer(LoggedInUserModel loggedInUserModel) : base(loggedInUserModel) { } + + public string CustomerNumber { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public string Address1 { get; set; } + public string Address2 { get; set; } + public string PostalCode { get; set; } + public string PostalCity { get; set; } + public string Country { get; set; } + public string Phone { get; set; } + public string Email { get; set; } + public string VATNumber { get; set; } + public string ORGNumber { get; set; } + public string DefaultReference { get; set; } + public string Website { get; set; } + public string Currency { get; set; } + + public User Owner { get; set; } + public ICollection Groups { get; set; } + public ICollection Contacts { get; set; } + public ICollection Events { get; set; } + public ICollection Projects { get; set; } +} \ No newline at end of file diff --git a/code/api/src/Data/Database/Customer/CustomerContact.cs b/code/api/src/Data/Database/Customer/CustomerContact.cs new file mode 100644 index 0000000..f5a951d --- /dev/null +++ b/code/api/src/Data/Database/Customer/CustomerContact.cs @@ -0,0 +1,12 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class CustomerContact : BaseWithOwner +{ + public Customer Customer { get; set; } + public string FirstName { get; set; } + public string LastName { get; set; } + public string Email { get; set; } + public string Phone { get; set; } + public string WorkTitle { get; set; } + public string Note { get; set; } +} diff --git a/code/api/src/Data/Database/Customer/CustomerEvent.cs b/code/api/src/Data/Database/Customer/CustomerEvent.cs new file mode 100644 index 0000000..a87da4c --- /dev/null +++ b/code/api/src/Data/Database/Customer/CustomerEvent.cs @@ -0,0 +1,8 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class CustomerEvent : BaseWithOwner +{ + public Customer Customer { get; set; } + public string Title { get; set; } + public string Note { get; set; } +} diff --git a/code/api/src/Data/Database/Customer/CustomerGroup.cs b/code/api/src/Data/Database/Customer/CustomerGroup.cs new file mode 100644 index 0000000..9438f3c --- /dev/null +++ b/code/api/src/Data/Database/Customer/CustomerGroup.cs @@ -0,0 +1,7 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class CustomerGroup : BaseWithOwner +{ + public string Name { get; set; } + public ICollection Customers { get; set; } +} \ No newline at end of file diff --git a/code/api/src/Data/Database/Customer/CustomerGroupMembership.cs b/code/api/src/Data/Database/Customer/CustomerGroupMembership.cs new file mode 100644 index 0000000..ec0d4af --- /dev/null +++ b/code/api/src/Data/Database/Customer/CustomerGroupMembership.cs @@ -0,0 +1,7 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class CustomerGroupMembership : Base +{ + public Customer Customer { get; set; } + public CustomerGroup Group { get; set; } +} \ No newline at end of file diff --git a/code/api/src/Data/Database/CustomerContact.cs b/code/api/src/Data/Database/CustomerContact.cs deleted file mode 100644 index f5a951d..0000000 --- a/code/api/src/Data/Database/CustomerContact.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class CustomerContact : BaseWithOwner -{ - public Customer Customer { get; set; } - public string FirstName { get; set; } - public string LastName { get; set; } - public string Email { get; set; } - public string Phone { get; set; } - public string WorkTitle { get; set; } - public string Note { get; set; } -} diff --git a/code/api/src/Data/Database/CustomerEvent.cs b/code/api/src/Data/Database/CustomerEvent.cs deleted file mode 100644 index da3e3ed..0000000 --- a/code/api/src/Data/Database/CustomerEvent.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class CustomerEvent : BaseWithOwner -{ - public Customer Customer { get; set; } - public string Name { get; set; } -} diff --git a/code/api/src/Data/Database/ForgotPasswordRequest.cs b/code/api/src/Data/Database/ForgotPasswordRequest.cs deleted file mode 100644 index 1510a35..0000000 --- a/code/api/src/Data/Database/ForgotPasswordRequest.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class ForgotPasswordRequest -{ - public ForgotPasswordRequest() { } - - public ForgotPasswordRequest(User user) { - CreatedAt = AppDateTime.UtcNow; - Id = Guid.NewGuid(); - User = user; - } - - public Guid Id { get; set; } - public Guid UserId { get; set; } - public User User { get; set; } - public DateTime CreatedAt { get; set; } - - [NotMapped] - public DateTime ExpirationDate => CreatedAt.AddMinutes(15); - - [NotMapped] - public bool IsExpired => DateTime.Compare(ExpirationDate, AppDateTime.UtcNow) < 0; -} diff --git a/code/api/src/Data/Database/Internal/ForgotPasswordRequest.cs b/code/api/src/Data/Database/Internal/ForgotPasswordRequest.cs new file mode 100644 index 0000000..1510a35 --- /dev/null +++ b/code/api/src/Data/Database/Internal/ForgotPasswordRequest.cs @@ -0,0 +1,23 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class ForgotPasswordRequest +{ + public ForgotPasswordRequest() { } + + public ForgotPasswordRequest(User user) { + CreatedAt = AppDateTime.UtcNow; + Id = Guid.NewGuid(); + User = user; + } + + public Guid Id { get; set; } + public Guid UserId { get; set; } + public User User { get; set; } + public DateTime CreatedAt { get; set; } + + [NotMapped] + public DateTime ExpirationDate => CreatedAt.AddMinutes(15); + + [NotMapped] + public bool IsExpired => DateTime.Compare(ExpirationDate, AppDateTime.UtcNow) < 0; +} diff --git a/code/api/src/Data/Database/Internal/Tenant.cs b/code/api/src/Data/Database/Internal/Tenant.cs new file mode 100644 index 0000000..b185c7a --- /dev/null +++ b/code/api/src/Data/Database/Internal/Tenant.cs @@ -0,0 +1,11 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class Tenant : BaseWithOwner +{ + public string Name { get; set; } + public string Description { get; set; } + public string ContactEmail { get; set; } + public Guid MasterUserId { get; set; } + public string MasterUserPassword { get; set; } + public ICollection Users { get; set; } +} diff --git a/code/api/src/Data/Database/Internal/User.cs b/code/api/src/Data/Database/Internal/User.cs new file mode 100644 index 0000000..9db5d35 --- /dev/null +++ b/code/api/src/Data/Database/Internal/User.cs @@ -0,0 +1,37 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class User : Base +{ + public User() { } + + public User(string username) { + Username = username; + } + + public string FirstName { get; set; } + public string LastName { get; set; } + public string Email { get; set; } + public string Username { get; set; } + public string Password { get; set; } + public ICollection Tenants { get; set; } + + public string DisplayName() { + if (FirstName.HasValue() && LastName.HasValue()) return FirstName + " " + LastName; + return FirstName.HasValue() ? FirstName : Email; + } + + public void HashAndSetPassword(string password) { + Password = PasswordHelper.HashPassword(password); + } + + public bool VerifyPassword(string password) { + return PasswordHelper.Verify(password, Password); + } + + public IEnumerable DefaultClaims() { + return new Claim[] { + new(AppClaims.USER_ID, Id.ToString()), + new(AppClaims.NAME, Username), + }; + } +} \ No newline at end of file diff --git a/code/api/src/Data/Database/MainAppDatabase.cs b/code/api/src/Data/Database/MainAppDatabase.cs new file mode 100644 index 0000000..b529791 --- /dev/null +++ b/code/api/src/Data/Database/MainAppDatabase.cs @@ -0,0 +1,85 @@ +using IOL.GreatOffice.Api.Endpoints.V1.Projects; +using Microsoft.AspNetCore.DataProtection.EntityFrameworkCore; + +namespace IOL.GreatOffice.Api.Data.Database; + +public class MainAppDatabase : DbContext, IDataProtectionKeyContext +{ + public MainAppDatabase(DbContextOptions options) : base(options) { } + public DbSet Users { get; set; } + public DbSet ForgotPasswordRequests { get; set; } + public DbSet TimeLabels { get; set; } + public DbSet TimeEntries { get; set; } + public DbSet TimeCategories { get; set; } + public DbSet AccessTokens { get; set; } + public DbSet Tenants { get; set; } + public DbSet DataProtectionKeys { get; set; } + public DbSet Projects { get; set; } + public DbSet ProjectLabels { get; set; } + public DbSet Customers { get; set; } + public DbSet CustomersContacts { get; set; } + public DbSet CustomerEvents { get; set; } + public DbSet CustomerGroups { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) { + modelBuilder.Entity(e => { + e.HasMany(n => n.Tenants); + e.ToTable("users"); + }); + modelBuilder.Entity(e => { + e.HasOne(c => c.User); + e.ToTable("forgot_password_requests"); + }); + modelBuilder.Entity(e => { e.ToTable("time_categories"); }); + modelBuilder.Entity(e => { e.ToTable("time_labels"); }); + modelBuilder.Entity(e => { + e.HasOne(c => c.Category); + e.HasMany(c => c.Labels); + e.ToTable("time_entries"); + }); + modelBuilder.Entity(e => { + e.HasOne(n => n.User); + e.ToTable("api_access_tokens"); + }); + modelBuilder.Entity(e => { + e.HasMany(n => n.Users); + e.ToTable("tenants"); + }); + modelBuilder.Entity(e => { + e.HasMany(n => n.Members); + e.HasMany(n => n.Customers); + e.ToTable("projects"); + }); + modelBuilder.Entity(e => { + e.HasOne(n => n.Project); + e.HasOne(n => n.User); + e.ToTable("project_members"); + }); + modelBuilder.Entity(e => { + e.HasOne(n => n.Project); + e.ToTable("project_labels"); + }); + modelBuilder.Entity(e => { + e.HasOne(n => n.Owner); + e.HasMany(n => n.Events); + e.HasMany(n => n.Contacts); + e.HasMany(n => n.Groups); + e.HasMany(n => n.Projects); + e.ToTable("customers"); + }); + modelBuilder.Entity(e => { + e.HasOne(n => n.Customer); + e.ToTable("customer_contacts"); + }); + modelBuilder.Entity(e => { + e.HasOne(n => n.Customer); + e.ToTable("customer_events"); + }); + modelBuilder.Entity(e => { + e.HasMany(n => n.Customers); + e.ToTable("customer_groups"); + }); + + base.OnModelCreating(modelBuilder); + } +} \ No newline at end of file diff --git a/code/api/src/Data/Database/Project.cs b/code/api/src/Data/Database/Project.cs deleted file mode 100644 index 99c6e7f..0000000 --- a/code/api/src/Data/Database/Project.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class Project : BaseWithOwner -{ - public string Name { get; set; } - public string Description { get; set; } - public DateTime? Start { get; set; } - public DateTime? Stop { get; set; } - public List Customers { get; set; } - public List Owners { get; set; } - public List Labels { get; set; } -} diff --git a/code/api/src/Data/Database/Project/Project.cs b/code/api/src/Data/Database/Project/Project.cs new file mode 100644 index 0000000..de9e2cb --- /dev/null +++ b/code/api/src/Data/Database/Project/Project.cs @@ -0,0 +1,15 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class Project : BaseWithOwner +{ + public Project() { } + + public Project(LoggedInUserModel loggedInUserModel) : base(loggedInUserModel) { } + public string Name { get; set; } + public string Description { get; set; } + public DateTime? Start { get; set; } + public DateTime? Stop { get; set; } + public ICollection Customers { get; set; } + public ICollection Members { get; set; } + public ICollection Labels { get; set; } +} \ No newline at end of file diff --git a/code/api/src/Data/Database/Project/ProjectLabel.cs b/code/api/src/Data/Database/Project/ProjectLabel.cs new file mode 100644 index 0000000..0e1dc5d --- /dev/null +++ b/code/api/src/Data/Database/Project/ProjectLabel.cs @@ -0,0 +1,8 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class ProjectLabel : BaseWithOwner +{ + public string Value { get; set; } + public string Color { get; set; } + public Project Project { get; set; } +} diff --git a/code/api/src/Data/Database/Project/ProjectMember.cs b/code/api/src/Data/Database/Project/ProjectMember.cs new file mode 100644 index 0000000..a5e0682 --- /dev/null +++ b/code/api/src/Data/Database/Project/ProjectMember.cs @@ -0,0 +1,8 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class ProjectMember : Base +{ + public Project Project { get; set; } + public User User { get; set; } + public ProjectRole Role { get; set; } +} \ No newline at end of file diff --git a/code/api/src/Data/Database/ProjectLabel.cs b/code/api/src/Data/Database/ProjectLabel.cs deleted file mode 100644 index 8fb18c2..0000000 --- a/code/api/src/Data/Database/ProjectLabel.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class ProjectLabel : BaseWithOwner -{ - public string Name { get; set; } - public string Color { get; set; } - public Project Todo { get; set; } -} diff --git a/code/api/src/Data/Database/Tenant.cs b/code/api/src/Data/Database/Tenant.cs deleted file mode 100644 index b185c7a..0000000 --- a/code/api/src/Data/Database/Tenant.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class Tenant : BaseWithOwner -{ - public string Name { get; set; } - public string Description { get; set; } - public string ContactEmail { get; set; } - public Guid MasterUserId { get; set; } - public string MasterUserPassword { get; set; } - public ICollection Users { get; set; } -} diff --git a/code/api/src/Data/Database/Time/TimeCategory.cs b/code/api/src/Data/Database/Time/TimeCategory.cs new file mode 100644 index 0000000..c3f013d --- /dev/null +++ b/code/api/src/Data/Database/Time/TimeCategory.cs @@ -0,0 +1,32 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class TimeCategory : BaseWithOwner +{ + public TimeCategory() { } + + public TimeCategory(LoggedInUserModel loggedInUserModel) : base(loggedInUserModel) { } + public string Name { get; set; } + public string Color { get; set; } + public TimeCategoryDto AsDto => new(this); + + public class TimeCategoryDto + { + public TimeCategoryDto() { } + + public TimeCategoryDto(TimeCategory sourceEntry = default) { + if (sourceEntry == default) { + return; + } + + Id = sourceEntry.Id; + ModifiedAt = sourceEntry.ModifiedAt; + Name = sourceEntry.Name; + Color = sourceEntry.Color; + } + + public Guid Id { get; set; } + public DateTime? ModifiedAt { get; set; } + public string Name { get; set; } + public string Color { get; set; } + } +} \ No newline at end of file diff --git a/code/api/src/Data/Database/Time/TimeEntry.cs b/code/api/src/Data/Database/Time/TimeEntry.cs new file mode 100644 index 0000000..0405df2 --- /dev/null +++ b/code/api/src/Data/Database/Time/TimeEntry.cs @@ -0,0 +1,46 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class TimeEntry : BaseWithOwner +{ + public TimeEntry() { } + + public TimeEntry(LoggedInUserModel loggedInUserModel) : base(loggedInUserModel) { } + public DateTime Start { get; set; } + public DateTime Stop { get; set; } + public string Description { get; set; } + public ICollection Labels { get; set; } + public TimeCategory Category { get; set; } + public TimeEntryDto AsDto => new(this); + + public class TimeEntryDto + { + public TimeEntryDto() { } + + public TimeEntryDto(TimeEntry sourceEntry = default) { + if (sourceEntry == default) { + return; + } + + Id = sourceEntry.Id; + ModifiedAt = sourceEntry.ModifiedAt; + Stop = sourceEntry.Stop; + Start = sourceEntry.Start; + Description = sourceEntry.Description; + if (sourceEntry.Labels != default) { + Labels = sourceEntry.Labels + .Select(t => t.AsDto) + .ToList(); + } + + Category = sourceEntry.Category.AsDto; + } + + public Guid? Id { get; set; } + public DateTime? ModifiedAt { get; set; } + public DateTime Start { get; set; } + public DateTime Stop { get; set; } + public string Description { get; set; } + public List Labels { get; set; } + public TimeCategory.TimeCategoryDto Category { get; set; } + } +} \ No newline at end of file diff --git a/code/api/src/Data/Database/Time/TimeLabel.cs b/code/api/src/Data/Database/Time/TimeLabel.cs new file mode 100644 index 0000000..365161c --- /dev/null +++ b/code/api/src/Data/Database/Time/TimeLabel.cs @@ -0,0 +1,32 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class TimeLabel : BaseWithOwner +{ + public TimeLabel() { } + + public TimeLabel(LoggedInUserModel loggedInUserModel) : base(loggedInUserModel) { } + public string Name { get; set; } + public string Color { get; set; } + + [NotMapped] + public TimeLabelDto AsDto => new(this); + + public class TimeLabelDto + { + public TimeLabelDto() { } + + public TimeLabelDto(TimeLabel sourceEntry) { + Id = sourceEntry.Id; + CreatedAt = sourceEntry.CreatedAt; + ModifiedAt = sourceEntry.ModifiedAt; + Name = sourceEntry.Name; + Color = sourceEntry.Color; + } + + public Guid Id { get; set; } + public DateTime CreatedAt { get; set; } + public DateTime? ModifiedAt { get; set; } + public string Name { get; set; } + public string Color { get; set; } + } +} \ No newline at end of file diff --git a/code/api/src/Data/Database/TimeCategory.cs b/code/api/src/Data/Database/TimeCategory.cs deleted file mode 100644 index 69c6957..0000000 --- a/code/api/src/Data/Database/TimeCategory.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class TimeCategory : BaseWithOwner -{ - public TimeCategory() { } - public TimeCategory(Guid userId) : base(userId) { } - public string Name { get; set; } - public string Color { get; set; } - public TimeCategoryDto AsDto => new(this); - - public class TimeCategoryDto - { - public TimeCategoryDto() { } - - public TimeCategoryDto(TimeCategory sourceEntry = default) { - if (sourceEntry == default) { - return; - } - - Id = sourceEntry.Id; - ModifiedAt = sourceEntry.ModifiedAt; - Name = sourceEntry.Name; - Color = sourceEntry.Color; - } - - public Guid Id { get; set; } - public DateTime? ModifiedAt { get; set; } - public string Name { get; set; } - public string Color { get; set; } - } -} diff --git a/code/api/src/Data/Database/TimeEntry.cs b/code/api/src/Data/Database/TimeEntry.cs deleted file mode 100644 index 46c62e1..0000000 --- a/code/api/src/Data/Database/TimeEntry.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class TimeEntry : BaseWithOwner -{ - public TimeEntry() { } - public TimeEntry(Guid userId) : base(userId) { } - public DateTime Start { get; set; } - public DateTime Stop { get; set; } - public string Description { get; set; } - public ICollection Labels { get; set; } - public TimeCategory Category { get; set; } - public TimeEntryDto AsDto => new(this); - - public class TimeEntryDto - { - public TimeEntryDto() { } - - public TimeEntryDto(TimeEntry sourceEntry = default) { - if (sourceEntry == default) { - return; - } - - Id = sourceEntry.Id; - ModifiedAt = sourceEntry.ModifiedAt; - Stop = sourceEntry.Stop; - Start = sourceEntry.Start; - Description = sourceEntry.Description; - if (sourceEntry.Labels != default) { - Labels = sourceEntry.Labels - .Select(t => t.AsDto) - .ToList(); - } - - Category = sourceEntry.Category.AsDto; - } - - public Guid? Id { get; set; } - public DateTime? ModifiedAt { get; set; } - public DateTime Start { get; set; } - public DateTime Stop { get; set; } - public string Description { get; set; } - public List Labels { get; set; } - public TimeCategory.TimeCategoryDto Category { get; set; } - } -} diff --git a/code/api/src/Data/Database/TimeLabel.cs b/code/api/src/Data/Database/TimeLabel.cs deleted file mode 100644 index 55e20b0..0000000 --- a/code/api/src/Data/Database/TimeLabel.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class TimeLabel : BaseWithOwner -{ - public TimeLabel() { } - public TimeLabel(Guid userId) : base(userId) { } - public string Name { get; set; } - public string Color { get; set; } - - [NotMapped] - public TimeLabelDto AsDto => new(this); - - public class TimeLabelDto - { - public TimeLabelDto() { } - - public TimeLabelDto(TimeLabel sourceEntry) { - Id = sourceEntry.Id; - CreatedAt = sourceEntry.CreatedAt; - ModifiedAt = sourceEntry.ModifiedAt; - Name = sourceEntry.Name; - Color = sourceEntry.Color; - } - - public Guid Id { get; set; } - public DateTime CreatedAt { get; set; } - public DateTime? ModifiedAt { get; set; } - public string Name { get; set; } - public string Color { get; set; } - } -} diff --git a/code/api/src/Data/Database/Todo.cs b/code/api/src/Data/Database/Todo.cs deleted file mode 100644 index 5fe3c9a..0000000 --- a/code/api/src/Data/Database/Todo.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class Todo : BaseWithOwner -{ - public int PublicId { get; set; } - public TodoStatus Status { get; set; } - public TodoProject Project { get; set; } - public Guid? AssignedUserId { get; set; } - public string Title { get; set; } - public string Description { get; set; } - public ICollection Labels { get; set; } - public ICollection Comments { get; set; } -} diff --git a/code/api/src/Data/Database/Todo/Todo.cs b/code/api/src/Data/Database/Todo/Todo.cs new file mode 100644 index 0000000..5fe3c9a --- /dev/null +++ b/code/api/src/Data/Database/Todo/Todo.cs @@ -0,0 +1,13 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class Todo : BaseWithOwner +{ + public int PublicId { get; set; } + public TodoStatus Status { get; set; } + public TodoProject Project { get; set; } + public Guid? AssignedUserId { get; set; } + public string Title { get; set; } + public string Description { get; set; } + public ICollection Labels { get; set; } + public ICollection Comments { get; set; } +} diff --git a/code/api/src/Data/Database/Todo/TodoComment.cs b/code/api/src/Data/Database/Todo/TodoComment.cs new file mode 100644 index 0000000..44dcbed --- /dev/null +++ b/code/api/src/Data/Database/Todo/TodoComment.cs @@ -0,0 +1,7 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class TodoComment : BaseWithOwner +{ + public string Value { get; set; } + public Todo Todo { get; set; } +} diff --git a/code/api/src/Data/Database/Todo/TodoLabel.cs b/code/api/src/Data/Database/Todo/TodoLabel.cs new file mode 100644 index 0000000..7753ade --- /dev/null +++ b/code/api/src/Data/Database/Todo/TodoLabel.cs @@ -0,0 +1,8 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class TodoLabel : BaseWithOwner +{ + public string Name { get; set; } + public string Color { get; set; } + public Todo Todo { get; set; } +} diff --git a/code/api/src/Data/Database/Todo/TodoProject.cs b/code/api/src/Data/Database/Todo/TodoProject.cs new file mode 100644 index 0000000..5e22bbe --- /dev/null +++ b/code/api/src/Data/Database/Todo/TodoProject.cs @@ -0,0 +1,8 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class TodoProject : BaseWithOwner +{ + public string Name { get; set; } + public TodoVisibility Visibility { get; set; } + public Guid? ProjectId { get; set; } +} \ No newline at end of file diff --git a/code/api/src/Data/Database/Todo/TodoProjectAccessControl.cs b/code/api/src/Data/Database/Todo/TodoProjectAccessControl.cs new file mode 100644 index 0000000..964f831 --- /dev/null +++ b/code/api/src/Data/Database/Todo/TodoProjectAccessControl.cs @@ -0,0 +1,11 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class TodoProjectAccessControl +{ + public TodoProject Project { get; set; } + public Guid? UserId { get; set; } + public bool Browse { get; set; } + public bool Submit { get; set; } + public bool Comment { get; set; } + public bool Edit { get; set; } +} diff --git a/code/api/src/Data/Database/Todo/TodoStatus.cs b/code/api/src/Data/Database/Todo/TodoStatus.cs new file mode 100644 index 0000000..9ace7d0 --- /dev/null +++ b/code/api/src/Data/Database/Todo/TodoStatus.cs @@ -0,0 +1,37 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class TodoStatus : BaseWithOwner +{ + public string Name { get; set; } + public string Color { get; set; } + public Todo Todo { get; set; } + + public static List GetDefaultStatusSetForTenant(Guid tenantId) { + return new List() { + new() { + Name = "Reported", + }, + new() { + Name = "Resolved", + }, + new() { + Name = "Fixed", + }, + new() { + Name = "Implemented", + }, + new() { + Name = "Won't fix", + }, + new() { + Name = "By design", + }, + new() { + Name = "Invalid", + }, + new() { + Name = "Duplicate", + } + }; + } +} diff --git a/code/api/src/Data/Database/TodoComment.cs b/code/api/src/Data/Database/TodoComment.cs deleted file mode 100644 index 44dcbed..0000000 --- a/code/api/src/Data/Database/TodoComment.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class TodoComment : BaseWithOwner -{ - public string Value { get; set; } - public Todo Todo { get; set; } -} diff --git a/code/api/src/Data/Database/TodoLabel.cs b/code/api/src/Data/Database/TodoLabel.cs deleted file mode 100644 index 7753ade..0000000 --- a/code/api/src/Data/Database/TodoLabel.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class TodoLabel : BaseWithOwner -{ - public string Name { get; set; } - public string Color { get; set; } - public Todo Todo { get; set; } -} diff --git a/code/api/src/Data/Database/TodoProject.cs b/code/api/src/Data/Database/TodoProject.cs deleted file mode 100644 index 5e22bbe..0000000 --- a/code/api/src/Data/Database/TodoProject.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class TodoProject : BaseWithOwner -{ - public string Name { get; set; } - public TodoVisibility Visibility { get; set; } - public Guid? ProjectId { get; set; } -} \ No newline at end of file diff --git a/code/api/src/Data/Database/TodoProjectAccessControl.cs b/code/api/src/Data/Database/TodoProjectAccessControl.cs deleted file mode 100644 index 964f831..0000000 --- a/code/api/src/Data/Database/TodoProjectAccessControl.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class TodoProjectAccessControl -{ - public TodoProject Project { get; set; } - public Guid? UserId { get; set; } - public bool Browse { get; set; } - public bool Submit { get; set; } - public bool Comment { get; set; } - public bool Edit { get; set; } -} diff --git a/code/api/src/Data/Database/TodoStatus.cs b/code/api/src/Data/Database/TodoStatus.cs deleted file mode 100644 index 416212d..0000000 --- a/code/api/src/Data/Database/TodoStatus.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class TodoStatus : BaseWithOwner -{ - public string Name { get; set; } - public string Color { get; set; } - public Todo Todo { get; set; } - - public static List GetDefaultStatusSetForTenant(Guid tenantId) { - return new List() { - new() { - Name = "Reported", - TenantId = tenantId - }, - new() { - Name = "Resolved", - TenantId = tenantId - }, - new() { - Name = "Fixed", - TenantId = tenantId - }, - new() { - Name = "Implemented", - TenantId = tenantId - }, - new() { - Name = "Won't fix", - TenantId = tenantId - }, - new() { - Name = "By design", - TenantId = tenantId - }, - new() { - Name = "Invalid", - TenantId = tenantId - }, - new() { - Name = "Duplicate", - TenantId = tenantId - } - }; - } -} diff --git a/code/api/src/Data/Database/User.cs b/code/api/src/Data/Database/User.cs deleted file mode 100644 index 9db5d35..0000000 --- a/code/api/src/Data/Database/User.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class User : Base -{ - public User() { } - - public User(string username) { - Username = username; - } - - public string FirstName { get; set; } - public string LastName { get; set; } - public string Email { get; set; } - public string Username { get; set; } - public string Password { get; set; } - public ICollection Tenants { get; set; } - - public string DisplayName() { - if (FirstName.HasValue() && LastName.HasValue()) return FirstName + " " + LastName; - return FirstName.HasValue() ? FirstName : Email; - } - - public void HashAndSetPassword(string password) { - Password = PasswordHelper.HashPassword(password); - } - - public bool VerifyPassword(string password) { - return PasswordHelper.Verify(password, Password); - } - - public IEnumerable DefaultClaims() { - return new Claim[] { - new(AppClaims.USER_ID, Id.ToString()), - new(AppClaims.NAME, Username), - }; - } -} \ No newline at end of file diff --git a/code/api/src/Data/Enums/ProjectRole.cs b/code/api/src/Data/Enums/ProjectRole.cs new file mode 100644 index 0000000..c4a3f29 --- /dev/null +++ b/code/api/src/Data/Enums/ProjectRole.cs @@ -0,0 +1,9 @@ +namespace IOL.GreatOffice.Api.Data.Enums; + +public enum ProjectRole +{ + EXTERNAL, + RESOURCE, + LEADER, + OWNER +} \ No newline at end of file diff --git a/code/api/src/Data/Enums/StringsLang.cs b/code/api/src/Data/Enums/StringsLang.cs deleted file mode 100644 index e4e2066..0000000 --- a/code/api/src/Data/Enums/StringsLang.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Enums; - -public enum StringsLang -{ - ENGLISH_GB = 0, - NORWEGIAN_NB = 1 -} \ No newline at end of file diff --git a/code/api/src/Data/Models/AppConfiguration.cs b/code/api/src/Data/Models/AppConfiguration.cs new file mode 100644 index 0000000..f4346bb --- /dev/null +++ b/code/api/src/Data/Models/AppConfiguration.cs @@ -0,0 +1,58 @@ +using System.Security.Cryptography.X509Certificates; + +namespace IOL.GreatOffice.Api.Data.Models; + +public class AppConfiguration +{ + public string DB_HOST { get; set; } + public string DB_PORT { get; set; } + public string DB_USER { get; set; } + public string DB_PASSWORD { get; set; } + public string DB_NAME { get; set; } + public string QUARTZ_DB_HOST { get; set; } + public string QUARTZ_DB_PORT { get; set; } + public string QUARTZ_DB_USER { get; set; } + public string QUARTZ_DB_PASSWORD { get; set; } + public string QUARTZ_DB_NAME { get; set; } + public string SEQ_API_KEY { get; set; } + public string SEQ_API_URL { get; set; } + public string SMTP_HOST { get; set; } + public string SMTP_PORT { get; set; } + public string SMTP_USER { get; set; } + public string SMTP_PASSWORD { get; set; } + public string EMAIL_FROM_ADDRESS { get; set; } + public string EMAIL_FROM_DISPLAY_NAME { get; set; } + public string PORTAL_URL { get; set; } + public string GITHUB_CLIENT_ID { get; set; } + public string GITHUB_CLIENT_SECRET { get; set; } + public string APP_AES_KEY { get; set; } + public string APP_CERT { get; set; } + + public X509Certificate2 CERT1() => new (Convert.FromBase64String(APP_CERT)); + + public object GetPublicVersion() { + return new { + DB_HOST, + DB_PORT, + DB_USER, + DB_PASSWORD = DB_PASSWORD.Obfuscate() ?? "", + QUARTZ_DB_HOST, + QUARTZ_DB_PORT, + QUARTZ_DB_USER, + QUARTZ_DB_PASSWORD = QUARTZ_DB_PASSWORD.Obfuscate() ?? "", + SEQ_API_KEY = SEQ_API_KEY.Obfuscate() ?? "", + SEQ_API_URL, + SMTP_HOST, + SMTP_PORT, + SMTP_USER = SMTP_USER.Obfuscate() ?? "", + SMTP_PASSWORD = SMTP_PASSWORD.Obfuscate() ?? "", + EMAIL_FROM_ADDRESS, + EMAIL_FROM_DISPLAY_NAME, + PORTAL_URL, + GITHUB_CLIENT_ID = GITHUB_CLIENT_ID.Obfuscate() ?? "", + GITHUB_CLIENT_SECRET = GITHUB_CLIENT_SECRET.Obfuscate() ?? "", + APP_AES_KEY = APP_AES_KEY.Obfuscate() ?? "", + CERT1 = CERT1().PublicKey.Oid.FriendlyName + }; + } +} diff --git a/code/api/src/Data/Models/LoggedInUserModel.cs b/code/api/src/Data/Models/LoggedInUserModel.cs index d802b77..541d4a5 100644 --- a/code/api/src/Data/Models/LoggedInUserModel.cs +++ b/code/api/src/Data/Models/LoggedInUserModel.cs @@ -2,6 +2,7 @@ namespace IOL.GreatOffice.Api.Data.Models; public class LoggedInUserModel { - public Guid Id { get; set; } - public string Username { get; set; } -} + public Guid Id { get; set; } + public string Username { get; set; } + public Guid TenantId { get; set; } +} \ No newline at end of file diff --git a/code/api/src/Data/Static/AppConfiguration.cs b/code/api/src/Data/Static/AppConfiguration.cs deleted file mode 100644 index 4ee7a8e..0000000 --- a/code/api/src/Data/Static/AppConfiguration.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Security.Cryptography.X509Certificates; - -namespace IOL.GreatOffice.Api.Data.Static; - -public class AppConfiguration -{ - public string DB_HOST { get; set; } - public string DB_PORT { get; set; } - public string DB_USER { get; set; } - public string DB_PASSWORD { get; set; } - public string DB_NAME { get; set; } - public string QUARTZ_DB_HOST { get; set; } - public string QUARTZ_DB_PORT { get; set; } - public string QUARTZ_DB_USER { get; set; } - public string QUARTZ_DB_PASSWORD { get; set; } - public string QUARTZ_DB_NAME { get; set; } - public string SEQ_API_KEY { get; set; } - public string SEQ_API_URL { get; set; } - public string SMTP_HOST { get; set; } - public string SMTP_PORT { get; set; } - public string SMTP_USER { get; set; } - public string SMTP_PASSWORD { get; set; } - public string EMAIL_FROM_ADDRESS { get; set; } - public string EMAIL_FROM_DISPLAY_NAME { get; set; } - public string PORTAL_URL { get; set; } - public string GITHUB_CLIENT_ID { get; set; } - public string GITHUB_CLIENT_SECRET { get; set; } - public string APP_AES_KEY { get; set; } - public string APP_CERT { get; set; } - - public X509Certificate2 CERT1() => new (Convert.FromBase64String(APP_CERT)); - - public object GetPublicVersion() { - return new { - DB_HOST, - DB_PORT, - DB_USER, - DB_PASSWORD = DB_PASSWORD.Obfuscate() ?? "", - QUARTZ_DB_HOST, - QUARTZ_DB_PORT, - QUARTZ_DB_USER, - QUARTZ_DB_PASSWORD = QUARTZ_DB_PASSWORD.Obfuscate() ?? "", - SEQ_API_KEY = SEQ_API_KEY.Obfuscate() ?? "", - SEQ_API_URL, - SMTP_HOST, - SMTP_PORT, - SMTP_USER = SMTP_USER.Obfuscate() ?? "", - SMTP_PASSWORD = SMTP_PASSWORD.Obfuscate() ?? "", - EMAIL_FROM_ADDRESS, - EMAIL_FROM_DISPLAY_NAME, - PORTAL_URL, - GITHUB_CLIENT_ID = GITHUB_CLIENT_ID.Obfuscate() ?? "", - GITHUB_CLIENT_SECRET = GITHUB_CLIENT_SECRET.Obfuscate() ?? "", - APP_AES_KEY = APP_AES_KEY.Obfuscate() ?? "", - CERT1 = CERT1().PublicKey.Oid.FriendlyName - }; - } -} -- cgit v1.3