Spaces:
Sleeping
Sleeping
Shri
commited on
Commit
·
c0f9c82
1
Parent(s):
7b50b04
home base api completed
Browse files- src/core/models.py +1 -1
- src/core/temp_feed_db.py +144 -0
- src/feed/models.py +3 -3
- src/home/router.py +39 -0
- src/home/schemas.py +27 -0
- src/home/service.py +85 -2
- src/main.py +7 -2
src/core/models.py
CHANGED
|
@@ -23,7 +23,7 @@ class Users(SQLModel, table=True):
|
|
| 23 |
dob: Optional[date] = None
|
| 24 |
address: Optional[str] = None
|
| 25 |
profile_picture: Optional[str] = None
|
| 26 |
-
created_at: datetime = Field(
|
| 27 |
asset: List["Assets"] = Relationship(back_populates="user")
|
| 28 |
|
| 29 |
|
|
|
|
| 23 |
dob: Optional[date] = None
|
| 24 |
address: Optional[str] = None
|
| 25 |
profile_picture: Optional[str] = None
|
| 26 |
+
created_at: datetime = Field(default_factory=datetime.now)
|
| 27 |
asset: List["Assets"] = Relationship(back_populates="user")
|
| 28 |
|
| 29 |
|
src/core/temp_feed_db.py
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from datetime import date
|
| 2 |
+
|
| 3 |
+
from sqlmodel import Session
|
| 4 |
+
|
| 5 |
+
from src.core.database import engine
|
| 6 |
+
from src.core.models import Assets, EmotionLogs, Roles, Teams, Users, UserTeamsRole
|
| 7 |
+
from src.feed.models import Comments, Likes, Posts
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
def seed_users(session: Session):
|
| 11 |
+
users = [
|
| 12 |
+
Users(
|
| 13 |
+
email_id="tilak@example.com",
|
| 14 |
+
password="hashed_pass1",
|
| 15 |
+
user_name="Tilak",
|
| 16 |
+
dob=date(2001, 5, 21),
|
| 17 |
+
address="Chennai",
|
| 18 |
+
profile_picture="tilak.png",
|
| 19 |
+
),
|
| 20 |
+
Users(
|
| 21 |
+
email_id="arun@example.com",
|
| 22 |
+
password="hashed_pass2",
|
| 23 |
+
user_name="Arun",
|
| 24 |
+
dob=date(2000, 8, 15),
|
| 25 |
+
address="Bangalore",
|
| 26 |
+
profile_picture="arun.png",
|
| 27 |
+
),
|
| 28 |
+
]
|
| 29 |
+
session.add_all(users)
|
| 30 |
+
session.commit()
|
| 31 |
+
print("Users added.")
|
| 32 |
+
return users
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
def seed_teams(session: Session):
|
| 36 |
+
teams = [
|
| 37 |
+
Teams(name="Development"),
|
| 38 |
+
Teams(name="Marketing"),
|
| 39 |
+
Teams(name="Design"),
|
| 40 |
+
]
|
| 41 |
+
session.add_all(teams)
|
| 42 |
+
session.commit()
|
| 43 |
+
print("Teams added.")
|
| 44 |
+
return teams
|
| 45 |
+
|
| 46 |
+
|
| 47 |
+
def seed_roles(session: Session):
|
| 48 |
+
roles = [
|
| 49 |
+
Roles(name="Admin"),
|
| 50 |
+
Roles(name="Member"),
|
| 51 |
+
Roles(name="Lead"),
|
| 52 |
+
]
|
| 53 |
+
session.add_all(roles)
|
| 54 |
+
session.commit()
|
| 55 |
+
print("Roles added.")
|
| 56 |
+
return roles
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
def seed_user_teams_roles(session: Session, users, teams, roles):
|
| 60 |
+
mappings = [
|
| 61 |
+
UserTeamsRole(user_id=users[0].id, team_id=teams[0].id, role_id=roles[0].id),
|
| 62 |
+
UserTeamsRole(user_id=users[1].id, team_id=teams[1].id, role_id=roles[1].id),
|
| 63 |
+
]
|
| 64 |
+
session.add_all(mappings)
|
| 65 |
+
session.commit()
|
| 66 |
+
print("User-Team-Role mappings added.")
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
def seed_assets(session: Session, users):
|
| 70 |
+
assets = [
|
| 71 |
+
Assets(user_id=users[0].id, name="MacBook Pro", type="Laptop"),
|
| 72 |
+
Assets(user_id=users[1].id, name="Dell Monitor", type="Monitor"),
|
| 73 |
+
]
|
| 74 |
+
session.add_all(assets)
|
| 75 |
+
session.commit()
|
| 76 |
+
print("Assets added.")
|
| 77 |
+
return assets
|
| 78 |
+
|
| 79 |
+
|
| 80 |
+
def seed_emotion_logs(session: Session, users):
|
| 81 |
+
logs = [
|
| 82 |
+
EmotionLogs(user_id=users[0].id, morning_emotion=8, evening_emotion=6),
|
| 83 |
+
EmotionLogs(user_id=users[1].id, morning_emotion=7, evening_emotion=8),
|
| 84 |
+
]
|
| 85 |
+
session.add_all(logs)
|
| 86 |
+
session.commit()
|
| 87 |
+
print("Emotion logs added.")
|
| 88 |
+
|
| 89 |
+
|
| 90 |
+
def seed_posts(session: Session, users):
|
| 91 |
+
posts = [
|
| 92 |
+
Posts(
|
| 93 |
+
user_id=users[0].id,
|
| 94 |
+
caption="New sprint kickoff!",
|
| 95 |
+
image="sprint.png",
|
| 96 |
+
),
|
| 97 |
+
Posts(
|
| 98 |
+
user_id=users[1].id,
|
| 99 |
+
caption="Design updates rolling out soon!",
|
| 100 |
+
image="design.png",
|
| 101 |
+
),
|
| 102 |
+
]
|
| 103 |
+
session.add_all(posts)
|
| 104 |
+
session.commit()
|
| 105 |
+
print("Posts added.")
|
| 106 |
+
return posts
|
| 107 |
+
|
| 108 |
+
|
| 109 |
+
def seed_likes(session: Session, users, posts):
|
| 110 |
+
likes = [
|
| 111 |
+
Likes(user_id=users[0].id, post_id=posts[1].id),
|
| 112 |
+
Likes(user_id=users[1].id, post_id=posts[0].id),
|
| 113 |
+
]
|
| 114 |
+
session.add_all(likes)
|
| 115 |
+
session.commit()
|
| 116 |
+
print("Likes added.")
|
| 117 |
+
|
| 118 |
+
|
| 119 |
+
def seed_comments(session: Session, users, posts):
|
| 120 |
+
comments = [
|
| 121 |
+
Comments(user_id=users[0].id, post_id=posts[1].id, comment="Looks great!"),
|
| 122 |
+
Comments(user_id=users[1].id, post_id=posts[0].id, comment="Can’t wait!"),
|
| 123 |
+
]
|
| 124 |
+
session.add_all(comments)
|
| 125 |
+
session.commit()
|
| 126 |
+
print("Comments added.")
|
| 127 |
+
|
| 128 |
+
|
| 129 |
+
def run_all_seeds():
|
| 130 |
+
with Session(engine) as session:
|
| 131 |
+
users = seed_users(session)
|
| 132 |
+
teams = seed_teams(session)
|
| 133 |
+
roles = seed_roles(session)
|
| 134 |
+
seed_user_teams_roles(session, users, teams, roles)
|
| 135 |
+
seed_assets(session, users)
|
| 136 |
+
seed_emotion_logs(session, users)
|
| 137 |
+
posts = seed_posts(session, users)
|
| 138 |
+
seed_likes(session, users, posts)
|
| 139 |
+
seed_comments(session, users, posts)
|
| 140 |
+
print("All data seeded successfully!")
|
| 141 |
+
|
| 142 |
+
|
| 143 |
+
if __name__ == "__main__":
|
| 144 |
+
run_all_seeds()
|
src/feed/models.py
CHANGED
|
@@ -27,7 +27,7 @@ class Posts(SQLModel, table=True):
|
|
| 27 |
category: PostCategory = Field(default=PostCategory.GLOBAL)
|
| 28 |
caption: Optional[str] = None
|
| 29 |
image: Optional[str] = None
|
| 30 |
-
created_at: datetime = Field(
|
| 31 |
edited_at: datetime = Field(default_factory=datetime.now)
|
| 32 |
|
| 33 |
|
|
@@ -37,7 +37,7 @@ class Comments(SQLModel, table=True):
|
|
| 37 |
post_id: uuid.UUID = Field(foreign_key="posts.id", nullable=False)
|
| 38 |
user_id: uuid.UUID = Field(foreign_key="users.id", nullable=False)
|
| 39 |
comment: str = Field(nullable=False)
|
| 40 |
-
created_at: datetime = Field(
|
| 41 |
|
| 42 |
|
| 43 |
class Likes(SQLModel, table=True):
|
|
@@ -46,4 +46,4 @@ class Likes(SQLModel, table=True):
|
|
| 46 |
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
|
| 47 |
post_id: uuid.UUID = Field(foreign_key="posts.id", nullable=False)
|
| 48 |
user_id: uuid.UUID = Field(foreign_key="users.id", nullable=False)
|
| 49 |
-
liked_at: datetime = Field(
|
|
|
|
| 27 |
category: PostCategory = Field(default=PostCategory.GLOBAL)
|
| 28 |
caption: Optional[str] = None
|
| 29 |
image: Optional[str] = None
|
| 30 |
+
created_at: datetime = Field(default_factory=datetime.now, nullable=False)
|
| 31 |
edited_at: datetime = Field(default_factory=datetime.now)
|
| 32 |
|
| 33 |
|
|
|
|
| 37 |
post_id: uuid.UUID = Field(foreign_key="posts.id", nullable=False)
|
| 38 |
user_id: uuid.UUID = Field(foreign_key="users.id", nullable=False)
|
| 39 |
comment: str = Field(nullable=False)
|
| 40 |
+
created_at: datetime = Field(default_factory=datetime.now, nullable=False)
|
| 41 |
|
| 42 |
|
| 43 |
class Likes(SQLModel, table=True):
|
|
|
|
| 46 |
id: uuid.UUID = Field(default_factory=uuid.uuid4, primary_key=True)
|
| 47 |
post_id: uuid.UUID = Field(foreign_key="posts.id", nullable=False)
|
| 48 |
user_id: uuid.UUID = Field(foreign_key="users.id", nullable=False)
|
| 49 |
+
liked_at: datetime = Field(default_factory=datetime.now, nullable=False)
|
src/home/router.py
CHANGED
|
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from fastapi import APIRouter, Depends, HTTPException
|
| 2 |
+
from sqlmodel import Session
|
| 3 |
+
|
| 4 |
+
from src.core.database import engine
|
| 5 |
+
|
| 6 |
+
from .schemas import EmotionLogCreate, EmotionLogResponse, HomeResponse
|
| 7 |
+
from .service import add_or_update_emotion, get_emotions, get_home_data
|
| 8 |
+
|
| 9 |
+
router = APIRouter(prefix="/home", tags=["Home"])
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
def get_session():
|
| 13 |
+
with Session(engine) as session:
|
| 14 |
+
yield session
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
@router.get("/{user_id}", response_model=HomeResponse)
|
| 18 |
+
def fetch_home_data(user_id: str, session: Session = Depends(get_session)):
|
| 19 |
+
try:
|
| 20 |
+
return get_home_data(user_id, session)
|
| 21 |
+
except ValueError as e:
|
| 22 |
+
raise HTTPException(status_code=404, detail=str(e))
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
@router.post("/emotion", response_model=EmotionLogResponse)
|
| 26 |
+
def create_or_update_emotion(
|
| 27 |
+
data: EmotionLogCreate, session: Session = Depends(get_session)
|
| 28 |
+
):
|
| 29 |
+
record = add_or_update_emotion(data, session)
|
| 30 |
+
return EmotionLogResponse(
|
| 31 |
+
log_date=record.log_date,
|
| 32 |
+
morning_emotion=record.morning_emotion,
|
| 33 |
+
evening_emotion=record.evening_emotion,
|
| 34 |
+
)
|
| 35 |
+
|
| 36 |
+
|
| 37 |
+
@router.get("/emotion/{user_id}", response_model=list[EmotionLogResponse])
|
| 38 |
+
def get_user_emotions(user_id: str, session: Session = Depends(get_session)):
|
| 39 |
+
return get_emotions(user_id, session)
|
src/home/schemas.py
CHANGED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# pylint: disable=no-name-in-module
|
| 2 |
+
# pylint: disable=no-self-argument
|
| 3 |
+
|
| 4 |
+
from datetime import date
|
| 5 |
+
from typing import List, Optional
|
| 6 |
+
|
| 7 |
+
from pydantic import BaseModel
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
class EmotionLogCreate(BaseModel):
|
| 11 |
+
user_id: str
|
| 12 |
+
morning_emotion: Optional[int] = None
|
| 13 |
+
evening_emotion: Optional[int] = None
|
| 14 |
+
log_date: date
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
class EmotionLogResponse(BaseModel):
|
| 18 |
+
log_date: date
|
| 19 |
+
morning_emotion: Optional[int]
|
| 20 |
+
eveing_emotion: Optional[int]
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
class HomeResponse(BaseModel):
|
| 24 |
+
user_id: str
|
| 25 |
+
user_name: str
|
| 26 |
+
philosophy_text: str
|
| 27 |
+
recent_emotions: List[EmotionLogResponse]
|
src/home/service.py
CHANGED
|
@@ -1,2 +1,85 @@
|
|
| 1 |
-
from
|
| 2 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from datetime import date, timedelta
|
| 2 |
+
|
| 3 |
+
from sqlmodel import Session, select
|
| 4 |
+
|
| 5 |
+
from src.core.models import EmotionLogs, Users
|
| 6 |
+
|
| 7 |
+
from .schemas import EmotionLogCreate, EmotionLogResponse, HomeResponse
|
| 8 |
+
|
| 9 |
+
PHILOSOPHY_TEXT = "Your mind is your greatest asset — train it daily."
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
def get_home_data(user_id: str, session: Session) -> HomeResponse:
|
| 13 |
+
# Fetch user info
|
| 14 |
+
user = session.exec(select(Users).where(Users.id == user_id)).first()
|
| 15 |
+
if not user:
|
| 16 |
+
raise ValueError("User not found")
|
| 17 |
+
|
| 18 |
+
# Fetch last 7 days of emotion logs
|
| 19 |
+
seven_days_ago = date.today() - timedelta(days=7)
|
| 20 |
+
emotion_logs = session.exec(
|
| 21 |
+
select(EmotionLogs)
|
| 22 |
+
.where(EmotionLogs.user_id == user_id)
|
| 23 |
+
.where(EmotionLogs.log_date >= seven_days_ago)
|
| 24 |
+
.order_by(EmotionLogs.log_date)
|
| 25 |
+
).all()
|
| 26 |
+
|
| 27 |
+
emotion_responses = [
|
| 28 |
+
EmotionLogResponse(
|
| 29 |
+
log_date=log.log_date,
|
| 30 |
+
morning_emotion=log.morning_emotion,
|
| 31 |
+
evening_emotion=log.evening_emotion,
|
| 32 |
+
)
|
| 33 |
+
for log in emotion_logs
|
| 34 |
+
]
|
| 35 |
+
|
| 36 |
+
return HomeResponse(
|
| 37 |
+
user_id=str(user.id),
|
| 38 |
+
user_name=user.user_name,
|
| 39 |
+
philosophy_text=PHILOSOPHY_TEXT,
|
| 40 |
+
recent_emotions=emotion_responses,
|
| 41 |
+
)
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
def add_or_update_emotion(data: EmotionLogCreate, session: Session):
|
| 45 |
+
existing_log = session.exec(
|
| 46 |
+
select(EmotionLogs)
|
| 47 |
+
.where(EmotionLogs.user_id == data.user_id)
|
| 48 |
+
.where(EmotionLogs.log_date == data.log_date)
|
| 49 |
+
).first()
|
| 50 |
+
|
| 51 |
+
if existing_log:
|
| 52 |
+
# Update existing record
|
| 53 |
+
if data.morning_emotion is not None:
|
| 54 |
+
existing_log.morning_emotion = data.morning_emotion
|
| 55 |
+
if data.evening_emotion is not None:
|
| 56 |
+
existing_log.evening_emotion = data.evening_emotion
|
| 57 |
+
else:
|
| 58 |
+
new_log = EmotionLogs(
|
| 59 |
+
user_id=data.user_id,
|
| 60 |
+
morning_emotion=data.morning_emotion,
|
| 61 |
+
evening_emotion=data.evening_emotion,
|
| 62 |
+
log_date=data.log_date,
|
| 63 |
+
)
|
| 64 |
+
session.add(new_log)
|
| 65 |
+
|
| 66 |
+
session.commit()
|
| 67 |
+
session.refresh(existing_log or new_log)
|
| 68 |
+
return existing_log or new_log
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
def get_emotions(user_id: str, session: Session):
|
| 72 |
+
logs = session.exec(
|
| 73 |
+
select(EmotionLogs)
|
| 74 |
+
.where(EmotionLogs.user_id == user_id)
|
| 75 |
+
.order_by(EmotionLogs.log_date.desc())
|
| 76 |
+
).all()
|
| 77 |
+
|
| 78 |
+
return [
|
| 79 |
+
EmotionLogResponse(
|
| 80 |
+
log_date=log.log_date,
|
| 81 |
+
morning_emotion=log.morning_emotion,
|
| 82 |
+
evening_emotion=log.evening_emotion,
|
| 83 |
+
)
|
| 84 |
+
for log in logs
|
| 85 |
+
]
|
src/main.py
CHANGED
|
@@ -1,7 +1,12 @@
|
|
| 1 |
from fastapi import FastAPI
|
| 2 |
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
|
| 5 |
@app.get("/")
|
| 6 |
def root():
|
| 7 |
-
return {"message": "
|
|
|
|
| 1 |
from fastapi import FastAPI
|
| 2 |
|
| 3 |
+
from src.home.router import router as home_router
|
| 4 |
+
|
| 5 |
+
app = FastAPI(title="Yuvabe App API")
|
| 6 |
+
|
| 7 |
+
app.include_router(home_router, prefix="/home", tags=["Home"])
|
| 8 |
+
|
| 9 |
|
| 10 |
@app.get("/")
|
| 11 |
def root():
|
| 12 |
+
return {"message": "API is running fine!"}
|