mirror of
https://github.com/QuivrHQ/quivr.git
synced 2024-12-14 17:03:29 +03:00
feat: add onboarding table (#1327)
* feat: add onboarding table * feat: add Onboarding repository * feat: add onboarding controller
This commit is contained in:
parent
f030db6952
commit
fbdc07af2c
@ -255,3 +255,11 @@ class Repository(ABC):
|
||||
@abstractmethod
|
||||
def get_all_knowledge_in_brain(self, brain_id: UUID):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_user_onboarding(self, user_id: UUID):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def update_user_onboarding(self, user_id: UUID, onboarding):
|
||||
pass
|
||||
|
@ -1,11 +1,11 @@
|
||||
from models.databases.supabase.api_key_handler import ApiKeyHandler
|
||||
from models.databases.supabase.brains import Brain
|
||||
from models.databases.supabase.brains_subscription_invitations import \
|
||||
BrainSubscription
|
||||
from models.databases.supabase.brains_subscription_invitations import BrainSubscription
|
||||
from models.databases.supabase.chats import Chats
|
||||
from models.databases.supabase.files import File
|
||||
from models.databases.supabase.knowledge import Knowledges
|
||||
from models.databases.supabase.notifications import Notifications
|
||||
from models.databases.supabase.onboarding import Onboarding
|
||||
from models.databases.supabase.prompts import Prompts
|
||||
from models.databases.supabase.user_usage import UserUsage
|
||||
from models.databases.supabase.vectors import Vector
|
||||
|
62
backend/models/databases/supabase/onboarding.py
Normal file
62
backend/models/databases/supabase/onboarding.py
Normal file
@ -0,0 +1,62 @@
|
||||
from typing import Optional
|
||||
from uuid import UUID
|
||||
|
||||
from fastapi import HTTPException
|
||||
from models.databases.repository import (
|
||||
Repository, # Assuming you have a repository class
|
||||
)
|
||||
from models.onboarding import Onboardings
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class OnboardingUpdatableProperties(BaseModel):
|
||||
"""Properties that can be received on onboarding update"""
|
||||
|
||||
onboarding_b1: Optional[bool]
|
||||
onboarding_b2: Optional[bool]
|
||||
onboarding_b3: Optional[bool]
|
||||
|
||||
|
||||
class Onboarding(Repository):
|
||||
def __init__(self, supabase_client):
|
||||
self.db = supabase_client
|
||||
|
||||
def get_user_onboarding(self, user_id: UUID) -> Onboardings:
|
||||
"""
|
||||
Get user onboarding information by user_id
|
||||
"""
|
||||
onboarding_data = (
|
||||
self.db.from_("onboarding")
|
||||
.select("user_id", "onboarding_b1", "onboarding_b2", "onboarding_b3")
|
||||
.filter("user_id", "eq", user_id)
|
||||
.limit(1)
|
||||
.execute()
|
||||
).data
|
||||
|
||||
if not onboarding_data:
|
||||
raise HTTPException(404, "User onboarding not found")
|
||||
|
||||
return Onboardings(**onboarding_data[0])
|
||||
|
||||
def update_user_onboarding(
|
||||
self, user_id: UUID, onboarding: OnboardingUpdatableProperties
|
||||
) -> Onboardings:
|
||||
"""Update user onboarding information by user_id"""
|
||||
response = (
|
||||
self.db.from_("onboarding")
|
||||
.upsert(
|
||||
{
|
||||
"user_id": user_id,
|
||||
"onboarding_b1": onboarding.onboarding_b1,
|
||||
"onboarding_b2": onboarding.onboarding_b2,
|
||||
"onboarding_b3": onboarding.onboarding_b3,
|
||||
},
|
||||
unique_keys=["user_id"],
|
||||
)
|
||||
.execute()
|
||||
.data
|
||||
)
|
||||
|
||||
if not response:
|
||||
raise HTTPException(404, "User onboarding not updated")
|
||||
return Onboardings(**response[0])
|
@ -7,6 +7,7 @@ from models.databases.supabase import (
|
||||
File,
|
||||
Knowledges,
|
||||
Notifications,
|
||||
Onboarding,
|
||||
Prompts,
|
||||
UserUsage,
|
||||
Vector,
|
||||
@ -23,6 +24,7 @@ class SupabaseDB(
|
||||
ApiKeyHandler,
|
||||
Chats,
|
||||
Vector,
|
||||
Onboarding,
|
||||
Prompts,
|
||||
Notifications,
|
||||
Knowledges,
|
||||
@ -39,3 +41,4 @@ class SupabaseDB(
|
||||
Prompts.__init__(self, supabase_client)
|
||||
Notifications.__init__(self, supabase_client)
|
||||
Knowledges.__init__(self, supabase_client)
|
||||
Onboarding.__init__(self, supabase_client)
|
||||
|
12
backend/models/onboarding.py
Normal file
12
backend/models/onboarding.py
Normal file
@ -0,0 +1,12 @@
|
||||
from dataclasses import dataclass
|
||||
from uuid import UUID
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
@dataclass
|
||||
class Onboardings(BaseModel):
|
||||
user_id: UUID
|
||||
onboarding_b1: bool
|
||||
onboarding_b2: bool
|
||||
onboarding_b3: bool
|
18
backend/repository/onboarding/get_user_onboarding.py
Normal file
18
backend/repository/onboarding/get_user_onboarding.py
Normal file
@ -0,0 +1,18 @@
|
||||
from uuid import UUID
|
||||
|
||||
from models.onboarding import Onboardings
|
||||
from models.settings import get_supabase_db
|
||||
|
||||
|
||||
def get_user_onboarding(user_id: UUID) -> Onboardings:
|
||||
"""
|
||||
Get a user's onboarding status
|
||||
|
||||
Args:
|
||||
user_id (UUID): The id of the user
|
||||
|
||||
Returns:
|
||||
Onboardings: The user's onboarding status
|
||||
"""
|
||||
supabase_db = get_supabase_db()
|
||||
return supabase_db.get_user_onboarding(user_id)
|
14
backend/repository/onboarding/udpate_user_onboarding.py
Normal file
14
backend/repository/onboarding/udpate_user_onboarding.py
Normal file
@ -0,0 +1,14 @@
|
||||
from uuid import UUID
|
||||
|
||||
from models.databases.supabase.onboarding import OnboardingUpdatableProperties
|
||||
from models.onboarding import Onboardings
|
||||
from models.settings import get_supabase_db
|
||||
|
||||
|
||||
def update_user_onboarding(
|
||||
user_id: UUID, onboarding: OnboardingUpdatableProperties
|
||||
) -> Onboardings:
|
||||
"""Update user onboarding information by user_id"""
|
||||
|
||||
supabase_db = get_supabase_db()
|
||||
return supabase_db.update_user_onboarding(user_id, onboarding)
|
42
backend/routes/onboarding_routes.py
Normal file
42
backend/routes/onboarding_routes.py
Normal file
@ -0,0 +1,42 @@
|
||||
from auth import (
|
||||
AuthBearer,
|
||||
get_current_user, # Assuming you have a get_current_user function
|
||||
)
|
||||
from fastapi import APIRouter, Depends
|
||||
from models.databases.supabase.onboarding import OnboardingUpdatableProperties
|
||||
from models.user_identity import UserIdentity
|
||||
from repository.onboarding.get_user_onboarding import get_user_onboarding
|
||||
from repository.onboarding.udpate_user_onboarding import update_user_onboarding
|
||||
|
||||
onboarding_router = APIRouter()
|
||||
|
||||
|
||||
@onboarding_router.get(
|
||||
"/onboarding",
|
||||
dependencies=[Depends(AuthBearer())],
|
||||
tags=["Onboarding"],
|
||||
)
|
||||
async def get_user_onboarding_handler(
|
||||
current_user: UserIdentity = Depends(get_current_user),
|
||||
):
|
||||
"""
|
||||
Get user onboarding information for the current user
|
||||
"""
|
||||
|
||||
return get_user_onboarding(current_user.id)
|
||||
|
||||
|
||||
@onboarding_router.put(
|
||||
"/onboarding",
|
||||
dependencies=[Depends(AuthBearer())],
|
||||
tags=["Onboarding"],
|
||||
)
|
||||
async def update_user_onboarding_handler(
|
||||
onboarding: OnboardingUpdatableProperties,
|
||||
current_user: UserIdentity = Depends(get_current_user),
|
||||
):
|
||||
"""
|
||||
Update user onboarding information for the current user
|
||||
"""
|
||||
|
||||
return update_user_onboarding(current_user.id, onboarding)
|
8
scripts/20231004150000_add_onboarding_table.sql
Normal file
8
scripts/20231004150000_add_onboarding_table.sql
Normal file
@ -0,0 +1,8 @@
|
||||
-- Create the onboarding table
|
||||
CREATE TABLE IF NOT EXISTS onboardings (
|
||||
user_id UUID NOT NULL REFERENCES auth.users (id),
|
||||
onboarding_b1 BOOLEAN NOT NULL DEFAULT false,
|
||||
onboarding_b2 BOOLEAN NOT NULL DEFAULT false,
|
||||
onboarding_b3 BOOLEAN NOT NULL DEFAULT false,
|
||||
PRIMARY KEY (user_id)
|
||||
)
|
@ -256,6 +256,15 @@ CREATE TABLE IF NOT EXISTS knowledge_vectors (
|
||||
);
|
||||
|
||||
|
||||
-- Create the onboarding table
|
||||
CREATE TABLE IF NOT EXISTS onboardings (
|
||||
user_id UUID NOT NULL REFERENCES auth.users (id),
|
||||
onboarding_b1 BOOLEAN NOT NULL DEFAULT false,
|
||||
onboarding_b2 BOOLEAN NOT NULL DEFAULT false,
|
||||
onboarding_b3 BOOLEAN NOT NULL DEFAULT false,
|
||||
PRIMARY KEY (user_id)
|
||||
)
|
||||
|
||||
insert into
|
||||
storage.buckets (id, name)
|
||||
values
|
||||
@ -270,9 +279,9 @@ CREATE POLICY "Access Quivr Storage 1jccrwz_2" ON storage.objects FOR UPDATE TO
|
||||
CREATE POLICY "Access Quivr Storage 1jccrwz_3" ON storage.objects FOR DELETE TO anon USING (bucket_id = 'quivr');
|
||||
|
||||
INSERT INTO migrations (name)
|
||||
SELECT '202309307004032_change_user_settings'
|
||||
SELECT '20231004150000_add_onboarding_table'
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM migrations WHERE name = '202309307004032_change_user_settings'
|
||||
SELECT 1 FROM migrations WHERE name = '20231004150000_add_onboarding_table'
|
||||
);
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user