Skip to content

Commit fe0aaf2

Browse files
committed
implement
Signed-off-by: owenowenisme <mses010108@gmail.com>
1 parent 532cd72 commit fe0aaf2

4 files changed

Lines changed: 53 additions & 19 deletions

File tree

backend/core/config.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,15 @@ class Settings(BaseSettings):
2424
jwt_algorithm: str
2525
jwt_access_token_expire_minutes: str
2626
frontend_url: str
27+
28+
# Redis settings (optional for graceful fallback)
29+
redis_host: str = "localhost"
30+
redis_port: int = 6379
31+
redis_password: str = ""
32+
redis_db: int = 0
33+
34+
class Config:
35+
env_file = '.env'
2736

2837

2938
@lru_cache

backend/crud/bookmark.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,16 +123,15 @@ def get_bookmarks(self, db: Session, token: str, cache: CacheService = None) ->
123123
bookmarks_data = []
124124
for file in user.bookmarked_files:
125125
bookmark_dict = {
126-
"id": str(file.id),
126+
"file_id": file.file_id,
127127
"filename": file.filename,
128128
"file_location": file.file_location,
129129
"user_id": str(file.user_id),
130-
"file_id": file.file_id,
131130
"course_id": str(file.course_id) if file.course_id else None,
132131
"exam_type": file.exam_type,
133132
"info": file.info,
134133
"anonymous": file.anonymous,
135-
"upload_time": file.upload_time.isoformat() if file.upload_time else None
134+
"timestamp": file.timestamp.isoformat() if file.timestamp else None
136135
}
137136
bookmarks_data.append(bookmark_dict)
138137
cache.set_user_bookmarks_cache(user_id, bookmarks_data)

backend/crud/file.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -128,16 +128,15 @@ def read_all_file(self, db: Session, user_id: str, cache: CacheService = None) -
128128
files_data = []
129129
for file in files:
130130
file_dict = {
131-
"id": str(file.id),
131+
"file_id": file.file_id,
132132
"filename": file.filename,
133133
"file_location": file.file_location,
134134
"user_id": str(file.user_id),
135-
"file_id": file.file_id,
136135
"course_id": str(file.course_id) if file.course_id else None,
137136
"exam_type": file.exam_type,
138137
"info": file.info,
139138
"anonymous": file.anonymous,
140-
"upload_time": file.upload_time.isoformat() if file.upload_time else None
139+
"timestamp": file.timestamp.isoformat() if file.timestamp else None
141140
}
142141
files_data.append(file_dict)
143142
cache.set_user_files_cache(user_id, files_data)
@@ -173,16 +172,15 @@ def get_files_by_course(self, db: Session, course_id: str, cache: CacheService =
173172
files_data = []
174173
for file in files:
175174
file_dict = {
176-
"id": str(file.id),
175+
"file_id": file.file_id,
177176
"filename": file.filename,
178177
"file_location": file.file_location,
179178
"user_id": str(file.user_id),
180-
"file_id": file.file_id,
181179
"course_id": str(file.course_id) if file.course_id else None,
182180
"exam_type": file.exam_type,
183181
"info": file.info,
184182
"anonymous": file.anonymous,
185-
"upload_time": file.upload_time.isoformat() if file.upload_time else None
183+
"timestamp": file.timestamp.isoformat() if file.timestamp else None
186184
}
187185
files_data.append(file_dict)
188186
cache.set_course_files_cache(course_id, files_data)
@@ -241,16 +239,15 @@ def get_file_by_id(self, db: Session, file_id: str, cache: CacheService = None)
241239
# Cache the result (without the presigned URL)
242240
if cache:
243241
file_dict = {
244-
"id": str(file.id),
242+
"file_id": file.file_id,
245243
"filename": file.filename,
246244
"file_location": file.file_location, # Store original path, not presigned URL
247245
"user_id": str(file.user_id),
248-
"file_id": file.file_id,
249246
"course_id": str(file.course_id) if file.course_id else None,
250247
"exam_type": file.exam_type,
251248
"info": file.info,
252249
"anonymous": file.anonymous,
253-
"upload_time": file.upload_time.isoformat() if file.upload_time else None
250+
"timestamp": file.timestamp.isoformat() if file.timestamp else None
254251
}
255252
cache.set_file_cache(file_id, file_dict)
256253

backend/services/cache.py

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,33 @@
88

99
class CacheService:
1010
def __init__(self):
11-
self.redis_client = redis.Redis(
12-
host=settings.redis_host,
13-
port=settings.redis_port,
14-
password=settings.redis_password,
15-
db=settings.redis_db,
16-
decode_responses=True
17-
)
11+
self.redis_client = None
12+
self.redis_available = False
13+
14+
try:
15+
self.redis_client = redis.Redis(
16+
host=settings.redis_host,
17+
port=settings.redis_port,
18+
password=settings.redis_password if settings.redis_password else None,
19+
db=settings.redis_db,
20+
decode_responses=True,
21+
socket_connect_timeout=5, # 5 second timeout
22+
socket_timeout=5
23+
)
24+
# Test the connection
25+
self.redis_client.ping()
26+
self.redis_available = True
27+
print("Redis connection established successfully")
28+
except Exception as e:
29+
print(f"Redis connection failed: {e}. Cache will be disabled.")
30+
self.redis_available = False
31+
self.redis_client = None
1832

1933
def get(self, key: str) -> Optional[Any]:
2034
"""Get value from cache"""
35+
if not self.redis_available:
36+
return None
37+
2138
try:
2239
value = self.redis_client.get(key)
2340
if value:
@@ -29,6 +46,9 @@ def get(self, key: str) -> Optional[Any]:
2946

3047
def set(self, key: str, value: Any, expire: int = 3600) -> bool:
3148
"""Set value in cache with expiration time in seconds"""
49+
if not self.redis_available:
50+
return False
51+
3252
try:
3353
serialized_value = json.dumps(value, default=str)
3454
return self.redis_client.setex(key, expire, serialized_value)
@@ -38,6 +58,9 @@ def set(self, key: str, value: Any, expire: int = 3600) -> bool:
3858

3959
def delete(self, key: str) -> bool:
4060
"""Delete key from cache"""
61+
if not self.redis_available:
62+
return False
63+
4164
try:
4265
return bool(self.redis_client.delete(key))
4366
except Exception as e:
@@ -46,6 +69,9 @@ def delete(self, key: str) -> bool:
4669

4770
def delete_pattern(self, pattern: str) -> int:
4871
"""Delete all keys matching pattern"""
72+
if not self.redis_available:
73+
return 0
74+
4975
try:
5076
keys = self.redis_client.keys(pattern)
5177
if keys:
@@ -57,6 +83,9 @@ def delete_pattern(self, pattern: str) -> int:
5783

5884
def exists(self, key: str) -> bool:
5985
"""Check if key exists in cache"""
86+
if not self.redis_available:
87+
return False
88+
6089
try:
6190
return bool(self.redis_client.exists(key))
6291
except Exception as e:

0 commit comments

Comments
 (0)