def admin_endpoint_api_remove(endpoint_id): endpoint = MongoConn.get_endpoints_col() ept = endpoint.find_one({'_id':ObjectId(endpoint_id)}) if ept is not None: collection_list = MongoConn.get_collection(ept['collection_list']) collections = list(collection_list.find()) for i in collections: print(i['collection_name']) print("finding " + i['collection_name']) c = MongoConn.get_collection(i['collection_name']) if c is not None: print("removing " + i['collection_name']) c.drop() collection_list.drop() endpoint.delete_one({'_id': ObjectId(endpoint_id)}) msg = {'result':'successful','msg': "Endpoint removed."} else: msg = {'result':'failed','msg': "Endpoint does not exist."} return jsonify(msg)
def general_collection_api_aggregate(endpoint_name, collection_id): endpoint = MongoConn.get_collection("endpoints") ept = endpoint.find_one({'endpoint_name': endpoint_name}) if ept is not None: collection_list = MongoConn.get_collection(ept['collection_list']) c = collection_list.find_one({'_id': ObjectId(collection_id)}) if c is not None: collection = MongoConn.get_collection(c['collection_name']) req = request.json print(req) results = list(collection.aggregate(req)) msg = json.loads(JSONUtils.JSONEncoder().encode(results)) else: msg = { 'result': 'failed', 'msg': "Collection_id: " + collection_id + " does not exist" } else: msg = { 'result': 'failed', 'msg': "Endpoint " + endpoint_name + " does not exist" } return jsonify(msg)
def general_endpoint_api_get(endpoint_name, collection_id): endpoint = MongoConn.get_endpoints_col() ept = endpoint.find_one({'endpoint_name': endpoint_name}) if ept is not None: collection_list = MongoConn.get_collection(ept['collection_list']) c = collection_list.find_one({'_id': ObjectId(collection_id)}) limit = int(request.args.get('limit')) offset = int(request.args.get('offset')) if c is not None: collection = MongoConn.get_collection(c['collection_name']) results = list(collection.find().skip(offset).limit(limit)) msg = json.loads(JSONUtils.JSONEncoder().encode(results)) else: msg = { 'result': 'failed', 'msg': "Collection_id: " + collection_id + " does not exist" } else: msg = { 'result': 'failed', 'msg': "Endpoint " + endpoint_name + " does not exist" } return jsonify(msg)
def admin_users_api_set_role(): user = MongoConn.get_user_col() u = user.find_one({'_id': ObjectId(request.json['user_id'])}) role = request.json['user_role'] print(role) if role == Config.ADMIN or role == Config.TYPE_ONE or role == Config.TYPE_TWO or role == Config.TYPE_THREE: #There are four types of users. Set role according to the request. user.update_one({'_id': u['_id']}, {'$set': { 'role': role }}, upsert=False) return jsonify({ 'result': "successful", "msg": "User " + u['username'] + "\'s role has been changed to " + role + "." }) else: return jsonify({ 'result': "failed", "msg": role + " is not a valid user role." })
def general_endpoint_api_create(endpoint_name): endpoint = MongoConn.get_endpoints_col() ept = endpoint.find_one({'endpoint_name': endpoint_name}) if ept is not None: collection_list = MongoConn.get_collection(ept['collection_list']) json = request.json c = collection_list.find_one( {'collection_name': json['collection_name']}) if c is None: date = datetime.now() _id = collection_list.insert({ 'collection_name': json['collection_name'], 'collection_des': json['collection_des'], 'create_at_ts': date.strftime('%S'), 'create_at_str': date.strftime('%Y-%m-%d %H:%M:%S'), 'username': session['user']['username'], }) msg = { 'result': 'successful', 'msg': "Collection " + json['collection_name'] + " is created", 'collection_id': str(_id) } else: msg = { 'result': 'failed', 'msg': "Collection " + json['collection_name'] + " exists" } else: msg = { 'result': 'failed', 'msg': "Endpoint " + endpoint_name + " does not exist" } return jsonify(msg)
def general_endpoint_api_list(endpoint_name): endpoint = MongoConn.get_endpoints_col() ept = endpoint.find_one({'endpoint_name': endpoint_name}) if ept is not None: collection_list = MongoConn.get_collection(ept['collection_list']) collections = list(collection_list.find()) return JSONUtils.JSONEncoder().encode(collections) else: msg = { 'result': 'failed', 'msg': "Endpoint " + endpoint_name + " does not exist" } return jsonify(msg)
def check_admin_read(*args, **kwargs): user = session['user'] users = MongoConn.get_user_col() u = users.find_one({'username': user['username']}) if u is None: return jsonify({'result': 'failed', 'reason': "Access denied, invalid token."}) else: print(u) if u['role'] == Config.ADMIN or u['role'] == Config.TYPE_ONE or u['role'] == Config.TYPE_TWO or u['role'] == Config.TYPE_THREE: return func(*args, **kwargs) else: return jsonify({'result': 'failed', 'reason': "Access denied, admin or type1,2,3 only."})
def general_collection_api_put(endpoint_name, collection_id): endpoint = MongoConn.get_collection("endpoints") ept = endpoint.find_one({'endpoint_name': endpoint_name}) if ept is not None: collection_list = MongoConn.get_collection(ept['collection_list']) c = collection_list.find_one({'_id': ObjectId(collection_id)}) if c is not None: collection = MongoConn.get_collection(c['collection_name']) json = request.json print(json) #update for record in json: collection.replace_one({'_id': ObjectId(record['id'])}, record) msg = { 'result': 'successful', 'msg': str(len(json)) + " records in Collection_id: " + collection_id + " are updated" } else: msg = { 'result': 'failed', 'msg': "Collection_id: " + collection_id + " does not exist" } else: msg = { 'result': 'failed', 'msg': "Endpoint " + endpoint_name + " does not exist" } return jsonify(msg)
def check_admin(*args, **kwargs): user = session['user'] users = MongoConn.get_user_col() u = users.find_one({'username': user['username']}) if u is None: return jsonify({'result': 'failed', 'reason': "Access denied, invalid token."}) # return Response("Access denied, invalid token") else: print (u) if u['role'] == Config.ADMIN: return func(*args, **kwargs) else: return jsonify({'result': 'failed', 'reason': "Access denied, admin only."})
def general_endpoint_api_post(endpoint_name, collection_id): endpoint = MongoConn.get_endpoints_col() ept = endpoint.find_one({'endpoint_name': endpoint_name}) if ept is not None: collection_list = MongoConn.get_collection(ept['collection_list']) c = collection_list.find_one({'_id': ObjectId(collection_id)}) if c is not None: collection = MongoConn.get_collection(c['collection_name']) json = request.json # Seems all json posted would be save into db, not sure how to restrict column. print(json) collection.insert_many(json) # Insert number can not be only 1. msg = { 'result': 'successful', 'msg': str(len(json)) + " records are saved to " + collection_id } else: msg = { 'result': 'failed', 'msg': "Collection_id: " + collection_id + " does not exist" } else: msg = { 'result': 'failed', 'msg': "Endpoint " + endpoint_name + " does not exist" } return jsonify(msg)
def general_collection_remove_api(endpoint_name, collection_id): endpoint = MongoConn.get_endpoints_col() ept = endpoint.find_one({'endpoint_name': endpoint_name}) if ept is not None: collection_list = MongoConn.get_collection(ept['collection_list']) c = collection_list.find_one({'_id': ObjectId(collection_id)}) if c is not None: collection_list.delete_one({'_id': ObjectId(collection_id)}) collection = MongoConn.get_collection(c['collection_name']) if collection is not None: collection.drop() msg = { 'result': 'successful', 'msg': "Collection_ID " + collection_id + " has been removed from " + endpoint_name } else: msg = { 'result': 'failed', 'msg': "Collection_ID " + collection_id + " does not exist in " + endpoint_name } else: msg = { 'result': 'failed', 'msg': "Endpoint " + endpoint_name + " does not exist" } return jsonify(msg)
def general_collection_info_api(endpoint_name, collection_id): endpoint = MongoConn.get_endpoints_col() print(endpoint_name) ept = endpoint.find_one({'endpoint_name': endpoint_name}) print(session['user']) if ept is not None: collection_list = MongoConn.get_collection(ept['collection_list']) c = collection_list.find_one({'_id': ObjectId(collection_id)}) print(c) if c is not None: msg = { 'Welcome': session['user']['username'], 'Message': Config.General_ENDPOINT_API_DES, 'Endpoint_name': endpoint_name, 'Endpoint_desc': ept['endpoint_desc'], 'Collection_name': c['collection_name'], 'Collection_desc': c['collection_des'] } else: msg = { 'result': 'failed', 'msg': "Collection_ID " + collection_id + " does not exist in " + endpoint_name } else: msg = { 'result': 'failed', 'msg': "Endpoint " + endpoint_name + " does not exist" } return jsonify(msg)
def admin_users_api_remove(user_id): user = MongoConn.get_user_col() u = user.find_one({'_id': ObjectId(user_id)}) if u is not None: user.delete_one({'_id': ObjectId(user_id)}) return jsonify({ 'result': "successful", "msg": "User " + u['username'] + " has been removed." }) else: return jsonify({ 'result': "failed", "msg": "User " + u['username'] + " does not exist." })
def admin_endpoint_api_create(): endpoint = MongoConn.get_endpoints_col() date = datetime.now() json = request.json # Duplicate name could happen here. endpoint.insert({ 'create_at_ts': date.strftime('%S'), 'create_at_str': date.strftime('%Y-%m-%d %H:%M:%S'), 'username': session['user']['username'], 'endpoint_name': json['endpoint_name'], # Better have some restriction on no-space. 'endpoint_desc': json['endpoint_desc'], 'collection_list': json['collection_list'] # Better have some restriction on no-space. }) return jsonify({'result': "successful", "msg": "Endpoint " + json['endpoint_name'] + " created"})
def general_endpoint_api(endpoint_name): endpoint = MongoConn.get_endpoints_col() ept = endpoint.find_one({'endpoint_name': endpoint_name}) if ept is not None: msg = { 'Welcome': session['user']['username'], 'Message': Config.General_ENDPOINT_API_DES, 'Endpoint_name': endpoint_name, 'Endpoint_desc': ept['endpoint_desc'] } else: msg = { 'result': 'failed', 'msg': "Endpoint " + endpoint_name + " does not exist" } return jsonify(msg)
def authenticate_user(): user = MongoConn.get_user_col() username = request.json['username'] password = request.json['password'] u = user.find_one({'username': username}) if u is None: return jsonify({'result': "Failed, user no not existed!"}) else: pwd_hash = u['password'] if (PwdUtils.verify_password(password, pwd_hash)): token = jwt.encode({ 'username': username, 'password': pwd_hash }, Config.API_SECRET, algorithm=Config.TOKEN_ALG).decode('utf-8') query = {'_id': u['_id']} update_record = { '$set': { 'token': token, 'token_created_at': datetime.now().strftime('%Y-%m-%d %H:%M:%S') } } user.update_one(query, update_record, upsert=True) return jsonify({ 'result': "successful", "token": token, "username": username, "role": u['role'] }) else: return jsonify({'result': "Failed, pls provide correct password!"})
def register_user(): username = request.json['username'] password = request.json['password'] user = MongoConn.get_user_col() u = user.find_one({'username': username}) if u is None: date = datetime.now() encrypted_pwd = PwdUtils.set_password(password) token = jwt.encode({ 'username': username, 'password': encrypted_pwd }, Config.API_SECRET, algorithm=Config.TOKEN_ALG).decode('utf-8') user.insert({ 'create_at_ts': date.strftime('%S'), 'create_at_str': date.strftime('%Y-%m-%d %H:%M:%S'), 'username': username, 'role': Config.TYPE_ONE, 'password': encrypted_pwd, 'token': token, 'token_created_at': date.strftime('%Y-%m-%d %H:%M:%S') }) return jsonify({ 'result': "successful", "token": token, "username": username, "role": Config.TYPE_ONE }) else: return jsonify({'result': "Failed, user existed!"})
from flask import Flask from flask import jsonify from Utils import Config, MongoConn, PostgreConn from flask_cors import CORS from Flaskr import (auth, api_home, api_user, api_endpoints, api_endpoint_collections, api_dbtable) app = Flask(__name__) app.secret_key = 'FusionTreeAPI' CORS(app) # initialize mongodb connection MongoConn.init_db(app) PostgreConn.init_db() # root api @app.route('/', methods=['GET']) def show_welcome(): # return render_template("index.html") return jsonify(Config.ROOT_DES) app.register_blueprint(auth.bp) app.register_blueprint(api_home.bp) app.register_blueprint(api_user.bp) app.register_blueprint(api_endpoints.bp) app.register_blueprint(api_endpoint_collections.bp) app.register_blueprint(api_dbtable.bp) if __name__ == '__main__':
def admin_endpoint_api_list(): endpoint = MongoConn.get_endpoints_col() endpoints = list(endpoint.find()) return JSONUtils.JSONEncoder().encode(endpoints)
def admin_users_api_list(): user = MongoConn.get_user_col() users = list(user.find()) return JSONUtils.JSONEncoder().encode(users)