Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions backend/app/db/supabase/auth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from app.db.supabase.supabase_client import supabase_client
import os
async def login_with_oauth(provider: str):
try:
result = supabase_client.auth.sign_in_with_oauth({
"provider": provider,
"options": {
"redirect_to": os.getenv("SUPABASE_REDIRECT_URL")
}
})
return {"url": result.url}
except Exception as e:
raise Exception(f"OAuth login failed for {provider}: {str(e)}")


async def login_with_github():
return await login_with_oauth("github")

async def login_with_discord():
return await login_with_oauth("discord")

async def logout(access_token: str):
try:
supabase_client.auth.set_session(access_token, refresh_token="")
supabase_client.auth.sign_out()
return {"message": "User logged out successfully"}
except Exception as e:
raise Exception(f"Logout failed: {str(e)}")
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

Exception chaining & redundant set_session.

  1. Use raise … from e to preserve the original traceback (ruff B904).
  2. Setting a session before sign_out() is unnecessary according to Supabase docs.
-        supabase_client.auth.set_session(access_token, refresh_token="")
-        supabase_client.auth.sign_out()
+        supabase_client.auth.sign_out()
 ...
-    except Exception as e:
-        raise Exception(f"Logout failed: {str(e)}")
+    except Exception as e:
+        raise Exception(f"Logout failed: {e}") from e
πŸ“ 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
async def logout(access_token: str):
try:
supabase_client.auth.set_session(access_token, refresh_token="")
supabase_client.auth.sign_out()
return {"message": "User logged out successfully"}
except Exception as e:
raise Exception(f"Logout failed: {str(e)}")
async def logout(access_token: str):
try:
supabase_client.auth.sign_out()
return {"message": "User logged out successfully"}
except Exception as e:
raise Exception(f"Logout failed: {e}") from e
🧰 Tools
πŸͺ› Ruff (0.11.9)

28-28: Within an except clause, raise exceptions with raise ... from err or raise ... from None to distinguish them from errors in exception handling

(B904)

πŸ€– Prompt for AI Agents
In backend/app/db/supabase/auth.py around lines 22 to 28, remove the call to
set_session before sign_out as it is unnecessary for logging out. Also, update
the exception handling to use 'raise ... from e' to preserve the original
traceback for better debugging.

17 changes: 17 additions & 0 deletions backend/app/db/supabase/supabase_client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import os
from dotenv import load_dotenv
from supabase import create_client

load_dotenv()

SUPABASE_URL = os.getenv("SUPABASE_URL")
SUPABASE_KEY = os.getenv("SUPABASE_KEY")

if SUPABASE_URL is None or SUPABASE_KEY is None:
raise ValueError("SUPABASE_URL and SUPABASE_KEY must be set in environment variables.")

supabase_client = create_client(SUPABASE_URL, SUPABASE_KEY)


def get_supabase_client():
return supabase_client
8 changes: 8 additions & 0 deletions backend/app/db/weaviate/weaviate_client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import weaviate

# Connect to local Weaviate instance
client = weaviate.connect_to_local()


def get_client():
return client
Empty file added backend/app/model/__init__.py
Empty file.
Empty file.
183 changes: 183 additions & 0 deletions backend/app/model/supabase/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
from pydantic import BaseModel, Field
from uuid import UUID
from typing import Optional, List
from datetime import datetime


class User(BaseModel):
"""
Represents a user profile with various platform integrations and metadata.

Attributes:
id (UUID): Unique identifier for the user.
created_at (datetime): Timestamp when the user was created.
updated_at (datetime): Timestamp when the user was last updated.
discord_id (Optional[str]): Discord user ID, if linked.
discord_username (Optional[str]): Discord username, if linked.
github_id (Optional[str]): GitHub user ID, if linked.
github_username (Optional[str]): GitHub username, if linked.
slack_id (Optional[str]): Slack user ID, if linked.
slack_username (Optional[str]): Slack username, if linked.
display_name (str): Display name of the user.
email (str): Email address of the user.
avatar_url (Optional[str]): URL to the user's avatar image.
bio (Optional[str]): Short biography or description of the user.
location (Optional[str]): User's location.
is_verified (bool): Indicates if the user is verified.
verification_token (Optional[str]): Token used for verifying the user.
verified_at (Optional[datetime]): Timestamp when the user was verified.
skills (Optional[List[str]]): List of user's skills.
github_stats (Optional[dict]): GitHub statistics for the user.
last_active_discord (Optional[datetime]): Last active time on Discord.
last_active_github (Optional[datetime]): Last active time on GitHub.
last_active_slack (Optional[datetime]): Last active time on Slack.
total_interactions_count (int): Total number of user interactions.
preferred_languages (List[str]): List of user's preferred programming languages.
weaviate_user_id (Optional[str]): Associated Weaviate user ID, if any.
"""
id: UUID
created_at: datetime
updated_at: datetime
discord_id: Optional[str] = None
discord_username: Optional[str] = None
github_id: Optional[str] = None
github_username: Optional[str] = None
slack_id: Optional[str] = None
slack_username: Optional[str] = None
display_name: str
email: str
avatar_url: Optional[str] = None
bio: Optional[str] = None
location: Optional[str] = None
is_verified: bool = False
verification_token: Optional[str] = None
verified_at: Optional[datetime] = None
skills: Optional[List[str]] = None
github_stats: Optional[dict] = None
last_active_discord: Optional[datetime] = None
last_active_github: Optional[datetime] = None
last_active_slack: Optional[datetime] = None
total_interactions_count: int = 0
preferred_languages: List[str] = Field(default_factory=list)
weaviate_user_id: Optional[str] = None

class Repository(BaseModel):
"""
Represents a GitHub repository with metadata and indexing status.

Attributes:
id (UUID): Unique identifier for the repository.
created_at (datetime): Timestamp when the repository record was created.
updated_at (datetime): Timestamp when the repository record was last updated.
github_id (Optional[int]): GitHub's unique identifier for the repository.
full_name (str): Full name of the repository (e.g., "owner/name").
name (str): Name of the repository.
owner (str): Owner of the repository.
description (Optional[str]): Description of the repository.
stars_count (int): Number of stars the repository has received.
forks_count (int): Number of times the repository has been forked.
open_issues_count (int): Number of open issues in the repository.
language (Optional[str]): Primary programming language used in the repository.
topics (List[str]): List of topics/tags associated with the repository.
is_indexed (bool): Indicates if the repository has been indexed.
indexed_at (Optional[datetime]): Timestamp when the repository was indexed.
indexing_status (Optional[str]): Current status of the indexing process.
total_chunks_count (int): Total number of chunks generated during indexing.
last_commit_hash (Optional[str]): Hash of the last commit indexed.
indexing_progress (Optional[dict]): Progress details of the indexing process.
weaviate_repo_id (Optional[str]): Identifier for the repository in Weaviate.
"""
id: UUID
created_at: datetime
updated_at: datetime
github_id: Optional[int] = None
full_name: str
name: str
owner: str
description: Optional[str] = None
stars_count: int = 0
forks_count: int = 0
open_issues_count: int = 0
language: Optional[str] = None
topics: List[str] = Field(default_factory=list)
is_indexed: bool = False
indexed_at: Optional[datetime] = None
indexing_status: Optional[str] = None
total_chunks_count: int = 0
last_commit_hash: Optional[str] = None
indexing_progress: Optional[dict] = None
weaviate_repo_id: Optional[str] = None

class CodeChunk(BaseModel):
"""
Represents a chunk of code extracted from a file within a repository.

Attributes:
id (UUID): Unique identifier for the code chunk.
repository_id (UUID): Identifier of the repository this chunk belongs to.
created_at (datetime): Timestamp when the chunk was created.
file_path (str): Path to the file containing the code chunk.
file_name (str): Name of the file containing the code chunk.
file_extension (Optional[str]): Extension of the file (e.g., '.py', '.js').
chunk_index (int): Index of the chunk within the file.
content (str): The actual code content of the chunk.
chunk_type (Optional[str]): Type of the chunk (e.g., 'function', 'class', 'block').
language (Optional[str]): Programming language of the code chunk.
lines_start (Optional[int]): Starting line number of the chunk in the file.
lines_end (Optional[int]): Ending line number of the chunk in the file.
code_metadata (Optional[dict]): Additional metadata related to the code chunk.
weaviate_chunk_id (Optional[str]): Identifier for the chunk in Weaviate vector database.
"""
id: UUID
repository_id: UUID
created_at: datetime
file_path: str
file_name: str
file_extension: Optional[str] = None
chunk_index: int
content: str
chunk_type: Optional[str] = None
language: Optional[str] = None
lines_start: Optional[int] = None
lines_end: Optional[int] = None
code_metadata: Optional[dict] = None
weaviate_chunk_id: Optional[str] = None

class Interaction(BaseModel):
"""
Represents an interaction within a repository platform, such as a message, comment, or post.

Attributes:
id (UUID): Unique identifier for the interaction.
created_at (datetime): Timestamp when the interaction was created.
updated_at (datetime): Timestamp when the interaction was last updated.
user_id (UUID): Unique identifier of the user who performed the interaction.
repository_id (UUID): Unique identifier of the repository associated with the interaction.
platform (str): Name of the platform where the interaction occurred (e.g., GitHub, Slack).
platform_specific_id (str): Platform-specific identifier for the interaction.
channel_id (Optional[str]): Identifier for the channel where the interaction took place, if applicable.
thread_id (Optional[str]): Identifier for the thread within the channel, if applicable.
content (str): The textual content of the interaction.
interaction_type (str): Type of interaction (e.g., message, comment, issue).
sentiment_score (Optional[float]): Sentiment analysis score of the interaction content.
intent_classification (Optional[str]): Classification of the user's intent in the interaction.
topics_discussed (List[str]): List of topics discussed in the interaction.
metadata (Optional[dict]): Additional metadata related to the interaction.
weaviate_interaction_id (Optional[str]): Identifier for the interaction in the Weaviate vector database.
"""
id: UUID
created_at: datetime
updated_at: datetime
user_id: UUID
repository_id: UUID
platform: str
platform_specific_id: str
channel_id: Optional[str] = None
thread_id: Optional[str] = None
content: str
interaction_type: str
sentiment_score: Optional[float] = None
intent_classification: Optional[str] = None
topics_discussed: List[str] = Field(default_factory=list)
metadata: Optional[dict] = None
weaviate_interaction_id: Optional[str] = None
35 changes: 35 additions & 0 deletions backend/app/model/weaviate/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from pydantic import BaseModel, Field
from typing import List


class WeaviateUserProfile(BaseModel):
"""
Represents a vectorized user profile for semantic search in Weaviate.
"""
supabase_user_id: str = Field(..., alias="supabaseUserId")
profile_summary: str = Field(..., alias="profileSummary")
primary_languages: List[str] = Field(..., alias="primaryLanguages")
expertise_areas: List[str] = Field(..., alias="expertiseAreas")
embedding: List[float] = Field(..., description="384-dimensional vector")


class WeaviateCodeChunk(BaseModel):
"""
Vectorized representation of code chunks stored in Weaviate.
"""
supabase_chunk_id: str = Field(..., alias="supabaseChunkId")
code_content: str = Field(..., alias="codeContent")
language: str
function_names: List[str] = Field(..., alias="functionNames")
embedding: List[float] = Field(..., description="384-dimensional vector")


class WeaviateInteraction(BaseModel):
"""
Vectorized interaction representation stored in Weaviate.
"""
supabase_interaction_id: str = Field(..., alias="supabaseInteractionId")
conversation_summary: str = Field(..., alias="conversationSummary")
platform: str
topics: List[str]
embedding: List[float] = Field(..., description="384-dimensional vector")
Loading