using Bit.Core.Entities; using Bit.Core.Vault.Entities; using Bit.Seeder.Factories; using Bit.Seeder.Models; using Bit.Seeder.Pipeline; namespace Bit.Seeder.Steps; /// /// Loads cipher items from a fixture and creates encrypted cipher entities. /// internal sealed class CreateCiphersStep(string fixtureName) : IStep { public void Execute(SeederContext context) { var orgId = context.RequireOrgId(); var orgKey = context.RequireOrgKey(); var seedFile = context.GetSeedReader().Read($"ciphers.{fixtureName}"); var collectionIds = context.Registry.CollectionIds; var ciphers = new List(); var collectionCiphers = new List(); for (var i = 0; i < seedFile.Items.Count; i++) { var item = seedFile.Items[i]; var cipher = item.Type switch { "login" => LoginCipherSeeder.CreateFromSeed(orgKey, item, organizationId: orgId), "card" => CardCipherSeeder.CreateFromSeed(orgKey, item, organizationId: orgId), "identity" => IdentityCipherSeeder.CreateFromSeed(orgKey, item, organizationId: orgId), "secureNote" => SecureNoteCipherSeeder.CreateFromSeed(orgKey, item, organizationId: orgId), _ => throw new InvalidOperationException($"Unknown cipher type: {item.Type}") }; ciphers.Add(cipher); // Collection assignment (mirrors GenerateCiphersStep logic) if (collectionIds.Count <= 0) { continue; } collectionCiphers.Add(new CollectionCipher { CipherId = cipher.Id, CollectionId = collectionIds[i % collectionIds.Count] }); // Every 3rd cipher gets assigned to an additional collection if (i % 3 == 0 && collectionIds.Count > 1) { collectionCiphers.Add(new CollectionCipher { CipherId = cipher.Id, CollectionId = collectionIds[(i + 1) % collectionIds.Count] }); } } context.Ciphers.AddRange(ciphers); context.CollectionCiphers.AddRange(collectionCiphers); } }