use-metadata.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import type { BuiltInMetadataItem, MetadataBatchEditToServer, MetadataItemWithValueLength } from '@/app/components/datasets/metadata/types'
  2. import { del, get, patch, post } from '../base'
  3. import { useDocumentListKey, useInvalidDocumentList } from './use-document'
  4. import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
  5. import { useInvalid } from '../use-base'
  6. import type { DocumentDetailResponse } from '@/models/datasets'
  7. const NAME_SPACE = 'dataset-metadata'
  8. export const useDatasetMetaData = (datasetId: string) => {
  9. return useQuery<{ doc_metadata: MetadataItemWithValueLength[], built_in_field_enabled: boolean }>({
  10. queryKey: [NAME_SPACE, 'dataset', datasetId],
  11. queryFn: () => {
  12. return get<{ doc_metadata: MetadataItemWithValueLength[], built_in_field_enabled: boolean }>(`/datasets/${datasetId}/metadata`)
  13. },
  14. })
  15. }
  16. export const useInvalidDatasetMetaData = (datasetId: string) => {
  17. return useInvalid([NAME_SPACE, 'dataset', datasetId])
  18. }
  19. export const useCreateMetaData = (datasetId: string) => {
  20. const invalidDatasetMetaData = useInvalidDatasetMetaData(datasetId)
  21. return useMutation({
  22. mutationFn: async (payload: BuiltInMetadataItem) => {
  23. await post(`/datasets/${datasetId}/metadata`, {
  24. body: payload,
  25. })
  26. await invalidDatasetMetaData()
  27. return Promise.resolve(true)
  28. },
  29. })
  30. }
  31. export const useInvalidAllDocumentMetaData = (datasetId: string) => {
  32. const queryClient = useQueryClient()
  33. return () => {
  34. queryClient.invalidateQueries({
  35. queryKey: [NAME_SPACE, 'document', datasetId],
  36. exact: false, // invalidate all document metadata: [NAME_SPACE, 'document', datasetId, documentId]
  37. })
  38. }
  39. }
  40. const useInvalidAllMetaData = (datasetId: string) => {
  41. const invalidDatasetMetaData = useInvalidDatasetMetaData(datasetId)
  42. const invalidDocumentList = useInvalidDocumentList(datasetId)
  43. const invalidateAllDocumentMetaData = useInvalidAllDocumentMetaData(datasetId)
  44. return async () => {
  45. // meta data in dataset
  46. await invalidDatasetMetaData()
  47. // meta data in document list
  48. invalidDocumentList()
  49. // meta data in single document
  50. await invalidateAllDocumentMetaData() // meta data in document
  51. }
  52. }
  53. export const useRenameMeta = (datasetId: string) => {
  54. const invalidateAllMetaData = useInvalidAllMetaData(datasetId)
  55. return useMutation({
  56. mutationFn: async (payload: MetadataItemWithValueLength) => {
  57. await patch(`/datasets/${datasetId}/metadata/${payload.id}`, {
  58. body: {
  59. name: payload.name,
  60. },
  61. })
  62. await invalidateAllMetaData()
  63. },
  64. })
  65. }
  66. export const useDeleteMetaData = (datasetId: string) => {
  67. const invalidateAllMetaData = useInvalidAllMetaData(datasetId)
  68. return useMutation({
  69. mutationFn: async (metaDataId: string) => {
  70. // datasetMetaData = datasetMetaData.filter(item => item.id !== metaDataId)
  71. await del(`/datasets/${datasetId}/metadata/${metaDataId}`)
  72. await invalidateAllMetaData()
  73. },
  74. })
  75. }
  76. export const useBuiltInMetaDataFields = () => {
  77. return useQuery<{ fields: BuiltInMetadataItem[] }>({
  78. queryKey: [NAME_SPACE, 'built-in'],
  79. queryFn: () => {
  80. return get('/datasets/metadata/built-in')
  81. },
  82. })
  83. }
  84. export const useDocumentMetaData = ({ datasetId, documentId }: { datasetId: string, documentId: string }) => {
  85. return useQuery<DocumentDetailResponse>({
  86. queryKey: [NAME_SPACE, 'document', datasetId, documentId],
  87. queryFn: () => {
  88. return get<DocumentDetailResponse>(`/datasets/${datasetId}/documents/${documentId}`, { params: { metadata: 'only' } })
  89. },
  90. })
  91. }
  92. export const useBatchUpdateDocMetadata = () => {
  93. const queryClient = useQueryClient()
  94. return useMutation({
  95. mutationFn: async (payload: {
  96. dataset_id: string
  97. metadata_list: MetadataBatchEditToServer
  98. }) => {
  99. const documentIds = payload.metadata_list.map(item => item.document_id)
  100. await post(`/datasets/${payload.dataset_id}/documents/metadata`, {
  101. body: {
  102. operation_data: payload.metadata_list,
  103. },
  104. })
  105. // meta data in dataset
  106. await queryClient.invalidateQueries({
  107. queryKey: [NAME_SPACE, 'dataset', payload.dataset_id],
  108. })
  109. // meta data in document list
  110. await queryClient.invalidateQueries({
  111. queryKey: [NAME_SPACE, 'dataset', payload.dataset_id],
  112. })
  113. await queryClient.invalidateQueries({
  114. queryKey: [...useDocumentListKey, payload.dataset_id],
  115. })
  116. // meta data in single document
  117. await Promise.all(documentIds.map(documentId => queryClient.invalidateQueries(
  118. {
  119. queryKey: [NAME_SPACE, 'document', payload.dataset_id, documentId],
  120. },
  121. )))
  122. },
  123. })
  124. }
  125. export const useUpdateBuiltInStatus = (datasetId: string) => {
  126. const invalidDatasetMetaData = useInvalidDatasetMetaData(datasetId)
  127. return useMutation({
  128. mutationFn: async (enabled: boolean) => {
  129. await post(`/datasets/${datasetId}/metadata/built-in/${enabled ? 'enable' : 'disable'}`)
  130. invalidDatasetMetaData()
  131. },
  132. })
  133. }