From 782f1c806bff1d2a5b024032b268ed19e972545a Mon Sep 17 00:00:00 2001 From: Alkaratus Date: Sat, 15 Jun 2024 19:47:16 +0200 Subject: [PATCH 1/8] =?UTF-8?q?Klasy+funkcje=20do=20uzupe=C5=82nienia=20kw?= =?UTF-8?q?erendami?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- analitics/MockUps.py | 24 ++++++++++++++++++++++++ analitics/Ranting.py | 9 +++++++++ analitics/RantingsAnalitics.py | 33 +++++++++++++++++++++++++++++++++ analitics/User.py | 7 +++++++ analitics/UserAnalitics.py | 25 +++++++++++++++++++++++++ analitics/main.py | 2 ++ 6 files changed, 100 insertions(+) create mode 100644 analitics/MockUps.py create mode 100644 analitics/Ranting.py create mode 100644 analitics/RantingsAnalitics.py create mode 100644 analitics/User.py create mode 100644 analitics/UserAnalitics.py create mode 100644 analitics/main.py diff --git a/analitics/MockUps.py b/analitics/MockUps.py new file mode 100644 index 00000000..8a481583 --- /dev/null +++ b/analitics/MockUps.py @@ -0,0 +1,24 @@ +from User import User +from Ranting import Ranting + +users = [ + User(1, "Lola"), + User(2, "Tony"), + User(3, "Lorry"), + User(4, "Betty") +] + +rantings = [ + Ranting(1, 1, 1, 5, "15-06-2024 15:04:32"), + Ranting(2, 1, 2, 6, "15-06-2024 15:04:36"), + Ranting(3, 2, 1, 7, "15-06-2024 15:04:40"), + Ranting(4, 2, 2, 8, "15-06-2024 15:04:44"), + Ranting(5, 2, 3, 9, "15-06-2024 15:04:48"), + Ranting(6, 3, 1, 10, "15-06-2024 15:04:52"), + Ranting(7, 3, 2, 6, "15-06-2024 15:04:56"), + Ranting(8, 3, 3, 5, "15-06-2024 15:05:00"), + Ranting(9, 4, 1, 4, "15-06-2024 15:05:04"), + Ranting(10, 4, 2, 3, "15-06-2024 15:05:08"), + Ranting(11, 4, 3, 2, "15-06-2024 15:05:12"), + Ranting(12, 4, 4, 1, "15-06-2024 15:05:16") +] diff --git a/analitics/Ranting.py b/analitics/Ranting.py new file mode 100644 index 00000000..7a75ede6 --- /dev/null +++ b/analitics/Ranting.py @@ -0,0 +1,9 @@ + + +class Ranting: + def __init__(self, id, movie_id, user_id, ranting, time): + self.id=id + self.movie_id=movie_id + self.user_id=user_id + self.ranting=ranting + self.time=time diff --git a/analitics/RantingsAnalitics.py b/analitics/RantingsAnalitics.py new file mode 100644 index 00000000..05e58624 --- /dev/null +++ b/analitics/RantingsAnalitics.py @@ -0,0 +1,33 @@ +from User import User +from Ranting import Ranting +from MockUps import users,rantings + + +def get_rantings(): + return rantings + + +def get_number_of_ratings(): + return get_rantings().__len__() + + +def get_rantings_in_time(begin_time, end_time): + pass + + +def get_rantings_of_movie(movie_id): + results = [] + for ranting in rantings: + if ranting.movie_id == movie_id: + results.append(ranting) + return results + + +def get_rantings_of_movie_numbers(movie_id): + return get_rantings_of_movie(movie_id).__len__() + + +def get_rantings_of_movie_in_time(movie_id, begin_time, end_time): + pass + + diff --git a/analitics/User.py b/analitics/User.py new file mode 100644 index 00000000..9dfb649d --- /dev/null +++ b/analitics/User.py @@ -0,0 +1,7 @@ + +class User: + def __init__(self,id,name): + self.id=id + self.name=name + + diff --git a/analitics/UserAnalitics.py b/analitics/UserAnalitics.py new file mode 100644 index 00000000..da78fca1 --- /dev/null +++ b/analitics/UserAnalitics.py @@ -0,0 +1,25 @@ +from User import User +from Ranting import Ranting +from MockUps import users,rantings + + +def get_number_of_users(): + return users.__len__() + + +def get_user_rantings(user_id): + results=[] + for ranting in rantings: + if ranting.user_id==user_id: + results.append(ranting) + return results + + +def get_user_rantings_number(user_id): + return get_user_rantings(user_id).__len__() + + +def get_user_rantings_in_time(user_id, begin, end): + pass + + diff --git a/analitics/main.py b/analitics/main.py new file mode 100644 index 00000000..139597f9 --- /dev/null +++ b/analitics/main.py @@ -0,0 +1,2 @@ + + From fb86be5af8e8abbb999feb7e2297ab9316c250c6 Mon Sep 17 00:00:00 2001 From: gzub04 Date: Sun, 16 Jun 2024 19:26:07 +0200 Subject: [PATCH 2/8] Basic poprawki --- analitics/MockUps.py | 28 ++++++------- analitics/RantingsAnalitics.py | 33 --------------- analitics/{Ranting.py => Rating.py} | 2 +- analitics/RatingsAnalytics.py | 33 +++++++++++++++ analitics/User.py | 9 ++-- analitics/UserAnalitics.py | 25 ----------- analitics/UserAnalytics.py | 25 +++++++++++ analitics/main.py | 49 ++++++++++++++++++++++ movie_recommendations/movie_recommender.py | 8 ++-- 9 files changed, 128 insertions(+), 84 deletions(-) delete mode 100644 analitics/RantingsAnalitics.py rename analitics/{Ranting.py => Rating.py} (92%) create mode 100644 analitics/RatingsAnalytics.py delete mode 100644 analitics/UserAnalitics.py create mode 100644 analitics/UserAnalytics.py diff --git a/analitics/MockUps.py b/analitics/MockUps.py index 8a481583..9c409534 100644 --- a/analitics/MockUps.py +++ b/analitics/MockUps.py @@ -1,5 +1,5 @@ from User import User -from Ranting import Ranting +from Rating import Rating users = [ User(1, "Lola"), @@ -8,17 +8,17 @@ users = [ User(4, "Betty") ] -rantings = [ - Ranting(1, 1, 1, 5, "15-06-2024 15:04:32"), - Ranting(2, 1, 2, 6, "15-06-2024 15:04:36"), - Ranting(3, 2, 1, 7, "15-06-2024 15:04:40"), - Ranting(4, 2, 2, 8, "15-06-2024 15:04:44"), - Ranting(5, 2, 3, 9, "15-06-2024 15:04:48"), - Ranting(6, 3, 1, 10, "15-06-2024 15:04:52"), - Ranting(7, 3, 2, 6, "15-06-2024 15:04:56"), - Ranting(8, 3, 3, 5, "15-06-2024 15:05:00"), - Ranting(9, 4, 1, 4, "15-06-2024 15:05:04"), - Ranting(10, 4, 2, 3, "15-06-2024 15:05:08"), - Ranting(11, 4, 3, 2, "15-06-2024 15:05:12"), - Ranting(12, 4, 4, 1, "15-06-2024 15:05:16") +ratings = [ + Rating(1, 1, 1, 5, "15-06-2024 15:04:32"), + Rating(2, 1, 2, 6, "15-06-2024 15:04:36"), + Rating(3, 2, 1, 7, "15-06-2024 15:04:40"), + Rating(4, 2, 2, 8, "15-06-2024 15:04:44"), + Rating(5, 2, 3, 9, "15-06-2024 15:04:48"), + Rating(6, 3, 1, 10, "15-06-2024 15:04:52"), + Rating(7, 3, 2, 6, "15-06-2024 15:04:56"), + Rating(8, 3, 3, 5, "15-06-2024 15:05:00"), + Rating(9, 4, 1, 4, "15-06-2024 15:05:04"), + Rating(10, 4, 2, 3, "15-06-2024 15:05:08"), + Rating(11, 4, 3, 2, "15-06-2024 15:05:12"), + Rating(12, 4, 4, 1, "15-06-2024 15:05:16") ] diff --git a/analitics/RantingsAnalitics.py b/analitics/RantingsAnalitics.py deleted file mode 100644 index 05e58624..00000000 --- a/analitics/RantingsAnalitics.py +++ /dev/null @@ -1,33 +0,0 @@ -from User import User -from Ranting import Ranting -from MockUps import users,rantings - - -def get_rantings(): - return rantings - - -def get_number_of_ratings(): - return get_rantings().__len__() - - -def get_rantings_in_time(begin_time, end_time): - pass - - -def get_rantings_of_movie(movie_id): - results = [] - for ranting in rantings: - if ranting.movie_id == movie_id: - results.append(ranting) - return results - - -def get_rantings_of_movie_numbers(movie_id): - return get_rantings_of_movie(movie_id).__len__() - - -def get_rantings_of_movie_in_time(movie_id, begin_time, end_time): - pass - - diff --git a/analitics/Ranting.py b/analitics/Rating.py similarity index 92% rename from analitics/Ranting.py rename to analitics/Rating.py index 7a75ede6..9b16ffbd 100644 --- a/analitics/Ranting.py +++ b/analitics/Rating.py @@ -1,6 +1,6 @@ -class Ranting: +class Rating: def __init__(self, id, movie_id, user_id, ranting, time): self.id=id self.movie_id=movie_id diff --git a/analitics/RatingsAnalytics.py b/analitics/RatingsAnalytics.py new file mode 100644 index 00000000..aa88b007 --- /dev/null +++ b/analitics/RatingsAnalytics.py @@ -0,0 +1,33 @@ +from User import User +from Rating import Rating +from MockUps import users, ratings + + +def get_ratings(): + return ratings + + +def get_number_of_ratings(): + return len(get_ratings()) + + +def get_ratings_in_time(begin_time, end_time): + pass + + +def get_ratings_of_movie(movie_id): + results = [] + for ranting in ratings: + if ranting.movie_id == movie_id: + results.append(ranting) + return results + + +def get_ratings_of_movie_numbers(movie_id): + return len(get_ratings_of_movie(movie_id)) + + +def get_ratings_of_movie_in_time(movie_id, begin_time, end_time): + pass + + diff --git a/analitics/User.py b/analitics/User.py index 9dfb649d..dcba95f7 100644 --- a/analitics/User.py +++ b/analitics/User.py @@ -1,7 +1,4 @@ - class User: - def __init__(self,id,name): - self.id=id - self.name=name - - + def __init__(self, user_id, name): + self.id = user_id + self.name = name diff --git a/analitics/UserAnalitics.py b/analitics/UserAnalitics.py deleted file mode 100644 index da78fca1..00000000 --- a/analitics/UserAnalitics.py +++ /dev/null @@ -1,25 +0,0 @@ -from User import User -from Ranting import Ranting -from MockUps import users,rantings - - -def get_number_of_users(): - return users.__len__() - - -def get_user_rantings(user_id): - results=[] - for ranting in rantings: - if ranting.user_id==user_id: - results.append(ranting) - return results - - -def get_user_rantings_number(user_id): - return get_user_rantings(user_id).__len__() - - -def get_user_rantings_in_time(user_id, begin, end): - pass - - diff --git a/analitics/UserAnalytics.py b/analitics/UserAnalytics.py new file mode 100644 index 00000000..187c5898 --- /dev/null +++ b/analitics/UserAnalytics.py @@ -0,0 +1,25 @@ +from User import User +from Rating import Rating +from MockUps import users, ratings + + +def get_number_of_users(): + return len(users) + + +def get_user_ratings(user_id): + results = [] + for rating in ratings: + if rating.user_id == user_id: + results.append(rating) + return results + + +def get_user_ratings_number(user_id): + return len(get_user_ratings(user_id)) + + +def get_user_ratings_in_time(user_id, begin, end): + pass + + diff --git a/analitics/main.py b/analitics/main.py index 139597f9..59039ac6 100644 --- a/analitics/main.py +++ b/analitics/main.py @@ -1,2 +1,51 @@ +from flask import Flask, request, jsonify +from flask_caching import Cache +import psycopg2 +import pandas +import json +from configparser import ConfigParser +from datetime import datetime + + +app = Flask(__name__) +cache = Cache(config={'CACHE_TYPE': 'SimpleCache'}) +db_connector = None +conn = None + + +@app.route("/api/get_number_of_ratings") +@cache.cached(timeout=1000) +def get_number_of_ratings(): + cursor = conn.cursor() + cursor.execute("select count(*) as num_of_ratings from ratings") + res = cursor.fetchall() + + return len(res['num_of_ratings']) + + +if __name__ == "__main__": + config = ConfigParser() + config.read("init_scripts/constants.ini") + + while True: + try: + conn = psycopg2.connect( + host=config["postgres"]["host"], + database=config["postgres"]["database"], + user=config["postgres"]["user"], + password=config["postgres"]["password"], + port=int(config["postgres"]["port"]) + ) + + except Exception: + print("Trying to connect with database") + continue + else: + break + + cache.init_app(app) + app.run(host="0.0.0.0", port=8090, debug=True) + + conn.close() diff --git a/movie_recommendations/movie_recommender.py b/movie_recommendations/movie_recommender.py index 40e15c30..11624a73 100644 --- a/movie_recommendations/movie_recommender.py +++ b/movie_recommendations/movie_recommender.py @@ -1,14 +1,13 @@ -import hashlib -import json -from datetime import datetime - import pandas as pd import numpy as np from ast import literal_eval from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity + from flask import Flask, request, jsonify from flask_caching import Cache +import hashlib +import json config = { @@ -147,7 +146,6 @@ def make_cache_key(): def AI_recommendations(): ids = request.get_json() recommendations = recommender.get_recommendations(ids) - recommendations[0] = datetime.now() return jsonify(recommendations) From b133fa1b07689d3ba57a39d3c067e84994ae6777 Mon Sep 17 00:00:00 2001 From: gzub04 Date: Sun, 16 Jun 2024 21:27:17 +0200 Subject: [PATCH 3/8] =?UTF-8?q?Naprawiony=20stuff=20Alkaratusa,=20przerobi?= =?UTF-8?q?one=20na=20flask,=20ma=C5=82e=20poprawki?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- analitics/MockUps.py | 24 ---- analitics/Rating.py | 9 -- analitics/RatingsAnalytics.py | 33 ------ analitics/User.py | 4 - analitics/UserAnalytics.py | 25 ---- analitics/main.py | 51 -------- connector/Include/analytics.py | 116 +++++++++++++++++++ connector/Include/frontend_AI_connector.py | 34 +++--- connector/Include/init_scripts/constants.ini | 2 +- movie_recommendations/Test.http | 15 --- test_scripts/Test.http | 24 ++++ 11 files changed, 160 insertions(+), 177 deletions(-) delete mode 100644 analitics/MockUps.py delete mode 100644 analitics/Rating.py delete mode 100644 analitics/RatingsAnalytics.py delete mode 100644 analitics/User.py delete mode 100644 analitics/UserAnalytics.py delete mode 100644 analitics/main.py create mode 100644 connector/Include/analytics.py delete mode 100644 movie_recommendations/Test.http create mode 100644 test_scripts/Test.http diff --git a/analitics/MockUps.py b/analitics/MockUps.py deleted file mode 100644 index 9c409534..00000000 --- a/analitics/MockUps.py +++ /dev/null @@ -1,24 +0,0 @@ -from User import User -from Rating import Rating - -users = [ - User(1, "Lola"), - User(2, "Tony"), - User(3, "Lorry"), - User(4, "Betty") -] - -ratings = [ - Rating(1, 1, 1, 5, "15-06-2024 15:04:32"), - Rating(2, 1, 2, 6, "15-06-2024 15:04:36"), - Rating(3, 2, 1, 7, "15-06-2024 15:04:40"), - Rating(4, 2, 2, 8, "15-06-2024 15:04:44"), - Rating(5, 2, 3, 9, "15-06-2024 15:04:48"), - Rating(6, 3, 1, 10, "15-06-2024 15:04:52"), - Rating(7, 3, 2, 6, "15-06-2024 15:04:56"), - Rating(8, 3, 3, 5, "15-06-2024 15:05:00"), - Rating(9, 4, 1, 4, "15-06-2024 15:05:04"), - Rating(10, 4, 2, 3, "15-06-2024 15:05:08"), - Rating(11, 4, 3, 2, "15-06-2024 15:05:12"), - Rating(12, 4, 4, 1, "15-06-2024 15:05:16") -] diff --git a/analitics/Rating.py b/analitics/Rating.py deleted file mode 100644 index 9b16ffbd..00000000 --- a/analitics/Rating.py +++ /dev/null @@ -1,9 +0,0 @@ - - -class Rating: - def __init__(self, id, movie_id, user_id, ranting, time): - self.id=id - self.movie_id=movie_id - self.user_id=user_id - self.ranting=ranting - self.time=time diff --git a/analitics/RatingsAnalytics.py b/analitics/RatingsAnalytics.py deleted file mode 100644 index aa88b007..00000000 --- a/analitics/RatingsAnalytics.py +++ /dev/null @@ -1,33 +0,0 @@ -from User import User -from Rating import Rating -from MockUps import users, ratings - - -def get_ratings(): - return ratings - - -def get_number_of_ratings(): - return len(get_ratings()) - - -def get_ratings_in_time(begin_time, end_time): - pass - - -def get_ratings_of_movie(movie_id): - results = [] - for ranting in ratings: - if ranting.movie_id == movie_id: - results.append(ranting) - return results - - -def get_ratings_of_movie_numbers(movie_id): - return len(get_ratings_of_movie(movie_id)) - - -def get_ratings_of_movie_in_time(movie_id, begin_time, end_time): - pass - - diff --git a/analitics/User.py b/analitics/User.py deleted file mode 100644 index dcba95f7..00000000 --- a/analitics/User.py +++ /dev/null @@ -1,4 +0,0 @@ -class User: - def __init__(self, user_id, name): - self.id = user_id - self.name = name diff --git a/analitics/UserAnalytics.py b/analitics/UserAnalytics.py deleted file mode 100644 index 187c5898..00000000 --- a/analitics/UserAnalytics.py +++ /dev/null @@ -1,25 +0,0 @@ -from User import User -from Rating import Rating -from MockUps import users, ratings - - -def get_number_of_users(): - return len(users) - - -def get_user_ratings(user_id): - results = [] - for rating in ratings: - if rating.user_id == user_id: - results.append(rating) - return results - - -def get_user_ratings_number(user_id): - return len(get_user_ratings(user_id)) - - -def get_user_ratings_in_time(user_id, begin, end): - pass - - diff --git a/analitics/main.py b/analitics/main.py deleted file mode 100644 index 59039ac6..00000000 --- a/analitics/main.py +++ /dev/null @@ -1,51 +0,0 @@ -from flask import Flask, request, jsonify -from flask_caching import Cache -import psycopg2 -import pandas -import json -from configparser import ConfigParser -from datetime import datetime - - - - -app = Flask(__name__) -cache = Cache(config={'CACHE_TYPE': 'SimpleCache'}) -db_connector = None -conn = None - - -@app.route("/api/get_number_of_ratings") -@cache.cached(timeout=1000) -def get_number_of_ratings(): - cursor = conn.cursor() - cursor.execute("select count(*) as num_of_ratings from ratings") - res = cursor.fetchall() - - return len(res['num_of_ratings']) - - -if __name__ == "__main__": - config = ConfigParser() - config.read("init_scripts/constants.ini") - - while True: - try: - conn = psycopg2.connect( - host=config["postgres"]["host"], - database=config["postgres"]["database"], - user=config["postgres"]["user"], - password=config["postgres"]["password"], - port=int(config["postgres"]["port"]) - ) - - except Exception: - print("Trying to connect with database") - continue - else: - break - - cache.init_app(app) - app.run(host="0.0.0.0", port=8090, debug=True) - - conn.close() diff --git a/connector/Include/analytics.py b/connector/Include/analytics.py new file mode 100644 index 00000000..25d2a159 --- /dev/null +++ b/connector/Include/analytics.py @@ -0,0 +1,116 @@ +from flask import Flask, request, jsonify +from flask_caching import Cache +import psycopg2 +import pandas +import json +from configparser import ConfigParser +from datetime import datetime + + +app = Flask(__name__) +cache = Cache(config={'CACHE_TYPE': 'SimpleCache'}) +db_connector = None +conn = None + + +@app.route("/api/get_number_of_ratings", methods=["GET"]) +@cache.cached(timeout=500) +def get_number_of_ratings(): + cursor = conn.cursor() + cursor.execute("select count(*) as num_of_ratings from ratings") + res = cursor.fetchall() + + cursor.close() + + return jsonify(res[0]), 200 + + +@app.route("/api/get_movie_ratings/", methods=["GET"]) +@cache.cached(timeout=50) +def get_movie_ratings(movie_id): + cursor = conn.cursor() + ratings = {} + rating_values = [5, 4, 3, 2, 1] + + for rating in rating_values: + cursor.execute(""" + SELECT COUNT(*) as count + FROM ratings + WHERE rating = %s AND movie_ID = %s; + """, (rating, movie_id)) + result = cursor.fetchone() + ratings[f'{rating}_star'] = result[0] + + cursor.close() + + return jsonify(ratings), 200 + + +@app.route("/api/get_users_number", methods=["GET"]) +@cache.cached(timeout=50) +def get_number_of_users(): + cursor = conn.cursor() + cursor.execute("select count(*) as num_of_users from users") + res = cursor.fetchall() + + cursor.close() + + return jsonify(res[0]), 200 + + +@app.route("/api/get_movie_rating_avg/", methods=["GET"]) +@cache.cached(timeout=50) +def get_movie_rating_avg(movie_id): + cursor = conn.cursor() + cursor.execute(""" + SELECT AVG(rating) as avg_rating + FROM ratings + WHERE movie_ID = %s; + """, (movie_id,)) + res = cursor.fetchall() + + cursor.close() + + return jsonify(res[0]), 200 + + +@app.route("/api/get_user_ratings/", methods=["GET"]) +@cache.cached(timeout=50) +def get_user_ratings(user_id): + cursor = conn.cursor() + cursor.execute(""" + SELECT * + FROM ratings + WHERE oauth_ID = %s; + """, (user_id,)) + res = cursor.fetchall() + + cursor.close() + + return jsonify(res), 200 + + +if __name__ == "__main__": + config = ConfigParser() + config.read("init_scripts/constants.ini") + + while True: + try: + conn = psycopg2.connect( + host=config["postgres"]["host"], + database=config["postgres"]["database"], + user=config["postgres"]["user"], + password=config["postgres"]["password"], + port=int(config["postgres"]["port"]) + ) + + except Exception: + print("Trying to connect with database") + continue + else: + break + + cache.init_app(app) + app.run(host="0.0.0.0", port=8090, debug=True) + + conn.close() diff --git a/connector/Include/frontend_AI_connector.py b/connector/Include/frontend_AI_connector.py index 03209c79..93471e64 100644 --- a/connector/Include/frontend_AI_connector.py +++ b/connector/Include/frontend_AI_connector.py @@ -8,32 +8,36 @@ from datetime import datetime app = Flask(__name__) -cache = Cache(config={'CACHE_TYPE': 'SimpleCache'}) +cache = Cache(config={'CACHE_TYPE': 'SimpleCache'}) db_connector = None conn = None movie_list = None + def error_decorator(fun): def inner1(*args, **kwargs): try: fun(*args, **kwargs) except psycopg2.DatabaseError: return jsonify({"status": "Something... unexpected has occured :sweat_smile:"}), 500 - + return inner1 + @app.route("/", methods=["GET"]) @cache.cached(timeout=69) def hello(): return jsonify({"response": "Hello there", "time": datetime.now()}), 200 -#endpoint do wyciągania danych o userze + +# endpoint do wyciągania danych o userze @app.route("/api/v3/get/", methods=["GET"]) def access_user(username): return jsonify({"us": "er"}), 200 -#endpoint służący do zapisu danych nowostworzonego użytkownika, podajemy mu -#id z oautha oraz login + +# endpoint służący do zapisu danych nowo stworzonego użytkownika, podajemy mu +# id z oautha oraz login @app.route("/api/v3/add//", methods=["POST"]) def add_user(oauth_ID, username): cursor = conn.cursor() @@ -50,11 +54,11 @@ def add_user(oauth_ID, username): conn.commit() cursor.close() - + return jsonify({"status": "success"}), 200 -#roboczy endpoint służący do wyciąganiu rekomendacji +# roboczy endpoint służący do wyciąganiu rekomendacji @app.route("/api/v3/ai/", methods=["GET"]) def get_recommendations(oauth_ID): #request od frontu na rekomendacje @@ -62,6 +66,7 @@ def get_recommendations(oauth_ID): #przesłanie danych do return jsonify({"movies": ["3", "Wiedźmin 3", "Najlepszy."]}), 200 + @app.route("/api/v3/get_movie/", methods=["GET"]) def get_movie(movie_ID): movie_info = movie_list.loc[movie_list['movie_id'] == movie_ID] @@ -69,8 +74,8 @@ def get_movie(movie_ID): return jsonify({"status": "Movie with ID {} doesn't exist".format(movie_ID)} ), 500 - cast = json.loads(movie_info["cast"][0].replace('\\"','"')) - crew = json.loads(movie_info["crew"][0].replace('\\"','"')) + cast = json.loads(movie_info["cast"][0].replace('\\"', '"')) + crew = json.loads(movie_info["crew"][0].replace('\\"', '"')) output_json = {"movie_id": movie_ID, "title": movie_info["title"][0], @@ -79,6 +84,7 @@ def get_movie(movie_ID): return jsonify(output_json), 200 + @app.route("/api/v3/rate_movie///", methods=["POST"]) def rate_movie(uID, movie_ID, rating): movie_info = movie_list.loc[movie_list['movie_id'] == int(movie_ID)] @@ -115,7 +121,7 @@ def rate_movie(uID, movie_ID, rating): conn.commit() cursor.close() - + return jsonify({"status": "success"}), 200 @@ -133,17 +139,15 @@ if __name__ == "__main__": port=int(config["postgres"]["port"]) ) - except Exception: + except Exception as e: + print(e) print("Trying to connect with database") continue else: break - movie_list = pandas.read_csv(config["movie"]["csv_path"]) cache.init_app(app) - app.run(host="0.0.0.0",port=8090, debug=True) - + app.run(host="localhost", port=8090, debug=True) conn.close() - diff --git a/connector/Include/init_scripts/constants.ini b/connector/Include/init_scripts/constants.ini index e922b009..fe1fddda 100644 --- a/connector/Include/init_scripts/constants.ini +++ b/connector/Include/init_scripts/constants.ini @@ -1,5 +1,5 @@ [postgres] -host=db +host=localhost database=test_db user=root password=root diff --git a/movie_recommendations/Test.http b/movie_recommendations/Test.http deleted file mode 100644 index b4ba46b7..00000000 --- a/movie_recommendations/Test.http +++ /dev/null @@ -1,15 +0,0 @@ -### GET request to example server -GET http://127.0.0.1:5000/boop - -### - -POST http://127.0.0.1:5000/api/v3/AI_recommendations -Content-Type: application/json - -[ - 49026, - 155, - 312113 -] - -### diff --git a/test_scripts/Test.http b/test_scripts/Test.http new file mode 100644 index 00000000..33636784 --- /dev/null +++ b/test_scripts/Test.http @@ -0,0 +1,24 @@ +### +GET http://127.0.0.1:8090/get/boop +### +POST http://127.0.0.1:8090/api/v3/AI_recommendations +Content-Type: application/json + +[ + 49026, + 155, + 312113 +] +### +POST http://127.0.0.1:8090/api/v3/add/1111/boop +### +POST http://127.0.0.1:8090/api/v3/rate_movie/1111/155/4 +### +GET http://localhost:8090/api/get_number_of_ratings +### +GET http://localhost:8090/api/get_movie_ratings/155 +### +GET http://localhost:8090/api/get_users_number +### +GET http://localhost:8090/api/get_movie_rating_avg/155 +### From aca55b420d5552e4f833b77a8d8f2842965e38a0 Mon Sep 17 00:00:00 2001 From: gzub04 Date: Sun, 16 Jun 2024 21:37:47 +0200 Subject: [PATCH 4/8] Rebase --- connector/Include/frontend_AI_connector.py | 16 ++++++++++------ movie_recommendations/test.http | 12 ++++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 movie_recommendations/test.http diff --git a/connector/Include/frontend_AI_connector.py b/connector/Include/frontend_AI_connector.py index 03209c79..ea201f1a 100644 --- a/connector/Include/frontend_AI_connector.py +++ b/connector/Include/frontend_AI_connector.py @@ -1,11 +1,11 @@ from flask import Flask, request, jsonify -from flask_caching import Cache import psycopg2 import pandas import json from configparser import ConfigParser from datetime import datetime +import requests app = Flask(__name__) cache = Cache(config={'CACHE_TYPE': 'SimpleCache'}) @@ -19,7 +19,7 @@ def error_decorator(fun): fun(*args, **kwargs) except psycopg2.DatabaseError: return jsonify({"status": "Something... unexpected has occured :sweat_smile:"}), 500 - + return inner1 @app.route("/", methods=["GET"]) @@ -59,8 +59,14 @@ def add_user(oauth_ID, username): def get_recommendations(oauth_ID): #request od frontu na rekomendacje #wysyłanie requestu do AI API o rekomendacje dla usera - #przesłanie danych do - return jsonify({"movies": ["3", "Wiedźmin 3", "Najlepszy."]}), 200 + #przesłanie danych do + + movies = [49026, 155, 312113] # mock values to be received from backend + url = 'http://localhost:8080/api/v3/AI_recommendations' # nie wiem, jakie powinno być url + response = requests.post(url, + json=movies, + headers={'Content-Type': 'application/json'}) + return jsonify(response.json()), 200 @app.route("/api/v3/get_movie/", methods=["GET"]) def get_movie(movie_ID): @@ -138,12 +144,10 @@ if __name__ == "__main__": continue else: break - movie_list = pandas.read_csv(config["movie"]["csv_path"]) cache.init_app(app) app.run(host="0.0.0.0",port=8090, debug=True) - conn.close() diff --git a/movie_recommendations/test.http b/movie_recommendations/test.http new file mode 100644 index 00000000..a474e240 --- /dev/null +++ b/movie_recommendations/test.http @@ -0,0 +1,12 @@ +### + +POST http://127.0.0.1:5000/api/v3/AI_recommendations +Content-Type: application/json + +[ + 49026, + 155, + 312113 +] + +### \ No newline at end of file From 56ad8d937adfe741f67f37d34124ba1c49f7597e Mon Sep 17 00:00:00 2001 From: gzub04 Date: Sun, 16 Jun 2024 21:38:20 +0200 Subject: [PATCH 5/8] Rebase --- movie_recommendations/test.http | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 movie_recommendations/test.http diff --git a/movie_recommendations/test.http b/movie_recommendations/test.http deleted file mode 100644 index a474e240..00000000 --- a/movie_recommendations/test.http +++ /dev/null @@ -1,12 +0,0 @@ -### - -POST http://127.0.0.1:5000/api/v3/AI_recommendations -Content-Type: application/json - -[ - 49026, - 155, - 312113 -] - -### \ No newline at end of file From c6322cb4befd2e1b17bd3f12253b08f23cd1a4ff Mon Sep 17 00:00:00 2001 From: gzub04 Date: Sun, 16 Jun 2024 22:33:16 +0200 Subject: [PATCH 6/8] AI API fully working --- connector/Include/frontend_AI_connector.py | 13 +++-- connector/Include/init_scripts/constants.ini | 2 +- movie_recommendations/Test.http | 6 ++- movie_recommendations/movie_recommender.py | 55 ++++++++++++-------- 4 files changed, 45 insertions(+), 31 deletions(-) diff --git a/connector/Include/frontend_AI_connector.py b/connector/Include/frontend_AI_connector.py index ea201f1a..304dff00 100644 --- a/connector/Include/frontend_AI_connector.py +++ b/connector/Include/frontend_AI_connector.py @@ -4,8 +4,8 @@ import pandas import json from configparser import ConfigParser from datetime import datetime - import requests +from flask_caching import Cache app = Flask(__name__) cache = Cache(config={'CACHE_TYPE': 'SimpleCache'}) @@ -57,12 +57,11 @@ def add_user(oauth_ID, username): #roboczy endpoint służący do wyciąganiu rekomendacji @app.route("/api/v3/ai/", methods=["GET"]) def get_recommendations(oauth_ID): - #request od frontu na rekomendacje - #wysyłanie requestu do AI API o rekomendacje dla usera - #przesłanie danych do - - movies = [49026, 155, 312113] # mock values to be received from backend - url = 'http://localhost:8080/api/v3/AI_recommendations' # nie wiem, jakie powinno być url + cursor = conn.cursor() + cursor.execute("select movie_ID from ratings where oauth_ID='{}'", oauth_ID) + res = cursor.fetchall() + movies = [int(i) for i in res[0]] + url = 'http://localhost:4200/api/v3/AI_recommendations' response = requests.post(url, json=movies, headers={'Content-Type': 'application/json'}) diff --git a/connector/Include/init_scripts/constants.ini b/connector/Include/init_scripts/constants.ini index e922b009..fe1fddda 100644 --- a/connector/Include/init_scripts/constants.ini +++ b/connector/Include/init_scripts/constants.ini @@ -1,5 +1,5 @@ [postgres] -host=db +host=localhost database=test_db user=root password=root diff --git a/movie_recommendations/Test.http b/movie_recommendations/Test.http index b4ba46b7..7f60a335 100644 --- a/movie_recommendations/Test.http +++ b/movie_recommendations/Test.http @@ -3,7 +3,11 @@ GET http://127.0.0.1:5000/boop ### -POST http://127.0.0.1:5000/api/v3/AI_recommendations +GET http://127.0.0.1:8090/api/v3/ai/1111 + +### + +POST http://127.0.0.1:4200/api/v3/AI_recommendations Content-Type: application/json [ diff --git a/movie_recommendations/movie_recommender.py b/movie_recommendations/movie_recommender.py index 40e15c30..04de79ef 100644 --- a/movie_recommendations/movie_recommender.py +++ b/movie_recommendations/movie_recommender.py @@ -1,26 +1,20 @@ -import hashlib -import json -from datetime import datetime - import pandas as pd import numpy as np from ast import literal_eval from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity +import hashlib +import json +from configparser import ConfigParser +import psycopg2 from flask import Flask, request, jsonify from flask_caching import Cache -config = { - "DEBUG": True, # some Flask specific configs - "CACHE_TYPE": "SimpleCache", - "CACHE_DEFAULT_TIMEOUT": 300 -} - app = Flask(__name__) - -app.config.from_mapping(config) -cache = Cache(app) +cache = Cache(config={'CACHE_TYPE': 'SimpleCache'}) +db_connector = None +conn = None def get_director(x): @@ -130,8 +124,8 @@ class MovieRecommender: recommender = MovieRecommender() -recommender.fit('movie_recommendations/datasets/tmdb_5000_credits.csv', - 'movie_recommendations/datasets/tmdb_5000_movies.csv') +recommender.fit('datasets/tmdb_5000_credits.csv', + 'datasets/tmdb_5000_movies.csv') def make_cache_key(): @@ -147,13 +141,30 @@ def make_cache_key(): def AI_recommendations(): ids = request.get_json() recommendations = recommender.get_recommendations(ids) - recommendations[0] = datetime.now() return jsonify(recommendations) -# Przykładowe użycie: -# if __name__ == "__main__": -# recommender = MovieRecommender() -# recommender.fit('datasets/tmdb_5000_credits.csv', 'datasets/tmdb_5000_movies.csv') -# recommendations = recommender.get_recommendations([49026, 155, 312113]) -# print(recommendations) +if __name__ == "__main__": + config = ConfigParser() + config.read("../connector/Include/init_scripts/constants.ini") + + while True: + try: + conn = psycopg2.connect( + host=config["postgres"]["host"], + database=config["postgres"]["database"], + user=config["postgres"]["user"], + password=config["postgres"]["password"], + port=int(config["postgres"]["port"]) + ) + + except Exception: + print("Trying to connect with database") + continue + else: + break + + cache.init_app(app) + app.run(host="0.0.0.0", port=4200, debug=False) + + conn.close() From 2f117ea384d031e62f025756637dc2dada05c442 Mon Sep 17 00:00:00 2001 From: gzub04 Date: Sun, 16 Jun 2024 23:33:44 +0200 Subject: [PATCH 7/8] Added tests, fixed some frontend_AI_connector.py, analytics.py kinda done --- connector/Include/analytics.py | 2 +- connector/Include/frontend_AI_connector.py | 23 +++++++++++-------- connector/Include/init_scripts/constants.ini | 2 +- movie_recommendations/Test.http | 19 ---------------- movie_recommendations/movie_recommender.py | 2 +- test_scripts/Test.http | 24 ++++++++++++-------- 6 files changed, 32 insertions(+), 40 deletions(-) delete mode 100644 movie_recommendations/Test.http diff --git a/connector/Include/analytics.py b/connector/Include/analytics.py index 25d2a159..5c5fa729 100644 --- a/connector/Include/analytics.py +++ b/connector/Include/analytics.py @@ -111,6 +111,6 @@ if __name__ == "__main__": break cache.init_app(app) - app.run(host="0.0.0.0", port=8090, debug=True) + app.run(host="0.0.0.0", port=8082, debug=True) conn.close() diff --git a/connector/Include/frontend_AI_connector.py b/connector/Include/frontend_AI_connector.py index da3d60ae..c4326042 100644 --- a/connector/Include/frontend_AI_connector.py +++ b/connector/Include/frontend_AI_connector.py @@ -6,7 +6,6 @@ import json from configparser import ConfigParser from datetime import datetime import requests -from flask_caching import Cache app = Flask(__name__) cache = Cache(config={'CACHE_TYPE': 'SimpleCache'}) @@ -20,7 +19,7 @@ def error_decorator(fun): try: fun(*args, **kwargs) except psycopg2.DatabaseError: - return jsonify({"status": "Something... unexpected has occured :sweat_smile:"}), 500 + return jsonify({"status": "Something... unexpected has occurred :sweat_smile:"}), 500 return inner1 @@ -34,7 +33,13 @@ def hello(): # endpoint do wyciągania danych o userze @app.route("/api/v3/get/", methods=["GET"]) def access_user(username): - return jsonify({"us": "er"}), 200 + cursor = conn.cursor() + cursor.execute("select * from users where username='{}';".format(username)) + res = cursor.fetchall() + + cursor.close() + + return jsonify(res[0]), 200 # endpoint służący do zapisu danych nowo stworzonego użytkownika, podajemy mu @@ -47,7 +52,7 @@ def add_user(oauth_ID, username): if len(res): cursor.close() - return jsonify({"status": "User already exists"}), 500 + return jsonify({"status": "User already exists"}), 409 cursor.execute("INSERT INTO users (username, oauth_ID) VALUES ('{}','{}');".format( username, oauth_ID @@ -66,7 +71,7 @@ def get_recommendations(oauth_ID): cursor.execute("select movie_ID from ratings where oauth_ID='{}'", oauth_ID) res = cursor.fetchall() movies = [int(i) for i in res[0]] - url = 'http://localhost:4200/api/v3/AI_recommendations' + url = 'http://localhost:8081/api/v3/AI_recommendations' response = requests.post(url, json=movies, headers={'Content-Type': 'application/json'}) @@ -78,7 +83,7 @@ def get_movie(movie_ID): movie_info = movie_list.loc[movie_list['movie_id'] == movie_ID] if movie_info.empty: return jsonify({"status": "Movie with ID {} doesn't exist".format(movie_ID)} - ), 500 + ), 404 cast = json.loads(movie_info["cast"][0].replace('\\"', '"')) crew = json.loads(movie_info["crew"][0].replace('\\"', '"')) @@ -96,10 +101,10 @@ def rate_movie(uID, movie_ID, rating): movie_info = movie_list.loc[movie_list['movie_id'] == int(movie_ID)] if movie_info.empty: return jsonify({"status": "Movie with ID {} doesn't exist".format(movie_ID)} - ), 500 + ), 404 if rating < 1 or rating > 5: - return jsonify({"status": "Incorrect rating"}), 500 + return jsonify({"status": "Incorrect rating"}), 400 cursor = conn.cursor() cursor.execute("select * from users where oauth_ID='{}';".format(uID)) @@ -107,7 +112,7 @@ def rate_movie(uID, movie_ID, rating): if not len(res): cursor.close() - return jsonify({"status": "User doesn't exists"}), 500 + return jsonify({"status": "User doesn't exists"}), 404 cursor.execute("select * from ratings where oauth_ID='{}' AND movie_ID='{}';".format(uID, movie_ID)) res = cursor.fetchall() diff --git a/connector/Include/init_scripts/constants.ini b/connector/Include/init_scripts/constants.ini index fe1fddda..508fb671 100644 --- a/connector/Include/init_scripts/constants.ini +++ b/connector/Include/init_scripts/constants.ini @@ -6,4 +6,4 @@ password=root port=5432 [movie] -csv_path=init_scripts/movies.csv +csv_path=../../movie_recommendations/datasets/tmdb_5000_credits.csv diff --git a/movie_recommendations/Test.http b/movie_recommendations/Test.http deleted file mode 100644 index 7f60a335..00000000 --- a/movie_recommendations/Test.http +++ /dev/null @@ -1,19 +0,0 @@ -### GET request to example server -GET http://127.0.0.1:5000/boop - -### - -GET http://127.0.0.1:8090/api/v3/ai/1111 - -### - -POST http://127.0.0.1:4200/api/v3/AI_recommendations -Content-Type: application/json - -[ - 49026, - 155, - 312113 -] - -### diff --git a/movie_recommendations/movie_recommender.py b/movie_recommendations/movie_recommender.py index 04de79ef..f8616380 100644 --- a/movie_recommendations/movie_recommender.py +++ b/movie_recommendations/movie_recommender.py @@ -165,6 +165,6 @@ if __name__ == "__main__": break cache.init_app(app) - app.run(host="0.0.0.0", port=4200, debug=False) + app.run(host="localhost", port=8081, debug=True) conn.close() diff --git a/test_scripts/Test.http b/test_scripts/Test.http index 33636784..ce6174e1 100644 --- a/test_scripts/Test.http +++ b/test_scripts/Test.http @@ -1,7 +1,5 @@ ### -GET http://127.0.0.1:8090/get/boop -### -POST http://127.0.0.1:8090/api/v3/AI_recommendations +POST http://127.0.0.1:8081/api/v3/AI_recommendations Content-Type: application/json [ @@ -10,15 +8,23 @@ Content-Type: application/json 312113 ] ### -POST http://127.0.0.1:8090/api/v3/add/1111/boop +POST http://127.0.0.1:8090/api/v3/add/1234/blep ### -POST http://127.0.0.1:8090/api/v3/rate_movie/1111/155/4 +GET http://127.0.0.1:8090/api/v3/get/blep ### -GET http://localhost:8090/api/get_number_of_ratings +POST http://127.0.0.1:8090/api/v3/add/6666/blop ### -GET http://localhost:8090/api/get_movie_ratings/155 +POST http://127.0.0.1:8090/api/v3/rate_movie/1234/155/4 ### -GET http://localhost:8090/api/get_users_number +POST http://127.0.0.1:8090/api/v3/rate_movie/6666/155/5 ### -GET http://localhost:8090/api/get_movie_rating_avg/155 +POST http://127.0.0.1:8090/api/v3/rate_movie/1234/19995/5 +### +GET http://localhost:8082/api/get_movie_ratings/155 +### +GET http://localhost:8082/api/get_number_of_ratings +### +GET http://localhost:8082/api/get_users_number +### +GET http://localhost:8082/api/get_movie_rating_avg/155 ### From e784c47f4c01af98e2d0495aab9917e996417a6e Mon Sep 17 00:00:00 2001 From: gzub04 Date: Sun, 16 Jun 2024 23:40:07 +0200 Subject: [PATCH 8/8] Fixed analytics.py and added new test --- connector/Include/analytics.py | 4 ++-- test_scripts/Test.http | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/connector/Include/analytics.py b/connector/Include/analytics.py index 5c5fa729..56f0b3ce 100644 --- a/connector/Include/analytics.py +++ b/connector/Include/analytics.py @@ -79,7 +79,7 @@ def get_movie_rating_avg(movie_id): def get_user_ratings(user_id): cursor = conn.cursor() cursor.execute(""" - SELECT * + SELECT movie_ID, rating FROM ratings WHERE oauth_ID = %s; """, (user_id,)) @@ -111,6 +111,6 @@ if __name__ == "__main__": break cache.init_app(app) - app.run(host="0.0.0.0", port=8082, debug=True) + app.run(host="localhost", port=8082, debug=True) conn.close() diff --git a/test_scripts/Test.http b/test_scripts/Test.http index ce6174e1..af04531c 100644 --- a/test_scripts/Test.http +++ b/test_scripts/Test.http @@ -28,3 +28,5 @@ GET http://localhost:8082/api/get_users_number ### GET http://localhost:8082/api/get_movie_rating_avg/155 ### +GET http://localhost:8082/api/get_user_ratings/1234 +### \ No newline at end of file