diff --git a/src/Core/Dirt/Repositories/IOrganizationIntegrationRepository.cs b/src/Core/Dirt/Repositories/IOrganizationIntegrationRepository.cs index 03775e8d20..e5648fc54e 100644 --- a/src/Core/Dirt/Repositories/IOrganizationIntegrationRepository.cs +++ b/src/Core/Dirt/Repositories/IOrganizationIntegrationRepository.cs @@ -1,4 +1,5 @@ using Bit.Core.Dirt.Entities; +using Bit.Core.Dirt.Enums; using Bit.Core.Repositories; namespace Bit.Core.Dirt.Repositories; @@ -8,4 +9,6 @@ public interface IOrganizationIntegrationRepository : IRepository> GetManyByOrganizationAsync(Guid organizationId); Task GetByTeamsConfigurationTenantIdTeamId(string tenantId, string teamId); + + Task GetByOrganizationIdTypeAsync(Guid organizationId, IntegrationType type); } diff --git a/src/Infrastructure.Dapper/Dirt/Repositories/OrganizationIntegrationRepository.cs b/src/Infrastructure.Dapper/Dirt/Repositories/OrganizationIntegrationRepository.cs index a094bbc669..a535c51b33 100644 --- a/src/Infrastructure.Dapper/Dirt/Repositories/OrganizationIntegrationRepository.cs +++ b/src/Infrastructure.Dapper/Dirt/Repositories/OrganizationIntegrationRepository.cs @@ -1,5 +1,6 @@ using System.Data; using Bit.Core.Dirt.Entities; +using Bit.Core.Dirt.Enums; using Bit.Core.Dirt.Repositories; using Bit.Core.Settings; using Bit.Infrastructure.Dapper.Repositories; @@ -43,4 +44,17 @@ public class OrganizationIntegrationRepository : Repository GetByOrganizationIdTypeAsync(Guid organizationId, IntegrationType type) + { + using (var connection = new SqlConnection(ConnectionString)) + { + var result = await connection.QuerySingleOrDefaultAsync( + "[dbo].[OrganizationIntegration_ReadByOrganizationIdType]", + new { OrganizationId = organizationId, Type = type }, + commandType: CommandType.StoredProcedure); + + return result; + } + } } diff --git a/src/Infrastructure.EntityFramework/Dirt/Repositories/OrganizationIntegrationRepository.cs b/src/Infrastructure.EntityFramework/Dirt/Repositories/OrganizationIntegrationRepository.cs index cbcd574854..9055bda51d 100644 --- a/src/Infrastructure.EntityFramework/Dirt/Repositories/OrganizationIntegrationRepository.cs +++ b/src/Infrastructure.EntityFramework/Dirt/Repositories/OrganizationIntegrationRepository.cs @@ -1,4 +1,5 @@ using AutoMapper; +using Bit.Core.Dirt.Enums; using Bit.Core.Dirt.Repositories; using Bit.Infrastructure.EntityFramework.Dirt.Repositories.Queries; using Bit.Infrastructure.EntityFramework.Repositories; @@ -38,4 +39,14 @@ public class OrganizationIntegrationRepository : return await query.Run(dbContext).SingleOrDefaultAsync(); } } + + public async Task GetByOrganizationIdTypeAsync(Guid organizationId, IntegrationType type) + { + using (var scope = ServiceScopeFactory.CreateScope()) + { + var dbContext = GetDatabaseContext(scope); + var query = new OrganizationIntegrationReadByOrganizationIdTypeQuery(organizationId, type); + return await query.Run(dbContext).SingleOrDefaultAsync(); + } + } } diff --git a/src/Infrastructure.EntityFramework/Dirt/Repositories/Queries/OrganizationIntegrationReadByOrganizationIdTypeQuery.cs b/src/Infrastructure.EntityFramework/Dirt/Repositories/Queries/OrganizationIntegrationReadByOrganizationIdTypeQuery.cs new file mode 100644 index 0000000000..757625986d --- /dev/null +++ b/src/Infrastructure.EntityFramework/Dirt/Repositories/Queries/OrganizationIntegrationReadByOrganizationIdTypeQuery.cs @@ -0,0 +1,32 @@ +using Bit.Core.Dirt.Entities; +using Bit.Core.Dirt.Enums; +using Bit.Infrastructure.EntityFramework.Repositories; +using Bit.Infrastructure.EntityFramework.Repositories.Queries; + +namespace Bit.Infrastructure.EntityFramework.Dirt.Repositories.Queries; + +public class OrganizationIntegrationReadByOrganizationIdTypeQuery : IQuery +{ + private readonly Guid _organizationId; + private readonly IntegrationType _type; + + public OrganizationIntegrationReadByOrganizationIdTypeQuery(Guid organizationId, IntegrationType type) + { + _organizationId = organizationId; + _type = type; + } + + public IQueryable Run(DatabaseContext dbContext) + { + var query = from oi in dbContext.OrganizationIntegrations + where oi.OrganizationId == _organizationId && oi.Type == _type + select new OrganizationIntegration() + { + Id = oi.Id, + OrganizationId = oi.OrganizationId, + Type = oi.Type, + Configuration = oi.Configuration, + }; + return query; + } +} diff --git a/src/Sql/dbo/Stored Procedures/OrganizationIntegration_ReadByOrganizationIdType.sql b/src/Sql/dbo/Stored Procedures/OrganizationIntegration_ReadByOrganizationIdType.sql new file mode 100644 index 0000000000..dd8ce75424 --- /dev/null +++ b/src/Sql/dbo/Stored Procedures/OrganizationIntegration_ReadByOrganizationIdType.sql @@ -0,0 +1,15 @@ +CREATE PROCEDURE [dbo].[OrganizationIntegration_ReadByOrganizationIdType] + @OrganizationId UNIQUEIDENTIFIER, + @Type SMALLINT +AS +BEGIN + SET NOCOUNT ON + +SELECT + * +FROM + [dbo].[OrganizationIntegrationView] +WHERE + [OrganizationId] = @OrganizationId + AND [Type] = @Type +END diff --git a/util/Migrator/DbScripts/2025-12-30_00_OrganizationIntegration_AddBillingSyncScimSupport.sql b/util/Migrator/DbScripts/2025-12-30_00_OrganizationIntegration_AddBillingSyncScimSupport.sql new file mode 100644 index 0000000000..e723c734d9 --- /dev/null +++ b/util/Migrator/DbScripts/2025-12-30_00_OrganizationIntegration_AddBillingSyncScimSupport.sql @@ -0,0 +1,16 @@ +CREATE OR ALTER PROCEDURE [dbo].[OrganizationIntegration_ReadByOrganizationIdType] + @OrganizationId UNIQUEIDENTIFIER, + @Type SMALLINT +AS +BEGIN + SET NOCOUNT ON + +SELECT + * +FROM + [dbo].[OrganizationIntegrationView] +WHERE + [OrganizationId] = @OrganizationId + AND [Type] = @Type +END +GO