|
|
|
|
@@ -1,5 +1,13 @@
|
|
|
|
|
import { LIST_BY_COMPANY as MSSQL_LIST_BY_COMPANY } from '../../providers/mssql/queries/brand.js';
|
|
|
|
|
import { LIST_BY_COMPANY as SQLITE_LIST_BY_COMPANY } from '../../providers/sqlite3/queries/brand.js';
|
|
|
|
|
import {
|
|
|
|
|
COUNT_BY_COMPANY as MSSQL_COUNT,
|
|
|
|
|
LIST_BY_COMPANY as MSSQL_LIST_BY_COMPANY,
|
|
|
|
|
LIST_BY_COMPANY_PAGED as MSSQL_LIST_PAGED,
|
|
|
|
|
} from '../../providers/mssql/queries/brand.js';
|
|
|
|
|
import {
|
|
|
|
|
COUNT_BY_COMPANY as SQLITE_COUNT,
|
|
|
|
|
LIST_BY_COMPANY as SQLITE_LIST_BY_COMPANY,
|
|
|
|
|
LIST_BY_COMPANY_PAGED as SQLITE_LIST_PAGED,
|
|
|
|
|
} from '../../providers/sqlite3/queries/brand.js';
|
|
|
|
|
import resolveSelectedCompanyAccess from '../companyuser/resolveSelectedCompanyAccess.js';
|
|
|
|
|
import makeRunner from '../runner.js';
|
|
|
|
|
|
|
|
|
|
@@ -11,32 +19,63 @@ function parsePics(raw) {
|
|
|
|
|
|
|
|
|
|
export default function list(provider) {
|
|
|
|
|
const access = resolveSelectedCompanyAccess(provider);
|
|
|
|
|
const sql =
|
|
|
|
|
provider?.dialect === 'sqlite3'
|
|
|
|
|
? SQLITE_LIST_BY_COMPANY
|
|
|
|
|
: MSSQL_LIST_BY_COMPANY;
|
|
|
|
|
const isSqlite = provider?.dialect === 'sqlite3';
|
|
|
|
|
const sql = isSqlite ? SQLITE_LIST_BY_COMPANY : MSSQL_LIST_BY_COMPANY;
|
|
|
|
|
const sqlCount = isSqlite ? SQLITE_COUNT : MSSQL_COUNT;
|
|
|
|
|
const sqlPaged = isSqlite ? SQLITE_LIST_PAGED : MSSQL_LIST_PAGED;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Lists the brands of the user's selected company.
|
|
|
|
|
* Lists the brands of the user's selected company, sorted by name.
|
|
|
|
|
*
|
|
|
|
|
* @param {number} googleAuthId - The id of the Google auth user.
|
|
|
|
|
* @param {object} [opts] - Optional pagination options.
|
|
|
|
|
* @param {number} [opts.offset=0] - Number of brands to skip.
|
|
|
|
|
* @param {number} [opts.limit=10] - Number of brands to return (max 100).
|
|
|
|
|
* @param {object} [tx] - Optional transaction to run within.
|
|
|
|
|
* @returns {Promise<Array<{id: number, name: string, gsprpinfo: string|null, pics: Array<{id: number, sort: number, fullHash: string, thumbW: number, thumbH: number, thumbHash: string}>}>>} The brands.
|
|
|
|
|
* @returns {Promise<{brands: Array<{id: number, name: string, gsprpinfo: string|null, pics: Array<{fullHash: string, thumbW: number, thumbH: number, thumbHash: string}>}>, total: number, offset: number, limit: number}>} The brands plus the total unpaged count.
|
|
|
|
|
*
|
|
|
|
|
* @example
|
|
|
|
|
* const brands = await store.brand.list(42);
|
|
|
|
|
* // => [{ id, name, gsprpinfo, pics: [{ sort, fullHash, thumbW, thumbH, thumbHash }] }]
|
|
|
|
|
* const result = await store.brand.list(42, { offset: 0, limit: 10 });
|
|
|
|
|
* // => { brands: [{ id, name, gsprpinfo, pics: [...] }], total: 25, offset: 0, limit: 10 }
|
|
|
|
|
*/
|
|
|
|
|
return async (googleAuthId, tx) => {
|
|
|
|
|
const { companyId } = await access(googleAuthId, tx);
|
|
|
|
|
return async (googleAuthId, opts, tx) => {
|
|
|
|
|
let offset = 0;
|
|
|
|
|
let limit = 10;
|
|
|
|
|
let resolvedTx = tx;
|
|
|
|
|
|
|
|
|
|
const result = await makeRunner(provider, tx).query(sql, { companyId });
|
|
|
|
|
if (opts != null && typeof opts === 'object' && !opts._isTx) {
|
|
|
|
|
const parsedOffset = Number(opts.offset ?? 0);
|
|
|
|
|
const parsedLimit = Number(opts.limit ?? 10);
|
|
|
|
|
if (!Number.isInteger(parsedOffset) || parsedOffset < 0) {
|
|
|
|
|
throw new Error('Invalid offset');
|
|
|
|
|
}
|
|
|
|
|
if (!Number.isInteger(parsedLimit) || parsedLimit < 1 || parsedLimit > 100) {
|
|
|
|
|
throw new Error('Invalid limit');
|
|
|
|
|
}
|
|
|
|
|
offset = parsedOffset;
|
|
|
|
|
limit = parsedLimit;
|
|
|
|
|
} else if (opts != null) {
|
|
|
|
|
resolvedTx = opts;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result.rows.map((row) => ({
|
|
|
|
|
id: row.id,
|
|
|
|
|
name: row.name,
|
|
|
|
|
gsprpinfo: row.gsprpinfo,
|
|
|
|
|
pics: parsePics(row.picsJson),
|
|
|
|
|
}));
|
|
|
|
|
const runner = makeRunner(provider, resolvedTx);
|
|
|
|
|
const { companyId } = await access(googleAuthId, runner);
|
|
|
|
|
|
|
|
|
|
const [countResult, listResult] = await Promise.all([
|
|
|
|
|
runner.query(sqlCount, { companyId }),
|
|
|
|
|
runner.query(sqlPaged, { companyId, offset, limit }),
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
brands: listResult.rows.map((row) => ({
|
|
|
|
|
id: row.id,
|
|
|
|
|
name: row.name,
|
|
|
|
|
gsprpinfo: row.gsprpinfo,
|
|
|
|
|
pics: parsePics(row.picsJson),
|
|
|
|
|
})),
|
|
|
|
|
total: Number(countResult.rows[0]?.total ?? 0),
|
|
|
|
|
offset,
|
|
|
|
|
limit,
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|