Skip to content

Commit

Permalink
#93 Now assistants can be enforced to have authentication before user…
Browse files Browse the repository at this point in the history
…s can use the assistant
  • Loading branch information
santthosh committed Jun 25, 2024
1 parent 1e5385b commit bfc70da
Show file tree
Hide file tree
Showing 8 changed files with 64 additions and 9 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,5 @@ yarn-error.log*
next-env.d.ts

.idea

.env.docker
8 changes: 8 additions & 0 deletions src/app/api/assistants/[id]/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,14 @@ export async function GET(req: NextRequest, res: NextResponse) {
);
}

if (assistant.authenticatedUsersOnly) {
// Validate that the user is logged in when this condition is applied
const session = await getSession();
if (!session?.user) {
return Response.json({ message: 'Unauthenticated' }, { status: 401 });
}
}

// Inject customization properties into the assistant object
if (assistant.object) {
// @ts-ignore
Expand Down
18 changes: 16 additions & 2 deletions src/app/api/auth/[auth0]/route.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,21 @@
import { handleAuth, handleLogin } from '@auth0/nextjs-auth0';
import { redirect } from 'next/navigation';

export const GET = handleAuth({
login: handleLogin({
returnTo: '/assistants',
login: handleLogin((req) => {
let returnUrl = '/assistants';

// @ts-ignore
if (req.url && req.url.searchParams) {
// @ts-ignore
let redirectUrl = req.url.searchParams.get('returnTo');
if (redirectUrl) {
returnUrl = redirectUrl;
}
}

return {
returnTo: returnUrl,
};
}),
});
9 changes: 8 additions & 1 deletion src/app/assistants/ListAssistants.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ import {
HiCog,
HiColorSwatch,
HiFolder,
HiGlobeAlt,
HiLink,
HiOutlineLockClosed,
HiPlus,
HiPuzzle,
} from 'react-icons/hi';
Expand Down Expand Up @@ -90,14 +92,19 @@ export default function ListAssistants() {
className={'pb-1'}
/>
<div className='flex flex-col items-center'>
{assistant.authenticatedUsersOnly ? (
<HiOutlineLockClosed />
) : (
<HiGlobeAlt />
)}
<h5 className='mb-1 text-xl font-medium text-gray-900 dark:text-white'>
{assistant.name}
</h5>
<span className='text-sm text-gray-500 dark:text-gray-400'>
<div className='flex gap-1 self-center'>
<Badge color='gray'>{assistant.modelId}</Badge>
<Badge color={assistant.published ? 'green' : 'red'}>
{assistant.published ? 'Public' : 'Private'}
{assistant.published ? 'Listed' : 'Private'}
</Badge>
</div>
</span>
Expand Down
12 changes: 10 additions & 2 deletions src/app/assistants/[id]/chat/ChatAgent.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
'use client';

import ChatPopup from '@/app/assistants/[id]/chat/ChatPopup';
import { Avatar, Dropdown, Spinner, Button } from 'flowbite-react';
import { getImageHash } from '@/app/utils/hash';
import { updateAssistant, useGetAssistant } from '@/app/assistants/[id]/client';
import React, { useEffect, useState } from 'react';
import { Assistant } from '@/app/types/assistant';
import AssistantContext from '@/app/assistants/[id]/AssistantContext';
import ChatPopupFrame from '@/app/assistants/[id]/chat/ChatPopupFrame';
import { useRouter } from 'next/navigation';

export interface ChatAgentProps {
assistant_id: string;
Expand All @@ -25,9 +25,15 @@ export default function ChatAgent(props: ChatAgentProps) {
const [loading, setLoading] = useState(true);
const [assistant, setAssistant] = useState<Assistant>(assistantResponse);

const { push } = useRouter();

useEffect(() => {
if (assistantResponse) {
setAssistant(assistantResponse);
// @ts-ignore
if (assistantResponse && assistantResponse.message) {
push('/api/auth/login?returnTo=/embed/' + props.assistant_id);
}
setLoading(false);
}
}, [assistantLoading]);
Expand Down Expand Up @@ -95,12 +101,14 @@ export default function ChatAgent(props: ChatAgentProps) {
getAssistantAvatar()
)}
</Button>
) : (
) : assistant.id ? (
<AssistantContext.Provider
value={{ assistant, setAssistant: changeAssistant }}
>
<ChatPopupFrame hide={!showPopup} setHide={hidePopup} />
</AssistantContext.Provider>
) : (
<>Redirecting...</>
)}
</div>
</div>
Expand Down
11 changes: 10 additions & 1 deletion src/app/assistants/[id]/chat/ChatPageContextWrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { Assistant } from '@/app/types/assistant';
import ChatPage from '@/app/assistants/[id]/chat/ChatPage';
import { Spinner } from 'flowbite-react';
import AssistantContext from '@/app/assistants/[id]/AssistantContext';
import { useRouter } from 'next/navigation';

export default function ChatPageContextWrapper(props: { assistantId: string }) {
let { assistantLoading, assistantResponse, assistantEmpty, reload } =
Expand All @@ -12,9 +13,15 @@ export default function ChatPageContextWrapper(props: { assistantId: string }) {
const [loading, setLoading] = useState(true);
const [assistant, setAssistant] = useState<Assistant>(assistantResponse);

const { push } = useRouter();

useEffect(() => {
if (assistantResponse) {
setAssistant(assistantResponse);
// @ts-ignore
if (assistantResponse && assistantResponse.message) {
push('/api/auth/login?returnTo=/link/' + props.assistantId);
}
setLoading(false);
}
}, [assistantLoading]);
Expand All @@ -28,11 +35,13 @@ export default function ChatPageContextWrapper(props: { assistantId: string }) {
<div className='bg-grey flex h-[calc(100vh-120px)] items-center justify-center '>
<Spinner color='info' aria-label='Loading assistant..' />
</div>
) : (
) : assistant.id ? (
<AssistantContext.Provider
value={{ assistant, setAssistant: changeAssistant }}
>
<ChatPage />
</AssistantContext.Provider>
) : (
<>Redirecting...</>
);
}
11 changes: 10 additions & 1 deletion src/app/assistants/[id]/chat/ChatWindow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import React, { useEffect, useState } from 'react';
import { Assistant } from '@/app/types/assistant';
import AssistantContext from '@/app/assistants/[id]/AssistantContext';
import ChatPopupFrame from '@/app/assistants/[id]/chat/ChatPopupFrame';
import { useRouter } from 'next/navigation';

export interface ChatWindowProps {
assistant_id: string;
Expand All @@ -25,9 +26,15 @@ export default function ChatWindow(props: ChatWindowProps) {
const [loading, setLoading] = useState(true);
const [assistant, setAssistant] = useState<Assistant>(assistantResponse);

const { push } = useRouter();

useEffect(() => {
if (assistantResponse) {
setAssistant(assistantResponse);
// @ts-ignore
if (assistantResponse && assistantResponse.message) {
push('/api/auth/login?returnTo=/embed/' + props.assistant_id);
}
setLoading(false);
}
}, [assistantLoading]);
Expand All @@ -47,7 +54,7 @@ export default function ChatWindow(props: ChatWindowProps) {
aria-label='Loading assistant..'
className={'self-center p-10'}
/>
) : (
) : assistant.id ? (
<AssistantContext.Provider
value={{ assistant, setAssistant: changeAssistant }}
>
Expand All @@ -57,6 +64,8 @@ export default function ChatWindow(props: ChatWindowProps) {
<ChatPopupFrame hide={false} setHide={null} />
)}
</AssistantContext.Provider>
) : (
<>Redirecting...</>
)}
</div>
</div>
Expand Down
2 changes: 0 additions & 2 deletions src/app/link/[id]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
'use client';

import { useParams } from 'next/navigation';
import ChatWindow from '@/app/assistants/[id]/chat/ChatWindow';
import ChatPage from '@/app/assistants/[id]/chat/ChatPage';
import ChatPageContextWrapper from '@/app/assistants/[id]/chat/ChatPageContextWrapper';

export interface ChatComponentProps {
Expand Down

0 comments on commit bfc70da

Please sign in to comment.