GYH commited on
Commit
9d69040
·
1 Parent(s): bf38604

Add /api/document/rm function (#887)

Browse files

### What problem does this PR solve?

Delete files from a knowledge base.

#717

### Type of change

- [x] New Feature (non-breaking change which adds functionality)

Files changed (1) hide show
  1. api/apps/api_app.py +62 -2
api/apps/api_app.py CHANGED
@@ -20,8 +20,8 @@ from datetime import datetime, timedelta
20
  from flask import request, Response
21
  from flask_login import login_required, current_user
22
 
23
- from api.db import FileType, ParserType
24
- from api.db.db_models import APIToken, API4Conversation, Task
25
  from api.db.services import duplicate_name
26
  from api.db.services.api_service import APITokenService, API4ConversationService
27
  from api.db.services.dialog_service import DialogService, chat
@@ -428,3 +428,63 @@ def list_kb_docs():
428
 
429
  except Exception as e:
430
  return server_error_response(e)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  from flask import request, Response
21
  from flask_login import login_required, current_user
22
 
23
+ from api.db import FileType, ParserType, FileSource
24
+ from api.db.db_models import APIToken, API4Conversation, Task, File
25
  from api.db.services import duplicate_name
26
  from api.db.services.api_service import APITokenService, API4ConversationService
27
  from api.db.services.dialog_service import DialogService, chat
 
428
 
429
  except Exception as e:
430
  return server_error_response(e)
431
+
432
+
433
+ @manager.route('/document/rm', methods=['POST'])
434
+ # @login_required
435
+ def document_rm():
436
+ token = request.headers.get('Authorization').split()[1]
437
+ objs = APIToken.query(token=token)
438
+ if not objs:
439
+ return get_json_result(
440
+ data=False, retmsg='Token is not valid!"', retcode=RetCode.AUTHENTICATION_ERROR)
441
+
442
+ tenant_id = objs[0].tenant_id
443
+ req = request.json
444
+ doc_ids = []
445
+ try:
446
+ doc_ids = [DocumentService.get_doc_id_by_doc_name(doc_name) for doc_name in req.get("doc_names", [])]
447
+ for doc_id in req.get("doc_ids", []):
448
+ if doc_id not in doc_ids:
449
+ doc_ids.append(doc_id)
450
+
451
+ if not doc_ids:
452
+ return get_json_result(
453
+ data=False, retmsg="Can't find doc_names or doc_ids"
454
+ )
455
+
456
+ except Exception as e:
457
+ return server_error_response(e)
458
+
459
+ root_folder = FileService.get_root_folder(tenant_id)
460
+ pf_id = root_folder["id"]
461
+ FileService.init_knowledgebase_docs(pf_id, tenant_id)
462
+
463
+ errors = ""
464
+ for doc_id in doc_ids:
465
+ try:
466
+ e, doc = DocumentService.get_by_id(doc_id)
467
+ if not e:
468
+ return get_data_error_result(retmsg="Document not found!")
469
+ tenant_id = DocumentService.get_tenant_id(doc_id)
470
+ if not tenant_id:
471
+ return get_data_error_result(retmsg="Tenant not found!")
472
+
473
+ b, n = File2DocumentService.get_minio_address(doc_id=doc_id)
474
+
475
+ if not DocumentService.remove_document(doc, tenant_id):
476
+ return get_data_error_result(
477
+ retmsg="Database error (Document removal)!")
478
+
479
+ f2d = File2DocumentService.get_by_document_id(doc_id)
480
+ FileService.filter_delete([File.source_type == FileSource.KNOWLEDGEBASE, File.id == f2d[0].file_id])
481
+ File2DocumentService.delete_by_document_id(doc_id)
482
+
483
+ MINIO.rm(b, n)
484
+ except Exception as e:
485
+ errors += str(e)
486
+
487
+ if errors:
488
+ return get_json_result(data=False, retmsg=errors, retcode=RetCode.SERVER_ERROR)
489
+
490
+ return get_json_result(data=True)