lobe-chat

Форк
0
/
VersionController.ts 
67 строк · 1.6 Кб
1
import { t } from 'i18next';
2

3
/**
4
 * 迁移接口
5
 * @template T - 状态类型
6
 */
7
export interface Migration<T = any> {
8
  /**
9
   * 迁移数据
10
   * @param data - 迁移数据
11
   * @returns 迁移后的数据
12
   */
13
  migrate(data: MigrationData<T>): MigrationData;
14
  /**
15
   * 迁移版本号
16
   */
17
  version: number;
18
}
19

20
/**
21
 * 迁移数据接口
22
 * @template T - 状态类型
23
 */
24
export interface MigrationData<T = any> {
25
  /**
26
   * 状态数据
27
   */
28
  state: T;
29
  /**
30
   * 迁移版本号
31
   */
32
  version: number;
33
}
34
export class VersionController<T> {
35
  private migrations: Migration[];
36
  targetVersion: number;
37

38
  constructor(migrations: any[], targetVersion: number = migrations.length) {
39
    this.migrations = migrations
40
      .map((cls) => {
41
        return new cls() as Migration;
42
      })
43
      .sort((a, b) => a.version - b.version);
44

45
    this.targetVersion = targetVersion;
46
  }
47

48
  migrate(data: MigrationData<T>): MigrationData<T> {
49
    let nextData = data;
50
    const targetVersion = this.targetVersion || this.migrations.length;
51
    if (data.version === undefined)
52
      throw new Error(t('migrateError.missVersion', { ns: 'migration' }));
53
    const currentVersion = data.version;
54

55
    for (let i = currentVersion || 0; i < targetVersion; i++) {
56
      const migration = this.migrations.find((m) => m.version === i);
57
      if (!migration) throw new Error(t('migrateError.noMigration', { ns: 'migration' }));
58

59
      nextData = migration.migrate(nextData);
60

61
      nextData.version += 1;
62
      console.debug('迁移器:', migration, '数据:', nextData, '迁移后版本:', nextData.version);
63
    }
64

65
    return nextData;
66
  }
67
}
68

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.