c_dataset_file.go 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. package controllers
  2. import (
  3. "fmt"
  4. "io"
  5. "github.com/gogf/gf/v2/net/ghttp"
  6. "yx-dataset-server/app/bll"
  7. "yx-dataset-server/app/errors"
  8. "yx-dataset-server/app/schema"
  9. "yx-dataset-server/library/gplus"
  10. )
  11. type DatasetFile struct {
  12. DatasetFileBll bll.IDatasetFile
  13. }
  14. func NewDatasetFile(bDatasetFile bll.IDatasetFile) *DatasetFile {
  15. return &DatasetFile{
  16. DatasetFileBll: bDatasetFile,
  17. }
  18. }
  19. // Query 查询数据
  20. func (a *DatasetFile) Query(r *ghttp.Request) {
  21. switch r.Get("q").String() {
  22. case "page":
  23. a.QueryPage(r)
  24. case "list":
  25. a.QueryList(r)
  26. default:
  27. gplus.ResError(r, errors.ErrUnknownQuery)
  28. }
  29. }
  30. // QueryPage 查询分页数据
  31. // @Tags
  32. // @Summary 查询分页数据
  33. // @Param Authorization header string false "Bearer 用户令牌"
  34. // @Param current query int true "分页索引" 1
  35. // @Param pageSize query int true "分页大小" 10
  36. // @Success 200 []schema.DatasetFile "查询结果:{list:列表数据,pagination:{current:页索引,pageSize:页大小,total:总数量}}"
  37. // @Failure 400 schema.HTTPError "{error:{code:0,message:未知的查询类型}}"
  38. // @Failure 401 schema.HTTPError "{error:{code:0,message:未授权}}"
  39. // @Failure 500 schema.HTTPError "{error:{code:0,message:服务器错误}}"
  40. // @Router GET /web/v1/dataset_files?q=page
  41. func (a *DatasetFile) QueryPage(r *ghttp.Request) {
  42. ctx := gplus.NewContext(r)
  43. var params schema.DatasetFileQueryParam
  44. params.DatasetId = r.Get("dataset_id").String()
  45. result, err := a.DatasetFileBll.Query(ctx, params, schema.DatasetFileQueryOptions{
  46. PageParam: &schema.PaginationParam{
  47. PageIndex: gplus.GetPageIndex(r),
  48. PageSize: gplus.GetPageSize(r),
  49. },
  50. })
  51. if err != nil {
  52. gplus.ResError(r, err)
  53. }
  54. ResPage(r, result.Data, result.PageResult)
  55. }
  56. // QueryList 查询列表数据
  57. // @Tags
  58. // @Summary 查询列表数据
  59. // @Param Authorization header string false "Bearer 用户令牌"
  60. // @Success 200 []schema.DatasetFile "查询结果:{list:列表数据}"
  61. // @Failure 400 schema.HTTPError "{error:{code:0,message:未知的查询类型}}"
  62. // @Failure 401 schema.HTTPError "{error:{code:0,message:未授权}}"
  63. // @Failure 500 schema.HTTPError "{error:{code:0,message:服务器错误}}"
  64. // @Router GET /web/v1/dataset_files?q=list
  65. func (a *DatasetFile) QueryList(r *ghttp.Request) {
  66. ctx := gplus.NewContext(r)
  67. var params schema.DatasetFileQueryParam
  68. params.DatasetId = r.Get("dataset_id").String()
  69. result, err := a.DatasetFileBll.Query(ctx, params)
  70. if err != nil {
  71. gplus.ResError(r, err)
  72. }
  73. ResSuccess(r, result.Data)
  74. }
  75. // Get 获取数据
  76. // @Summary 获取数据
  77. // @Param id path string true "记录ID"
  78. // @Success 200 schema.DatasetFile
  79. // @Failure 400 schema.HTTPError "{error:{code:0,message:无效的请求参数}}"
  80. // @Failure 401 schema.HTTPError "{error:{code:0,message:未授权}}"
  81. // @Failure 500 schema.HTTPError "{error:{code:0,message:服务器错误}}"
  82. // @Router /web/v1/dataset_file/{id}
  83. func (a *DatasetFile) Get(r *ghttp.Request) {
  84. ctx := gplus.NewContext(r)
  85. result, err := a.DatasetFileBll.Get(ctx, r.Get("id").String())
  86. if err != nil {
  87. gplus.ResError(r, err)
  88. }
  89. ResSuccess(r, result)
  90. }
  91. // Create 创建数据
  92. // @Tags API-DatasetFile
  93. // @Summary 创建数据
  94. // @Param body schema.DatasetFile true "提交的数据"
  95. // @Success 200 schema.DatasetFile
  96. // @Failure 400 schema.HTTPError "{error:{code:0,message:无效的请求参数}}"
  97. // @Failure 401 schema.HTTPError "{error:{code:0,message:未授权}}"
  98. // @Failure 500 schema.HTTPError "{error:{code:0,message:服务器错误}}"
  99. // @Router /web/v1/dataset_files/ [post]
  100. func (a *DatasetFile) Create(r *ghttp.Request) {
  101. var data schema.DatasetFile
  102. if err := gplus.ParseJson(r, &data); err != nil {
  103. gplus.ResError(r, err)
  104. }
  105. ctx := gplus.NewContext(r)
  106. err := a.DatasetFileBll.Create(ctx, data)
  107. if err != nil {
  108. gplus.ResError(r, err)
  109. }
  110. ResSuccess(r, nil)
  111. }
  112. func (a *DatasetFile) BatchCreate(r *ghttp.Request) {
  113. var data schema.DatasetFiles
  114. if err := gplus.ParseJson(r, &data); err != nil {
  115. gplus.ResError(r, err)
  116. }
  117. ctx := gplus.NewContext(r)
  118. err := a.DatasetFileBll.BatchCreate(ctx, data)
  119. if err != nil {
  120. gplus.ResError(r, err)
  121. }
  122. ResSuccess(r, nil)
  123. }
  124. // Update 更新数据
  125. // @Summary 更新数据
  126. // @Param body schema.DatasetFile true "更新数据"
  127. // @Success 200 schema.DatasetFile
  128. // @Failure 400 schema.HTTPError "{error:{code:0,message:无效的请求参数}}"
  129. // @Failure 401 schema.HTTPError "{error:{code:0,message:未授权}}"
  130. // @Failure 500 schema.HTTPError "{error:{code:0,message:服务器错误}}"
  131. // @Router /web/v1/dataset_files/{id}
  132. func (a *DatasetFile) Update(r *ghttp.Request) {
  133. var data schema.DatasetFile
  134. if err := gplus.ParseJson(r, &data); err != nil {
  135. gplus.ResError(r, err)
  136. }
  137. ctx := gplus.NewContext(r)
  138. err := a.DatasetFileBll.Update(ctx, r.Get("id").String(), data)
  139. if err != nil {
  140. gplus.ResError(r, err)
  141. }
  142. ResSuccess(r, nil)
  143. }
  144. // Delete 删除数据
  145. // @Summary 删除数据
  146. // @Param id path string true "记录ID"
  147. // @Success 200 schema.HTTPStatus "{status:OK}"
  148. // @Failure 400 schema.HTTPError "{error:{code:0,message:无效的请求参数}}"
  149. // @Failure 401 schema.HTTPError "{error:{code:0,message:未授权}}"
  150. // @Failure 500 schema.HTTPError "{error:{code:0,message:服务器错误}}"
  151. // @Router /web/v1/dataset_file/{id}
  152. func (a *DatasetFile) Delete(r *ghttp.Request) {
  153. ctx := gplus.NewContext(r)
  154. err := a.DatasetFileBll.Delete(ctx, r.Get("id").String())
  155. if err != nil {
  156. gplus.ResError(r, err)
  157. }
  158. ResSuccess(r, nil)
  159. }
  160. func (a *DatasetFile) BatchDelete(r *ghttp.Request) {
  161. var Ids schema.DeleteIds
  162. if err := gplus.ParseJson(r, &Ids); err != nil {
  163. gplus.ResError(r, err)
  164. }
  165. ctx := gplus.NewContext(r)
  166. err := a.DatasetFileBll.BatchDelete(ctx, Ids.Ids)
  167. if err != nil {
  168. gplus.ResError(r, err)
  169. }
  170. ResSuccess(r, nil)
  171. }
  172. func (a *DatasetFile) Enabled(r *ghttp.Request) {
  173. ctx := gplus.NewContext(r)
  174. err := a.DatasetFileBll.UpdateEnabled(ctx, r.Get("id").String(), true)
  175. if err != nil {
  176. gplus.ResError(r, err)
  177. }
  178. ResSuccess(r, nil)
  179. }
  180. func (a *DatasetFile) Disabled(r *ghttp.Request) {
  181. ctx := gplus.NewContext(r)
  182. err := a.DatasetFileBll.UpdateEnabled(ctx, r.Get("id").String(), false)
  183. if err != nil {
  184. gplus.ResError(r, err)
  185. }
  186. ResSuccess(r, nil)
  187. }
  188. // CreateV2 上传本地文件(V2版本,直接上传到RagFlow,不再上传Minio)
  189. // @Summary 上传本地文件到知识库(V2)
  190. // @Description 接收文件上传,直接上传到RagFlow,不再上传Minio
  191. // @Param Authorization header string false "Bearer 用户令牌"
  192. // @Param file formData file true "文件"
  193. // @Param dataset_id formData string true "知识库ID"
  194. // @Success 200 schema.HTTPStatus "{status:OK}"
  195. // @Failure 400 schema.HTTPError "{error:{code:0,message:无效的请求参数}}"
  196. // @Failure 401 schema.HTTPError "{error:{code:0,message:未授权}}"
  197. // @Failure 500 schema.HTTPError "{error:{code:0,message:服务器错误}}"
  198. // @Router POST /web/v1/dataset_files/upload
  199. func (a *DatasetFile) CreateV2(r *ghttp.Request) {
  200. ctx := gplus.NewContext(r)
  201. datasetId := r.Get("dataset_id").String()
  202. if datasetId == "" {
  203. gplus.ResError(r, errors.New400Response("dataset_id 不能为空"))
  204. return
  205. }
  206. file, header, err := r.Request.FormFile("file")
  207. if err != nil {
  208. gplus.ResError(r, errors.New400Response("请选择要上传的文件"))
  209. return
  210. }
  211. defer file.Close()
  212. // 直接读入内存后交给 BLL,避免落盘临时文件
  213. fileData, err := io.ReadAll(file)
  214. if err != nil {
  215. gplus.ResError(r, errors.New400Response("读取文件内容失败"))
  216. return
  217. }
  218. if err := a.DatasetFileBll.CreateV2(ctx, schema.UpdateFileParam{
  219. FileName: header.Filename,
  220. FileData: fileData,
  221. FileSize: header.Size,
  222. DatasetId: datasetId,
  223. CreatorId: gplus.GetUserId(r),
  224. }); err != nil {
  225. gplus.ResError(r, err)
  226. return
  227. }
  228. ResSuccess(r, nil)
  229. }
  230. // BatchCreate2 批量上传多个文件到知识库(multipart form-data, 字段名 files)
  231. // @Summary 批量上传文件到知识库
  232. // @Param Authorization header string false "Bearer 用户令牌"
  233. // @Param files formData file true "多文件,表单字段名为 files"
  234. // @Param dataset_id formData string true "知识库ID"
  235. // @Success 200 schema.HTTPStatus "{status:OK}"
  236. // @Failure 400 schema.HTTPError "{error:{code:0,message:无效的请求参数}}"
  237. // @Router POST /web/v1/dataset_files/batch2
  238. func (a *DatasetFile) BatchCreateV2(r *ghttp.Request) {
  239. ctx := gplus.NewContext(r)
  240. datasetId := r.Get("dataset_id").String()
  241. if datasetId == "" {
  242. gplus.ResError(r, errors.New400Response("dataset_id 不能为空"))
  243. return
  244. }
  245. uploads := r.GetUploadFiles("file")
  246. if len(uploads) == 0 {
  247. gplus.ResError(r, errors.New400Response("请选择要上传的文件"))
  248. return
  249. }
  250. creatorId := gplus.GetUserId(r)
  251. params := make([]schema.UpdateFileParam, 0, len(uploads))
  252. for _, uf := range uploads {
  253. f, err := uf.Open()
  254. if err != nil {
  255. gplus.ResError(r, errors.New400Response(fmt.Sprintf("打开文件【%s】失败", uf.Filename)))
  256. return
  257. }
  258. data, err := io.ReadAll(f)
  259. _ = f.Close()
  260. if err != nil {
  261. gplus.ResError(r, errors.New400Response(fmt.Sprintf("读取文件【%s】失败", uf.Filename)))
  262. return
  263. }
  264. params = append(params, schema.UpdateFileParam{
  265. FileName: uf.Filename,
  266. FileData: data,
  267. FileSize: uf.Size,
  268. DatasetId: datasetId,
  269. CreatorId: creatorId,
  270. })
  271. }
  272. if err := a.DatasetFileBll.BatchCreateV2(ctx, datasetId, params); err != nil {
  273. gplus.ResError(r, err)
  274. return
  275. }
  276. ResSuccess(r, nil)
  277. }