diff --git a/web_server/blueprints/user.py b/web_server/blueprints/user.py index 6508b57..1b3be85 100644 --- a/web_server/blueprints/user.py +++ b/web_server/blueprints/user.py @@ -52,23 +52,28 @@ def user_following(user_id: int, followed_id: int): @login_required @user_bp.route('/user/follow/') -def follow(username): +def follow_user(username): """ Follows a user """ user_id = session.get("user_id") following_id = get_user_id(username) - follow(user_id, following_id) + if follow(user_id, following_id): + return jsonify({"success": True, + "already_following": False}) + return jsonify({"success": True, + "already_following": True}) @login_required @user_bp.route('/user/unfollow/') -def user_unfollow(followed_username): +def unfollow_user(username): """ Unfollows a user """ user_id = session.get("user_id") - followed_id = get_user_id(followed_username) + followed_id = get_user_id(username) unfollow(user_id, followed_id) + return jsonify({"success": True}) @login_required @user_bp.route('/user/following') @@ -88,7 +93,10 @@ def get_login_status(): Returns whether the user is logged in or not """ username = session.get("username") - return jsonify({'status': username is not None, 'username': username}) + user_id = session.get("user_id") + return jsonify({'status': username is not None, + 'username': username, + 'user_id': user_id}) @user_bp.route('/user/forgot_password/', methods=['GET','POST']) def user_forgot_password(email): diff --git a/web_server/database/app.db b/web_server/database/app.db index df6d35b..af0b744 100644 Binary files a/web_server/database/app.db and b/web_server/database/app.db differ diff --git a/web_server/database/testing_data.sql b/web_server/database/testing_data.sql index bd015ed..212b889 100644 --- a/web_server/database/testing_data.sql +++ b/web_server/database/testing_data.sql @@ -124,9 +124,7 @@ LIMIT 10; INSERT INTO follows (user_id, followed_id, since) VALUES (7, 1, '2024-08-30'), (7, 2, '2024-08-30'), -(7, 3, '2024-08-30'), -(7, 4, '2024-08-30'), -(7, 5, '2024-08-30'); +(7, 3, '2024-08-30'); INSERT INTO followed_categories (user_id, category_id) VALUES (7, 1), @@ -134,5 +132,5 @@ INSERT INTO followed_categories (user_id, category_id) VALUES (7, 3); INSERT INTO subscribes (user_id, subscribed_id, since, expires) VALUES -(7, 1, '2024-08-30', '2025-02-28'), +(7, 1, '2024-08-30', '2025-02-28 12:00:00'), (7, 2, '2024-08-30', '2025-02-15'); \ No newline at end of file diff --git a/web_server/requirements.txt b/web_server/requirements.txt index 5cdc2ce..349268f 100644 --- a/web_server/requirements.txt +++ b/web_server/requirements.txt @@ -26,4 +26,5 @@ gevent>=22.10.2 gevent-websocket flask-oauthlib==0.9.6 celery==5.2.3 -redis==5.2.1 \ No newline at end of file +redis==5.2.1 +python-dateutil \ No newline at end of file diff --git a/web_server/utils/user_utils.py b/web_server/utils/user_utils.py index fffbefe..edc1781 100644 --- a/web_server/utils/user_utils.py +++ b/web_server/utils/user_utils.py @@ -4,6 +4,7 @@ from datetime import datetime from itsdangerous import URLSafeTimedSerializer from os import getenv from werkzeug.security import generate_password_hash, check_password_hash +from dateutil import parser from dotenv import load_dotenv load_dotenv() @@ -91,29 +92,28 @@ def follow(user_id: int, following_id: int): """ Follows following_id user from user_id user """ - with Database() as db: - data = db.execute(""" - SELECT * FROM follows - WHERE user_id = ? - AND followed_id = ? - """, (user_id, following_id)) - - if not data: + if not is_following(user_id, following_id): + with Database() as db: db.execute(""" INSERT INTO follows (user_id, followed_id) - VALUES(?,?) + VALUES(?,?); """, (user_id, following_id)) + return True + return False def unfollow(user_id: int, followed_id: int): """ Unfollows follow_id user from user_id user """ - with Database() as db: - db.execute(""" - DELETE FROM follows - WHERE user_id = ? - AND followed_id = ? - """, (user_id, followed_id)) + if is_following(user_id, followed_id): + with Database() as db: + db.execute(""" + DELETE FROM follows + WHERE user_id = ? + AND followed_id = ? + """, (user_id, followed_id)) + return True + return False def subscription_expiration(user_id: int, subscribed_id: int) -> int: @@ -131,7 +131,7 @@ def subscription_expiration(user_id: int, subscribed_id: int) -> int: if data: expiration_date = data["expires"] - remaining_time = (expiration_date - datetime.now()).seconds + remaining_time = (parser.parse(expiration_date) - datetime.now()).seconds return remaining_time return 0