Skip to content

Commit 6ef01f0

Browse files
authored
Merge pull request #19 from coder-inbox/fix-scheduler
fix scheduler, send a welcome email only once per registration, python to 3.9.10
2 parents bbc58ff + 9c60595 commit 6ef01f0

File tree

8 files changed

+118
-24
lines changed

8 files changed

+118
-24
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ A Fully Async-based backend for [Code Inbox](https://github.com/wiseaidev/code-i
1818
## Development Requirements
1919

2020
- Make (GNU command)
21-
- Python (>= 3.9)
21+
- Python (>= 3.9.10)
2222
- Poetry (1.6)
2323

2424
---

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ packages = [
2121
]
2222

2323
[tool.poetry.dependencies]
24-
python = "^3.10.10"
24+
python = "^3.9.10"
2525
fastapi = "^0.103.1"
2626
uvicorn = {extras = ["standard"], version = "^0.23.2"}
2727
pydantic = {extras = ["email"], version = "^1.10.12"}

src/nylas/crud.py

-1
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,6 @@ async def login_user(token: str, session: AIOSession) -> Dict[str, Any]:
145145
email_address = access_token_obj["email_address"]
146146

147147
user_obj = await find_existed_user(email_address, session)
148-
print(user_obj)
149148

150149
if not user_obj:
151150
await create_user(email_address, session)

src/nylas/router.py

-4
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,6 @@ async def send_email(
159159
draft["bcc"] = [{"email": request_body.bcc}]
160160
draft["body"] = request_body.message
161161
draft["from"] = [{"email": current_user.email}]
162-
print(draft)
163162
message = draft.send()
164163
return message
165164

@@ -205,7 +204,6 @@ async def delete_label(
205204

206205
removed_item = code_app.state.nylas.labels.delete(id=item_id)
207206
if removed_item:
208-
print(f"Removed item: {removed_item}")
209207
return {"message": "Item deleted"}
210208
return {"message": "Item not found"}
211209

@@ -389,7 +387,6 @@ async def execute_code(
389387
await asyncio.sleep(1)
390388

391389
if asyncio.get_event_loop().time() - start_time > timeout:
392-
print("Timeout")
393390
submission_status_dict[submission_token] = "Timeout"
394391
break
395392

@@ -403,7 +400,6 @@ async def execute_code(
403400
print(new_response.json())
404401
submission_stdout = new_response.json()["stdout"]
405402
if submission_stdout:
406-
print("Finished")
407403
submission_status_dict[submission_token] = "Finished"
408404
result = new_response.json()
409405
break

src/users/crud.py

+2
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ async def update_user_info(
113113
"full_name": personal_info.full_name,
114114
"bio": personal_info.bio,
115115
"programming_language": personal_info.programming_language,
116+
"schedule": personal_info.schedule,
117+
"welcome": "sent",
116118
"modified_date": datetime.utcnow(),
117119
}
118120
)

src/users/models.py

+7
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,13 @@ class User(Model):
104104
calendar: Optional[str] = Field(
105105
default="", description="User's calendar ID."
106106
)
107+
schedule: Optional[str] = Field(
108+
default="every day", description="User's schedule."
109+
)
110+
welcome: Optional[str] = Field(
111+
default="not sent",
112+
description="User's welcome email status, sent or not sent.",
113+
)
107114
user_status: Optional[UserStatus] = Field(
108115
default=UserStatus.ACTIVE.value, description="User's status."
109116
)

src/users/router.py

+94-17
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@
6868
# create and use as many Drives as you want!
6969
profile_images = deta.Drive("profile-images")
7070

71+
# Create a dictionary to store scheduler instances for each user
72+
user_schedulers = {}
73+
7174

7275
@router.post(
7376
"/user/logout",
@@ -162,7 +165,47 @@ async def update_personal_information(
162165
An endpoint for updating users personel info.
163166
"""
164167
try:
168+
from src.main import (
169+
code_app,
170+
)
171+
165172
await users_crud.update_user_info(personal_info, current_user, session)
173+
schedule = personal_info.schedule
174+
language = personal_info.language
175+
email = current_user.email
176+
# Create a new scheduler for the user
177+
scheduler = BackgroundScheduler()
178+
user_schedulers[email] = scheduler
179+
if schedule == "Every hour":
180+
scheduler.add_job(
181+
code_app.state.openai.send_algorithm_email,
182+
"interval",
183+
hours=1,
184+
args=(email, language),
185+
)
186+
elif schedule == "Every day":
187+
scheduler.add_job(
188+
code_app.state.openai.send_algorithm_email,
189+
"interval",
190+
days=1,
191+
args=(email, language),
192+
)
193+
elif schedule == "Every week":
194+
scheduler.add_job(
195+
code_app.state.openai.send_algorithm_email,
196+
"interval",
197+
weeks=1,
198+
args=(email, language),
199+
)
200+
elif schedule == "Every month":
201+
scheduler.add_job(
202+
code_app.state.openai.send_algorithm_email,
203+
"interval",
204+
months=1,
205+
args=(email, language),
206+
)
207+
208+
scheduler.start()
166209
return {
167210
"status_code": 200,
168211
"message": "Your personal information has been updated successfully!",
@@ -185,35 +228,69 @@ async def update_language(
185228
session: AIOSession = Depends(dependencies.get_db_transactional_session),
186229
) -> Dict[str, Any]:
187230
"""
188-
Set the programming language for a specific user using their access token.
231+
Set the programming language and the emails schedule for a specific user using their access token.
189232
"""
190233
try:
191234
from src.main import (
192235
code_app,
193236
)
194237

195-
scheduler = BackgroundScheduler()
238+
email = current_user.email
239+
language = request_body.language
240+
schedule = request_body.schedule
241+
if email in user_schedulers:
242+
# Use the existing scheduler for the user
243+
scheduler = user_schedulers[email]
244+
else:
245+
# Create a new scheduler for the user
246+
scheduler = BackgroundScheduler()
247+
user_schedulers[email] = scheduler
248+
if current_user.welcome == "not sent":
249+
# send a welcome email in the background
250+
ensure_future(nylas_crud.send_welcome_email(email))
251+
# send an algorithm email in the background
252+
ensure_future(
253+
code_app.state.openai.async_send_algorithm_email(
254+
email, language
255+
)
256+
)
196257
user_info = users_schemas.PersonalInfo(
197258
full_name=current_user.full_name,
198259
bio=current_user.bio,
199-
programming_language=request_body.language,
260+
programming_language=language,
261+
schedule=schedule,
200262
)
201263
await users_crud.update_user_info(user_info, current_user, session)
202-
# send a welcome email in the background
203-
ensure_future(nylas_crud.send_welcome_email(current_user.email))
204-
# send an algorithm email in the background
205-
ensure_future(
206-
code_app.state.openai.async_send_algorithm_email(
207-
current_user.email, request_body.language
264+
265+
if schedule == "Every hour":
266+
scheduler.add_job(
267+
code_app.state.openai.send_algorithm_email,
268+
"interval",
269+
hours=1,
270+
args=(email, language),
208271
)
209-
)
210-
# send an algorithm email every 24 hours
211-
scheduler.add_job(
212-
code_app.state.openai.send_algorithm_email,
213-
"interval",
214-
hours=24,
215-
args=(current_user.email, request_body.language),
216-
)
272+
elif schedule == "Every day":
273+
scheduler.add_job(
274+
code_app.state.openai.send_algorithm_email,
275+
"interval",
276+
days=1,
277+
args=(email, language),
278+
)
279+
elif schedule == "Every week":
280+
scheduler.add_job(
281+
code_app.state.openai.send_algorithm_email,
282+
"interval",
283+
weeks=1,
284+
args=(email, language),
285+
)
286+
elif schedule == "Every month":
287+
scheduler.add_job(
288+
code_app.state.openai.send_algorithm_email,
289+
"interval",
290+
months=1,
291+
args=(email, language),
292+
)
293+
217294
scheduler.start()
218295
return {
219296
"status_code": 200,

src/users/schemas.py

+13
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ class PersonalInfo(BaseModel):
103103
programming_language: str = Field(
104104
..., example="python", description="User's programming language."
105105
)
106+
schedule: str = Field(
107+
..., example="Every hour", description="User's schedule."
108+
)
106109

107110

108111
class LogoutSchema(BaseModel):
@@ -123,3 +126,13 @@ class LanguageSchema(BaseModel):
123126
language: str = Field(
124127
..., example="python", description="User's programming language."
125128
)
129+
130+
schedule: str = Field(
131+
..., example="Every hour", description="User's schedule."
132+
)
133+
134+
welcome: bool = Field(
135+
...,
136+
example=True,
137+
description="A field that indicates whether of not the user should receive a welcome message.",
138+
)

0 commit comments

Comments
 (0)