You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.2 KiB
TypeScript
83 lines
2.2 KiB
TypeScript
import { INBOX_SESSION_ID } from '@/const/session';
|
|
import type { Migration, MigrationData } from '@/migrations/VersionController';
|
|
|
|
import { V1Chat, V1ConfigState, V1Session, V1Topic } from './types/v1';
|
|
import { V2ConfigState, V2Message, V2Session, V2Topic } from './types/v2';
|
|
|
|
export class MigrationV1ToV2 implements Migration {
|
|
// from this version to start migration
|
|
version = 1;
|
|
|
|
migrateSession = (
|
|
session: V1Session,
|
|
finalMessages: V2Message[],
|
|
finalTopics: V2Topic[],
|
|
): V2Session => {
|
|
const { chats, topics, createAt, updateAt, pinned, ...i } = session;
|
|
|
|
if (chats) {
|
|
for (const chat of Object.values(chats)) {
|
|
finalMessages.push(this.migrationMessage(chat, i.id));
|
|
}
|
|
}
|
|
|
|
if (topics) {
|
|
for (const chat of Object.values(topics)) {
|
|
finalTopics.push(this.migrationTopic(i.id, chat));
|
|
}
|
|
}
|
|
|
|
return { ...i, createdAt: createAt, group: pinned ? 'pinned' : 'default', updatedAt: updateAt };
|
|
};
|
|
|
|
migrate(data: MigrationData<V1ConfigState>): MigrationData<V2ConfigState> {
|
|
const { sessions: v1Session = {}, inbox } = data.state;
|
|
const v2Messages: V2Message[] = [];
|
|
const v2Topics: V2Topic[] = [];
|
|
|
|
const sessions: V2Session[] = Object.values(v1Session).map((s) =>
|
|
this.migrateSession(s, v2Messages, v2Topics),
|
|
);
|
|
|
|
if (inbox) {
|
|
this.migrateSession({ ...inbox, id: INBOX_SESSION_ID }, v2Messages, v2Topics);
|
|
}
|
|
|
|
return {
|
|
...data,
|
|
state: {
|
|
...data.state,
|
|
messages: v2Messages,
|
|
sessions,
|
|
topics: v2Topics,
|
|
},
|
|
};
|
|
}
|
|
|
|
migrationMessage = (
|
|
{ createAt, extra, updateAt, name, function_call, ...chat }: V1Chat,
|
|
sessionId: string,
|
|
): V2Message => ({
|
|
...chat,
|
|
createdAt: createAt,
|
|
plugin: function_call
|
|
? {
|
|
apiName: function_call.name,
|
|
arguments: function_call.arguments,
|
|
identifier: name!,
|
|
type: 'default',
|
|
}
|
|
: chat.plugin,
|
|
sessionId,
|
|
updatedAt: updateAt,
|
|
...extra,
|
|
});
|
|
|
|
migrationTopic = (sessionId: string, { createAt, updateAt, ...topic }: V1Topic): V2Topic => ({
|
|
...topic,
|
|
createdAt: createAt,
|
|
sessionId,
|
|
updatedAt: updateAt,
|
|
});
|
|
}
|