Niansuh commited on
Commit
8bc9e59
·
verified ·
1 Parent(s): 1076434

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +46 -4
main.py CHANGED
@@ -1,12 +1,14 @@
1
  import os
2
  import secrets
3
  import requests
4
- from fastapi import FastAPI, Depends, HTTPException, Header
5
  from sqlalchemy import create_engine, Column, Integer, String, Boolean, DateTime, func
6
  from sqlalchemy.ext.declarative import declarative_base
7
  from sqlalchemy.orm import sessionmaker, Session
8
  from pydantic import BaseModel
9
  from dotenv import load_dotenv
 
 
10
 
11
  # Load environment variables from .env file
12
  load_dotenv()
@@ -27,7 +29,7 @@ engine = create_engine(DATABASE_URL)
27
  SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
28
  Base = declarative_base()
29
 
30
- # User model
31
  class User(Base):
32
  __tablename__ = "users"
33
  id = Column(Integer, primary_key=True, index=True)
@@ -35,12 +37,17 @@ class User(Base):
35
  hashed_password = Column(String(128), nullable=False)
36
  api_key = Column(String(64), unique=True, index=True, nullable=False)
37
  is_admin = Column(Boolean, default=False)
 
38
  created_at = Column(DateTime(timezone=True), server_default=func.now())
39
 
40
  # Create tables
41
  Base.metadata.create_all(bind=engine)
42
 
43
- app = FastAPI(title="API Key Generator & Proxy Service")
 
 
 
 
44
 
45
  # Dependency: Database session
46
  def get_db():
@@ -64,6 +71,7 @@ class UserOut(BaseModel):
64
  username: str
65
  api_key: str
66
  is_admin: bool
 
67
 
68
  class Config:
69
  orm_mode = True
@@ -103,7 +111,7 @@ def list_users(current_user: User = Depends(get_current_user), db: Session = Dep
103
  users = db.query(User).all()
104
  return users
105
 
106
- # 4. Endpoint to access the main API (proxying request using main API key)
107
  class RequestPayload(BaseModel):
108
  prompt: str
109
 
@@ -121,3 +129,37 @@ def generate_image(payload: RequestPayload, current_user: User = Depends(get_cur
121
  if response.status_code != 200:
122
  raise HTTPException(status_code=response.status_code, detail="Error from main API")
123
  return response.json()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  import os
2
  import secrets
3
  import requests
4
+ from fastapi import FastAPI, Depends, HTTPException, Header, Request
5
  from sqlalchemy import create_engine, Column, Integer, String, Boolean, DateTime, func
6
  from sqlalchemy.ext.declarative import declarative_base
7
  from sqlalchemy.orm import sessionmaker, Session
8
  from pydantic import BaseModel
9
  from dotenv import load_dotenv
10
+ from fastapi.templating import Jinja2Templates
11
+ from fastapi.staticfiles import StaticFiles
12
 
13
  # Load environment variables from .env file
14
  load_dotenv()
 
29
  SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
30
  Base = declarative_base()
31
 
32
+ # Updated User model with credits field
33
  class User(Base):
34
  __tablename__ = "users"
35
  id = Column(Integer, primary_key=True, index=True)
 
37
  hashed_password = Column(String(128), nullable=False)
38
  api_key = Column(String(64), unique=True, index=True, nullable=False)
39
  is_admin = Column(Boolean, default=False)
40
+ credits = Column(Integer, default=0)
41
  created_at = Column(DateTime(timezone=True), server_default=func.now())
42
 
43
  # Create tables
44
  Base.metadata.create_all(bind=engine)
45
 
46
+ app = FastAPI(title="API Key Platform")
47
+
48
+ # Mount static files and templates
49
+ app.mount("/static", StaticFiles(directory="static"), name="static")
50
+ templates = Jinja2Templates(directory="templates")
51
 
52
  # Dependency: Database session
53
  def get_db():
 
71
  username: str
72
  api_key: str
73
  is_admin: bool
74
+ credits: int
75
 
76
  class Config:
77
  orm_mode = True
 
111
  users = db.query(User).all()
112
  return users
113
 
114
+ # 4. Proxy Endpoint to access the main API
115
  class RequestPayload(BaseModel):
116
  prompt: str
117
 
 
129
  if response.status_code != 200:
130
  raise HTTPException(status_code=response.status_code, detail="Error from main API")
131
  return response.json()
132
+
133
+ # 5. New endpoint for users to test their API key
134
+ @app.get("/user/test_api")
135
+ def test_api(current_user: User = Depends(get_current_user)):
136
+ return {"message": "API is working", "username": current_user.username, "credits": current_user.credits}
137
+
138
+ # 6. New endpoint for admin to add credits to a user account
139
+ class CreditPayload(BaseModel):
140
+ username: str
141
+ credits: int
142
+
143
+ @app.post("/admin/add_credit")
144
+ def add_credit(payload: CreditPayload, current_user: User = Depends(get_current_user), db: Session = Depends(get_db)):
145
+ if not current_user.is_admin:
146
+ raise HTTPException(status_code=403, detail="Not authorized")
147
+ user = db.query(User).filter(User.username == payload.username).first()
148
+ if not user:
149
+ raise HTTPException(status_code=404, detail="User not found")
150
+ user.credits += payload.credits
151
+ db.commit()
152
+ db.refresh(user)
153
+ return {"message": f"Added {payload.credits} credits to user {user.username}. Total credits: {user.credits}"}
154
+
155
+ # 7. Render Admin Panel UI
156
+ @app.get("/admin/ui")
157
+ def admin_ui(request: Request, current_user: User = Depends(get_current_user)):
158
+ if not current_user.is_admin:
159
+ raise HTTPException(status_code=403, detail="Not authorized")
160
+ return templates.TemplateResponse("admin.html", {"request": request})
161
+
162
+ # 8. Render User Panel UI
163
+ @app.get("/user/ui")
164
+ def user_ui(request: Request, current_user: User = Depends(get_current_user)):
165
+ return templates.TemplateResponse("user.html", {"request": request})