Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add onboarding table #1327

Merged
merged 3 commits into from
Oct 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions backend/models/databases/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,3 +255,11 @@ def get_knowledge_by_id(self, knowledge_id: UUID):
@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
4 changes: 2 additions & 2 deletions backend/models/databases/supabase/__init__.py
Original file line number Diff line number Diff line change
@@ -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 changes: 62 additions & 0 deletions backend/models/databases/supabase/onboarding.py
Original file line number Diff line number Diff line change
@@ -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])
3 changes: 3 additions & 0 deletions backend/models/databases/supabase/supabase.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
File,
Knowledges,
Notifications,
Onboarding,
Prompts,
UserUsage,
Vector,
Expand All @@ -23,6 +24,7 @@ class SupabaseDB(
ApiKeyHandler,
Chats,
Vector,
Onboarding,
Prompts,
Notifications,
Knowledges,
Expand All @@ -39,3 +41,4 @@ def __init__(self, supabase_client):
Prompts.__init__(self, supabase_client)
Notifications.__init__(self, supabase_client)
Knowledges.__init__(self, supabase_client)
Onboarding.__init__(self, supabase_client)
12 changes: 12 additions & 0 deletions backend/models/onboarding.py
Original file line number Diff line number Diff line change
@@ -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 changes: 18 additions & 0 deletions backend/repository/onboarding/get_user_onboarding.py
Original file line number Diff line number Diff line change
@@ -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 changes: 14 additions & 0 deletions backend/repository/onboarding/udpate_user_onboarding.py
Original file line number Diff line number Diff line change
@@ -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 changes: 42 additions & 0 deletions backend/routes/onboarding_routes.py
Original file line number Diff line number Diff line change
@@ -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 changes: 8 additions & 0 deletions scripts/20231004150000_add_onboarding_table.sql
Original file line number Diff line number Diff line change
@@ -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)
)
13 changes: 11 additions & 2 deletions scripts/tables.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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