2022-10-10 14:35:21 +00:00
|
|
|
import crypto from 'crypto';
|
2022-10-14 06:51:19 +00:00
|
|
|
import { IdentifierError } from './errors/identifier-error';
|
2022-11-30 02:57:41 +00:00
|
|
|
import { Model } from './model';
|
2023-02-13 13:38:47 +00:00
|
|
|
import lodash from 'lodash';
|
2022-10-10 07:40:12 +00:00
|
|
|
|
|
|
|
type HandleAppendsQueryOptions = {
|
|
|
|
templateModel: any;
|
|
|
|
queryPromises: Array<any>;
|
|
|
|
};
|
|
|
|
|
|
|
|
export async function handleAppendsQuery(options: HandleAppendsQueryOptions) {
|
|
|
|
const { templateModel, queryPromises } = options;
|
|
|
|
|
2022-11-30 02:57:41 +00:00
|
|
|
if (!templateModel) {
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
|
2022-10-14 09:29:14 +00:00
|
|
|
const primaryKey = templateModel.constructor.primaryKeyAttribute;
|
|
|
|
|
2022-10-10 07:40:12 +00:00
|
|
|
const results = await Promise.all(queryPromises);
|
|
|
|
|
|
|
|
let rows: Array<Model>;
|
|
|
|
|
|
|
|
for (const appendedResult of results) {
|
|
|
|
if (!rows) {
|
|
|
|
rows = appendedResult.rows;
|
|
|
|
|
|
|
|
if (rows.length == 0) {
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
|
|
|
|
const modelOptions = templateModel['_options'];
|
|
|
|
for (const row of rows) {
|
|
|
|
row['_options'] = {
|
|
|
|
...row['_options'],
|
|
|
|
include: modelOptions['include'],
|
|
|
|
includeNames: modelOptions['includeNames'],
|
|
|
|
includeMap: modelOptions['includeMap'],
|
|
|
|
};
|
|
|
|
}
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (let i = 0; i < appendedResult.rows.length; i++) {
|
2022-10-14 09:29:14 +00:00
|
|
|
const appendingRow = appendedResult.rows[i];
|
2022-10-10 07:40:12 +00:00
|
|
|
const key = appendedResult.include.association;
|
2022-10-14 09:29:14 +00:00
|
|
|
const val = appendingRow.get(key);
|
|
|
|
|
|
|
|
const rowKey = appendingRow.get(primaryKey);
|
|
|
|
|
|
|
|
const targetIndex = rows.findIndex((row) => row.get(primaryKey) === rowKey);
|
|
|
|
|
|
|
|
if (targetIndex === -1) {
|
|
|
|
throw new Error('target row not found');
|
|
|
|
}
|
2022-10-10 07:40:12 +00:00
|
|
|
|
2022-10-14 09:29:14 +00:00
|
|
|
rows[targetIndex].set(key, val, {
|
2022-10-13 10:44:12 +00:00
|
|
|
raw: true,
|
|
|
|
});
|
2022-10-10 07:40:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return rows;
|
|
|
|
}
|
2022-10-13 03:15:27 +00:00
|
|
|
|
|
|
|
export function md5(value: string) {
|
|
|
|
return crypto.createHash('md5').update(value).digest('hex');
|
|
|
|
}
|
2022-10-14 06:51:19 +00:00
|
|
|
|
|
|
|
const MAX_IDENTIFIER_LENGTH = 63;
|
|
|
|
|
|
|
|
export function checkIdentifier(value: string) {
|
|
|
|
if (value.length > MAX_IDENTIFIER_LENGTH) {
|
|
|
|
throw new IdentifierError(`Identifier ${value} is too long`);
|
|
|
|
}
|
|
|
|
}
|
2023-02-13 13:38:47 +00:00
|
|
|
|
|
|
|
export function getTableName(collectionName: string, options) {
|
|
|
|
return options.underscored ? snakeCase(collectionName) : collectionName;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function snakeCase(name: string) {
|
|
|
|
return require('sequelize').Utils.underscore(name);
|
|
|
|
}
|