From 869cb7ea889b95d78263f36581ee8357ba36a6f1 Mon Sep 17 00:00:00 2001 From: Doug Lauder Date: Mon, 14 Feb 2022 10:38:45 -0500 Subject: [PATCH] restore ArchiveUtils for import scripts (#2314) --- import/asana/importAsana.ts | 2 +- import/jira/jiraImporter.ts | 2 +- import/notion/importNotion.ts | 2 +- import/todoist/importTodoist.ts | 2 +- import/trello/importTrello.ts | 2 +- import/util/archive.ts | 81 +++++++++++++++++++++++++++++++++ 6 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 import/util/archive.ts diff --git a/import/asana/importAsana.ts b/import/asana/importAsana.ts index 58ca3cca933..806c1f5f92c 100644 --- a/import/asana/importAsana.ts +++ b/import/asana/importAsana.ts @@ -3,7 +3,7 @@ import * as fs from 'fs' import minimist from 'minimist' import {exit} from 'process' -import {ArchiveUtils} from '../../webapp/src/blocks/archive' +import {ArchiveUtils} from '../util/archive' import {Block} from '../../webapp/src/blocks/block' import {IPropertyOption, IPropertyTemplate, createBoard} from '../../webapp/src/blocks/board' import {createBoardView} from '../../webapp/src/blocks/boardView' diff --git a/import/jira/jiraImporter.ts b/import/jira/jiraImporter.ts index e35d33cff7d..afca95171fd 100644 --- a/import/jira/jiraImporter.ts +++ b/import/jira/jiraImporter.ts @@ -2,7 +2,7 @@ // See LICENSE.txt for license information. import * as fs from 'fs' import {exit} from 'process' -import {ArchiveUtils} from '../../webapp/src/blocks/archive' +import {ArchiveUtils} from '../util/archive' import {Block} from '../../webapp/src/blocks/block' import {IPropertyOption, IPropertyTemplate, createBoard} from '../../webapp/src/blocks/board' import {createBoardView} from '../../webapp/src/blocks/boardView' diff --git a/import/notion/importNotion.ts b/import/notion/importNotion.ts index 4f48acbbf98..10a71e8871a 100644 --- a/import/notion/importNotion.ts +++ b/import/notion/importNotion.ts @@ -3,7 +3,7 @@ import * as fs from 'fs' import minimist from 'minimist' import path from 'path' import {exit} from 'process' -import {ArchiveUtils} from '../../webapp/src/blocks/archive' +import {ArchiveUtils} from '../util/archive' import {Block} from '../../webapp/src/blocks/block' import {IPropertyTemplate, createBoard} from '../../webapp/src/blocks/board' import {createBoardView} from '../../webapp/src/blocks/boardView' diff --git a/import/todoist/importTodoist.ts b/import/todoist/importTodoist.ts index bbbb338ce25..a881b59bbf1 100644 --- a/import/todoist/importTodoist.ts +++ b/import/todoist/importTodoist.ts @@ -3,7 +3,7 @@ import * as fs from 'fs' import minimist from 'minimist' import {exit} from 'process' -import {ArchiveUtils} from '../../webapp/src/blocks/archive' +import {ArchiveUtils} from '../util/archive' import {Block} from '../../webapp/src/blocks/block' import {IPropertyOption, IPropertyTemplate, createBoard} from '../../webapp/src/blocks/board' import {createBoardView} from '../../webapp/src/blocks/boardView' diff --git a/import/trello/importTrello.ts b/import/trello/importTrello.ts index 7157d0f9ced..afa95cba3b1 100644 --- a/import/trello/importTrello.ts +++ b/import/trello/importTrello.ts @@ -3,7 +3,7 @@ import * as fs from 'fs' import minimist from 'minimist' import {exit} from 'process' -import {ArchiveUtils} from '../../webapp/src/blocks/archive' +import {ArchiveUtils} from '../util/archive' import {Block} from '../../webapp/src/blocks/block' import {IPropertyOption, IPropertyTemplate, createBoard} from '../../webapp/src/blocks/board' import {createBoardView} from '../../webapp/src/blocks/boardView' diff --git a/import/util/archive.ts b/import/util/archive.ts new file mode 100644 index 00000000000..e4502d3f421 --- /dev/null +++ b/import/util/archive.ts @@ -0,0 +1,81 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. +import {Block} from '../../webapp/src/blocks/block' + +interface ArchiveHeader { + version: number + date: number +} + +interface ArchiveLine { + type: string, + data: unknown, +} + +// This schema allows the expansion of additional line types in the future +interface BlockArchiveLine extends ArchiveLine { + type: 'block', + data: Block +} + +class ArchiveUtils { + static buildBlockArchive(blocks: readonly Block[]): string { + const header: ArchiveHeader = { + version: 1, + date: Date.now(), + } + + const headerString = JSON.stringify(header) + let content = headerString + '\n' + for (const block of blocks) { + const line: BlockArchiveLine = { + type: 'block', + data: block, + } + const lineString = JSON.stringify(line) + content += lineString + content += '\n' + } + + return content + } + + static parseBlockArchive(contents: string): Block[] { + const blocks: Block[] = [] + const allLineStrings = contents.split('\n') + if (allLineStrings.length >= 2) { + const headerString = allLineStrings[0] + const header = JSON.parse(headerString) as ArchiveHeader + if (header.date && header.version >= 1) { + const lineStrings = allLineStrings.slice(1) + let lineNum = 2 + for (const lineString of lineStrings) { + if (!lineString) { + // Ignore empty lines, e.g. last line + continue + } + const line = JSON.parse(lineString) as ArchiveLine + if (!line || !line.type || !line.data) { + throw new Error(`ERROR parsing line ${lineNum}`) + } + switch (line.type) { + case 'block': { + const blockLine = line as BlockArchiveLine + const block = blockLine.data + blocks.push(block) + break + } + } + + lineNum += 1 + } + } else { + throw new Error('ERROR parsing header') + } + } + + return blocks + } +} + +export {ArchiveHeader, ArchiveLine, BlockArchiveLine, ArchiveUtils} \ No newline at end of file