
* Add schema type select to the form * Implement adding new version of a schema * Fix some issues & Increase test coverage * Add more tests * Add compatibility level update * Abstract updating schema into a separate thunk & test it * Remove warnings and skipped test * Update failed tests * Update failing tests * Update markup * Make the JSONEditor a part of the form * Fix linting problem * Fix errors
151 lines
4.3 KiB
TypeScript
151 lines
4.3 KiB
TypeScript
import {
|
|
SchemasApi,
|
|
Configuration,
|
|
NewSchemaSubject,
|
|
SchemaSubject,
|
|
CompatibilityLevelCompatibilityEnum,
|
|
SchemaType,
|
|
} from 'generated-sources';
|
|
import {
|
|
PromiseThunkResult,
|
|
ClusterName,
|
|
SchemaName,
|
|
FailurePayload,
|
|
} from 'redux/interfaces';
|
|
import { BASE_PARAMS } from 'lib/constants';
|
|
import * as actions from 'redux/actions';
|
|
import { getResponse } from 'lib/errorHandling';
|
|
import { isEqual } from 'lodash';
|
|
|
|
const apiClientConf = new Configuration(BASE_PARAMS);
|
|
export const schemasApiClient = new SchemasApi(apiClientConf);
|
|
|
|
export const fetchSchemasByClusterName = (
|
|
clusterName: ClusterName
|
|
): PromiseThunkResult<void> => async (dispatch) => {
|
|
dispatch(actions.fetchSchemasByClusterNameAction.request());
|
|
try {
|
|
const schemas = await schemasApiClient.getSchemas({ clusterName });
|
|
dispatch(actions.fetchSchemasByClusterNameAction.success(schemas));
|
|
} catch (e) {
|
|
dispatch(actions.fetchSchemasByClusterNameAction.failure());
|
|
}
|
|
};
|
|
|
|
export const fetchSchemaVersions = (
|
|
clusterName: ClusterName,
|
|
subject: SchemaName
|
|
): PromiseThunkResult<void> => async (dispatch) => {
|
|
if (!subject) return;
|
|
dispatch(actions.fetchSchemaVersionsAction.request());
|
|
try {
|
|
const versions = await schemasApiClient.getAllVersionsBySubject({
|
|
clusterName,
|
|
subject,
|
|
});
|
|
dispatch(actions.fetchSchemaVersionsAction.success(versions));
|
|
} catch (e) {
|
|
dispatch(actions.fetchSchemaVersionsAction.failure());
|
|
}
|
|
};
|
|
|
|
export const createSchema = (
|
|
clusterName: ClusterName,
|
|
newSchemaSubject: NewSchemaSubject
|
|
): PromiseThunkResult => async (dispatch) => {
|
|
dispatch(actions.createSchemaAction.request());
|
|
try {
|
|
const schema: SchemaSubject = await schemasApiClient.createNewSchema({
|
|
clusterName,
|
|
newSchemaSubject,
|
|
});
|
|
dispatch(actions.createSchemaAction.success(schema));
|
|
} catch (error) {
|
|
const response = await getResponse(error);
|
|
const alert: FailurePayload = {
|
|
subject: ['schema', newSchemaSubject.subject].join('-'),
|
|
title: `Schema ${newSchemaSubject.subject}`,
|
|
response,
|
|
};
|
|
dispatch(actions.createSchemaAction.failure({ alert }));
|
|
}
|
|
};
|
|
|
|
export const updateSchemaCompatibilityLevel = (
|
|
clusterName: ClusterName,
|
|
subject: string,
|
|
compatibilityLevel: CompatibilityLevelCompatibilityEnum
|
|
): PromiseThunkResult => async (dispatch) => {
|
|
dispatch(actions.updateSchemaCompatibilityLevelAction.request());
|
|
try {
|
|
await schemasApiClient.updateSchemaCompatibilityLevel({
|
|
clusterName,
|
|
subject,
|
|
compatibilityLevel: {
|
|
compatibility: compatibilityLevel,
|
|
},
|
|
});
|
|
dispatch(actions.updateSchemaCompatibilityLevelAction.success());
|
|
} catch (error) {
|
|
const response = await getResponse(error);
|
|
const alert: FailurePayload = {
|
|
subject: 'compatibilityLevel',
|
|
title: `Compatibility level ${subject}`,
|
|
response,
|
|
};
|
|
dispatch(actions.updateSchemaCompatibilityLevelAction.failure({ alert }));
|
|
}
|
|
};
|
|
|
|
export const updateSchema = (
|
|
latestSchema: SchemaSubject,
|
|
newSchema: string,
|
|
newSchemaType: SchemaType,
|
|
newCompatibilityLevel: CompatibilityLevelCompatibilityEnum,
|
|
clusterName: string,
|
|
subject: string
|
|
): PromiseThunkResult => async (dispatch) => {
|
|
if (
|
|
(newSchema &&
|
|
!isEqual(JSON.parse(latestSchema.schema), JSON.parse(newSchema))) ||
|
|
newSchemaType !== latestSchema.schemaType
|
|
) {
|
|
await dispatch(
|
|
createSchema(clusterName, {
|
|
...latestSchema,
|
|
schema: newSchema || latestSchema.schema,
|
|
schemaType: newSchemaType || latestSchema.schemaType,
|
|
})
|
|
);
|
|
}
|
|
if (newCompatibilityLevel !== latestSchema.compatibilityLevel) {
|
|
await dispatch(
|
|
updateSchemaCompatibilityLevel(
|
|
clusterName,
|
|
subject,
|
|
newCompatibilityLevel
|
|
)
|
|
);
|
|
}
|
|
};
|
|
export const deleteSchema = (
|
|
clusterName: ClusterName,
|
|
subject: string
|
|
): PromiseThunkResult => async (dispatch) => {
|
|
dispatch(actions.deleteSchemaAction.request());
|
|
try {
|
|
await schemasApiClient.deleteSchema({
|
|
clusterName,
|
|
subject,
|
|
});
|
|
dispatch(actions.deleteSchemaAction.success(subject));
|
|
} catch (error) {
|
|
const response = await getResponse(error);
|
|
const alert: FailurePayload = {
|
|
subject: ['schema', subject].join('-'),
|
|
title: `Schema ${subject}`,
|
|
response,
|
|
};
|
|
dispatch(actions.deleteSchemaAction.failure({ alert }));
|
|
}
|
|
};
|