Add search for products in all sub categories (#68)
This commit is contained in:
@@ -88,8 +88,8 @@ export class ProductAPI extends BaseSQLDataSource {
|
|||||||
return mem;
|
return mem;
|
||||||
}, {});
|
}, {});
|
||||||
|
|
||||||
fields['artNo'] = fields['artNo'];
|
fields['artNo'] = fields['artNo'] ?? ''; // some actually exists without artNo
|
||||||
fields['name'] = fields['name'];
|
fields['name'] = fields['name'] ?? ''; // some actually exists without name
|
||||||
fields['copyright'] = fields['copyright'] ?? '';
|
fields['copyright'] = fields['copyright'] ?? '';
|
||||||
fields['comments'] = fields['comments'] ?? '';
|
fields['comments'] = fields['comments'] ?? '';
|
||||||
fields['batch'] = fields['batch'] ?? '';
|
fields['batch'] = fields['batch'] ?? '';
|
||||||
@@ -196,6 +196,16 @@ export class ProductAPI extends BaseSQLDataSource {
|
|||||||
.then((data) => data.rows.map((row) => this.createProductFromRow(row)));
|
.then((data) => data.rows.map((row) => this.createProductFromRow(row)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getCategoryWithSubCategoriesProducts(
|
||||||
|
categoryId: number,
|
||||||
|
): Promise<Array<Product>> {
|
||||||
|
const query = sql.categoryWithAllSubCategoriesProducts(categoryId);
|
||||||
|
|
||||||
|
return this.knex
|
||||||
|
.raw(query)
|
||||||
|
.then((data) => data.rows.map((row) => this.createProductFromRow(row)));
|
||||||
|
}
|
||||||
|
|
||||||
async getKeywordProducts(keywordId: number): Promise<Array<Product>> {
|
async getKeywordProducts(keywordId: number): Promise<Array<Product>> {
|
||||||
const query = sql.keywordProducts(keywordId);
|
const query = sql.keywordProducts(keywordId);
|
||||||
|
|
||||||
|
|||||||
@@ -121,7 +121,32 @@ export function categoryProducts(categoryId: number) {
|
|||||||
return (
|
return (
|
||||||
baseQuery +
|
baseQuery +
|
||||||
/* sql */ `
|
/* sql */ `
|
||||||
WHERE products.productid IN (SELECT product_id FROM product_category WHERE category_id = ${categoryId});
|
WHERE products.productid IN (SELECT product_id FROM product_category WHERE category_id = ${categoryId})
|
||||||
|
ORDER BY products.inserted DESC
|
||||||
|
`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function categoryWithAllSubCategoriesProducts(categoryId: number) {
|
||||||
|
return (
|
||||||
|
baseQuery +
|
||||||
|
/* sql */ `
|
||||||
|
WHERE products.productid IN (
|
||||||
|
SELECT product_id
|
||||||
|
FROM product_category
|
||||||
|
WHERE category_id IN (
|
||||||
|
SELECT cat.id
|
||||||
|
FROM categories cat
|
||||||
|
JOIN (
|
||||||
|
SELECT id, lft, rgt
|
||||||
|
FROM categories
|
||||||
|
WHERE id = ${categoryId}
|
||||||
|
) tree
|
||||||
|
ON cat.lft >= tree.lft AND cat.rgt <= tree.rgt
|
||||||
|
)
|
||||||
|
ORDER BY product_id
|
||||||
|
)
|
||||||
|
ORDER BY products.inserted DESC
|
||||||
`
|
`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -130,7 +155,8 @@ export function designerProducts() {
|
|||||||
return (
|
return (
|
||||||
baseQuery +
|
baseQuery +
|
||||||
/* sql */ `
|
/* sql */ `
|
||||||
WHERE products.designerid = ?;
|
WHERE products.designerid = ?
|
||||||
|
ORDER BY products.inserted DESC
|
||||||
`
|
`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -139,7 +165,8 @@ export function keywordProducts(keywordId: number) {
|
|||||||
return (
|
return (
|
||||||
baseQuery +
|
baseQuery +
|
||||||
/* sql */ `
|
/* sql */ `
|
||||||
WHERE products.productid IN (SELECT product_id FROM product_keyword WHERE keyword_id = ${keywordId});
|
WHERE products.productid IN (SELECT product_id FROM product_keyword WHERE keyword_id = ${keywordId})
|
||||||
|
ORDER BY products.inserted DESC
|
||||||
`
|
`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -148,7 +175,8 @@ export function searchByFieldValue(fieldid: number) {
|
|||||||
return (
|
return (
|
||||||
baseQuery +
|
baseQuery +
|
||||||
/* sql */ `
|
/* sql */ `
|
||||||
WHERE products.productid IN (SELECT productid FROM "product-products_fields" WHERE fieldid = ${fieldid} AND LOWER(value) LIKE ? LIMIT 5000); -- limit to 5000 results
|
WHERE products.productid IN (SELECT productid FROM "product-products_fields" WHERE fieldid = ${fieldid} AND LOWER(value) LIKE ? LIMIT 5000) -- limit to 5000 results
|
||||||
|
ORDER BY products.inserted DESC
|
||||||
`
|
`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,16 @@ import { CategoryAPI } from '../datasources/category-api';
|
|||||||
import { ProductAPI } from '../datasources/product-api';
|
import { ProductAPI } from '../datasources/product-api';
|
||||||
|
|
||||||
const Category = {
|
const Category = {
|
||||||
async products({ id }, _args, { dataSources, auth }) {
|
async products({ id }, { includeAllSubCategories }, { dataSources, auth }) {
|
||||||
|
console.log('includeAllSubCategories:', includeAllSubCategories);
|
||||||
checkAccess(['products.read'], auth);
|
checkAccess(['products.read'], auth);
|
||||||
return (<ProductAPI>dataSources.productApi).getCategoryProducts(id);
|
if (includeAllSubCategories === true) {
|
||||||
|
return (<ProductAPI>(
|
||||||
|
dataSources.productApi
|
||||||
|
)).getCategoryWithSubCategoriesProducts(id);
|
||||||
|
} else {
|
||||||
|
return (<ProductAPI>dataSources.productApi).getCategoryProducts(id);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+4
-1
@@ -256,7 +256,10 @@ type Category {
|
|||||||
childCount: Int
|
childCount: Int
|
||||||
lft: Int
|
lft: Int
|
||||||
rgt: Int
|
rgt: Int
|
||||||
products: [Product]
|
"""
|
||||||
|
Default to false
|
||||||
|
"""
|
||||||
|
products(includeAllSubCategories: Boolean): [Product]
|
||||||
}
|
}
|
||||||
|
|
||||||
type Batch {
|
type Batch {
|
||||||
|
|||||||
Reference in New Issue
Block a user