{"record":{"id":"10405e95ca9bda35","repo":"bitwarden/server","slug":"organizations-must-not-be-assigned-to-any-provider","errorCode":null,"errorMessage":"Organizations must not be assigned to any Provider.","messagePattern":"Organizations must not be assigned to any Provider\\.","errorType":"exception","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"bitwarden_license/src/Commercial.Core/AdminConsole/Services/ProviderService.cs","lineNumber":489,"sourceCode":"            });\n        }\n\n        await _eventService.LogProviderOrganizationEventAsync(providerOrganization, EventType.ProviderOrganization_Added);\n    }\n\n    public async Task AddOrganizationsToReseller(Guid providerId, IEnumerable<Guid> organizationIds)\n    {\n        var provider = await _providerRepository.GetByIdAsync(providerId);\n        if (provider.Type != ProviderType.Reseller)\n        {\n            throw new BadRequestException(\"Provider must be of type Reseller in order to assign Organizations to it.\");\n        }\n\n        var orgIdsList = organizationIds.ToList();\n        var existingProviderOrganizationsCount = await _providerOrganizationRepository.GetCountByOrganizationIdsAsync(orgIdsList);\n        if (existingProviderOrganizationsCount > 0)\n        {\n            throw new BadRequestException(\"Organizations must not be assigned to any Provider.\");\n        }\n\n        var providerOrganizationsToInsert = orgIdsList.Select(orgId => new ProviderOrganization { ProviderId = providerId, OrganizationId = orgId });\n        var insertedProviderOrganizations = await _providerOrganizationRepository.CreateManyAsync(providerOrganizationsToInsert);\n\n        await _eventService.LogProviderOrganizationEventsAsync(insertedProviderOrganizations.Select(ipo => (ipo, EventType.ProviderOrganization_Added, (DateTime?)null)));\n    }\n\n    private async Task ApplyProviderPriceRateAsync(Organization organization, Provider provider)\n    {\n        // if a provider was created before Nov 6, 2023.If true, the organization plan assigned to that provider is updated to a 2020 plan.\n        if (provider.CreationDate >= Constants.ProviderCreatedPriorNov62023)\n        {\n            return;\n        }\n\n        if (!string.IsNullOrWhiteSpace(organization.GatewaySubscriptionId))\n        {","sourceCodeStart":471,"sourceCodeEnd":507,"githubUrl":"https://github.com/bitwarden/server/blob/e93b962371d80964556f5590c6615f5160a437a1/bitwarden_license/src/Commercial.Core/AdminConsole/Services/ProviderService.cs#L471-L507","documentation":"Thrown by ProviderService.AddOrganizationsToReseller after confirming the provider is a Reseller, when GetCountByOrganizationIdsAsync returns > 0 meaning one or more of the requested organizationIds are already linked to some provider. BadRequestException (HTTP 400).","triggerScenarios":"Bulk-assigning a set of org IDs to a reseller where at least one org already has a ProviderOrganization row (any provider).","commonSituations":"A partial retry of a failed batch where some orgs already linked; an admin who re-submits the whole list after the first org succeeded; duplicate IDs in the request.","solutions":["Call GetCountByOrganizationIdsAsync(orgIds) (or filter GetByOrganizationId per id) and exclude already-linked orgs.","Remove existing ProviderOrganization rows for orgs you intend to reassign before resubmitting.","Dedupe the organizationIds list before submission."],"exampleFix":"// before\nawait providerService.AddOrganizationsToReseller(providerId, orgIds);\n\n// after\nvar linked = orgIds.Where(id =>\n    (await providerOrganizationRepository.GetByOrganizationId(id)) != null);\nvar freeOrgIds = orgIds.Except(linked).Distinct().ToList();\nawait providerService.AddOrganizationsToReseller(providerId, freeOrgIds);","handlingStrategy":"validation","validationCode":"var count = await providerOrganizationRepository.GetCountByOrganizationIdsAsync(orgIds);\nif (count > 0) { /* filter out already-linked orgs */ }","typeGuard":null,"tryCatchPattern":"try { await providerService.AddOrganizationsToReseller(providerId, orgIds); }\ncatch (BadRequestException ex) when (ex.Message.Contains(\"must not be assigned\")) { /* refresh list, retry unlinked */ }","preventionTips":["Dedupe and pre-filter org IDs against existing links.","Make the bulk add idempotent by excluding already-linked orgs."],"tags":["provider","reseller","uniqueness","bad-request"],"backgroundTag":null,"analyzedSha":"e93b962371d80964556f5590c6615f5160a437a1","analyzedAt":"2026-08-13T14:22:19.382Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}