Skip to content

Commit b0078ef

Browse files
Merge branch 'dev' into feature-funnelChart
2 parents 0531190 + 6e090b5 commit b0078ef

File tree

12 files changed

+70
-34
lines changed

12 files changed

+70
-34
lines changed

client/packages/lowcoder-comps/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lowcoder-comps",
3-
"version": "2.5.4",
3+
"version": "2.5.5",
44
"type": "module",
55
"license": "MIT",
66
"dependencies": {

client/packages/lowcoder/src/pages/editor/appEditorInternal.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,18 @@ function useSaveComp(
5353
if (!comp || comp === prevComp) {
5454
return;
5555
}
56+
5657
const curJson = comp.toJsonValue();
5758
const curJsonStr = JSON.stringify(curJson);
5859

59-
6060
if (!Boolean(prevAppId) && Boolean(applicationId)) {
6161
return setPrevAppId(applicationId);
6262
}
6363
if (prevAppId !== applicationId) {
6464
return setPrevAppId(applicationId);
6565
}
6666
if (!Boolean(prevJsonStr) && Boolean(curJsonStr)) {
67+
setPrevComp(comp)
6768
return setPrevJsonStr(curJsonStr);
6869
}
6970
if (prevJsonStr === curJsonStr) {
@@ -84,7 +85,7 @@ function useSaveComp(
8485
setPrevComp(comp);
8586
setPrevJsonStr(curJsonStr);
8687
setPrevAppId(applicationId);
87-
}, [comp, prevAppId, applicationId, prevComp, prevJsonStr, readOnly, dispatch]);
88+
}, [comp, applicationId, readOnly, dispatch]);
8889
}
8990

9091
interface AppEditorInternalViewProps {

client/packages/lowcoder/src/pages/userAuth/formLoginSteps.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ const StepHeader = (props : {
6666
title: string,
6767
}) => (
6868
<Flex justify="center" style={{marginBottom: '22px'}}>
69-
<h3 style={{margin: 0}}>{props.title}</h3>
69+
<h3 style={{margin: 0, padding: '2px 0 0 8px'}}>{props.title}</h3>
7070
</Flex>
7171
)
7272

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/repository/ApplicationRepository.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,21 @@ public interface ApplicationRepository extends ReactiveMongoRepository<Applicati
2929
@Aggregation(pipeline = {"{ $match: { gid: ?0 } }", "{ $project: { 'editingApplicationDSL.settings': 1, _id: 1, gid: 1, organizationId: 1, name: 1, applicationType: 1, applicationStatus: 1, publicToAll: 1, publicToMarketplace: 1, agencyProfile: 1, editingUserId: 1, lastEditedAt: 1, createdAt: 1, updatedAt: 1, createdBy: 1, modifiedBy: 1, _class: 1}}"})
3030
Flux<Application> findByGid(@Nonnull String gid);
3131

32+
@Aggregation(pipeline = {"{ $match: { slug: ?0 } }", "{ $project: { 'editingApplicationDSL.settings': 1, _id: 1, gid: 1, organizationId: 1, name: 1, applicationType: 1, applicationStatus: 1, publicToAll: 1, publicToMarketplace: 1, agencyProfile: 1, editingUserId: 1, lastEditedAt: 1, createdAt: 1, updatedAt: 1, createdBy: 1, modifiedBy: 1, _class: 1}}"})
33+
Flux<Application> findBySlug(@Nonnull String slug);
34+
3235
Mono<Long> countByOrganizationIdAndApplicationStatus(String organizationId, ApplicationStatus applicationStatus);
3336

3437
@Query("{$or : [{'publishedApplicationDSL.queries.datasourceId':?0},{'editingApplicationDSL.queries.datasourceId':?0}]}")
3538
Flux<Application> findByDatasourceId(String datasourceId);
3639

3740
Flux<Application> findByIdIn(Collection<String> ids);
3841
Flux<Application> findByGidIn(Collection<String> ids);
42+
Flux<Application> findBySlugIn(Collection<String> slugs);
3943

4044
Flux<Application> findByCreatedByAndIdIn(String userId, Collection<String> ids);
4145
Flux<Application> findByCreatedByAndGidIn(String userId, Collection<String> gids);
46+
Flux<Application> findByCreatedByAndSlugIn(String userId, Collection<String> slugs);
4247

4348
/**
4449
* Filter public applications from list of supplied IDs
@@ -67,6 +72,8 @@ public interface ApplicationRepository extends ReactiveMongoRepository<Applicati
6772
* Find all agency applications
6873
*/
6974
Flux<Application> findByPublicToAllIsTrueAndAgencyProfileIsTrue();
70-
Mono<Boolean> existsBySlug(String slug);
75+
76+
@Query("{ 'organizationId': ?0, 'slug': ?1 }")
77+
Mono<Boolean> existsByOrganizationIdAndSlug(String organizationId, String slug);
7178

7279
}

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationServiceImpl.java

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.lowcoder.domain.permission.model.ResourceType;
1919
import org.lowcoder.domain.permission.service.ResourcePermissionService;
2020
import org.lowcoder.domain.user.repository.UserRepository;
21+
import org.lowcoder.domain.util.SlugUtils;
2122
import org.lowcoder.infra.annotation.NonEmptyMono;
2223
import org.lowcoder.infra.mongo.MongoUpsertHelper;
2324
import org.lowcoder.sdk.constants.FieldName;
@@ -60,9 +61,13 @@ public Mono<Application> findByIdWithoutDsl(String id) {
6061
return Mono.error(new BizException(BizError.INVALID_PARAMETER, "INVALID_PARAMETER", FieldName.ID));
6162
}
6263

63-
if(FieldName.isGID(id))
64-
return Mono.from(repository.findByGid(id)).switchIfEmpty(Mono.error(new BizException(BizError.NO_RESOURCE_FOUND, "CANT_FIND_APPLICATION", id)));
65-
return repository.findById(id)
64+
return Mono.from(repository.findBySlug(id))
65+
.switchIfEmpty(
66+
Mono.defer(() -> {
67+
if (FieldName.isGID(id))
68+
return Mono.from(repository.findByGid(id));
69+
return repository.findById(id);
70+
}))
6671
.switchIfEmpty(Mono.error(new BizException(BizError.NO_RESOURCE_FOUND, "CANT_FIND_APPLICATION", id)));
6772
}
6873

@@ -123,7 +128,7 @@ public Mono<Long> countByOrganizationId(String orgId, ApplicationStatus applicat
123128
public Flux<Application> findByIdIn(List<String> applicationIds) {
124129
if(!applicationIds.isEmpty() && FieldName.isGID(applicationIds.get(0)))
125130
return repository.findByGidIn(applicationIds);
126-
return repository.findByIdIn(applicationIds);
131+
return repository.findBySlugIn(applicationIds).switchIfEmpty(repository.findByIdIn(applicationIds));
127132
}
128133

129134
@Override
@@ -279,7 +284,7 @@ public Mono<Set<String>> getPrivateApplicationIds(Collection<String> application
279284
.map(Application::getGid)
280285
.collect(Collectors.toSet());
281286

282-
return repository.findByCreatedByAndIdIn(userId, applicationIds)
287+
return repository.findByCreatedByAndSlugIn(userId, applicationIds).switchIfEmpty(repository.findByCreatedByAndIdIn(userId, applicationIds))
283288
.map(HasIdAndAuditing::getId)
284289
.collect(Collectors.toSet());
285290
}
@@ -349,15 +354,15 @@ public Mono<Map<String, Object>> getLiveDSLByApplicationId(String applicationId)
349354

350355
@Override
351356
public Mono<Application> updateSlug(String applicationId, String newSlug) {
352-
return repository.existsBySlug(newSlug).flatMap(exists -> {
357+
return repository.findById(applicationId).flatMap(application -> repository.existsByOrganizationIdAndSlug(application.getOrganizationId(), newSlug).flatMap(exists -> {
358+
if (!SlugUtils.validate(newSlug)) {
359+
return Mono.error(new BizException(BizError.SLUG_INVALID, "SLUG_INVALID"));
360+
}
353361
if (exists) {
354-
return Mono.error(new BizException(BizError.DUPLICATE_ENTRY, "Slug already exists"));
362+
return Mono.error(new BizException(BizError.SLUG_DUPLICATE_ENTRY, "SLUG_DUPLICATE_ENTRY"));
355363
}
356-
return repository.findById(applicationId)
357-
.flatMap(application -> {
358-
application.setSlug(newSlug);
359-
return repository.save(application);
360-
});
361-
});
364+
application.setSlug(newSlug);
365+
return repository.save(application);
366+
}));
362367
}
363368
}

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/organization/repository/OrganizationRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@ public interface OrganizationRepository extends ReactiveMongoRepository<Organiza
1616

1717
Flux<Organization> findByIdInAndState(Collection<String> id, OrganizationState state);
1818
Flux<Organization> findByGidInAndState(Collection<String> gid, OrganizationState state);
19+
Flux<Organization> findBySlugInAndState(Collection<String> slug, OrganizationState state);
1920
Flux<Organization> findByGid(String gid);
21+
Flux<Organization> findBySlug(String slug);
2022
Flux<Organization> findByState(OrganizationState state);
2123

2224
Mono<Organization> findByIdAndState(String id, OrganizationState state);
2325
Mono<Organization> findByGidAndState(String gid, OrganizationState state);
26+
Mono<Organization> findBySlugAndState(String slug, OrganizationState state);
2427

2528
Mono<Organization> findBySourceAndThirdPartyCompanyIdAndState(String source, String tpCompanyId, OrganizationState state);
2629

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/organization/service/OrganizationServiceImpl.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.lowcoder.domain.organization.repository.OrganizationRepository;
1717
import org.lowcoder.domain.user.model.User;
1818
import org.lowcoder.domain.user.repository.UserRepository;
19+
import org.lowcoder.domain.util.SlugUtils;
1920
import org.lowcoder.infra.annotation.PossibleEmptyMono;
2021
import org.lowcoder.infra.mongo.MongoUpsertHelper;
2122
import org.lowcoder.sdk.config.CommonConfig;
@@ -169,7 +170,7 @@ public Mono<Organization> getById(String id) {
169170
if(FieldName.isGID(id))
170171
return repository.findByGidAndState(id, ACTIVE)
171172
.switchIfEmpty(deferredError(UNABLE_TO_FIND_VALID_ORG, "INVALID_ORG_ID"));
172-
return repository.findByIdAndState(id, ACTIVE)
173+
return repository.findBySlugAndState(id, ACTIVE).switchIfEmpty(repository.findByIdAndState(id, ACTIVE))
173174
.switchIfEmpty(deferredError(UNABLE_TO_FIND_VALID_ORG, "INVALID_ORG_ID"));
174175
}
175176

@@ -179,7 +180,7 @@ public Mono<OrganizationCommonSettings> getOrgCommonSettings(String orgId) {
179180
return repository.findByGidAndState(orgId, ACTIVE)
180181
.switchIfEmpty(deferredError(UNABLE_TO_FIND_VALID_ORG, "INVALID_ORG_ID"))
181182
.map(Organization::getCommonSettings);
182-
return repository.findByIdAndState(orgId, ACTIVE)
183+
return repository.findBySlugAndState(orgId, ACTIVE).switchIfEmpty(repository.findByIdAndState(orgId, ACTIVE))
183184
.switchIfEmpty(deferredError(UNABLE_TO_FIND_VALID_ORG, "INVALID_ORG_ID"))
184185
.map(Organization::getCommonSettings);
185186
}
@@ -188,7 +189,7 @@ public Mono<OrganizationCommonSettings> getOrgCommonSettings(String orgId) {
188189
public Flux<Organization> getByIds(Collection<String> ids) {
189190
if(!ids.isEmpty() && FieldName.isGID(ids.stream().findFirst().get()))
190191
return repository.findByGidInAndState(ids, ACTIVE);
191-
return repository.findByIdInAndState(ids, ACTIVE);
192+
return repository.findBySlugInAndState(ids, ACTIVE).switchIfEmpty(repository.findByIdInAndState(ids, ACTIVE));
192193
}
193194

194195
@Override
@@ -221,7 +222,7 @@ public Mono<Boolean> uploadLogo(String organizationId, Part filePart) {
221222
public Mono<Boolean> deleteLogo(String organizationId) {
222223
Mono<Organization> organizationMono;
223224
if(FieldName.isGID(organizationId)) organizationMono = repository.findByGidAndState(organizationId, ACTIVE);
224-
else organizationMono = repository.findByIdAndState(organizationId, ACTIVE);
225+
else organizationMono = repository.findBySlugAndState(organizationId, ACTIVE).switchIfEmpty(repository.findByIdAndState(organizationId, ACTIVE));
225226
return organizationMono
226227
.flatMap(organization -> {
227228
// delete from asset repo.
@@ -292,8 +293,11 @@ private String buildCommonSettingsUpdateTimeKey(String key) {
292293
@Override
293294
public Mono<Organization> updateSlug(String organizationId, String newSlug) {
294295
return repository.existsBySlug(newSlug).flatMap(exists -> {
296+
if (!SlugUtils.validate(newSlug)) {
297+
return Mono.error(new BizException(BizError.SLUG_INVALID, "SLUG_INVALID"));
298+
}
295299
if (exists) {
296-
return Mono.error(new BizException(BizError.DUPLICATE_ENTRY, "Slug already exists"));
300+
return Mono.error(new BizException(BizError.SLUG_DUPLICATE_ENTRY, "SLUG_DUPLICATE_ENTRY"));
297301
}
298302
return repository.findById(organizationId)
299303
.flatMap(organization -> {
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.lowcoder.domain.util;
2+
3+
public class SlugUtils {
4+
public static Boolean validate(String slug) {
5+
return slug.matches("^[a-zA-Z0-9_-]*$");
6+
}
7+
}

server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/exception/BizError.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ public enum BizError {
154154
ILLEGAL_BUNDLE_PERMISSION_ID(500, 6404),
155155

156156
//slug 6501 - 6501
157-
DUPLICATE_ENTRY(403, 6501);
157+
SLUG_DUPLICATE_ENTRY(403, 6501),
158+
SLUG_INVALID(403, 6502);
158159

159160
static {
160161
checkDuplicates(values(), BizError::getBizErrorCode);

server/api-service/lowcoder-sdk/src/main/resources/locale_en.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,4 +282,6 @@ ORG_DELETED_FOR_ENTERPRISE_MODE=Provided enterpriseOrgId workspace has been dele
282282
DISABLE_AUTH_CONFIG_FORBIDDEN=Can not disable current administrator''s last identity provider.
283283
USER_NOT_EXIST=User not exist.
284284
DUPLICATE_AUTH_CONFIG_ADDITION=Provider auth type already added to organization
285-
EMAIL_PROVIDER_DISABLED=Email provider is disabled.
285+
EMAIL_PROVIDER_DISABLED=Email provider is disabled.
286+
SLUG_DUPLICATE_ENTRY=Slug already exists
287+
SLUG_INVALID=Slug format is invalid

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/GidService.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,13 @@ public class GidService {
4040
private BundleRepository bundleRepository;
4141

4242
public Mono<String> convertApplicationIdToObjectId(String id) {
43-
if(FieldName.isGID(id)) {
44-
return applicationRepository.findByGid(id).next().mapNotNull(HasIdAndAuditing::getId);
45-
}
46-
return Mono.just(id);
43+
return applicationRepository.findBySlug(id).next().mapNotNull(HasIdAndAuditing::getId).switchIfEmpty(
44+
Mono.defer(() -> {
45+
if (FieldName.isGID(id)) {
46+
return applicationRepository.findByGid(id).next().mapNotNull(HasIdAndAuditing::getId);
47+
}
48+
return Mono.just(id);
49+
}));
4750
}
4851

4952
public Mono<String> convertDatasourceIdToObjectId(String id) {
@@ -54,10 +57,13 @@ public Mono<String> convertDatasourceIdToObjectId(String id) {
5457
}
5558

5659
public Mono<String> convertOrganizationIdToObjectId(String id) {
57-
if(FieldName.isGID(id)) {
58-
return organizationRepository.findByGid(id).next().mapNotNull(HasIdAndAuditing::getId);
59-
}
60-
return Mono.just(id);
60+
return organizationRepository.findBySlug(id).next().mapNotNull(HasIdAndAuditing::getId).switchIfEmpty(
61+
Mono.defer(() -> {
62+
if(FieldName.isGID(id)) {
63+
return organizationRepository.findByGid(id).next().mapNotNull(HasIdAndAuditing::getId);
64+
}
65+
return Mono.just(id);
66+
}));
6167
}
6268

6369
public Mono<String> convertGroupIdToObjectId(String id) {

server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/common/TestRedisConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import java.util.concurrent.atomic.AtomicInteger;
1111

1212
@SuppressWarnings("UnstableApiUsage")
13-
@TestConfiguration
13+
//@TestConfiguration
1414
public class TestRedisConfiguration {
1515

1616
private static final AtomicInteger STATE = new AtomicInteger(0);

0 commit comments

Comments
 (0)