Skip to content

Commit ad0b7c8

Browse files
authored
Merge branch 'main' into LFXV2-1709
2 parents 4e18ad9 + 91cc688 commit ad0b7c8

19 files changed

Lines changed: 1831 additions & 9 deletions

cmd/committee-api/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ func main() {
106106
usecaseSvc.WithProjectRetriever(projectRetriever),
107107
usecaseSvc.WithUserReader(userReader),
108108
usecaseSvc.WithCommitteePublisher(committeePublisher),
109+
usecaseSvc.WithB2BOrgResolver(service.B2BOrgResolverImpl(ctx)),
109110
)
110111

111112
readCommitteeUseCase := usecaseSvc.NewCommitteeReaderOrchestrator(

cmd/committee-api/service/providers.go

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,11 @@ import (
3131
)
3232

3333
var (
34-
natsStorage port.CommitteeReaderWriter
35-
natsMessaging port.ProjectReader
36-
natsUserReader port.UserReader
37-
natsPublisher port.CommitteePublisher
34+
natsStorage port.CommitteeReaderWriter
35+
natsMessaging port.ProjectReader
36+
natsUserReader port.UserReader
37+
natsB2BOrgResolver port.B2BOrgResolver
38+
natsPublisher port.CommitteePublisher
3839

3940
// expose the NATS client for direct access in subscriptions
4041
natsClient *nats.NATSClient
@@ -92,6 +93,7 @@ func natsInit(ctx context.Context) {
9293
natsStorage = nats.NewStorage(client)
9394
natsMessaging = nats.NewMessageRequest(client)
9495
natsUserReader = nats.NewUserRequest(client)
96+
natsB2BOrgResolver = nats.NewB2BOrgResolver(client)
9597
natsPublisher = nats.NewMessagePublisher(client)
9698
})
9799
}
@@ -231,6 +233,27 @@ func UserReaderImpl(ctx context.Context) port.UserReader {
231233
return userReader
232234
}
233235

236+
// B2BOrgResolverImpl initializes the b2b_org resolver used to validate committee member
237+
// organization.id values (LFXV2-2400). Returns nil in mock mode.
238+
func B2BOrgResolverImpl(ctx context.Context) port.B2BOrgResolver {
239+
repoSource := os.Getenv("REPOSITORY_SOURCE")
240+
if repoSource == "" {
241+
repoSource = "nats"
242+
}
243+
244+
switch repoSource {
245+
case "mock":
246+
return nil
247+
case "nats":
248+
natsInit(ctx)
249+
return natsB2BOrgResolver
250+
default:
251+
log.Fatalf("unsupported b2b org resolver implementation: %s", repoSource)
252+
}
253+
254+
return nil
255+
}
256+
234257
// AuthServiceImpl initializes the authentication service implementation
235258
func AuthServiceImpl(ctx context.Context) port.Authenticator {
236259
var authService port.Authenticator
@@ -852,6 +875,7 @@ func QueueSubscriptions(ctx context.Context, committeeReader port.CommitteeReade
852875
usecaseSvc.WithProjectRetriever(ProjectRetrieverImpl(ctx)),
853876
usecaseSvc.WithUserReader(UserReaderImpl(ctx)),
854877
usecaseSvc.WithCommitteePublisher(CommitteePublisherImpl(ctx)),
878+
usecaseSvc.WithB2BOrgResolver(B2BOrgResolverImpl(ctx)),
855879
),
856880
),
857881
usecaseSvc.WithCommitteeWriterForMessageHandler(CommitteeWriterImpl(ctx)),

cmd/committee-cli/README.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ committee-cli <command> <subcommand> [subcommand flags]
1919
| Env var | Default | Description |
2020
|---|---|---|
2121
| `NATS_URL` | `nats://localhost:4222` | NATS server address |
22+
| `NATS_TIMEOUT` | `120s` | NATS connection dial/timeout (`nats.Timeout`); KV operations use caller context deadlines |
23+
| `OPENSEARCH_URL` | `http://localhost:9200` | OpenSearch base URL (`sync member-cdp-org-id`) |
24+
| `OPENSEARCH_INDEX` | `resources` | OpenSearch resources index (`sync member-cdp-org-id`) |
2225
| `LOG_LEVEL` | `debug` | Log verbosity (e.g. `info`) |
2326

2427
### Commands
@@ -136,6 +139,42 @@ NATS_URL=nats://localhost:4222 \
136139
committee-cli sync reindex-invites --committee-uid=abc-123
137140
```
138141

142+
#### `sync member-cdp-org-id`
143+
144+
Repairs committee members that store a **CDP organization UUID** in `organization.id` (self-serve PR #779). Discovers affected members via OpenSearch (`committee_member` docs with UUID `data.organization.id`), loads each from NATS KV, resolves the canonical **b2b_org Salesforce SFID** from OpenSearch (`object_type=b2b_org`, matched by `data.primary_domain` / `data.website` / `data.name`), and updates through the writer orchestrator (reindexes + fixes the by-organization secondary index).
145+
146+
Use `--committee-uid` or `--member-uid` to scope via indexed NATS reads instead of the OpenSearch discovery query.
147+
148+
Tracked in [LFXV2-2647](https://linuxfoundation.atlassian.net/browse/LFXV2-2647).
149+
150+
**Subcommand flags**
151+
152+
| Flag | Default | Description |
153+
|---|---|---|
154+
| `--committee-uid` | `""` | Limit repair to members of a single committee |
155+
| `--member-uid` | `""` | Limit repair to a single committee member |
156+
| `--opensearch-url` | `$OPENSEARCH_URL` | Override OpenSearch base URL |
157+
| `--opensearch-index` | `$OPENSEARCH_INDEX` | Override OpenSearch resources index |
158+
| `--clear-unresolved` | `false` | When SFID cannot be resolved, clear `organization.id` (keep name/website) |
159+
| `--sleep` | `0` | Wait between each write (e.g. `200ms`, `1s`) |
160+
| `--dry-run` | `true` | Log planned repairs without writing (pass `--dry-run=false` to apply) |
161+
162+
**Examples**
163+
164+
Dry-run:
165+
```sh
166+
NATS_URL=nats://localhost:4222 \
167+
OPENSEARCH_URL=http://localhost:9200 \
168+
committee-cli sync member-cdp-org-id
169+
```
170+
171+
Apply repairs:
172+
```sh
173+
NATS_URL=nats://localhost:4222 \
174+
OPENSEARCH_URL=http://localhost:9200 \
175+
committee-cli sync member-cdp-org-id --dry-run=false --sleep=200ms
176+
```
177+
139178
## Building
140179

141180
### Local binary

0 commit comments

Comments
 (0)