11package org .lowcoder .domain .serversetting .service ;
22
3+ import lombok .RequiredArgsConstructor ;
34import lombok .extern .slf4j .Slf4j ;
5+ import org .apache .commons .lang3 .StringUtils ;
46import org .lowcoder .domain .serversetting .model .ServerSetting ;
57import org .springframework .beans .factory .annotation .Autowired ;
8+ import org .springframework .core .env .*;
69import org .springframework .stereotype .Service ;
710import reactor .core .publisher .Flux ;
811import reactor .core .publisher .Mono ;
912
1013import javax .annotation .PostConstruct ;
11- import java .util .List ;
12- import java .util .Map ;
14+ import java .util .*;
15+ import java .util .stream .Collectors ;
16+ import java .util .stream .StreamSupport ;
1317
1418
19+ @ RequiredArgsConstructor
1520@ Slf4j
1621@ Service
1722public class ServerSettingServiceImpl implements ServerSettingService {
23+
24+ private final Environment environment ;
1825private final ServerSettingRepository repository ;
26+
1927private final List <String >EXCLUDED_KEYS =List .of ("LOWCODER_MONGODB_EXPOSED" ,
2028"LOWCODER_PUID" ,
2129"LOWCODER_PGID" ,
@@ -33,21 +41,25 @@ public class ServerSettingServiceImpl implements ServerSettingService {
3341"LOWCODER_NODE_SERVICE_SECRET" ,
3442"LOWCODER_NODE_SERVICE_SECRET_SALT" );
3543
36- @ Autowired
37- public ServerSettingServiceImpl (ServerSettingRepository repository ) {
38- this .repository =repository ;
39- }
40-
4144@ Override
4245public Mono <Map <String ,String >>getServerSettingsMap () {
4346return repository .findAll ().collectMap (ServerSetting ::getKey ,ServerSetting ::getValue );
4447 }
4548
4649@ PostConstruct
4750public void saveEnvironmentVariables () {
48- Map <String ,String >envVariables =System .getenv ();
49- Flux .fromIterable (envVariables .keySet ())
50- .filter (key ->key .startsWith ("LOWCODER_" ))
51+
52+ Map <String ,String >defaults =getEnvironmentVariablesDefaults ();
53+
54+ Map <String ,String >envVariables =new TreeMap <>(System .getenv ().entrySet ().stream ()
55+ .filter (entry ->StringUtils .startsWith (entry .getKey (),"LOWCODER_" ))
56+ .collect (Collectors .toMap (Map .Entry ::getKey ,Map .Entry ::getValue )));
57+
58+ Map <String ,String >merged =new TreeMap <>(defaults );
59+ merged .keySet ().removeAll (envVariables .keySet ());
60+ merged .putAll (envVariables );
61+
62+ Flux .fromIterable (merged .keySet ())
5163 .map (key -> {
5264String value =envVariables .getOrDefault (key ,"" );
5365if (EXCLUDED_KEYS .contains (key )) {
@@ -61,4 +73,30 @@ public void saveEnvironmentVariables() {
6173 .flatMap (repository ::save )
6274 .subscribe ();
6375 }
76+
77+
78+ private Map <String ,String >getEnvironmentVariablesDefaults () {
79+ Map <String ,String >defaults =new HashMap <>();
80+
81+ MutablePropertySources propertySources = ((AbstractEnvironment )environment ).getPropertySources ();
82+ StreamSupport .stream (propertySources .spliterator (),false )
83+ .filter (EnumerablePropertySource .class ::isInstance )
84+ .map (EnumerablePropertySource .class ::cast )
85+ .forEach (propertySource -> {
86+ String []names =propertySource .getPropertyNames ();
87+ if (names .length >0 ) {
88+ Arrays .stream (names ).forEach (name -> {
89+ String rawValue =Objects .toString (propertySource .getProperty (name ),"" );
90+ if (rawValue !=null &&StringUtils .contains (rawValue ,"${LOWCODER_" )) {
91+ String defaultValue =StringUtils .substringBetween (rawValue ,"${" ,"}" );
92+ String []keyValue =StringUtils .split (defaultValue ,":" );
93+ if (keyValue .length ==2 && !defaults .containsKey (keyValue [0 ])) {
94+ defaults .put (keyValue [0 ],keyValue [1 ]);
95+ }
96+ }
97+ });
98+ }
99+ });
100+ return defaults ;
101+ }
64102}