UNPKG

@crowdin/app-project-module

Version:

Module that generates for you all common endpoints for serving standalone Crowdin App

940 lines (939 loc) 44.7 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.DrizzleStorage = void 0; const crypto_1 = require("crypto"); const drizzle_orm_1 = require("drizzle-orm"); const types_1 = require("../../modules/integration/util/types"); const d1_1 = require("./d1"); const types_2 = require("./d1/types"); const postgresql_1 = require("./postgresql"); const sqlite_1 = require("./sqlite"); const SCHEMAS_MAP = { sqlite: sqlite_1.SQLITE_SCHEMA, postgresql: postgresql_1.POSTGRESQL_SCHEMA, d1: types_2.D1_SCHEMA, }; class DrizzleStorage { // uncomment to check types // db: SQLITE_DB; // schema: typeof SQLITE_SCHEMA; // uncomment to check types // db: D1_DB; // schema: typeof D1_SCHEMA; constructor({ config, type, delayedMigration, }) { var _a, _b, _c, _d, _e; this.migrated = false; let db; if (type === 'd1') { db = (0, d1_1.initD1)(Object.assign(Object.assign({}, config.d1Config), { additionalSchema: (_a = config.customTables) === null || _a === void 0 ? void 0 : _a.schema })); this.migrationPromise = delayedMigration ? Promise.resolve() : (0, d1_1.migrateD1)(db); } else if (type === 'postgresql') { db = (0, postgresql_1.initPostgreSQL)(config.postgreConfig, (_b = config.customTables) === null || _b === void 0 ? void 0 : _b.schema); this.migrationPromise = delayedMigration ? Promise.resolve() : (0, postgresql_1.migratePostgreSQL)({ db, name: config.name, directoryPath: config.migrateToPostgreFromSQLite ? config.dbFolder : undefined, additionalMigrationFolder: (_c = config.customTables) === null || _c === void 0 ? void 0 : _c.migrationFolder, }); this.migrated = true; } else { db = (0, sqlite_1.initSqlite)(config.dbFolder, (_d = config.customTables) === null || _d === void 0 ? void 0 : _d.schema); this.migrationPromise = delayedMigration ? Promise.resolve() : (0, sqlite_1.migrateSqlite)(db, (_e = config.customTables) === null || _e === void 0 ? void 0 : _e.migrationFolder); this.migrated = true; } // using cast here to avoid ts errors, since all drivers should have the same methods, just different clients this.db = db; this.schema = SCHEMAS_MAP[type]; this.type = type; this.config = config; } migrateDelayed() { return __awaiter(this, void 0, void 0, function* () { var _a, _b, _c; if (!this.migrated) { if (this.type === 'd1') { yield (0, d1_1.migrateD1)(this.db, (_a = this.config.customTables) === null || _a === void 0 ? void 0 : _a.d1Migrations); } else if (this.type === 'postgresql') { yield (0, postgresql_1.migratePostgreSQL)({ db: this.db, name: this.config.name, directoryPath: this.config.migrateToPostgreFromSQLite ? this.config.dbFolder : undefined, additionalMigrationFolder: (_b = this.config.customTables) === null || _b === void 0 ? void 0 : _b.migrationFolder, }); } else { yield (0, sqlite_1.migrateSqlite)(this.db, (_c = this.config.customTables) === null || _c === void 0 ? void 0 : _c.migrationFolder); } this.migrated = true; } }); } saveCrowdinCredentials(credentials) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db.insert(this.schema.crowdinCredentials).values({ id: credentials.id, app_secret: credentials.appSecret, domain: credentials.domain, user_id: this.toString(credentials.userId), agent_id: this.toString(credentials.agentId), organization_id: this.toString(credentials.organizationId), base_url: credentials.baseUrl, access_token: credentials.accessToken, refresh_token: credentials.refreshToken, expire: credentials.expire, type: credentials.type, }); }); } updateCrowdinCredentials(credentials) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db .update(this.schema.crowdinCredentials) .set({ app_secret: credentials.appSecret, domain: credentials.domain, user_id: this.toString(credentials.userId), agent_id: this.toString(credentials.agentId), organization_id: this.toString(credentials.organizationId), base_url: credentials.baseUrl, access_token: credentials.accessToken, refresh_token: credentials.refreshToken, expire: credentials.expire, type: credentials.type, }) .where((0, drizzle_orm_1.eq)(this.schema.crowdinCredentials.id, credentials.id)); }); } getCrowdinCredentials(id) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const item = yield this.db.query.crowdinCredentials.findFirst({ where: (0, drizzle_orm_1.eq)(this.schema.crowdinCredentials.id, id), }); if (!item) { return; } return { id: item.id, appSecret: item.app_secret, domain: item.domain, userId: this.toNumber(item.user_id), agentId: this.toNumber(item.agent_id), organizationId: this.toNumber(item.organization_id), baseUrl: item.base_url, accessToken: item.access_token, refreshToken: item.refresh_token, expire: item.expire, type: item.type, }; }); } getAllCrowdinCredentials() { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const res = yield this.db.query.crowdinCredentials.findMany(); return res.map((item) => ({ id: item.id, appSecret: item.app_secret, domain: item.domain, userId: this.toNumber(item.user_id), agentId: this.toNumber(item.agent_id), organizationId: this.toNumber(item.organization_id), baseUrl: item.base_url, accessToken: item.access_token, refreshToken: item.refresh_token, expire: item.expire, type: item.type, })); }); } deleteCrowdinCredentials(id) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db.delete(this.schema.crowdinCredentials).where((0, drizzle_orm_1.eq)(this.schema.crowdinCredentials.id, id)); yield this.db .delete(this.schema.integrationCredentials) .where((0, drizzle_orm_1.eq)(this.schema.integrationCredentials.crowdin_id, id)); yield this.db.delete(this.schema.syncSettings).where((0, drizzle_orm_1.eq)(this.schema.syncSettings.crowdin_id, id)); yield this.db.delete(this.schema.appMetadata).where((0, drizzle_orm_1.eq)(this.schema.appMetadata.crowdin_id, id)); yield this.db.delete(this.schema.filesSnapshot).where((0, drizzle_orm_1.eq)(this.schema.filesSnapshot.crowdin_id, id)); yield this.db.delete(this.schema.webhooks).where((0, drizzle_orm_1.eq)(this.schema.webhooks.crowdin_id, id)); yield this.db.delete(this.schema.userErrors).where((0, drizzle_orm_1.eq)(this.schema.userErrors.crowdin_id, id)); yield this.db.delete(this.schema.integrationSettings).where((0, drizzle_orm_1.eq)(this.schema.integrationSettings.crowdin_id, id)); yield this.db.delete(this.schema.job).where((0, drizzle_orm_1.eq)(this.schema.job.crowdin_id, id)); yield this.db .delete(this.schema.translationFileCache) .where((0, drizzle_orm_1.eq)(this.schema.translationFileCache.crowdin_id, id)); yield this.db.delete(this.schema.unsyncedFiles).where((0, drizzle_orm_1.eq)(this.schema.unsyncedFiles.crowdin_id, id)); yield this.db.delete(this.schema.syncedData).where((0, drizzle_orm_1.eq)(this.schema.syncedData.crowdin_id, id)); }); } saveIntegrationCredentials(id, credentials, crowdinId) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db.insert(this.schema.integrationCredentials).values({ id, credentials, crowdin_id: crowdinId, }); }); } updateIntegrationCredentials(id, credentials) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db .update(this.schema.integrationCredentials) .set({ credentials }) .where((0, drizzle_orm_1.eq)(this.schema.integrationCredentials.id, id)); }); } updateIntegrationManagers(id, managers) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db .update(this.schema.integrationCredentials) .set({ managers }) .where((0, drizzle_orm_1.eq)(this.schema.integrationCredentials.id, id)); }); } getIntegrationCredentials(id) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const item = yield this.db.query.integrationCredentials.findFirst({ where: (0, drizzle_orm_1.eq)(this.schema.integrationCredentials.id, id), }); if (!item) { return; } return { id: item.id, credentials: item.credentials, crowdinId: item.crowdin_id, managers: item.managers, }; }); } getAllIntegrationCredentials(crowdinId) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const res = yield this.db.query.integrationCredentials.findMany({ where: (0, drizzle_orm_1.eq)(this.schema.integrationCredentials.crowdin_id, crowdinId), }); return res.map((item) => ({ id: item.id, credentials: item.credentials, crowdinId: item.crowdin_id, managers: item.managers, })); }); } deleteIntegrationCredentials(id) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db.delete(this.schema.integrationCredentials).where((0, drizzle_orm_1.eq)(this.schema.integrationCredentials.id, id)); yield this.db.delete(this.schema.syncSettings).where((0, drizzle_orm_1.eq)(this.schema.syncSettings.integration_id, id)); yield this.db.delete(this.schema.filesSnapshot).where((0, drizzle_orm_1.eq)(this.schema.filesSnapshot.integration_id, id)); yield this.db.delete(this.schema.webhooks).where((0, drizzle_orm_1.eq)(this.schema.webhooks.integration_id, id)); yield this.db.delete(this.schema.userErrors).where((0, drizzle_orm_1.eq)(this.schema.userErrors.integration_id, id)); yield this.db .delete(this.schema.integrationSettings) .where((0, drizzle_orm_1.eq)(this.schema.integrationSettings.integration_id, id)); yield this.db.delete(this.schema.job).where((0, drizzle_orm_1.eq)(this.schema.job.integration_id, id)); yield this.db .delete(this.schema.translationFileCache) .where((0, drizzle_orm_1.eq)(this.schema.translationFileCache.integration_id, id)); yield this.db.delete(this.schema.unsyncedFiles).where((0, drizzle_orm_1.eq)(this.schema.unsyncedFiles.integration_id, id)); yield this.db.delete(this.schema.syncedData).where((0, drizzle_orm_1.eq)(this.schema.syncedData.integration_id, id)); }); } deleteAllIntegrationCredentials(crowdinId) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db .delete(this.schema.integrationCredentials) .where((0, drizzle_orm_1.eq)(this.schema.integrationCredentials.crowdin_id, crowdinId)); yield this.db.delete(this.schema.syncSettings).where((0, drizzle_orm_1.eq)(this.schema.syncSettings.crowdin_id, crowdinId)); yield this.db.delete(this.schema.filesSnapshot).where((0, drizzle_orm_1.eq)(this.schema.filesSnapshot.crowdin_id, crowdinId)); yield this.db.delete(this.schema.webhooks).where((0, drizzle_orm_1.eq)(this.schema.webhooks.crowdin_id, crowdinId)); yield this.db.delete(this.schema.userErrors).where((0, drizzle_orm_1.eq)(this.schema.userErrors.crowdin_id, crowdinId)); yield this.db .delete(this.schema.integrationSettings) .where((0, drizzle_orm_1.eq)(this.schema.integrationSettings.crowdin_id, crowdinId)); yield this.db.delete(this.schema.job).where((0, drizzle_orm_1.eq)(this.schema.job.crowdin_id, crowdinId)); yield this.db .delete(this.schema.translationFileCache) .where((0, drizzle_orm_1.eq)(this.schema.translationFileCache.crowdin_id, crowdinId)); yield this.db.delete(this.schema.unsyncedFiles).where((0, drizzle_orm_1.eq)(this.schema.unsyncedFiles.crowdin_id, crowdinId)); yield this.db.delete(this.schema.syncedData).where((0, drizzle_orm_1.eq)(this.schema.syncedData.crowdin_id, crowdinId)); }); } saveMetadata(id, metadata, crowdinId) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db.insert(this.schema.appMetadata).values({ id, data: JSON.stringify(metadata), crowdin_id: crowdinId, }); }); } updateMetadata(id, metadata, crowdinId) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db .update(this.schema.appMetadata) .set({ data: JSON.stringify(metadata), crowdin_id: crowdinId, }) .where((0, drizzle_orm_1.eq)(this.schema.appMetadata.id, id)); }); } getMetadata(id) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const item = yield this.db.query.appMetadata.findFirst({ where: (0, drizzle_orm_1.eq)(this.schema.appMetadata.id, id), }); if (!item) { return; } return JSON.parse(item.data); }); } getAllMetadata() { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const res = yield this.db.query.appMetadata.findMany(); return res.map((item) => ({ id: item.id, data: JSON.parse(item.data), crowdinId: item.crowdin_id, })); }); } deleteMetadata(id) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db.delete(this.schema.appMetadata).where((0, drizzle_orm_1.eq)(this.schema.appMetadata.id, id)); }); } getSyncSettingsByProvider(integrationId, provider) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const item = yield this.db.query.syncSettings.findFirst({ where: (0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.syncSettings.integration_id, integrationId), (0, drizzle_orm_1.eq)(this.schema.syncSettings.provider, provider)), }); if (!item) { return; } return { id: item.id, files: item.files, integrationId: item.integration_id, crowdinId: item.crowdin_id, type: item.type, provider: item.provider, }; }); } getSyncSettingsBySchedule(type, schedule) { return __awaiter(this, void 0, void 0, function* () { if (this.type === 'postgresql') { const db = this.db; const query = ` SELECT s.id, s.files, s.integration_id as "integrationId", s.crowdin_id as "crowdinId", s.type, s.provider FROM sync_settings s INNER JOIN integration_settings i ON s.integration_id = i.integration_id WHERE s.type = $1 AND CASE WHEN i.config IS NULL THEN false ELSE (i.config::json->>'schedule') = $2 END `; const res = yield db.$client.query(query, [type, schedule]); return (res === null || res === void 0 ? void 0 : res.rows) || []; } const query = ` SELECT s.id, s.files, s.integration_id as integrationId, s.crowdin_id as crowdinId, s.type, s.provider FROM sync_settings s INNER JOIN integration_settings i ON s.integration_id = i.integration_id WHERE s.type = ? AND CASE WHEN i.config IS NULL THEN 0 ELSE json_extract(i.config, '$.schedule') = ? END `; if (this.type === 'sqlite') { const db = this.db; const res = db.$client.prepare(query).all(type, schedule); return res; } if (this.type === 'd1') { const db = this.db; const res = yield db.$client.prepare(query).bind(type, schedule).all(); return res.results || []; } throw new Error(`Unsupported database type ${this.type}`); }); } saveSyncSettings(files, integrationId, crowdinId, type, provider) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db.insert(this.schema.syncSettings).values({ files, integration_id: integrationId, crowdin_id: crowdinId, type, provider, }); }); } updateSyncSettings(files, integrationId, crowdinId, type, provider) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db .update(this.schema.syncSettings) .set({ files }) .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.syncSettings.integration_id, integrationId), (0, drizzle_orm_1.eq)(this.schema.syncSettings.crowdin_id, crowdinId), (0, drizzle_orm_1.eq)(this.schema.syncSettings.type, type), (0, drizzle_orm_1.eq)(this.schema.syncSettings.provider, provider))); }); } getSyncSettings(integrationId, crowdinId, type, provider) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const item = yield this.db.query.syncSettings.findFirst({ where: (0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.syncSettings.integration_id, integrationId), (0, drizzle_orm_1.eq)(this.schema.syncSettings.crowdin_id, crowdinId), (0, drizzle_orm_1.eq)(this.schema.syncSettings.type, type), (0, drizzle_orm_1.eq)(this.schema.syncSettings.provider, provider)), }); if (!item) { return; } return { id: item.id, files: item.files, integrationId: item.integration_id, crowdinId: item.crowdin_id, type: item.type, provider: item.provider, }; }); } saveFilesSnapshot(files, integrationId, crowdinId, provider) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db.insert(this.schema.filesSnapshot).values({ files, integration_id: integrationId, crowdin_id: crowdinId, provider, }); }); } updateFilesSnapshot(files, integrationId, crowdinId, provider) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db .update(this.schema.filesSnapshot) .set({ files }) .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.filesSnapshot.integration_id, integrationId), (0, drizzle_orm_1.eq)(this.schema.filesSnapshot.crowdin_id, crowdinId), (0, drizzle_orm_1.eq)(this.schema.filesSnapshot.provider, provider))); }); } getFilesSnapshot(integrationId, crowdinId, provider) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const item = yield this.db.query.filesSnapshot.findFirst({ where: (0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.filesSnapshot.integration_id, integrationId), (0, drizzle_orm_1.eq)(this.schema.filesSnapshot.crowdin_id, crowdinId), (0, drizzle_orm_1.eq)(this.schema.filesSnapshot.provider, provider)), }); if (!item) { return; } return { id: item.id, files: item.files, integrationId: item.integration_id, crowdinId: item.crowdin_id, provider: item.provider, }; }); } getAllWebhooks(integrationId, crowdinId, provider) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const items = yield this.db.query.webhooks.findMany({ where: (0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.webhooks.integration_id, integrationId), (0, drizzle_orm_1.eq)(this.schema.webhooks.crowdin_id, crowdinId), (0, drizzle_orm_1.eq)(this.schema.webhooks.provider, provider)), }); return items.map((item) => ({ id: item.id, fileId: item.file_id, integrationId: item.integration_id, crowdinId: item.crowdin_id, provider: item.provider, })); }); } getWebhooks(fileId, integrationId, crowdinId, provider) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const item = yield this.db.query.webhooks.findFirst({ where: (0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.webhooks.file_id, fileId), (0, drizzle_orm_1.eq)(this.schema.webhooks.integration_id, integrationId), (0, drizzle_orm_1.eq)(this.schema.webhooks.crowdin_id, crowdinId), (0, drizzle_orm_1.eq)(this.schema.webhooks.provider, provider)), }); if (!item) { return; } return { id: item.id, fileId: item.file_id, integrationId: item.integration_id, crowdinId: item.crowdin_id, provider: item.provider, }; }); } saveWebhooks(fileId, integrationId, crowdinId, provider) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db.insert(this.schema.webhooks).values({ file_id: fileId, integration_id: integrationId, crowdin_id: crowdinId, provider, }); }); } deleteWebhooks(fileIds, integrationId, crowdinId, provider) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db .delete(this.schema.webhooks) .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.inArray)(this.schema.webhooks.file_id, fileIds), (0, drizzle_orm_1.eq)(this.schema.webhooks.integration_id, integrationId), (0, drizzle_orm_1.eq)(this.schema.webhooks.crowdin_id, crowdinId), (0, drizzle_orm_1.eq)(this.schema.webhooks.provider, provider))); }); } getAllUserErrors(crowdinId, integrationId) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const whereClause = integrationId ? (0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.userErrors.crowdin_id, crowdinId), (0, drizzle_orm_1.eq)(this.schema.userErrors.integration_id, integrationId)) : (0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.userErrors.crowdin_id, crowdinId), (0, drizzle_orm_1.isNull)(this.schema.userErrors.integration_id)); const items = yield this.db.query.userErrors.findMany({ where: whereClause }); return items.map((item) => ({ id: item.id, action: item.action, message: item.message, data: item.data, createdAt: item.created_at, crowdinId: item.crowdin_id, integrationId: item.integration_id, })); }); } saveUserError(action, message, data, createdAt, crowdinId, integrationId) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db.insert(this.schema.userErrors).values({ action, message, data, created_at: createdAt, crowdin_id: crowdinId, integration_id: integrationId, }); }); } deleteUserErrors(createdAt, crowdinId, integrationId) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const whereClause = integrationId ? (0, drizzle_orm_1.and)((0, drizzle_orm_1.lt)(this.schema.userErrors.created_at, createdAt), (0, drizzle_orm_1.eq)(this.schema.userErrors.crowdin_id, crowdinId), (0, drizzle_orm_1.eq)(this.schema.userErrors.integration_id, integrationId)) : (0, drizzle_orm_1.and)((0, drizzle_orm_1.lt)(this.schema.userErrors.created_at, createdAt), (0, drizzle_orm_1.eq)(this.schema.userErrors.crowdin_id, crowdinId), (0, drizzle_orm_1.isNull)(this.schema.userErrors.integration_id)); yield this.db.delete(this.schema.userErrors).where(whereClause); }); } deleteAllUsersErrorsOlderThan(createdAt) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db.delete(this.schema.userErrors).where((0, drizzle_orm_1.lt)(this.schema.userErrors.created_at, createdAt)); }); } saveIntegrationConfig(integrationId, crowdinId, config) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db.insert(this.schema.integrationSettings).values({ integration_id: integrationId, crowdin_id: crowdinId, config, }); }); } getAllIntegrationConfigs(crowdinId) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const items = yield this.db.query.integrationSettings.findMany({ where: (0, drizzle_orm_1.eq)(this.schema.integrationSettings.crowdin_id, crowdinId), }); return items.map((item) => ({ id: item.id, integrationId: item.integration_id, crowdinId: item.crowdin_id, config: item.config, })); }); } getIntegrationConfig(integrationId) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const item = yield this.db.query.integrationSettings.findFirst({ where: (0, drizzle_orm_1.eq)(this.schema.integrationSettings.integration_id, integrationId), }); if (!item) { return; } return { id: item.id, integrationId: item.integration_id, crowdinId: item.crowdin_id, config: item.config, }; }); } updateIntegrationConfig(integrationId, config) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db .update(this.schema.integrationSettings) .set({ config }) .where((0, drizzle_orm_1.eq)(this.schema.integrationSettings.integration_id, integrationId)); }); } createJob(params) { return __awaiter(this, void 0, void 0, function* () { var _a; yield this.migrationPromise; const id = (0, crypto_1.randomUUID)(); yield this.db.insert(this.schema.job).values({ id: id, integration_id: params.integrationId, crowdin_id: params.crowdinId, type: params.type, payload: params.payload, title: params.title, initiated_by: (_a = params.initiatedBy) !== null && _a !== void 0 ? _a : null, created_at: Date.now().toString(), }); return id; }); } updateJob(params) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const values = { updated_at: Date.now().toString() }; if (params.progress) { values.progress = Math.round(params.progress); if (params.progress >= 100) { values.finished_at = Date.now().toString(); } } if (params.status) { values.status = params.status; if (!values.finished_at && [types_1.JobStatus.FAILED, types_1.JobStatus.CANCELED].includes(params.status)) { values.finished_at = Date.now().toString(); } } if (params.data) { values.data = params.data; } if (params.info) { values.info = params.info; } if (params.attempt) { values.attempt = params.attempt; } if (params.errors) { values.errors = JSON.stringify(params.errors); } if (params.processedEntities) { values.processed_entities = params.processedEntities; } yield this.db.update(this.schema.job).set(values).where((0, drizzle_orm_1.eq)(this.schema.job.id, params.id)); }); } getJob(params) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const item = yield this.db.query.job.findFirst({ where: (0, drizzle_orm_1.eq)(this.schema.job.id, params.id), }); if (!item) { return; } return { id: item.id, integrationId: item.integration_id, crowdinId: item.crowdin_id, type: item.type, payload: item.payload, progress: item.progress, status: item.status, title: item.title, info: item.info, data: item.data, attempt: item.attempt, errors: item.errors, processedEntities: item.processed_entities, initiatedBy: item.initiated_by, createdAt: this.toNumber(item.created_at), updatedAt: this.toNumber(item.updated_at), finishedAt: this.toNumber(item.finished_at), }; }); } getActiveJobs(params) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const items = yield this.db.query.job.findMany({ where: (0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.job.integration_id, params.integrationId), (0, drizzle_orm_1.eq)(this.schema.job.crowdin_id, params.crowdinId), (0, drizzle_orm_1.isNull)(this.schema.job.finished_at)), }); return items.map((item) => ({ id: item.id, integrationId: item.integration_id, crowdinId: item.crowdin_id, type: item.type, payload: item.payload, progress: item.progress, status: item.status, title: item.title, info: item.info, data: item.data, attempt: item.attempt, errors: item.errors, processedEntities: item.processed_entities, initiatedBy: item.initiated_by, createdAt: this.toNumber(item.created_at), updatedAt: this.toNumber(item.updated_at), finishedAt: this.toNumber(item.finished_at), })); }); } deleteFinishedJobs() { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db.delete(this.schema.job).where((0, drizzle_orm_1.isNotNull)(this.schema.job.finished_at)); }); } getAllInProgressJobs() { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const items = yield this.db.query.job.findMany({ where: (0, drizzle_orm_1.and)((0, drizzle_orm_1.isNull)(this.schema.job.finished_at), (0, drizzle_orm_1.inArray)(this.schema.job.status, [types_1.JobStatus.IN_PROGRESS, types_1.JobStatus.CREATED])), }); return items.map((item) => ({ id: item.id, integrationId: item.integration_id, crowdinId: item.crowdin_id, type: item.type, payload: item.payload, progress: item.progress, status: item.status, title: item.title, info: item.info, data: item.data, attempt: item.attempt, errors: item.errors, processedEntities: item.processed_entities, initiatedBy: item.initiated_by, createdAt: this.toNumber(item.created_at), updatedAt: this.toNumber(item.updated_at), finishedAt: this.toNumber(item.finished_at), })); }); } getAllJobs(params) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const items = yield this.db.query.job.findMany({ where: (0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.job.integration_id, params.integrationId), (0, drizzle_orm_1.eq)(this.schema.job.crowdin_id, params.crowdinId)), orderBy: (0, drizzle_orm_1.desc)(this.schema.job.created_at), limit: params.limit, offset: params.offset, }); return items.map((item) => ({ id: item.id, integrationId: item.integration_id, crowdinId: item.crowdin_id, type: item.type, payload: item.payload, progress: item.progress, status: item.status, title: item.title, info: item.info, data: item.data, attempt: item.attempt, errors: item.errors, processedEntities: item.processed_entities, initiatedBy: item.initiated_by, createdAt: this.toNumber(item.created_at), updatedAt: this.toNumber(item.updated_at), finishedAt: this.toNumber(item.finished_at), })); }); } saveTranslationCache(params) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db.insert(this.schema.translationFileCache).values({ integration_id: params.integrationId, crowdin_id: params.crowdinId, file_id: params.fileId, language_id: params.languageId, etag: params.etag, }); }); } getFileTranslationCache(params) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const items = yield this.db.query.translationFileCache.findMany({ where: (0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.translationFileCache.integration_id, params.integrationId), (0, drizzle_orm_1.eq)(this.schema.translationFileCache.crowdin_id, params.crowdinId), (0, drizzle_orm_1.eq)(this.schema.translationFileCache.file_id, params.fileId)), }); return items.map((item) => ({ integrationId: item.integration_id, crowdinId: item.crowdin_id, fileId: item.file_id, languageId: item.language_id, etag: item.etag, })); }); } getFileTranslationCacheByLanguage(params) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const item = yield this.db.query.translationFileCache.findFirst({ where: (0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.translationFileCache.integration_id, params.integrationId), (0, drizzle_orm_1.eq)(this.schema.translationFileCache.crowdin_id, params.crowdinId), (0, drizzle_orm_1.eq)(this.schema.translationFileCache.file_id, params.fileId), (0, drizzle_orm_1.eq)(this.schema.translationFileCache.language_id, params.languageId)), }); if (!item) { return; } return { integrationId: item.integration_id, crowdinId: item.crowdin_id, fileId: item.file_id, languageId: item.language_id, etag: item.etag, }; }); } updateTranslationCache(params) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db .update(this.schema.translationFileCache) .set({ etag: params.etag }) .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.translationFileCache.integration_id, params.integrationId), (0, drizzle_orm_1.eq)(this.schema.translationFileCache.crowdin_id, params.crowdinId), (0, drizzle_orm_1.eq)(this.schema.translationFileCache.file_id, params.fileId), (0, drizzle_orm_1.eq)(this.schema.translationFileCache.language_id, params.languageId))); }); } saveUnsyncedFiles(params) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db.insert(this.schema.unsyncedFiles).values({ integration_id: params.integrationId, crowdin_id: params.crowdinId, files: params.files, }); }); } getUnsyncedFiles(params) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const item = yield this.db.query.unsyncedFiles.findFirst({ where: (0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.unsyncedFiles.integration_id, params.integrationId), (0, drizzle_orm_1.eq)(this.schema.unsyncedFiles.crowdin_id, params.crowdinId)), }); if (!item) { return; } return { integrationId: item.integration_id, crowdinId: item.crowdin_id, files: item.files, }; }); } updateUnsyncedFiles(params) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db .update(this.schema.unsyncedFiles) .set({ files: params.files }) .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.unsyncedFiles.integration_id, params.integrationId), (0, drizzle_orm_1.eq)(this.schema.unsyncedFiles.crowdin_id, params.crowdinId))); }); } saveSyncedData(files, integrationId, crowdinId, type) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db.insert(this.schema.syncedData).values({ integration_id: integrationId, crowdin_id: crowdinId, files: files, type: type, updated_at: Date.now().toString(), }); }); } updateSyncedData(files, integrationId, crowdinId, type) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; yield this.db .update(this.schema.syncedData) .set({ files: files, updated_at: Date.now().toString() }) .where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.syncedData.integration_id, integrationId), (0, drizzle_orm_1.eq)(this.schema.syncedData.crowdin_id, crowdinId), (0, drizzle_orm_1.eq)(this.schema.syncedData.type, type))); }); } getSyncedData(integrationId, crowdinId, type) { return __awaiter(this, void 0, void 0, function* () { yield this.migrationPromise; const item = yield this.db.query.syncedData.findFirst({ where: (0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(this.schema.syncedData.integration_id, integrationId), (0, drizzle_orm_1.eq)(this.schema.syncedData.crowdin_id, crowdinId), (0, drizzle_orm_1.eq)(this.schema.syncedData.type, type)), }); if (!item) { return; } return { integrationId: item.integration_id, crowdinId: item.crowdin_id, files: item.files, type: item.type, }; }); } toString(val) { if (!val) { return; } return `${val}`; } toNumber(val) { if (!val) { return; } if (typeof val === 'number') { return val; } return Number(val); } } exports.DrizzleStorage = DrizzleStorage;