Skip to content
This repository was archived by the owner on Jul 9, 2025. It is now read-only.
Original file line number Diff line number Diff line change
Expand Up @@ -279,14 +279,18 @@ const emptyQnaFile = (id: string, content: string): QnAFile => {
};

const parseAllAssets = async ({ set }: CallbackInterface, projectId: string, botFiles: any) => {
const { luFiles, lgFiles, qnaFiles, mergedSettings } = botFiles;

const { luFiles, lgFiles, qnaFiles, mergedSettings, dialogs } = botFiles;
const [parsedLgFiles, parsedLuFiles, parsedQnaFiles] = await Promise.all([
lgWorker.parseAll(projectId, lgFiles),
luWorker.parseAll(luFiles, mergedSettings.luFeatures),
qnaWorker.parseAll(qnaFiles),
]);

// migrate script move qna pairs in *.qna to *-manual.source.qna.
const locales = mergedSettings.languages;
const dialogIds = dialogs.map((d) => d.id);
const migratedQnAFiles = migrateQnAFiles(projectId, dialogIds, parsedQnaFiles as QnAFile[], locales);

set(lgFilesSelectorFamily(projectId), (oldFiles) => {
return oldFiles.map((item) => {
const file = (parsedLgFiles as LgFile[]).find((file) => file.id === item.id);
Expand All @@ -302,9 +306,9 @@ const parseAllAssets = async ({ set }: CallbackInterface, projectId: string, bot
});

set(qnaFilesSelectorFamily(projectId), (oldFiles) => {
return oldFiles.map((item) => {
const file = (parsedQnaFiles as QnAFile[]).find((file) => file.id === item.id);
return file && item.isContentUnparsed ? file : item;
return migratedQnAFiles.map((newFile) => {
const oldFile = oldFiles.find((file) => file.id === newFile.id);
return oldFile && !oldFile.isContentUnparsed ? oldFile : newFile;
});
});

Expand All @@ -316,21 +320,16 @@ export const loadProjectData = async (data) => {
const mergedSettings = getMergedSettings(projectId, settings, botName);
const indexedFiles = indexer.index(files, botName);

const { lgResources, luResources, qnaResources, dialogs } = indexedFiles;
const locales = settings.languages;
const { lgResources, luResources, qnaResources } = indexedFiles;

//parse all resources with worker
lgWorker.addProject(projectId);

const lgFiles = lgResources.map(({ id, content }) => emptyLgFile(id, content));
const luFiles = luResources.map(({ id, content }) => emptyLuFile(id, content));
const qnaFiles = qnaResources.map(({ id, content }) => emptyQnaFile(id, content));
const dialogIds = dialogs.map((d) => d.id);
// migrate script move qna pairs in *.qna to *-manual.source.qna.
// TODO: remove after a period of time.
const updatedQnAFiles = migrateQnAFiles(projectId, dialogIds, qnaFiles, locales);

const assets = { ...indexedFiles, lgFiles, luFiles, qnaFiles: updatedQnAFiles };
const assets = { ...indexedFiles, lgFiles, luFiles, qnaFiles };
//Validate all files
const diagnostics = BotIndexer.validate({
...assets,
Expand Down
18 changes: 6 additions & 12 deletions Composer/packages/client/src/utils/qnaUtil.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@
import { QnAFile, DialogInfo } from '@bfc/shared';
import { qnaUtil, BotIndexer } from '@bfc/indexers';

import { createFile, updateFile, deleteFile } from '../recoilModel/persistence/http';

import { getBaseName, getExtension } from './fileUtil';

export const getFileLocale = (fileName: string) => {
Expand Down Expand Up @@ -55,26 +53,25 @@ export const reformQnAToContainerKB = (projectId: string, qnaFiles: QnAFile[], l
const manualContainerContent = substringTextByLine(content, qnaSectionStartLine - 1);
let originQnAFile = qnaUtil.parse(id, originQnAFileContent);

const manualContainerFileId = `${getBaseName(id)}-manual.source`;
const manualContainerFullFileId = `${manualContainerFileId}.qna`;
const locale = getExtension(id);
const manualContainerSourceId = `${getBaseName(id)}-manual.source`;
const manualContainerFileId = `${manualContainerSourceId}.${locale}`;
const manualContainerImportId = `${manualContainerSourceId}.qna`;

// if container file not be imported, do import
if (!originQnAFile.imports.find(({ id }) => manualContainerFullFileId === id)) {
originQnAFile = qnaUtil.addImport(originQnAFile, manualContainerFullFileId);
if (!originQnAFile.imports.find(({ id }) => manualContainerImportId === id)) {
originQnAFile = qnaUtil.addImport(originQnAFile, manualContainerImportId);
}
updateFile(projectId, `${originQnAFile.id}.qna`, originQnAFile.content);
updatedFiles.push(originQnAFile);

// if container file not exist, create it. if exist, update it
const originManualContainerFile = qnaFiles.find((item) => item.id === manualContainerFileId);
if (originManualContainerFile) {
const updatedContent = originManualContainerFile.content + '\n' + manualContainerContent;
const updatedFile = qnaUtil.parse(manualContainerFileId, updatedContent);
updateFile(projectId, `${updatedFile.id}.qna`, updatedFile.content);
updatedFiles.push(updatedFile);
} else {
const createdFile = qnaUtil.parse(manualContainerFileId, manualContainerContent);
createFile(projectId, `${createdFile.id}.qna`, createdFile.content);
createdFiles.push(createdFile);
}
});
Expand Down Expand Up @@ -103,14 +100,12 @@ export const copyQnAFilesOnOtherLocales = (
const createdFile = qnaUtil.parse('dummyId', originalSourceQnAFiles[i].content);
for (let j = 0; j < newSourceQnAFileIds.length; j++) {
if (!qnaFiles.find((f) => f.id === newSourceQnAFileIds[j])) {
createFile(projectId, `${newSourceQnAFileIds[j]}.qna`, createdFile.content);
createdFiles.push({
...createdFile,
id: newSourceQnAFileIds[j],
});
}
}
deleteFile(projectId, `${originalSourceQnAFiles[i].id}.qna`);
}

for (let i = 0; i < containerKbFiles.length; i++) {
Expand All @@ -119,7 +114,6 @@ export const copyQnAFilesOnOtherLocales = (
const createdFile = qnaUtil.parse('dummyId', containerKbFiles[i].content);
for (let j = 0; j < newContainerKbFileIds.length; j++) {
if (!qnaFiles.find((f) => f.id === newContainerKbFileIds[j])) {
createFile(projectId, `${newContainerKbFileIds[j]}.qna`, createdFile.content);
createdFiles.push({
...createdFile,
id: newContainerKbFileIds[j],
Expand Down