diff --git a/README.md b/README.md index fbad901..2adae5b 100755 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ A Fully Async-based backend for [Code Inbox](https://github.com/wiseaidev/code-i ## Development Requirements - Make (GNU command) -- Python (>= 3.9) +- Python (>= 3.9.10) - Poetry (1.6) --- diff --git a/pyproject.toml b/pyproject.toml index 998ea7f..9665fc4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,7 @@ packages = [ ] [tool.poetry.dependencies] -python = "^3.10.10" +python = "^3.9.10" fastapi = "^0.103.1" uvicorn = {extras = ["standard"], version = "^0.23.2"} pydantic = {extras = ["email"], version = "^1.10.12"} diff --git a/src/nylas/crud.py b/src/nylas/crud.py index a14ec83..c68d25c 100644 --- a/src/nylas/crud.py +++ b/src/nylas/crud.py @@ -145,7 +145,6 @@ async def login_user(token: str, session: AIOSession) -> Dict[str, Any]: email_address = access_token_obj["email_address"] user_obj = await find_existed_user(email_address, session) - print(user_obj) if not user_obj: await create_user(email_address, session) diff --git a/src/nylas/router.py b/src/nylas/router.py index 77df2d0..b81f817 100644 --- a/src/nylas/router.py +++ b/src/nylas/router.py @@ -159,7 +159,6 @@ async def send_email( draft["bcc"] = [{"email": request_body.bcc}] draft["body"] = request_body.message draft["from"] = [{"email": current_user.email}] - print(draft) message = draft.send() return message @@ -205,7 +204,6 @@ async def delete_label( removed_item = code_app.state.nylas.labels.delete(id=item_id) if removed_item: - print(f"Removed item: {removed_item}") return {"message": "Item deleted"} return {"message": "Item not found"} @@ -389,7 +387,6 @@ async def execute_code( await asyncio.sleep(1) if asyncio.get_event_loop().time() - start_time > timeout: - print("Timeout") submission_status_dict[submission_token] = "Timeout" break @@ -403,7 +400,6 @@ async def execute_code( print(new_response.json()) submission_stdout = new_response.json()["stdout"] if submission_stdout: - print("Finished") submission_status_dict[submission_token] = "Finished" result = new_response.json() break diff --git a/src/users/crud.py b/src/users/crud.py index 103afc8..2081409 100644 --- a/src/users/crud.py +++ b/src/users/crud.py @@ -113,6 +113,8 @@ async def update_user_info( "full_name": personal_info.full_name, "bio": personal_info.bio, "programming_language": personal_info.programming_language, + "schedule": personal_info.schedule, + "welcome": "sent", "modified_date": datetime.utcnow(), } ) diff --git a/src/users/models.py b/src/users/models.py index 8af4b71..e07c72c 100644 --- a/src/users/models.py +++ b/src/users/models.py @@ -104,6 +104,13 @@ class User(Model): calendar: Optional[str] = Field( default="", description="User's calendar ID." ) + schedule: Optional[str] = Field( + default="every day", description="User's schedule." + ) + welcome: Optional[str] = Field( + default="not sent", + description="User's welcome email status, sent or not sent.", + ) user_status: Optional[UserStatus] = Field( default=UserStatus.ACTIVE.value, description="User's status." ) diff --git a/src/users/router.py b/src/users/router.py index 81f7503..acbf6ce 100644 --- a/src/users/router.py +++ b/src/users/router.py @@ -68,6 +68,9 @@ # create and use as many Drives as you want! profile_images = deta.Drive("profile-images") +# Create a dictionary to store scheduler instances for each user +user_schedulers = {} + @router.post( "/user/logout", @@ -162,7 +165,47 @@ async def update_personal_information( An endpoint for updating users personel info. """ try: + from src.main import ( + code_app, + ) + await users_crud.update_user_info(personal_info, current_user, session) + schedule = personal_info.schedule + language = personal_info.language + email = current_user.email + # Create a new scheduler for the user + scheduler = BackgroundScheduler() + user_schedulers[email] = scheduler + if schedule == "Every hour": + scheduler.add_job( + code_app.state.openai.send_algorithm_email, + "interval", + hours=1, + args=(email, language), + ) + elif schedule == "Every day": + scheduler.add_job( + code_app.state.openai.send_algorithm_email, + "interval", + days=1, + args=(email, language), + ) + elif schedule == "Every week": + scheduler.add_job( + code_app.state.openai.send_algorithm_email, + "interval", + weeks=1, + args=(email, language), + ) + elif schedule == "Every month": + scheduler.add_job( + code_app.state.openai.send_algorithm_email, + "interval", + months=1, + args=(email, language), + ) + + scheduler.start() return { "status_code": 200, "message": "Your personal information has been updated successfully!", @@ -185,35 +228,69 @@ async def update_language( session: AIOSession = Depends(dependencies.get_db_transactional_session), ) -> Dict[str, Any]: """ - Set the programming language for a specific user using their access token. + Set the programming language and the emails schedule for a specific user using their access token. """ try: from src.main import ( code_app, ) - scheduler = BackgroundScheduler() + email = current_user.email + language = request_body.language + schedule = request_body.schedule + if email in user_schedulers: + # Use the existing scheduler for the user + scheduler = user_schedulers[email] + else: + # Create a new scheduler for the user + scheduler = BackgroundScheduler() + user_schedulers[email] = scheduler + if current_user.welcome == "not sent": + # send a welcome email in the background + ensure_future(nylas_crud.send_welcome_email(email)) + # send an algorithm email in the background + ensure_future( + code_app.state.openai.async_send_algorithm_email( + email, language + ) + ) user_info = users_schemas.PersonalInfo( full_name=current_user.full_name, bio=current_user.bio, - programming_language=request_body.language, + programming_language=language, + schedule=schedule, ) await users_crud.update_user_info(user_info, current_user, session) - # send a welcome email in the background - ensure_future(nylas_crud.send_welcome_email(current_user.email)) - # send an algorithm email in the background - ensure_future( - code_app.state.openai.async_send_algorithm_email( - current_user.email, request_body.language + + if schedule == "Every hour": + scheduler.add_job( + code_app.state.openai.send_algorithm_email, + "interval", + hours=1, + args=(email, language), ) - ) - # send an algorithm email every 24 hours - scheduler.add_job( - code_app.state.openai.send_algorithm_email, - "interval", - hours=24, - args=(current_user.email, request_body.language), - ) + elif schedule == "Every day": + scheduler.add_job( + code_app.state.openai.send_algorithm_email, + "interval", + days=1, + args=(email, language), + ) + elif schedule == "Every week": + scheduler.add_job( + code_app.state.openai.send_algorithm_email, + "interval", + weeks=1, + args=(email, language), + ) + elif schedule == "Every month": + scheduler.add_job( + code_app.state.openai.send_algorithm_email, + "interval", + months=1, + args=(email, language), + ) + scheduler.start() return { "status_code": 200, diff --git a/src/users/schemas.py b/src/users/schemas.py index e1723ef..d28fd95 100644 --- a/src/users/schemas.py +++ b/src/users/schemas.py @@ -103,6 +103,9 @@ class PersonalInfo(BaseModel): programming_language: str = Field( ..., example="python", description="User's programming language." ) + schedule: str = Field( + ..., example="Every hour", description="User's schedule." + ) class LogoutSchema(BaseModel): @@ -123,3 +126,13 @@ class LanguageSchema(BaseModel): language: str = Field( ..., example="python", description="User's programming language." ) + + schedule: str = Field( + ..., example="Every hour", description="User's schedule." + ) + + welcome: bool = Field( + ..., + example=True, + description="A field that indicates whether of not the user should receive a welcome message.", + )