From c438b6ac160df192f6de9bf47d765a0cc1a6e21e Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Wed, 24 Jul 2024 23:20:45 +0300 Subject: [PATCH] Refactoring: split backendAPI into modules --- rsconcept/frontend/src/app/backendAPI.ts | 577 ------------------ .../frontend/src/backend/apiConfiguration.ts | 25 + .../frontend/src/backend/apiTransport.ts | 114 ++++ rsconcept/frontend/src/backend/cctext.ts | 28 + .../frontend/src/backend/constituents.ts | 14 + rsconcept/frontend/src/backend/library.ts | 131 ++++ rsconcept/frontend/src/backend/operations.ts | 14 + rsconcept/frontend/src/backend/oss.ts | 44 ++ rsconcept/frontend/src/backend/rsforms.ts | 145 +++++ rsconcept/frontend/src/backend/users.ts | 99 +++ rsconcept/frontend/src/backend/versions.ts | 30 + .../frontend/src/context/AuthContext.tsx | 4 +- .../frontend/src/context/LibraryContext.tsx | 9 +- rsconcept/frontend/src/context/OssContext.tsx | 12 +- .../frontend/src/context/RSFormContext.tsx | 32 +- .../src/context/UserProfileContext.tsx | 3 +- .../frontend/src/context/UsersContext.tsx | 2 +- .../frontend/src/hooks/useCheckExpression.ts | 3 +- .../frontend/src/hooks/useConceptText.ts | 3 +- rsconcept/frontend/src/hooks/useOssDetails.ts | 2 +- .../frontend/src/hooks/useRSFormDetails.ts | 2 +- 21 files changed, 680 insertions(+), 613 deletions(-) delete mode 100644 rsconcept/frontend/src/app/backendAPI.ts create mode 100644 rsconcept/frontend/src/backend/apiConfiguration.ts create mode 100644 rsconcept/frontend/src/backend/apiTransport.ts create mode 100644 rsconcept/frontend/src/backend/cctext.ts create mode 100644 rsconcept/frontend/src/backend/constituents.ts create mode 100644 rsconcept/frontend/src/backend/library.ts create mode 100644 rsconcept/frontend/src/backend/operations.ts create mode 100644 rsconcept/frontend/src/backend/oss.ts create mode 100644 rsconcept/frontend/src/backend/rsforms.ts create mode 100644 rsconcept/frontend/src/backend/users.ts create mode 100644 rsconcept/frontend/src/backend/versions.ts diff --git a/rsconcept/frontend/src/app/backendAPI.ts b/rsconcept/frontend/src/app/backendAPI.ts deleted file mode 100644 index 4dddb75e..00000000 --- a/rsconcept/frontend/src/app/backendAPI.ts +++ /dev/null @@ -1,577 +0,0 @@ -/** - * Module: API for backend communications. - */ - -import axios, { AxiosError, AxiosRequestConfig } from 'axios'; -import { toast } from 'react-toastify'; - -import { type ErrorData } from '@/components/info/InfoError'; -import { ILexemeData, ITextRequest, ITextResult, IWordFormPlain } from '@/models/language'; -import { ILibraryItem, ILibraryUpdateData, ITargetAccessPolicy, ITargetLocation, IVersionData } from '@/models/library'; -import { ILibraryCreateData } from '@/models/library'; -import { - ICstSubstituteData, - IOperationCreateData, - IOperationCreatedResponse, - IOperationSchemaData, - IPositionsData, - ITargetOperation -} from '@/models/oss'; -import { - IConstituentaList, - IConstituentaMeta, - ICstCreateData, - ICstCreatedResponse, - ICstMovetoData, - ICstRenameData, - ICstUpdateData, - IInlineSynthesisData, - IProduceStructureResponse, - IRSFormCloneData, - IRSFormData, - IRSFormUploadData, - ITargetCst, - IVersionCreatedResponse -} from '@/models/rsform'; -import { IExpressionParse, IRSExpression } from '@/models/rslang'; -import { - ICurrentUser, - IPasswordTokenData, - IRequestPasswordData, - IResetPasswordData, - ITargetUser, - ITargetUsers, - IUserInfo, - IUserLoginData, - IUserProfile, - IUserSignupData, - IUserUpdateData, - IUserUpdatePassword -} from '@/models/user'; -import { buildConstants } from '@/utils/buildConstants'; - -const defaultOptions = { - xsrfCookieName: 'csrftoken', - xsrfHeaderName: 'x-csrftoken', - baseURL: `${buildConstants.backend}`, - withCredentials: true -}; - -const axiosInstance = axios.create(defaultOptions); -axiosInstance.interceptors.request.use(config => { - const token = document.cookie - .split('; ') - .find(row => row.startsWith('csrftoken=')) - ?.split('=')[1]; - if (token) { - config.headers['x-csrftoken'] = token; - } - return config; -}); - -// ================ Data transfer types ================ -export type DataCallback = (data: ResponseData) => void; - -interface IFrontRequest { - data?: RequestData; - onSuccess?: DataCallback; - onError?: (error: ErrorData) => void; - setLoading?: (loading: boolean) => void; - showError?: boolean; -} - -export interface FrontPush extends IFrontRequest { - data: DataType; -} -export interface FrontPull extends IFrontRequest { - onSuccess: DataCallback; -} - -export interface FrontExchange extends IFrontRequest { - data: RequestData; - onSuccess: DataCallback; -} - -export interface FrontAction extends IFrontRequest {} - -interface IAxiosRequest { - endpoint: string; - request: IFrontRequest; - options?: AxiosRequestConfig; -} - -// ==================== API ==================== -export function getAuth(request: FrontPull) { - AxiosGet({ - endpoint: `/users/api/auth`, - request: request - }); -} - -export function postLogin(request: FrontPush) { - AxiosPost({ - endpoint: '/users/api/login', - request: request - }); -} - -export function postLogout(request: FrontAction) { - AxiosPost({ - endpoint: '/users/api/logout', - request: request - }); -} - -export function postSignup(request: FrontExchange) { - AxiosPost({ - endpoint: '/users/api/signup', - request: request - }); -} - -export function getProfile(request: FrontPull) { - AxiosGet({ - endpoint: '/users/api/profile', - request: request - }); -} - -export function patchProfile(request: FrontExchange) { - AxiosPatch({ - endpoint: '/users/api/profile', - request: request - }); -} - -export function patchPassword(request: FrontPush) { - AxiosPatch({ - endpoint: '/users/api/change-password', - request: request - }); -} - -export function postRequestPasswordReset(request: FrontPush) { - // title: 'Request password reset', - AxiosPost({ - endpoint: '/users/api/password-reset', - request: request - }); -} - -export function postValidatePasswordToken(request: FrontPush) { - // title: 'Validate password token', - AxiosPost({ - endpoint: '/users/api/password-reset/validate', - request: request - }); -} - -export function postResetPassword(request: FrontPush) { - // title: 'Reset password', - AxiosPost({ - endpoint: '/users/api/password-reset/confirm', - request: request - }); -} - -export function getActiveUsers(request: FrontPull) { - // title: 'Active users list', - AxiosGet({ - endpoint: '/users/api/active-users', - request: request - }); -} - -export function getLibrary(request: FrontPull) { - // title: 'Available LibraryItems list', - AxiosGet({ - endpoint: '/api/library/active', - request: request - }); -} - -export function getAdminLibrary(request: FrontPull) { - // title: 'All LibraryItems list', - AxiosGet({ - endpoint: '/api/library/all', - request: request - }); -} - -export function getTemplates(request: FrontPull) { - AxiosGet({ - endpoint: '/api/library/templates', - request: request - }); -} - -export function postRSFormFromFile(request: FrontExchange) { - AxiosPost({ - endpoint: '/api/rsforms/create-detailed', - request: request, - options: { - headers: { - 'Content-Type': 'multipart/form-data' - } - } - }); -} - -export function postCreateLibraryItem(request: FrontExchange) { - AxiosPost({ - endpoint: '/api/library', - request: request - }); -} - -export function postCloneLibraryItem(target: string, request: FrontExchange) { - AxiosPost({ - endpoint: `/api/library/${target}/clone`, - request: request - }); -} - -export function getRSFormDetails(target: string, version: string, request: FrontPull) { - if (!version) { - AxiosGet({ - endpoint: `/api/rsforms/${target}/details`, - request: request - }); - } else { - AxiosGet({ - endpoint: `/api/rsforms/${target}/versions/${version}`, - request: request - }); - } -} - -export function patchLibraryItem(target: string, request: FrontExchange) { - AxiosPatch({ - endpoint: `/api/library/${target}`, - request: request - }); -} - -export function deleteLibraryItem(target: string, request: FrontAction) { - AxiosDelete({ - endpoint: `/api/library/${target}`, - request: request - }); -} - -export function patchSetOwner(target: string, request: FrontPush) { - AxiosPatch({ - endpoint: `/api/library/${target}/set-owner`, - request: request - }); -} - -export function patchSetAccessPolicy(target: string, request: FrontPush) { - AxiosPatch({ - endpoint: `/api/library/${target}/set-access-policy`, - request: request - }); -} - -export function patchSetLocation(target: string, request: FrontPush) { - AxiosPatch({ - endpoint: `/api/library/${target}/set-location`, - request: request - }); -} - -export function patchEditorsAdd(target: string, request: FrontPush) { - AxiosPatch({ - endpoint: `/api/library/${target}/editors-add`, - request: request - }); -} - -export function patchEditorsRemove(target: string, request: FrontPush) { - AxiosPatch({ - endpoint: `/api/library/${target}/editors-remove`, - request: request - }); -} - -export function patchEditorsSet(target: string, request: FrontPush) { - AxiosPatch({ - endpoint: `/api/library/${target}/editors-set`, - request: request - }); -} - -export function postSubscribe(target: string, request: FrontAction) { - AxiosPost({ - endpoint: `/api/library/${target}/subscribe`, - request: request - }); -} - -export function deleteUnsubscribe(target: string, request: FrontAction) { - AxiosDelete({ - endpoint: `/api/library/${target}/unsubscribe`, - request: request - }); -} - -export function getTRSFile(target: string, version: string, request: FrontPull) { - if (!version) { - AxiosGet({ - endpoint: `/api/rsforms/${target}/export-trs`, - request: request, - options: { responseType: 'blob' } - }); - } else { - AxiosGet({ - endpoint: `/api/versions/${version}/export-file`, - request: request, - options: { responseType: 'blob' } - }); - } -} - -export function postCreateConstituenta(schema: string, request: FrontExchange) { - AxiosPost({ - endpoint: `/api/rsforms/${schema}/cst-create`, - request: request - }); -} - -export function patchDeleteConstituenta(schema: string, request: FrontExchange) { - AxiosPatch({ - endpoint: `/api/rsforms/${schema}/cst-delete-multiple`, - request: request - }); -} - -export function patchConstituenta(target: string, request: FrontExchange) { - AxiosPatch({ - endpoint: `/api/constituents/${target}`, - request: request - }); -} - -export function patchRenameConstituenta(schema: string, request: FrontExchange) { - AxiosPatch({ - endpoint: `/api/rsforms/${schema}/cst-rename`, - request: request - }); -} - -export function patchProduceStructure(schema: string, request: FrontExchange) { - AxiosPatch({ - endpoint: `/api/rsforms/${schema}/cst-produce-structure`, - request: request - }); -} - -export function patchSubstituteConstituents(schema: string, request: FrontExchange) { - AxiosPatch({ - endpoint: `/api/rsforms/${schema}/cst-substitute`, - request: request - }); -} - -export function patchMoveConstituenta(schema: string, request: FrontExchange) { - AxiosPatch({ - endpoint: `/api/rsforms/${schema}/cst-moveto`, - request: request - }); -} - -export function postCheckExpression(schema: string, request: FrontExchange) { - AxiosPost({ - endpoint: `/api/rsforms/${schema}/check`, - request: request - }); -} - -export function patchResetAliases(target: string, request: FrontPull) { - AxiosPatch({ - endpoint: `/api/rsforms/${target}/reset-aliases`, - request: request - }); -} - -export function patchRestoreOrder(target: string, request: FrontPull) { - AxiosPatch({ - endpoint: `/api/rsforms/${target}/restore-order`, - request: request - }); -} - -export function patchUploadTRS(target: string, request: FrontExchange) { - AxiosPatch({ - endpoint: `/api/rsforms/${target}/load-trs`, - request: request, - options: { - headers: { - 'Content-Type': 'multipart/form-data' - } - } - }); -} -export function patchInlineSynthesis(request: FrontExchange) { - AxiosPatch({ - endpoint: `/api/operations/inline-synthesis`, - request: request - }); -} - -export function getOssDetails(target: string, request: FrontPull) { - AxiosGet({ - endpoint: `/api/oss/${target}/details`, - request: request - }); -} - -export function patchUpdatePositions(schema: string, request: FrontPush) { - AxiosPatch({ - endpoint: `/api/oss/${schema}/update-positions`, - request: request - }); -} - -export function postCreateOperation( - schema: string, - request: FrontExchange -) { - AxiosPost({ - endpoint: `/api/oss/${schema}/create-operation`, - request: request - }); -} - -export function patchDeleteOperation(schema: string, request: FrontExchange) { - AxiosPatch({ - endpoint: `/api/oss/${schema}/delete-operation`, - request: request - }); -} - -export function postInflectText(request: FrontExchange) { - AxiosPost({ - endpoint: `/api/cctext/inflect`, - request: request - }); -} - -export function postParseText(request: FrontExchange) { - AxiosPost({ - endpoint: `/api/cctext/parse`, - request: request - }); -} - -export function postGenerateLexeme(request: FrontExchange) { - // title: `Parse text ${request.data.text}`, - AxiosPost({ - endpoint: `/api/cctext/generate-lexeme`, - request: request - }); -} - -export function postCreateVersion(target: string, request: FrontExchange) { - // title: `Create version for RSForm id=${target}`, - AxiosPost({ - endpoint: `/api/rsforms/${target}/versions/create`, - request: request - }); -} - -export function patchVersion(target: string, request: FrontPush) { - // title: `Version id=${target}`, - AxiosPatch({ - endpoint: `/api/versions/${target}`, - request: request - }); -} - -export function patchRestoreVersion(target: string, request: FrontPull) { - AxiosPatch({ - endpoint: `/api/versions/${target}/restore`, - request: request - }); -} - -export function deleteVersion(target: string, request: FrontAction) { - AxiosDelete({ - endpoint: `/api/versions/${target}`, - request: request - }); -} - -// ============ Helper functions ============= -function AxiosGet({ endpoint, request, options }: IAxiosRequest) { - if (request.setLoading) request.setLoading(true); - axiosInstance - .get(endpoint, options) - .then(response => { - if (request.setLoading) request.setLoading(false); - if (request.onSuccess) request.onSuccess(response.data); - }) - .catch((error: Error | AxiosError) => { - if (request.setLoading) request.setLoading(false); - if (request.showError) toast.error(error.message); - if (request.onError) request.onError(error); - }); -} - -function AxiosPost({ - endpoint, - request, - options -}: IAxiosRequest) { - if (request.setLoading) request.setLoading(true); - axiosInstance - .post(endpoint, request.data, options) - .then(response => { - if (request.setLoading) request.setLoading(false); - if (request.onSuccess) request.onSuccess(response.data); - }) - .catch((error: Error | AxiosError) => { - if (request.setLoading) request.setLoading(false); - if (request.showError) toast.error(error.message); - if (request.onError) request.onError(error); - }); -} - -function AxiosDelete({ - endpoint, - request, - options -}: IAxiosRequest) { - if (request.setLoading) request.setLoading(true); - axiosInstance - .delete(endpoint, options) - .then(response => { - if (request.setLoading) request.setLoading(false); - if (request.onSuccess) request.onSuccess(response.data); - }) - .catch((error: Error | AxiosError) => { - if (request.setLoading) request.setLoading(false); - if (request.showError) toast.error(error.message); - if (request.onError) request.onError(error); - }); -} - -function AxiosPatch({ - endpoint, - request, - options -}: IAxiosRequest) { - if (request.setLoading) request.setLoading(true); - axiosInstance - .patch(endpoint, request.data, options) - .then(response => { - if (request.setLoading) request.setLoading(false); - if (request.onSuccess) request.onSuccess(response.data); - return response.data; - }) - .catch((error: Error | AxiosError) => { - if (request.setLoading) request.setLoading(false); - if (request.showError) toast.error(error.message); - if (request.onError) request.onError(error); - }); -} diff --git a/rsconcept/frontend/src/backend/apiConfiguration.ts b/rsconcept/frontend/src/backend/apiConfiguration.ts new file mode 100644 index 00000000..5bde1a68 --- /dev/null +++ b/rsconcept/frontend/src/backend/apiConfiguration.ts @@ -0,0 +1,25 @@ +/** + * Module: communication setup. + */ +import axios from 'axios'; + +import { buildConstants } from '@/utils/buildConstants'; + +const defaultOptions = { + xsrfCookieName: 'csrftoken', + xsrfHeaderName: 'x-csrftoken', + baseURL: `${buildConstants.backend}`, + withCredentials: true +}; + +export const axiosInstance = axios.create(defaultOptions); +axiosInstance.interceptors.request.use(config => { + const token = document.cookie + .split('; ') + .find(row => row.startsWith('csrftoken=')) + ?.split('=')[1]; + if (token) { + config.headers['x-csrftoken'] = token; + } + return config; +}); diff --git a/rsconcept/frontend/src/backend/apiTransport.ts b/rsconcept/frontend/src/backend/apiTransport.ts new file mode 100644 index 00000000..c07f9979 --- /dev/null +++ b/rsconcept/frontend/src/backend/apiTransport.ts @@ -0,0 +1,114 @@ +/** + * Module: generic API for backend REST communications. + */ +import { AxiosError, AxiosRequestConfig } from 'axios'; +import { toast } from 'react-toastify'; + +import { ErrorData } from '@/components/info/InfoError'; + +import { axiosInstance } from './apiConfiguration'; + +// ================ Data transfer types ================ +export type DataCallback = (data: ResponseData) => void; + +export interface IFrontRequest { + data?: RequestData; + onSuccess?: DataCallback; + onError?: (error: ErrorData) => void; + setLoading?: (loading: boolean) => void; + showError?: boolean; +} + +export interface FrontPush extends IFrontRequest { + data: DataType; +} +export interface FrontPull extends IFrontRequest { + onSuccess: DataCallback; +} + +export interface FrontExchange extends IFrontRequest { + data: RequestData; + onSuccess: DataCallback; +} + +export interface FrontAction extends IFrontRequest {} + +export interface IAxiosRequest { + endpoint: string; + request: IFrontRequest; + options?: AxiosRequestConfig; +} + +// ================ Transport API calls ================ +export function AxiosGet({ endpoint, request, options }: IAxiosRequest) { + if (request.setLoading) request.setLoading(true); + axiosInstance + .get(endpoint, options) + .then(response => { + if (request.setLoading) request.setLoading(false); + if (request.onSuccess) request.onSuccess(response.data); + }) + .catch((error: Error | AxiosError) => { + if (request.setLoading) request.setLoading(false); + if (request.showError) toast.error(error.message); + if (request.onError) request.onError(error); + }); +} + +export function AxiosPost({ + endpoint, + request, + options +}: IAxiosRequest) { + if (request.setLoading) request.setLoading(true); + axiosInstance + .post(endpoint, request.data, options) + .then(response => { + if (request.setLoading) request.setLoading(false); + if (request.onSuccess) request.onSuccess(response.data); + }) + .catch((error: Error | AxiosError) => { + if (request.setLoading) request.setLoading(false); + if (request.showError) toast.error(error.message); + if (request.onError) request.onError(error); + }); +} + +export function AxiosDelete({ + endpoint, + request, + options +}: IAxiosRequest) { + if (request.setLoading) request.setLoading(true); + axiosInstance + .delete(endpoint, options) + .then(response => { + if (request.setLoading) request.setLoading(false); + if (request.onSuccess) request.onSuccess(response.data); + }) + .catch((error: Error | AxiosError) => { + if (request.setLoading) request.setLoading(false); + if (request.showError) toast.error(error.message); + if (request.onError) request.onError(error); + }); +} + +export function AxiosPatch({ + endpoint, + request, + options +}: IAxiosRequest) { + if (request.setLoading) request.setLoading(true); + axiosInstance + .patch(endpoint, request.data, options) + .then(response => { + if (request.setLoading) request.setLoading(false); + if (request.onSuccess) request.onSuccess(response.data); + return response.data; + }) + .catch((error: Error | AxiosError) => { + if (request.setLoading) request.setLoading(false); + if (request.showError) toast.error(error.message); + if (request.onError) request.onError(error); + }); +} diff --git a/rsconcept/frontend/src/backend/cctext.ts b/rsconcept/frontend/src/backend/cctext.ts new file mode 100644 index 00000000..46b064ca --- /dev/null +++ b/rsconcept/frontend/src/backend/cctext.ts @@ -0,0 +1,28 @@ +/** + * Endpoints: cctext. + */ + +import { ILexemeData, ITextRequest, ITextResult, IWordFormPlain } from '@/models/language'; + +import { AxiosPost, FrontExchange } from './apiTransport'; + +export function postInflectText(request: FrontExchange) { + AxiosPost({ + endpoint: `/api/cctext/inflect`, + request: request + }); +} + +export function postParseText(request: FrontExchange) { + AxiosPost({ + endpoint: `/api/cctext/parse`, + request: request + }); +} + +export function postGenerateLexeme(request: FrontExchange) { + AxiosPost({ + endpoint: `/api/cctext/generate-lexeme`, + request: request + }); +} diff --git a/rsconcept/frontend/src/backend/constituents.ts b/rsconcept/frontend/src/backend/constituents.ts new file mode 100644 index 00000000..576e9e05 --- /dev/null +++ b/rsconcept/frontend/src/backend/constituents.ts @@ -0,0 +1,14 @@ +/** + * Endpoints: constituents. + */ + +import { IConstituentaMeta, ICstUpdateData } from '@/models/rsform'; + +import { AxiosPatch, FrontExchange } from './apiTransport'; + +export function patchConstituenta(target: string, request: FrontExchange) { + AxiosPatch({ + endpoint: `/api/constituents/${target}`, + request: request + }); +} diff --git a/rsconcept/frontend/src/backend/library.ts b/rsconcept/frontend/src/backend/library.ts new file mode 100644 index 00000000..7cae3309 --- /dev/null +++ b/rsconcept/frontend/src/backend/library.ts @@ -0,0 +1,131 @@ +/** + * Endpoints: library. + */ + +import { + ILibraryCreateData, + ILibraryItem, + ILibraryUpdateData, + ITargetAccessPolicy, + ITargetLocation +} from '@/models/library'; +import { IRSFormCloneData, IRSFormData } from '@/models/rsform'; +import { ITargetUser, ITargetUsers } from '@/models/user'; + +import { + AxiosDelete, + AxiosGet, + AxiosPatch, + AxiosPost, + FrontAction, + FrontExchange, + FrontPull, + FrontPush +} from './apiTransport'; + +export function getLibrary(request: FrontPull) { + // title: 'Available LibraryItems list', + AxiosGet({ + endpoint: '/api/library/active', + request: request + }); +} + +export function getAdminLibrary(request: FrontPull) { + // title: 'All LibraryItems list', + AxiosGet({ + endpoint: '/api/library/all', + request: request + }); +} + +export function getTemplates(request: FrontPull) { + AxiosGet({ + endpoint: '/api/library/templates', + request: request + }); +} + +export function postCreateLibraryItem(request: FrontExchange) { + AxiosPost({ + endpoint: '/api/library', + request: request + }); +} + +export function postCloneLibraryItem(target: string, request: FrontExchange) { + AxiosPost({ + endpoint: `/api/library/${target}/clone`, + request: request + }); +} + +export function patchLibraryItem(target: string, request: FrontExchange) { + AxiosPatch({ + endpoint: `/api/library/${target}`, + request: request + }); +} + +export function deleteLibraryItem(target: string, request: FrontAction) { + AxiosDelete({ + endpoint: `/api/library/${target}`, + request: request + }); +} + +export function patchSetOwner(target: string, request: FrontPush) { + AxiosPatch({ + endpoint: `/api/library/${target}/set-owner`, + request: request + }); +} + +export function patchSetAccessPolicy(target: string, request: FrontPush) { + AxiosPatch({ + endpoint: `/api/library/${target}/set-access-policy`, + request: request + }); +} + +export function patchSetLocation(target: string, request: FrontPush) { + AxiosPatch({ + endpoint: `/api/library/${target}/set-location`, + request: request + }); +} + +export function patchEditorsAdd(target: string, request: FrontPush) { + AxiosPatch({ + endpoint: `/api/library/${target}/editors-add`, + request: request + }); +} + +export function patchEditorsRemove(target: string, request: FrontPush) { + AxiosPatch({ + endpoint: `/api/library/${target}/editors-remove`, + request: request + }); +} + +export function patchEditorsSet(target: string, request: FrontPush) { + AxiosPatch({ + endpoint: `/api/library/${target}/editors-set`, + request: request + }); +} + +export function postSubscribe(target: string, request: FrontAction) { + AxiosPost({ + endpoint: `/api/library/${target}/subscribe`, + request: request + }); +} + +export function deleteUnsubscribe(target: string, request: FrontAction) { + AxiosDelete({ + endpoint: `/api/library/${target}/unsubscribe`, + request: request + }); +} diff --git a/rsconcept/frontend/src/backend/operations.ts b/rsconcept/frontend/src/backend/operations.ts new file mode 100644 index 00000000..5fce8876 --- /dev/null +++ b/rsconcept/frontend/src/backend/operations.ts @@ -0,0 +1,14 @@ +/** + * Endpoints: operations. + */ + +import { IInlineSynthesisData, IRSFormData } from '@/models/rsform'; + +import { AxiosPatch, FrontExchange } from './apiTransport'; + +export function patchInlineSynthesis(request: FrontExchange) { + AxiosPatch({ + endpoint: `/api/operations/inline-synthesis`, + request: request + }); +} diff --git a/rsconcept/frontend/src/backend/oss.ts b/rsconcept/frontend/src/backend/oss.ts new file mode 100644 index 00000000..8b319958 --- /dev/null +++ b/rsconcept/frontend/src/backend/oss.ts @@ -0,0 +1,44 @@ +/** + * Endpoints: oss. + */ + +import { + IOperationCreateData, + IOperationCreatedResponse, + IOperationSchemaData, + IPositionsData, + ITargetOperation +} from '@/models/oss'; + +import { AxiosGet, AxiosPatch, AxiosPost, FrontExchange, FrontPull, FrontPush } from './apiTransport'; + +export function getOssDetails(target: string, request: FrontPull) { + AxiosGet({ + endpoint: `/api/oss/${target}/details`, + request: request + }); +} + +export function patchUpdatePositions(schema: string, request: FrontPush) { + AxiosPatch({ + endpoint: `/api/oss/${schema}/update-positions`, + request: request + }); +} + +export function postCreateOperation( + schema: string, + request: FrontExchange +) { + AxiosPost({ + endpoint: `/api/oss/${schema}/create-operation`, + request: request + }); +} + +export function patchDeleteOperation(schema: string, request: FrontExchange) { + AxiosPatch({ + endpoint: `/api/oss/${schema}/delete-operation`, + request: request + }); +} diff --git a/rsconcept/frontend/src/backend/rsforms.ts b/rsconcept/frontend/src/backend/rsforms.ts new file mode 100644 index 00000000..8134d447 --- /dev/null +++ b/rsconcept/frontend/src/backend/rsforms.ts @@ -0,0 +1,145 @@ +/** + * Endpoints: rsforms. + */ + +import { ILibraryCreateData, ILibraryItem, IVersionData } from '@/models/library'; +import { ICstSubstituteData } from '@/models/oss'; +import { + IConstituentaList, + ICstCreateData, + ICstCreatedResponse, + ICstMovetoData, + ICstRenameData, + IProduceStructureResponse, + IRSFormData, + IRSFormUploadData, + ITargetCst, + IVersionCreatedResponse +} from '@/models/rsform'; +import { IExpressionParse, IRSExpression } from '@/models/rslang'; + +import { AxiosGet, AxiosPatch, AxiosPost, FrontExchange, FrontPull } from './apiTransport'; + +export function postRSFormFromFile(request: FrontExchange) { + AxiosPost({ + endpoint: '/api/rsforms/create-detailed', + request: request, + options: { + headers: { + 'Content-Type': 'multipart/form-data' + } + } + }); +} + +export function getRSFormDetails(target: string, version: string, request: FrontPull) { + if (!version) { + AxiosGet({ + endpoint: `/api/rsforms/${target}/details`, + request: request + }); + } else { + AxiosGet({ + endpoint: `/api/rsforms/${target}/versions/${version}`, + request: request + }); + } +} + +export function getTRSFile(target: string, version: string, request: FrontPull) { + if (!version) { + AxiosGet({ + endpoint: `/api/rsforms/${target}/export-trs`, + request: request, + options: { responseType: 'blob' } + }); + } else { + AxiosGet({ + endpoint: `/api/versions/${version}/export-file`, + request: request, + options: { responseType: 'blob' } + }); + } +} + +export function postCreateConstituenta(schema: string, request: FrontExchange) { + AxiosPost({ + endpoint: `/api/rsforms/${schema}/cst-create`, + request: request + }); +} + +export function patchDeleteConstituenta(schema: string, request: FrontExchange) { + AxiosPatch({ + endpoint: `/api/rsforms/${schema}/cst-delete-multiple`, + request: request + }); +} + +export function patchRenameConstituenta(schema: string, request: FrontExchange) { + AxiosPatch({ + endpoint: `/api/rsforms/${schema}/cst-rename`, + request: request + }); +} + +export function patchProduceStructure(schema: string, request: FrontExchange) { + AxiosPatch({ + endpoint: `/api/rsforms/${schema}/cst-produce-structure`, + request: request + }); +} + +export function patchSubstituteConstituents(schema: string, request: FrontExchange) { + AxiosPatch({ + endpoint: `/api/rsforms/${schema}/cst-substitute`, + request: request + }); +} + +export function patchMoveConstituenta(schema: string, request: FrontExchange) { + AxiosPatch({ + endpoint: `/api/rsforms/${schema}/cst-moveto`, + request: request + }); +} + +export function postCheckExpression(schema: string, request: FrontExchange) { + AxiosPost({ + endpoint: `/api/rsforms/${schema}/check`, + request: request + }); +} + +export function patchResetAliases(target: string, request: FrontPull) { + AxiosPatch({ + endpoint: `/api/rsforms/${target}/reset-aliases`, + request: request + }); +} + +export function patchRestoreOrder(target: string, request: FrontPull) { + AxiosPatch({ + endpoint: `/api/rsforms/${target}/restore-order`, + request: request + }); +} + +export function patchUploadTRS(target: string, request: FrontExchange) { + AxiosPatch({ + endpoint: `/api/rsforms/${target}/load-trs`, + request: request, + options: { + headers: { + 'Content-Type': 'multipart/form-data' + } + } + }); +} + +export function postCreateVersion(target: string, request: FrontExchange) { + AxiosPost({ + endpoint: `/api/rsforms/${target}/versions/create`, + request: request + }); +} diff --git a/rsconcept/frontend/src/backend/users.ts b/rsconcept/frontend/src/backend/users.ts new file mode 100644 index 00000000..eda6ef97 --- /dev/null +++ b/rsconcept/frontend/src/backend/users.ts @@ -0,0 +1,99 @@ +/** + * Endpoints: users. + */ + +import { + ICurrentUser, + IPasswordTokenData, + IRequestPasswordData, + IResetPasswordData, + IUserInfo, + IUserLoginData, + IUserProfile, + IUserSignupData, + IUserUpdateData, + IUserUpdatePassword +} from '@/models/user'; + +import { AxiosGet, AxiosPatch, AxiosPost, FrontAction, FrontExchange, FrontPull, FrontPush } from './apiTransport'; + +export function getAuth(request: FrontPull) { + AxiosGet({ + endpoint: `/users/api/auth`, + request: request + }); +} + +export function postLogin(request: FrontPush) { + AxiosPost({ + endpoint: '/users/api/login', + request: request + }); +} + +export function postLogout(request: FrontAction) { + AxiosPost({ + endpoint: '/users/api/logout', + request: request + }); +} + +export function postSignup(request: FrontExchange) { + AxiosPost({ + endpoint: '/users/api/signup', + request: request + }); +} + +export function getProfile(request: FrontPull) { + AxiosGet({ + endpoint: '/users/api/profile', + request: request + }); +} + +export function patchProfile(request: FrontExchange) { + AxiosPatch({ + endpoint: '/users/api/profile', + request: request + }); +} + +export function patchPassword(request: FrontPush) { + AxiosPatch({ + endpoint: '/users/api/change-password', + request: request + }); +} + +export function postRequestPasswordReset(request: FrontPush) { + // title: 'Request password reset', + AxiosPost({ + endpoint: '/users/api/password-reset', + request: request + }); +} + +export function postValidatePasswordToken(request: FrontPush) { + // title: 'Validate password token', + AxiosPost({ + endpoint: '/users/api/password-reset/validate', + request: request + }); +} + +export function postResetPassword(request: FrontPush) { + // title: 'Reset password', + AxiosPost({ + endpoint: '/users/api/password-reset/confirm', + request: request + }); +} + +export function getActiveUsers(request: FrontPull) { + // title: 'Active users list', + AxiosGet({ + endpoint: '/users/api/active-users', + request: request + }); +} diff --git a/rsconcept/frontend/src/backend/versions.ts b/rsconcept/frontend/src/backend/versions.ts new file mode 100644 index 00000000..e04e5206 --- /dev/null +++ b/rsconcept/frontend/src/backend/versions.ts @@ -0,0 +1,30 @@ +/** + * Endpoints: versions. + */ + +import { IVersionData } from '@/models/library'; +import { IRSFormData } from '@/models/rsform'; + +import { AxiosDelete, AxiosPatch, FrontAction, FrontPull, FrontPush } from './apiTransport'; + +export function patchVersion(target: string, request: FrontPush) { + // title: `Version id=${target}`, + AxiosPatch({ + endpoint: `/api/versions/${target}`, + request: request + }); +} + +export function patchRestoreVersion(target: string, request: FrontPull) { + AxiosPatch({ + endpoint: `/api/versions/${target}/restore`, + request: request + }); +} + +export function deleteVersion(target: string, request: FrontAction) { + AxiosDelete({ + endpoint: `/api/versions/${target}`, + request: request + }); +} diff --git a/rsconcept/frontend/src/context/AuthContext.tsx b/rsconcept/frontend/src/context/AuthContext.tsx index 073ec11d..ef9e9355 100644 --- a/rsconcept/frontend/src/context/AuthContext.tsx +++ b/rsconcept/frontend/src/context/AuthContext.tsx @@ -2,8 +2,8 @@ import { createContext, useCallback, useContext, useLayoutEffect, useState } from 'react'; +import { DataCallback } from '@/backend/apiTransport'; import { - type DataCallback, getAuth, patchPassword, postLogin, @@ -12,7 +12,7 @@ import { postResetPassword, postSignup, postValidatePasswordToken -} from '@/app/backendAPI'; +} from '@/backend/users'; import { type ErrorData } from '@/components/info/InfoError'; import { ICurrentUser, diff --git a/rsconcept/frontend/src/context/LibraryContext.tsx b/rsconcept/frontend/src/context/LibraryContext.tsx index 3561ecd0..a1b8f167 100644 --- a/rsconcept/frontend/src/context/LibraryContext.tsx +++ b/rsconcept/frontend/src/context/LibraryContext.tsx @@ -2,17 +2,16 @@ import { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react'; +import { DataCallback } from '@/backend/apiTransport'; import { - DataCallback, deleteLibraryItem, getAdminLibrary, getLibrary, - getRSFormDetails, getTemplates, postCloneLibraryItem, - postCreateLibraryItem, - postRSFormFromFile -} from '@/app/backendAPI'; + postCreateLibraryItem +} from '@/backend/library'; +import { getRSFormDetails, postRSFormFromFile } from '@/backend/rsforms'; import { ErrorData } from '@/components/info/InfoError'; import { FolderTree } from '@/models/FolderTree'; import { ILibraryItem, LibraryItemID, LocationHead } from '@/models/library'; diff --git a/rsconcept/frontend/src/context/OssContext.tsx b/rsconcept/frontend/src/context/OssContext.tsx index fc67fdce..da041282 100644 --- a/rsconcept/frontend/src/context/OssContext.tsx +++ b/rsconcept/frontend/src/context/OssContext.tsx @@ -2,19 +2,17 @@ import { createContext, useCallback, useContext, useMemo, useState } from 'react'; +import { DataCallback } from '@/backend/apiTransport'; import { - type DataCallback, deleteUnsubscribe, - patchDeleteOperation, - patchEditorsSet as patchSetEditors, + patchEditorsSet, patchLibraryItem, patchSetAccessPolicy, patchSetLocation, patchSetOwner, - patchUpdatePositions, - postCreateOperation, postSubscribe -} from '@/app/backendAPI'; +} from '@/backend/library'; +import { patchDeleteOperation, patchUpdatePositions, postCreateOperation } from '@/backend/oss'; import { type ErrorData } from '@/components/info/InfoError'; import useOssDetails from '@/hooks/useOssDetails'; import { AccessPolicy, ILibraryItem } from '@/models/library'; @@ -238,7 +236,7 @@ export const OssState = ({ itemID, children }: OssStateProps) => { return; } setProcessingError(undefined); - patchSetEditors(itemID, { + patchEditorsSet(itemID, { data: { users: newEditors }, diff --git a/rsconcept/frontend/src/context/RSFormContext.tsx b/rsconcept/frontend/src/context/RSFormContext.tsx index 211e4fbf..3a193059 100644 --- a/rsconcept/frontend/src/context/RSFormContext.tsx +++ b/rsconcept/frontend/src/context/RSFormContext.tsx @@ -2,32 +2,32 @@ import { createContext, useCallback, useContext, useMemo, useState } from 'react'; +import { DataCallback } from '@/backend/apiTransport'; +import { patchConstituenta } from '@/backend/constituents'; import { - type DataCallback, deleteUnsubscribe, - deleteVersion, - getTRSFile, - patchConstituenta, - patchDeleteConstituenta, - patchEditorsSet as patchSetEditors, - patchInlineSynthesis, + patchEditorsSet, patchLibraryItem, + patchSetAccessPolicy, + patchSetLocation, + patchSetOwner, + postSubscribe +} from '@/backend/library'; +import { patchInlineSynthesis } from '@/backend/operations'; +import { + getTRSFile, + patchDeleteConstituenta, patchMoveConstituenta, patchProduceStructure, patchRenameConstituenta, patchResetAliases, patchRestoreOrder, - patchRestoreVersion, - patchSetAccessPolicy, - patchSetLocation, - patchSetOwner, patchSubstituteConstituents, patchUploadTRS, - patchVersion, postCreateConstituenta, - postCreateVersion, - postSubscribe -} from '@/app/backendAPI'; + postCreateVersion +} from '@/backend/rsforms'; +import { deleteVersion, patchRestoreVersion, patchVersion } from '@/backend/versions'; import { type ErrorData } from '@/components/info/InfoError'; import useRSFormDetails from '@/hooks/useRSFormDetails'; import { AccessPolicy, ILibraryItem, IVersionData, VersionID } from '@/models/library'; @@ -309,7 +309,7 @@ export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) = return; } setProcessingError(undefined); - patchSetEditors(itemID, { + patchEditorsSet(itemID, { data: { users: newEditors }, diff --git a/rsconcept/frontend/src/context/UserProfileContext.tsx b/rsconcept/frontend/src/context/UserProfileContext.tsx index 7c39352e..cd6d695b 100644 --- a/rsconcept/frontend/src/context/UserProfileContext.tsx +++ b/rsconcept/frontend/src/context/UserProfileContext.tsx @@ -2,7 +2,8 @@ import { createContext, useCallback, useContext, useEffect, useState } from 'react'; -import { DataCallback, getProfile, patchProfile } from '@/app/backendAPI'; +import { DataCallback } from '@/backend/apiTransport'; +import { getProfile, patchProfile } from '@/backend/users'; import { ErrorData } from '@/components/info/InfoError'; import { IUserProfile, IUserUpdateData } from '@/models/user'; import { contextOutsideScope } from '@/utils/labels'; diff --git a/rsconcept/frontend/src/context/UsersContext.tsx b/rsconcept/frontend/src/context/UsersContext.tsx index 2c966a6e..9ad93863 100644 --- a/rsconcept/frontend/src/context/UsersContext.tsx +++ b/rsconcept/frontend/src/context/UsersContext.tsx @@ -2,7 +2,7 @@ import { createContext, useCallback, useContext, useEffect, useState } from 'react'; -import { getActiveUsers } from '@/app/backendAPI'; +import { getActiveUsers } from '@/backend/users'; import { IUserInfo } from '@/models/user'; import { contextOutsideScope } from '@/utils/labels'; diff --git a/rsconcept/frontend/src/hooks/useCheckExpression.ts b/rsconcept/frontend/src/hooks/useCheckExpression.ts index 7d711b20..6a16c807 100644 --- a/rsconcept/frontend/src/hooks/useCheckExpression.ts +++ b/rsconcept/frontend/src/hooks/useCheckExpression.ts @@ -2,7 +2,8 @@ import { useCallback, useState } from 'react'; -import { DataCallback, postCheckExpression } from '@/app/backendAPI'; +import { DataCallback } from '@/backend/apiTransport'; +import { postCheckExpression } from '@/backend/rsforms'; import { type ErrorData } from '@/components/info/InfoError'; import { CstType, IConstituenta, type IRSForm } from '@/models/rsform'; import { getDefinitionPrefix } from '@/models/rsformAPI'; diff --git a/rsconcept/frontend/src/hooks/useConceptText.ts b/rsconcept/frontend/src/hooks/useConceptText.ts index 661d6ee7..ebb1bea7 100644 --- a/rsconcept/frontend/src/hooks/useConceptText.ts +++ b/rsconcept/frontend/src/hooks/useConceptText.ts @@ -2,7 +2,8 @@ import { useCallback, useState } from 'react'; -import { DataCallback, postGenerateLexeme, postInflectText, postParseText } from '@/app/backendAPI'; +import { DataCallback } from '@/backend/apiTransport'; +import { postGenerateLexeme, postInflectText, postParseText } from '@/backend/cctext'; import { ErrorData } from '@/components/info/InfoError'; import { ILexemeData, ITextRequest, ITextResult, IWordFormPlain } from '@/models/language'; diff --git a/rsconcept/frontend/src/hooks/useOssDetails.ts b/rsconcept/frontend/src/hooks/useOssDetails.ts index 7fd14aeb..8cafd64a 100644 --- a/rsconcept/frontend/src/hooks/useOssDetails.ts +++ b/rsconcept/frontend/src/hooks/useOssDetails.ts @@ -2,7 +2,7 @@ import { useCallback, useEffect, useState } from 'react'; -import { getOssDetails } from '@/app/backendAPI'; +import { getOssDetails } from '@/backend/oss'; import { type ErrorData } from '@/components/info/InfoError'; import { useAuth } from '@/context/AuthContext'; import { IOperationSchema, IOperationSchemaData } from '@/models/oss'; diff --git a/rsconcept/frontend/src/hooks/useRSFormDetails.ts b/rsconcept/frontend/src/hooks/useRSFormDetails.ts index ce6025a9..846a1d71 100644 --- a/rsconcept/frontend/src/hooks/useRSFormDetails.ts +++ b/rsconcept/frontend/src/hooks/useRSFormDetails.ts @@ -2,7 +2,7 @@ import { useCallback, useEffect, useState } from 'react'; -import { getRSFormDetails } from '@/app/backendAPI'; +import { getRSFormDetails } from '@/backend/rsforms'; import { type ErrorData } from '@/components/info/InfoError'; import { useAuth } from '@/context/AuthContext'; import { IRSForm, IRSFormData } from '@/models/rsform';