diff --git a/client/src/containers/Topic/TopicCreate/TopicCreate.jsx b/client/src/containers/Topic/TopicCreate/TopicCreate.jsx index 0e41f843a..cb44020c1 100644 --- a/client/src/containers/Topic/TopicCreate/TopicCreate.jsx +++ b/client/src/containers/Topic/TopicCreate/TopicCreate.jsx @@ -3,7 +3,7 @@ import Joi from 'joi-browser'; import { withRouter } from 'react-router-dom'; import Form from '../../../components/Form/Form'; import Header from '../../Header'; -import { uriTopicsCreate } from '../../../utils/endpoints'; +import { uriTopicsCreate, uriTopicDefaultConf } from '../../../utils/endpoints'; import { toast } from 'react-toastify'; class TopicCreate extends Form { @@ -18,6 +18,21 @@ class TopicCreate extends Form { errors: {} }; + componentDidMount() { + this.getTopicDefaultConf(); + } + + async getTopicDefaultConf() { + let { formData } = { ...this.state } + const defaults = await this.getApi(uriTopicDefaultConf()); + + formData.retention = defaults.data.retention + formData.partition = defaults.data.partition + formData.replication = defaults.data.replication + + this.setState({ formData }); + } + schema = { name: Joi.string() .required() diff --git a/client/src/utils/endpoints.js b/client/src/utils/endpoints.js index 55d719fd2..74bd37e11 100644 --- a/client/src/utils/endpoints.js +++ b/client/src/utils/endpoints.js @@ -39,6 +39,8 @@ export const uriTopics = (clusterId, search, show, page) => { return `${apiUrl}/${clusterId}/topic?search=${search}&show=${show}&page=${page}`; }; +export const uriTopicDefaultConf = () => `${apiUrl}/topic/defaults-configs`; + export const uriTopicsName = (clusterId) => `${apiUrl}/${clusterId}/topic/name`; export const uriTopicsInfo = (clusterId, topicId) => `${apiUrl}/${clusterId}/topic/${topicId}`; diff --git a/src/main/java/org/akhq/controllers/TopicController.java b/src/main/java/org/akhq/controllers/TopicController.java index 91fb8c460..d8fa5f202 100644 --- a/src/main/java/org/akhq/controllers/TopicController.java +++ b/src/main/java/org/akhq/controllers/TopicController.java @@ -61,9 +61,21 @@ public class TopicController extends AbstractController { private Short replicationFactor; @Value("${akhq.topic.partition}") private Integer partitionCount; + @Value("${akhq.topic.retention}") + private Integer retention; @Value("${akhq.pagination.page-size}") private Integer pageSize; + @Get ("api/topic/defaults-configs") + @Operation(tags = {"topic"}, summary = "Get default topic configuration") + public Map getDefaultConf(){ + return Map.of( + "replication", replicationFactor.intValue(), + "partition", partitionCount, + "retention", retention + ); + } + @Get("api/{cluster}/topic") @Operation(tags = {"topic"}, summary = "List all topics") public ResultPagedList list( @@ -509,4 +521,4 @@ public static class OffsetCopy { private long offset; } } - + diff --git a/src/test/java/org/akhq/controllers/TopicControllerTest.java b/src/test/java/org/akhq/controllers/TopicControllerTest.java index ea6312edf..b34dd3b8f 100644 --- a/src/test/java/org/akhq/controllers/TopicControllerTest.java +++ b/src/test/java/org/akhq/controllers/TopicControllerTest.java @@ -22,10 +22,22 @@ @TestMethodOrder(MethodOrderer.OrderAnnotation.class) class TopicControllerTest extends AbstractTest { public static final String BASE_URL = "/api/" + KafkaTestCluster.CLUSTER_ID + "/topic"; + public static final String DEFAULTS_CONFIGS_URL = "api/topic/defaults-configs"; public static final String TOPIC_URL = BASE_URL + "/" + KafkaTestCluster.TOPIC_COMPACTED; public static final String CREATE_TOPIC_NAME = UUID.randomUUID().toString(); public static final String CREATE_TOPIC_URL = BASE_URL + "/" + CREATE_TOPIC_NAME; + @Test + @Order(1) + void defaultsConfigsApi(){ + Map result = this.retrieve(HttpRequest.GET(DEFAULTS_CONFIGS_URL), Map.class); + + assertEquals(1, result.get("replication")); + assertEquals(86400000, result.get("retention")); + assertEquals(1, result.get("partition")); + } + + @Test @Order(1) void listApi() {