DkDocsController.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. package com.giantan.data.dk.controller;
  2. import com.giantan.ai.common.reponse.R;
  3. import com.giantan.data.dk.constant.DkConstants;
  4. import com.giantan.data.dk.dto.GTool;
  5. import com.giantan.data.dk.service.DkDocsService;
  6. import com.giantan.data.kvs.kvstore.GBaseKeyValue;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.web.bind.annotation.*;
  9. import java.io.IOException;
  10. import java.lang.invoke.MethodHandles;
  11. import java.util.List;
  12. import java.util.Map;
  13. // | 上传文件 | `POST` | `/collections/{collId}/mds` |
  14. //| 上传 ZIP(批量) | `POST` | `/collections/{collId}/docs/batch`(或 `/bulk`) |
  15. //| 提交新任务 | `POST` | `/collections/{collId}/tasks` |
  16. //| 获取任务状态 | `GET` | `/collections/{collId}/tasks/{taskId}/status` |
  17. //| 取消任务 | `DELETE` | `/collections/{collId}/tasks/{taskId}` |
  18. //| 获取任务详情 | `GET` | `/collections/{collId}/tasks/{taskId}`
  19. // deleteByName DELETE /collections/{collId}/mds?name=someName
  20. // 批处理任务的统一提交方式
  21. // POST /collections/{collId}/tasks
  22. //Content-Type: application/json
  23. //
  24. //{
  25. // "type": "chunk", // 或 "keywords", "summary"
  26. // "objectIds": ["md1", "md2"], // 可选:为空则全量
  27. // "params": {
  28. // "chunkSize": 500,
  29. // "language": "zh"
  30. // }
  31. //}
  32. //`/collections/{collId}/docs/actions/keywords`
  33. // - `POST /collections/{collId}/docs/actions/{action}`:简洁直观,表示“对资源集合执行动作”
  34. //- 配合 `mdIds` 或标签、筛选条件等参数进行部分操作
  35. @RestController
  36. @RequestMapping(DkConstants.API_PREFIX + "/collections/{collId}")
  37. public class DkDocsController {
  38. private static final org.slf4j.Logger log
  39. = org.slf4j.LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
  40. @Autowired
  41. DkDocsService dkDocsService;
  42. @PostMapping("/tools")
  43. public R createEntry(@PathVariable String collId, @RequestBody GTool data) throws Throwable {
  44. GTool r = dkDocsService.save(collId, data);
  45. return R.data(r);
  46. }
  47. @GetMapping("/tools/all")
  48. public R<List<GTool>> getAll(@PathVariable String collId) throws Throwable {
  49. List<GTool> ret = null;
  50. ret = dkDocsService.findAll(collId);
  51. return R.data(ret);
  52. }
  53. @GetMapping("/tools/{id}")
  54. public R<?> getById(@PathVariable String collId, @PathVariable String id
  55. ) throws Throwable {
  56. GTool ret = dkDocsService.findByIdOrGid(collId, id);
  57. return R.data(ret);
  58. }
  59. @DeleteMapping("/tools/{gid}")
  60. public R<?> delete(@PathVariable String collId, @PathVariable String gid
  61. ) throws Throwable {
  62. int deleted = dkDocsService.deleteByIdOrGid(collId, gid);
  63. log.info("Delete dk: {}", gid);
  64. //log.info("taskId = " + taskId);
  65. return R.data(Map.of("deleted", deleted));
  66. }
  67. @PutMapping("/tools/{qid}")
  68. public R update(@PathVariable String collId, @PathVariable String qid, @RequestBody GTool tool) throws Throwable {
  69. GTool r = dkDocsService.update(collId, qid, tool);
  70. return R.data(r);
  71. }
  72. @PostMapping("/tools/fulltextSearch")
  73. public R fulltextSearch(@PathVariable String collId, @RequestBody Map<String, Object> query) throws Throwable {
  74. List<GBaseKeyValue> rets = dkDocsService.fulltextSearch(collId, query);
  75. return R.data(rets);
  76. }
  77. @PostMapping("/tools/similaritySearch")
  78. public R similaritySearch(@PathVariable String collId, @RequestBody Map<String, Object> query) throws Throwable {
  79. List<GBaseKeyValue> rets = dkDocsService.similaritySearch(collId, query);
  80. return R.data(rets);
  81. }
  82. @PostMapping("/tools/hybridSearch")
  83. public R hybridSearch(@PathVariable String collId, @RequestBody Map<String, Object> query) throws Throwable {
  84. List<GBaseKeyValue> rets = dkDocsService.hybridSearch(collId, query);
  85. return R.data(rets);
  86. }
  87. @DeleteMapping("/tools/by-name")
  88. public R<Map<String, Object>> deleteByName(@PathVariable String collId, @RequestParam("name") String name
  89. ) throws Throwable {
  90. // 根据 name 删除对应 md
  91. int deleted = dkDocsService.deleteByName(collId, name);
  92. return R.data(Map.of("deleted", deleted));
  93. }
  94. @DeleteMapping("/tools/all")
  95. public R<Map<String, Object>> deleteAll(@PathVariable String collId) throws Exception {
  96. long removed = dkDocsService.deleteAll(collId);
  97. return R.data(Map.of("deleted", removed));
  98. }
  99. // 获取某些字段的所有值
  100. @PostMapping("/tools/fields")
  101. public R getAllEntities(@PathVariable String collId, @RequestBody List<String> fields) throws Throwable {
  102. List<Map<String, Object>> entities = dkDocsService.getAllEntities(collId, fields);
  103. return R.data(entities);
  104. }
  105. ////////////////////
  106. //GET /collections/demo/paths/get?path=/a/b/c
  107. //DELETE /collections/demo/paths/delete?path=/a/b/c
  108. //GET /collections/demo/paths/list?prefix=/a
  109. //GET /collections/demo/paths/children?path=/a
  110. //GET /collections/demo/paths/descendants?path=/a
  111. @GetMapping("/tools/by-path")
  112. public R getDocsBypPath(@PathVariable String collId, @RequestParam String path) throws Throwable {
  113. List<GTool> rets = dkDocsService.findByPath(collId, path);
  114. return R.data(rets);
  115. }
  116. @GetMapping("/tools/by-prefix")
  117. public R getDocsBypPrefix(@PathVariable String collId, @RequestParam String prefix) throws Throwable {
  118. List<GTool> rets = dkDocsService.findByPrefix(collId, prefix);
  119. return R.data(rets);
  120. }
  121. @DeleteMapping("/tools/by-path")
  122. public R deletePathAndDescendants(@PathVariable String collId, @RequestParam String path) throws Throwable {
  123. int rets = dkDocsService.deletePathAndDescendants(collId, path);
  124. return R.data(rets);
  125. }
  126. // 获取记录数
  127. @GetMapping("/tools/count")
  128. public R getCount(@PathVariable String collId) {
  129. long count = dkDocsService.count(collId);
  130. return R.data(count);
  131. }
  132. @GetMapping("/tools")
  133. public R getDocs(
  134. @PathVariable String collId,
  135. @RequestParam(required = false) String path,
  136. @RequestParam(required = false) String prefix,
  137. @RequestParam(required = false) String parent) throws Throwable {
  138. List<GTool> rets = null;
  139. if (path != null) {
  140. rets = dkDocsService.findByPath(collId, path);
  141. } else if (prefix != null) {
  142. rets = dkDocsService.findByPrefix(collId, prefix);
  143. } else if (parent != null) {
  144. rets = dkDocsService.getChildren(collId, parent);
  145. } else {
  146. rets = dkDocsService.findAll(collId);
  147. }
  148. return R.data(rets);
  149. }
  150. @DeleteMapping("/docs")
  151. public R deleteDocs(
  152. @PathVariable String collId,
  153. @RequestParam(required = false) String path,
  154. @RequestParam(required = false) String prefix,
  155. @RequestParam(required = false) String subtree) throws Throwable {
  156. int ret = 0;
  157. if (path != null) {
  158. ret = dkDocsService.deleteByPath(collId, path);
  159. } else if (prefix != null) {
  160. ret = dkDocsService.deleteByPrefix(collId, prefix);
  161. } else if (subtree != null) {
  162. ret = dkDocsService.deletePathAndDescendants(collId, subtree);
  163. } else {
  164. throw new IllegalArgumentException("Must provide path or prefix to delete");
  165. }
  166. return R.data(ret);
  167. }
  168. // @PostMapping("/tools/{docId}/tags/add")
  169. // public R appendTag(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
  170. // List<String> ret = dkDocsService.appendArrayField(collId, docId, "tags", values);
  171. // return ResponseEntity.ok(R.data(ret));
  172. // }
  173. //
  174. // @PostMapping("/docs/{docId}/tags/set")
  175. // public ResponseEntity<R> setTag(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
  176. // List<String> ret = dkDocsService.setArrayField(collId, docId, "tags", values);
  177. // return ResponseEntity.ok(R.data(ret));
  178. // }
  179. //
  180. // @PostMapping("/docs/{docId}/tags/remove")
  181. // public ResponseEntity<R> removeTag(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
  182. // List<String> ret = dkDocsService.removeArrayField(collId, docId, "tags", values);
  183. // return ResponseEntity.ok(R.data(ret));
  184. // }
  185. /*
  186. @PostMapping("/docs/batch")
  187. public ResponseEntity<R> createBatch(@PathVariable String collId, @RequestBody List<GBaseKeyValue> kvs) throws Throwable {
  188. List<Integer> ret = dkDocsService.saveAll(collId, kvs);
  189. return ResponseEntity.ok(R.data(ret));
  190. }
  191. @PutMapping("/docs")
  192. public R update(@PathVariable String collId, @RequestBody GBaseKeyValue kv) throws Throwable {
  193. GBaseKeyValue updatedKv = dkDocsService.update(collId, kv);
  194. return R.data(updatedKv);
  195. }
  196. //////////////////
  197. //整体 metadata 管理 /collections/{collId}/docs/{docId}/metadata
  198. //单个 metadata 字段 /collections/{collId}/docs/{docId}/metadata/{key}
  199. @PostMapping("/docs/{docId}/rename")
  200. public R<?> rename(@PathVariable String collId, @PathVariable String docId, @RequestBody Map<String, Object> req
  201. ) throws Throwable {
  202. Map<String, Object> r = dkDocsService.rename(collId, docId, req);
  203. return R.data(r);
  204. }
  205. ////////////////
  206. // 更新属性
  207. @GetMapping("/docs/{docId}/attributes")
  208. public R getAttributeByKey(@PathVariable String collId, @PathVariable String docId
  209. ) throws Throwable {
  210. Object ret = dkDocsService.getAttributes(collId, docId);
  211. return R.data(ret);
  212. }
  213. @GetMapping("/docs/{docId}/attributes/{key}")
  214. public R getAttributeByKey(@PathVariable String collId, @PathVariable String docId,
  215. @PathVariable String key
  216. ) throws Throwable {
  217. Object ret = dkDocsService.getAttributeByKey(collId, docId, key);
  218. return R.data(ret);
  219. }
  220. @PatchMapping("/docs/{docId}/attributes")
  221. public R patchAttributes(@PathVariable String collId, @PathVariable String docId,
  222. @RequestBody GBaseKeyValue data
  223. ) throws Throwable {
  224. Object ret = dkDocsService.patchAttributes(collId, docId, data);
  225. return R.data(ret);
  226. }
  227. @DeleteMapping("/docs/{docId}/attributes/{key}")
  228. public R deleteAttributeByKey(@PathVariable String collId, @PathVariable String docId,
  229. @PathVariable String key
  230. ) throws Throwable {
  231. Object ret = dkDocsService.deleteAttributeByKey(collId, docId, key);
  232. return R.data(ret);
  233. }
  234. // 移除属性
  235. @DeleteMapping("/docs/{docId}/attributes")
  236. public R removeAttribute(@PathVariable String collId, @PathVariable String docId, @RequestBody List<String> keys) throws Throwable {
  237. GBaseKeyValue updatedKv = dkDocsService.deleteAttributeByKeys(collId, docId, keys);
  238. return R.data(updatedKv);
  239. }
  240. @PutMapping("/docs/{docId}/attributes")
  241. public R updateAttribute(@PathVariable String collId, @PathVariable Integer docId, @RequestBody Map<String, Object> attributes) throws Throwable {
  242. GBaseKeyValue updatedKv = dkDocsService.updateAttribute(collId, docId, attributes);
  243. return R.data(updatedKv);
  244. }
  245. @PostMapping("/docs/{docId}/altlabels/add")
  246. public ResponseEntity<R> appendAltlabels(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
  247. List<String> ret = dkDocsService.appendArrayField(collId, docId, "altlabels", values);
  248. return ResponseEntity.ok(R.data(ret));
  249. }
  250. @PostMapping("/docs/{docId}/altlabels/set")
  251. public ResponseEntity<R> setAltlabels(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
  252. List<String> ret = dkDocsService.setArrayField(collId, docId, "altlabels", values);
  253. return ResponseEntity.ok(R.data(ret));
  254. }
  255. @PostMapping("/docs/{docId}/altlabels/remove")
  256. public ResponseEntity<R> removeAltlabels(@PathVariable String collId, @PathVariable int docId, @RequestBody List<String> values) {
  257. List<String> ret = dkDocsService.removeArrayField(collId, docId, "altlabels", values);
  258. return ResponseEntity.ok(R.data(ret));
  259. }
  260. //////////////
  261. @DeleteMapping("/docs/indexes")
  262. public ResponseEntity<R> deleteDocsIndexes(@PathVariable String collId) throws IOException, InterruptedException {
  263. int r = dkDocsService.deleteAllIndex(collId);
  264. return ResponseEntity.ok(R.data(r));
  265. }
  266. */
  267. }