Skip to content

Commit 1276d19

Browse files
committed
Use redis for the discord member cache over mongo
1 parent 30562f0 commit 1276d19

File tree

6 files changed

+13
-25
lines changed

6 files changed

+13
-25
lines changed

backend/authentication/backend.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ async def authenticate(
6363
user = User(
6464
token,
6565
user_details,
66-
await discord.get_member(request.state.db, user_details["id"]),
66+
await discord.get_member(user_details["id"]),
6767
)
6868
if await user.fetch_admin_status(request.state.db):
6969
scopes.append("admin")

backend/authentication/user.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ async def fetch_admin_status(self, database: Database) -> bool:
6767

6868
return self.admin
6969

70-
async def refresh_data(self, database: Database) -> None:
70+
async def refresh_data(self) -> None:
7171
"""Fetches user data from discord, and updates the instance."""
72-
self.member = await discord.get_member(database, self.payload["id"])
72+
self.member = await discord.get_member(self.payload["id"])
7373

7474
if self.member:
7575
self.payload = self.member.user.dict()

backend/discord.py

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,6 @@ async def _fetch_member_api(member_id: str) -> models.DiscordMember | None:
124124

125125

126126
async def get_member(
127-
database: Database,
128127
user_id: str,
129128
*,
130129
force_refresh: bool = False,
@@ -135,34 +134,23 @@ async def get_member(
135134
If `force_refresh` is True, the cache is skipped and the entry is updated.
136135
None may be returned if the member object does not exist.
137136
"""
138-
collection = database.get_collection("discord_members")
137+
member_key = f"forms-backend:member_cache:{user_id}"
139138

140139
if force_refresh:
141-
await collection.delete_one({"user": user_id})
142-
143-
# `create_index` creates the index if it does not exist, or passes
144-
# This handles TTL on member objects
145-
await collection.create_index(
146-
"inserted_at",
147-
expireAfterSeconds=60 * 60, # 1 hour
148-
name="inserted_at",
149-
)
140+
await constants.REDIS_CLIENT.delete(member_key)
150141

151-
result = await collection.find_one({"user": user_id})
142+
result = await constants.REDIS_CLIENT.get(member_key)
152143

153144
if result is not None:
154-
return models.DiscordMember(**json.loads(result["data"]))
145+
return models.DiscordMember(**json.loads(result))
155146

156147
member = await _fetch_member_api(user_id)
157148

158149
if not member:
159150
return None
160151

161-
await collection.insert_one({
162-
"user": user_id,
163-
"data": member.json(),
164-
"inserted_at": datetime.datetime.now(tz=datetime.UTC),
165-
})
152+
await constants.REDIS_CLIENT.set(member_key, member.json(), ex=60 * 60)
153+
166154
return member
167155

168156

backend/routes/auth/authorize.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ async def process_token(
4444
return AUTH_FAILURE
4545

4646
user_id = user_details["id"]
47-
member = await get_member(request.state.db, user_id, force_refresh=True)
47+
member = await get_member(user_id, force_refresh=True)
4848

4949
max_age = datetime.timedelta(seconds=int(bearer_token["expires_in"]))
5050
token_expiry = interaction_start + max_age

backend/routes/discord.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class MemberRequest(pydantic.BaseModel):
6060
async def delete(self, request: Request) -> JSONResponse:
6161
"""Force a resync of the cache for the given user."""
6262
body = await request.json()
63-
member = await discord.get_member(request.state.db, body["user_id"], force_refresh=True)
63+
member = await discord.get_member(body["user_id"], force_refresh=True)
6464

6565
if member:
6666
return JSONResponse(member.dict())
@@ -75,7 +75,7 @@ async def delete(self, request: Request) -> JSONResponse:
7575
async def get(self, request: Request) -> JSONResponse:
7676
"""Get a user's roles on the configured server."""
7777
body = await request.json()
78-
member = await discord.get_member(request.state.db, body["user_id"])
78+
member = await discord.get_member(body["user_id"])
7979

8080
if not member:
8181
return NOT_FOUND_EXCEPTION

backend/routes/forms/submit.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ async def post(self, request: Request) -> JSONResponse:
8585
try:
8686
if hasattr(request.user, User.refresh_data.__name__):
8787
old = request.user.token
88-
await request.user.refresh_data(request.state.db)
88+
await request.user.refresh_data()
8989

9090
if old != request.user.token:
9191
try:

0 commit comments

Comments
 (0)