diff --git a/packages/core/src/database/migrations/1696704276300-AddLanguage.ts b/packages/core/src/database/migrations/1696704276300-AddLanguage.ts new file mode 100644 index 00000000000..7c77f3b5575 --- /dev/null +++ b/packages/core/src/database/migrations/1696704276300-AddLanguage.ts @@ -0,0 +1,24 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; +import { LanguageUtils } from '../../language/language-utils'; +import * as chalk from "chalk"; + +export class AddLanguage1696704276300 implements MigrationInterface { + name = 'AddLanguage1696704276300'; + + /** + * Up Migration + * + * @param queryRunner + */ + public async up(queryRunner: QueryRunner): Promise { + console.log(chalk.yellow(`AddLanguage1696704276300 start running!`)); + await LanguageUtils.migrateLanguages(queryRunner); + } + + /** + * Down Migration + * + * @param queryRunner + */ + public async down(queryRunner: QueryRunner): Promise {} +} diff --git a/packages/core/src/language/language-utils.ts b/packages/core/src/language/language-utils.ts new file mode 100644 index 00000000000..e93f7d33690 --- /dev/null +++ b/packages/core/src/language/language-utils.ts @@ -0,0 +1,75 @@ +import { QueryRunner } from 'typeorm'; +import { ILanguage, LanguagesEnum } from '@gauzy/contracts'; +import allLanguages from './all-languages'; +import { Language } from './language.entity'; +import { faker } from '@faker-js/faker'; +import { v4 as uuidV4 } from 'uuid'; + +export class LanguageUtils { + private static async addLanguages( + queryRunner: QueryRunner, + languages: ILanguage[] + ): Promise { + for await (const language of languages) { + const { name, code, is_system, description, color } = language; + const payload = [name, code, is_system, description, color]; + let insertOrUpdateQuery = ''; + if ( + ['sqlite', 'better-sqlite3'].includes( + queryRunner.connection.options.type + ) + ) { + payload.push(uuidV4()); + insertOrUpdateQuery = ` + INSERT INTO language (name, code, is_system, description, color, id) + VALUES ($1, $2, $3, $4, $5, $6) + ON CONFLICT (code) + DO UPDATE SET + name = EXCLUDED.name, + is_system = EXCLUDED.is_system, + description = EXCLUDED.description, + color = EXCLUDED.color; + `; + } else { + insertOrUpdateQuery = ` + INSERT INTO language (name, code, is_system, description, color) + VALUES ($1, $2, $3, $4, $5) + ON CONFLICT (code) + DO UPDATE SET + name = EXCLUDED.name, + is_system = EXCLUDED.is_system, + description = EXCLUDED.description, + color = EXCLUDED.color; + `; + } + await queryRunner.connection.manager.query( + insertOrUpdateQuery, + payload + ); + } + } + + public static get registeredLanguages(): ILanguage[] { + const systemLanguages: string[] = Object.values(LanguagesEnum); + const languages: ILanguage[] = []; + for (const key in allLanguages) { + if (Object.prototype.hasOwnProperty.call(allLanguages, key)) { + const { name, nativeName } = allLanguages[key]; + const language = new Language(); + language.name = name; + language.code = key; + language.is_system = systemLanguages.indexOf(key) >= 0; + language.description = nativeName; + language.color = faker.internet.color(); + languages.push(language); + } + } + return languages; + } + + public static async migrateLanguages( + queryRunner: QueryRunner + ): Promise { + await this.addLanguages(queryRunner, this.registeredLanguages); + } +}