diff --git a/alembic/versions/bca1465a100f_remove_is_active_from_subscription.py b/alembic/versions/bca1465a100f_remove_is_active_from_subscription.py new file mode 100644 index 00000000..ac87becb --- /dev/null +++ b/alembic/versions/bca1465a100f_remove_is_active_from_subscription.py @@ -0,0 +1,32 @@ +"""Remove is_active from subscription + +Revision ID: bca1465a100f +Revises: cccea6c7d70d +Create Date: 2024-01-21 12:18:59.279663 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'bca1465a100f' +down_revision: Union[str, None] = 'cccea6c7d70d' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + # op.create_unique_constraint('unique_user_role', 'user_roles', ['user_id', 'role_id', 'company_id']) + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + # op.drop_constraint('unique_user_role', 'user_roles', type_='unique') + pass + # ### end Alembic commands ### diff --git a/private_gpt/launcher.py b/private_gpt/launcher.py index e84216d0..5ae70e2c 100644 --- a/private_gpt/launcher.py +++ b/private_gpt/launcher.py @@ -26,12 +26,12 @@ def create_app(root_injector: Injector) -> FastAPI: app = FastAPI(dependencies=[Depends(bind_injector_to_request)]) - app.include_router(completions_router) - app.include_router(chat_router) - app.include_router(chunks_router) - app.include_router(ingest_router) - app.include_router(embeddings_router) - app.include_router(health_router) + # app.include_router(completions_router) + # app.include_router(chat_router) + # app.include_router(chunks_router) + # app.include_router(ingest_router) + # app.include_router(embeddings_router) + # app.include_router(health_router) app.include_router(api_router) diff --git a/private_gpt/users/api/deps.py b/private_gpt/users/api/deps.py index 0e255164..890082fe 100644 --- a/private_gpt/users/api/deps.py +++ b/private_gpt/users/api/deps.py @@ -124,3 +124,21 @@ async def get_company_name(company_id: int, db: Session = Depends(get_db)) -> st if not company: raise HTTPException(status_code=404, detail="Company not found") return company.name + + +def get_active_subscription( + current_user: models.User = Depends(get_current_user), + db: Session = Depends(get_db), +): + company_id = current_user.user_role.company_id + if company_id: + company = crud.company.get(db, company_id) + if company and company.subscriptions: + active_subscription = next((sub for sub in company.subscriptions if sub.is_active), None) + if active_subscription: + return company + + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="Access Forbidden - No Active Subscription", + ) \ No newline at end of file diff --git a/private_gpt/users/api/v1/routers/auth.py b/private_gpt/users/api/v1/routers/auth.py index ac68de07..7d48eecb 100644 --- a/private_gpt/users/api/v1/routers/auth.py +++ b/private_gpt/users/api/v1/routers/auth.py @@ -204,4 +204,5 @@ def register_without_company_assignment( "access_token": security.create_access_token(token_payload, expires_delta=timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)), "refresh_token": security.create_refresh_token(token_payload, expires_delta=timedelta(minutes=settings.REFRESH_TOKEN_EXPIRE_MINUTES)), "token_type": "bearer", - } \ No newline at end of file + } + diff --git a/private_gpt/users/api/v1/routers/subscriptions.py b/private_gpt/users/api/v1/routers/subscriptions.py index def2bf86..31b1e009 100644 --- a/private_gpt/users/api/v1/routers/subscriptions.py +++ b/private_gpt/users/api/v1/routers/subscriptions.py @@ -89,7 +89,7 @@ def read_subscriptions_by_company( status_code=status.HTTP_200_OK, content={ "message": "Subscriptions retrieved successfully", - "subscriptions": subscriptions_list + "subscriptions": jsonable_encoder(subscriptions) }, ) diff --git a/private_gpt/users/api/v1/routers/users.py b/private_gpt/users/api/v1/routers/users.py index 0cb99631..3e129920 100644 --- a/private_gpt/users/api/v1/routers/users.py +++ b/private_gpt/users/api/v1/routers/users.py @@ -204,3 +204,14 @@ def update_user( content={"message": "User updated successfully", "user": jsonable_encoder(user_data)}, ) + +@router.get("/") +def home_page( + *, + db: Session = Depends(deps.get_db), + current_user: models.User = Security( + deps.get_active_subscription, + ), +): + + return JSONResponse(status_code=status.HTTP_200_OK, content={"message": "Welcome to QuickGPT"}) \ No newline at end of file diff --git a/private_gpt/users/models/subscription.py b/private_gpt/users/models/subscription.py index 44642a68..bdb9bdec 100644 --- a/private_gpt/users/models/subscription.py +++ b/private_gpt/users/models/subscription.py @@ -13,7 +13,6 @@ class Subscription(Base): company_id = Column(Integer, ForeignKey("companies.id")) start_date = Column(DateTime, default=datetime.utcnow()) end_date = Column(DateTime, default=datetime.utcnow() + timedelta(days=30)) # Example: 30 days subscription period - is_active = Column(Boolean, default=False) company = relationship("Company", back_populates="subscriptions") diff --git a/private_gpt/users/schemas/subscription.py b/private_gpt/users/schemas/subscription.py index 6a403ef6..b746f08c 100644 --- a/private_gpt/users/schemas/subscription.py +++ b/private_gpt/users/schemas/subscription.py @@ -7,7 +7,6 @@ from private_gpt.users.schemas.company import Company class SubscriptionBase(BaseModel): start_date: datetime end_date: datetime - is_active: bool class SubscriptionCreate(SubscriptionBase): company_id: int