diff options
-rw-r--r-- | backend/authentication/backend.py | 2 | ||||
-rw-r--r-- | backend/authentication/user.py | 4 | ||||
-rw-r--r-- | backend/discord.py | 24 | ||||
-rw-r--r-- | backend/routes/auth/authorize.py | 2 | ||||
-rw-r--r-- | backend/routes/discord.py | 4 | ||||
-rw-r--r-- | backend/routes/forms/submit.py | 2 |
6 files changed, 13 insertions, 25 deletions
diff --git a/backend/authentication/backend.py b/backend/authentication/backend.py index 2512761..c84ba10 100644 --- a/backend/authentication/backend.py +++ b/backend/authentication/backend.py @@ -63,7 +63,7 @@ class JWTAuthenticationBackend(authentication.AuthenticationBackend): user = User( token, user_details, - await discord.get_member(request.state.db, user_details["id"]), + await discord.get_member(user_details["id"]), ) if await user.fetch_admin_status(request.state.db): scopes.append("admin") diff --git a/backend/authentication/user.py b/backend/authentication/user.py index c81b7a9..ad59103 100644 --- a/backend/authentication/user.py +++ b/backend/authentication/user.py @@ -67,9 +67,9 @@ class User(BaseUser): return self.admin - async def refresh_data(self, database: Database) -> None: + async def refresh_data(self) -> None: """Fetches user data from discord, and updates the instance.""" - self.member = await discord.get_member(database, self.payload["id"]) + self.member = await discord.get_member(self.payload["id"]) if self.member: self.payload = self.member.user.dict() diff --git a/backend/discord.py b/backend/discord.py index dc5989a..855a606 100644 --- a/backend/discord.py +++ b/backend/discord.py @@ -124,7 +124,6 @@ async def _fetch_member_api(member_id: str) -> models.DiscordMember | None: async def get_member( - database: Database, user_id: str, *, force_refresh: bool = False, @@ -135,34 +134,23 @@ async def get_member( If `force_refresh` is True, the cache is skipped and the entry is updated. None may be returned if the member object does not exist. """ - collection = database.get_collection("discord_members") + member_key = f"forms-backend:member_cache:{user_id}" if force_refresh: - await collection.delete_one({"user": user_id}) - - # `create_index` creates the index if it does not exist, or passes - # This handles TTL on member objects - await collection.create_index( - "inserted_at", - expireAfterSeconds=60 * 60, # 1 hour - name="inserted_at", - ) + await constants.REDIS_CLIENT.delete(member_key) - result = await collection.find_one({"user": user_id}) + result = await constants.REDIS_CLIENT.get(member_key) if result is not None: - return models.DiscordMember(**json.loads(result["data"])) + return models.DiscordMember(**json.loads(result)) member = await _fetch_member_api(user_id) if not member: return None - await collection.insert_one({ - "user": user_id, - "data": member.json(), - "inserted_at": datetime.datetime.now(tz=datetime.UTC), - }) + await constants.REDIS_CLIENT.set(member_key, member.json(), ex=60 * 60) + return member diff --git a/backend/routes/auth/authorize.py b/backend/routes/auth/authorize.py index bc80a7d..8fe7e85 100644 --- a/backend/routes/auth/authorize.py +++ b/backend/routes/auth/authorize.py @@ -44,7 +44,7 @@ async def process_token( return AUTH_FAILURE user_id = user_details["id"] - member = await get_member(request.state.db, user_id, force_refresh=True) + member = await get_member(user_id, force_refresh=True) max_age = datetime.timedelta(seconds=int(bearer_token["expires_in"])) token_expiry = interaction_start + max_age diff --git a/backend/routes/discord.py b/backend/routes/discord.py index 53b8af3..196d902 100644 --- a/backend/routes/discord.py +++ b/backend/routes/discord.py @@ -60,7 +60,7 @@ class MemberRoute(route.Route): async def delete(self, request: Request) -> JSONResponse: """Force a resync of the cache for the given user.""" body = await request.json() - member = await discord.get_member(request.state.db, body["user_id"], force_refresh=True) + member = await discord.get_member(body["user_id"], force_refresh=True) if member: return JSONResponse(member.dict()) @@ -75,7 +75,7 @@ class MemberRoute(route.Route): async def get(self, request: Request) -> JSONResponse: """Get a user's roles on the configured server.""" body = await request.json() - member = await discord.get_member(request.state.db, body["user_id"]) + member = await discord.get_member(body["user_id"]) if not member: return NOT_FOUND_EXCEPTION diff --git a/backend/routes/forms/submit.py b/backend/routes/forms/submit.py index 5ba77e5..01c32cc 100644 --- a/backend/routes/forms/submit.py +++ b/backend/routes/forms/submit.py @@ -85,7 +85,7 @@ class SubmitForm(Route): try: if hasattr(request.user, User.refresh_data.__name__): old = request.user.token - await request.user.refresh_data(request.state.db) + await request.user.refresh_data() if old != request.user.token: try: |