Skip to content

Commit 6e1d6ce

Browse files
committed
fix(review): address PR #135 review feedback
Address review comments from copilot-pull-request-reviewer and coderabbitai: - reindex_invites.go: apply KV backfill to fresh invite from GetInvite - reindex_invites_test.go: assert access publish and committee cache hits - total_members_attribute_test.go: fix invitesByCommittee typo, track GetBase calls - committee_service.go: log GetSettings failures for organization_required - committee_service_test.go: assert committee_name and organization_required - gen/http: restore accept-invite optional-body patches reverted by apigen Resolves 10 review threads. Signed-off-by: Andres Tobon <andrest2455@gmail.com>
1 parent 7dc6d6b commit 6e1d6ce

12 files changed

Lines changed: 51 additions & 28 deletions

File tree

cmd/committee-api/service/committee_service.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,11 @@ func (s *committeeServicesrvc) CreateInvite(ctx context.Context, p *committeeser
660660
}
661661

662662
// Best-effort: settings drive organization_required; missing settings means false.
663-
committeeSettings, _, _ := s.storage.GetSettings(ctx, p.UID)
663+
committeeSettings, _, settingsErr := s.storage.GetSettings(ctx, p.UID)
664+
if settingsErr != nil {
665+
slog.WarnContext(ctx, "CreateInvite: failed to get committee settings for organization_required",
666+
"committee_uid", p.UID, "error", settingsErr)
667+
}
664668
orgRequired := committeeBase.EnableVoting || (committeeSettings != nil && committeeSettings.BusinessEmailRequired)
665669

666670
var inviteOrgID, inviteOrgName, inviteOrgWebsite *string
@@ -1338,7 +1342,11 @@ func (s *committeeServicesrvc) enrichInviteFromCommittee(ctx context.Context, in
13381342
if invite.CommitteeName == "" {
13391343
invite.CommitteeName = cb.Name
13401344
}
1341-
settings, _, _ := s.storage.GetSettings(ctx, committeeUID)
1345+
settings, _, settingsErr := s.storage.GetSettings(ctx, committeeUID)
1346+
if settingsErr != nil {
1347+
slog.WarnContext(ctx, "enrichInviteFromCommittee: failed to get committee settings",
1348+
"committee_uid", committeeUID, "error", settingsErr)
1349+
}
13421350
invite.OrganizationRequired = cb.EnableVoting || (settings != nil && settings.BusinessEmailRequired)
13431351
}
13441352

cmd/committee-api/service/committee_service_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,8 @@ func TestGetInvite(t *testing.T) {
681681
require.NoError(t, err)
682682
require.NotNil(t, result)
683683
assert.Equal(t, tt.payload.InviteUID, *result.UID)
684+
assert.Equal(t, "Technical Advisory Committee", *result.CommitteeName)
685+
assert.True(t, *result.OrganizationRequired)
684686
}
685687
})
686688
}
@@ -732,6 +734,8 @@ func TestCreateInvite(t *testing.T) {
732734
assert.Equal(t, tt.payload.UID, *result.CommitteeUID)
733735
assert.Equal(t, tt.payload.InviteeEmail, *result.InviteeEmail)
734736
assert.Equal(t, "pending", result.Status)
737+
assert.Equal(t, "Technical Advisory Committee", *result.CommitteeName)
738+
assert.True(t, *result.OrganizationRequired)
735739

736740
require.Len(t, sender.calls, 1)
737741
call := sender.calls[0]

cmd/committee-cli/commands/sync/reindex_invites.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -140,19 +140,27 @@ func (s *reindexInvitesSubcommand) Run(ctx context.Context, rc commands.RunConte
140140
failed := false
141141

142142
if needsKVUpdate {
143-
_, rev, getErr := rc.CommitteeReader.GetInvite(ctx, invite.UID)
143+
freshInvite, rev, getErr := rc.CommitteeReader.GetInvite(ctx, invite.UID)
144144
if getErr != nil {
145145
slog.WarnContext(ctx, "failed to fetch invite revision for KV update",
146146
"error", getErr,
147147
"invite_uid", invite.UID,
148148
)
149149
failed = true
150-
} else if updateErr := rc.CommitteeInviteWriter.UpdateInvite(ctx, invite, rev); updateErr != nil {
151-
slog.WarnContext(ctx, "failed to update invite in NATS KV",
152-
"error", updateErr,
153-
"invite_uid", invite.UID,
154-
)
155-
failed = true
150+
} else {
151+
if freshInvite.CommitteeName == "" && snap.name != "" {
152+
freshInvite.CommitteeName = snap.name
153+
}
154+
freshInvite.OrganizationRequired = snap.organizationRequired
155+
if updateErr := rc.CommitteeInviteWriter.UpdateInvite(ctx, freshInvite, rev); updateErr != nil {
156+
slog.WarnContext(ctx, "failed to update invite in NATS KV",
157+
"error", updateErr,
158+
"invite_uid", invite.UID,
159+
)
160+
failed = true
161+
} else {
162+
invite = freshInvite
163+
}
156164
}
157165
}
158166

cmd/committee-cli/commands/sync/reindex_invites_test.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ func TestReindexInvites_NewInvite_NoKVUpdate(t *testing.T) {
152152
require.NoError(t, err)
153153
assert.Empty(t, iw.updated, "no KV write expected when fields already match")
154154
assert.Equal(t, 1, pub.indexerCalls)
155+
assert.Equal(t, 1, pub.accessCalls)
155156
}
156157

157158
func TestReindexInvites_OrgRequiredMismatch_UpdatesKV(t *testing.T) {
@@ -236,11 +237,6 @@ func TestReindexInvites_FilterByCommitteeUID(t *testing.T) {
236237
}
237238

238239
func TestReindexInvites_CommitteeCache_FetchedOncePerCommittee(t *testing.T) {
239-
fetchCount := 0
240-
// Use a custom reader that counts GetBase calls by piggy-backing on baseErr.
241-
// We use a regular mockReader but verify via the committee cache: two invites for
242-
// the same committee should result in only one publish pair each, and the bases
243-
// map having one entry verifies the cache lookup path via the existing mock.
244240
r := &mockReader{
245241
bases: map[string]*model.CommitteeBase{
246242
"c1": {Name: "TSC"},
@@ -250,12 +246,12 @@ func TestReindexInvites_CommitteeCache_FetchedOncePerCommittee(t *testing.T) {
250246
{UID: "i2", CommitteeUID: "c1", CommitteeName: "TSC", Status: "pending"},
251247
},
252248
}
253-
_ = fetchCount
254249
iw := &mockInviteWriter{}
255250
pub := &mockPublisher{}
256251

257252
err := (&reindexInvitesSubcommand{}).Run(context.Background(), newReindexRC(r, iw, pub))
258253
require.NoError(t, err)
254+
assert.Equal(t, 1, r.getBaseCalls, "committee base should be fetched once per unique committee")
259255
assert.Equal(t, 2, pub.indexerCalls, "both invites published")
260256
}
261257

cmd/committee-cli/commands/sync/total_members_attribute_test.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,19 @@ type mockReader struct {
2727
settings map[string]*model.CommitteeSettings
2828
settingsErr map[string]error
2929

30-
invites []*model.CommitteeInvite
31-
invitesByCommitte map[string][]*model.CommitteeInvite
32-
inviteRevision map[string]uint64
33-
inviteGetErr map[string]error
30+
invites []*model.CommitteeInvite
31+
invitesByCommittee map[string][]*model.CommitteeInvite
32+
inviteRevision map[string]uint64
33+
inviteGetErr map[string]error
34+
getBaseCalls int
3435
}
3536

3637
func (r *mockReader) ListAllUIDs(_ context.Context) ([]string, error) {
3738
return r.uids, r.listUIDErr
3839
}
3940

4041
func (r *mockReader) GetBase(_ context.Context, uid string) (*model.CommitteeBase, uint64, error) {
42+
r.getBaseCalls++
4143
if err, ok := r.baseErr[uid]; ok {
4244
return nil, 0, err
4345
}
@@ -87,8 +89,8 @@ func (r *mockReader) GetInvite(_ context.Context, uid string) (*model.CommitteeI
8789
return nil, rev, nil
8890
}
8991
func (r *mockReader) ListInvites(_ context.Context, committeeUID string) ([]*model.CommitteeInvite, error) {
90-
if r.invitesByCommitte != nil {
91-
return r.invitesByCommitte[committeeUID], nil
92+
if r.invitesByCommittee != nil {
93+
return r.invitesByCommittee[committeeUID], nil
9294
}
9395
var out []*model.CommitteeInvite
9496
for _, inv := range r.invites {

gen/http/cli/committee/cli.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gen/http/committee_service/client/cli.go

Lines changed: 6 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gen/http/committee_service/client/types.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gen/http/openapi.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

gen/http/openapi.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1377,7 +1377,7 @@ paths:
13771377
- name: Accept-InviteRequestBody
13781378
in: body
13791379
description: Optional JSON body
1380-
required: true
1380+
required: false
13811381
schema:
13821382
$ref: '#/definitions/AcceptInviteOptionalBody'
13831383
responses:

0 commit comments

Comments
 (0)