Skip to content

Commit

Permalink
SW-5719 Added redux for every application API call (#2913)
Browse files Browse the repository at this point in the history
  • Loading branch information
tommylau523 authored Jul 29, 2024
1 parent 88ce4d5 commit afb77a0
Show file tree
Hide file tree
Showing 5 changed files with 289 additions and 1 deletion.
122 changes: 122 additions & 0 deletions src/redux/features/application/applicationAsyncThunks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,38 @@ import { createAsyncThunk } from '@reduxjs/toolkit';

import ApplicationService from 'src/services/ApplicationService';
import strings from 'src/strings';
import { ApplicationReview } from 'src/types/Application';
import { MultiPolygon, Polygon } from 'src/types/Tracking';

export const requestCreateApplication = createAsyncThunk(
'applications/create',
async (request: { projectId: number }, { rejectWithValue }) => {
const { projectId } = request;

const response = await ApplicationService.createApplication(projectId);

if (response.requestSucceeded && response.data) {
return response.data.id;
}

return rejectWithValue(strings.GENERIC_ERROR);
}
);

export const requestCreateProjectApplication = createAsyncThunk(
'applications/createProject',
async (request: { projectName: string; organizationId: number }, { rejectWithValue }) => {
const { projectName, organizationId } = request;

const response = await ApplicationService.createProjectApplication(projectName, organizationId);

if (response.requestSucceeded && response.data) {
return response.data.id;
}

return rejectWithValue(strings.GENERIC_ERROR);
}
);

export const requestListApplications = createAsyncThunk(
'applications/list',
Expand Down Expand Up @@ -33,6 +65,21 @@ export const requestListApplicationDeliverables = createAsyncThunk(
}
);

export const requestListApplicationHistory = createAsyncThunk(
'applications/listHistory',
async (request: { applicationId: number }, { rejectWithValue }) => {
const { applicationId } = request;

const response = await ApplicationService.listApplicationHistory(applicationId);

if (response && response.requestSucceeded) {
return response.data?.history ?? [];
}

return rejectWithValue(strings.GENERIC_ERROR);
}
);

export const requestListApplicationModules = createAsyncThunk(
'applications/listModules',
async (request: { applicationId: number }, { rejectWithValue }) => {
Expand All @@ -47,3 +94,78 @@ export const requestListApplicationModules = createAsyncThunk(
return rejectWithValue(strings.GENERIC_ERROR);
}
);

export const requestRestartApplication = createAsyncThunk(
'applications/restart',
async (request: { applicationId: number }, { rejectWithValue }) => {
const { applicationId } = request;

const response = await ApplicationService.restartApplication(applicationId);

if (response && response.requestSucceeded) {
return response;
}

return rejectWithValue(strings.GENERIC_ERROR);
}
);

export const requestSubmitApplication = createAsyncThunk(
'applications/submit',
async (request: { applicationId: number }, { rejectWithValue }) => {
const { applicationId } = request;

const response = await ApplicationService.submitApplication(applicationId);

if (response && response.requestSucceeded) {
return response.data?.problems;
}

return rejectWithValue(strings.GENERIC_ERROR);
}
);

export const requestReviewApplication = createAsyncThunk(
'applications/review',
async (request: { applicationId: number; review: ApplicationReview }, { rejectWithValue }) => {
const { applicationId, review } = request;

const response = await ApplicationService.reviewApplication(applicationId, review);

if (response && response.requestSucceeded) {
return response;
}

return rejectWithValue(strings.GENERIC_ERROR);
}
);

export const requestUpdateApplicationBoundary = createAsyncThunk(
'applications/updateBoundary',
async (request: { applicationId: number; boundary: MultiPolygon | Polygon }, { rejectWithValue }) => {
const { applicationId, boundary } = request;

const response = await ApplicationService.updateBoundary(applicationId, { boundary });

if (response && response.requestSucceeded) {
return response;
}

return rejectWithValue(strings.GENERIC_ERROR);
}
);

export const requestUploadApplicationBoundary = createAsyncThunk(
'applications/uploadBoundary',
async (request: { applicationId: number; file: File }, { rejectWithValue }) => {
const { applicationId, file } = request;

const response = await ApplicationService.uploadBoundary(applicationId, file);

if (response && response.requestSucceeded) {
return response;
}

return rejectWithValue(strings.GENERIC_ERROR);
}
);
21 changes: 21 additions & 0 deletions src/redux/features/application/applicationSelectors.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,30 @@
import { RootState } from 'src/redux/rootReducer';

export const selectApplicationCreate = (requestId: string) => (state: RootState) => state.applicationCreate[requestId];

export const selectApplicationCreateProject = (requestId: string) => (state: RootState) =>
state.applicationCreateProject[requestId];

export const selectApplicationList = (requestId: string) => (state: RootState) => state.applications[requestId];

export const selectApplicationDeliverableList = (requestId: string) => (state: RootState) =>
state.applicationDeliverables[requestId];

export const selectApplicationHistoryList = (requestId: string) => (state: RootState) =>
state.applicationHistory[requestId];

export const selectApplicationModuleList = (requestId: string) => (state: RootState) =>
state.applicationModules[requestId];

export const selectApplicationRestart = (requestId: string) => (state: RootState) =>
state.applicationRestart[requestId];

export const selectApplicationReview = (requestId: string) => (state: RootState) => state.applicationReview[requestId];

export const selectApplicationSubmit = (requestId: string) => (state: RootState) => state.applicationSubmit[requestId];

export const selectApplicationUpdateBoundary = (requestId: string) => (state: RootState) =>
state.applicationUpdateBoundary[requestId];

export const selectApplicationUploadBoundary = (requestId: string) => (state: RootState) =>
state.applicationUploadBoundary[requestId];
130 changes: 129 additions & 1 deletion src/redux/features/application/applicationSlice.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,50 @@
import { createSlice } from '@reduxjs/toolkit';

import { StatusT, buildReducers } from 'src/redux/features/asyncUtils';
import { Application, ApplicationDeliverable, ApplicationModule } from 'src/types/Application';
import { Application, ApplicationDeliverable, ApplicationHistory, ApplicationModule } from 'src/types/Application';

import {
requestCreateApplication,
requestCreateProjectApplication,
requestListApplicationDeliverables,
requestListApplicationHistory,
requestListApplicationModules,
requestListApplications,
requestRestartApplication,
requestReviewApplication,
requestSubmitApplication,
requestUpdateApplicationBoundary,
requestUploadApplicationBoundary,
} from './applicationAsyncThunks';

/**
* Application create
*/
const initialStateApplicationCreate: Record<string, StatusT<number>> = {};

export const applicationCreateSlice = createSlice({
name: 'applicationCreateSlice',
initialState: initialStateApplicationCreate,
reducers: {},
extraReducers: (builder) => {
buildReducers(requestCreateApplication)(builder);
},
});

/**
* Application create project
*/
const initialStateApplicationProjectCreate: Record<string, StatusT<number>> = {};

export const applicationProjectCreateSlice = createSlice({
name: 'applicationProjectCreateSlice',
initialState: initialStateApplicationProjectCreate,
reducers: {},
extraReducers: (builder) => {
buildReducers(requestCreateProjectApplication)(builder);
},
});

/**
* Application list
*/
Expand Down Expand Up @@ -37,6 +73,20 @@ export const applicationDeliverablesListSlice = createSlice({
},
});

/**
* Application history list
*/
const initialStateApplicationHistory: Record<string, StatusT<ApplicationHistory[]>> = {};

export const applicationHistoryListSlice = createSlice({
name: 'applicationHistoryListSlice',
initialState: initialStateApplicationHistory,
reducers: {},
extraReducers: (builder) => {
buildReducers(requestListApplicationHistory)(builder);
},
});

/**
* Application module list
*/
Expand All @@ -51,10 +101,88 @@ export const applicationModuleListSlice = createSlice({
},
});

/**
* Application restart
*/
const initialStateApplicationRestart: Record<string, StatusT<Response>> = {};

export const applicationRestartSlice = createSlice({
name: 'applicationRestartSlice',
initialState: initialStateApplicationRestart,
reducers: {},
extraReducers: (builder) => {
buildReducers(requestRestartApplication)(builder);
},
});

/**
* Application submit
*/
const initialStateApplicationSubmit: Record<string, StatusT<string[]>> = {};

export const applicationSubmitSlice = createSlice({
name: 'applicationSubmitSlice',
initialState: initialStateApplicationSubmit,
reducers: {},
extraReducers: (builder) => {
buildReducers(requestSubmitApplication)(builder);
},
});

/**
* Application review
*/
const initialStateApplicationReview: Record<string, StatusT<Response>> = {};

export const applicationReviewSlice = createSlice({
name: 'applicationReviewSlice',
initialState: initialStateApplicationReview,
reducers: {},
extraReducers: (builder) => {
buildReducers(requestReviewApplication)(builder);
},
});

/**
* Application update boundary
*/
const initialStateApplicationUpdateBoundary: Record<string, StatusT<Response>> = {};

export const applicationUpdateBoundarySlice = createSlice({
name: 'applicationUpdateBoundarySlice',
initialState: initialStateApplicationUpdateBoundary,
reducers: {},
extraReducers: (builder) => {
buildReducers(requestUpdateApplicationBoundary)(builder);
},
});

/**
* Application upload boundary
*/
const initialStateApplicationUploadBoundary: Record<string, StatusT<Response>> = {};

export const applicationUploadBoundarySlice = createSlice({
name: 'applicationUploadBoundarySlice',
initialState: initialStateApplicationUploadBoundary,
reducers: {},
extraReducers: (builder) => {
buildReducers(requestUploadApplicationBoundary)(builder);
},
});

const acceleratorReducers = {
applications: applicationListSlice.reducer,
applicationCreate: applicationCreateSlice.reducer,
applicationCreateProject: applicationProjectCreateSlice.reducer,
applicationDeliverables: applicationDeliverablesListSlice.reducer,
applicationHistory: applicationHistoryListSlice.reducer,
applicationModules: applicationModuleListSlice.reducer,
applicationRestart: applicationRestartSlice.reducer,
applicationReview: applicationReviewSlice.reducer,
applicationSubmit: applicationSubmitSlice.reducer,
applicationUpdateBoundary: applicationUpdateBoundarySlice.reducer,
applicationUploadBoundary: applicationUploadBoundarySlice.reducer,
};

export default acceleratorReducers;
15 changes: 15 additions & 0 deletions src/services/ApplicationService.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { paths } from 'src/api/types/generated-schema';

import HttpService, { Response, Response2 } from './HttpService';
import ProjectsService from './ProjectsService';

/**
* Service for application related functionality
Expand Down Expand Up @@ -53,6 +54,19 @@ const createApplication = async (projectId: number): Promise<Response2<CreateApp
});
};

const createProjectApplication = async (
projectName: string,
organizationId: number
): Promise<Response2<CreateApplicationResponsePayload>> => {
const projectRequest = await ProjectsService.createProject({ name: projectName, organizationId });

if (projectRequest.requestSucceeded && projectRequest.data) {
return createApplication(projectRequest.data.id);
} else {
return { ...projectRequest, data: undefined };
}
};

const getApplication = async (applicationId: number): Promise<Response2<GetApplicationResponsePayload>> => {
return HttpService.root(APPLICATION_ENDPOINT).get2<GetApplicationResponsePayload>({
urlReplacements: { '{applicationId}': `${applicationId}` },
Expand Down Expand Up @@ -133,6 +147,7 @@ const uploadBoundary = async (applicationId: number, file: File): Promise<Respon
*/
const ApplicationService = {
createApplication,
createProjectApplication,
getApplication,
listApplications,
listApplicationDeliverables,
Expand Down
2 changes: 2 additions & 0 deletions src/types/Application.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { components } from 'src/api/types/generated-schema';

export type Application = components['schemas']['ApplicationPayload'];
export type ApplicationHistory = components['schemas']['ApplicationHistoryPayload'];
export type ApplicationStatus = Application['status'];
export type ApplicationModule = components['schemas']['ApplicationModulePayload'];
export type ApplicationDeliverable = components['schemas']['ApplicationDeliverablePayload'];
export type ApplicationReview = components['schemas']['ReviewApplicationRequestPayload'];

0 comments on commit afb77a0

Please sign in to comment.