diff --git a/src/modules/cards/infrastructure/http/controllers/CreateConnectionController.ts b/src/modules/cards/infrastructure/http/controllers/CreateConnectionController.ts index bacb890c..092ceb84 100644 --- a/src/modules/cards/infrastructure/http/controllers/CreateConnectionController.ts +++ b/src/modules/cards/infrastructure/http/controllers/CreateConnectionController.ts @@ -42,19 +42,6 @@ export class CreateConnectionController extends Controller { return this.badRequest(res, 'Invalid target type. Must be URL or CARD'); } - // Validate connectionType if provided - if ( - connectionType !== undefined && - !['CITATION', 'REFERENCE', 'RELATED', 'INSPIRED_BY'].includes( - connectionType, - ) - ) { - return this.badRequest( - res, - 'Invalid connectionType. Must be CITATION, REFERENCE, RELATED, or INSPIRED_BY', - ); - } - const result = await this.createConnectionUseCase.execute({ sourceType, sourceValue, diff --git a/src/types/src/api/requests.ts b/src/types/src/api/requests.ts index 6ade2e39..51ace1d9 100644 --- a/src/types/src/api/requests.ts +++ b/src/types/src/api/requests.ts @@ -297,13 +297,24 @@ export interface GetCollectionContributorsParams extends PaginationParams { collectionId: string; // Collection UUID } +// Connection types matching the domain model +export type ConnectionType = + | 'SUPPORTS' + | 'OPPOSES' + | 'ADDRESSES' + | 'HELPFUL' + | 'LEADS_TO' + | 'RELATED' + | 'SUPPLEMENT' + | 'EXPLAINER'; + // Connection request types export interface CreateConnectionRequest { sourceType: 'URL' | 'CARD'; sourceValue: string; targetType: 'URL' | 'CARD'; targetValue: string; - connectionType?: 'CITATION' | 'REFERENCE' | 'RELATED' | 'INSPIRED_BY'; + connectionType?: ConnectionType; note?: string; } @@ -320,13 +331,13 @@ export interface DeleteConnectionRequest { export interface GetForwardConnectionsForUrlParams extends PaginatedSortedParams { url: string; - connectionTypes?: ('CITATION' | 'REFERENCE' | 'RELATED' | 'INSPIRED_BY')[]; + connectionTypes?: ConnectionType[]; } export interface GetBackwardConnectionsForUrlParams extends PaginatedSortedParams { url: string; - connectionTypes?: ('CITATION' | 'REFERENCE' | 'RELATED' | 'INSPIRED_BY')[]; + connectionTypes?: ConnectionType[]; } // Search URLs request types @@ -338,5 +349,5 @@ export interface SearchUrlsParams extends PaginatedSortedParams { // Get connections request types export interface GetConnectionsParams extends PaginatedSortedParams { identifier: string; // Can be DID or handle - connectionTypes?: ('CITATION' | 'REFERENCE' | 'RELATED' | 'INSPIRED_BY')[]; + connectionTypes?: ConnectionType[]; } diff --git a/src/webapp/api-client/clients/ConnectionClient.ts b/src/webapp/api-client/clients/ConnectionClient.ts index 9db7673b..6da26594 100644 --- a/src/webapp/api-client/clients/ConnectionClient.ts +++ b/src/webapp/api-client/clients/ConnectionClient.ts @@ -12,12 +12,32 @@ export class ConnectionClient extends BaseClient { async createConnection( request: CreateConnectionRequest, ): Promise { - return this.request( - 'POST', - '/api/connections', - request, - ); + try { + console.log( + 'Creating connection with request:', + JSON.stringify(request, null, 2), + ); + const response = await this.request( + 'POST', + '/api/connections', + request, + ); + console.log( + 'CreateConnectionResponse:', + JSON.stringify(response, null, 2), + ); + return response; + } catch (error) { + console.error('Error creating connection:', error); + throw error; + } } + // return this.request( + // 'POST', + // '/api/connections', + // request, + // ); + // } async updateConnection( request: UpdateConnectionRequest, diff --git a/src/webapp/features/connections/components/connectionFilters/ConnectionFilters.tsx b/src/webapp/features/connections/components/connectionFilters/ConnectionFilters.tsx index c7575b8a..f1d7bc8a 100644 --- a/src/webapp/features/connections/components/connectionFilters/ConnectionFilters.tsx +++ b/src/webapp/features/connections/components/connectionFilters/ConnectionFilters.tsx @@ -1,19 +1,17 @@ 'use client'; import { Group, Button, Menu } from '@mantine/core'; -import { useRouter, useSearchParams } from 'next/navigation'; import { createContext, useContext, ReactNode, - useOptimistic, - useTransition, } from 'react'; import { upperFirst } from '@mantine/hooks'; import { MdFilterList } from 'react-icons/md'; +import { ConnectionType } from '@semble/types'; // Connection type enum values matching the backend -const CONNECTION_TYPES = [ +const CONNECTION_TYPES: ConnectionType[] = [ 'SUPPORTS', 'OPPOSES', 'ADDRESSES', @@ -22,14 +20,12 @@ const CONNECTION_TYPES = [ 'RELATED', 'SUPPLEMENT', 'EXPLAINER', -] as const; - -type ConnectionType = (typeof CONNECTION_TYPES)[number]; +]; // context interface FilterContextValue { - router: ReturnType; - searchParams: ReturnType; + connectionType: ConnectionType | null; + onConnectionTypeChange: (type: ConnectionType | null) => void; } const FilterContext = createContext(null); @@ -44,15 +40,18 @@ const useFilterContext = () => { }; // root -export function Root(props: { children: ReactNode }) { - const searchParams = useSearchParams(); - const router = useRouter(); +interface RootProps { + children: ReactNode; + connectionType: ConnectionType | null; + onConnectionTypeChange: (type: ConnectionType | null) => void; +} +export function Root(props: RootProps) { return ( @@ -70,30 +69,9 @@ export function Root(props: { children: ReactNode }) { // connection type filter export function ConnectionTypeFilter() { const ctx = useFilterContext(); - const [, startTransition] = useTransition(); - - const typeFromUrl = ctx.searchParams.get( - 'connectionType', - ) as ConnectionType | null; - - const [optimisticType, setOptimisticType] = - useOptimistic(typeFromUrl); const onChange = (type?: ConnectionType) => { - const nextType = type ?? null; - - startTransition(() => { - setOptimisticType(nextType); - - const params = new URLSearchParams(ctx.searchParams.toString()); - if (nextType) { - params.set('connectionType', nextType); - } else { - params.delete('connectionType'); - } - - ctx.router.replace(`?${params.toString()}`, { scroll: false }); - }); + ctx.onConnectionTypeChange(type ?? null); }; const formatConnectionType = (type: string) => { @@ -109,7 +87,7 @@ export function ConnectionTypeFilter() {