Skip to content

Commit dd58bdb

Browse files
authored
Merge branch 'main' into feature/search_acl
2 parents 8e88c5a + bbf5c3a commit dd58bdb

File tree

105 files changed

+871
-375
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+871
-375
lines changed

.github/workflows/backend_tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,4 @@ jobs:
3434

3535
- name: "Tests"
3636
run: |
37-
./gradlew :api:test --info
37+
./gradlew :api:test

api/build.gradle

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ dependencies {
6161
implementation libs.json.smart
6262
implementation libs.netty.common
6363
implementation libs.netty.handler
64+
implementation libs.spring.context
6465

6566
implementation libs.modelcontextprotocol.spring.webflux
6667
implementation libs.victools.jsonschema.generator
@@ -106,11 +107,14 @@ generateGrammarSource {
106107
arguments += ["-package", "ksql"]
107108
}
108109

110+
tasks.withType(JavaCompile) {
111+
options.compilerArgs << "-Xlint:deprecation" << "-Xlint:unchecked"
112+
}
113+
114+
115+
109116
sourceSets {
110117
main {
111-
antlr {
112-
srcDirs = ["src/main/antlr4"]
113-
}
114118
java {
115119
srcDirs += generateGrammarSource.outputDirectory
116120
}
File renamed without changes.

api/src/main/java/io/kafbat/ui/config/McpConfig.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import io.kafbat.ui.service.mcp.McpTool;
66
import io.modelcontextprotocol.server.McpAsyncServer;
77
import io.modelcontextprotocol.server.McpServer;
8-
import io.modelcontextprotocol.server.McpServerFeatures.AsyncPromptSpecification;
98
import io.modelcontextprotocol.server.McpServerFeatures.AsyncToolSpecification;
109
import io.modelcontextprotocol.server.transport.WebFluxSseServerTransportProvider;
1110
import io.modelcontextprotocol.spec.McpSchema;

api/src/main/java/io/kafbat/ui/config/auth/AbstractAuthSecurityConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ protected AbstractAuthSecurityConfig() {
2121
"/manifest.json",
2222
"/favicon.svg",
2323
"/favicon/**",
24+
"/images/**",
25+
"/fonts/**",
2426

2527
"/static/**",
2628
"/resources/**",

api/src/main/java/io/kafbat/ui/controller/ApplicationConfigController.java

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@
55

66
import io.kafbat.ui.api.ApplicationConfigApi;
77
import io.kafbat.ui.config.ClustersProperties;
8-
import io.kafbat.ui.model.ActionDTO;
8+
import io.kafbat.ui.mapper.DynamicConfigMapper;
99
import io.kafbat.ui.model.AppAuthenticationSettingsDTO;
1010
import io.kafbat.ui.model.ApplicationConfigDTO;
11-
import io.kafbat.ui.model.ApplicationConfigPropertiesDTO;
1211
import io.kafbat.ui.model.ApplicationConfigValidationDTO;
1312
import io.kafbat.ui.model.ApplicationInfoDTO;
1413
import io.kafbat.ui.model.ClusterConfigValidationDTO;
@@ -20,12 +19,9 @@
2019
import io.kafbat.ui.util.ApplicationRestarter;
2120
import io.kafbat.ui.util.DynamicConfigOperations;
2221
import java.util.Map;
23-
import java.util.Optional;
2422
import javax.annotation.Nullable;
2523
import lombok.RequiredArgsConstructor;
2624
import lombok.extern.slf4j.Slf4j;
27-
import org.mapstruct.Mapper;
28-
import org.mapstruct.factory.Mappers;
2925
import org.springframework.http.ResponseEntity;
3026
import org.springframework.http.codec.multipart.FilePart;
3127
import org.springframework.http.codec.multipart.Part;
@@ -41,26 +37,11 @@
4137
@RequiredArgsConstructor
4238
public class ApplicationConfigController extends AbstractController implements ApplicationConfigApi {
4339

44-
private static final PropertiesMapper MAPPER = Mappers.getMapper(PropertiesMapper.class);
45-
46-
@Mapper
47-
interface PropertiesMapper {
48-
49-
DynamicConfigOperations.PropertiesStructure fromDto(ApplicationConfigPropertiesDTO dto);
50-
51-
ApplicationConfigPropertiesDTO toDto(DynamicConfigOperations.PropertiesStructure propertiesStructure);
52-
53-
default ActionDTO stringToActionDto(String str) {
54-
return Optional.ofNullable(str)
55-
.map(s -> Enum.valueOf(ActionDTO.class, s.toUpperCase()))
56-
.orElseThrow();
57-
}
58-
}
59-
6040
private final DynamicConfigOperations dynamicConfigOperations;
6141
private final ApplicationRestarter restarter;
6242
private final KafkaClusterFactory kafkaClusterFactory;
6343
private final ApplicationInfoService applicationInfoService;
44+
private final DynamicConfigMapper configMapper;
6445

6546
@Override
6647
public Mono<ResponseEntity<ApplicationInfoDTO>> getApplicationInfo(ServerWebExchange exchange) {
@@ -83,7 +64,7 @@ public Mono<ResponseEntity<ApplicationConfigDTO>> getCurrentConfig(ServerWebExch
8364
return validateAccess(context)
8465
.then(Mono.fromSupplier(() -> ResponseEntity.ok(
8566
new ApplicationConfigDTO()
86-
.properties(MAPPER.toDto(dynamicConfigOperations.getCurrentProperties()))
67+
.properties(configMapper.toDto(dynamicConfigOperations.getCurrentProperties()))
8768
)))
8869
.doOnEach(sig -> audit(context, sig));
8970
}
@@ -98,7 +79,7 @@ public Mono<ResponseEntity<Void>> restartWithConfig(Mono<RestartRequestDTO> rest
9879
return validateAccess(context)
9980
.then(restartRequestDto)
10081
.doOnNext(restartDto -> {
101-
var newConfig = MAPPER.fromDto(restartDto.getConfig().getProperties());
82+
var newConfig = configMapper.fromDto(restartDto.getConfig().getProperties());
10283
dynamicConfigOperations.persist(newConfig);
10384
})
10485
.doOnEach(sig -> audit(context, sig))
@@ -132,7 +113,7 @@ public Mono<ResponseEntity<ApplicationConfigValidationDTO>> validateConfig(Mono<
132113
return validateAccess(context)
133114
.then(configDto)
134115
.flatMap(config -> {
135-
DynamicConfigOperations.PropertiesStructure newConfig = MAPPER.fromDto(config.getProperties());
116+
DynamicConfigOperations.PropertiesStructure newConfig = configMapper.fromDto(config.getProperties());
136117
ClustersProperties clustersProperties = newConfig.getKafka();
137118
return validateClustersConfig(clustersProperties)
138119
.map(validations -> new ApplicationConfigValidationDTO().clusters(validations));

api/src/main/java/io/kafbat/ui/controller/AuthorizationController.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,23 +45,22 @@ public Mono<ResponseEntity<AuthenticationInfoDTO>> getUserAuthInfo(ServerWebExch
4545
.map(SecurityContext::getAuthentication)
4646
.map(Principal::getName);
4747

48-
var builder = AuthenticationInfoDTO.builder()
48+
var builder = new AuthenticationInfoDTO()
4949
.rbacEnabled(accessControlService.isRbacEnabled());
5050

5151
return userName
5252
.zipWith(permissions)
5353
.map(data -> (AuthenticationInfoDTO) builder
5454
.userInfo(new UserInfoDTO(data.getT1(), data.getT2()))
55-
.build()
5655
)
57-
.switchIfEmpty(Mono.just(builder.build()))
56+
.switchIfEmpty(Mono.just(builder))
5857
.map(ResponseEntity::ok);
5958
}
6059

6160
private List<UserPermissionDTO> mapPermissions(List<Permission> permissions, List<String> clusters) {
6261
return permissions
6362
.stream()
64-
.map(permission -> (UserPermissionDTO) UserPermissionDTO.builder()
63+
.map(permission -> new UserPermissionDTO()
6564
.clusters(clusters)
6665
.resource(ResourceTypeDTO.fromValue(permission.getResource().toString().toUpperCase()))
6766
.value(permission.getValue())
@@ -71,7 +70,6 @@ private List<UserPermissionDTO> mapPermissions(List<Permission> permissions, Lis
7170
.map(this::mapAction)
7271
.filter(Objects::nonNull)
7372
.toList())
74-
.build()
7573
)
7674
.toList();
7775
}

api/src/main/java/io/kafbat/ui/controller/KafkaConnectController.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,7 @@ public Mono<ResponseEntity<Void>> updateConnectorState(String clusterName, Strin
191191
ConnectorActionDTO action,
192192
ServerWebExchange exchange) {
193193
ConnectAction[] connectActions;
194-
if (RESTART_ACTIONS.contains(action)) {
195-
connectActions = new ConnectAction[] {ConnectAction.VIEW, ConnectAction.RESTART};
196-
} else {
197-
connectActions = new ConnectAction[] {ConnectAction.VIEW, ConnectAction.EDIT};
198-
}
194+
connectActions = new ConnectAction[] {ConnectAction.VIEW, ConnectAction.OPERATE};
199195

200196
var context = AccessContext.builder()
201197
.cluster(clusterName)
@@ -237,7 +233,7 @@ public Mono<ResponseEntity<Void>> restartConnectorTask(String clusterName, Strin
237233

238234
var context = AccessContext.builder()
239235
.cluster(clusterName)
240-
.connectActions(connectName, ConnectAction.VIEW, ConnectAction.RESTART)
236+
.connectActions(connectName, ConnectAction.VIEW, ConnectAction.OPERATE)
241237
.operationName("restartConnectorTask")
242238
.operationParams(Map.of(CONNECTOR_NAME, connectorName))
243239
.build();

api/src/main/java/io/kafbat/ui/exception/GlobalErrorWebExceptionHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ private String extractFieldErrorMsg(FieldError fieldError) {
161161
return coalesce(fieldError.getDefaultMessage(), fieldError.getCode(), "Invalid field value");
162162
}
163163

164+
@SafeVarargs
164165
private <T> T coalesce(T... items) {
165166
return Stream.of(items).filter(Objects::nonNull).findFirst().orElse(null);
166167
}

api/src/main/java/io/kafbat/ui/mapper/ClusterMapper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,10 @@
4949
@Mapper(componentModel = "spring")
5050
public interface ClusterMapper {
5151

52+
@Mapping(target = "defaultCluster", ignore = true)
5253
ClusterDTO toCluster(InternalClusterState clusterState);
5354

55+
@Mapping(target = "zooKeeperStatus", ignore = true)
5456
ClusterStatsDTO toClusterStats(InternalClusterState clusterState);
5557

5658
default ClusterMetricsDTO toClusterMetrics(Metrics metrics) {
@@ -95,6 +97,8 @@ default ConfigSynonymDTO toConfigSynonym(ConfigEntry.ConfigSynonym config) {
9597

9698
BrokerDTO toBrokerDto(InternalBroker broker);
9799

100+
@Mapping(target = "keySerde", ignore = true)
101+
@Mapping(target = "valueSerde", ignore = true)
98102
TopicDetailsDTO toTopicDetails(InternalTopic topic);
99103

100104
@Mapping(target = "isReadOnly", source = "readOnly")

0 commit comments

Comments
 (0)