andevs commited on
Commit
07d23d0
·
verified ·
1 Parent(s): b5672ec

Create streak_routes.py

Browse files
Files changed (1) hide show
  1. api/streak_routes.py +186 -0
api/streak_routes.py ADDED
@@ -0,0 +1,186 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import APIRouter, HTTPException, Depends
2
+ from datetime import datetime, timedelta
3
+ from app import verify_token, db_service
4
+
5
+ router = APIRouter()
6
+
7
+ @router.post("/check-in")
8
+ async def check_in(
9
+ user_id: str = Depends(verify_token)
10
+ ):
11
+ """
12
+ User check-in for streak
13
+ """
14
+ try:
15
+ today = datetime.utcnow().date()
16
+
17
+ # Get current streak
18
+ streak = db_service.get_streak(user_id)
19
+
20
+ if not streak:
21
+ # First check-in
22
+ streak_data = {
23
+ "current_streak": 1,
24
+ "longest_streak": 1,
25
+ "total_days": 1,
26
+ "last_check_in": today.isoformat(),
27
+ "badges": []
28
+ }
29
+ db_service.update_streak(user_id, streak_data)
30
+ return {
31
+ "streak": 1,
32
+ "rewards": [],
33
+ "message": "First check-in! Welcome to your streak journey!"
34
+ }
35
+
36
+ last_check = datetime.fromisoformat(streak["last_check_in"]).date()
37
+
38
+ # Check if already checked in today
39
+ if last_check == today:
40
+ return {
41
+ "streak": streak["current_streak"],
42
+ "rewards": [],
43
+ "message": "Already checked in today!"
44
+ }
45
+
46
+ # Check if streak is consecutive
47
+ if (today - last_check).days == 1:
48
+ # Consecutive day
49
+ new_streak = streak["current_streak"] + 1
50
+ else:
51
+ # Streak broken
52
+ new_streak = 1
53
+
54
+ # Update streak
55
+ streak_data = {
56
+ "current_streak": new_streak,
57
+ "longest_streak": max(new_streak, streak["longest_streak"]),
58
+ "total_days": streak["total_days"] + 1,
59
+ "last_check_in": today.isoformat(),
60
+ "badges": streak.get("badges", [])
61
+ }
62
+
63
+ # Check for rewards
64
+ rewards = []
65
+ if new_streak == 7:
66
+ rewards.append({
67
+ "type": "badge",
68
+ "name": "7-Day Dedication",
69
+ "icon": "🌟"
70
+ })
71
+ streak_data["badges"].append({
72
+ "id": "7-day",
73
+ "earned_at": datetime.utcnow().isoformat()
74
+ })
75
+
76
+ elif new_streak == 30:
77
+ rewards.append({
78
+ "type": "discount",
79
+ "value": "15%",
80
+ "code": f"STREAK30_{user_id[:6]}",
81
+ "message": "15% off your next purchase!"
82
+ })
83
+
84
+ elif new_streak == 50:
85
+ rewards.append({
86
+ "type": "raffle",
87
+ "chance": "5%",
88
+ "message": "You've been entered into our monthly raffle!"
89
+ })
90
+
91
+ elif new_streak == 100:
92
+ rewards.append({
93
+ "type": "badge",
94
+ "name": "Skincare Master",
95
+ "icon": "👑"
96
+ })
97
+ streak_data["badges"].append({
98
+ "id": "100-day",
99
+ "earned_at": datetime.utcnow().isoformat()
100
+ })
101
+
102
+ db_service.update_streak(user_id, streak_data)
103
+
104
+ messages = {
105
+ 1: "Great start! Day 1 of your streak!",
106
+ 7: "You've earned your first badge! Keep it up!",
107
+ 30: "One month streak! You're on fire!",
108
+ 50: "50 days! You're a skincare pro!",
109
+ 100: "100 DAYS! You're a legend! 🏆"
110
+ }
111
+
112
+ message = messages.get(new_streak, f"{new_streak} day streak!")
113
+
114
+ return {
115
+ "streak": new_streak,
116
+ "rewards": rewards,
117
+ "message": message
118
+ }
119
+
120
+ except Exception as e:
121
+ raise HTTPException(status_code=500, detail=str(e))
122
+
123
+ @router.get("/current")
124
+ async def get_streak(
125
+ user_id: str = Depends(verify_token)
126
+ ):
127
+ """
128
+ Get user's current streak
129
+ """
130
+ try:
131
+ streak = db_service.get_streak(user_id)
132
+ if not streak:
133
+ return {
134
+ "current_streak": 0,
135
+ "longest_streak": 0,
136
+ "total_days": 0,
137
+ "badges": []
138
+ }
139
+ return streak
140
+ except Exception as e:
141
+ raise HTTPException(status_code=500, detail=str(e))
142
+
143
+ @router.get("/leaderboard")
144
+ async def get_leaderboard(
145
+ timeframe: str = "weekly",
146
+ user_id: str = Depends(verify_token)
147
+ ):
148
+ """
149
+ Get leaderboard rankings
150
+ """
151
+ try:
152
+ leaderboard = db_service.get_leaderboard(timeframe)
153
+ return {"leaderboard": leaderboard}
154
+ except Exception as e:
155
+ raise HTTPException(status_code=500, detail=str(e))
156
+
157
+ @router.get("/badges")
158
+ async def get_badges(
159
+ user_id: str = Depends(verify_token)
160
+ ):
161
+ """
162
+ Get user's earned badges
163
+ """
164
+ try:
165
+ badges = db_service.get_user_badges(user_id)
166
+ return {"badges": badges}
167
+ except Exception as e:
168
+ raise HTTPException(status_code=500, detail=str(e))
169
+
170
+ @router.post("/share")
171
+ async def share_streak(
172
+ user_id: str = Depends(verify_token)
173
+ ):
174
+ """
175
+ Share streak achievement
176
+ """
177
+ try:
178
+ streak = db_service.get_streak(user_id)
179
+ share_data = {
180
+ "streak": streak["current_streak"],
181
+ "message": f"I've maintained a {streak['current_streak']} day skincare streak on Glow AI! 🔥",
182
+ "share_url": f"https://glowai.app/share/streak/{user_id}"
183
+ }
184
+ return share_data
185
+ except Exception as e:
186
+ raise HTTPException(status_code=500, detail=str(e))