Skip to content

Commit 70a2284

Browse files
committed
Link accounts based on common authid(email)
1 parent c822a45 commit 70a2284

File tree

4 files changed

+48
-8
lines changed

4 files changed

+48
-8
lines changed

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/repository/UserRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ public interface UserRepository extends ReactiveMongoRepository<User, String> {
1616

1717
Mono<User> findByConnections_SourceAndConnections_RawId(String source, String rawId);
1818

19+
Flux<User> findByConnections_RawId(String rawId);
20+
1921
Flux<User> findByConnections_SourceAndConnections_RawIdIn(String source, Collection<String> rawIds);
2022

2123
}

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserService.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,18 @@ public interface UserService {
3232

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

35-
Mono<User> findByAuthUser(AuthUser authUser);
35+
Mono<User> findByAuthUserSourceAndRawId(AuthUser authUser);
36+
37+
Flux<User> findByAuthUserRawId(AuthUser authUser);
3638

3739
Mono<User> createNewUserByAuthUser(AuthUser authUser);
3840

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

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

45+
Mono<User> addNewConnectionAndReturnUser(String userId, Connection connection);
46+
4347
Mono<Void> deleteProfilePhoto(User visitor);
4448

4549
Mono<Boolean> updatePassword(String userId, String oldPassword, String newPassword);

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ public Mono<User> findBySourceAndId(String source, String sourceUuid) {
111111
return repository.findByConnections_SourceAndConnections_RawId(source, sourceUuid);
112112
}
113113

114+
public Flux<User> findByRawId(String rawUuid) {
115+
return repository.findByConnections_RawId(rawUuid);
116+
}
117+
114118
@Override
115119
public Mono<Boolean> saveProfilePhoto(Part filePart, User user) {
116120
String prevAvatar = ObjectUtils.defaultIfNull(user.getAvatar(), "");
@@ -143,10 +147,15 @@ public Mono<User> update(String id, User updatedUser) {
143147
}
144148

145149
@Override
146-
public Mono<User> findByAuthUser(AuthUser authUser) {
150+
public Mono<User> findByAuthUserSourceAndRawId(AuthUser authUser) {
147151
return findBySourceAndId(authUser.getSource(), authUser.getUid());
148152
}
149153

154+
@Override
155+
public Flux<User> findByAuthUserRawId(AuthUser authUser) {
156+
return findByRawId(authUser.getUid());
157+
}
158+
150159
@Override
151160
public Mono<User> createNewUserByAuthUser(AuthUser authUser) {
152161
User newUser = new User();
@@ -198,6 +207,13 @@ public Mono<Boolean> addNewConnection(String userId, Connection connection) {
198207
.then(Mono.just(true));
199208
}
200209

210+
@Override
211+
public Mono<User> addNewConnectionAndReturnUser(String userId, Connection connection) {
212+
return findById(userId)
213+
.doOnNext(user -> user.getConnections().add(connection))
214+
.flatMap(repository::save);
215+
}
216+
201217
@Override
202218
public Mono<Void> deleteProfilePhoto(User visitor) {
203219
String userAvatar = visitor.getAvatar();

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,26 @@ public Mono<Void> loginOrRegister(AuthUser authUser, ServerWebExchange exchange,
155155
}
156156

157157
private Mono<User> updateOrCreateUser(AuthUser authUser) {
158-
return findByAuthUser(authUser)
159-
.flatMap(findByAuthUser -> {
160-
if (findByAuthUser.userExist()) {
161-
User user = findByAuthUser.user();
158+
return findByAuthUserSourceAndRawId(authUser).zipWith(findByAuthUserRawId(authUser))
159+
.flatMap(tuple -> {
160+
161+
FindByAuthUser findByAuthUserFirst = tuple.getT1();
162+
FindByAuthUser findByAuthUserSecond = tuple.getT2();
163+
164+
// If the user is found for the same auth source and id, just update the connection
165+
if (findByAuthUserFirst.userExist()) {
166+
User user = findByAuthUserFirst.user();
162167
updateConnection(authUser, user);
163168
return userService.update(user.getId(), user);
164169
}
165170

171+
//If the user connection is not found with login id, but the user is
172+
// found for the same id in some different connection, then just add a new connection to the user
173+
if(findByAuthUserSecond.userExist()) {
174+
User user = findByAuthUserSecond.user();
175+
return userService.addNewConnectionAndReturnUser(user.getId(), authUser.toAuthConnection());
176+
}
177+
166178
// if the user is logging/registering via OAuth provider for the first time,
167179
// but is not anonymous, then just add a new connection
168180

@@ -183,12 +195,18 @@ private Mono<User> updateOrCreateUser(AuthUser authUser) {
183195
});
184196
}
185197

186-
protected Mono<FindByAuthUser> findByAuthUser(AuthUser authUser) {
187-
return userService.findByAuthUser(authUser)
198+
protected Mono<FindByAuthUser> findByAuthUserSourceAndRawId(AuthUser authUser) {
199+
return userService.findByAuthUserSourceAndRawId(authUser)
188200
.map(user -> new FindByAuthUser(true, user))
189201
.defaultIfEmpty(new FindByAuthUser(false, null));
190202
}
191203

204+
protected Mono<FindByAuthUser> findByAuthUserRawId(AuthUser authUser) {
205+
return userService.findByAuthUserRawId(authUser).collectList()
206+
.map(user -> new FindByAuthUser(true, user.stream().findFirst().get()))
207+
.defaultIfEmpty(new FindByAuthUser(false, null));
208+
}
209+
192210
/**
193211
* Update the connection after re-authenticating
194212
*/

0 commit comments

Comments
 (0)