浏览代码

Refactor registerNewSchema method

Ildar Almakaev 4 年之前
父节点
当前提交
a68fa15354

+ 18 - 15
kafka-ui-api/src/main/java/com/provectus/kafka/ui/cluster/service/SchemaRegistryService.java

@@ -138,29 +138,29 @@ public class SchemaRegistryService {
                 .orElse(Mono.error(new NotFoundException("No such cluster")));
     }
 
+    /**
+     * Checks whether the provided schema duplicates the previous or not, creates a new schema
+     * and then returns the whole content by requesting its latest version.
+     */
     public Mono<SchemaSubject> registerNewSchema(String clusterName, Mono<NewSchemaSubject> newSchemaSubject) {
         return newSchemaSubject
                 .flatMap(schema -> {
                     Mono<InternalNewSchema> newSchema = Mono.just(new InternalNewSchema(schema.getSchema()));
                     String subject = schema.getSubject();
-                    return createNewSchema(clusterName, subject, newSchema);
+                    return clustersStorage.getClusterByName(clusterName)
+                            .map(KafkaCluster::getSchemaRegistry)
+                            .map(schemaRegistryUrl -> checkSchemaOnDuplicate(subject, newSchema, schemaRegistryUrl)
+                                    .flatMap(s -> submitNewSchema(subject, newSchema, schemaRegistryUrl))
+                                    .flatMap(resp -> getLatestSchemaVersionBySubject(clusterName, subject))
+                            )
+                            .orElse(Mono.error(new NotFoundException("No such cluster")));
                 });
     }
 
-    private Mono<SchemaSubject> createNewSchema(String clusterName, String subject, Mono<InternalNewSchema> newSchemaSubject) {
-        return clustersStorage.getClusterByName(clusterName)
-                .map(KafkaCluster::getSchemaRegistry)
-                .map(schemaRegistryUrl -> checkSchemaOnDuplicate(subject, newSchemaSubject, schemaRegistryUrl)
-                        .flatMap(s -> submitNewSchema(subject, newSchemaSubject, schemaRegistryUrl))
-                        .flatMap(resp -> getLatestSchemaVersionBySubject(clusterName, subject))
-                )
-                .orElse(Mono.error(new NotFoundException("No such cluster")));
-    }
-
     @NotNull
-    private Mono<SubjectIdResponse> submitNewSchema(String subject, Mono<InternalNewSchema> newSchemaSubject, String schemaRegistry) {
+    private Mono<SubjectIdResponse> submitNewSchema(String subject, Mono<InternalNewSchema> newSchemaSubject, String schemaRegistryUrl) {
         return webClient.post()
-                .uri(schemaRegistry + URL_SUBJECT_VERSIONS, subject)
+                .uri(schemaRegistryUrl + URL_SUBJECT_VERSIONS, subject)
                 .contentType(MediaType.APPLICATION_JSON)
                 .body(BodyInserters.fromPublisher(newSchemaSubject, InternalNewSchema.class))
                 .retrieve()
@@ -169,13 +169,14 @@ public class SchemaRegistryService {
     }
 
     @NotNull
-    private Mono<SchemaSubject> checkSchemaOnDuplicate(String subject, Mono<InternalNewSchema> newSchemaSubject, String schemaRegistry) {
+    private Mono<SchemaSubject> checkSchemaOnDuplicate(String subject, Mono<InternalNewSchema> newSchemaSubject, String schemaRegistryUrl) {
         return webClient.post()
-                .uri(schemaRegistry + URL_SUBJECT, subject)
+                .uri(schemaRegistryUrl + URL_SUBJECT, subject)
                 .contentType(MediaType.APPLICATION_JSON)
                 .body(BodyInserters.fromPublisher(newSchemaSubject, InternalNewSchema.class))
                 .retrieve()
                 .onStatus(NOT_FOUND::equals, res -> Mono.empty())
+                .onStatus(UNPROCESSABLE_ENTITY::equals, r -> Mono.error(new UnprocessableEntityException("Invalid params")))
                 .bodyToMono(SchemaSubject.class)
                 .filter(s -> Objects.isNull(s.getId()))
                 .switchIfEmpty(Mono.error(new DuplicateEntityException("Such schema already exists")));
@@ -256,6 +257,8 @@ public class SchemaRegistryService {
             return "AVRO";
         } else if (schema.contains("proto")) {
             return "PROTO";
+        } else if (schema.contains("json")) {
+            return "JSON";
         } else return schema;
     }
 }