Add data models for scim and cloud billing sync to event integrations

This commit is contained in:
Brant DeBow 2025-12-31 18:34:42 -05:00
parent 2511591449
commit e7ea050e68
No known key found for this signature in database
GPG key ID: 94411BB25947C72B
4 changed files with 129 additions and 11 deletions

View file

@ -24,9 +24,21 @@ public class OrganizationIntegrationResponseModel : ResponseModel
public OrganizationIntegrationStatus Status => Type switch
{
// Not yet implemented, shouldn't be present, NotApplicable
IntegrationType.CloudBillingSync => OrganizationIntegrationStatus.NotApplicable,
IntegrationType.Scim => OrganizationIntegrationStatus.NotApplicable,
// CloudBillingSync: Check if configuration exists and Enabled property is true
// If null, invalid config, or Enabled is false, status is Invalid
IntegrationType.CloudBillingSync => string.IsNullOrWhiteSpace(Configuration)
? OrganizationIntegrationStatus.Invalid
: (JsonSerializer.Deserialize<CloudBillingSyncIntegration>(Configuration)?.Enabled ?? false)
? OrganizationIntegrationStatus.Completed
: OrganizationIntegrationStatus.Invalid,
// Scim: Check if configuration exists and Enabled property is true
// If null, invalid config, or Enabled is false, status is Invalid
IntegrationType.Scim => string.IsNullOrWhiteSpace(Configuration)
? OrganizationIntegrationStatus.Invalid
: (JsonSerializer.Deserialize<ScimIntegration>(Configuration)?.Enabled ?? false)
? OrganizationIntegrationStatus.Completed
: OrganizationIntegrationStatus.Invalid,
// Webhook is allowed to be null. If it's present, it's Completed
IntegrationType.Webhook => OrganizationIntegrationStatus.Completed,

View file

@ -0,0 +1,28 @@
namespace Bit.Core.Dirt.Models.Data.EventIntegrations;
/// <summary>
/// Configuration for CloudBillingSync integration type.
/// </summary>
public class CloudBillingSyncIntegration
{
/// <summary>
/// Whether the billing sync integration is enabled.
/// Replaces the separate Enabled column from OrganizationConnection.
/// </summary>
public bool Enabled { get; set; }
/// <summary>
/// API key for cloud billing synchronization.
/// </summary>
public string BillingSyncKey { get; set; } = string.Empty;
/// <summary>
/// Reference to the cloud organization ID.
/// </summary>
public Guid CloudOrganizationId { get; set; }
/// <summary>
/// Timestamp of the last successful license sync.
/// </summary>
public DateTime? LastLicenseSync { get; set; }
}

View file

@ -0,0 +1,22 @@
using System.Text.Json.Serialization;
using Bit.Core.AdminConsole.Enums;
namespace Bit.Core.Dirt.Models.Data.EventIntegrations;
/// <summary>
/// Configuration for SCIM integration type.
/// </summary>
public class ScimIntegration
{
/// <summary>
/// Whether the SCIM integration is enabled.
/// Replaces the separate Enabled column from OrganizationConnection.
/// </summary>
public bool Enabled { get; set; }
/// <summary>
/// The SCIM provider type (e.g., Okta, Azure AD, OneLogin).
/// </summary>
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
public ScimProviderType? ScimProvider { get; set; }
}

View file

@ -14,29 +14,85 @@ namespace Bit.Api.Test.Dirt.Models.Response;
public class OrganizationIntegrationResponseModelTests
{
[Theory, BitAutoData]
public void Status_CloudBillingSync_AlwaysNotApplicable(OrganizationIntegration oi)
public void Status_CloudBillingSync_NullConfig_ReturnsInvalid(OrganizationIntegration oi)
{
oi.Type = IntegrationType.CloudBillingSync;
oi.Configuration = null;
var model = new OrganizationIntegrationResponseModel(oi);
Assert.Equal(OrganizationIntegrationStatus.NotApplicable, model.Status);
model.Configuration = "{}";
Assert.Equal(OrganizationIntegrationStatus.NotApplicable, model.Status);
Assert.Equal(OrganizationIntegrationStatus.Invalid, model.Status);
}
[Theory, BitAutoData]
public void Status_Scim_AlwaysNotApplicable(OrganizationIntegration oi)
public void Status_CloudBillingSync_EnabledFalse_ReturnsInvalid(OrganizationIntegration oi)
{
oi.Type = IntegrationType.CloudBillingSync;
oi.Configuration = JsonSerializer.Serialize(new CloudBillingSyncIntegration
{
Enabled = false,
BillingSyncKey = "test-key",
CloudOrganizationId = Guid.NewGuid()
});
var model = new OrganizationIntegrationResponseModel(oi);
Assert.Equal(OrganizationIntegrationStatus.Invalid, model.Status);
}
[Theory, BitAutoData]
public void Status_CloudBillingSync_EnabledTrue_ReturnsCompleted(OrganizationIntegration oi)
{
oi.Type = IntegrationType.CloudBillingSync;
oi.Configuration = JsonSerializer.Serialize(new CloudBillingSyncIntegration
{
Enabled = true,
BillingSyncKey = "test-key",
CloudOrganizationId = Guid.NewGuid()
});
var model = new OrganizationIntegrationResponseModel(oi);
Assert.Equal(OrganizationIntegrationStatus.Completed, model.Status);
}
[Theory, BitAutoData]
public void Status_Scim_NullConfig_ReturnsInvalid(OrganizationIntegration oi)
{
oi.Type = IntegrationType.Scim;
oi.Configuration = null;
var model = new OrganizationIntegrationResponseModel(oi);
Assert.Equal(OrganizationIntegrationStatus.NotApplicable, model.Status);
model.Configuration = "{}";
Assert.Equal(OrganizationIntegrationStatus.NotApplicable, model.Status);
Assert.Equal(OrganizationIntegrationStatus.Invalid, model.Status);
}
[Theory, BitAutoData]
public void Status_Scim_EnabledFalse_ReturnsInvalid(OrganizationIntegration oi)
{
oi.Type = IntegrationType.Scim;
oi.Configuration = JsonSerializer.Serialize(new ScimIntegration
{
Enabled = false
});
var model = new OrganizationIntegrationResponseModel(oi);
Assert.Equal(OrganizationIntegrationStatus.Invalid, model.Status);
}
[Theory, BitAutoData]
public void Status_Scim_EnabledTrue_ReturnsCompleted(OrganizationIntegration oi)
{
oi.Type = IntegrationType.Scim;
oi.Configuration = JsonSerializer.Serialize(new ScimIntegration
{
Enabled = true
});
var model = new OrganizationIntegrationResponseModel(oi);
Assert.Equal(OrganizationIntegrationStatus.Completed, model.Status);
}
[Theory, BitAutoData]