API: Add Compliance API slice

This commit adds the Compliance service's API, which we can query for a
list of SCAP security policies.

In a follow-up PR, we will allow the user to optionally select a policy
when creating an image in the wizard.
This commit is contained in:
lucasgarfield 2023-09-28 13:49:46 +02:00 committed by Lucas Garfield
parent c7ef446fdb
commit 36f9e70565
8 changed files with 65 additions and 0 deletions

View file

@ -1,5 +1,6 @@
# Ignore programatically generated API slices
imageBuilderApi.ts
complianceApi.ts
contentSourcesApi.ts
rhsmApi.ts
provisioningApi.ts

1
api.sh
View file

@ -6,6 +6,7 @@ npx @rtk-query/codegen-openapi ./api/config/rhsm.ts &
npx @rtk-query/codegen-openapi ./api/config/contentSources.ts &
npx @rtk-query/codegen-openapi ./api/config/provisioning.ts &
npx @rtk-query/codegen-openapi ./api/config/edge.ts &
npx @rtk-query/codegen-openapi ./api/config/compliance.ts &
# Wait for all background jobs to finish
wait

13
api/config/compliance.ts Normal file
View file

@ -0,0 +1,13 @@
import type { ConfigFile } from '@rtk-query/codegen-openapi';
const config: ConfigFile = {
schemaFile: '../schema/compliance.json',
apiFile: '../../src/store/emptyComplianceApi.ts',
apiImport: 'emptyComplianceApi',
outputFile: '../../src/store/complianceApi.ts',
exportName: 'complianceApi',
hooks: true,
filterEndpoints: ['listProfiles'],
};
export default config;

File diff suppressed because one or more lines are too long

View file

@ -1,3 +1,4 @@
export const COMPLIANCE_API = '/api/compliance/v1';
export const IMAGE_BUILDER_API = '/api/image-builder/v1';
export const RHSM_API = '/api/rhsm/v2';
export const EDGE_API = '/api/edge/v1';

View file

@ -0,0 +1,35 @@
import { emptyComplianceApi as api } from "./emptyComplianceApi";
const injectedRtkApi = api.injectEndpoints({
endpoints: (build) => ({
listProfiles: build.query<ListProfilesApiResponse, ListProfilesApiArg>({
query: (queryArg) => ({
url: `/profiles`,
headers: { "X-RH-IDENTITY": queryArg["X-RH-IDENTITY"] },
params: {
limit: queryArg.limit,
offset: queryArg.offset,
search: queryArg.search,
sort_by: queryArg.sortBy,
include: queryArg.include,
},
}),
}),
}),
overrideExisting: false,
});
export { injectedRtkApi as complianceApi };
export type ListProfilesApiResponse = unknown;
export type ListProfilesApiArg = {
"X-RH-IDENTITY"?: string;
/** The number of items to return */
limit?: number;
/** The number of items to skip before starting to collect the result set */
offset?: number;
/** Query string compliant with scoped_search query language: https://github.com/wvanbergen/scoped_search/wiki/Query-language */
search?: string;
/** A string or an array of fields with an optional direction (:asc or :desc) to sort the results. */
sortBy?: string[] | string;
/** A comma seperated list of resources to include in the response */
include?: string;
};
export const { useListProfilesQuery } = injectedRtkApi;

View file

@ -0,0 +1,10 @@
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
import { COMPLIANCE_API } from '../constants';
// initialize an empty api service that we'll inject endpoints into later as needed
export const emptyComplianceApi = createApi({
reducerPath: 'complianceApi',
baseQuery: fetchBaseQuery({ baseUrl: COMPLIANCE_API }),
endpoints: () => ({}),
});

View file

@ -3,6 +3,7 @@ import { configureStore } from '@reduxjs/toolkit';
import promiseMiddleware from 'redux-promise-middleware';
import clonesSlice from './clonesSlice';
import { complianceApi } from './complianceApi';
import composesSlice from './composesSlice';
import { contentSourcesApi } from './contentSourcesApi';
import { edgeApi } from './edgeApi';
@ -13,6 +14,7 @@ import { rhsmApi } from './rhsmApi';
export const reducer = {
clones: clonesSlice,
composes: composesSlice,
[complianceApi.reducerPath]: complianceApi.reducer,
[contentSourcesApi.reducerPath]: contentSourcesApi.reducer,
[edgeApi.reducerPath]: edgeApi.reducer,
[imageBuilderApi.reducerPath]: imageBuilderApi.reducer,
@ -24,6 +26,7 @@ export const reducer = {
export const middleware = (getDefaultMiddleware: Function) =>
getDefaultMiddleware().concat(
promiseMiddleware,
complianceApi.middleware,
contentSourcesApi.middleware,
imageBuilderApi.middleware,
rhsmApi.middleware,