rairo commited on
Commit
acc58ac
·
verified ·
1 Parent(s): 02784e4

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +123 -1
main.py CHANGED
@@ -67,11 +67,133 @@ def is_valid_email(email):
67
  regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
68
  return re.match(regex, email) is not None
69
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
 
71
  # -----------------------------------------------------------------------------
72
  # 3. AUTHENTICATION & USER MANAGEMENT
73
  # -----------------------------------------------------------------------------
74
- # (Your other authentication endpoints would go here)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
 
76
 
77
  # -----------------------------------------------------------------------------
 
67
  regex = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
68
  return re.match(regex, email) is not None
69
 
70
+ # Helper functions
71
+ def verify_token(token):
72
+ try:
73
+ decoded_token = auth.verify_id_token(token)
74
+ return decoded_token['uid']
75
+ except Exception as e:
76
+ return None
77
+
78
+ def verify_admin(auth_header):
79
+ if not auth_header or not auth_header.startswith('Bearer '):
80
+ raise ValueError('Invalid token')
81
+ token = auth_header.split(' ')[1]
82
+ uid = verify_token(token)
83
+ if not uid:
84
+ raise PermissionError('Invalid user')
85
+ user_ref = db.reference(f'users/{uid}')
86
+ user_data = user_ref.get()
87
+ if not user_data or not user_data.get('is_admin', False):
88
+ raise PermissionError('Admin access required')
89
+ return uid
90
 
91
  # -----------------------------------------------------------------------------
92
  # 3. AUTHENTICATION & USER MANAGEMENT
93
  # -----------------------------------------------------------------------------
94
+
95
+
96
+ # ---------- Authentication Endpoints ----------
97
+
98
+ @app.route('/api/auth/signup', methods=['POST'])
99
+ def signup():
100
+ try:
101
+ data = request.get_json()
102
+ email = data.get('email')
103
+ password = data.get('password')
104
+ if not email or not password:
105
+ return jsonify({'error': 'Email and password are required'}), 400
106
+
107
+ # Create user in Firebase Auth
108
+ user = auth.create_user(email=email, password=password)
109
+ # Set initial user data in the realtime database with 3 starting credits
110
+ user_ref = db.reference(f'users/{user.uid}')
111
+ user_data = {
112
+ 'email': email,
113
+ 'credits': 15,
114
+ 'is_admin': False,
115
+ 'created_at': datetime.utcnow().isoformat()
116
+ }
117
+ user_ref.set(user_data)
118
+ return jsonify({
119
+ 'success': True,
120
+ 'user': {
121
+ 'uid': user.uid,
122
+ **user_data
123
+ }
124
+ }), 201
125
+ except Exception as e:
126
+ return jsonify({'error': str(e)}), 400
127
+
128
+ # ---------- User Profile ----------
129
+
130
+ @app.route('/api/user/profile', methods=['GET'])
131
+ def get_user_profile():
132
+ try:
133
+ auth_header = request.headers.get('Authorization', '')
134
+ print("Received Auth Header (user):", auth_header) # Debugging
135
+
136
+ if not auth_header.startswith('Bearer '):
137
+ return jsonify({'error': 'Missing or invalid token'}), 401
138
+
139
+ token = auth_header.split(' ')[1]
140
+ uid = verify_token(token)
141
+ if not uid:
142
+ return jsonify({'error': 'Invalid or expired token'}), 401
143
+
144
+ user_data = db.reference(f'users/{uid}').get()
145
+ print("Fetched User Data (user):", user_data) # Debugging
146
+
147
+ if not user_data:
148
+ return jsonify({'error': 'User not found'}), 404
149
+
150
+ return jsonify({
151
+ 'uid': uid,
152
+ 'email': user_data.get('email'),
153
+ 'credits': user_data.get('credits', 0),
154
+ 'is_admin': user_data.get('is_admin', False)
155
+ })
156
+ except Exception as e:
157
+ print(f"Error fetching user profile: {str(e)}")
158
+ return jsonify({'error': str(e)}), 500
159
+
160
+
161
+ @app.route('/api/auth/google-signin', methods=['POST'])
162
+ def google_signin():
163
+ try:
164
+ auth_header = request.headers.get('Authorization', '')
165
+ if not auth_header.startswith('Bearer '):
166
+ return jsonify({'error': 'Missing or invalid token'}), 401
167
+
168
+ token = auth_header.split(' ')[1]
169
+ decoded_token = auth.verify_id_token(token) # Verify the token
170
+ uid = decoded_token['uid']
171
+ email = decoded_token.get('email')
172
+
173
+ # Check if user already exists in database
174
+ user_ref = db.reference(f'users/{uid}')
175
+ user_data = user_ref.get()
176
+
177
+ if not user_data:
178
+ # New user, create an entry in the database
179
+ user_data = {
180
+ 'email': email,
181
+ 'credits': 15, # Give new users initial credits
182
+ 'is_admin': False,
183
+ 'created_at': datetime.utcnow().isoformat(),
184
+ }
185
+ user_ref.set(user_data)
186
+
187
+ return jsonify({
188
+ 'success': True,
189
+ 'user': {
190
+ 'uid': uid,
191
+ **user_data
192
+ }
193
+ }), 200
194
+
195
+ except Exception as e:
196
+ return jsonify({'error': str(e)}), 400
197
 
198
 
199
  # -----------------------------------------------------------------------------