예제 #1
0
def GetUserStats(username):
    user_stats = db.GetUserStats(username)

    if (user_stats == None):
        log2term(
            'E',
            f'Failed to fetch stats for user {username} from the database')
        return {}

    log2term('I', f"Fetched stats for user {username} from the database")
    return user_stats.to_dictionary()
예제 #2
0
def GetVideo(video_id):
    user = db.GetVideo(video_id)
    if user == None:
        log2term(
            'E',
            f"Failed to fetch video data for video {video_id} from the database"
        )
        return {}

    log2term('I', f"Fetched information for video with ID {video_id}")
    return user.to_dictionary()
예제 #3
0
def readYAML(filename=str):
    try:
        stream = open("config.yaml", 'r')
        config = yaml.safe_load(stream)
    except yaml.YAMLError as e:
        log2term('F', f'While opening config file: {e}')
        os.kill(pid, signal.SIGINT)  # Kill server

    flask_logs_dict = config["flask_logs"]

    me.set(flask_logs_dict["address"], flask_logs_dict["port"])
예제 #4
0
def NewAdmin(username):
    new_admin = db.NewAdmin(username)

    if new_admin == None:
        log2term('E',
                 f"Failed to add user {username} as admin to the database")
        return {}

    log2term(
        'I',
        f"User with username {username} was successfully promoted to admin")
    return {"username": new_admin}
예제 #5
0
def GetUser(username):
    user = db.GetUser(username)

    if (user == None):
        log2term(
            'W',
            f"There's no user with username {username} registered in the database"
        )
        return {}

    log2term('I', f"Fetched information for user {username} from the database")
    return user.to_dictionary()
예제 #6
0
def GetAdmin(username):
    admin = db.GetAdmin(username)

    if (admin == None):
        log2term(
            'W',
            f"There's no admin with username {username} registered in the database"
        )
        return {}

    log2term('I', f"User with username {username} is an admin")
    return admin.to_dictionary()
예제 #7
0
def NewVideo(username):
    video_data = request.get_json()
    url = video_data["url"]
    desc = video_data["desc"]

    video_id = db.NewVideo(url, desc, username)
    if video_id == None:
        log2term('E', 'Failed to add new video to the database')
        return {}

    log2term('I', f'New video with ID {video_id} was added to the database')
    return {"video_id": video_id}
예제 #8
0
def NewAnswer(question_id):
    answer_data = request.get_json()
    username = answer_data["username"]
    answer = answer_data["answer"]

    new_answer = db.NewAnswer(answer, question_id, username)
    if new_answer == None:
        log2term(
            'E',
            f'Failed to create new answer for question with ID {question_id}')
        return {}

    log2term('I', f'Created new answer with ID {new_answer}')
    return {"answer_id": new_answer}
예제 #9
0
def NewQuestion(video_id):
    question_data = request.get_json()
    username = question_data["username"]
    question = question_data["question"]
    instant = question_data["instant"]

    new_question = db.NewQuestion(question, instant, username, video_id)
    if new_question == None:
        log2term(
            'E', f'Failed to create new question for video with Id {video_id}')
        return {}

    log2term('I', f'Created new question with ID {new_question}')
    return {"question_id": new_question}
예제 #10
0
def GetVideos(username):
    # Fetch videos according to username
    user_videos = []
    other_users_videos = []

    my_videos = db.GetUserVideos(username)
    other_videos = db.GetOtherUsersVideos(username)

    if (my_videos == None):
        log2term('W', f'There were no videos found for user {username}')
    else:
        log2term('I', f"Fetched all the videos posted by uder {username}")

        for video in my_videos:
            video_dict = video.to_dictionary()
            user_videos.append(video_dict)  # This is a list

    # Create a list with all of the videos from other users
    if (other_videos == None):
        log2term('W',
                 f'There were no videos found for other users ({username})')
    else:
        log2term(
            'I',
            f"Fetched all the videos which weren't posted by user {username}")

        for video in other_videos:
            video_dict = video.to_dictionary()
            other_users_videos.append(video_dict)  # This is a list

    return {
        'user_videos': user_videos,
        "other_users_videos": other_users_videos
    }  # A dict must be returned
예제 #11
0
def GetUsers():
    # Get entire list of users (including users who are admins)
    all_users = db.ListAllUsers()
    if (all_users == None):
        log2term('W', f"There are no users registered in the database")
        return {"users": None}

    users = []
    for user in all_users:
        user_dict = user.to_dictionary()
        users.append(user_dict)

    log2term('I', f"Fetched entire list of users from the database")
    return {"users": users}
예제 #12
0
def GetAdmins():
    # Get entire lis of admins
    all_admins = db.ListAllAdmins()
    if (all_admins == None):
        log2term('W', f"There are no admins registered in the database")
        return {"admins": None}

    admins = []
    for admin in all_admins:
        admin_dict = admin.to_dictionary()
        admins.append(admin_dict)

    log2term('I', f"Fetched entire list of admins from the database")
    return {"admins": admins}
예제 #13
0
def AdminExists(username) -> bool:
    response = requests.get(
        f"http://{flask_users.addr}:{flask_users.port}/API/admins/{username}/")
    if response.json() == {}:
        log2term('W', f"User with username {username} is not an admin")
        return False

    # Log the request to the users flask server
    url = f"http://{flask_logs.addr}:{flask_logs.port}/API/new_log/"
    headers = {'Content-Type': 'application/json'}
    body = f'{{\n"event_type": "{EventType.GET_ADMIN.value}",\n"username": "******",\n"origin_addr": "{me.addr}",\n"origin_port": "{me.port}",\n"dest_addr": "{flask_users.addr}",\n"dest_port": "{flask_users.port}",\n"content": "{username}"\n}}'
    requests.post(url, headers=headers, data=body)

    log2term('D', f"User {username} is an admin")
    return True
예제 #14
0
def GetLogs():
    # Get entire list of logs
    all_logs = db.ListAllLogs()
    if (all_logs == None):
        log2term('W', f"There are no logs registered in the database")
        return {"logs": None}

    logs = []
    for log in all_logs:
        log_dict = log.to_dictionary()
        log_dict["event_type"] = str(EventType(log_dict["event_type"]).name)
        logs.append(log_dict)

    log2term('I', f"Fetched entire list of logs from the database")
    return {"logs": logs}
예제 #15
0
def NewQuestion(video_id):
    question_data = request.get_json()
    username = question_data["username"]

    # Log the request to the proxy
    url = f"http://{flask_logs.addr}:{flask_logs.port}/API/new_log/"
    headers = {'Content-Type': 'application/json'}
    body = f'{{\n"event_type": "{EventType.POST_NEW_QUESTION.value}",\n"username": "******",\n"origin_addr": "-",\n"origin_port": "-",\n"dest_addr": "{me.addr}",\n"dest_port": "{me.port}",\n"content": "For video {video_id}"\n}}'
    requests.post(url, headers=headers, data=body)

    if VideoExists(video_id) == False:
        log2term(
            'E',
            f"Can't create a question about video {video_id} since the video doesn't exist in the database"
        )
        return {}

    if UserExists(username) == False:
        log2term(
            'E',
            f"Can't create the question submitted by user {username} since this user doesn't exist in the database"
        )
        return {}

    response = requests.post(
        f"http://{flask_QAs.addr}:{flask_QAs.port}//API/videos/{video_id}/new_question/",
        json=question_data)

    if response != None:
        question_id = response.json()
        question_id = question_id["question_id"]
        # Log the request to the QAs flask server
        url = f"http://{flask_logs.addr}:{flask_logs.port}/API/new_log/"
        headers = {'Content-Type': 'application/json'}
        body = f'{{\n"event_type": "{EventType.POST_NEW_QUESTION.value}",\n"username": "******",\n"origin_addr": "{me.addr}",\n"origin_port": "{me.port}",\n"dest_addr": "{flask_QAs.addr}",\n"dest_port": "{flask_QAs.port}",\n"content": "New question with ID {question_id} for video {video_id}"\n}}'
        requests.post(url, headers=headers, data=body)

        requests.put(
            f"http://{flask_users.addr}:{flask_users.port}/API/{username}/stats/questions/"
        )

        # Log the request to the users flask server
        url = f"http://{flask_logs.addr}:{flask_logs.port}/API/new_log/"
        headers = {'Content-Type': 'application/json'}
        body = f'{{\n"event_type": "{EventType.PUT_USERSTATS_QUESTION.value}",\n"username": "******",\n"origin_addr": "{me.addr}",\n"origin_port": "{me.port}",\n"dest_addr": "{flask_users.addr}",\n"dest_port": "{flask_users.port}",\n"content": "For user {username}, regarding question {question_id}"\n}}'
        requests.post(url, headers=headers, data=body)

    return response.json()
예제 #16
0
def QuestionExists(question_id) -> bool:
    response = requests.get(
        f"http://{flask_QAs.addr}:{flask_QAs.port}/API/questions/{question_id}/"
    )
    if response.json() == {}:
        log2term('W', f"There's no question with ID {question_id}")
        return False

    # Log the request to the QAs flask server
    url = f"http://{flask_logs.addr}:{flask_logs.port}/API/new_log/"
    headers = {'Content-Type': 'application/json'}
    body = f'{{\n"event_type": "{EventType.GET_QAS.value}",\n"username": "******",\n"origin_addr": "{me.addr}",\n"origin_port": "{me.port}",\n"dest_addr": "{flask_QAs.addr}",\n"dest_port": "{flask_QAs.port}",\n"content": "{question_id}"\n}}'
    requests.post(url, headers=headers, data=body)

    log2term('D', f"Question with ID {question_id} exists in the database")
    return True
예제 #17
0
def NewAnswer(question_id):
    answer_data = request.get_json()
    username = answer_data["username"]

    # Log the request to the proxy
    url = f"http://{flask_logs.addr}:{flask_logs.port}/API/new_log/"
    headers = {'Content-Type': 'application/json'}
    body = f'{{\n"event_type": "{EventType.POST_NEW_ANSWER.value}",\n"username": "******",\n"origin_addr": "-",\n"origin_port": "-",\n"dest_addr": "{me.addr}",\n"dest_port": "{me.port}",\n"content": "For question {question_id}"\n}}'
    requests.post(url, headers=headers, data=body)

    if QuestionExists(question_id) == False:
        log2term(
            'E',
            f"Can't create an answer to question {question_id} since it doesn't exist in the database"
        )
        return {}

    if UserExists(username) == False:
        log2term(
            'E',
            f"Can't create an answer submitted by user {username} since this user doesn't exist in the database"
        )
        return {}

    response = requests.post(
        f"http://{flask_QAs.addr}:{flask_QAs.port}/API/questions/{question_id}/new_answer/",
        json=answer_data)
    response_json = response.json()

    if response != None:
        # Log the request to the QAs flask server
        url = f"http://{flask_logs.addr}:{flask_logs.port}/API/new_log/"
        headers = {'Content-Type': 'application/json'}
        body = f'{{\n"event_type": "{EventType.POST_NEW_ANSWER.value}",\n"username": "******",\n"origin_addr": "{me.addr}",\n"origin_port": "{me.port}",\n"dest_addr": "{flask_QAs.addr}",\n"dest_port": "{flask_QAs.port}",\n"content": "For question {question_id}. New answer with ID {response_json["answer_id"]}"\n}}'
        requests.post(url, headers=headers, data=body)

        requests.put(
            f"http://{flask_users.addr}:{flask_users.port}/API/{username}/stats/answers/"
        )

        # Log the request to the users flask server
        url = f"http://{flask_logs.addr}:{flask_logs.port}/API/new_log/"
        headers = {'Content-Type': 'application/json'}
        body = f'{{\n"event_type": "{EventType.PUT_USERSTATS_ANSWER.value}",\n"username": "******",\n"origin_addr": "{me.addr}",\n"origin_port": "{me.port}",\n"dest_addr": "{flask_users.addr}",\n"dest_port": "{flask_users.port}",\n"content": "For user {username}, regarding answer {response_json["answer_id"]}"\n}}'
        requests.post(url, headers=headers, data=body)

    return response_json
예제 #18
0
def NewUser(username):
    user_data = request.get_json()
    email = user_data["email"]
    name = user_data["name"]

    new_user = db.NewUser(username, email, name)

    # Check if user was added to de DB
    if new_user == None:
        log2term('E', f"Failed to add user {username} to the database")
        return {}

    log2term(
        'I',
        f"New user with username {username} was successfully added to the database"
    )
    return {"username": new_user}
예제 #19
0
def NewLog():
    log_data = request.get_json()
    event_type = log_data["event_type"]
    username = log_data["username"]
    origin_addr = log_data["origin_addr"]
    origin_port = log_data["origin_port"]
    dest_addr = log_data["dest_addr"]
    dest_port = log_data["dest_port"]
    content = log_data["content"]

    log_id = db.NewLog(event_type, username, origin_addr, origin_port,
                       dest_addr, dest_port, content)
    if log_id == None:
        log2term('E', 'Failed to add log to the database')
        return {}

    log2term('I', f'New log with ID {log_id} was added to the database')
    return {"log_id": log_id}
예제 #20
0
def NewVideo(username):
    data = request.get_json()

    # Log the request to the proxy
    url = f"http://{flask_logs.addr}:{flask_logs.port}/API/new_log/"
    headers = {'Content-Type': 'application/json'}
    body = f'{{\n"event_type": "{EventType.POST_NEW_VIDEO.value}",\n"username": "******",\n"origin_addr": "-",\n"origin_port": "-",\n"dest_addr": "{me.addr}",\n"dest_port": "{me.port}",\n"content": "-"\n}}'
    requests.post(url, headers=headers, data=body)

    if UserExists(username) == False:
        return {}

    response = requests.post(
        f"http://{flask_videos.addr}:{flask_videos.port}/API/{username}/videos/",
        json=data)

    if response.json() == {}:
        log2term('E', f"Failed to add new video to the database")
        return {}

    video_id = response.json()
    video_id = video_id["video_id"]
    log2term('D', f"Video with ID {video_id} was added to the database")

    # Log the request to the videos flask server
    url = f"http://{flask_logs.addr}:{flask_logs.port}/API/new_log/"
    headers = {'Content-Type': 'application/json'}
    body = f'{{\n"event_type": "{EventType.POST_NEW_VIDEO.value}",\n"username": "******",\n"origin_addr": "{me.addr}",\n"origin_port": "{me.port}",\n"dest_addr": "{flask_videos.addr}",\n"dest_port": "{flask_videos.port}",\n"content": "New video with ID {video_id}"\n}}'
    requests.post(url, headers=headers, data=body)

    requests.put(
        f"http://{flask_users.addr}:{flask_users.port}/API/{username}/stats/videos<Z/"
    )

    # Log the request to the users flask server (to iterate the videos counter un the user's stats)
    url = f"http://{flask_logs.addr}:{flask_logs.port}/API/new_log/"
    headers = {'Content-Type': 'application/json'}
    body = f'{{\n"event_type": "{EventType.PUT_USERSTATS_VIDEO.value}",\n"username": "******",\n"origin_addr": "{me.addr}",\n"origin_port": "{me.port}",\n"dest_addr": "{flask_users.addr}",\n"dest_port": "{flask_users.port}",\n"content": "For user {username} regarding video {video_id}"\n}}'
    requests.post(url, headers=headers, data=body)

    return response.json()
예제 #21
0
def NewUser(username, email, name):
    if UserExists(username) == True:
        log2term(
            'E',
            f"Can't add user {username} to users databse since it already exists"
        )
        return {}

    url = f'http://{flask_users.addr}:{flask_users.port}/API/new_user/{username}/'
    body = f'{{"name":"{name}", "email":"{email}"}}'
    json_body = json.loads(body)
    response = requests.post(url, json=json_body)

    if response.json() == {}:
        log2term('E', f"Failed to add user {username} to the database")
        return {}

    # Log the request to the users flask server
    url = f"http://{flask_logs.addr}:{flask_logs.port}/API/new_log/"
    headers = {'Content-Type': 'application/json'}
    body = f'{{\n"event_type": "{EventType.POST_NEW_USER.value}",\n"username": "******",\n"origin_addr": "{me.addr}",\n"origin_port": "{me.port}",\n"dest_addr": "{flask_users.addr}",\n"dest_port": "{flask_users.port}",\n"content": "{username}"\n}}'
    requests.post(url, headers=headers, data=body)

    log2term(
        'D',
        f"New user with username {username} was successfully added to the database"
    )
    return response.json()
예제 #22
0
def Dashboard():
    # Check if user is loggen in
    if fenix_blueprint.session.authorized == False:
        return redirect(url_for("fenix-example.login"))
    else:
        try:
            print("HERE")
            user_data = (
                fenix_blueprint.session.get("/api/fenix/v1/person/")).json()
            print("HERE")
        except TokenExpiredError as e:
            log2term('E', f'{e.__class__.__name__}. Logging out...')
            return redirect(url_for("LogOut"))

        # Extract user information
        username = user_data['username']
        email = user_data['email']
        name = user_data['name']

        # Check if user already exists in DB
        is_admin = False
        if UserExists(username) == False:
            NewUser(username=username, email=email, name=name)
            log2term('I', f'New user {username} registered to the database')
        else:
            log2term('I',
                     f'User {username} is already registered to the database')

            # Checking if user, that already exists, is an admin
            if AdminExists(username) == True:
                is_admin = True
                log2term('I', f'User {username} is an admin')
            else:
                log2term('I', f'User {username} is not an admin')

        return render_template("dashboard.html",
                               username=username,
                               is_admin=is_admin)
예제 #23
0
def Video(video_id):
    # Check if user is loggen in
    if fenix_blueprint.session.authorized == False:
        return redirect(url_for("fenix-example.login"))
    else:
        try:
            user_data = (
                fenix_blueprint.session.get("/api/fenix/v1/person/")).json()
        except TokenExpiredError as e:
            log2term('E', f'{e.__class__.__name__}. Logging out...')
            return redirect(url_for("LogOut"))

        # Extract user information
        username = user_data['username']

        # Check if video is registered to the database
        if VideoExists(video_id) == False:
            log2term('E', f"Video {video_id} doesn't exist in the database")
            return abort(404)

        # Get video information needed for the html template
        video_info = GetVideo(video_id)

        # Find the author's name through its username
        response = requests.get(
            f'http://{flask_users.addr}:{flask_users.port}/API/users/{video_info["posted_by"]}/'
        )
        user = response.json()
        user_name = user["name"]

        return render_template("video.html",
                               video_id=video_id,
                               video_url=video_info["url"],
                               video_desc=video_info["desc"],
                               video_posted_by=video_info["posted_by"],
                               video_posted_by_name=user_name,
                               video_views=video_info["views"],
                               username=username)
예제 #24
0
def GetUserStats(username):
    # Log the request to the proxy
    url = f"http://{flask_logs.addr}:{flask_logs.port}/API/new_log/"
    headers = {'Content-Type': 'application/json'}
    body = f'{{\n"event_type": "{EventType.GET_USERSTATS.value}",\n"username": "******",\n"origin_addr": "-",\n"origin_port": "-",\n"dest_addr": "{me.addr}",\n"dest_port": "{me.port}",\n"content": "{username}"\n}}'
    requests.post(url, headers=headers, data=body)

    if UserExists(username) == False:
        return {}

    response = requests.get(
        f"http://{flask_users.addr}:{flask_users.port}/API/{username}/stats/")
    if (response == None):
        log2term('W', f'There were no stats found for user {username}')
        return {}

    # Log the request to the users flask server
    url = f"http://{flask_logs.addr}:{flask_logs.port}/API/new_log/"
    headers = {'Content-Type': 'application/json'}
    body = f'{{\n"event_type": "{EventType.GET_USERSTATS.value}",\n"username": "******",\n"origin_addr": "{me.addr}",\n"origin_port": "{me.port}",\n"dest_addr": "{flask_users.addr}",\n"dest_port": "{flask_users.port}",\n"content": "{username}"\n}}'
    requests.post(url, headers=headers, data=body)

    return response.json()
예제 #25
0
def NewAdmin(username):
    data = request.get_json()
    author = data["author"]  # Post request's author

    # Log the request to the proxy
    url = f"http://{flask_logs.addr}:{flask_logs.port}/API/new_log/"
    headers = {'Content-Type': 'application/json'}
    body = f'{{\n"event_type": "{EventType.POST_NEW_ADMIN.value}",\n"username": "******",\n"origin_addr": "-",\n"origin_port": "-",\n"dest_addr": "{me.addr}",\n"dest_port": "{me.port}",\n"content": "{username}"\n}}'
    requests.post(url, headers=headers, data=body)

    if UserExists(username) == False:
        log2term(
            'E',
            f"Can't promote user {username} to admin since it doesn't exist in the users database"
        )
        return {}

    # Check if admin is already registered to the database
    if AdminExists(username) == True:
        log2term(
            'E',
            f"Can't promote user {username} to admin since that user is already an admin"
        )
        return {}

    response = requests.post(
        f"http://{flask_users.addr}:{flask_users.port}/API/new_admin/{username}/"
    )

    if response == None:
        log2term('E',
                 f"Failed to add user {username} as admin to the database")
        return {}
    log2term('I',
             f"Successfully added user {username} as admin to the database")

    # Log the request to the users flask server
    url = f"http://{flask_logs.addr}:{flask_logs.port}/API/new_log/"
    headers = {'Content-Type': 'application/json'}
    body = f'{{\n"event_type": "{EventType.POST_NEW_ADMIN.value}",\n"username": "******",\n"origin_addr": "{me.addr}",\n"origin_port": "{me.port}",\n"dest_addr": "{flask_users.addr}",\n"dest_port": "{flask_users.port}",\n"content": "{username}"\n}}'
    requests.post(url, headers=headers, data=body)

    return response.json()
예제 #26
0
def GetVideoQuestionsAndAnswers(video_id):
    # Fetch videos according to username
    video_questions = []

    questions = db.GetVideoQuestions(video_id)
    if (questions == None):
        log2term(
            'W', f'There were no questions found for video with ID {video_id}')
    else:
        log2term('I',
                 f'Fetched all the questions for video with ID {video_id}')

        for question in questions:
            question_dict = question.to_dictionary()

            # Fetch question answers
            question_answers = []
            answers = db.GetQuestionAnswers(question_dict["id"])
            if (answers == None):
                log2term(
                    'W',
                    f'There were no answers found for question with ID {question_dict["id"]}'
                )
            else:
                log2term(
                    'I',
                    f'Fetched all the answers for question with ID {question_dict["id"]}'
                )

                for answer in answers:
                    answer_dict = answer.to_dictionary()
                    question_answers.append(answer_dict)
            # Adding question's answers to question's dict
            question_dict["answers"] = question_answers

            # Add question's info to question' list
            video_questions.append(question_dict)

    return {"video_questions": video_questions}
예제 #27
0
def AddAnswer(username):
    user_answers = db.Add2Answers(username)
    log2term('I',
             f"The answers counter was iterated in user {username}'s stats")
    return {"user_answers": user_answers}
예제 #28
0
def AddQuestion(username):
    user_questions = db.Add2Questions(username)
    log2term('I',
             f"The questions counter was iterated in user {username}'s stats")
    return {"user_questions": user_questions}
예제 #29
0
def AddView(username):
    user_views = db.AddView2User(username)
    log2term('I', f"The views counter was iterated in user {username}'s stats")
    return {"user_views": user_views}
예제 #30
0
def AddVideo(username):
    user_videos = db.Add2VideosPosted(username)
    log2term('I',
             f"The videos counter was iterated in user {user_videos}'s stats")
    return {"user_videos": user_videos}