Skip to content

Commit e9c267b

Browse files
authored
[app-platform] Modify the icon prefix in applications and templates. (#331)
* [app-platform] Modify the icon prefix in applications and templates. * [app-platform] The database only stores filenames, and the backend constructs the complete URI to return to the frontend. * [app-platform] Add icon handling during AppVersion conversion. * [app-platform] Modify java doc of IconConverter. * [app-platform] Address code review comments. * [app-platform] Address code review comments.
1 parent 1e7871b commit e9c267b

File tree

24 files changed

+334
-57
lines changed

24 files changed

+334
-57
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
3+
* This file is a part of the ModelEngine Project.
4+
* Licensed under the MIT License. See License.txt in the project root for license information.
5+
*--------------------------------------------------------------------------------------------*/
6+
7+
package modelengine.fit.jober.aipp.converters;
8+
9+
/**
10+
* 头像转换器接口。
11+
*
12+
* @author 陈镕希
13+
* @since 2025-07-16
14+
*/
15+
public interface IconConverter {
16+
/**
17+
* 从数据库中读出 {@code iconValue} 后添加前端直接调用前缀。
18+
*
19+
* @param storedValue 数据库中存的值的 {@link String}。
20+
* @return 补充前端直接调用前缀后的值的 {@link String}。
21+
*/
22+
String toFrontend(String storedValue);
23+
24+
/**
25+
* 从前端传入的 {@code iconValue} 中截取文件名部分后落库。
26+
*
27+
* @param frontendValue 前端传入的值的 {@link String}。
28+
* @return 截取文件名部分后的值的 {@link String}。
29+
*/
30+
String toStorage(String frontendValue);
31+
}

app-builder/jane/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/converters/impl/AppVersionToAippDtoConverter.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66

77
package modelengine.fit.jober.aipp.converters.impl;
88

9+
import lombok.RequiredArgsConstructor;
910
import modelengine.fit.jober.aipp.converters.EntityConverter;
11+
import modelengine.fit.jober.aipp.converters.IconConverter;
1012
import modelengine.fit.jober.aipp.domains.appversion.AppVersion;
1113
import modelengine.fit.jober.aipp.dto.AippDto;
1214
import modelengine.fit.jober.aipp.util.JsonUtils;
@@ -24,7 +26,10 @@
2426
* @since 2025-02-18
2527
*/
2628
@Component
29+
@RequiredArgsConstructor
2730
public class AppVersionToAippDtoConverter implements EntityConverter {
31+
private final IconConverter iconConverter;
32+
2833
@Override
2934
public Class<AppVersion> source() {
3035
return AppVersion.class;
@@ -39,7 +44,7 @@ public Class<AippDto> target() {
3944
public AippDto convert(Object appVersion) {
4045
return Optional.ofNullable(appVersion).map(ObjectUtils::<AppVersion>cast).map(s -> {
4146
String description = ObjectUtils.nullIf(s.getDescription(), StringUtils.EMPTY);
42-
String icon = ObjectUtils.nullIf(s.getIcon(), StringUtils.EMPTY);
47+
String icon = this.iconConverter.toFrontend(ObjectUtils.nullIf(s.getIcon(), StringUtils.EMPTY));
4348
return AippDto.builder()
4449
.name(s.getData().getName())
4550
.description(description)

app-builder/jane/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/converters/impl/AppVersionToAppDtoConverter.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66

77
package modelengine.fit.jober.aipp.converters.impl;
88

9+
import lombok.RequiredArgsConstructor;
910
import modelengine.fit.jober.aipp.common.exception.AippErrCode;
1011
import modelengine.fit.jober.aipp.common.exception.AippException;
1112
import modelengine.fit.jober.aipp.converters.EntityConverter;
13+
import modelengine.fit.jober.aipp.converters.IconConverter;
1214
import modelengine.fit.jober.aipp.domain.AppBuilderConfig;
1315
import modelengine.fit.jober.aipp.domain.AppBuilderFlowGraph;
1416
import modelengine.fit.jober.aipp.domain.AppBuilderFormProperty;
@@ -25,6 +27,7 @@
2527
import modelengine.fitframework.util.ObjectUtils;
2628

2729
import java.util.Collections;
30+
import java.util.HashMap;
2831
import java.util.LinkedHashMap;
2932
import java.util.List;
3033
import java.util.Map;
@@ -39,8 +42,10 @@
3942
* @since 2025-02-18
4043
*/
4144
@Component
45+
@RequiredArgsConstructor
4246
public class AppVersionToAppDtoConverter implements EntityConverter {
4347
private static final String FORM_PROPERTY_GROUP_NULL = "null";
48+
private final IconConverter iconConverter;
4449

4550
@Override
4651
public Class<AppVersion> source() {
@@ -55,12 +60,15 @@ public Class<AppBuilderAppDto> target() {
5560
@Override
5661
public AppBuilderAppDto convert(Object appVersion) {
5762
return Optional.ofNullable(appVersion).map(ObjectUtils::<AppVersion>cast).map(s -> {
63+
Map<String, Object> attributes = new HashMap<>(s.getAttributes());
64+
attributes.computeIfPresent("icon",
65+
(k, v) -> this.iconConverter.toFrontend(String.valueOf(v)));
5866
AppBuilderAppDto.AppBuilderAppDtoBuilder appDtoBuilder = AppBuilderAppDto.builder()
5967
.id(s.getData().getId())
6068
.name(s.getData().getName())
6169
.type(s.getData().getType())
6270
.state(s.getData().getState())
63-
.attributes(s.getAttributes())
71+
.attributes(attributes)
6472
.appType(s.getData().getAppType())
6573
.version(s.getData().getVersion())
6674
.appCategory(s.getData().getAppCategory())

app-builder/jane/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/converters/impl/AppVersionToCreateDtoConverter.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66

77
package modelengine.fit.jober.aipp.converters.impl;
88

9+
import lombok.RequiredArgsConstructor;
910
import modelengine.fit.jober.aipp.converters.EntityConverter;
11+
import modelengine.fit.jober.aipp.converters.IconConverter;
1012
import modelengine.fit.jober.aipp.domains.appversion.AppVersion;
1113
import modelengine.fit.jober.aipp.dto.AppBuilderAppCreateDto;
1214

@@ -22,7 +24,10 @@
2224
* @since 2025-02-18
2325
*/
2426
@Component
27+
@RequiredArgsConstructor
2528
public class AppVersionToCreateDtoConverter implements EntityConverter {
29+
private final IconConverter iconConverter;
30+
2631
@Override
2732
public Class<AppVersion> source() {
2833
return AppVersion.class;
@@ -40,7 +45,7 @@ public AppBuilderAppCreateDto convert(Object appVersion) {
4045
.map(s -> AppBuilderAppCreateDto.builder()
4146
.name(s.getData().getName())
4247
.description(s.getDescription())
43-
.icon(s.getIcon())
48+
.icon(this.iconConverter.toFrontend(s.getIcon()))
4449
.greeting(s.getGreeting())
4550
.appType(s.getData().getAppType())
4651
.type(s.getData().getType())

app-builder/jane/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/converters/impl/AppVersionToExportAppConverter.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,18 @@
66

77
package modelengine.fit.jober.aipp.converters.impl;
88

9+
import lombok.RequiredArgsConstructor;
910
import modelengine.fit.jober.aipp.converters.EntityConverter;
11+
import modelengine.fit.jober.aipp.converters.IconConverter;
1012
import modelengine.fit.jober.aipp.domains.appversion.AppVersion;
1113
import modelengine.fit.jober.aipp.dto.export.AppExportApp;
1214
import modelengine.fit.jober.aipp.po.AppBuilderAppPo;
1315
import modelengine.fit.jober.aipp.util.JsonUtils;
1416
import modelengine.fitframework.annotation.Component;
1517
import modelengine.fitframework.util.ObjectUtils;
1618

19+
import java.util.HashMap;
20+
import java.util.Map;
1721
import java.util.Optional;
1822

1923
/**
@@ -23,7 +27,10 @@
2327
* @since 2025-02-14
2428
*/
2529
@Component
30+
@RequiredArgsConstructor
2631
public class AppVersionToExportAppConverter implements EntityConverter {
32+
private final IconConverter iconConverter;
33+
2734
@Override
2835
public Class<AppVersion> source() {
2936
return AppVersion.class;
@@ -38,13 +45,18 @@ public Class<AppExportApp> target() {
3845
public AppExportApp convert(Object appVersion) {
3946
return Optional.ofNullable(appVersion).map(ObjectUtils::<AppVersion>cast).map(s -> {
4047
AppBuilderAppPo appBuilderAppPo = s.getData();
48+
Map<String, Object> attributes = Optional.ofNullable(appBuilderAppPo.getAttributes())
49+
.map(JsonUtils::parseObject)
50+
.orElseGet(HashMap::new);
51+
attributes.computeIfPresent("icon",
52+
(k, v) -> this.iconConverter.toFrontend(String.valueOf(v)));
4153
return AppExportApp.builder()
4254
.name(appBuilderAppPo.getName())
4355
.tenantId(appBuilderAppPo.getTenantId())
4456
.type(appBuilderAppPo.getType())
4557
.appBuiltType(appBuilderAppPo.getAppBuiltType())
4658
.version(appBuilderAppPo.getVersion())
47-
.attributes(JsonUtils.parseObject(appBuilderAppPo.getAttributes()))
59+
.attributes(attributes)
4860
.appCategory(appBuilderAppPo.getAppCategory())
4961
.appType(appBuilderAppPo.getAppType())
5062
.build();

app-builder/jane/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/converters/impl/AppVersionToMetaDtoConverter.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,20 @@
66

77
package modelengine.fit.jober.aipp.converters.impl;
88

9+
import lombok.RequiredArgsConstructor;
910
import modelengine.fit.jober.aipp.converters.EntityConverter;
11+
import modelengine.fit.jober.aipp.converters.IconConverter;
1012
import modelengine.fit.jober.aipp.domains.appversion.AppVersion;
1113
import modelengine.fit.jober.aipp.dto.AppBuilderAppMetadataDto;
1214

1315
import modelengine.fitframework.annotation.Component;
1416
import modelengine.fitframework.util.ObjectUtils;
1517

1618
import java.util.ArrayList;
19+
import java.util.HashMap;
1720
import java.util.List;
1821
import java.util.Locale;
22+
import java.util.Map;
1923
import java.util.Optional;
2024

2125
/**
@@ -25,7 +29,10 @@
2529
* @since 2025-02-18
2630
*/
2731
@Component
32+
@RequiredArgsConstructor
2833
public class AppVersionToMetaDtoConverter implements EntityConverter {
34+
private final IconConverter iconConverter;
35+
2936
@Override
3037
public Class<AppVersion> source() {
3138
return AppVersion.class;
@@ -41,13 +48,16 @@ public AppBuilderAppMetadataDto convert(Object appVersion) {
4148
return Optional.ofNullable(appVersion).map(ObjectUtils::<AppVersion>cast).map(s -> {
4249
List<String> tags = new ArrayList<>();
4350
tags.add(s.getData().getType().toUpperCase(Locale.ROOT));
51+
Map<String, Object> attributes = new HashMap<>(s.getAttributes());
52+
attributes.computeIfPresent("icon",
53+
(k, v) -> this.iconConverter.toFrontend(String.valueOf(v)));
4454
return AppBuilderAppMetadataDto.builder()
4555
.id(s.getData().getId())
4656
.name(s.getData().getName())
4757
.type(s.getData().getType())
4858
.state(s.getData().getState())
4959
.appType(s.getData().getAppType())
50-
.attributes(s.getAttributes())
60+
.attributes(attributes)
5161
.version(s.getData().getVersion())
5262
.createBy(s.getData().getCreateBy())
5363
.updateBy(s.getData().getUpdateBy())

app-builder/jane/plugins/aipp-plugin/src/main/java/modelengine/fit/jober/aipp/converters/impl/AppVersionToTemplateConverter.java

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@
66

77
package modelengine.fit.jober.aipp.converters.impl;
88

9+
import lombok.RequiredArgsConstructor;
910
import modelengine.fit.jober.aipp.converters.EntityConverter;
11+
import modelengine.fit.jober.aipp.converters.IconConverter;
1012
import modelengine.fit.jober.aipp.domain.AppTemplate;
1113
import modelengine.fit.jober.aipp.domains.appversion.AppVersion;
1214
import modelengine.fitframework.annotation.Component;
1315
import modelengine.fitframework.util.ObjectUtils;
1416

17+
import java.util.HashMap;
18+
import java.util.Map;
1519
import java.util.Optional;
1620

1721
/**
@@ -21,7 +25,10 @@
2125
* @since 2025-02-18
2226
*/
2327
@Component
28+
@RequiredArgsConstructor
2429
public class AppVersionToTemplateConverter implements EntityConverter {
30+
private final IconConverter iconConverter;
31+
2532
@Override
2633
public Class<AppVersion> source() {
2734
return AppVersion.class;
@@ -36,27 +43,32 @@ public Class<AppTemplate> target() {
3643
public AppTemplate convert(Object appVersion) {
3744
return Optional.ofNullable(appVersion)
3845
.map(ObjectUtils::<AppVersion>cast)
39-
.map(appVersionObj -> AppTemplate.builder()
40-
.id(appVersionObj.getData().getId())
41-
.name(appVersionObj.getData().getName())
42-
.builtType(appVersionObj.getData().getAppBuiltType())
43-
.appType(appVersionObj.getData().getAppType())
44-
.category(appVersionObj.getData().getAppCategory())
45-
.attributes(appVersionObj.getAttributes())
46-
.like(0)
47-
.collection(0)
48-
.usage(0)
49-
.version("1.0.0")
50-
.configId(appVersionObj.getData().getConfigId())
51-
.flowGraphId(appVersionObj.getData().getFlowGraphId())
52-
.createBy(appVersionObj.getData().getCreateBy())
53-
.createAt(appVersionObj.getData().getCreateAt())
54-
.updateBy(appVersionObj.getData().getUpdateBy())
55-
.updateAt(appVersionObj.getData().getUpdateAt())
56-
.config(appVersionObj.getConfig())
57-
.flowGraph(appVersionObj.getFlowGraph())
58-
.formProperties(appVersionObj.getFormProperties())
59-
.build())
46+
.map(appVersionObj -> {
47+
Map<String, Object> attributes = new HashMap<>(appVersionObj.getAttributes());
48+
attributes.computeIfPresent("icon",
49+
(k, v) -> this.iconConverter.toFrontend(String.valueOf(v)));
50+
return AppTemplate.builder()
51+
.id(appVersionObj.getData().getId())
52+
.name(appVersionObj.getData().getName())
53+
.builtType(appVersionObj.getData().getAppBuiltType())
54+
.appType(appVersionObj.getData().getAppType())
55+
.category(appVersionObj.getData().getAppCategory())
56+
.attributes(attributes)
57+
.like(0)
58+
.collection(0)
59+
.usage(0)
60+
.version("1.0.0")
61+
.configId(appVersionObj.getData().getConfigId())
62+
.flowGraphId(appVersionObj.getData().getFlowGraphId())
63+
.createBy(appVersionObj.getData().getCreateBy())
64+
.createAt(appVersionObj.getData().getCreateAt())
65+
.updateBy(appVersionObj.getData().getUpdateBy())
66+
.updateAt(appVersionObj.getData().getUpdateAt())
67+
.config(appVersionObj.getConfig())
68+
.flowGraph(appVersionObj.getFlowGraph())
69+
.formProperties(appVersionObj.getFormProperties())
70+
.build();
71+
})
6072
.orElse(null);
6173
}
6274
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) 2025 Huawei Technologies Co., Ltd. All rights reserved.
3+
* This file is a part of the ModelEngine Project.
4+
* Licensed under the MIT License. See License.txt in the project root for license information.
5+
*--------------------------------------------------------------------------------------------*/
6+
7+
package modelengine.fit.jober.aipp.converters.impl;
8+
9+
import static modelengine.fit.jober.aipp.constant.AippConstant.DOWNLOAD_FILE_ORIGIN;
10+
import static modelengine.fit.jober.aipp.constant.AippConstant.NAS_SHARE_DIR;
11+
12+
import modelengine.fit.jober.aipp.converters.IconConverter;
13+
import modelengine.fit.jober.aipp.util.TenantUtils;
14+
import modelengine.fitframework.annotation.Component;
15+
import modelengine.fitframework.annotation.Value;
16+
import modelengine.fitframework.util.StringUtils;
17+
18+
import java.util.regex.Matcher;
19+
import java.util.regex.Pattern;
20+
21+
/**
22+
* {@link IconConverter} 的默认实现类。
23+
*
24+
* @author 陈镕希
25+
* @since 2025-07-16
26+
*/
27+
@Component
28+
public class IconConverterImpl implements IconConverter {
29+
private final String contextRoot;
30+
31+
private static final Pattern FILE_PATH_PATTERN;
32+
private static final String FILE_PATH_PARAM = "filePath=";
33+
private static final String FILE_NAME_PARAM = "&fileName=";
34+
35+
static {
36+
String regex = FILE_PATH_PARAM + Pattern.quote(NAS_SHARE_DIR) + "/([^&]+)";
37+
FILE_PATH_PATTERN = Pattern.compile(regex);
38+
}
39+
40+
public IconConverterImpl(@Value("${app-engine.contextRoot}") String contextRoot) {
41+
this.contextRoot = contextRoot;
42+
}
43+
44+
@Override
45+
public String toFrontend(String storedValue) {
46+
if (StringUtils.isBlank(storedValue)) {
47+
return storedValue;
48+
}
49+
50+
Matcher matcher = FILE_PATH_PATTERN.matcher(storedValue);
51+
String fileName = matcher.find() ? matcher.group(1) : storedValue;
52+
return buildFileUrl(fileName);
53+
}
54+
55+
@Override
56+
public String toStorage(String frontendValue) {
57+
if (StringUtils.isBlank(frontendValue)) {
58+
return frontendValue;
59+
}
60+
61+
Matcher matcher = FILE_PATH_PATTERN.matcher(frontendValue);
62+
return matcher.find() ? matcher.group(1) : frontendValue;
63+
}
64+
65+
private String buildFileUrl(String fileName) {
66+
String originWithTenant = String.format(DOWNLOAD_FILE_ORIGIN, TenantUtils.getDefaultTenantId());
67+
return this.contextRoot + originWithTenant + FILE_PATH_PARAM + NAS_SHARE_DIR + "/" + fileName
68+
+ FILE_NAME_PARAM + fileName;
69+
}
70+
}

0 commit comments

Comments
 (0)