feat: add onboarding table (#1327)

* feat: add onboarding table

* feat: add Onboarding repository

* feat: add onboarding controller
This commit is contained in:
Mamadou DICKO 2023-10-05 09:47:29 +02:00 committed by GitHub
parent f030db6952
commit fbdc07af2c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 180 additions and 4 deletions

View File

@ -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

View File

@ -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

View 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])

View File

@ -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)

View 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

View 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)

View 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)

View 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)

View 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)
)

View File

@ -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'
); );