Skip to content

Conversation

@vrajpatelll
Copy link
Collaborator

@vrajpatelll vrajpatelll commented Jul 28, 2025

Overview

This PR implements the migration from the deprecated avatar field to the new imageUrl field for user profile images across the Splitwiser backend. The goal is to standardize user image handling, improve API consistency, and prepare for future frontend integrations.


✅ Completed

Phase 1: Code Standardization

  • Auth Service:
    • Updated auth/schemas.py to use imageUrl instead of avatar.
    • Updated auth/service.py to use imageUrl in all user creation and update operations.
  • Groups Service:
    • Updated groups/service.py to use imageUrl when enriching member data.
  • Database Operations:
    • Ensured all database queries and updates use imageUrl.
  • Response Models:
    • Verified all API response models consistently use imageUrl.

Phase 2: Database Migration

  • Migration Script:
    • Script identifies users with avatar but no imageUrl, copies values, and removes avatar.
    • Logs migration statistics and any conflicts.
  • Backup Strategy:
    • Documented backup procedures before migration.
  • Rollback Plan:
    • Created rollback script to restore avatar if needed.

Phase 3: Testing & Validation

  • Unit Tests:
    • Updated all tests to use imageUrl consistently.
  • Integration Tests:
    • Verified API endpoints return consistent field names.
  • Migration Tests:
    • Tested migration script with sample data.
  • Backward Compatibility:
    • Ensured no breaking changes for existing API consumers.

Next Steps:
Focus on documentation, code cleanup, and final schema validation to complete the migration and ensure long-term maintainability.


Closes:

Summary by CodeRabbit

  • New Features

    • Added a script to back up the database, including collection data and metadata.
    • Introduced a migration script to convert user avatar fields to image URLs, with conflict handling and rollback support.
  • Bug Fixes

    • Standardized user profile image fields across the app by renaming "avatar" to "imageUrl" everywhere.
    • Removed fallback usage of the deprecated avatar field when displaying user images.
  • Tests

    • Updated authentication tests to use the new "imageUrl" field in mock user data.

@vrajpatelll vrajpatelll requested a review from Devasy as a code owner July 28, 2025 19:07
@netlify
Copy link

netlify bot commented Jul 28, 2025

Deploy Preview for splitwizer failed. Why did it fail? →

Name Link
🔨 Latest commit d28f15e
🔍 Latest deploy log https://app.netlify.com/projects/splitwizer/deploys/6888eee987a829000856fedf

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jul 28, 2025

Walkthrough

The changes standardize the user profile image field across the backend, replacing all uses of avatar with imageUrl in models, services, and tests. Fallback logic for avatar is removed. Two new scripts are introduced: one for database backup and another for migrating user documents from avatar to imageUrl, including logging and rollback capabilities.

Changes

Cohort / File(s) Change Summary
Auth Schema Standardization
backend/app/auth/schemas.py
Renamed avatar field to imageUrl in the UserResponse model.
Auth Service Refactor
backend/app/auth/service.py
Updated all references from avatar to imageUrl in user creation and Google authentication logic.
Groups Service Refactor
backend/app/groups/service.py
Replaced all avatar references with imageUrl in member enrichment logic; removed fallback logic.
User Service Cleanup
backend/app/user/service.py
Removed fallback to avatar for image URL; now only uses imageUrl field directly.
New Backup Script
backend/scripts/backup_db.py
Added a script to back up MongoDB collections to timestamped JSON files with metadata.
New Migration Script
backend/scripts/migrate_avatar_to_imageurl.py
Added a migration script to move user avatar data to imageUrl, with logging and rollback.
Test Update
backend/tests/auth/test_auth_routes.py
Updated test user data to use imageUrl instead of avatar.

Sequence Diagram(s)

sequenceDiagram
    participant Admin as Admin/Operator
    participant Script as Migration Script
    participant DB as MongoDB

    Admin->>Script: Run migrate_avatar_to_imageurl.py
    Script->>DB: Query users with avatar field
    Script->>DB: For each user, check for imageUrl conflicts
    Script->>DB: Prepare bulk updates (set imageUrl, unset avatar)
    Script->>DB: Execute bulk update
    Script->>DB: Log statistics and conflicts
    Script->>Admin: Output summary and log file location
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~18 minutes

Assessment against linked issues

Objective Addressed Explanation
Standardize on imageUrl across backend code (auth, groups, user services, schemas, tests) (#69)
Remove fallback logic for avatar in codebase (#69)
Add migration script to move avatar to imageUrl with logging, backup, and rollback (#69)
Add database backup script prior to migration (#69)
Update tests to use imageUrl consistently (#69)

Assessment against linked issues: Out-of-scope changes

Code Change Explanation
Addition of backend/scripts/backup_db.py (entire file) While not explicitly listed as a required deliverable, a backup script is implied as part of migration best practices in the issue; thus, this is arguably in-scope.

Possibly related PRs

Poem

🐇✨
Goodbye, dear avatar, your time is through—
Now imageUrl shines, consistent and new!
Scripts to migrate, and backups to keep,
Data flows smoothly, no more fields to sweep.
With tests all aligned, our code hops ahead—
A backend refreshed, by a rabbit well-fed!

Note

⚡️ Unit Test Generation is now available in beta!

Learn more here, or try it out under "Finishing Touches" below.


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 119d7f8 and 5412422.

📒 Files selected for processing (1)
  • backend/scripts/migrate_avatar_to_imageurl.py (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • backend/scripts/migrate_avatar_to_imageurl.py
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🧹 Nitpick comments (4)
backend/scripts/backup_db.py (2)

29-32: Consider making backup directory configurable.

The backup directory is hardcoded as "backups". Consider making this configurable via environment variable for flexibility in different deployment environments.

-        backup_dir = "backups"
+        backup_dir = os.getenv("BACKUP_DIR", "backups")

53-53: Improve JSON serialization robustness.

The default=str parameter is good, but consider adding explicit handling for datetime objects and other common MongoDB types.

-                json.dump(documents, f, indent=2, default=str)
+                def json_serializer(obj):
+                    if isinstance(obj, datetime):
+                        return obj.isoformat()
+                    return str(obj)
+                json.dump(documents, f, indent=2, default=json_serializer)
backend/scripts/migrate_avatar_to_imageurl.py (2)

62-65: Consider using context manager for MongoDB connection.

The MongoDB client connection is not explicitly closed, which could lead to connection leaks in case of errors or exceptions.

-        # Connect to MongoDB
-        client = MongoClient(MONGODB_URL)
-        db = client[DATABASE_NAME]
-        users = db.users
+        # Connect to MongoDB
+        with MongoClient(MONGODB_URL) as client:
+            db = client[DATABASE_NAME]
+            users = db.users
+            # ... rest of the migration logic should be indented under this context

131-133: Consider the destructive nature of collection drop.

The rollback function drops the entire users collection, which is a destructive operation. Consider adding a confirmation mechanism or additional safety checks, especially for production environments.

Consider implementing a less destructive rollback approach:

  1. Rename current collection as backup before dropping
  2. Add confirmation prompts for production environments
  3. Validate backup data integrity before proceeding with rollback
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7ccca78 and 119d7f8.

📒 Files selected for processing (7)
  • backend/app/auth/schemas.py (1 hunks)
  • backend/app/auth/service.py (3 hunks)
  • backend/app/groups/service.py (2 hunks)
  • backend/app/user/service.py (1 hunks)
  • backend/scripts/backup_db.py (1 hunks)
  • backend/scripts/migrate_avatar_to_imageurl.py (1 hunks)
  • backend/tests/auth/test_auth_routes.py (1 hunks)
🧰 Additional context used
📓 Path-based instructions (4)
backend/**/*.py

📄 CodeRabbit Inference Engine (.github/copilot-instructions.md)

Backend code must be implemented using FastAPI with Python 3.9+ and organized under the /backend/ directory.

Files:

  • backend/app/auth/service.py
  • backend/tests/auth/test_auth_routes.py
  • backend/app/user/service.py
  • backend/scripts/backup_db.py
  • backend/app/groups/service.py
  • backend/app/auth/schemas.py
  • backend/scripts/migrate_avatar_to_imageurl.py
backend/app/{auth,user,groups,expenses}/**/*.py

📄 CodeRabbit Inference Engine (.github/copilot-instructions.md)

backend/app/{auth,user,groups,expenses}/**/*.py: Backend services should be modular, with authentication and user registration in app/auth/, user profile management in app/user/, group management in app/groups/, and expense tracking in app/expenses/.
When adding a new API endpoint, add the route to the appropriate service router file in the backend.

Files:

  • backend/app/auth/service.py
  • backend/app/user/service.py
  • backend/app/groups/service.py
  • backend/app/auth/schemas.py
backend/app/auth/**/*.py

📄 CodeRabbit Inference Engine (.github/copilot-instructions.md)

JWT authentication with refresh token rotation must be implemented in the backend.

Files:

  • backend/app/auth/service.py
  • backend/app/auth/schemas.py
backend/tests/**/*.py

📄 CodeRabbit Inference Engine (.github/copilot-instructions.md)

Backend tests must be placed in the /backend/tests/ directory and run using pytest.

Files:

  • backend/tests/auth/test_auth_routes.py
🧠 Learnings (1)
backend/scripts/backup_db.py (1)

Learnt from: CR
PR: Devasy23/splitwiser#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-07-26T09:41:01.332Z
Learning: Applies to backend/app/database.py : MongoDB must be used for persistent data storage in the backend, with connection logic in backend/app/database.py.

🧬 Code Graph Analysis (3)
backend/tests/auth/test_auth_routes.py (1)
backend/tests/user/test_user_routes.py (2)
  • test_update_user_profile_partial_update (91-108)
  • setup_test_user (26-49)
backend/app/user/service.py (1)
backend/tests/user/test_user_service.py (2)
  • test_transform_user_document_missing_optional_fields (63-80)
  • test_transform_user_document_with_updated_at_different_from_created_at (82-100)
backend/app/auth/schemas.py (3)
backend/app/user/schemas.py (2)
  • UserProfileUpdateRequest (14-17)
  • UserProfileResponse (5-12)
backend/app/groups/schemas.py (1)
  • GroupUpdateRequest (21-23)
backend/tests/user/test_user_service.py (1)
  • test_transform_user_document_missing_optional_fields (63-80)
🔇 Additional comments (12)
backend/app/auth/schemas.py (1)

45-45: Field rename avatarimageUrl verified

I confirmed that all schema definitions, services, routes, and tests now use imageUrl. The only remaining references to avatar live in the migration script (backend/scripts/migrate_avatar_to_imageurl.py), which is intentional.

– No breaking changes detected
– Schema consistency maintained across backend/app/auth, user, and groups
– Tests updated to use imageUrl

All set to merge.

backend/tests/auth/test_auth_routes.py (1)

171-171: All tests consistently updated to use imageUrl

Verified no remaining avatar references in backend/tests/, and all test cases now use the new imageUrl field.

  • Checked with ripgrep: no occurrences of "avatar" in backend/tests/
  • Confirmed "imageUrl" appears in every relevant test file

Tests align with the updated schema—no further changes needed.

backend/app/auth/service.py (3)

118-118: LGTM! Consistent field naming in user creation.

The field name change from avatar to imageUrl in user creation is consistent with the schema update.


205-206: LGTM! Google auth user update logic correctly updated.

Both the condition check and assignment use the new imageUrl field name, maintaining the existing logic for updating user profile images from Google OAuth.


218-218: All avatar references have been removed
The verification script (rg -i "avatar" backend/app/auth/) returned no matches in backend/app/auth/.

LGTM! New Google user creation consistently uses imageUrl.

backend/app/user/service.py (1)

44-44: Approve removal of fallback logic after migration completion

The migration script backend/scripts/migrate_avatar_to_imageurl.py correctly migrates all avatar values into imageUrl, unsets the deprecated field, and logs any conflicts for manual resolution. The transform_user_document tests in backend/tests/user/test_user_service.py have been updated to expect imageUrl (or None) and no longer rely on the old avatar field.

• Migration script: backend/scripts/migrate_avatar_to_imageurl.py
• Test coverage: backend/tests/user/test_user_service.py

No further changes needed—this can be deployed once the migration has been run and conflicts addressed.

backend/app/groups/service.py (3)

57-57: LGTM! Field name standardization implemented correctly.

The change from user.get("avatar") to user.get("imageUrl") correctly implements the field standardization objective. The code now consistently uses the canonical imageUrl field name.


63-63: Consistent field naming in fallback case.

The change to "imageUrl": None maintains consistency with the standardized field naming when creating fallback user objects.


78-78: Exception handling maintains field consistency.

The change ensures that even in error scenarios, the API response uses the standardized imageUrl field name, maintaining consistency across all code paths.

backend/scripts/migrate_avatar_to_imageurl.py (3)

82-90: Conflict detection logic handles edge cases well.

The conflict detection correctly identifies users with differing avatar and imageUrl values and logs them appropriately. The logic also handles the case where both fields exist with the same value by counting them as users_with_both_fields.


93-99: Bulk operation correctly combines set and unset operations.

The UpdateOne operation properly sets the new imageUrl field and removes the deprecated avatar field in a single atomic operation, which is efficient and maintains data consistency.


143-155: Excellent logging and user feedback.

The main execution block provides comprehensive statistics logging and user-friendly feedback about the migration results and log file location. This helps with monitoring and debugging migration issues.

Comment on lines +21 to +22
MONGODB_URL = os.getenv("MONGODB_URL")
DATABASE_NAME = os.getenv("DATABASE_NAME")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Verify MongoDB connection environment variables.

The script relies on MONGODB_URL and DATABASE_NAME environment variables but doesn't validate their presence before proceeding.


🏁 Script executed:

#!/bin/bash
# Check if the environment variables are properly handled in other parts of the codebase
rg -A 3 "MONGODB_URL.*DATABASE_NAME" --type py

Length of output: 48


🏁 Script executed:

#!/bin/bash
# Display the first 100 lines of the backup_db.py script to check env var handling
head -n 100 backend/scripts/backup_db.py

Length of output: 2618


Add validation for required environment variables

The script loads MONGODB_URL and DATABASE_NAME but will fail with a less‐helpful error if they aren’t set. Before using them, explicitly check and raise an informative exception.

• File: backend/scripts/backup_db.py
• Around lines 17–22 (after loading env vars)

Suggested change:

 load_dotenv(os.path.join(BACKEND_DIR, ".env"))

 # Get MongoDB connection details from environment
 MONGODB_URL = os.getenv("MONGODB_URL")
 DATABASE_NAME = os.getenv("DATABASE_NAME")

+if not MONGODB_URL or not DATABASE_NAME:
+    missing = []
+    if not MONGODB_URL:
+        missing.append("MONGODB_URL")
+    if not DATABASE_NAME:
+        missing.append("DATABASE_NAME")
+    raise EnvironmentError(
+        f"Missing required environment variable(s): {', '.join(missing)}"
+    )

This ensures the script fails fast with a clear message when required configuration is absent.

🤖 Prompt for AI Agents
In backend/scripts/backup_db.py around lines 17 to 22, the environment variables
MONGODB_URL and DATABASE_NAME are loaded but not validated. Add explicit checks
after loading these variables to verify they are not None or empty, and if they
are missing, raise a clear and informative exception indicating which variable
is required. This will ensure the script fails fast with a helpful error message
when the configuration is absent.

Comment on lines +46 to +49
# Convert ObjectId to string for JSON serialization
for doc in documents:
doc["_id"] = str(doc["_id"])

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Potential memory issue with large collections.

Using list(collection.find({})) loads all documents into memory at once, which could cause memory issues for large collections.

Consider using pagination or streaming approach:

-            documents = list(collection.find({}))
-
-            # Convert ObjectId to string for JSON serialization
-            for doc in documents:
-                doc["_id"] = str(doc["_id"])
+            documents = []
+            batch_size = 1000
+            cursor = collection.find({}).batch_size(batch_size)
+            async for doc in cursor:
+                doc["_id"] = str(doc["_id"])
+                documents.append(doc)

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In backend/scripts/backup_db.py around lines 46 to 49, loading all documents
from the collection into memory at once using list(collection.find({})) can
cause memory issues with large collections. Modify the code to iterate over the
cursor returned by collection.find({}) directly without converting it to a list,
processing each document one by one to avoid loading everything into memory
simultaneously. This streaming approach will reduce memory usage and improve
scalability.

Comment on lines +70 to +72
except Exception as e:
print(f"Backup failed: {str(e)}")
raise
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Enhance error handling and cleanup.

The error handling prints but doesn't clean up partial backup files on failure.

    except Exception as e:
        print(f"Backup failed: {str(e)}")
+        # Clean up partial backup on failure
+        if 'backup_path' in locals() and os.path.exists(backup_path):
+            import shutil
+            shutil.rmtree(backup_path, ignore_errors=True)
+            print(f"Cleaned up partial backup at: {backup_path}")
        raise
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
except Exception as e:
print(f"Backup failed: {str(e)}")
raise
except Exception as e:
print(f"Backup failed: {str(e)}")
# Clean up partial backup on failure
if 'backup_path' in locals() and os.path.exists(backup_path):
import shutil
shutil.rmtree(backup_path, ignore_errors=True)
print(f"Cleaned up partial backup at: {backup_path}")
raise
🤖 Prompt for AI Agents
In backend/scripts/backup_db.py around lines 70 to 72, the current error
handling prints the exception but does not remove any partial backup files
created before the failure. Modify the except block to include cleanup logic
that deletes any incomplete backup files to avoid leaving corrupted or partial
backups on disk. Ensure the cleanup runs before re-raising the exception.

4. Logs migration statistics
"""

from backup_db import create_backup
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Verify backup_db module availability.

The relative import assumes backup_db.py exists in the same directory. Consider adding error handling for import failures.


🏁 Script executed:

#!/bin/bash
# Check if backup_db.py exists in the scripts directory
fd -t f "backup_db.py" backend/scripts/

Length of output: 68


🏁 Script executed:

#!/bin/bash
# Inspect environment variable loading, log directory creation, and MongoDB connection
rg -n "load_dotenv" backend/scripts/migrate_avatar_to_imageurl.py
rg -n "os.makedirs" backend/scripts/migrate_avatar_to_imageurl.py
rg -n "basicConfig" backend/scripts/migrate_avatar_to_imageurl.py
rg -n "MongoClient" backend/scripts/migrate_avatar_to_imageurl.py

Length of output: 566


Ensure robust error handling for imports, environment variables, logging setup, and MongoDB connections

  • Wrap the from backup_db import create_backup (line 10) in a try/except to catch ImportError and emit a clear message if the module isn’t found.
  • After load_dotenv(...) (line 28), explicitly validate required env vars (e.g. MONGODB_URL, any others your script needs):
    required = ["MONGODB_URL"]
    missing = [var for var in required if not os.getenv(var)]
    if missing:
        logging.error(f"Missing environment variables: {', '.join(missing)}")
        sys.exit(1)
  • Surround os.makedirs(log_dir, exist_ok=True) (line 40) with try/except to catch PermissionError, log it, and exit gracefully if the directory isn’t writable.
  • Before calling MongoClient(MONGODB_URL) on lines 63 and 119, ensure MONGODB_URL is non‐empty and consider catching pymongo.errors.ConfigurationError to handle malformed URIs.

These changes will prevent silent failures and make debugging easier.

@Devasy
Copy link
Owner

Devasy commented Jul 29, 2025

@vrajpatelll great job, Have you ran backup & migrate script?

Or that is planned on merge?

@Devasy Devasy added bug Something isn't working good first issue Good for newcomers backend gssoc25 level2 api labels Jul 29, 2025
@github-project-automation github-project-automation bot moved this to Backlog in Splitwiser Jul 29, 2025
@Devasy Devasy linked an issue Jul 29, 2025 that may be closed by this pull request
23 tasks
@Devasy Devasy moved this from Backlog to In review in Splitwiser Jul 29, 2025
Copy link
Owner

@Devasy Devasy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@Devasy Devasy merged commit e3d170a into Devasy:main Jul 29, 2025
35 of 41 checks passed
@github-project-automation github-project-automation bot moved this from In review to Done in Splitwiser Jul 29, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api backend bug Something isn't working good first issue Good for newcomers gssoc25 level2

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

🐛 Fix inconsistent field naming: avatar vs imageUrl across backend services

2 participants