topics.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import {
  2. TopicName,
  3. TopicMessage,
  4. Topic,
  5. ClusterName,
  6. TopicDetails,
  7. TopicConfig,
  8. TopicFormData,
  9. TopicFormCustomParam,
  10. TopicFormFormattedParams,
  11. TopicFormCustomParams,
  12. TopicMessageQueryParams,
  13. } from 'redux/interfaces';
  14. import { BASE_URL, BASE_PARAMS } from 'lib/constants';
  15. const formatCustomParams = (
  16. customParams: TopicFormCustomParams
  17. ): TopicFormFormattedParams => {
  18. return Object.values(customParams || {}).reduce(
  19. (result: TopicFormFormattedParams, customParam: TopicFormCustomParam) => {
  20. return {
  21. ...result,
  22. [customParam.name]: customParam.value,
  23. };
  24. },
  25. {} as TopicFormFormattedParams
  26. );
  27. };
  28. export const getTopicConfig = (
  29. clusterName: ClusterName,
  30. topicName: TopicName
  31. ): Promise<TopicConfig[]> =>
  32. fetch(`${BASE_URL}/clusters/${clusterName}/topics/${topicName}/config`, {
  33. ...BASE_PARAMS,
  34. }).then((res) => res.json());
  35. export const getTopicDetails = (
  36. clusterName: ClusterName,
  37. topicName: TopicName
  38. ): Promise<TopicDetails> =>
  39. fetch(`${BASE_URL}/clusters/${clusterName}/topics/${topicName}`, {
  40. ...BASE_PARAMS,
  41. }).then((res) => res.json());
  42. export const getTopics = (clusterName: ClusterName): Promise<Topic[]> =>
  43. fetch(`${BASE_URL}/clusters/${clusterName}/topics`, {
  44. ...BASE_PARAMS,
  45. }).then((res) => res.json());
  46. export const getTopicMessages = (
  47. clusterName: ClusterName,
  48. topicName: TopicName,
  49. queryParams: Partial<TopicMessageQueryParams>
  50. ): Promise<TopicMessage[]> => {
  51. let searchParams = '';
  52. Object.entries({ ...queryParams }).forEach((entry) => {
  53. const key = entry[0];
  54. const value = entry[1];
  55. if (value) {
  56. if (Array.isArray(value)) {
  57. searchParams += value.map((v) => `${key}=${v}&`);
  58. } else {
  59. searchParams += `${key}=${value}&`;
  60. }
  61. }
  62. });
  63. return fetch(
  64. `${BASE_URL}/clusters/${clusterName}/topics/${topicName}/messages?${searchParams}`,
  65. {
  66. ...BASE_PARAMS,
  67. }
  68. ).then((res) => res.json());
  69. };
  70. export const postTopic = (
  71. clusterName: ClusterName,
  72. form: TopicFormData
  73. ): Promise<Topic> => {
  74. const {
  75. name,
  76. partitions,
  77. replicationFactor,
  78. cleanupPolicy,
  79. retentionBytes,
  80. retentionMs,
  81. maxMessageBytes,
  82. minInSyncReplicas,
  83. } = form;
  84. const body = JSON.stringify({
  85. name,
  86. partitions,
  87. replicationFactor,
  88. configs: {
  89. 'cleanup.policy': cleanupPolicy,
  90. 'retention.ms': retentionMs,
  91. 'retention.bytes': retentionBytes,
  92. 'max.message.bytes': maxMessageBytes,
  93. 'min.insync.replicas': minInSyncReplicas,
  94. ...formatCustomParams(form.customParams),
  95. },
  96. });
  97. return fetch(`${BASE_URL}/clusters/${clusterName}/topics`, {
  98. ...BASE_PARAMS,
  99. method: 'POST',
  100. body,
  101. }).then((res) => res.json());
  102. };
  103. export const patchTopic = (
  104. clusterName: ClusterName,
  105. form: TopicFormData
  106. ): Promise<Topic> => {
  107. const {
  108. cleanupPolicy,
  109. retentionBytes,
  110. retentionMs,
  111. maxMessageBytes,
  112. minInSyncReplicas,
  113. } = form;
  114. const body = JSON.stringify({
  115. configs: {
  116. 'cleanup.policy': cleanupPolicy,
  117. 'retention.ms': retentionMs,
  118. 'retention.bytes': retentionBytes,
  119. 'max.message.bytes': maxMessageBytes,
  120. 'min.insync.replicas': minInSyncReplicas,
  121. ...formatCustomParams(form.customParams),
  122. },
  123. });
  124. return fetch(`${BASE_URL}/clusters/${clusterName}/topics/${form.name}`, {
  125. ...BASE_PARAMS,
  126. method: 'PATCH',
  127. body,
  128. }).then((res) => res.json());
  129. };