Skip to content
Snippets Groups Projects
SimpleServer.py 6.48 KiB
Newer Older
  • Learn to ignore specific revisions
  • import DataBase.mongoDB as DataBase
    import RegularExpressionParser.Parser as Parser
    
    import re
    
    import Crawler.Scrape as Scrape
    
    from flask import Flask
    from flask import request
    
    zshan2's avatar
    zshan2 committed
    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, 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
    
            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":
    
    zshan2's avatar
    zshan2 committed
                abort(415, "content should be JSON file")
    
            print(request)
    
            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"
    
                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)
    
    zshan2's avatar
    zshan2 committed
            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"
    
                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"}
    
            if re.search("^book.*", identifiers[0]):
    
                return DataBase.get_documents_json(0, json_idt)
    
                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)
    
            print("Error, unknown identifiers")
            return {}
    
    if __name__ == "__main__":
        app.run()