Skip to content

Commit

Permalink
Use the new get out of date connectors endpoint (#20155)
Browse files Browse the repository at this point in the history
* Add /v1/web_backend/check_updates

* Add constant for fallback cases

* Uses the new get out of date connectors endpoint

* Move connector service to its own file. Invalidate count on version change.

* Better upgrade all functionality

* Cleanup

Co-authored-by: Jimmy Ma <jimmy@airbyte.io>
  • Loading branch information
krishnaglick and gosusnp committed Jan 3, 2023
1 parent a8e1024 commit b776a2d
Show file tree
Hide file tree
Showing 12 changed files with 77 additions and 117 deletions.
73 changes: 0 additions & 73 deletions airbyte-webapp/src/hooks/services/useConnector.test.tsx

This file was deleted.

52 changes: 25 additions & 27 deletions airbyte-webapp/src/hooks/services/useConnector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { ConnectionConfiguration } from "core/domain/connection";
import { Connector } from "core/domain/connector";
import { DestinationService } from "core/domain/connector/DestinationService";
import { SourceService } from "core/domain/connector/SourceService";
import { useGetOutOfDateConnectorsCount } from "services/connector/ConnectorDefinitions";
import {
useDestinationDefinitionList,
useUpdateDestinationDefinition,
Expand All @@ -16,30 +17,12 @@ import { useInitService } from "services/useInitService";

import { CheckConnectionRead } from "../../core/request/AirbyteClient";

interface ConnectorService {
hasNewVersions: boolean;
hasNewSourceVersion: boolean;
hasNewDestinationVersion: boolean;
countNewSourceVersion: number;
countNewDestinationVersion: number;
updateAllSourceVersions: () => Promise<void>;
updateAllDestinationVersions: () => Promise<void>;
}

const useConnector = (): ConnectorService => {
export const useUpdateSourceDefinitions = () => {
const { sourceDefinitions } = useSourceDefinitionList();
const { destinationDefinitions } = useDestinationDefinitionList();

const { mutateAsync: updateSourceDefinition } = useUpdateSourceDefinition();
const { mutateAsync: updateDestinationDefinition } = useUpdateDestinationDefinition();

const newSourceDefinitions = useMemo(() => sourceDefinitions.filter(Connector.hasNewerVersion), [sourceDefinitions]);

const newDestinationDefinitions = useMemo(
() => destinationDefinitions.filter(Connector.hasNewerVersion),
[destinationDefinitions]
);

const updateAllSourceVersions = async () => {
await Promise.all(
newSourceDefinitions?.map((item) =>
Expand All @@ -51,6 +34,18 @@ const useConnector = (): ConnectorService => {
);
};

return { updateAllSourceVersions };
};

export const useUpdateDestinationDefinitions = () => {
const { destinationDefinitions } = useDestinationDefinitionList();
const { mutateAsync: updateDestinationDefinition } = useUpdateDestinationDefinition();

const newDestinationDefinitions = useMemo(
() => destinationDefinitions.filter(Connector.hasNewerVersion),
[destinationDefinitions]
);

const updateAllDestinationVersions = async () => {
await Promise.all(
newDestinationDefinitions?.map((item) =>
Expand All @@ -62,18 +57,23 @@ const useConnector = (): ConnectorService => {
);
};

const hasNewSourceVersion = newSourceDefinitions.length > 0;
const hasNewDestinationVersion = newDestinationDefinitions.length > 0;
return { updateAllDestinationVersions };
};

export const useGetConnectorsOutOfDate = () => {
const outOfDateConnectors = useGetOutOfDateConnectorsCount();

const hasNewSourceVersion = outOfDateConnectors.sourceDefinitions > 0;
const hasNewDestinationVersion = outOfDateConnectors.destinationDefinitions > 0;
const hasNewVersions = hasNewSourceVersion || hasNewDestinationVersion;

return {
hasNewVersions,
hasNewSourceVersion,
hasNewDestinationVersion,
updateAllSourceVersions,
updateAllDestinationVersions,
countNewSourceVersion: newSourceDefinitions.length,
countNewDestinationVersion: newDestinationDefinitions.length,
countNewSourceVersion: outOfDateConnectors.sourceDefinitions,
countNewDestinationVersion: outOfDateConnectors.destinationDefinitions,
outOfDateConnectors,
};
};

Expand Down Expand Up @@ -151,5 +151,3 @@ export const useCheckConnector = (formType: "source" | "destination") => {
});
});
};

export default useConnector;
4 changes: 2 additions & 2 deletions airbyte-webapp/src/pages/SettingsPage/SettingsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import LoadingPage from "components/LoadingPage";
import { PageHeader } from "components/ui/PageHeader";
import { SideMenu, CategoryItem, SideMenuItem } from "components/ui/SideMenu";

import useConnector from "hooks/services/useConnector";
import { useGetConnectorsOutOfDate } from "hooks/services/useConnector";

import AccountPage from "./pages/AccountPage";
import ConfigurationsPage from "./pages/ConfigurationsPage";
Expand Down Expand Up @@ -38,7 +38,7 @@ export const SettingsRoute = {
const SettingsPage: React.FC<SettingsPageProps> = ({ pageConfig }) => {
const push = useNavigate();
const { pathname } = useLocation();
const { countNewSourceVersion, countNewDestinationVersion } = useConnector();
const { countNewSourceVersion, countNewDestinationVersion } = useGetConnectorsOutOfDate();

const menuItems: CategoryItem[] = pageConfig?.menuConfig || [
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { useAsyncFn } from "react-use";

import { DestinationDefinitionRead } from "core/request/AirbyteClient";
import { useTrackPage, PageTrackingCodes } from "hooks/services/Analytics";
import useConnector from "hooks/services/useConnector";
import { useGetConnectorsOutOfDate, useUpdateDestinationDefinitions } from "hooks/services/useConnector";
import {
useDestinationDefinitionList,
useUpdateDestinationDefinition,
Expand All @@ -25,7 +25,7 @@ const DestinationsPage: React.FC = () => {

const { mutateAsync: updateDestinationDefinition } = useUpdateDestinationDefinition();

const { hasNewDestinationVersion } = useConnector();
const { hasNewDestinationVersion } = useGetConnectorsOutOfDate();

const onUpdateVersion = useCallback(
async ({ id, version }: { id: string; version: string }) => {
Expand Down Expand Up @@ -61,7 +61,7 @@ const DestinationsPage: React.FC = () => {
return Array.from(destinationDefinitionMap.values());
}, [destinations, destinationDefinitions]);

const { updateAllDestinationVersions } = useConnector();
const { updateAllDestinationVersions } = useUpdateDestinationDefinitions();

const [{ loading, error }, onUpdate] = useAsyncFn(async () => {
setIsUpdateSuccess(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { useAsyncFn } from "react-use";

import { SourceDefinitionRead } from "core/request/AirbyteClient";
import { useTrackPage, PageTrackingCodes } from "hooks/services/Analytics";
import useConnector from "hooks/services/useConnector";
import { useGetConnectorsOutOfDate, useUpdateSourceDefinitions } from "hooks/services/useConnector";
import { useSourceList } from "hooks/services/useSourceHook";
import { useSourceDefinitionList, useUpdateSourceDefinition } from "services/connector/SourceDefinitionService";

Expand All @@ -13,7 +13,7 @@ import ConnectorsView from "./components/ConnectorsView";
const SourcesPage: React.FC = () => {
useTrackPage(PageTrackingCodes.SETTINGS_SOURCE);

const [isUpdateSuccess, setIsUpdateSucces] = useState(false);
const [isUpdateSuccess, setIsUpdateSuccess] = useState(false);
const [feedbackList, setFeedbackList] = useState<Record<string, string>>({});

const { formatMessage } = useIntl();
Expand All @@ -22,7 +22,8 @@ const SourcesPage: React.FC = () => {

const { mutateAsync: updateSourceDefinition } = useUpdateSourceDefinition();

const { hasNewSourceVersion, updateAllSourceVersions } = useConnector();
const { hasNewSourceVersion } = useGetConnectorsOutOfDate();
const { updateAllSourceVersions } = useUpdateSourceDefinitions();

const onUpdateVersion = useCallback(
async ({ id, version }: { id: string; version: string }) => {
Expand Down Expand Up @@ -59,11 +60,11 @@ const SourcesPage: React.FC = () => {
}, [sources, sourceDefinitions]);

const [{ loading, error }, onUpdate] = useAsyncFn(async () => {
setIsUpdateSucces(false);
setIsUpdateSuccess(false);
await updateAllSourceVersions();
setIsUpdateSucces(true);
setIsUpdateSuccess(true);
setTimeout(() => {
setIsUpdateSucces(false);
setIsUpdateSuccess(false);
}, 2000);
}, [updateAllSourceVersions]);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,13 +112,14 @@ const ConnectorsView: React.FC<ConnectorsViewProps> = ({
onChange={onUpdateVersion}
feedback={feedbackList[Connector.id(row.original)]}
currentVersion={row.original.dockerImageTag}
updating={loading}
/>
) : null,
},
]
: []),
],
[feedbackList, onUpdateVersion, allowUpdateConnectors, allowUploadCustomImage]
[allowUpdateConnectors, allowUploadCustomImage, onUpdateVersion, feedbackList, loading]
);

const renderHeaderControls = (section: "used" | "available") =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@ import { DEV_IMAGE_TAG } from "core/domain/connector/constants";

import { FormContent } from "./PageComponents";

interface IProps {
interface VersionCellProps {
version: string;
currentVersion: string;
id: string;
onChange: ({ version, id }: { version: string; id: string }) => void;
feedback?: "success" | string;
updating: boolean;
}

const VersionInput = styled(Input)`
Expand Down Expand Up @@ -64,7 +65,7 @@ const ErrorMessage = styled(SuccessMessage)`
line-height: 14px;
`;

const VersionCell: React.FC<IProps> = ({ id, version, onChange, feedback, currentVersion }) => {
const VersionCell: React.FC<VersionCellProps> = ({ id, version, onChange, feedback, currentVersion, updating }) => {
const { formatMessage } = useIntl();

const renderFeedback = (dirty: boolean, feedback?: string) => {
Expand Down Expand Up @@ -109,7 +110,7 @@ const VersionCell: React.FC<IProps> = ({ id, version, onChange, feedback, curren
</Field>
<Button
size="xs"
isLoading={isSubmitting}
isLoading={isSubmitting || updating}
type="submit"
disabled={(isSubmitting || !dirty) && !isConnectorUpdatable}
>
Expand Down
7 changes: 7 additions & 0 deletions airbyte-webapp/src/services/connector/ConnectorDefinitions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { DestinationDefinitionRead, SourceDefinitionRead } from "core/request/Ai
import { SCOPE_WORKSPACE } from "services/Scope";
import { useCurrentWorkspaceId } from "services/workspaces/WorkspacesService";

import { useConnectorService } from "./ConnectorService";
import { useGetDestinationDefinitionService } from "./DestinationDefinitionService";
import { useGetSourceDefinitionService } from "./SourceDefinitionService";
import { useSuspenseQuery } from "./useSuspenseQuery";
Expand All @@ -14,6 +15,7 @@ interface ConnectorSpecifications {
export const connectorDefinitionKeys = {
all: [SCOPE_WORKSPACE, "connectorDefinition"] as const,
lists: () => [...connectorDefinitionKeys.all, "list"] as const,
count: () => [...connectorDefinitionKeys.all, "count"] as const,
};

/**
Expand All @@ -36,3 +38,8 @@ export const useConnectorSpecifications = (): ConnectorSpecifications => {
return { sourceDefinitions, destinationDefinitions };
});
};

export const useGetOutOfDateConnectorsCount = () => {
const service = useConnectorService();
return useSuspenseQuery(connectorDefinitionKeys.count(), () => service.checkUpdates());
};
19 changes: 19 additions & 0 deletions airbyte-webapp/src/services/connector/ConnectorService.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { useConfig } from "config";
import { webBackendCheckUpdates } from "core/request/AirbyteClient";
import { AirbyteRequestService } from "core/request/AirbyteRequestService";
import { useDefaultRequestMiddlewares } from "services/useDefaultRequestMiddlewares";
import { useInitService } from "services/useInitService";

class ConnectorService extends AirbyteRequestService {
checkUpdates() {
return webBackendCheckUpdates(this.requestOptions);
}
}

export function useConnectorService() {
const { apiUrl } = useConfig();

const requestAuthMiddleware = useDefaultRequestMiddlewares();

return useInitService(() => new ConnectorService(apiUrl, requestAuthMiddleware), [apiUrl, requestAuthMiddleware]);
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { isDefined } from "utils/common";

import { DestinationDefinitionCreate, DestinationDefinitionRead } from "../../core/request/AirbyteClient";
import { SCOPE_WORKSPACE } from "../Scope";
import { connectorDefinitionKeys } from "./ConnectorDefinitions";
import { useSuspenseQuery } from "./useSuspenseQuery";

export const destinationDefinitionKeys = {
Expand Down Expand Up @@ -117,6 +118,8 @@ const useUpdateDestinationDefinition = () => {
) ?? [],
})
);

queryClient.invalidateQueries(connectorDefinitionKeys.count());
},
});
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { isDefined } from "utils/common";

import { SourceDefinitionCreate, SourceDefinitionRead } from "../../core/request/AirbyteClient";
import { SCOPE_WORKSPACE } from "../Scope";
import { connectorDefinitionKeys } from "./ConnectorDefinitions";
import { useSuspenseQuery } from "./useSuspenseQuery";

export const sourceDefinitionKeys = {
Expand Down Expand Up @@ -114,6 +115,8 @@ const useUpdateSourceDefinition = () => {
[],
})
);

queryClient.invalidateQueries(connectorDefinitionKeys.count());
},
});
};
Expand Down
Loading

0 comments on commit b776a2d

Please sign in to comment.