mirror of
https://github.com/QuivrHQ/quivr.git
synced 2024-12-15 01:21:48 +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
|
@abstractmethod
|
||||||
def get_all_knowledge_in_brain(self, brain_id: UUID):
|
def get_all_knowledge_in_brain(self, brain_id: UUID):
|
||||||
pass
|
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.api_key_handler import ApiKeyHandler
|
||||||
from models.databases.supabase.brains import Brain
|
from models.databases.supabase.brains import Brain
|
||||||
from models.databases.supabase.brains_subscription_invitations import \
|
from models.databases.supabase.brains_subscription_invitations import BrainSubscription
|
||||||
BrainSubscription
|
|
||||||
from models.databases.supabase.chats import Chats
|
from models.databases.supabase.chats import Chats
|
||||||
from models.databases.supabase.files import File
|
from models.databases.supabase.files import File
|
||||||
from models.databases.supabase.knowledge import Knowledges
|
from models.databases.supabase.knowledge import Knowledges
|
||||||
from models.databases.supabase.notifications import Notifications
|
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.prompts import Prompts
|
||||||
from models.databases.supabase.user_usage import UserUsage
|
from models.databases.supabase.user_usage import UserUsage
|
||||||
from models.databases.supabase.vectors import Vector
|
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,
|
File,
|
||||||
Knowledges,
|
Knowledges,
|
||||||
Notifications,
|
Notifications,
|
||||||
|
Onboarding,
|
||||||
Prompts,
|
Prompts,
|
||||||
UserUsage,
|
UserUsage,
|
||||||
Vector,
|
Vector,
|
||||||
@ -23,6 +24,7 @@ class SupabaseDB(
|
|||||||
ApiKeyHandler,
|
ApiKeyHandler,
|
||||||
Chats,
|
Chats,
|
||||||
Vector,
|
Vector,
|
||||||
|
Onboarding,
|
||||||
Prompts,
|
Prompts,
|
||||||
Notifications,
|
Notifications,
|
||||||
Knowledges,
|
Knowledges,
|
||||||
@ -39,3 +41,4 @@ class SupabaseDB(
|
|||||||
Prompts.__init__(self, supabase_client)
|
Prompts.__init__(self, supabase_client)
|
||||||
Notifications.__init__(self, supabase_client)
|
Notifications.__init__(self, supabase_client)
|
||||||
Knowledges.__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
|
insert into
|
||||||
storage.buckets (id, name)
|
storage.buckets (id, name)
|
||||||
values
|
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');
|
CREATE POLICY "Access Quivr Storage 1jccrwz_3" ON storage.objects FOR DELETE TO anon USING (bucket_id = 'quivr');
|
||||||
|
|
||||||
INSERT INTO migrations (name)
|
INSERT INTO migrations (name)
|
||||||
SELECT '202309307004032_change_user_settings'
|
SELECT '20231004150000_add_onboarding_table'
|
||||||
WHERE NOT EXISTS (
|
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