ConceptPortal-public/rsconcept/frontend/src/utils/backendAPI.ts

357 lines
11 KiB
TypeScript
Raw Normal View History

2023-08-23 18:11:42 +03:00
import axios, { AxiosError, AxiosRequestConfig } from 'axios'
import { toast } from 'react-toastify'
2023-07-25 20:27:29 +03:00
import { type ErrorInfo } from '../components/BackendError'
2023-09-11 20:31:54 +03:00
import { IReferenceData } from '../models/language'
import { IRefsText } from '../models/language'
import { ICurrentUser } from '../models/library'
import { IUserLoginData } from '../models/library'
import { IUserSignupData } from '../models/library'
import { IUserProfile } from '../models/library'
import { IUserUpdateData } from '../models/library'
import { IUserInfo } from '../models/library'
import { IUserUpdatePassword } from '../models/library'
import { ILibraryItem } from '../models/library'
import { ILibraryUpdateData } from '../models/library'
import {
2023-08-01 11:44:33 +03:00
IConstituentaList, IConstituentaMeta,
2023-08-23 01:36:17 +03:00
ICstCreateData, ICstCreatedResponse, ICstMovetoData, ICstRenameData, ICstUpdateData,
2023-09-11 20:31:54 +03:00
IRSFormCreateData, IRSFormData, IRSFormUploadData} from '../models/rsform'
import { IExpressionParse, IRSExpression } from '../models/rslang'
import { config } from './constants'
2023-08-01 11:44:33 +03:00
export function initBackend() {
axios.defaults.withCredentials = true;
axios.defaults.xsrfCookieName = 'csrftoken';
axios.defaults.xsrfHeaderName = 'x-csrftoken';
axios.defaults.baseURL = `${config.backend}`;
}
// ================ Data transfer types ================
export type DataCallback<ResponseData = undefined> = (data: ResponseData) => void;
interface IFrontRequest<RequestData, ResponseData> {
data?: RequestData
onSuccess?: DataCallback<ResponseData>
onError?: (error: ErrorInfo) => void
setLoading?: (loading: boolean) => void
showError?: boolean
}
export interface FrontPush<DataType> extends IFrontRequest<DataType, undefined> {
data: DataType
}
export interface FrontPull<DataType> extends IFrontRequest<undefined, DataType>{
onSuccess: DataCallback<DataType>
}
export interface FrontExchange<RequestData, ResponseData> extends IFrontRequest<RequestData, ResponseData>{
data: RequestData
onSuccess: DataCallback<ResponseData>
}
export interface FrontAction extends IFrontRequest<undefined, undefined>{}
interface IAxiosRequest<RequestData, ResponseData> {
endpoint: string
request: IFrontRequest<RequestData, ResponseData>
title: string
options?: AxiosRequestConfig
}
// ==================== API ====================
export function getAuth(request: FrontPull<ICurrentUser>) {
AxiosGet({
title: 'Current user',
2023-08-01 11:44:33 +03:00
endpoint: `/users/api/auth`,
request: request
});
}
export function postLogin(request: FrontPush<IUserLoginData>) {
AxiosPost({
title: 'Login',
2023-08-01 20:14:03 +03:00
endpoint: '/users/api/login',
request: request
});
}
export function postLogout(request: FrontAction) {
AxiosPost({
title: 'Logout',
2023-08-01 20:14:03 +03:00
endpoint: '/users/api/logout',
request: request
});
}
export function postSignup(request: FrontExchange<IUserSignupData, IUserProfile>) {
AxiosPost({
title: 'Register user',
2023-08-01 20:14:03 +03:00
endpoint: '/users/api/signup',
request: request
});
}
export function getProfile(request: FrontPull<IUserProfile>) {
AxiosGet({
title: 'Current user profile',
2023-08-01 20:14:03 +03:00
endpoint: '/users/api/profile',
request: request
});
}
2023-07-31 21:45:27 +03:00
export function patchProfile(request: FrontExchange<IUserUpdateData, IUserProfile>) {
AxiosPatch({
title: 'Current user profile',
2023-08-01 20:14:03 +03:00
endpoint: '/users/api/profile',
2023-07-31 21:45:27 +03:00
request: request
});
}
2023-08-10 13:53:19 +03:00
export function patchPassword(request: FrontPush<IUserUpdatePassword>) {
AxiosPatch({
title: 'Update Password',
endpoint: '/users/api/change-password',
request: request
});
}
export function getActiveUsers(request: FrontPull<IUserInfo[]>) {
AxiosGet({
title: 'Active users list',
2023-08-01 20:14:03 +03:00
endpoint: '/users/api/active-users',
request: request
});
}
2023-08-25 22:51:20 +03:00
export function getLibrary(request: FrontPull<ILibraryItem[]>) {
AxiosGet({
2023-08-28 10:50:10 +03:00
title: 'Available LibraryItems list',
2023-08-26 17:26:49 +03:00
endpoint: '/api/library/active',
request: request
});
}
2023-08-25 22:51:20 +03:00
export function postNewRSForm(request: FrontExchange<IRSFormCreateData, ILibraryItem>) {
AxiosPost({
2023-07-25 20:27:29 +03:00
title: 'New RSForm',
2023-08-26 17:26:49 +03:00
endpoint: '/api/rsforms/create-detailed',
request: request,
options: {
headers: {
'Content-Type': 'multipart/form-data'
}
}
});
}
2023-08-25 22:51:20 +03:00
export function postCloneLibraryItem(target: string, request: FrontExchange<IRSFormCreateData, IRSFormData>) {
2023-07-28 01:37:26 +03:00
AxiosPost({
2023-08-28 10:50:10 +03:00
title: 'Clone RSForm',
2023-08-26 17:26:49 +03:00
endpoint: `/api/library/${target}/clone`,
2023-07-28 01:37:26 +03:00
request: request
});
}
export function getRSFormDetails(target: string, request: FrontPull<IRSFormData>) {
AxiosGet({
title: `RSForm details for id=${target}`,
2023-08-26 17:26:49 +03:00
endpoint: `/api/rsforms/${target}/details`,
request: request
});
}
2023-08-25 22:51:20 +03:00
export function patchLibraryItem(target: string, request: FrontExchange<ILibraryUpdateData, ILibraryItem>) {
AxiosPatch({
2023-08-28 10:50:10 +03:00
title: `LibraryItem id=${target}`,
2023-08-26 17:26:49 +03:00
endpoint: `/api/library/${target}`,
request: request
2023-07-18 14:55:40 +03:00
});
}
2023-08-25 22:51:20 +03:00
export function deleteLibraryItem(target: string, request: FrontAction) {
AxiosDelete({
2023-08-28 10:50:10 +03:00
title: `LibraryItem id=${target}`,
2023-08-26 17:26:49 +03:00
endpoint: `/api/library/${target}`,
request: request
});
}
2023-08-25 22:51:20 +03:00
export function postClaimLibraryItem(target: string, request: FrontPull<ILibraryItem>) {
AxiosPost({
2023-08-28 10:50:10 +03:00
title: `Claim on LibrartyItem id=${target}`,
2023-08-26 17:26:49 +03:00
endpoint: `/api/library/${target}/claim`,
request: request
});
}
export function postSubscribe(target: string, request: FrontAction) {
AxiosPost({
2023-08-28 10:50:10 +03:00
title: `Subscribe to LibrartyItem id=${target}`,
2023-08-26 17:26:49 +03:00
endpoint: `/api/library/${target}/subscribe`,
request: request
});
}
export function deleteUnsubscribe(target: string, request: FrontAction) {
AxiosDelete({
2023-08-28 10:50:10 +03:00
title: `Unsubscribe from LibraryItem id=${target}`,
2023-08-26 17:26:49 +03:00
endpoint: `/api/library/${target}/unsubscribe`,
request: request
});
}
export function getTRSFile(target: string, request: FrontPull<Blob>) {
AxiosGet({
title: `RSForm TRS file for id=${target}`,
2023-08-26 17:26:49 +03:00
endpoint: `/api/rsforms/${target}/export-trs`,
request: request,
options: { responseType: 'blob' }
2023-07-20 17:11:03 +03:00
});
}
export function postNewConstituenta(schema: string, request: FrontExchange<ICstCreateData, ICstCreatedResponse>) {
AxiosPost({
title: `New Constituenta for RSForm id=${schema}: ${request.data.alias}`,
2023-08-26 17:26:49 +03:00
endpoint: `/api/rsforms/${schema}/cst-create`,
request: request
});
}
export function patchDeleteConstituenta(schema: string, request: FrontExchange<IConstituentaList, IRSFormData>) {
AxiosPatch({
title: `Delete Constituents for RSForm id=${schema}: ${request.data.items.map(item => String(item.id)).join(' ')}`,
2023-08-26 17:26:49 +03:00
endpoint: `/api/rsforms/${schema}/cst-multidelete`,
request: request
});
}
export function patchConstituenta(target: string, request: FrontExchange<ICstUpdateData, IConstituentaMeta>) {
AxiosPatch({
title: `Constituenta id=${target}`,
2023-08-26 17:26:49 +03:00
endpoint: `/api/constituents/${target}`,
request: request
});
}
2023-08-23 12:15:16 +03:00
export function patchRenameConstituenta(schema: string, request: FrontExchange<ICstRenameData, ICstCreatedResponse>) {
2023-08-23 01:36:17 +03:00
AxiosPatch({
title: `Renaming constituenta id=${request.data.id} for schema id=${schema}`,
2023-08-26 17:26:49 +03:00
endpoint: `/api/rsforms/${schema}/cst-rename`,
2023-08-23 01:36:17 +03:00
request: request
});
}
export function patchMoveConstituenta(schema: string, request: FrontExchange<ICstMovetoData, IRSFormData>) {
AxiosPatch({
title: `Moving Constituents for RSForm id=${schema}: ${JSON.stringify(request.data.items)} to ${request.data.move_to}`,
2023-08-26 17:26:49 +03:00
endpoint: `/api/rsforms/${schema}/cst-moveto`,
request: request
});
}
2023-07-29 03:31:21 +03:00
export function postCheckExpression(schema: string, request: FrontExchange<IRSExpression, IExpressionParse>) {
AxiosPost({
title: `Check expression for RSForm id=${schema}: ${request.data.expression }`,
2023-08-26 17:26:49 +03:00
endpoint: `/api/rsforms/${schema}/check`,
request: request
});
2023-07-25 20:27:29 +03:00
}
2023-08-23 22:57:25 +03:00
export function postResolveText(schema: string, request: FrontExchange<IRefsText, IReferenceData>) {
AxiosPost({
title: `Resolve text references for RSForm id=${schema}: ${request.data.text }`,
2023-08-26 17:26:49 +03:00
endpoint: `/api/rsforms/${schema}/resolve`,
2023-08-23 22:57:25 +03:00
request: request
});
}
2023-07-27 22:04:25 +03:00
export function patchResetAliases(target: string, request: FrontPull<IRSFormData>) {
AxiosPatch({
title: `Reset alias for RSForm id=${target}`,
2023-08-26 17:26:49 +03:00
endpoint: `/api/rsforms/${target}/reset-aliases`,
2023-07-27 22:04:25 +03:00
request: request
});
}
export function patchUploadTRS(target: string, request: FrontExchange<IRSFormUploadData, IRSFormData>) {
AxiosPatch({
title: `Replacing data with trs file for RSForm id=${target}`,
2023-08-26 17:26:49 +03:00
endpoint: `/api/rsforms/${target}/load-trs`,
2023-07-27 22:04:25 +03:00
request: request,
options: {
headers: {
'Content-Type': 'multipart/form-data'
}
}
});
}
// ============ Helper functions =============
function AxiosGet<ResponseData>({ endpoint, request, title, options }: IAxiosRequest<undefined, ResponseData>) {
2023-07-27 22:04:25 +03:00
console.log(`REQUEST: [[${title}]]`);
2023-07-28 18:23:37 +03:00
if (request.setLoading) request.setLoading(true);
axios.get<ResponseData>(endpoint, options)
2023-08-23 18:11:42 +03:00
.then(response => {
if (request.setLoading) request.setLoading(false);
if (request.onSuccess) request.onSuccess(response.data);
2023-07-25 20:27:29 +03:00
})
2023-08-23 18:11:42 +03:00
.catch((error: Error | AxiosError) => {
if (request.setLoading) request.setLoading(false);
if (request.showError) toast.error(error.message);
if (request.onError) request.onError(error);
2023-07-25 20:27:29 +03:00
});
}
function AxiosPost<RequestData, ResponseData>(
{ endpoint, request, title, options }: IAxiosRequest<RequestData, ResponseData>
) {
2023-07-27 22:04:25 +03:00
console.log(`POST: [[${title}]]`);
if (request.setLoading) request.setLoading(true);
axios.post<ResponseData>(endpoint, request.data, options)
2023-08-23 18:11:42 +03:00
.then(response => {
if (request.setLoading) request.setLoading(false);
if (request.onSuccess) request.onSuccess(response.data);
2023-07-25 20:27:29 +03:00
})
2023-08-23 18:11:42 +03:00
.catch((error: Error | AxiosError) => {
if (request.setLoading) request.setLoading(false);
if (request.showError) toast.error(error.message);
if (request.onError) request.onError(error);
2023-07-25 20:27:29 +03:00
});
}
function AxiosDelete<RequestData, ResponseData>(
{ endpoint, request, title, options }: IAxiosRequest<RequestData, ResponseData>
) {
2023-07-27 22:04:25 +03:00
console.log(`DELETE: [[${title}]]`);
if (request.setLoading) request.setLoading(true);
axios.delete<ResponseData>(endpoint, options)
2023-08-23 18:11:42 +03:00
.then(response => {
if (request.setLoading) request.setLoading(false);
if (request.onSuccess) request.onSuccess(response.data);
2023-07-25 20:27:29 +03:00
})
2023-08-23 18:11:42 +03:00
.catch((error: Error | AxiosError) => {
if (request.setLoading) request.setLoading(false);
if (request.showError) toast.error(error.message);
if (request.onError) request.onError(error);
2023-07-25 20:27:29 +03:00
});
}
function AxiosPatch<RequestData, ResponseData>(
{ endpoint, request, title, options }: IAxiosRequest<RequestData, ResponseData>
) {
2023-07-27 22:04:25 +03:00
console.log(`PATCH: [[${title}]]`);
if (request.setLoading) request.setLoading(true);
axios.patch<ResponseData>(endpoint, request.data, options)
2023-08-23 18:11:42 +03:00
.then(response => {
if (request.setLoading) request.setLoading(false);
if (request.onSuccess) request.onSuccess(response.data);
2023-07-25 20:27:29 +03:00
return response.data;
})
2023-08-23 18:11:42 +03:00
.catch((error: Error | AxiosError) => {
if (request.setLoading) request.setLoading(false);
if (request.showError) toast.error(error.message);
if (request.onError) request.onError(error);
2023-07-25 20:27:29 +03:00
});
}