Skip to content
Snippets Groups Projects
SimpleServer.py 6.48 KiB
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()