Skip to content

Commit 3eb6f73

Browse files
committed
Removed the redis part of logging in and being online
1 parent a645547 commit 3eb6f73

File tree

4 files changed

+24
-54
lines changed

4 files changed

+24
-54
lines changed

backend/PyMatcha/__init__.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -195,15 +195,17 @@ def expired_token_callback(expired_token):
195195
@jwt.user_loader_callback_loader
196196
def jwt_user_callback(identity):
197197
try:
198-
u = get_user(identity["id"])
198+
user = get_user(identity["id"])
199199
except NotFoundError:
200200
# The user who the server issues the token for was deleted in the db.
201201
return None
202202

203203
with configure_scope() as scope:
204-
scope.user = {"email": u.email, "id": u.id, "username": u.username}
205-
redis.set("online_user:" + str(identity["id"]), datetime.datetime.utcnow().timestamp())
206-
return u
204+
scope.user = {"email": user.email, "id": user.id, "username": user.username}
205+
user.is_online = True
206+
user.date_lastseen = datetime.datetime.utcnow()
207+
user.save()
208+
return user
207209

208210

209211
@jwt.token_in_blacklist_loader

backend/PyMatcha/routes/api/auth/login.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,9 @@ def auth_login():
7272
redis.set("is_revoked_jti:" + refresh_jti, "false", REFRESH_TOKEN_EXPIRES * 1.2)
7373

7474
current_app.logger.debug("/auth/login -> Returning access token for user {}".format(username))
75-
redis.set("online_user:" + str(u.id), datetime.datetime.utcnow().timestamp())
75+
u.is_online = True
76+
u.date_lastseen = datetime.datetime.utcnow()
77+
u.save()
7678
ret = {"access_token": access_token, "refresh_token": refresh_token, "is_profile_completed": u.is_profile_completed}
7779
return SuccessOutput("return", ret)
7880

backend/PyMatcha/routes/api/user.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
from flask import current_app
2121
from flask import jsonify
2222
from flask_jwt_extended import jwt_required
23-
from PyMatcha import redis
2423
from PyMatcha.models.user import get_user
2524
from PyMatcha.models.user import User
2625
from PyMatcha.utils.errors import NotFoundError
@@ -56,11 +55,7 @@ def get_one_user(uid):
5655
@user_bp.route("/users/online", methods=["GET"])
5756
@jwt_required
5857
def get_all_online_users():
59-
user_id = None # noqa
60-
date_lastseen = None # noqa
6158
online_user_list = []
62-
for key in redis.scan_iter("online_user:*"):
63-
user_id = str(key).split(":")[1]
64-
date_lastseen = float(redis.get(key))
65-
online_user_list.append({"id": user_id, "date_lastseen": date_lastseen})
59+
for user in User.get_multis(is_online=True):
60+
online_user_list.append(user.to_dict())
6661
return jsonify(online_user_list)

backend/PyMatcha/utils/tasks.py

Lines changed: 13 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import datetime
22
import json
3-
import logging
43
from math import ceil
54

65
from PyMatcha import celery
@@ -20,7 +19,7 @@
2019

2120
@celery.on_after_configure.connect
2221
def setup_periodic_tasks(sender, **kwargs):
23-
sender.add_periodic_task(60, update_offline_users.s(), name="Update online users every minute")
22+
sender.add_periodic_task(60, take_users_offline.s(), name="Update online users every minute")
2423
sender.add_periodic_task(3600, update_heat_scores.s(), name="Update heat scores every hour")
2524
sender.add_periodic_task(60, update_user_recommendations.s(), name="Update user recommendations every minute")
2625
sender.add_periodic_task(30, take_random_users_online.s(), name="Set 100 random users online every 30 seconds")
@@ -61,47 +60,19 @@ def update_heat_scores():
6160

6261

6362
@celery.task
64-
def update_offline_users():
65-
logging.debug("Updating offline users")
66-
# Get the last login deadline
67-
login_deadline_timestamp = float(datetime.datetime.utcnow().timestamp()) - 120
68-
count = 0
69-
online_count = 0
70-
offline_count = 0
71-
# For all user keys
72-
for key in redis.scan_iter("online_user:*"):
73-
# Get the user id
74-
user_id = str(key).split(":")[1]
75-
date_lastseen = float(redis.get(key))
76-
# If the user has passed the deadline
77-
if date_lastseen < login_deadline_timestamp:
78-
u = User.get(id=user_id)
79-
if u:
80-
u.date_lastseen = datetime.datetime.fromtimestamp(date_lastseen)
81-
u.is_online = False
82-
u.save()
83-
offline_count += 1
84-
# delete the key in redis, setting the user as offline in redis
85-
redis.delete(key)
86-
count += 1
63+
def take_users_offline():
64+
went_offline_count = 0
65+
stayed_online_count = 0
66+
for user in User.get_multis(is_online=True):
67+
if user.date_lastseen + datetime.timedelta(minutes=2) < datetime.datetime.utcnow():
68+
user.is_online = False
69+
user.save()
70+
went_offline_count += 1
8771
else:
88-
u = User.get(id=user_id)
89-
if not u:
90-
# Edge case where the user has been deleted from DB while he was still online
91-
redis.delete(key)
92-
else:
93-
u.date_lastseen = datetime.datetime.fromtimestamp(date_lastseen)
94-
u.is_online = True
95-
u.save()
96-
online_count += 1
97-
count += 1
98-
logging.debug(
99-
"Updated online status for {} users. {} passed offline and {} passed or stayed online.".format(
100-
count, offline_count, online_count
101-
)
102-
)
103-
return "Updated online status for {} users. {} passed offline and {} passed or stayed online.".format(
104-
count, offline_count, online_count
72+
stayed_online_count += 1
73+
return (
74+
f"{stayed_online_count} stayed online and "
75+
f"{went_offline_count} went offline for {went_offline_count + stayed_online_count} users"
10576
)
10677

10778

0 commit comments

Comments
 (0)