Skip to content

Commit

Permalink
Merge branch 'development' into fix/2989-reset-after-logout
Browse files Browse the repository at this point in the history
  • Loading branch information
IlyaBondar authored Jan 24, 2025
2 parents 21d580f + a6f64c0 commit 92f8cf3
Show file tree
Hide file tree
Showing 4 changed files with 231 additions and 91 deletions.
253 changes: 163 additions & 90 deletions apps/chat/src/store/publication/publication.epics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,22 +34,21 @@ import {
splitEntityId,
} from '@/src/utils/app/folders';
import {
getConversationRootId,
getPromptRootId,
isApplicationId,
isConversationId,
isFileId,
isPromptId,
isRootId,
} from '@/src/utils/app/id';
import {
getItemsIdsToRemoveAndHide,
isEntityIdPublic,
mapPublishedItems,
} from '@/src/utils/app/publications';
import { translate } from '@/src/utils/app/translation';
import {
ApiUtils,
getPublicItemIdWithoutVersion,
getIdWithoutVersionFromApiKey,
parseConversationApiKey,
parsePromptApiKey,
} from '@/src/utils/server/api';
Expand All @@ -62,7 +61,6 @@ import { AppEpic } from '@/src/types/store';

import { DEFAULT_CONVERSATION_NAME } from '@/src/constants/default-ui-settings';
import { errorsMessages } from '@/src/constants/errors';
import { NA_VERSION, PUBLIC_URL_PREFIX } from '@/src/constants/public';

import { AuthSelectors } from '../auth/auth.reducers';
import {
Expand Down Expand Up @@ -782,58 +780,67 @@ const approvePublicationEpic: AppEpic = (action$, state$) =>
switchMap(({ payload }) =>
PublicationService.approvePublication(payload.url).pipe(
switchMap(() => {
const actions: Observable<AnyAction>[] = [];
const selectedPublication =
PublicationSelectors.selectSelectedPublication(state$.value);

if (!selectedPublication) {
return of(PublicationActions.approvePublicationFail());
}

const actions: Observable<AnyAction>[] = [];
const state = state$.value;

const resourcesToReview =
PublicationSelectors.selectResourcesToReview(state);

const conversationResources = selectedPublication.resources.filter(
(r) => isConversationId(r.targetUrl),
(resource) => isConversationId(resource.targetUrl),
);
const conversationResourcesToPublish = conversationResources.filter(
(r) => r.action === PublishActions.ADD,
(resource) => resource.action === PublishActions.ADD,
);
const conversationResourcesToUnpublish = conversationResources.filter(
(r) => r.action === PublishActions.DELETE,
(resource) => resource.action === PublishActions.DELETE,
);

if (conversationResourcesToUnpublish.length) {
const allConversations = ConversationsSelectors.selectConversations(
state$.value,
);
const allFolders = ConversationsSelectors.selectFolders(
state$.value,
);
const conversationsToRemove = conversationResourcesToUnpublish.map(
(r) => r.reviewUrl,
);
const allConversations =
ConversationsSelectors.selectConversations(state);
const allFolders = ConversationsSelectors.selectFolders(state);

const { itemsToHideIds, itemsToRemoveIds } =
getItemsIdsToRemoveAndHide(
conversationResourcesToUnpublish,
resourcesToReview,
);
const idsToExclude = [...itemsToRemoveIds, ...itemsToHideIds];
const filteredConversations = allConversations.filter(
(c) => !conversationsToRemove.includes(c.id),
(conv) => !idsToExclude.includes(conv.id),
);
const filteredFolders = allFolders.filter(
(f) =>
f.status !== UploadStatus.LOADED ||
!f.id.startsWith(getConversationRootId(PUBLIC_URL_PREFIX)) ||
(filteredConversations.some((c) =>
c.id.startsWith(`${f.id}/`),
) &&
f.id.startsWith(getConversationRootId(PUBLIC_URL_PREFIX))),
);
const versionGroups = uniq(
conversationsToRemove.map((id) => {
const parsedApiKey = parseConversationApiKey(
splitEntityId(id).name,
{ parseVersion: true },
);
const filteredFolders = allFolders.filter((folder) => {
const isNotLoaded = folder.status !== UploadStatus.LOADED;
const isPublic = !isEntityIdPublic(folder);
const hasConversations = filteredConversations.some((conv) =>
conv.id.startsWith(`${folder.id}/`),
);

return getPublicItemIdWithoutVersion(
parsedApiKey.publicationInfo?.version ?? NA_VERSION,
id,
);
}),
return isNotLoaded || isPublic || hasConversations;
});
const foldersToHide = allFolders.filter((folder) => {
const hasConversations = filteredConversations.some((conv) =>
conv.id.startsWith(`${folder.id}/`),
);
const hasHiddenConversations = itemsToHideIds.some((convId) =>
convId.startsWith(`${folder.id}/`),
);

return !hasConversations && hasHiddenConversations;
});

const versionGroups = uniq(
itemsToRemoveIds.map((id) =>
getIdWithoutVersionFromApiKey(id, parseConversationApiKey),
),
);

actions.push(
Expand All @@ -842,27 +849,51 @@ const approvePublicationEpic: AppEpic = (action$, state$) =>
conversations: filteredConversations,
}),
),
of(
ConversationsActions.addConversations({
conversations: allConversations
.filter((conv) => itemsToHideIds.includes(conv.id))
.map((conv) => ({
status: undefined,
id: conv.id,
model: { id: conv.model.id },
name: conv.name,
folderId: conv.folderId,
publicationInfo: {
isNotExist: true,
},
publishedWithMe: false,
})),
}),
),
of(
ConversationsActions.setFolders({
folders: filteredFolders,
}),
),
of(
ConversationsActions.addFolders({
folders: foldersToHide.map((folder) => ({
...folder,
publishedWithMe: false,
})),
}),
),
of(
PublicationActions.markResourcesAsReviewedByIds({
ids: itemsToHideIds,
}),
),
of(
PublicationActions.removePublicVersionGroups({
groupsToRemove: versionGroups.map((groupId) => ({
groupIds: conversationsToRemove.filter((id) => {
const parsedApiKey = parseConversationApiKey(
splitEntityId(id).name,
{ parseVersion: true },
);

return (
getPublicItemIdWithoutVersion(
parsedApiKey.publicationInfo?.version ?? NA_VERSION,
groupIds: idsToExclude.filter(
(id) =>
getIdWithoutVersionFromApiKey(
id,
) === groupId
);
}),
parseConversationApiKey,
) === groupId,
),
versionGroupId: groupId,
})),
}),
Expand All @@ -875,7 +906,7 @@ const approvePublicationEpic: AppEpic = (action$, state$) =>
conversationResourcesToPublish.flatMap((resource) =>
getParentFolderIdsFromEntityId(
getFolderIdFromEntityId(resource.targetUrl),
).filter((p) => p !== resource.targetUrl),
).filter((folderId) => folderId !== resource.targetUrl),
),
);

Expand All @@ -900,7 +931,13 @@ const approvePublicationEpic: AppEpic = (action$, state$) =>
),
of(
ConversationsActions.addConversations({
conversations: items,
conversations: items.map((item) => {
if (item.publicationInfo?.isNotExist) {
item.publicationInfo.isNotExist = false;
}

return item;
}),
}),
),
of(
Expand All @@ -911,42 +948,50 @@ const approvePublicationEpic: AppEpic = (action$, state$) =>
);
}

const promptResources = selectedPublication.resources.filter((r) =>
isPromptId(r.targetUrl),
const promptResources = selectedPublication.resources.filter(
(resource) => isPromptId(resource.targetUrl),
);
const promptResourcesToPublish = promptResources.filter(
(r) => r.action === PublishActions.ADD,
(resource) => resource.action === PublishActions.ADD,
);
const promptResourcesToUnpublish = promptResources.filter(
(r) => r.action === PublishActions.DELETE,
(resource) => resource.action === PublishActions.DELETE,
);

if (promptResourcesToUnpublish.length) {
const allPrompts = PromptsSelectors.selectPrompts(state$.value);
const promptsToRemove = promptResourcesToUnpublish.map(
(r) => r.reviewUrl,
);
const allFolders = PromptsSelectors.selectFolders(state$.value);
const allPrompts = PromptsSelectors.selectPrompts(state);
const allFolders = PromptsSelectors.selectFolders(state);
const { itemsToHideIds, itemsToRemoveIds } =
getItemsIdsToRemoveAndHide(
promptResourcesToUnpublish,
resourcesToReview,
);
const idsToExclude = [...itemsToRemoveIds, ...itemsToHideIds];
const filteredPrompts = allPrompts.filter(
(p) => !promptsToRemove.includes(p.id),
);
const filteredFolders = allFolders.filter(
(f) =>
f.status !== UploadStatus.LOADED ||
!f.id.startsWith(getPromptRootId(PUBLIC_URL_PREFIX)) ||
(filteredPrompts.some((c) => c.id.startsWith(`${f.id}/`)) &&
f.id.startsWith(getPromptRootId(PUBLIC_URL_PREFIX))),
(prompt) => !idsToExclude.includes(prompt.id),
);
const filteredFolders = allFolders.filter((folder) => {
const isNotLoaded = folder.status !== UploadStatus.LOADED;
const isPublic = !isEntityIdPublic(folder);
const hasPrompts = filteredPrompts.some((prompt) =>
prompt.id.startsWith(`${folder.id}/`),
);

return isNotLoaded || isPublic || hasPrompts;
});
const foldersToHide = allFolders.filter((folder) => {
const hasPrompts = filteredPrompts.some((prompt) =>
prompt.id.startsWith(`${folder.id}/`),
);
const hasHiddenPrompts = itemsToHideIds.some((promptId) =>
promptId.startsWith(`${folder.id}/`),
);

return !hasPrompts && hasHiddenPrompts;
});
const versionGroups = uniq(
promptsToRemove.map((id) => {
const parsedApiKey = parsePromptApiKey(splitEntityId(id).name, {
parseVersion: true,
});

return getPublicItemIdWithoutVersion(
parsedApiKey.publicationInfo?.version ?? NA_VERSION,
id,
);
itemsToRemoveIds.map((id) => {
return getIdWithoutVersionFromApiKey(id, parsePromptApiKey);
}),
);

Expand All @@ -956,25 +1001,47 @@ const approvePublicationEpic: AppEpic = (action$, state$) =>
prompts: filteredPrompts,
}),
),
of(
PromptsActions.addPrompts({
prompts: allPrompts
.filter((prompt) => itemsToHideIds.includes(prompt.id))
.map((prompt) => ({
status: undefined,
id: prompt.id,
name: prompt.name,
folderId: prompt.folderId,
publicationInfo: {
isNotExist: true,
},
publishedWithMe: false,
})),
}),
),
of(
PromptsActions.setFolders({
folders: filteredFolders,
}),
),
of(
PromptsActions.addFolders({
folders: foldersToHide.map((folder) => ({
...folder,
publishedWithMe: false,
})),
}),
),
of(
PublicationActions.markResourcesAsReviewedByIds({
ids: itemsToHideIds,
}),
),
of(
PublicationActions.removePublicVersionGroups({
groupsToRemove: versionGroups.map((groupId) => ({
groupIds: promptsToRemove.filter((id) => {
const parsedApiKey = parseConversationApiKey(
splitEntityId(id).name,
{ parseVersion: true },
);

groupIds: idsToExclude.filter((id) => {
return (
getPublicItemIdWithoutVersion(
parsedApiKey.publicationInfo?.version ?? NA_VERSION,
id,
) === groupId
getIdWithoutVersionFromApiKey(id, parsePromptApiKey) ===
groupId
);
}),
versionGroupId: groupId,
Expand All @@ -989,7 +1056,7 @@ const approvePublicationEpic: AppEpic = (action$, state$) =>
promptResourcesToPublish.flatMap((resource) =>
getParentFolderIdsFromEntityId(
getFolderIdFromEntityId(resource.targetUrl),
).filter((p) => p !== resource.targetUrl),
).filter((folderId) => folderId !== resource.targetUrl),
),
);

Expand All @@ -1013,7 +1080,13 @@ const approvePublicationEpic: AppEpic = (action$, state$) =>
),
of(
PromptsActions.addPrompts({
prompts: items,
prompts: items.map((item) => {
if (item.publicationInfo?.isNotExist) {
item.publicationInfo.isNotExist = false;
}

return item;
}),
}),
),
of(
Expand Down
Loading

0 comments on commit 92f8cf3

Please sign in to comment.