Compare commits

..

3 Commits

Author SHA1 Message Date
mathias df14bd9d78 added appsettings.Development.json 2025-01-05 00:35:40 -05:00
mathias 71f00b41bd fix client query 2025-01-05 00:34:00 -05:00
mathias ad9248c65c initial commit 2025-01-02 15:10:52 -05:00
10 changed files with 87 additions and 27 deletions
+1 -2
View File
@@ -5,5 +5,4 @@ obj/
riderModule.iml riderModule.iml
/_ReSharper.Caches/ /_ReSharper.Caches/
DigitalOps.Api/appsettings.Development.json DigitalOps.Api/appsettings.Development.json
@@ -0,0 +1,14 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"Database": {
"ConnectionString": "Host=workstation;Port=5432;Database=digital-operations;Username=planb;Password=-mbd2018-"
},
"JwtBearer": {
"Authority": "https://login-planb.openharbor.io/realms/digital-ops"
}
}
@@ -24,15 +24,15 @@ public class HasAccessToClientValidator : AbstractValidator<long>
.SetValidator(new DbEntityExistValidator<Client, long>(dbContext)) .SetValidator(new DbEntityExistValidator<Client, long>(dbContext))
.CustomAsync(async (clientId, validationContext, cancellationToken) => .CustomAsync(async (clientId, validationContext, cancellationToken) =>
{ {
var client = await _dbContext.Clients var organizationClient = await _dbContext.OrganizationClients
.AsNoTracking() .AsNoTracking()
.FirstOrDefaultAsync(client => client.Id == clientId, cancellationToken); .FirstOrDefaultAsync(organizationClient => organizationClient.ClientId == clientId, cancellationToken);
if (client is null) if (organizationClient is null)
return; return;
var validation = new HasAccessToOrganizationValidator(_role, _dbContext, _userIdentityService); var validation = new HasAccessToOrganizationValidator(_role, _dbContext, _userIdentityService);
var validationResult = validation.Validate(client.OrganizationId); var validationResult = validation.Validate(organizationClient.OrganizationId);
if (!validationResult.IsValid) if (!validationResult.IsValid)
foreach (var error in validationResult.Errors) foreach (var error in validationResult.Errors)
@@ -13,6 +13,7 @@ public class ClientParams
public class ClientItem public class ClientItem
{ {
public long Id { get; set; } public long Id { get; set; }
public IEnumerable<long> OrganizationIds { get; set; }
public required string Name { get; set; } public required string Name { get; set; }
public DateTime CreatedAt { get; set; } public DateTime CreatedAt { get; set; }
public DateTime? UpdatedAt { get; set; } public DateTime? UpdatedAt { get; set; }
@@ -38,14 +39,18 @@ public class ClientQueryableProvider(MainDbContext dbContext, UserIdentityServic
var user = await userIdentityService.GetUserOrDefaultAsync(cancellationToken); var user = await userIdentityService.GetUserOrDefaultAsync(cancellationToken);
var queryable = dbContext.Clients
.AsNoTracking();
var result = dbContext.Clients var result = dbContext.Clients
.AsNoTracking() .AsNoTracking()
.Where(client => client.OrganizationId == organizationId) .Where(client => client.OrganizationClients.Any(organizationClient => organizationClient.OrganizationId == organizationId))
.Where(client => .Where(client =>
client.Organization.OrganizationUsers.Any(organizationClient => organizationClient.Organization.OrganizationUsers.Any(organizationUser => organizationUser.UserId == user!.Id))) client.OrganizationClients.Any(organizationClient => organizationClient.Organization.OrganizationUsers.Any(organizationUser => organizationUser.UserId == user!.Id)))
.Select(client => new ClientItem .Select(client => new ClientItem
{ {
Id = client.Id, Id = client.Id,
OrganizationIds = client.OrganizationClients.Select(organizationClient => organizationClient.OrganizationId),
Name = client.Name, Name = client.Name,
CreatedAt = client.CreatedAt, CreatedAt = client.CreatedAt,
UpdatedAt = client.UpdatedAt UpdatedAt = client.UpdatedAt
@@ -55,8 +55,7 @@ public class ProjectQueryableProvider(MainDbContext dbContext, UserIdentityServi
} }
queryable = queryable queryable = queryable
.Where(project => project.Client.OrganizationId == organizationId) .Where(project => project.Client.OrganizationClients.Any(organizationClient =>
.Where(project => project.Client.Organization.OrganizationUsers.Any(organizationClient =>
organizationClient.OrganizationId == organizationUser!.OrganizationId)); organizationClient.OrganizationId == organizationUser!.OrganizationId));
var result = queryable.Select(project => new ProjectItem var result = queryable.Select(project => new ProjectItem
@@ -21,11 +21,16 @@ public class ClientService(MainDbContext dbContext, UserIdentityService userIden
var client = new Dal.DbEntity.Client var client = new Dal.DbEntity.Client
{ {
Name = options.Name, Name = options.Name
Organization = organization };
var organizationClient = new OrganizationClient
{
Organization = organization,
Client = client
}; };
organization.Clients.Add(client); organization.OrganizationClients.Add(organizationClient);
await dbContext.SaveChangesAsync(cancellationToken); await dbContext.SaveChangesAsync(cancellationToken);
} }
} }
+1 -3
View File
@@ -7,15 +7,13 @@ public partial class Client
{ {
public long Id { get; set; } public long Id { get; set; }
public long OrganizationId { get; set; }
public string Name { get; set; } = null!; public string Name { get; set; } = null!;
public DateTime CreatedAt { get; set; } public DateTime CreatedAt { get; set; }
public DateTime? UpdatedAt { get; set; } public DateTime? UpdatedAt { get; set; }
public virtual Organization Organization { get; set; } = null!; public virtual ICollection<OrganizationClient> OrganizationClients { get; set; } = new List<OrganizationClient>();
public virtual ICollection<Project> Projects { get; set; } = new List<Project>(); public virtual ICollection<Project> Projects { get; set; } = new List<Project>();
} }
+2 -2
View File
@@ -13,9 +13,9 @@ public partial class Organization
public DateTime? UpdatedAt { get; set; } public DateTime? UpdatedAt { get; set; }
public virtual ICollection<Client> Clients { get; set; } = new List<Client>();
public virtual ICollection<OidcProvider> OidcProviders { get; set; } = new List<OidcProvider>(); public virtual ICollection<OidcProvider> OidcProviders { get; set; } = new List<OidcProvider>();
public virtual ICollection<OrganizationClient> OrganizationClients { get; set; } = new List<OrganizationClient>();
public virtual ICollection<OrganizationUser> OrganizationUsers { get; set; } = new List<OrganizationUser>(); public virtual ICollection<OrganizationUser> OrganizationUsers { get; set; } = new List<OrganizationUser>();
} }
@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
namespace DigitalOps.Dal.DbEntity;
public partial class OrganizationClient
{
public long Id { get; set; }
public long OrganizationId { get; set; }
public long ClientId { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime? UpdatedAt { get; set; }
public virtual Client Client { get; set; } = null!;
public virtual Organization Organization { get; set; } = null!;
}
+28 -9
View File
@@ -1,6 +1,4 @@
using System; using DigitalOps.Dal.DbEntity;
using System.Collections.Generic;
using DigitalOps.Dal.DbEntity;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace DigitalOps.Dal; namespace DigitalOps.Dal;
@@ -22,6 +20,8 @@ public partial class MainDbScaffoldedContext : DbContext
public virtual DbSet<Organization> Organizations { get; set; } public virtual DbSet<Organization> Organizations { get; set; }
public virtual DbSet<OrganizationClient> OrganizationClients { get; set; }
public virtual DbSet<OrganizationUser> OrganizationUsers { get; set; } public virtual DbSet<OrganizationUser> OrganizationUsers { get; set; }
public virtual DbSet<Project> Projects { get; set; } public virtual DbSet<Project> Projects { get; set; }
@@ -52,13 +52,7 @@ public partial class MainDbScaffoldedContext : DbContext
entity.Property(e => e.Name) entity.Property(e => e.Name)
.HasMaxLength(255) .HasMaxLength(255)
.HasColumnName("name"); .HasColumnName("name");
entity.Property(e => e.OrganizationId).HasColumnName("organization_id");
entity.Property(e => e.UpdatedAt).HasColumnName("updated_at"); entity.Property(e => e.UpdatedAt).HasColumnName("updated_at");
entity.HasOne(d => d.Organization).WithMany(p => p.Clients)
.HasForeignKey(d => d.OrganizationId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("client_organization_id_fkey");
}); });
modelBuilder.Entity<OidcProvider>(entity => modelBuilder.Entity<OidcProvider>(entity =>
@@ -102,6 +96,31 @@ public partial class MainDbScaffoldedContext : DbContext
entity.Property(e => e.UpdatedAt).HasColumnName("updated_at"); entity.Property(e => e.UpdatedAt).HasColumnName("updated_at");
}); });
modelBuilder.Entity<OrganizationClient>(entity =>
{
entity.HasKey(e => e.Id).HasName("organization_client_pkey");
entity.ToTable("organization_client");
entity.Property(e => e.Id).HasColumnName("id");
entity.Property(e => e.ClientId).HasColumnName("client_id");
entity.Property(e => e.CreatedAt)
.HasDefaultValueSql("(CURRENT_TIMESTAMP AT TIME ZONE 'UTC'::text)")
.HasColumnName("created_at");
entity.Property(e => e.OrganizationId).HasColumnName("organization_id");
entity.Property(e => e.UpdatedAt).HasColumnName("updated_at");
entity.HasOne(d => d.Client).WithMany(p => p.OrganizationClients)
.HasForeignKey(d => d.ClientId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("organization_client_client_id_fkey");
entity.HasOne(d => d.Organization).WithMany(p => p.OrganizationClients)
.HasForeignKey(d => d.OrganizationId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("organization_client_organization_id_fkey");
});
modelBuilder.Entity<OrganizationUser>(entity => modelBuilder.Entity<OrganizationUser>(entity =>
{ {
entity.HasKey(e => e.Id).HasName("organization_user_pkey"); entity.HasKey(e => e.Id).HasName("organization_user_pkey");