import DataBase.mongoDB as DataBase import RegularExpressionParser.Parser as Parser import re import Crawler.Scrape as Scrape import json from flask import Flask from flask import request from flask import abort from flask import jsonify from urllib.parse import urlparse, parse_qs from flask_cors import CORS, cross_origin app = Flask(__name__) cors = CORS(app) # cors = CORS(app, resources={r"/api/*": {"origins": "*"}}) @app.route("/api/book/", methods=["GET", "PUT", "POST", "DELETE", "OPTIONS"]) def data_base_book(): print(request.url) """ data base page of server """ if request.method == "GET": url_parsed = urlparse(request.url) qs_parsed = parse_qs(url_parsed.query) if qs_parsed == {}: return DataBase.get_documents_json(0, {}) result = search_document(["book.id:" + qs_parsed["id"][0]]) if result == {"wrong": "True"}: abort(400, "Bad Request") elif result == json.dumps({'books': []}): abort(400, "Book not found") else: return result elif request.method == "PUT": if request.headers["Content-Type"] != "application/json": abort(415, "content should be JSON file") print(request) json_update_info = request.json opt = 0 DataBase.update_dicts(opt, request.args.to_dict(), json_update_info) return "200: PUT succeeded" elif request.method == "POST": if request.headers["Content-Type"] != "application/json": abort(415, "content should be JSON file") print(request) json_file = request.json DataBase.insert_document(json_file, 0) return "200: POST succeeded" elif request.method == "DELETE": identifier = request.args.to_dict() print(identifier) opt=0 deleted_count = DataBase.clean(opt, identifier) if deleted_count > 0: return "200: DELETE succeeded" else: abort(400, "Failed to delete: target not found") elif request.method == "OPTIONS": return '200 OK' @app.route("/api/author/", methods=["GET", "PUT", "POST", "DELETE", "OPTIONS"]) def data_base_author(): print(request.url) """ data base page of server """ if request.method == "GET": url_parsed = urlparse(request.url) qs_parsed = parse_qs(url_parsed.query) if qs_parsed == {}: return DataBase.get_documents_json(1, {}) result = search_document(["author.id:" + qs_parsed["id"][0]]) if result == {"wrong": "True"}: abort(400, "Bad Request") elif result == json.dumps({'authors': []}): abort(400, "Author not found") else: return result elif request.method == "PUT": if request.headers["Content-Type"] != "application/json": abort(415, "content should be JSON file") json_update_info = request.json opt = 1 DataBase.update_dicts(opt, request.args.to_dict(), json_update_info) return "200: PUT succeeded" elif request.method == "POST": if request.headers["Content-Type"] != "application/json": abort(415, "content should be JSON file") json_file = request.json DataBase.insert_document(json_file, 1) return "200: POST succeeded" elif request.method == "DELETE": identifier = request.args.to_dict() print(identifier) opt=1 deleted_count = DataBase.clean(opt, identifier) if deleted_count > 0: return "200: DELETE succeeded" else: abort(400, "Failed to delete: target not found") elif request.method == "OPTIONS": return '200 OK' @app.route("/api/scrape/", methods=["GET", "PUT", "POST", "DELETE", "OPTIONS"]) def data_base_scrape(): print(request.url) param = request.args.to_dict() url = param["url"] max_book = param["max_book"] max_author = param["max_author"] Scrape.scrape_api(url, max_book, max_author) return "200: new data has been added to database" @app.route("/api/search/", methods=["GET", "PUT", "POST", "DELETE", "OPTIONS"]) def data_base_search(): print(request.url) url_parsed = urlparse(request.url) query = Parser.parse_url_to_query(url_parsed.query) qs_parsed = query.replace("q=", "") result = search_document(qs_parsed.split("&")) if result == {"wrong": "True"}: abort(400, "Bad Request") elif result == json.dumps({'books': []}): abort(400, "Target not found") else: return result # @app.route("/api/", methods=["GET", "PUT", "POST", "DELETE", "OPTIONS"]) # def data_api(): # print('====================') # print(request.url) # print(request.collection) # print('====================') # return '200: nice!' def search_document(identifiers): """ function used to find one or several document in database """ if len(identifiers) == 1: json_idt = Parser.parse_query_to_json(identifiers[0]) if json_idt == {"wrong": "True"}: return {"wrong": "True"} print(json_idt) if re.search("^book.*", identifiers[0]): return DataBase.get_documents_json(0, json_idt) else: return DataBase.get_documents_json(1, json_idt) elif len(identifiers) == 3: if re.search("^book.*", identifiers[0]): if re.search("^author.*", identifiers[2]): print("Failed to find documentation: two statements are not pointing to the same collection") return {} else: opt = 0 else: if re.search("^book.*", identifiers[2]): print("Failed to find documentation: two statements are not pointing to the same collection") return {} else: opt = 1 json_idt1 = Parser.parse_query_to_json(identifiers[0]) json_idt2 = Parser.parse_query_to_json(identifiers[2]) if json_idt1 == {"wrong": "True"} or json_idt2 == {"wrong": "True"}: return {"wrong": "True"} if identifiers[1] == "AND": exp = {"$and": [json_idt1, json_idt2]} elif identifiers[1] == "OR": exp = {"$or": [json_idt1, json_idt2]} else: print("Failed to parse query: unknown operator for identifiers[1]") return {} print("exp:") print(exp) return DataBase.get_documents_json(opt, exp) else: print("Error, unknown identifiers") return {} if __name__ == "__main__": app.run()