Shri commited on
Commit
c0f9c82
·
1 Parent(s): 7b50b04

home base api completed

Browse files
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(default=datetime.now)
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(default=datetime.now, nullable=False)
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(default=datetime.now, nullable=False)
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(default=datetime.now, nullable=False)
 
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 typing import List
2
- from uuid import UUID
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- app = FastAPI()
 
 
 
 
 
4
 
5
  @app.get("/")
6
  def root():
7
- return {"message": "Hello, FastAPI!"}
 
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!"}