Skip to content

Commit

Permalink
fix(chat): fix external entities export (Issue #1434) (#1720)
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexander-Kezik authored Jul 3, 2024
1 parent 039bbcc commit 7628f9f
Show file tree
Hide file tree
Showing 8 changed files with 30 additions and 214 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ pnpm-lock.yaml
/apps/chat-e2e/allure-overlay-results/
/apps/chat-e2e/auth/
/apps/chat-e2e/html-report/
/apps/chat-e2e/chat-html-report/
/apps/chat-e2e/overlay-html-report/
/apps/chat-e2e/src/testData/export/
/apps/chat-e2e/.env.local

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { Prompt } from '@/chat/types/prompt';
import { ImportPromtsResponse } from '@/chat/utils/app/import-export';
import { FolderPrompt } from '@/src/testData';
import { UploadDownloadData } from '@/src/ui/pages';
import { ItemUtil } from '@/src/utils';
Expand All @@ -25,7 +24,7 @@ export class ImportPrompt {
importedPrompt.id = ItemUtil.getApiPromptId(importedPrompt);
}

const folderPromptToImport: ImportPromtsResponse = {
const folderPromptToImport = {
prompts: [importedPrompt],
folders: importedFolder ? [importedFolder.folders] : [],
isError: false,
Expand Down
7 changes: 3 additions & 4 deletions apps/chat-e2e/src/tests/chatExportImport.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -191,15 +191,14 @@ dialTest(
async () => {
await dialHomePage.openHomePage();
await dialHomePage.waitForPageLoaded();
await chatBar.createNewFolder();
exportedData = await dialHomePage.downloadData(() =>
chatBar.exportButton.click(),
);
},
);

await dialTest.step(
'Delete all conversations and folders, re-import again and verify they are displayed',
'Delete all conversations and folders, re-import again and verify that all entities except empty folders are displayed',
async () => {
await chatBar.deleteAllEntities();
await confirmationDialog.confirm({ triggeredHttpMethod: 'DELETE' });
Expand All @@ -211,9 +210,9 @@ dialTest(
folderConversations.getFolderByName(
ExpectedConstants.newFolderWithIndexTitle(1),
),
ExpectedMessages.folderExpanded,
ExpectedMessages.folderIsNotVisible,
)
.toBeVisible();
.toBeHidden();
await expect
.soft(
conversations.getConversationByName(conversationOutsideFolder.name),
Expand Down
13 changes: 9 additions & 4 deletions apps/chat-e2e/src/tests/promptExportImport.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ dialTest(
);

await dialTest.step(
'Delete all prompts and folders, re-import again and verify they are displayed',
'Delete all prompts and folders, re-import again and verify that all entities except empty folders are displayed',
async () => {
await promptBar.deleteAllEntities();
await confirmationDialog.confirm({ triggeredHttpMethod: 'DELETE' });
Expand All @@ -102,9 +102,14 @@ dialTest(
await folderPrompts
.getFolderByName(promptsInsideFolder.folders.name)
.waitFor();
await folderPrompts
.getFolderByName(ExpectedConstants.newFolderWithIndexTitle(1))
.waitFor();
await expect
.soft(
folderPrompts.getFolderByName(
ExpectedConstants.newFolderWithIndexTitle(1),
),
ExpectedMessages.folderIsNotVisible,
)
.toBeHidden();

await prompts.getPromptByName(promptOutsideFolder.name).waitFor();

Expand Down
8 changes: 0 additions & 8 deletions apps/chat/src/store/conversations/conversations.selectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,6 @@ export const selectConversations = createSelector(
(state) => state.conversations,
);

export const selectExternalConversations = createSelector(
[(state: RootState) => state, selectConversations],
(state, conversations) =>
conversations.filter((conversation) =>
isEntityOrParentsExternal(state, conversation, FeatureType.Chat),
),
);

export const selectPublishedOrSharedByMeConversations = createSelector(
[selectConversations],
(conversations) => conversations.filter((c) => c.isShared || c.isPublished),
Expand Down
85 changes: 13 additions & 72 deletions apps/chat/src/store/import-export/importExport.epics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import { AnyAction } from '@reduxjs/toolkit';
import { combineEpics } from 'redux-observable';

import {
combineEntities,
filterOnlyMyEntities,
isImportEntityNameOnSameLevelUnique,
} from '@/src/utils/app/common';
Expand All @@ -49,9 +48,7 @@ import {
} from '@/src/utils/app/folders';
import { getFileRootId } from '@/src/utils/app/id';
import {
cleanConversationsFolders,
cleanData,
cleanPromptsFolders,
exportConversation,
exportConversations,
exportPrompt,
Expand Down Expand Up @@ -176,26 +173,17 @@ const exportConversationsEpic: AppEpic = (action$, state$) =>
switchMap(
() => ConversationService.getConversations(undefined, true), //listing of all entities
),
switchMap((conversationsListing) => {
const onlyMyConversationsListing =
filterOnlyMyEntities(conversationsListing);
const foldersIds = uniq(
onlyMyConversationsListing.map((info) => info.folderId),
);
//calculate all folders;
const foldersWithConversation = getFoldersFromIds(
switchMap((conversations) => {
const foldersIds = uniq(conversations.map((info) => info.folderId));
const folders = getFoldersFromIds(
uniq(foldersIds.flatMap((id) => getParentFolderIdsFromFolderId(id))),
FolderType.Chat,
);

const allFolders = ConversationsSelectors.selectFolders(state$.value);

const folders = combineEntities(foldersWithConversation, allFolders);

return forkJoin({
//get all conversations from api
conversations: zip(
onlyMyConversationsListing.map((info) =>
conversations.map((info) =>
ConversationService.getConversation(info),
),
),
Expand Down Expand Up @@ -260,26 +248,16 @@ const exportPromptsEpic: AppEpic = (action$, state$) =>
//listing of all entities
PromptService.getPrompts(undefined, true),
),
switchMap((promptsListing) => {
const onlyMyPromptsListing = filterOnlyMyEntities(promptsListing);
const foldersIds = uniq(
onlyMyPromptsListing.map((info) => info.folderId),
);
//calculate all folders;
const foldersWithPrompts = getFoldersFromIds(
switchMap((prompts) => {
const foldersIds = uniq(prompts.map((info) => info.folderId));
const folders = getFoldersFromIds(
uniq(foldersIds.flatMap((id) => getParentFolderIdsFromFolderId(id))),
FolderType.Prompt,
);

const allFolders = PromptsSelectors.selectFolders(state$.value);

const folders = combineEntities(foldersWithPrompts, allFolders);

return forkJoin({
//get all prompts from api
prompts: zip(
onlyMyPromptsListing.map((info) => PromptService.getPrompt(info)),
),
prompts: zip(prompts.map((info) => PromptService.getPrompt(info))),
folders: of(folders),
});
}),
Expand Down Expand Up @@ -389,17 +367,10 @@ const importConversationsEpic: AppEpic = (action$) =>
entities: conversationsListing,
});
});
const emptyFolders = folders.filter(
(folder) =>
!preparedConversations.some(
(conv) => conv.folderId === folder.id,
),
);
if (!existedImportNamesConversations.length) {
return of(
ImportExportActions.uploadImportedConversations({
itemsToUpload: nonExistedImportNamesConversations,
folders: emptyFolders,
}),
);
}
Expand All @@ -423,7 +394,6 @@ const importConversationsEpic: AppEpic = (action$) =>
of(
ImportExportActions.uploadImportedConversations({
itemsToUpload: nonExistedImportNamesConversations,
folders: emptyFolders,
}),
),
);
Expand Down Expand Up @@ -525,16 +495,10 @@ const importPromptsEpic: AppEpic = (action$) =>
},
);

const emptyFolders = promptsHistory.folders.filter(
(folder) =>
!preparedPrompts.some((conv) => conv.folderId === folder.id),
);

if (!existedImportNamesPrompts.length) {
return of(
ImportExportActions.uploadImportedPrompts({
itemsToUpload: nonExistedImportNamesPrompts,
folders: emptyFolders,
}),
);
}
Expand All @@ -555,12 +519,6 @@ const importPromptsEpic: AppEpic = (action$) =>
featureType: FeatureType.Prompt,
}),
),
of(
ImportExportActions.uploadImportedPrompts({
itemsToUpload: nonExistedImportNamesPrompts,
folders: emptyFolders,
}),
),
);
}),
catchError(() => of(ImportExportActions.importPromptsFail())),
Expand Down Expand Up @@ -599,25 +557,11 @@ const uploadImportedConversationsEpic: AppEpic = (action$, state$) =>
FolderType.Chat,
);

const cleanFolders = cleanConversationsFolders(
payload.folders ?? [],
);

const newFolders = combineEntities(
conversationsFolders,
cleanFolders,
);

const firstImportedConversation = uploadedConversations[0];

const uploadedConversationsFoldersIds = uniq(
uploadedConversations.map((info) => info.folderId),
);

const importedFoldersIds = cleanFolders.map(
(folder) => folder.id,
);

const openedFolderIds = UISelectors.selectOpenedFoldersIds(
state$.value,
FeatureType.Chat,
Expand All @@ -635,7 +579,7 @@ const uploadImportedConversationsEpic: AppEpic = (action$, state$) =>
of(
ConversationsActions.importConversationsSuccess({
conversations: conversationsListing,
folders: newFolders,
folders: conversationsFolders,
}),
),
of(
Expand All @@ -647,7 +591,7 @@ const uploadImportedConversationsEpic: AppEpic = (action$, state$) =>
UIActions.setOpenedFoldersIds({
openedFolderIds: uniq([
...uploadedConversationsFoldersIds,
...importedFoldersIds,
...conversationsFolders.map((folder) => folder.id),
...openedFolderIds,
]),
featureType: FeatureType.Chat,
Expand Down Expand Up @@ -684,7 +628,8 @@ const uploadImportedPromptsEpic: AppEpic = (action$, state$) =>
action$.pipe(
filter(ImportExportActions.uploadImportedPrompts.match),
switchMap(({ payload }) => {
const { itemsToUpload, folders } = payload;
const { itemsToUpload } = payload;

return from(PromptService.setPrompts(itemsToUpload)).pipe(
toArray(),
switchMap(() => {
Expand All @@ -707,10 +652,6 @@ const uploadImportedPromptsEpic: AppEpic = (action$, state$) =>
FolderType.Prompt,
);

const cleanFolders = cleanPromptsFolders(folders ?? []);

const newFolders = combineEntities(promptsFolders, cleanFolders);

const numberOfRunningOperations =
ImportExportSelectors.selectNumberOfRunningOperations(
state$.value,
Expand All @@ -723,7 +664,7 @@ const uploadImportedPromptsEpic: AppEpic = (action$, state$) =>
of(
PromptsActions.importPromptsSuccess({
prompts: promptsListing,
folders: newFolders,
folders: promptsFolders,
}),
),

Expand Down
3 changes: 0 additions & 3 deletions apps/chat/src/store/import-export/importExport.reducers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { PayloadAction, createSelector, createSlice } from '@reduxjs/toolkit';
import { Conversation, ConversationInfo } from '@/src/types/chat';
import { FeatureType, UploadStatus } from '@/src/types/common';
import { DialFile } from '@/src/types/files';
import { FolderInterface } from '@/src/types/folder';
import {
LatestExportFormat,
Operation,
Expand Down Expand Up @@ -152,7 +151,6 @@ export const importExportSlice = createSlice({
state,
_action: PayloadAction<{
itemsToUpload: Conversation[];
folders?: FolderInterface[];
}>,
) => {
state.numberOfRunningOperations = state.numberOfRunningOperations + 1;
Expand All @@ -169,7 +167,6 @@ export const importExportSlice = createSlice({
state,
_action: PayloadAction<{
itemsToUpload: Prompt[];
folders?: FolderInterface[];
}>,
) => {
state.numberOfRunningOperations = state.numberOfRunningOperations + 1;
Expand Down
Loading

0 comments on commit 7628f9f

Please sign in to comment.