Skip to content

Commit 8bd3786

Browse files
committed
feat: User Authentication using Oauth
1 parent 4024c45 commit 8bd3786

17 files changed

Lines changed: 348 additions & 0 deletions

.env.example

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
DATABASE_URL=
2+
GOOGLE_CLIENT_ID=
3+
ENV=

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
venv/
2+
*.db
3+
.env
4+
__pycache__/

app/__init__.py

Whitespace-only changes.

app/crud.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from sqlalchemy.orm import Session
2+
from app import models
3+
from app.enums import Grade
4+
from app.utils.hashing import hash_password, verify_password
5+
6+
def get_user(db: Session, google_id: str):
7+
return db.query(models.User).filter(models.User.google_id == google_id).first()
8+
9+
def get_user_by_id(db: Session, user_id: int):
10+
return db.query(models.User).filter(models.User.id == user_id).first()
11+
12+
def authenticate_user(db: Session, username: str, password: str):
13+
user = db.query(models.User).filter(models.User.username == username).first()
14+
if not user:
15+
return None
16+
if not verify_password(password, user.password):
17+
return None
18+
return user
19+
20+
def create_google_user(
21+
db: Session,
22+
google_id: str,
23+
email: str,
24+
name: str,
25+
username: str,
26+
password: str,
27+
grade: Grade,
28+
institute: str,
29+
city: str,
30+
marketing: str):
31+
user = models.User(
32+
google_id=google_id,
33+
email=email,
34+
name=name,
35+
username=username,
36+
password=hash_password(password),
37+
grade=grade,
38+
institute=institute,
39+
city=city,
40+
marketing=marketing,
41+
)
42+
db.add(user)
43+
db.commit()
44+
db.refresh(user)
45+
return user
46+

app/database.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from sqlalchemy import create_engine
2+
from sqlalchemy.orm import sessionmaker, declarative_base
3+
from dotenv import load_dotenv
4+
import os
5+
6+
load_dotenv()
7+
DATABASE_URL = os.getenv("DATABASE_URL")
8+
if not DATABASE_URL:
9+
raise RuntimeError("DATABASE_URL environment variable is not set")
10+
engine = create_engine(DATABASE_URL,connect_args={"check_same_thread": False})
11+
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
12+
Base = declarative_base()

app/dependencies.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from .database import SessionLocal
2+
3+
def get_db():
4+
db = SessionLocal()
5+
try:
6+
yield db
7+
finally:
8+
db.close()

app/enums.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from enum import Enum
2+
3+
class Grade(str, Enum):
4+
grade_11 = "11"
5+
grade_12 = "12"
6+
repeater = "Repeater"

app/main.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from fastapi import FastAPI
2+
from app.database import Base, engine
3+
from app.routers import auth
4+
from fastapi.middleware.cors import CORSMiddleware
5+
6+
app = FastAPI()
7+
app.add_middleware(
8+
CORSMiddleware,
9+
allow_origins=["http://localhost:3000"],
10+
allow_credentials=True,
11+
allow_methods=["*"],
12+
allow_headers=["*"],
13+
)
14+
Base.metadata.create_all(bind=engine)
15+
16+
app.include_router(auth.router)
17+
18+
@app.get("/")
19+
def root():
20+
return {"status": "running"}

app/models.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from datetime import datetime, timezone
2+
from sqlalchemy import Column, DateTime, Enum, ForeignKey, Integer, String
3+
from .database import Base
4+
from .enums import Grade
5+
6+
7+
class User(Base):
8+
__tablename__ = "users"
9+
10+
id = Column(Integer, primary_key=True, index=True)
11+
google_id = Column(String, unique=True, index=True, nullable=True)
12+
username = Column(String, unique=True, index=True, nullable=False)
13+
password = Column(String, nullable=False)
14+
email = Column(String, unique=True, index=True)
15+
name = Column(String, nullable=False)
16+
grade = Column(Enum(Grade), nullable=False)
17+
institute = Column(String, nullable=False)
18+
city = Column(String, nullable=False)
19+
marketing = Column(String, nullable=False)
20+
21+
class Session(Base):
22+
__tablename__ = "sessions"
23+
24+
id = Column(String, primary_key=True, index=True)
25+
user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False)
26+
expires_at = Column(DateTime, nullable=False)
27+
created_at = Column(DateTime, default=datetime.now(timezone.utc))

app/routers/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)