@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
JavaScript
"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;