Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Invite users once triggered should not be cancellable. #2401

Merged
merged 3 commits into from
Dec 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ public Mono<ResponseDTO<Boolean>> confirmInviteUser(@RequestBody User inviteUser
*/
@PostMapping("/invite")
public Mono<ResponseDTO<List<User>>> inviteUsers(@RequestBody InviteUsersDTO inviteUsersDTO, @RequestHeader("Origin") String originHeader) {
return service.inviteUsers(inviteUsersDTO, originHeader).collectList()
return service.inviteUsers(inviteUsersDTO, originHeader)
.map(users -> new ResponseDTO<>(HttpStatus.OK.value(), users, null));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
import com.appsmith.server.domains.User;
import com.appsmith.server.dtos.InviteUsersDTO;
import com.appsmith.server.dtos.ResetUserPasswordDTO;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.List;

public interface UserService extends CrudService<User, String> {

Mono<User> findByEmail(String email);
Expand All @@ -29,5 +30,5 @@ public interface UserService extends CrudService<User, String> {

Mono<User> userCreate(User user);

Flux<User> inviteUsers(InviteUsersDTO inviteUsersDTO, String originHeader);
Mono<List<User>> inviteUsers(InviteUsersDTO inviteUsersDTO, String originHeader);
}
Original file line number Diff line number Diff line change
Expand Up @@ -568,20 +568,20 @@ public Mono<User> update(String id, User userUpdate) {
* @return Publishes the invited users, after being saved with the new organization ID.
*/
@Override
public Flux<User> inviteUsers(InviteUsersDTO inviteUsersDTO, String originHeader) {
public Mono<List<User>> inviteUsers(InviteUsersDTO inviteUsersDTO, String originHeader) {

if (originHeader == null || originHeader.isBlank()) {
return Flux.error(new AppsmithException(AppsmithError.INVALID_PARAMETER, FieldName.ORIGIN));
return Mono.error(new AppsmithException(AppsmithError.INVALID_PARAMETER, FieldName.ORIGIN));
}

List<String> originalUsernames = inviteUsersDTO.getUsernames();

if (originalUsernames == null || originalUsernames.isEmpty()) {
return Flux.error(new AppsmithException(AppsmithError.INVALID_PARAMETER, FieldName.USERNAMES));
return Mono.error(new AppsmithException(AppsmithError.INVALID_PARAMETER, FieldName.USERNAMES));
}

if (inviteUsersDTO.getRoleName() == null || inviteUsersDTO.getRoleName().isEmpty()) {
return Flux.error(new AppsmithException(AppsmithError.INVALID_PARAMETER, FieldName.ROLE));
return Mono.error(new AppsmithException(AppsmithError.INVALID_PARAMETER, FieldName.ROLE));
}

List<String> usernames = new ArrayList<>();
Expand Down Expand Up @@ -654,7 +654,7 @@ public Flux<User> inviteUsers(InviteUsersDTO inviteUsersDTO, String originHeader
});

// Add organization id to each invited user
Flux<User> usersUpdatedWithOrgMono = inviteUsersFlux
Mono<List<User>> usersUpdatedWithOrgMono = inviteUsersFlux
.flatMap(user -> Mono.zip(Mono.just(user), organizationMono))
// zipping with organizationMono to ensure that the orgId is checked before updating the user object.
.flatMap(tuple -> {
Expand All @@ -671,12 +671,19 @@ public Flux<User> inviteUsers(InviteUsersDTO inviteUsersDTO, String originHeader

//Lets save the updated user object
return repository.save(invitedUser);
});
})
.collectList();

// Trigger the flow to first add the users to the organization and then update each user with the organizationId
// added to the user's list of organizations.
return organizationWithUsersAddedMono
.thenMany(usersUpdatedWithOrgMono);
Mono<List<User>> triggerAddUserOrganizationFinalFlowMono = organizationWithUsersAddedMono
.then(usersUpdatedWithOrgMono);

// Use a synchronous sink which does not take subscription cancellations into account. This that even if the
// subscriber has cancelled its subscription, the create method will still generates its event.
return Mono.create(sink -> triggerAddUserOrganizationFinalFlowMono
.subscribe(sink::success, sink::error, null, sink.currentContext())
);
}

private Mono<User> createNewUserAndSendInviteEmail(String email, String originHeader, Map<String, String> params) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -335,8 +335,7 @@ public void addExistingUserToOrganizationAsAdmin() {
inviteUsersDTO.setOrgId(organization1.getId());
inviteUsersDTO.setRoleName(AppsmithRole.ORGANIZATION_ADMIN.getName());

return userService.inviteUsers(inviteUsersDTO, "http://localhost:8080")
.collectList();
return userService.inviteUsers(inviteUsersDTO, "http://localhost:8080");
})
.cache();

Expand Down Expand Up @@ -395,8 +394,7 @@ public void addNewUserToOrganizationAsAdmin() {
inviteUsersDTO.setOrgId(organization1.getId());
inviteUsersDTO.setRoleName(AppsmithRole.ORGANIZATION_ADMIN.getName());

return userService.inviteUsers(inviteUsersDTO, "http://localhost:8080")
.collectList();
return userService.inviteUsers(inviteUsersDTO, "http://localhost:8080");
})
.cache();

Expand Down Expand Up @@ -468,8 +466,7 @@ public void addNewUserToOrganizationAsViewer() {
inviteUsersDTO.setOrgId(organization1.getId());
inviteUsersDTO.setRoleName(AppsmithRole.ORGANIZATION_VIEWER.getName());

return userService.inviteUsers(inviteUsersDTO, "http://localhost:8080")
.collectList();
return userService.inviteUsers(inviteUsersDTO, "http://localhost:8080");
})
.cache();

Expand Down Expand Up @@ -857,8 +854,7 @@ public void addNewUsersBulkToOrganizationAsViewer() {
inviteUsersDTO.setOrgId(organization1.getId());
inviteUsersDTO.setRoleName(AppsmithRole.ORGANIZATION_VIEWER.getName());

return userService.inviteUsers(inviteUsersDTO, "http://localhost:8080")
.collectList();
return userService.inviteUsers(inviteUsersDTO, "http://localhost:8080");
})
.cache();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -361,8 +361,7 @@ public void signUpAfterBeingInvitedToAppsmithOrganization() {
inviteUsersDTO.setOrgId(organization1.getId());
inviteUsersDTO.setRoleName(AppsmithRole.ORGANIZATION_VIEWER.getName());

return userService.inviteUsers(inviteUsersDTO, "http://localhost:8080")
.collectList();
return userService.inviteUsers(inviteUsersDTO, "http://localhost:8080");
}).block();

// Now Sign Up as the new user
Expand Down
Loading