From 9547fce4843066ee8b0ac960e4e9813629c3ee03 Mon Sep 17 00:00:00 2001
From: "hu.sima" <simahu@yahoo.com>
Date: Thu, 31 Aug 2023 10:49:56 +0800
Subject: [PATCH] feat: add cmdb custom icon manage

---
 .../api/lib/common_setting/common_data.py     | 46 +++++++++++++++++++
 .../api/lib/common_setting/resp_format.py     |  1 +
 cmdb-api/api/models/common_setting.py         |  7 +++
 .../api/views/common_setting/common_data.py   | 35 ++++++++++++++
 4 files changed, 89 insertions(+)
 create mode 100644 cmdb-api/api/lib/common_setting/common_data.py
 create mode 100644 cmdb-api/api/views/common_setting/common_data.py

diff --git a/cmdb-api/api/lib/common_setting/common_data.py b/cmdb-api/api/lib/common_setting/common_data.py
new file mode 100644
index 0000000..00c7398
--- /dev/null
+++ b/cmdb-api/api/lib/common_setting/common_data.py
@@ -0,0 +1,46 @@
+from flask import abort
+
+from api.extensions import db
+from api.lib.common_setting.resp_format import ErrFormat
+from api.models.common_setting import CommonData
+
+
+class CommonDataCRUD(object):
+
+    @staticmethod
+    def get_data_by_type(data_type):
+        return CommonData.get_by(data_type=data_type)
+
+    @staticmethod
+    def get_data_by_id(_id, to_dict=True):
+        return CommonData.get_by(first=True, id=_id, to_dict=to_dict)
+
+    @staticmethod
+    def create_new_data(data_type, **kwargs):
+        try:
+            return CommonData.create(data_type=data_type, **kwargs)
+        except Exception as e:
+            db.session.rollback()
+            abort(400, str(e))
+
+    @staticmethod
+    def update_data(_id, **kwargs):
+        existed = CommonDataCRUD.get_data_by_id(_id, to_dict=False)
+        if not existed:
+            abort(404, ErrFormat.common_data_not_found.format(_id))
+        try:
+            return existed.update(**kwargs)
+        except Exception as e:
+            db.session.rollback()
+            abort(400, str(e))
+
+    @staticmethod
+    def delete(_id):
+        existed = CommonDataCRUD.get_data_by_id(_id, to_dict=False)
+        if not existed:
+            abort(404, ErrFormat.common_data_not_found.format(_id))
+        try:
+            existed.soft_delete()
+        except Exception as e:
+            db.session.rollback()
+            abort(400, str(e))
diff --git a/cmdb-api/api/lib/common_setting/resp_format.py b/cmdb-api/api/lib/common_setting/resp_format.py
index 1d3b8d9..a50c938 100644
--- a/cmdb-api/api/lib/common_setting/resp_format.py
+++ b/cmdb-api/api/lib/common_setting/resp_format.py
@@ -54,3 +54,4 @@ class ErrFormat(CommonErrFormat):
     email_is_required = "邮箱不能为空"
     email_format_error = "邮箱格式错误"
 
+    common_data_not_found = "ID {} 找不到记录"
diff --git a/cmdb-api/api/models/common_setting.py b/cmdb-api/api/models/common_setting.py
index 2bcc4f6..f222ea9 100644
--- a/cmdb-api/api/models/common_setting.py
+++ b/cmdb-api/api/models/common_setting.py
@@ -80,3 +80,10 @@ class InternalMessage(Model):
     category = db.Column(db.VARCHAR(128), nullable=False)
     message_data = db.Column(db.JSON, nullable=True)
     employee_id = db.Column(db.Integer, db.ForeignKey('common_employee.employee_id'), comment='ID')
+
+
+class CommonData(Model):
+    __table_name__ = 'common_data'
+
+    data_type = db.Column(db.VARCHAR(255), default='')
+    data = db.Column(db.JSON)
diff --git a/cmdb-api/api/views/common_setting/common_data.py b/cmdb-api/api/views/common_setting/common_data.py
new file mode 100644
index 0000000..6d44ba1
--- /dev/null
+++ b/cmdb-api/api/views/common_setting/common_data.py
@@ -0,0 +1,35 @@
+from flask import request
+
+from api.lib.common_setting.common_data import CommonDataCRUD
+from api.resource import APIView
+
+prefix = '/data'
+
+
+class DataView(APIView):
+    url_prefix = (f'{prefix}/<string:data_type>',)
+
+    def get(self, data_type):
+        data_list = CommonDataCRUD.get_data_by_type(data_type)
+
+        return self.jsonify(data_list)
+
+    def post(self, data_type):
+        params = request.json
+        CommonDataCRUD.create_new_data(data_type, **params)
+
+        return self.jsonify(params)
+
+
+class DataViewWithId(APIView):
+    url_prefix = (f'{prefix}/<string:data_type>/<int:_id>',)
+
+    def put(self, data_type, _id):
+        params = request.json
+        res = CommonDataCRUD.update_data(_id, **params)
+
+        return self.jsonify(res.to_dict())
+
+    def delete(self, data_type, _id):
+        CommonDataCRUD.delete(_id)
+        return self.jsonify({})