Skip to content

Link User Accounts Based on Common/Matching Auth-Id(email) #566

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

Merged
merged 4 commits into from
Dec 7, 2023
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 @@ -18,4 +18,5 @@ public interface UserRepository extends ReactiveMongoRepository<User, String> {

Flux<User> findByConnections_SourceAndConnections_RawIdIn(String source, Collection<String> rawIds);

Mono<User> findByName(String rawUuid);
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,18 @@ public interface UserService {

Mono<Boolean> bindEmail(User user, String email);

Mono<User> findByAuthUser(AuthUser authUser);
Mono<User> findByAuthUserSourceAndRawId(AuthUser authUser);

Mono<User> findByAuthUserRawId(AuthUser authUser);

Mono<User> createNewUserByAuthUser(AuthUser authUser);

Mono<Void> getUserAvatar(ServerWebExchange exchange, String userId);

Mono<Boolean> addNewConnection(String userId, Connection connection);

Mono<User> addNewConnectionAndReturnUser(String userId, Connection connection);

Mono<Void> deleteProfilePhoto(User visitor);

Mono<Boolean> updatePassword(String userId, String oldPassword, String newPassword);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,10 @@ public Mono<User> findBySourceAndId(String source, String sourceUuid) {
return repository.findByConnections_SourceAndConnections_RawId(source, sourceUuid);
}

public Mono<User> findByName(String rawUuid) {
return repository.findByName(rawUuid);
}

@Override
public Mono<Boolean> saveProfilePhoto(Part filePart, User user) {
String prevAvatar = ObjectUtils.defaultIfNull(user.getAvatar(), "");
Expand Down Expand Up @@ -143,10 +147,15 @@ public Mono<User> update(String id, User updatedUser) {
}

@Override
public Mono<User> findByAuthUser(AuthUser authUser) {
public Mono<User> findByAuthUserSourceAndRawId(AuthUser authUser) {
return findBySourceAndId(authUser.getSource(), authUser.getUid());
}

@Override
public Mono<User> findByAuthUserRawId(AuthUser authUser) {
return findByName(authUser.getUsername());
}

@Override
public Mono<User> createNewUserByAuthUser(AuthUser authUser) {
User newUser = new User();
Expand Down Expand Up @@ -198,6 +207,13 @@ public Mono<Boolean> addNewConnection(String userId, Connection connection) {
.then(Mono.just(true));
}

@Override
public Mono<User> addNewConnectionAndReturnUser(String userId, Connection connection) {
return findById(userId)
.doOnNext(user -> user.getConnections().add(connection))
.flatMap(repository::save);
}

@Override
public Mono<Void> deleteProfilePhoto(User visitor) {
String userAvatar = visitor.getAvatar();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ protected Mono<AuthUser> getAuthUser(AuthToken authToken) {
}
AuthUser authUser = AuthUser.builder()
.uid(MapUtils.getString(map, "sub"))
.username(MapUtils.getString(map, "name"))
.username(MapUtils.getString(map, "email"))
.rawUserInfo(map)
.build();
return Mono.just(authUser);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,14 +161,26 @@ public Mono<Void> loginOrRegister(AuthUser authUser, ServerWebExchange exchange,
}

private Mono<User> updateOrCreateUser(AuthUser authUser) {
return findByAuthUser(authUser)
.flatMap(findByAuthUser -> {
if (findByAuthUser.userExist()) {
User user = findByAuthUser.user();
return findByAuthUserSourceAndRawId(authUser).zipWith(findByAuthUserRawId(authUser))
.flatMap(tuple -> {

FindByAuthUser findByAuthUserFirst = tuple.getT1();
FindByAuthUser findByAuthUserSecond = tuple.getT2();

// If the user is found for the same auth source and id, just update the connection
if (findByAuthUserFirst.userExist()) {
User user = findByAuthUserFirst.user();
updateConnection(authUser, user);
return userService.update(user.getId(), user);
}

//If the user connection is not found with login id, but the user is
// found for the same id in some different connection, then just add a new connection to the user
if(findByAuthUserSecond.userExist()) {
User user = findByAuthUserSecond.user();
return userService.addNewConnectionAndReturnUser(user.getId(), authUser.toAuthConnection());
}

// if the user is logging/registering via OAuth provider for the first time,
// but is not anonymous, then just add a new connection

Expand All @@ -189,8 +201,14 @@ private Mono<User> updateOrCreateUser(AuthUser authUser) {
});
}

protected Mono<FindByAuthUser> findByAuthUser(AuthUser authUser) {
return userService.findByAuthUser(authUser)
protected Mono<FindByAuthUser> findByAuthUserSourceAndRawId(AuthUser authUser) {
return userService.findByAuthUserSourceAndRawId(authUser)
.map(user -> new FindByAuthUser(true, user))
.defaultIfEmpty(new FindByAuthUser(false, null));
}

protected Mono<FindByAuthUser> findByAuthUserRawId(AuthUser authUser) {
return userService.findByAuthUserRawId(authUser)
.map(user -> new FindByAuthUser(true, user))
.defaultIfEmpty(new FindByAuthUser(false, null));
}
Expand Down