|
@@ -4,7 +4,14 @@ import {
|
|
createSelector,
|
|
createSelector,
|
|
createSlice,
|
|
createSlice,
|
|
} from '@reduxjs/toolkit';
|
|
} from '@reduxjs/toolkit';
|
|
-import { Configuration, SchemasApi, SchemaSubject } from 'generated-sources';
|
|
|
|
|
|
+import {
|
|
|
|
+ Configuration,
|
|
|
|
+ SchemasApi,
|
|
|
|
+ SchemaSubject,
|
|
|
|
+ SchemaSubjectsResponse,
|
|
|
|
+ GetSchemasRequest,
|
|
|
|
+ GetLatestSchemaRequest,
|
|
|
|
+} from 'generated-sources';
|
|
import { BASE_PARAMS } from 'lib/constants';
|
|
import { BASE_PARAMS } from 'lib/constants';
|
|
import { getResponse } from 'lib/errorHandling';
|
|
import { getResponse } from 'lib/errorHandling';
|
|
import { ClusterName, RootState } from 'redux/interfaces';
|
|
import { ClusterName, RootState } from 'redux/interfaces';
|
|
@@ -13,21 +20,44 @@ import { createFetchingSelector } from 'redux/reducers/loader/selectors';
|
|
const apiClientConf = new Configuration(BASE_PARAMS);
|
|
const apiClientConf = new Configuration(BASE_PARAMS);
|
|
export const schemasApiClient = new SchemasApi(apiClientConf);
|
|
export const schemasApiClient = new SchemasApi(apiClientConf);
|
|
|
|
|
|
-export const fetchSchemas = createAsyncThunk<SchemaSubject[], ClusterName>(
|
|
|
|
- 'schemas/fetch',
|
|
|
|
- async (clusterName: ClusterName, { rejectWithValue }) => {
|
|
|
|
|
|
+export const SCHEMA_LATEST_FETCH_ACTION = 'schemas/latest/fetch';
|
|
|
|
+export const fetchLatestSchema = createAsyncThunk<
|
|
|
|
+ SchemaSubject,
|
|
|
|
+ GetLatestSchemaRequest
|
|
|
|
+>(SCHEMA_LATEST_FETCH_ACTION, async (schemaParams, { rejectWithValue }) => {
|
|
|
|
+ try {
|
|
|
|
+ return await schemasApiClient.getLatestSchema(schemaParams);
|
|
|
|
+ } catch (error) {
|
|
|
|
+ return rejectWithValue(await getResponse(error as Response));
|
|
|
|
+ }
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+export const SCHEMAS_FETCH_ACTION = 'schemas/fetch';
|
|
|
|
+export const fetchSchemas = createAsyncThunk<
|
|
|
|
+ SchemaSubjectsResponse,
|
|
|
|
+ GetSchemasRequest
|
|
|
|
+>(
|
|
|
|
+ SCHEMAS_FETCH_ACTION,
|
|
|
|
+ async ({ clusterName, page, perPage, search }, { rejectWithValue }) => {
|
|
try {
|
|
try {
|
|
- return await schemasApiClient.getSchemas({ clusterName });
|
|
|
|
|
|
+ return await schemasApiClient.getSchemas({
|
|
|
|
+ clusterName,
|
|
|
|
+ page,
|
|
|
|
+ perPage,
|
|
|
|
+ search: search || undefined,
|
|
|
|
+ });
|
|
} catch (error) {
|
|
} catch (error) {
|
|
return rejectWithValue(await getResponse(error as Response));
|
|
return rejectWithValue(await getResponse(error as Response));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
);
|
|
);
|
|
|
|
+
|
|
|
|
+export const SCHEMAS_VERSIONS_FETCH_ACTION = 'schemas/versions/fetch';
|
|
export const fetchSchemaVersions = createAsyncThunk<
|
|
export const fetchSchemaVersions = createAsyncThunk<
|
|
SchemaSubject[],
|
|
SchemaSubject[],
|
|
{ clusterName: ClusterName; subject: SchemaSubject['subject'] }
|
|
{ clusterName: ClusterName; subject: SchemaSubject['subject'] }
|
|
>(
|
|
>(
|
|
- 'schemas/versions/fetch',
|
|
|
|
|
|
+ SCHEMAS_VERSIONS_FETCH_ACTION,
|
|
async ({ clusterName, subject }, { rejectWithValue }) => {
|
|
async ({ clusterName, subject }, { rejectWithValue }) => {
|
|
try {
|
|
try {
|
|
return await schemasApiClient.getAllVersionsBySubject({
|
|
return await schemasApiClient.getAllVersionsBySubject({
|
|
@@ -48,18 +78,31 @@ const schemasAdapter = createEntityAdapter<SchemaSubject>({
|
|
selectId: ({ subject }) => subject,
|
|
selectId: ({ subject }) => subject,
|
|
});
|
|
});
|
|
|
|
|
|
|
|
+const SCHEMAS_PAGE_COUNT = 1;
|
|
|
|
+
|
|
|
|
+const initialState = {
|
|
|
|
+ totalPages: SCHEMAS_PAGE_COUNT,
|
|
|
|
+ ...schemasAdapter.getInitialState(),
|
|
|
|
+ versions: {
|
|
|
|
+ ...schemaVersionsAdapter.getInitialState(),
|
|
|
|
+ latest: <SchemaSubject | null>null,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
const schemasSlice = createSlice({
|
|
const schemasSlice = createSlice({
|
|
name: 'schemas',
|
|
name: 'schemas',
|
|
- initialState: schemasAdapter.getInitialState({
|
|
|
|
- versions: schemaVersionsAdapter.getInitialState(),
|
|
|
|
- }),
|
|
|
|
|
|
+ initialState,
|
|
reducers: {
|
|
reducers: {
|
|
schemaAdded: schemasAdapter.addOne,
|
|
schemaAdded: schemasAdapter.addOne,
|
|
schemaUpdated: schemasAdapter.upsertOne,
|
|
schemaUpdated: schemasAdapter.upsertOne,
|
|
},
|
|
},
|
|
extraReducers: (builder) => {
|
|
extraReducers: (builder) => {
|
|
builder.addCase(fetchSchemas.fulfilled, (state, { payload }) => {
|
|
builder.addCase(fetchSchemas.fulfilled, (state, { payload }) => {
|
|
- schemasAdapter.setAll(state, payload);
|
|
|
|
|
|
+ state.totalPages = payload.pageCount || SCHEMAS_PAGE_COUNT;
|
|
|
|
+ schemasAdapter.setAll(state, payload.schemas || []);
|
|
|
|
+ });
|
|
|
|
+ builder.addCase(fetchLatestSchema.fulfilled, (state, { payload }) => {
|
|
|
|
+ state.versions.latest = payload;
|
|
});
|
|
});
|
|
builder.addCase(fetchSchemaVersions.fulfilled, (state, { payload }) => {
|
|
builder.addCase(fetchSchemaVersions.fulfilled, (state, { payload }) => {
|
|
schemaVersionsAdapter.setAll(state.versions, payload);
|
|
schemaVersionsAdapter.setAll(state.versions, payload);
|
|
@@ -70,19 +113,32 @@ const schemasSlice = createSlice({
|
|
export const { selectAll: selectAllSchemas, selectById: selectSchemaById } =
|
|
export const { selectAll: selectAllSchemas, selectById: selectSchemaById } =
|
|
schemasAdapter.getSelectors<RootState>((state) => state.schemas);
|
|
schemasAdapter.getSelectors<RootState>((state) => state.schemas);
|
|
|
|
|
|
-export const { selectAll: selectAllSchemaVersions } =
|
|
|
|
- schemaVersionsAdapter.getSelectors<RootState>(
|
|
|
|
- (state) => state.schemas.versions
|
|
|
|
- );
|
|
|
|
|
|
+export const {
|
|
|
|
+ selectAll: selectAllSchemaVersions,
|
|
|
|
+ selectById: selectVersionSchemaByID,
|
|
|
|
+} = schemaVersionsAdapter.getSelectors<RootState>(
|
|
|
|
+ (state) => state.schemas.versions
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+const getSchemaVersions = (state: RootState) => state.schemas.versions;
|
|
|
|
+export const getSchemaLatest = createSelector(
|
|
|
|
+ getSchemaVersions,
|
|
|
|
+ (state) => state.latest
|
|
|
|
+);
|
|
|
|
|
|
export const { schemaAdded, schemaUpdated } = schemasSlice.actions;
|
|
export const { schemaAdded, schemaUpdated } = schemasSlice.actions;
|
|
|
|
|
|
export const getAreSchemasFulfilled = createSelector(
|
|
export const getAreSchemasFulfilled = createSelector(
|
|
- createFetchingSelector('schemas/fetch'),
|
|
|
|
|
|
+ createFetchingSelector(SCHEMAS_FETCH_ACTION),
|
|
|
|
+ (status) => status === 'fulfilled'
|
|
|
|
+);
|
|
|
|
+
|
|
|
|
+export const getAreSchemaLatestFulfilled = createSelector(
|
|
|
|
+ createFetchingSelector(SCHEMA_LATEST_FETCH_ACTION),
|
|
(status) => status === 'fulfilled'
|
|
(status) => status === 'fulfilled'
|
|
);
|
|
);
|
|
export const getAreSchemaVersionsFulfilled = createSelector(
|
|
export const getAreSchemaVersionsFulfilled = createSelector(
|
|
- createFetchingSelector('schemas/versions/fetch'),
|
|
|
|
|
|
+ createFetchingSelector(SCHEMAS_VERSIONS_FETCH_ACTION),
|
|
(status) => status === 'fulfilled'
|
|
(status) => status === 'fulfilled'
|
|
);
|
|
);
|
|
|
|
|