mirror of
https://github.com/danswer-ai/danswer.git
synced 2025-09-27 20:38:32 +02:00
Distinguish users in posthog (#2965)
* distinguish tenants in posthog * nit
This commit is contained in:
@@ -57,6 +57,7 @@ class UserInfo(BaseModel):
|
|||||||
oidc_expiry: datetime | None = None
|
oidc_expiry: datetime | None = None
|
||||||
current_token_created_at: datetime | None = None
|
current_token_created_at: datetime | None = None
|
||||||
current_token_expiry_length: int | None = None
|
current_token_expiry_length: int | None = None
|
||||||
|
organization_name: str | None = None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_model(
|
def from_model(
|
||||||
@@ -64,6 +65,7 @@ class UserInfo(BaseModel):
|
|||||||
user: User,
|
user: User,
|
||||||
current_token_created_at: datetime | None = None,
|
current_token_created_at: datetime | None = None,
|
||||||
expiry_length: int | None = None,
|
expiry_length: int | None = None,
|
||||||
|
organization_name: str | None = None,
|
||||||
) -> "UserInfo":
|
) -> "UserInfo":
|
||||||
return cls(
|
return cls(
|
||||||
id=str(user.id),
|
id=str(user.id),
|
||||||
@@ -80,6 +82,7 @@ class UserInfo(BaseModel):
|
|||||||
visible_assistants=user.visible_assistants,
|
visible_assistants=user.visible_assistants,
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
|
organization_name=organization_name,
|
||||||
# set to None if TRACK_EXTERNAL_IDP_EXPIRY is False so that we avoid cases
|
# set to None if TRACK_EXTERNAL_IDP_EXPIRY is False so that we avoid cases
|
||||||
# where they previously had this set + used OIDC, and now they switched to
|
# where they previously had this set + used OIDC, and now they switched to
|
||||||
# basic auth are now constantly getting redirected back to the login page
|
# basic auth are now constantly getting redirected back to the login page
|
||||||
|
@@ -30,6 +30,7 @@ from danswer.auth.schemas import UserStatus
|
|||||||
from danswer.auth.users import current_admin_user
|
from danswer.auth.users import current_admin_user
|
||||||
from danswer.auth.users import current_curator_or_admin_user
|
from danswer.auth.users import current_curator_or_admin_user
|
||||||
from danswer.auth.users import current_user
|
from danswer.auth.users import current_user
|
||||||
|
from danswer.auth.users import get_tenant_id_for_email
|
||||||
from danswer.auth.users import optional_user
|
from danswer.auth.users import optional_user
|
||||||
from danswer.configs.app_configs import AUTH_TYPE
|
from danswer.configs.app_configs import AUTH_TYPE
|
||||||
from danswer.configs.app_configs import ENABLE_EMAIL_INVITES
|
from danswer.configs.app_configs import ENABLE_EMAIL_INVITES
|
||||||
@@ -493,10 +494,13 @@ def verify_user_logged_in(
|
|||||||
token_created_at = (
|
token_created_at = (
|
||||||
None if MULTI_TENANT else get_current_token_creation(user, db_session)
|
None if MULTI_TENANT else get_current_token_creation(user, db_session)
|
||||||
)
|
)
|
||||||
|
organization_name = get_tenant_id_for_email(user.email)
|
||||||
|
|
||||||
user_info = UserInfo.from_model(
|
user_info = UserInfo.from_model(
|
||||||
user,
|
user,
|
||||||
current_token_created_at=token_created_at,
|
current_token_created_at=token_created_at,
|
||||||
expiry_length=SESSION_EXPIRE_TIME_SECONDS,
|
expiry_length=SESSION_EXPIRE_TIME_SECONDS,
|
||||||
|
organization_name=organization_name,
|
||||||
)
|
)
|
||||||
|
|
||||||
return user_info
|
return user_info
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
import React, { createContext, useContext, useState, useEffect } from "react";
|
import React, { createContext, useContext, useState, useEffect } from "react";
|
||||||
import { User, UserRole } from "@/lib/types";
|
import { User, UserRole } from "@/lib/types";
|
||||||
import { getCurrentUser } from "@/lib/user";
|
import { getCurrentUser } from "@/lib/user";
|
||||||
|
import { usePostHog } from "posthog-js/react";
|
||||||
|
|
||||||
interface UserContextType {
|
interface UserContextType {
|
||||||
user: User | null;
|
user: User | null;
|
||||||
@@ -24,6 +25,24 @@ export function UserProvider({
|
|||||||
const [upToDateUser, setUpToDateUser] = useState<User | null>(user);
|
const [upToDateUser, setUpToDateUser] = useState<User | null>(user);
|
||||||
const [isLoadingUser, setIsLoadingUser] = useState(false);
|
const [isLoadingUser, setIsLoadingUser] = useState(false);
|
||||||
|
|
||||||
|
const posthog = usePostHog();
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!posthog) return;
|
||||||
|
|
||||||
|
if (user?.id) {
|
||||||
|
const identifyData: Record<string, any> = {
|
||||||
|
email: user.email,
|
||||||
|
};
|
||||||
|
if (user.organization_name) {
|
||||||
|
identifyData.organization_name = user.organization_name;
|
||||||
|
}
|
||||||
|
posthog.identify(user.id, identifyData);
|
||||||
|
} else {
|
||||||
|
posthog.reset();
|
||||||
|
}
|
||||||
|
}, [posthog, user]);
|
||||||
|
|
||||||
const fetchUser = async () => {
|
const fetchUser = async () => {
|
||||||
try {
|
try {
|
||||||
setIsLoadingUser(true);
|
setIsLoadingUser(true);
|
||||||
|
@@ -42,6 +42,7 @@ export interface User {
|
|||||||
current_token_created_at?: Date;
|
current_token_created_at?: Date;
|
||||||
current_token_expiry_length?: number;
|
current_token_expiry_length?: number;
|
||||||
oidc_expiry?: Date;
|
oidc_expiry?: Date;
|
||||||
|
organization_name: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MinimalUserSnapshot {
|
export interface MinimalUserSnapshot {
|
||||||
|
Reference in New Issue
Block a user