Skip to content

Commit ea9d6fc

Browse files
aq-ikhwa-techludomikula
authored andcommitted
Add handling for api delays in case of rate limit
1 parent 7a3b3e5 commit ea9d6fc

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package org.lowcoder.api.framework.filter;
2+
3+
import org.lowcoder.infra.config.repository.ServerConfigRepository;
4+
import org.springframework.beans.factory.annotation.Autowired;
5+
import org.springframework.core.Ordered;
6+
import org.springframework.stereotype.Component;
7+
import org.springframework.web.server.ServerWebExchange;
8+
import org.springframework.web.server.WebFilter;
9+
import org.springframework.web.server.WebFilterChain;
10+
import reactor.core.publisher.Mono;
11+
12+
import java.time.Duration;
13+
14+
import static org.lowcoder.api.framework.filter.FilterOrder.API_DELAY_FILTER;
15+
16+
@Component
17+
public class APIDelayFilter implements WebFilter, Ordered {
18+
19+
@Autowired
20+
private ServerConfigRepository serverConfigRepository;
21+
22+
@Override
23+
public int getOrder() {
24+
return API_DELAY_FILTER.getOrder();
25+
}
26+
27+
@Override
28+
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
29+
return serverConfigRepository.findByKey("isRateLimited")
30+
.map(serverConfig -> {
31+
if(serverConfig.getValue() != null && Boolean.parseBoolean(serverConfig.getValue().toString())) {
32+
return Mono.delay(Duration.ofSeconds(5)).block();
33+
} else {
34+
return Mono.empty();
35+
}
36+
}).then(chain.filter(exchange));
37+
}
38+
}

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/FilterOrder.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ public enum FilterOrder {
1010
REQUEST_COST(BEFORE_PROXY_CHAIN),
1111
THROTTLING(BEFORE_PROXY_CHAIN),
1212

13+
API_DELAY_FILTER(BEFORE_PROXY_CHAIN),
14+
1315
// WEB_FILTER_CHAIN_PROXY here
1416

1517
USER_BAN(AFTER_PROXY_CHAIN),

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/plugin/SharedPluginServices.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
import java.util.function.Consumer;
66

77
import org.lowcoder.api.framework.plugin.endpoint.PluginEndpointHandler;
8+
import org.lowcoder.infra.config.repository.ServerConfigRepository;
89
import org.lowcoder.plugin.api.LowcoderServices;
910
import org.lowcoder.plugin.api.PluginEndpoint;
1011
import org.lowcoder.plugin.api.event.LowcoderEvent;
12+
import org.springframework.beans.factory.annotation.Autowired;
1113
import org.springframework.context.event.EventListener;
1214
import org.springframework.stereotype.Component;
1315

@@ -18,6 +20,9 @@
1820
public class SharedPluginServices implements LowcoderServices
1921
{
2022
private final PluginEndpointHandler pluginEndpointHandler;
23+
24+
@Autowired
25+
private ServerConfigRepository serverConfigRepository;
2126

2227
private List<Consumer<LowcoderEvent>> eventListeners = new LinkedList<>();
2328

@@ -41,4 +46,14 @@ public void registerEndpoints(String urlPrefix, List<PluginEndpoint> endpoints)
4146
{
4247
pluginEndpointHandler.registerEndpoints(urlPrefix, endpoints);
4348
}
49+
50+
@Override
51+
public void setConfig(String key, Object value) {
52+
serverConfigRepository.upsert(key, value).block();
53+
}
54+
55+
@Override
56+
public Object getConfig(String key) {
57+
return serverConfigRepository.findByKey(key).block();
58+
}
4459
}

0 commit comments

Comments
 (0)