feat: Moved searchconnectors association from user to searchspace

- Need to move llm configs to searchspace
This commit is contained in:
DESKTOP-RTLN3BA\$punk 2025-10-08 21:13:01 -07:00
parent b3d8279931
commit aea09a5dad
36 changed files with 578 additions and 223 deletions

View file

@ -65,7 +65,7 @@ export default function ConnectorsPage() {
const today = new Date();
const { connectors, isLoading, error, deleteConnector, indexConnector } =
useSearchSourceConnectors();
useSearchSourceConnectors(false, parseInt(searchSpaceId));
const [connectorToDelete, setConnectorToDelete] = useState<number | null>(null);
const [indexingConnectorId, setIndexingConnectorId] = useState<number | null>(null);
const [datePickerOpen, setDatePickerOpen] = useState(false);
@ -366,12 +366,7 @@ export default function ConnectorsPage() {
</Button>
</PopoverTrigger>
<PopoverContent className="w-auto p-0" align="start">
<Calendar
mode="single"
selected={endDate}
onSelect={setEndDate}
initialFocus
/>
<Calendar mode="single" selected={endDate} onSelect={setEndDate} initialFocus />
</PopoverContent>
</Popover>
</div>

View file

@ -83,7 +83,7 @@ export default function EditConnectorPage() {
const searchSpaceId = params.search_space_id as string;
const connectorId = parseInt(params.connector_id as string, 10);
const { connectors, updateConnector } = useSearchSourceConnectors();
const { connectors, updateConnector } = useSearchSourceConnectors(false, parseInt(searchSpaceId));
const [connector, setConnector] = useState<SearchSourceConnector | null>(null);
const [isLoading, setIsLoading] = useState(true);
const [isSubmitting, setIsSubmitting] = useState(false);

View file

@ -30,10 +30,10 @@ export default function AirtableConnectorPage() {
const [isConnecting, setIsConnecting] = useState(false);
const [doesConnectorExist, setDoesConnectorExist] = useState(false);
const { fetchConnectors } = useSearchSourceConnectors();
const { fetchConnectors } = useSearchSourceConnectors(true, parseInt(searchSpaceId));
useEffect(() => {
fetchConnectors().then((data) => {
fetchConnectors(parseInt(searchSpaceId)).then((data) => {
const connector = data.find(
(c: SearchSourceConnector) => c.connector_type === EnumConnectorName.AIRTABLE_CONNECTOR
);

View file

@ -69,7 +69,7 @@ export default function ClickUpConnectorPage() {
last_indexed_at: null,
};
await createConnector(connectorData);
await createConnector(connectorData, parseInt(searchSpaceId));
toast.success("ClickUp connector created successfully!");
router.push(`/dashboard/${searchSpaceId}/connectors`);

View file

@ -77,17 +77,20 @@ export default function ConfluenceConnectorPage() {
const onSubmit = async (values: ConfluenceConnectorFormValues) => {
setIsSubmitting(true);
try {
await createConnector({
name: values.name,
connector_type: EnumConnectorName.CONFLUENCE_CONNECTOR,
config: {
CONFLUENCE_BASE_URL: values.base_url,
CONFLUENCE_EMAIL: values.email,
CONFLUENCE_API_TOKEN: values.api_token,
await createConnector(
{
name: values.name,
connector_type: EnumConnectorName.CONFLUENCE_CONNECTOR,
config: {
CONFLUENCE_BASE_URL: values.base_url,
CONFLUENCE_EMAIL: values.email,
CONFLUENCE_API_TOKEN: values.api_token,
},
is_indexable: true,
last_indexed_at: null,
},
is_indexable: true,
last_indexed_at: null,
});
parseInt(searchSpaceId)
);
toast.success("Confluence connector created successfully!");

View file

@ -73,15 +73,18 @@ export default function DiscordConnectorPage() {
const onSubmit = async (values: DiscordConnectorFormValues) => {
setIsSubmitting(true);
try {
await createConnector({
name: values.name,
connector_type: EnumConnectorName.DISCORD_CONNECTOR,
config: {
DISCORD_BOT_TOKEN: values.bot_token,
await createConnector(
{
name: values.name,
connector_type: EnumConnectorName.DISCORD_CONNECTOR,
config: {
DISCORD_BOT_TOKEN: values.bot_token,
},
is_indexable: true,
last_indexed_at: null,
},
is_indexable: true,
last_indexed_at: null,
});
parseInt(searchSpaceId)
);
toast.success("Discord connector created successfully!");
router.push(`/dashboard/${searchSpaceId}/connectors`);

View file

@ -148,16 +148,19 @@ export default function GithubConnectorPage() {
setIsCreatingConnector(true);
try {
await createConnector({
name: connectorName, // Use the stored name
connector_type: EnumConnectorName.GITHUB_CONNECTOR,
config: {
GITHUB_PAT: validatedPat, // Use the stored validated PAT
repo_full_names: selectedRepos, // Add the selected repo names
await createConnector(
{
name: connectorName, // Use the stored name
connector_type: EnumConnectorName.GITHUB_CONNECTOR,
config: {
GITHUB_PAT: validatedPat, // Use the stored validated PAT
repo_full_names: selectedRepos, // Add the selected repo names
},
is_indexable: true,
last_indexed_at: null,
},
is_indexable: true,
last_indexed_at: null,
});
parseInt(searchSpaceId)
);
toast.success("GitHub connector created successfully!");
router.push(`/dashboard/${searchSpaceId}/connectors`);

View file

@ -32,10 +32,10 @@ export default function GoogleCalendarConnectorPage() {
const [isConnecting, setIsConnecting] = useState(false);
const [doesConnectorExist, setDoesConnectorExist] = useState(false);
const { fetchConnectors } = useSearchSourceConnectors();
const { fetchConnectors } = useSearchSourceConnectors(true, parseInt(searchSpaceId));
useEffect(() => {
fetchConnectors().then((data) => {
fetchConnectors(parseInt(searchSpaceId)).then((data) => {
const connector = data.find(
(c: SearchSourceConnector) =>
c.connector_type === EnumConnectorName.GOOGLE_CALENDAR_CONNECTOR

View file

@ -32,10 +32,10 @@ export default function GoogleGmailConnectorPage() {
const [isConnecting, setIsConnecting] = useState(false);
const [doesConnectorExist, setDoesConnectorExist] = useState(false);
const { fetchConnectors } = useSearchSourceConnectors();
const { fetchConnectors } = useSearchSourceConnectors(true, parseInt(searchSpaceId));
useEffect(() => {
fetchConnectors().then((data) => {
fetchConnectors(parseInt(searchSpaceId)).then((data) => {
const connector = data.find(
(c: SearchSourceConnector) => c.connector_type === EnumConnectorName.GOOGLE_GMAIL_CONNECTOR
);

View file

@ -90,17 +90,20 @@ export default function JiraConnectorPage() {
const onSubmit = async (values: JiraConnectorFormValues) => {
setIsSubmitting(true);
try {
await createConnector({
name: values.name,
connector_type: EnumConnectorName.JIRA_CONNECTOR,
config: {
JIRA_BASE_URL: values.base_url,
JIRA_EMAIL: values.email,
JIRA_API_TOKEN: values.api_token,
await createConnector(
{
name: values.name,
connector_type: EnumConnectorName.JIRA_CONNECTOR,
config: {
JIRA_BASE_URL: values.base_url,
JIRA_EMAIL: values.email,
JIRA_API_TOKEN: values.api_token,
},
is_indexable: true,
last_indexed_at: null,
},
is_indexable: true,
last_indexed_at: null,
});
parseInt(searchSpaceId)
);
toast.success("Jira connector created successfully!");

View file

@ -77,15 +77,18 @@ export default function LinearConnectorPage() {
const onSubmit = async (values: LinearConnectorFormValues) => {
setIsSubmitting(true);
try {
await createConnector({
name: values.name,
connector_type: EnumConnectorName.LINEAR_CONNECTOR,
config: {
LINEAR_API_KEY: values.api_key,
await createConnector(
{
name: values.name,
connector_type: EnumConnectorName.LINEAR_CONNECTOR,
config: {
LINEAR_API_KEY: values.api_key,
},
is_indexable: true,
last_indexed_at: null,
},
is_indexable: true,
last_indexed_at: null,
});
parseInt(searchSpaceId)
);
toast.success("Linear connector created successfully!");

View file

@ -65,15 +65,18 @@ export default function LinkupApiPage() {
const onSubmit = async (values: LinkupApiFormValues) => {
setIsSubmitting(true);
try {
await createConnector({
name: values.name,
connector_type: EnumConnectorName.LINKUP_API,
config: {
LINKUP_API_KEY: values.api_key,
await createConnector(
{
name: values.name,
connector_type: EnumConnectorName.LINKUP_API,
config: {
LINKUP_API_KEY: values.api_key,
},
is_indexable: false,
last_indexed_at: null,
},
is_indexable: false,
last_indexed_at: null,
});
parseInt(searchSpaceId)
);
toast.success("Linkup API connector created successfully!");

View file

@ -55,7 +55,10 @@ export default function LumaConnectorPage() {
const [isSubmitting, setIsSubmitting] = useState(false);
const [doesConnectorExist, setDoesConnectorExist] = useState(false);
const { fetchConnectors, createConnector } = useSearchSourceConnectors();
const { fetchConnectors, createConnector } = useSearchSourceConnectors(
true,
parseInt(searchSpaceId)
);
// Initialize the form
const form = useForm<LumaConnectorFormValues>({
@ -67,7 +70,7 @@ export default function LumaConnectorPage() {
});
useEffect(() => {
fetchConnectors().then((data) => {
fetchConnectors(parseInt(searchSpaceId)).then((data) => {
const connector = data.find(
(c: SearchSourceConnector) => c.connector_type === EnumConnectorName.LUMA_CONNECTOR
);
@ -81,15 +84,18 @@ export default function LumaConnectorPage() {
const onSubmit = async (values: LumaConnectorFormValues) => {
setIsSubmitting(true);
try {
await createConnector({
name: values.name,
connector_type: EnumConnectorName.LUMA_CONNECTOR,
config: {
LUMA_API_KEY: values.api_key,
await createConnector(
{
name: values.name,
connector_type: EnumConnectorName.LUMA_CONNECTOR,
config: {
LUMA_API_KEY: values.api_key,
},
is_indexable: true,
last_indexed_at: null,
},
is_indexable: true,
last_indexed_at: null,
});
parseInt(searchSpaceId)
);
toast.success("Luma connector created successfully!");

View file

@ -72,15 +72,18 @@ export default function NotionConnectorPage() {
const onSubmit = async (values: NotionConnectorFormValues) => {
setIsSubmitting(true);
try {
await createConnector({
name: values.name,
connector_type: EnumConnectorName.NOTION_CONNECTOR,
config: {
NOTION_INTEGRATION_TOKEN: values.integration_token,
await createConnector(
{
name: values.name,
connector_type: EnumConnectorName.NOTION_CONNECTOR,
config: {
NOTION_INTEGRATION_TOKEN: values.integration_token,
},
is_indexable: true,
last_indexed_at: null,
},
is_indexable: true,
last_indexed_at: null,
});
parseInt(searchSpaceId)
);
toast.success("Notion connector created successfully!");

View file

@ -65,15 +65,18 @@ export default function SerperApiPage() {
const onSubmit = async (values: SerperApiFormValues) => {
setIsSubmitting(true);
try {
await createConnector({
name: values.name,
connector_type: EnumConnectorName.SERPER_API,
config: {
SERPER_API_KEY: values.api_key,
await createConnector(
{
name: values.name,
connector_type: EnumConnectorName.SERPER_API,
config: {
SERPER_API_KEY: values.api_key,
},
is_indexable: false,
last_indexed_at: null,
},
is_indexable: false,
last_indexed_at: null,
});
parseInt(searchSpaceId)
);
toast.success("Serper API connector created successfully!");

View file

@ -72,15 +72,18 @@ export default function SlackConnectorPage() {
const onSubmit = async (values: SlackConnectorFormValues) => {
setIsSubmitting(true);
try {
await createConnector({
name: values.name,
connector_type: EnumConnectorName.SLACK_CONNECTOR,
config: {
SLACK_BOT_TOKEN: values.bot_token,
await createConnector(
{
name: values.name,
connector_type: EnumConnectorName.SLACK_CONNECTOR,
config: {
SLACK_BOT_TOKEN: values.bot_token,
},
is_indexable: true,
last_indexed_at: null,
},
is_indexable: true,
last_indexed_at: null,
});
parseInt(searchSpaceId)
);
toast.success("Slack connector created successfully!");

View file

@ -65,15 +65,18 @@ export default function TavilyApiPage() {
const onSubmit = async (values: TavilyApiFormValues) => {
setIsSubmitting(true);
try {
await createConnector({
name: values.name,
connector_type: EnumConnectorName.TAVILY_API,
config: {
TAVILY_API_KEY: values.api_key,
await createConnector(
{
name: values.name,
connector_type: EnumConnectorName.TAVILY_API,
config: {
TAVILY_API_KEY: values.api_key,
},
is_indexable: false,
last_indexed_at: null,
},
is_indexable: false,
last_indexed_at: null,
});
parseInt(searchSpaceId)
);
toast.success("Tavily API connector created successfully!");

View file

@ -1,7 +1,6 @@
"use client";
import { format } from "date-fns";
import { AnimatePresence, motion, type Variants } from "framer-motion";
import {
Calendar,
MoreHorizontal,
@ -16,6 +15,7 @@ import {
VolumeX,
X,
} from "lucide-react";
import { AnimatePresence, motion, type Variants } from "motion/react";
import Image from "next/image";
import { useEffect, useRef, useState } from "react";
import { toast } from "sonner";