Skip to content

Commit e754dbe

Browse files
committedMar 7, 2025·
define model
1 parent 6d60e19 commit e754dbe

27 files changed

+330
-0
lines changed
 

‎backend/app/__init__.py

Whitespace-only changes.

‎backend/app/auth/__init__.py

Whitespace-only changes.

‎backend/app/auth/oauth.py

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from authlib.integrations.starlette_client import OAuth
2+
from starlette.config import Config
3+
from ..config import config
4+
5+
oauth = OAuth(Config(".env"))
6+
7+
oauth.register(
8+
name="github",
9+
client_id=config.GITHUB_CLIENT_ID,
10+
client_secret=config.GITHUB_CLIENT_SECRET,
11+
authorize_url="https://github.com/login/oauth/authorize",
12+
access_token_url="https://github.com/login/oauth/access_token",
13+
api_base_url="https://api.github.com/",
14+
)
15+
16+
oauth.register(
17+
name="gitlab",
18+
client_id=config.GITLAB_CLIENT_ID,
19+
client_secret=config.GITLAB_CLIENT_SECRET,
20+
authorize_url="https://gitlab.com/oauth/authorize",
21+
access_token_url="https://gitlab.com/oauth/token",
22+
api_base_url="https://gitlab.com/api/v4/",
23+
)

‎backend/app/config.py

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from dotenv import load_dotenv
2+
import os
3+
4+
load_dotenv()
5+
6+
class Config:
7+
GITHUB_CLIENT_ID = os.getenv("GITHUB_CLIENT_ID")
8+
GITHUB_CLIENT_SECRET = os.getenv("GITHUB_CLIENT_SECRET")
9+
GITLAB_CLIENT_ID = os.getenv("GITLAB_CLIENT_ID")
10+
GITLAB_CLIENT_SECRET = os.getenv("GITLAB_CLIENT_SECRET")
11+
DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///database.db")
12+
13+
config = Config()

‎backend/app/dashboard/__init__.py

Whitespace-only changes.

‎backend/app/dashboard/model.py

Whitespace-only changes.

‎backend/app/dashboard/route.py

Whitespace-only changes.

‎backend/app/dashboard/schema.py

Whitespace-only changes.

‎backend/app/dependencies.py

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from sqlmodel import Session
2+
from ..main import engine
3+
4+
def get_session():
5+
with Session(engine) as session:
6+
yield session

‎backend/app/repository/__init__.py

Whitespace-only changes.

‎backend/app/repository/model.py

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from sqlmodel import SQLModel, Field, Relationship
2+
from typing import Optional, List
3+
from datetime import datetime
4+
import json
5+
from ..user.model import User # Import User from its new location
6+
7+
class Repository(SQLModel, table=True):
8+
id: Optional[int] = Field(default=None, primary_key=True, index=True)
9+
owner_id: int = Field(foreign_key="user.id")
10+
name: str
11+
platform: str = Field(regex="^(github|gitlab)$")
12+
api_token: str
13+
custom_prompt: Optional[str] = Field(default=None)
14+
settings: str = Field(default="{}")
15+
created_at: datetime = Field(default_factory=datetime.utcnow)
16+
17+
owner: User = Relationship(back_populates="repositories")
18+
reviews: List["Review"] = Relationship(back_populates="repository")
19+
20+
def get_settings(self) -> dict:
21+
return json.loads(self.settings)
22+
23+
def set_settings(self, settings: dict):
24+
self.settings = json.dumps(settings)

‎backend/app/repository/route.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from fastapi import APIRouter, Depends
2+
from sqlmodel import Session
3+
from ..dependencies import get_session
4+
from .model import Repository
5+
from .schema import RepositoryCreate, RepositoryResponse
6+
7+
router = APIRouter()
8+
9+
@router.post("/", response_model=RepositoryResponse)
10+
def create_repository(repo: RepositoryCreate, session: Session = Depends(get_session)):
11+
db_repo = Repository.from_orm(repo, update={"owner_id": 1}) # Hardcoded owner_id for now
12+
db_repo.set_settings(repo.settings.dict())
13+
session.add(db_repo)
14+
session.commit()
15+
session.refresh(db_repo)
16+
return db_repo

‎backend/app/repository/schema.py

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from pydantic import Field
2+
from typing import Optional
3+
from datetime import datetime
4+
from sqlmodel import SQLModel as SQLModelBase
5+
6+
class RepositorySettings(SQLModelBase):
7+
ai_provider: Optional[str] = "openai"
8+
model: Optional[str] = "gpt-4"
9+
10+
class RepositoryCreate(SQLModelBase):
11+
name: str
12+
platform: str = Field(..., regex="^(github|gitlab)$")
13+
api_token: str
14+
custom_prompt: Optional[str] = None
15+
settings: Optional[RepositorySettings] = Field(default_factory=lambda: RepositorySettings())
16+
17+
class RepositoryResponse(SQLModelBase):
18+
id: int
19+
owner_id: int
20+
name: str
21+
platform: str
22+
custom_prompt: Optional[str]
23+
settings: RepositorySettings
24+
created_at: datetime
25+
26+
class Config:
27+
orm_mode = True
28+
property_getters = {"settings": lambda obj: obj.get_settings()}

‎backend/app/review/__init__.py

Whitespace-only changes.

‎backend/app/review/model.py

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from sqlmodel import SQLModel, Field, Relationship
2+
from typing import Optional, List
3+
from datetime import datetime
4+
from ..user.model import User
5+
from ..repository.model import Repository
6+
7+
class Review(SQLModel, table=True):
8+
id: Optional[int] = Field(default=None, primary_key=True, index=True)
9+
repository_id: int = Field(foreign_key="repository.id")
10+
reviewer_id: Optional[int] = Field(default=None, foreign_key="user.id")
11+
pr_or_mr_id: str
12+
title: str
13+
summary: Optional[str] = Field(default=None)
14+
status: str = Field(default="pending")
15+
created_at: datetime = Field(default_factory=datetime.utcnow)
16+
updated_at: datetime = Field(default_factory=datetime.utcnow)
17+
18+
repository: Repository = Relationship(back_populates="reviews")
19+
reviewer: Optional[User] = Relationship(back_populates="reviews")
20+
comments: List["ReviewComment"] = Relationship(back_populates="review")

‎backend/app/review/route.py

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from fastapi import APIRouter, Depends
2+
from sqlmodel import Session
3+
from ..dependencies import get_session
4+
from .model import Review
5+
from .schema import ReviewCreate, ReviewResponse
6+
7+
router = APIRouter()
8+
9+
@router.post("/", response_model=ReviewResponse)
10+
def create_review(review: ReviewCreate, session: Session = Depends(get_session)):
11+
db_review = Review.from_orm(review)
12+
session.add(db_review)
13+
session.commit()
14+
session.refresh(db_review)
15+
return db_review

‎backend/app/review/schema.py

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from typing import Optional, List
2+
from datetime import datetime
3+
from sqlmodel import SQLModel as SQLModelBase
4+
from ..review_comment.schema import ReviewCommentResponse
5+
6+
class ReviewCreate(SQLModelBase):
7+
repository_id: int
8+
pr_or_mr_id: str
9+
title: str
10+
11+
class ReviewResponse(SQLModelBase):
12+
id: int
13+
repository_id: int
14+
reviewer_id: Optional[int]
15+
pr_or_mr_id: str
16+
title: str
17+
summary: Optional[str]
18+
status: str
19+
created_at: datetime
20+
updated_at: datetime
21+
comments: List[ReviewCommentResponse] = []
22+
23+
class Config:
24+
orm_mode = True

‎backend/app/review_comment/__init__.py

Whitespace-only changes.

‎backend/app/review_comment/model.py

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from sqlmodel import SQLModel, Field, Relationship
2+
from typing import Optional
3+
from datetime import datetime
4+
from ..review.model import Review
5+
6+
class ReviewComment(SQLModel, table=True):
7+
id: Optional[int] = Field(default=None, primary_key=True, index=True)
8+
review_id: int = Field(foreign_key="review.id")
9+
file_path: str
10+
line_number: int
11+
comment: str
12+
created_at: datetime = Field(default_factory=datetime.utcnow)
13+
14+
review: Review = Relationship(back_populates="comments")

‎backend/app/review_comment/route.py

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from fastapi import APIRouter, Depends
2+
from sqlmodel import Session
3+
from ..dependencies import get_session
4+
from .model import ReviewComment
5+
from .schema import ReviewCommentCreate, ReviewCommentResponse
6+
7+
router = APIRouter()
8+
9+
@router.post("/", response_model=ReviewCommentResponse)
10+
def create_review_comment(comment: ReviewCommentCreate, session: Session = Depends(get_session)):
11+
db_comment = ReviewComment.from_orm(comment)
12+
session.add(db_comment)
13+
session.commit()
14+
session.refresh(db_comment)
15+
return db_comment

‎backend/app/review_comment/schema.py

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from typing import Optional
2+
from datetime import datetime
3+
from sqlmodel import SQLModel as SQLModelBase
4+
5+
class ReviewCommentCreate(SQLModelBase):
6+
file_path: str
7+
line_number: int
8+
comment: str
9+
10+
class ReviewCommentResponse(SQLModelBase):
11+
id: int
12+
review_id: int
13+
file_path: str
14+
line_number: int
15+
comment: str
16+
created_at: datetime
17+
18+
class Config:
19+
orm_mode = True

‎backend/app/user/__init__.py

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# app/user/__init__.py
2+
from .model import User
3+
from .schema import UserCreate, UserResponse
4+
from .route import router as user_router

‎backend/app/user/model.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from sqlmodel import SQLModel, Field, Relationship
2+
from typing import Optional, List
3+
from datetime import datetime
4+
5+
class User(SQLModel, table=True):
6+
id: Optional[int] = Field(default=None, primary_key=True, index=True)
7+
email: str = Field(unique=True, index=True)
8+
username: str = Field(unique=True)
9+
github_access_token: Optional[str] = Field(default=None)
10+
github_refresh_token: Optional[str] = Field(default=None)
11+
gitlab_access_token: Optional[str] = Field(default=None)
12+
gitlab_refresh_token: Optional[str] = Field(default=None)
13+
created_at: datetime = Field(default_factory=datetime.utcnow)
14+
15+
repositories: List["Repository"] = Relationship(back_populates="owner")
16+
reviews: List["Review"] = Relationship(back_populates="reviewer")

‎backend/app/user/route.py

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from fastapi import APIRouter, Depends
2+
from sqlmodel import Session, select
3+
from ..dependencies import get_session
4+
from .model import User
5+
from .schema import UserCreate, UserResponse
6+
7+
router = APIRouter()
8+
9+
@router.post("/", response_model=UserResponse)
10+
def create_user(user: UserCreate, session: Session = Depends(get_session)):
11+
db_user = User.from_orm(user)
12+
session.add(db_user)
13+
session.commit()
14+
session.refresh(db_user)
15+
return db_user

‎backend/app/user/schema.py

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from pydantic import EmailStr
2+
from typing import Optional
3+
from datetime import datetime
4+
from sqlmodel import SQLModel as SQLModelBase
5+
6+
class UserCreate(SQLModelBase):
7+
email: EmailStr
8+
username: str
9+
10+
class UserResponse(SQLModelBase):
11+
id: int
12+
email: EmailStr
13+
username: str
14+
created_at: datetime
15+
16+
class Config:
17+
orm_mode = True

‎backend/pyproject.toml

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ dependencies = [
1111
"pygithub>=2.6.1",
1212
"python-dotenv>=1.0.1",
1313
"python-gitlab>=5.6.0",
14+
"sqlmodel>=0.0.23",
1415
"tiktoken>=0.9.0",
1516
"uvicorn>=0.34.0",
1617
]

‎backend/uv.lock

+60
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
Please sign in to comment.