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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy