Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion client/scripts/update_api_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ import { parseDocument } from "yaml";

const GH_BASE_URL = "https://raw.githubusercontent.com";
const DATA_SERVICES_REPO = "SwissDataScienceCenter/renku-data-services";
const DATA_SERVICES_RELEASE = "main";
const DATA_SERVICES_RELEASE =
"build/pagination-for-get-data-connector-project-links";

async function main() {
argv.forEach((arg) => {
Expand Down
25 changes: 23 additions & 2 deletions client/src/features/dataConnectorsV2/api/data-connectors.api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,15 @@ const injectedRtkApi = api.injectEndpoints({
body: queryArg.globalDataConnectorPost,
}),
}),
getDataConnectorsSearch: build.query<
GetDataConnectorsSearchApiResponse,
GetDataConnectorsSearchApiArg
>({
query: (queryArg) => ({
url: `/data_connectors/search`,
params: { doi: queryArg.doi },
}),
}),
getDataConnectorsByDataConnectorId: build.query<
GetDataConnectorsByDataConnectorIdApiResponse,
GetDataConnectorsByDataConnectorIdApiArg
Expand Down Expand Up @@ -97,6 +106,7 @@ const injectedRtkApi = api.injectEndpoints({
>({
query: (queryArg) => ({
url: `/data_connectors/${queryArg.dataConnectorId}/project_links`,
params: { params: queryArg.params },
}),
}),
postDataConnectorsByDataConnectorIdProjectLinks: build.mutation<
Expand Down Expand Up @@ -183,6 +193,12 @@ export type PostDataConnectorsGlobalApiResponse =
export type PostDataConnectorsGlobalApiArg = {
globalDataConnectorPost: GlobalDataConnectorPost;
};
export type GetDataConnectorsSearchApiResponse =
/** status 200 The data connector */ DataConnectorRead;
export type GetDataConnectorsSearchApiArg = {
/** The DOI of the data connector */
doi: Doi;
};
export type GetDataConnectorsByDataConnectorIdApiResponse =
/** status 200 The data connector */ DataConnectorRead;
export type GetDataConnectorsByDataConnectorIdApiArg = {
Expand Down Expand Up @@ -232,13 +248,15 @@ export type GetDataConnectorsByDataConnectorIdPermissionsApiArg = {
export type GetDataConnectorsByDataConnectorIdProjectLinksApiResponse =
/** status 200 List of data connector to project links */ DataConnectorToProjectLinksList;
export type GetDataConnectorsByDataConnectorIdProjectLinksApiArg = {
/** the ID of the data connector */
/** the ID of the data connector that can be ULID or DOI */
dataConnectorId: Ulid;
/** query parameters */
params?: PaginationRequest;
};
export type PostDataConnectorsByDataConnectorIdProjectLinksApiResponse =
/** status 201 The data connector was connected to a project */ DataConnectorToProjectLink;
export type PostDataConnectorsByDataConnectorIdProjectLinksApiArg = {
/** the ID of the data connector */
/** the ID of the data connector that can be ULID or DOI */
dataConnectorId: Ulid;
dataConnectorToProjectLinkPost: DataConnectorToProjectLinkPost;
};
Expand Down Expand Up @@ -502,10 +520,12 @@ export type DataConnectorPermissions = {
/** The user can manage data connector members */
change_membership?: boolean;
};
export type ProjectPath = string;
export type DataConnectorToProjectLink = {
id: Ulid;
data_connector_id: Ulid;
project_id: Ulid;
project_path: ProjectPath;
creation_date: CreationDate;
created_by: UserId;
};
Expand Down Expand Up @@ -533,6 +553,7 @@ export const {
useGetDataConnectorsQuery,
usePostDataConnectorsMutation,
usePostDataConnectorsGlobalMutation,
useGetDataConnectorsSearchQuery,
useGetDataConnectorsByDataConnectorIdQuery,
usePatchDataConnectorsByDataConnectorIdMutation,
useDeleteDataConnectorsByDataConnectorIdMutation,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
import { processPaginationHeaders } from "../../../utils/helpers/kgPagination.utils";
import { AbstractKgPaginatedResponse } from "../../../utils/types/pagination.types";
import { processApiPaginationHeaders } from "~/utils/helpers/pagination.utils";
import {
DataConnectorsPaginated,
DataConnectorToProjectLinksPaginated,
} from "../dataConnectors.types";
import type {
GetDataConnectorsApiArg,
GetDataConnectorsApiResponse as GetDataConnectorsApiResponseOrig,
GetDataConnectorsApiResponse,
GetDataConnectorsByDataConnectorIdApiArg,
GetDataConnectorsByDataConnectorIdApiResponse,
GetDataConnectorsByDataConnectorIdProjectLinksApiArg,
GetDataConnectorsByDataConnectorIdProjectLinksApiResponse,
GetDataConnectorsByDataConnectorIdSecretsApiArg,
GetDataConnectorsByDataConnectorIdSecretsApiResponse,
} from "./data-connectors.api";
import { dataConnectorsApi as api } from "./data-connectors.api";

export interface GetDataConnectorsApiResponse
extends AbstractKgPaginatedResponse {
dataConnectors: GetDataConnectorsApiResponseOrig;
}

interface GetDataConnectorsListByDataConnectorIdsApiArg {
dataConnectorIds: GetDataConnectorsByDataConnectorIdApiArg["dataConnectorId"][];
}
Expand All @@ -33,40 +33,8 @@ type GetDataConnectorListSecretsApiResponse = Record<
GetDataConnectorsByDataConnectorIdSecretsApiResponse
>;

const injectedApi = api.injectEndpoints({
const withNewEndpoints = api.injectEndpoints({
endpoints: (builder) => ({
getDataConnectorsPaged: builder.query<
GetDataConnectorsApiResponse,
GetDataConnectorsApiArg
>({
query: (queryArg) => ({
url: "/data_connectors",
params: {
namespace: queryArg.params?.namespace,
page: queryArg.params?.page,
per_page: queryArg.params?.per_page,
},
}),
transformResponse: (response, meta, queryArg) => {
const dataConnectors = response as GetDataConnectorsApiResponseOrig;
const headers = meta?.response?.headers;
const headerResponse = processPaginationHeaders(
headers,
queryArg.params == null
? {}
: { page: queryArg.params.page, perPage: queryArg.params.per_page },
dataConnectors
);

return {
dataConnectors,
page: headerResponse.page,
perPage: headerResponse.perPage,
total: headerResponse.total,
totalPages: headerResponse.totalPages,
};
},
}),
getDataConnectorsListByDataConnectorIds: builder.query<
GetDataConnectorsListByDataConnectorIdsApiResponse,
GetDataConnectorsListByDataConnectorIdsApiArg
Expand Down Expand Up @@ -112,7 +80,57 @@ const injectedApi = api.injectEndpoints({
}),
});

const enhancedApi = injectedApi.enhanceEndpoints({
const withPagination = withNewEndpoints.injectEndpoints({
endpoints: (builder) => ({
getDataConnectors: builder.query<
DataConnectorsPaginated,
GetDataConnectorsApiArg
>({
query: (queryArg) => ({
url: "/data_connectors",
params: {
namespace: queryArg.params?.namespace,
page: queryArg.params?.page,
per_page: queryArg.params?.per_page,
},
}),
transformResponse: (data: GetDataConnectorsApiResponse, meta) => {
const headers = meta?.response?.headers;
const pagination = processApiPaginationHeaders(headers);
return {
data,
pagination,
};
},
}),
getDataConnectorsByDataConnectorIdProjectLinks: builder.query<
DataConnectorToProjectLinksPaginated,
GetDataConnectorsByDataConnectorIdProjectLinksApiArg
>({
query: ({ dataConnectorId, params }) => ({
url: `/data_connectors/${dataConnectorId}/project_links`,
params: {
page: params?.page,
per_page: params?.per_page,
},
}),
transformResponse: (
data: GetDataConnectorsByDataConnectorIdProjectLinksApiResponse,
meta
) => {
const headers = meta?.response?.headers;
const pagination = processApiPaginationHeaders(headers);
return {
data,
pagination,
};
},
}),
}),
overrideExisting: true,
});

const enhancedApi = withPagination.enhanceEndpoints({
addTagTypes: [
"DataConnectors",
"DataConnectorsProjectLinks",
Expand All @@ -128,7 +146,7 @@ const enhancedApi = injectedApi.enhanceEndpoints({
deleteDataConnectorsByDataConnectorIdSecrets: {
invalidatesTags: ["DataConnectorSecrets"],
},
getDataConnectorsPaged: {
getDataConnectors: {
providesTags: ["DataConnectors"],
},
getDataConnectorsByDataConnectorId: {
Expand Down Expand Up @@ -179,7 +197,7 @@ export const {
useDeleteDataConnectorsByDataConnectorIdMutation,
useDeleteDataConnectorsByDataConnectorIdProjectLinksAndLinkIdMutation,
useDeleteDataConnectorsByDataConnectorIdSecretsMutation,
useGetDataConnectorsPagedQuery: useGetDataConnectorsQuery,
useGetDataConnectorsQuery,
useGetDataConnectorsByDataConnectorIdQuery,
useGetDataConnectorsByDataConnectorIdProjectLinksQuery,
useGetDataConnectorsByDataConnectorIdSecretsQuery,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,48 @@
"tags": ["data_connectors"]
}
},
"/data_connectors/search": {
"get": {
"summary": "Get data connector details by DOI",
"parameters": [
{
"in": "query",
"name": "doi",
"required": true,
"schema": {
"$ref": "#/components/schemas/DOI"
},
"description": "The DOI of the data connector"
}
],
"responses": {
"200": {
"description": "The data connector",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DataConnector"
}
}
}
},
"404": {
"description": "The data connector with the given DOI does not exist or user does not have access to it",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"default": {
"$ref": "#/components/responses/Error"
}
},
"tags": ["data_connectors"]
}
},
"/data_connectors/{data_connector_id}": {
"parameters": [
{
Expand Down Expand Up @@ -440,11 +482,23 @@
"schema": {
"$ref": "#/components/schemas/Ulid"
},
"description": "the ID of the data connector"
"description": "the ID of the data connector that can be ULID or DOI"
}
],
"get": {
"summary": "Get all links from a given data connector to projects",
"parameters": [
{
"in": "query",
"description": "query parameters",
"name": "params",
"style": "form",
"explode": true,
"schema": {
"$ref": "#/components/schemas/PaginationRequest"
}
}
],
"responses": {
"200": {
"description": "List of data connector to project links",
Expand All @@ -454,6 +508,36 @@
"$ref": "#/components/schemas/DataConnectorToProjectLinksList"
}
}
},
"headers": {
"page": {
"description": "The index of the current page (starting at 1).",
"required": true,
"schema": {
"type": "integer"
}
},
"per-page": {
"description": "The number of items per page.",
"required": true,
"schema": {
"type": "integer"
}
},
"total": {
"description": "The total number of items.",
"required": true,
"schema": {
"type": "integer"
}
},
"total-pages": {
"description": "The total number of pages.",
"required": true,
"schema": {
"type": "integer"
}
}
}
},
"default": {
Expand Down Expand Up @@ -955,6 +1039,11 @@
"$ref": "#/components/schemas/DataConnectorToProjectLink"
}
},
"ProjectPath": {
"description": "The path to the project page",
"type": "string",
"example": "namespace/project-slug"
},
"DataConnectorToProjectLink": {
"description": "A link from a data connector to a project in Renku 2.0",
"type": "object",
Expand All @@ -969,6 +1058,9 @@
"project_id": {
"$ref": "#/components/schemas/Ulid"
},
"project_path": {
"$ref": "#/components/schemas/ProjectPath"
},
"creation_date": {
"$ref": "#/components/schemas/CreationDate"
},
Expand All @@ -980,6 +1072,7 @@
"id",
"data_connector_id",
"project_id",
"project_path",
"creation_date",
"created_by"
]
Expand Down
Loading
Loading