|
15 | 15 | #
|
16 | 16 | from flask import request
|
17 | 17 |
|
18 |
| -from api.db import StatusEnum |
19 |
| -from api.db.db_models import APIToken |
| 18 | +from api.db import StatusEnum, FileSource |
| 19 | +from api.db.db_models import File |
| 20 | +from api.db.services.document_service import DocumentService |
| 21 | +from api.db.services.file2document_service import File2DocumentService |
| 22 | +from api.db.services.file_service import FileService |
20 | 23 | from api.db.services.knowledgebase_service import KnowledgebaseService
|
21 | 24 | from api.db.services.user_service import TenantService
|
22 | 25 | from api.settings import RetCode
|
23 | 26 | from api.utils import get_uuid
|
24 |
| -from api.utils.api_utils import get_data_error_result |
25 |
| -from api.utils.api_utils import get_json_result |
| 27 | +from api.utils.api_utils import get_json_result, token_required, get_data_error_result |
26 | 28 |
|
27 | 29 |
|
28 | 30 | @manager.route('/save', methods=['POST'])
|
29 |
| -def save(): |
| 31 | +@token_required |
| 32 | +def save(tenant_id): |
30 | 33 | req = request.json
|
31 |
| - token = request.headers.get('Authorization').split()[1] |
32 |
| - objs = APIToken.query(token=token) |
33 |
| - if not objs: |
34 |
| - return get_json_result( |
35 |
| - data=False, retmsg='Token is not valid!"', retcode=RetCode.AUTHENTICATION_ERROR) |
36 |
| - tenant_id = objs[0].tenant_id |
37 | 34 | e, t = TenantService.get_by_id(tenant_id)
|
38 |
| - if not e: |
39 |
| - return get_data_error_result(retmsg="Tenant not found.") |
40 | 35 | if "id" not in req:
|
| 36 | + if "tenant_id" in req or "embd_id" in req: |
| 37 | + return get_data_error_result( |
| 38 | + retmsg="Tenant_id or embedding_model must not be provided") |
| 39 | + if "name" not in req: |
| 40 | + return get_data_error_result( |
| 41 | + retmsg="Name is not empty!") |
41 | 42 | req['id'] = get_uuid()
|
42 | 43 | req["name"] = req["name"].strip()
|
43 | 44 | if req["name"] == "":
|
44 | 45 | return get_data_error_result(
|
45 |
| - retmsg="Name is not empty") |
46 |
| - if KnowledgebaseService.query(name=req["name"]): |
| 46 | + retmsg="Name is not empty string!") |
| 47 | + if KnowledgebaseService.query(name=req["name"], tenant_id=tenant_id, status=StatusEnum.VALID.value): |
47 | 48 | return get_data_error_result(
|
48 |
| - retmsg="Duplicated knowledgebase name") |
| 49 | + retmsg="Duplicated knowledgebase name in creating dataset.") |
49 | 50 | req["tenant_id"] = tenant_id
|
50 | 51 | req['created_by'] = tenant_id
|
51 | 52 | req['embd_id'] = t.embd_id
|
52 | 53 | if not KnowledgebaseService.save(**req):
|
53 |
| - return get_data_error_result(retmsg="Data saving error") |
54 |
| - req.pop('created_by') |
55 |
| - keys_to_rename = {'embd_id': "embedding_model", 'parser_id': 'parser_method', |
56 |
| - 'chunk_num': 'chunk_count', 'doc_num': 'document_count'} |
57 |
| - for old_key,new_key in keys_to_rename.items(): |
58 |
| - if old_key in req: |
59 |
| - req[new_key]=req.pop(old_key) |
| 54 | + return get_data_error_result(retmsg="Create dataset error.(Database error)") |
60 | 55 | return get_json_result(data=req)
|
61 | 56 | else:
|
62 |
| - if req["tenant_id"] != tenant_id or req["embd_id"] != t.embd_id: |
63 |
| - return get_data_error_result( |
64 |
| - retmsg="Can't change tenant_id or embedding_model") |
| 57 | + if "tenant_id" in req: |
| 58 | + if req["tenant_id"] != tenant_id: |
| 59 | + return get_data_error_result( |
| 60 | + retmsg="Can't change tenant_id.") |
65 | 61 |
|
66 |
| - e, kb = KnowledgebaseService.get_by_id(req["id"]) |
67 |
| - if not e: |
68 |
| - return get_data_error_result( |
69 |
| - retmsg="Can't find this knowledgebase!") |
| 62 | + if "embd_id" in req: |
| 63 | + if req["embd_id"] != t.embd_id: |
| 64 | + return get_data_error_result( |
| 65 | + retmsg="Can't change embedding_model.") |
70 | 66 |
|
71 | 67 | if not KnowledgebaseService.query(
|
72 | 68 | created_by=tenant_id, id=req["id"]):
|
73 | 69 | return get_json_result(
|
74 |
| - data=False, retmsg=f'Only owner of knowledgebase authorized for this operation.', |
| 70 | + data=False, retmsg='You do not own the dataset.', |
75 | 71 | retcode=RetCode.OPERATING_ERROR)
|
76 | 72 |
|
77 |
| - if req["chunk_num"] != kb.chunk_num or req['doc_num'] != kb.doc_num: |
78 |
| - return get_data_error_result( |
79 |
| - retmsg="Can't change document_count or chunk_count ") |
| 73 | + e, kb = KnowledgebaseService.get_by_id(req["id"]) |
80 | 74 |
|
81 |
| - if kb.chunk_num > 0 and req['parser_id'] != kb.parser_id: |
82 |
| - return get_data_error_result( |
83 |
| - retmsg="if chunk count is not 0, parser method is not changable. ") |
| 75 | + if "chunk_num" in req: |
| 76 | + if req["chunk_num"] != kb.chunk_num: |
| 77 | + return get_data_error_result( |
| 78 | + retmsg="Can't change chunk_count.") |
84 | 79 |
|
| 80 | + if "doc_num" in req: |
| 81 | + if req['doc_num'] != kb.doc_num: |
| 82 | + return get_data_error_result( |
| 83 | + retmsg="Can't change document_count.") |
85 | 84 |
|
86 |
| - if req["name"].lower() != kb.name.lower() \ |
87 |
| - and len(KnowledgebaseService.query(name=req["name"], tenant_id=req['tenant_id'], |
88 |
| - status=StatusEnum.VALID.value)) > 0: |
89 |
| - return get_data_error_result( |
90 |
| - retmsg="Duplicated knowledgebase name.") |
| 85 | + if "parser_id" in req: |
| 86 | + if kb.chunk_num > 0 and req['parser_id'] != kb.parser_id: |
| 87 | + return get_data_error_result( |
| 88 | + retmsg="if chunk count is not 0, parse method is not changable.") |
| 89 | + if "name" in req: |
| 90 | + if req["name"].lower() != kb.name.lower() \ |
| 91 | + and len(KnowledgebaseService.query(name=req["name"], tenant_id=tenant_id, |
| 92 | + status=StatusEnum.VALID.value)) > 0: |
| 93 | + return get_data_error_result( |
| 94 | + retmsg="Duplicated knowledgebase name in updating dataset.") |
91 | 95 |
|
92 | 96 | del req["id"]
|
93 |
| - req['created_by'] = tenant_id |
94 | 97 | if not KnowledgebaseService.update_by_id(kb.id, req):
|
95 |
| - return get_data_error_result(retmsg="Data update error ") |
| 98 | + return get_data_error_result(retmsg="Update dataset error.(Database error)") |
96 | 99 | return get_json_result(data=True)
|
| 100 | + |
| 101 | + |
| 102 | +@manager.route('/delete', methods=['DELETE']) |
| 103 | +@token_required |
| 104 | +def delete(tenant_id): |
| 105 | + req = request.args |
| 106 | + kbs = KnowledgebaseService.query( |
| 107 | + created_by=tenant_id, id=req["id"]) |
| 108 | + if not kbs: |
| 109 | + return get_json_result( |
| 110 | + data=False, retmsg='You do not own the dataset', |
| 111 | + retcode=RetCode.OPERATING_ERROR) |
| 112 | + |
| 113 | + for doc in DocumentService.query(kb_id=req["id"]): |
| 114 | + if not DocumentService.remove_document(doc, kbs[0].tenant_id): |
| 115 | + return get_data_error_result( |
| 116 | + retmsg="Remove document error.(Database error)") |
| 117 | + f2d = File2DocumentService.get_by_document_id(doc.id) |
| 118 | + FileService.filter_delete([File.source_type == FileSource.KNOWLEDGEBASE, File.id == f2d[0].file_id]) |
| 119 | + File2DocumentService.delete_by_document_id(doc.id) |
| 120 | + |
| 121 | + if not KnowledgebaseService.delete_by_id(req["id"]): |
| 122 | + return get_data_error_result( |
| 123 | + retmsg="Delete dataset error.(Database error)") |
| 124 | + return get_json_result(data=True) |
| 125 | + |
| 126 | + |
| 127 | +@manager.route('/list', methods=['GET']) |
| 128 | +@token_required |
| 129 | +def list_datasets(tenant_id): |
| 130 | + page_number = int(request.args.get("page", 1)) |
| 131 | + items_per_page = int(request.args.get("page_size", 1024)) |
| 132 | + orderby = request.args.get("orderby", "create_time") |
| 133 | + desc = bool(request.args.get("desc", True)) |
| 134 | + tenants = TenantService.get_joined_tenants_by_user_id(tenant_id) |
| 135 | + kbs = KnowledgebaseService.get_by_tenant_ids( |
| 136 | + [m["tenant_id"] for m in tenants], tenant_id, page_number, items_per_page, orderby, desc) |
| 137 | + return get_json_result(data=kbs) |
| 138 | + |
| 139 | + |
| 140 | +@manager.route('/detail', methods=['GET']) |
| 141 | +@token_required |
| 142 | +def detail(tenant_id): |
| 143 | + req = request.args |
| 144 | + if "id" in req: |
| 145 | + id = req["id"] |
| 146 | + kb = KnowledgebaseService.query(created_by=tenant_id, id=req["id"]) |
| 147 | + if not kb: |
| 148 | + return get_json_result( |
| 149 | + data=False, retmsg='You do not own the dataset', |
| 150 | + retcode=RetCode.OPERATING_ERROR) |
| 151 | + if "name" in req: |
| 152 | + name = req["name"] |
| 153 | + if kb[0].name != name: |
| 154 | + return get_json_result( |
| 155 | + data=False, retmsg='You do not own the dataset', |
| 156 | + retcode=RetCode.OPERATING_ERROR) |
| 157 | + e, k = KnowledgebaseService.get_by_id(id) |
| 158 | + return get_json_result(data=k.to_dict()) |
| 159 | + else: |
| 160 | + if "name" in req: |
| 161 | + name = req["name"] |
| 162 | + e, k = KnowledgebaseService.get_by_name(kb_name=name, tenant_id=tenant_id) |
| 163 | + if not e: |
| 164 | + return get_json_result( |
| 165 | + data=False, retmsg='You do not own the dataset', |
| 166 | + retcode=RetCode.OPERATING_ERROR) |
| 167 | + return get_json_result(data=k.to_dict()) |
| 168 | + else: |
| 169 | + return get_data_error_result( |
| 170 | + retmsg="At least one of `id` or `name` must be provided.") |
0 commit comments