Skip to content

Commit c00d60c

Browse files
committed
Add icon, published, publishedVersion, lastPublishedTime field to the application list api
1 parent 8f51381 commit c00d60c

File tree

3 files changed

+115
-72
lines changed

3 files changed

+115
-72
lines changed

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

Lines changed: 56 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -164,43 +164,62 @@ public Map<String, Object> getEditingApplicationDSL() {
164164
return dsl;
165165
}
166166

167-
public String getCategory() {
168-
var liveDSL = getLiveApplicationDsl();
169-
if(liveDSL == null || liveDSL.get("settings") == null) return "";
170-
Object settingsObject = liveDSL.get("settings");
171-
if (settingsObject instanceof Map) {
172-
@SuppressWarnings("unchecked")
173-
Map<String, Object> settings = (Map<String, Object>) liveDSL.get("settings");
174-
return (String) settings.get("category");
175-
} else {
176-
return "";
177-
}
178-
}
179-
180-
public String getTitle() {
181-
var liveDSL = getLiveApplicationDsl();
182-
if(liveDSL == null || liveDSL.get("settings") == null) return "";
183-
Object settingsObject = liveDSL.get("settings");
184-
if (settingsObject instanceof Map) {
185-
@SuppressWarnings("unchecked")
186-
Map<String, Object> settings = (Map<String, Object>) liveDSL.get("settings");
187-
return (String) settings.get("title");
188-
} else {
189-
return "";
190-
}
191-
}
192-
193-
public String getDescription() {
194-
var liveDSL = getLiveApplicationDsl();
195-
if(liveDSL == null || liveDSL.get("settings") == null) return "";
196-
Object settingsObject = liveDSL.get("settings");
197-
if (settingsObject instanceof Map) {
198-
@SuppressWarnings("unchecked")
199-
Map<String, Object> settings = (Map<String, Object>) liveDSL.get("settings");
200-
return (String) settings.get("description");
201-
} else {
202-
return "";
203-
}
167+
public Mono<String> getCategory(ApplicationRecordService applicationRecordService) {
168+
return getLiveApplicationDsl(applicationRecordService).map(liveDSL -> {
169+
if (liveDSL == null || liveDSL.get("settings") == null) return "";
170+
Object settingsObject = liveDSL.get("settings");
171+
if (settingsObject instanceof Map) {
172+
@SuppressWarnings("unchecked")
173+
Map<String, Object> settings = (Map<String, Object>) liveDSL.get("settings");
174+
return (String) settings.get("category");
175+
} else {
176+
return "";
177+
}
178+
});
179+
}
180+
181+
public Mono<String> getTitle(ApplicationRecordService applicationRecordService) {
182+
return getLiveApplicationDsl(applicationRecordService).map(liveDSL -> {
183+
if (liveDSL == null || liveDSL.get("settings") == null) return "";
184+
Object settingsObject = liveDSL.get("settings");
185+
if (settingsObject instanceof Map) {
186+
@SuppressWarnings("unchecked")
187+
Map<String, Object> settings = (Map<String, Object>) liveDSL.get("settings");
188+
return (String) settings.get("title");
189+
} else {
190+
return "";
191+
}
192+
});
193+
}
194+
195+
public Mono<String> getDescription(ApplicationRecordService applicationRecordService) {
196+
return getLiveApplicationDsl(applicationRecordService).map(liveDSL -> {
197+
if (liveDSL == null || liveDSL.get("settings") == null) return "";
198+
Object settingsObject = liveDSL.get("settings");
199+
if (settingsObject instanceof Map) {
200+
@SuppressWarnings("unchecked")
201+
Map<String, Object> settings = (Map<String, Object>) liveDSL.get("settings");
202+
return (String) settings.get("description");
203+
} else {
204+
return "";
205+
}
206+
}
207+
);
208+
}
209+
210+
public Mono<String> getIcon(ApplicationRecordService applicationRecordService) {
211+
return getLiveApplicationDsl(applicationRecordService).map(liveDSL -> {
212+
if (liveDSL == null || liveDSL.get("settings") == null) return "";
213+
Object settingsObject = liveDSL.get("settings");
214+
if (settingsObject instanceof Map) {
215+
@SuppressWarnings("unchecked")
216+
Map<String, Object> settings = (Map<String, Object>) liveDSL.get("settings");
217+
return (String) settings.get("icon");
218+
} else {
219+
return "";
220+
}
221+
}
222+
);
204223
}
205224

206225
public Map<String, Object> getEditingApplicationDSLOrNull() {return editingApplicationDSL; }

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/ApplicationInfoView.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,13 @@ public class ApplicationInfoView {
4747
private final String description;
4848
@JsonInclude(Include.NON_NULL)
4949
private final String category;
50+
@JsonInclude(Include.NON_NULL)
51+
private final String icon;
52+
private final boolean published;
53+
@JsonInclude(Include.NON_NULL)
54+
private final String publishedVersion;
55+
@JsonInclude(Include.NON_NULL)
56+
private final Instant lastPublishedTime;
5057

5158
public long getLastViewTime() {
5259
return lastViewTime == null ? 0 : lastViewTime.toEpochMilli();

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java

Lines changed: 52 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.lowcoder.api.usermanagement.view.OrgAndVisitorRoleView;
1313
import org.lowcoder.api.usermanagement.view.UserProfileView;
1414
import org.lowcoder.domain.application.model.Application;
15+
import org.lowcoder.domain.application.model.ApplicationRecord;
1516
import org.lowcoder.domain.application.model.ApplicationStatus;
1617
import org.lowcoder.domain.application.model.ApplicationType;
1718
import org.lowcoder.domain.application.service.ApplicationRecordService;
@@ -35,7 +36,9 @@
3536
import org.lowcoder.domain.user.service.UserService;
3637
import org.lowcoder.domain.user.service.UserStatusService;
3738
import org.lowcoder.infra.util.NetworkUtils;
39+
import org.lowcoder.infra.util.TupleUtils;
3840
import org.lowcoder.sdk.config.CommonConfig;
41+
import org.lowcoder.sdk.models.VersionedModel;
3942
import org.springframework.stereotype.Component;
4043
import org.springframework.web.server.ServerWebExchange;
4144
import reactor.core.publisher.Flux;
@@ -203,11 +206,13 @@ public Flux<ApplicationInfoView> getAllAuthorisedApplications4CurrentOrgMember(@
203206
return applicationService.findByOrganizationIdWithDsl(currentOrgId);
204207
}
205208
return applicationService.findByOrganizationIdWithoutDsl(currentOrgId);
206-
})
207-
.filter(application -> (isNull(applicationType) || applicationType == ApplicationType.ALL || application.getApplicationType() == applicationType.getValue())
208-
&& (isNull(applicationStatus) || application.getApplicationStatus() == applicationStatus)
209-
&& (isNull(name) || StringUtils.containsIgnoreCase(application.getName(), name))
210-
&& (isNull(category) || StringUtils.containsIgnoreCase(application.getCategory(), category)))
209+
}).flatMap(application -> application.getCategory(applicationRecordService)
210+
.map(categoryValue -> Map.entry(application, categoryValue)))
211+
.filter(entry -> (isNull(applicationType) || applicationType == ApplicationType.ALL || entry.getKey().getApplicationType() == applicationType.getValue())
212+
&& (isNull(applicationStatus) || entry.getKey().getApplicationStatus() == applicationStatus)
213+
&& (isNull(name) || StringUtils.containsIgnoreCase(entry.getKey().getName(), name))
214+
&& (isNull(category) || StringUtils.containsIgnoreCase(entry.getValue(), category)))
215+
.map(Map.Entry::getKey)
211216
.cache()
212217
.collectList()
213218
.flatMapIterable(Function.identity());
@@ -563,36 +568,48 @@ public Flux<MarketplaceBundleInfoView> getAllAgencyProfileBundles() {
563568

564569
private Mono<ApplicationInfoView> buildView(Application application, ResourceRole maxRole, Map<String, User> userMap, @Nullable Instant lastViewTime,
565570
Long bundlePosition, boolean withContainerSize) {
566-
ApplicationInfoViewBuilder applicationInfoViewBuilder = ApplicationInfoView.builder()
567-
.applicationId(application.getId())
568-
.applicationGid(application.getGid())
569-
.orgId(application.getOrganizationId())
570-
.name(application.getName())
571-
.title(application.getTitle())
572-
.description(application.getDescription())
573-
.category(application.getCategory())
574-
.createBy(Optional.ofNullable(userMap.get(application.getCreatedBy()))
575-
.map(User::getName)
576-
.orElse(""))
577-
.createAt(application.getCreatedAt().toEpochMilli())
578-
.role(maxRole.getValue())
579-
.applicationType(application.getApplicationType())
580-
.applicationStatus(application.getApplicationStatus())
581-
.lastModifyTime(application.getUpdatedAt())
582-
.lastViewTime(lastViewTime)
583-
.lastEditedAt(application.getLastEditedAt())
584-
.publicToAll(application.isPublicToAll())
585-
.publicToMarketplace(application.isPublicToMarketplace())
586-
.agencyProfile(application.agencyProfile());
587-
if (withContainerSize) {
588-
return application.getLiveContainerSize(applicationRecordService).map(size -> applicationInfoViewBuilder
589-
.containerSize(size)
590-
.build())
591-
.switchIfEmpty(Mono.just(applicationInfoViewBuilder
592-
.containerSize(null)
593-
.build()));
594-
}
595-
return Mono.just(applicationInfoViewBuilder.build());
571+
return application.getTitle(applicationRecordService)
572+
.zipWith(application.getDescription(applicationRecordService))
573+
.zipWith(application.getCategory(applicationRecordService), TupleUtils::merge)
574+
.zipWith(application.getIcon(applicationRecordService), TupleUtils::merge)
575+
.zipWith(applicationRecordService.getLatestRecordByApplicationId(application.getId()).map(Optional::of).switchIfEmpty(Mono.just(Optional.empty())), TupleUtils::merge)
576+
.flatMap(tuple -> {
577+
Optional<ApplicationRecord> lastAppRecord = tuple.getT5();
578+
ApplicationInfoView.ApplicationInfoViewBuilder applicationInfoViewBuilder = ApplicationInfoView.builder()
579+
.applicationId(application.getId())
580+
.applicationGid(application.getGid())
581+
.orgId(application.getOrganizationId())
582+
.name(application.getName())
583+
.title(tuple.getT1())
584+
.description(tuple.getT2())
585+
.category(tuple.getT3())
586+
.icon(tuple.getT4())
587+
.published(lastAppRecord.isPresent())
588+
.publishedVersion(lastAppRecord.map(ApplicationRecord::version).orElse(null))
589+
.lastPublishedTime(lastAppRecord.map(ApplicationRecord::getCreatedAt).orElse(null))
590+
.createBy(Optional.ofNullable(userMap.get(application.getCreatedBy()))
591+
.map(User::getName)
592+
.orElse(""))
593+
.createAt(application.getCreatedAt().toEpochMilli())
594+
.role(maxRole.getValue())
595+
.applicationType(application.getApplicationType())
596+
.applicationStatus(application.getApplicationStatus())
597+
.lastModifyTime(application.getUpdatedAt())
598+
.lastViewTime(lastViewTime)
599+
.lastEditedAt(application.getLastEditedAt())
600+
.publicToAll(application.isPublicToAll())
601+
.publicToMarketplace(application.isPublicToMarketplace())
602+
.agencyProfile(application.agencyProfile());
603+
if (withContainerSize) {
604+
return application.getLiveContainerSize(applicationRecordService).map(size -> applicationInfoViewBuilder
605+
.containerSize(size)
606+
.build())
607+
.switchIfEmpty(Mono.just(applicationInfoViewBuilder
608+
.containerSize(null)
609+
.build()));
610+
}
611+
return Mono.just(applicationInfoViewBuilder.build());
612+
});
596613
}
597614

598615
}

0 commit comments

Comments
 (0)