Skip to content

Commit cdb1ee1

Browse files
committed
#1445: API: Create user and add to org
1 parent 8190bea commit cdb1ee1

File tree

4 files changed

+43
-6
lines changed

4 files changed

+43
-6
lines changed

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgApiService.java

+5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.lowcoder.api.usermanagement.view.OrgView;
77
import org.lowcoder.api.usermanagement.view.UpdateOrgRequest;
88
import org.lowcoder.api.usermanagement.view.UpdateRoleRequest;
9+
import org.lowcoder.domain.organization.model.OrgMember;
910
import org.lowcoder.domain.organization.model.Organization;
1011
import org.lowcoder.domain.organization.model.Organization.OrganizationCommonSettings;
1112
import org.lowcoder.infra.annotation.NonEmptyMono;
@@ -23,8 +24,12 @@ public interface OrgApiService {
2324

2425
Mono<Boolean> updateRoleForMember(String orgId, UpdateRoleRequest updateRoleRequest);
2526

27+
Mono<OrgMember> checkVisitorAdminRole(String orgId);
28+
2629
Mono<Boolean> switchCurrentOrganizationTo(String orgId);
2730

31+
Mono<Boolean> switchCurrentOrganizationTo(String userId, String orgId);
32+
2833
Mono<Boolean> deleteLogo(String orgId);
2934

3035
Mono<Boolean> uploadLogo(String orgId, Mono<Part> fileMono);

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgApiServiceImpl.java

+8-4
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,8 @@ public Mono<Boolean> updateRoleForMember(String orgId, UpdateRoleRequest updateR
158158
MemberRole.fromValue(updateRoleRequest.getRole())));
159159
}
160160

161-
private Mono<OrgMember> checkVisitorAdminRole(String orgId) {
161+
@Override
162+
public Mono<OrgMember> checkVisitorAdminRole(String orgId) {
162163
return sessionUserService.getVisitorId()
163164
.flatMap(visitor -> orgMemberService.getOrgMember(orgId, visitor))
164165
.filter(it -> it.getRole() == MemberRole.ADMIN || it.getRole() == MemberRole.SUPER_ADMIN)
@@ -177,15 +178,18 @@ private Mono<Void> checkDeveloperCount(String orgId, String role, String userId)
177178
@Override
178179
public Mono<Boolean> switchCurrentOrganizationTo(String nextCurrentOrgId) {
179180
return sessionUserService.getVisitorId()
180-
.flatMap(it -> orgMemberService.getAllActiveOrgs(it).collectList())
181+
.flatMap(it -> switchCurrentOrganizationTo(it, nextCurrentOrgId));
182+
}
183+
184+
@Override
185+
public Mono<Boolean> switchCurrentOrganizationTo(String userId, String nextCurrentOrgId) {
186+
return orgMemberService.getAllActiveOrgs(userId).collectList()
181187
.defaultIfEmpty(Collections.emptyList())
182188
.flatMap(orgMembers -> {
183189
if (!collectSet(orgMembers, OrgMember::getOrgId).contains(nextCurrentOrgId)) {
184190
return Mono.error(new BizException(BizError.INVALID_ORG_ID, "INVALID_ORG_ID"));
185191
}
186192

187-
String userId = orgMembers.get(0).getUserId();
188-
189193
Optional<OrgMember> previousCurrentOrgMember = orgMembers.stream()
190194
.filter(OrgMember::isCurrentOrg)
191195
.findFirst();

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/UserController.java

+17
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,21 @@
33
import lombok.RequiredArgsConstructor;
44
import org.apache.commons.lang3.StringUtils;
55
import org.lowcoder.api.authentication.dto.OrganizationDomainCheckResult;
6+
import org.lowcoder.api.authentication.service.AuthenticationApiService;
67
import org.lowcoder.api.framework.view.ResponseView;
78
import org.lowcoder.api.home.SessionUserService;
89
import org.lowcoder.api.home.UserHomeApiService;
910
import org.lowcoder.api.usermanagement.view.UpdateUserRequest;
1011
import org.lowcoder.api.usermanagement.view.UserProfileView;
12+
import org.lowcoder.domain.organization.model.MemberRole;
13+
import org.lowcoder.domain.organization.service.OrgMemberService;
1114
import org.lowcoder.domain.user.constant.UserStatusType;
1215
import org.lowcoder.domain.user.model.User;
1316
import org.lowcoder.domain.user.model.UserDetail;
1417
import org.lowcoder.domain.user.service.UserService;
1518
import org.lowcoder.domain.user.service.UserStatusService;
1619
import org.lowcoder.sdk.config.CommonConfig;
20+
import org.lowcoder.sdk.constants.AuthSourceConstants;
1721
import org.lowcoder.sdk.exception.BizError;
1822
import org.springframework.http.HttpStatus;
1923
import org.springframework.http.codec.multipart.Part;
@@ -35,6 +39,19 @@ public class UserController implements UserEndpoints
3539
private final UserStatusService userStatusService;
3640
private final UserApiService userApiService;
3741
private final CommonConfig commonConfig;
42+
private final AuthenticationApiService authenticationApiService;
43+
private final OrgMemberService orgMemberService;
44+
45+
@Override
46+
public Mono<ResponseView<?>> createUserAndAddToOrg(@PathVariable String orgId, CreateUserRequest request) {
47+
return orgApiService.checkVisitorAdminRole(orgId).flatMap(__ ->
48+
authenticationApiService.authenticateByForm(request.email(), request.password(),
49+
AuthSourceConstants.EMAIL, true, null, orgId))
50+
.flatMap(authUser -> userService.createNewUserByAuthUser(authUser, false))
51+
.delayUntil(user -> orgMemberService.tryAddOrgMember(orgId, user.getId(), MemberRole.MEMBER))
52+
.delayUntil(user -> orgApiService.switchCurrentOrganizationTo(user.getId(), orgId))
53+
.map(ResponseView::success);
54+
}
3855

3956
@Override
4057
public Mono<ResponseView<?>> getUserProfile(ServerWebExchange exchange) {

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/UserEndpoints.java

+13-2
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,20 @@
2525

2626
@RestController
2727
@RequestMapping(value = {Url.USER_URL, NewUrl.USER_URL})
28-
public interface UserEndpoints
28+
public interface UserEndpoints
2929
{
3030
public static final String TAG_USER_MANAGEMENT = "User APIs";
3131
public static final String TAG_USER_PASSWORD_MANAGEMENT = "User Password APIs";
3232
public static final String TAG_USER_PROFILE_PHOTO_MANAGEMENT = "User Profile Photo APIs";
33-
33+
@Operation(
34+
tags = TAG_USER_MANAGEMENT,
35+
operationId = "createUserAndAddToOrg",
36+
summary = "Create user and add to the org",
37+
description = "Create a new user and add to specified organization."
38+
)
39+
@PostMapping("/new/{orgId}")
40+
public Mono<ResponseView<?>> createUserAndAddToOrg(@PathVariable String orgId, @RequestBody CreateUserRequest request);
41+
3442
@Operation(
3543
tags = TAG_USER_MANAGEMENT,
3644
operationId = "getUserProfile",
@@ -181,4 +189,7 @@ public record UpdatePasswordRequest(String oldPassword, String newPassword) {
181189
public record MarkUserStatusRequest(String type, Object value) {
182190
}
183191

192+
public record CreateUserRequest(String email, String password) {
193+
}
194+
184195
}

0 commit comments

Comments
 (0)