Skip to content

Commit

Permalink
satellite/console: only return unexpired project invitations to user
Browse files Browse the repository at this point in the history
This change causes users to be served only project member invitations
that have not expired. If expired invitations are encountered during
processing of an invitation listing request, they will be removed.

References #5855

Change-Id: I6f621305f4f0a993953eb40a4dbd2375493f02e3
  • Loading branch information
jewharton authored and Storj Robot committed Jun 13, 2023
1 parent 8acb1ee commit d394249
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 9 deletions.
25 changes: 24 additions & 1 deletion satellite/console/service.go
Expand Up @@ -3445,7 +3445,30 @@ func (s *Service) GetUserProjectInvitations(ctx context.Context) (_ []ProjectInv
return nil, Error.Wrap(err)
}

return invites, nil
var active []ProjectInvitation
var deleteErrs []error
var expiredIDs []string
for _, invite := range invites {
if time.Now().After(invite.CreatedAt.Add(s.config.ProjectInvitationExpiration)) {
err := s.store.ProjectInvitations().Delete(ctx, invite.ProjectID, invite.Email)
if err != nil {
deleteErrs = append(deleteErrs, err)
expiredIDs = append(expiredIDs, invite.ProjectID.String())
}
continue
}
active = append(active, invite)
}

if len(deleteErrs) != 0 {
s.log.Warn("error deleting expired project invitations",
zap.Errors("errors", deleteErrs),
zap.String("email", user.Email),
zap.Strings("projectIDs", expiredIDs),
)
}

return active, nil
}

// ProjectInvitationResponse represents a response to a project member invitation.
Expand Down
27 changes: 19 additions & 8 deletions satellite/console/service_test.go
Expand Up @@ -1975,14 +1975,7 @@ func TestProjectInvitations(t *testing.T) {
return project
}

addInvite := func(t *testing.T, ctx context.Context, project *console.Project, email string, createdAt time.Time) *console.ProjectInvitation {
invite, err := sat.DB.Console().ProjectInvitations().Insert(ctx, &console.ProjectInvitation{
ProjectID: project.ID,
Email: email,
InviterID: &project.OwnerID,
})
require.NoError(t, err)

setInviteDate := func(ctx context.Context, invite *console.ProjectInvitation, createdAt time.Time) *console.ProjectInvitation {
result, err := sat.DB.Testing().RawDB().ExecContext(ctx,
"UPDATE project_invitations SET created_at = $1 WHERE project_id = $2 AND email = $3",
createdAt, invite.ProjectID, strings.ToUpper(invite.Email),
Expand All @@ -1993,9 +1986,22 @@ func TestProjectInvitations(t *testing.T) {
require.NoError(t, err)
require.EqualValues(t, 1, count)

invite, err = sat.DB.Console().ProjectInvitations().Get(ctx, invite.ProjectID, invite.Email)
require.NoError(t, err)
return invite
}

addInvite := func(t *testing.T, ctx context.Context, project *console.Project, email string, createdAt time.Time) *console.ProjectInvitation {
invite, err := sat.DB.Console().ProjectInvitations().Insert(ctx, &console.ProjectInvitation{
ProjectID: project.ID,
Email: email,
InviterID: &project.OwnerID,
})
require.NoError(t, err)

return setInviteDate(ctx, invite, createdAt)
}

t.Run("get invitation", func(t *testing.T) {
user, ctx := getUserAndCtx(t)

Expand All @@ -2011,6 +2017,11 @@ func TestProjectInvitations(t *testing.T) {
require.Equal(t, invite.Email, invites[0].Email)
require.Equal(t, invite.InviterID, invites[0].InviterID)
require.WithinDuration(t, invite.CreatedAt, invites[0].CreatedAt, time.Second)

setInviteDate(ctx, invite, time.Now().Add(-sat.Config.Console.ProjectInvitationExpiration))
invites, err = service.GetUserProjectInvitations(ctx)
require.NoError(t, err)
require.Empty(t, invites)
})

t.Run("accept invitation", func(t *testing.T) {
Expand Down

0 comments on commit d394249

Please sign in to comment.