From 60497cfbdf29df106d3d4270bfd480f270f16098 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Mon, 25 Mar 2024 16:52:42 +0700 Subject: generate recomendation --- src/pages/api/shop/generate-recomendation.js | 60 ++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/pages/api/shop/generate-recomendation.js (limited to 'src/pages/api') diff --git a/src/pages/api/shop/generate-recomendation.js b/src/pages/api/shop/generate-recomendation.js new file mode 100644 index 00000000..a2a9ee40 --- /dev/null +++ b/src/pages/api/shop/generate-recomendation.js @@ -0,0 +1,60 @@ +import { productMappingSolr } from '@/utils/solrMapping' +import axios from 'axios'; +import camelcaseObjectDeep from 'camelcase-object-deep'; + +export default async function handler(req, res) { + const { q = null } = req.query + + if (!q) { + return res.status(422).json({ error: 'parameter missing' }) + } + + let parameter = [ + `q=${escapeSolrQuery(q)}`, + `q.op=AND`, + `indent=true`, + `fq=-publish_b:false`, + `qf=name_s^2 description_s`, + `facetch=true`, + `fq=price_tier1_v2_f:[1 TO *]`, + `rows=1`, + `sort=product_rating_f DESC, price_discount_f DESC`, + ]; + let result = await axios( + process.env.SOLR_HOST + '/solr/product/select?' + parameter.join('&') + ); + try { + let { auth } = req.cookies; + if (auth) auth = JSON.parse(auth); + result.data.response.products = productMappingSolr( + result.data.response.docs, + auth?.pricelist || false + ); + result.data.responseHeader.params.start = parseInt( + result.data.responseHeader.params.start + ); + result.data.responseHeader.params.rows = parseInt( + result.data.responseHeader.params.rows + ); + delete result.data.response.docs; + result.data = camelcaseObjectDeep(result.data); + res.status(200).json(result.data); + } catch (error) { + res.status(400).json({ error: error.message }); + } +} + +const escapeSolrQuery = (query) => { + if (query == '*') return query; + + const specialChars = /([\+\-\!\(\)\{\}\[\]\^"~\*\?:\\\/])/g; + const words = query.split(/\s+/); + const escapedWords = words.map((word) => { + if (specialChars.test(word)) { + return `"${word.replace(specialChars, '\\$1')}"`; + } + return word; + }); + + return escapedWords.join(' '); +}; -- cgit v1.2.3 From b7def06cf32bf86036056718ece2350b4da72d23 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Fri, 5 Apr 2024 15:43:24 +0700 Subject: recomendation --- src/pages/api/shop/generate-recomendation.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/pages/api') diff --git a/src/pages/api/shop/generate-recomendation.js b/src/pages/api/shop/generate-recomendation.js index a2a9ee40..11dd153e 100644 --- a/src/pages/api/shop/generate-recomendation.js +++ b/src/pages/api/shop/generate-recomendation.js @@ -3,7 +3,7 @@ import axios from 'axios'; import camelcaseObjectDeep from 'camelcase-object-deep'; export default async function handler(req, res) { - const { q = null } = req.query + const { q = null, op = 'AND' } = req.query if (!q) { return res.status(422).json({ error: 'parameter missing' }) @@ -11,13 +11,13 @@ export default async function handler(req, res) { let parameter = [ `q=${escapeSolrQuery(q)}`, - `q.op=AND`, + `q.op=${op}`, `indent=true`, `fq=-publish_b:false`, `qf=name_s^2 description_s`, `facetch=true`, `fq=price_tier1_v2_f:[1 TO *]`, - `rows=1`, + `rows=10`, `sort=product_rating_f DESC, price_discount_f DESC`, ]; let result = await axios( -- cgit v1.2.3 From 4d849f1ab72a0d0eb5851662f200ccef21b66457 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Tue, 18 Jun 2024 10:26:17 +0700 Subject: fixing error sign in and sign out google --- src/pages/api/auth/[...nextauth].js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/pages/api') diff --git a/src/pages/api/auth/[...nextauth].js b/src/pages/api/auth/[...nextauth].js index 3c433167..c188aaa1 100644 --- a/src/pages/api/auth/[...nextauth].js +++ b/src/pages/api/auth/[...nextauth].js @@ -20,7 +20,11 @@ export default NextAuth({ session.accessToken = token.accessToken return session - } + }, + async redirect({ url, baseUrl }) { + // Redirect to dashboard after login + return url.startsWith(baseUrl) ? url : baseUrl; + }, }, secret: process.env.JWT_SECRET }) -- cgit v1.2.3 From 98109d3da0a88dfa1a513be68a0debe2e626d331 Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Tue, 18 Jun 2024 11:50:51 +0700 Subject: fixing error refirect login --- src/pages/api/auth/[...nextauth].js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'src/pages/api') diff --git a/src/pages/api/auth/[...nextauth].js b/src/pages/api/auth/[...nextauth].js index c188aaa1..3c433167 100644 --- a/src/pages/api/auth/[...nextauth].js +++ b/src/pages/api/auth/[...nextauth].js @@ -20,11 +20,7 @@ export default NextAuth({ session.accessToken = token.accessToken return session - }, - async redirect({ url, baseUrl }) { - // Redirect to dashboard after login - return url.startsWith(baseUrl) ? url : baseUrl; - }, + } }, secret: process.env.JWT_SECRET }) -- cgit v1.2.3 From f559326406175b18f75d2dd42c8bd2f0d901acbf Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Fri, 21 Jun 2024 15:09:57 +0700 Subject: recomendation product for sales --- src/pages/api/shop/generate-recomendation.js | 36 +++++++++++++++------------- 1 file changed, 20 insertions(+), 16 deletions(-) (limited to 'src/pages/api') diff --git a/src/pages/api/shop/generate-recomendation.js b/src/pages/api/shop/generate-recomendation.js index 11dd153e..aea39adf 100644 --- a/src/pages/api/shop/generate-recomendation.js +++ b/src/pages/api/shop/generate-recomendation.js @@ -9,7 +9,7 @@ export default async function handler(req, res) { return res.status(422).json({ error: 'parameter missing' }) } - let parameter = [ + /*let parameter = [ `q=${escapeSolrQuery(q)}`, `q.op=${op}`, `indent=true`, @@ -22,23 +22,27 @@ export default async function handler(req, res) { ]; let result = await axios( process.env.SOLR_HOST + '/solr/product/select?' + parameter.join('&') + );*/ + let parameter = [ + `q=${escapeSolrQuery(q)}`, + `q.op=${op}`, + `debugQuery=on`, + `defType=edismax`, + `df=display_name_s`, + `fq=-publish_b:false`, + `rows=5`, + ]; + if(op == 'AND'){ + parameter.push(`sort=product_rating_f DESC, price_discount_f DESC`); + parameter.push(`rows=1`); + } + + let result = await axios( + process.env.SOLR_HOST + '/solr/recommendation/select?' + parameter.join('&') ); try { - let { auth } = req.cookies; - if (auth) auth = JSON.parse(auth); - result.data.response.products = productMappingSolr( - result.data.response.docs, - auth?.pricelist || false - ); - result.data.responseHeader.params.start = parseInt( - result.data.responseHeader.params.start - ); - result.data.responseHeader.params.rows = parseInt( - result.data.responseHeader.params.rows - ); - delete result.data.response.docs; - result.data = camelcaseObjectDeep(result.data); - res.status(200).json(result.data); + result.data = camelcaseObjectDeep(result.data) + res.status(200).json(result.data) } catch (error) { res.status(400).json({ error: error.message }); } -- cgit v1.2.3 From 59a0743aa8c64190d466bb66e2e37bfa80b0469c Mon Sep 17 00:00:00 2001 From: "HATEC\\SPVDEV001" Date: Fri, 28 Jun 2024 10:31:45 +0700 Subject: delete function remove special character --- src/pages/api/shop/generate-recomendation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/pages/api') diff --git a/src/pages/api/shop/generate-recomendation.js b/src/pages/api/shop/generate-recomendation.js index aea39adf..dce8ae72 100644 --- a/src/pages/api/shop/generate-recomendation.js +++ b/src/pages/api/shop/generate-recomendation.js @@ -24,7 +24,7 @@ export default async function handler(req, res) { process.env.SOLR_HOST + '/solr/product/select?' + parameter.join('&') );*/ let parameter = [ - `q=${escapeSolrQuery(q)}`, + `q=${q}`, `q.op=${op}`, `debugQuery=on`, `defType=edismax`, -- cgit v1.2.3 From 455ebc5c02657a6c1c328977e08176e222c56ddd Mon Sep 17 00:00:00 2001 From: trisusilo48 Date: Mon, 5 Aug 2024 13:12:22 +0700 Subject: query filter --- src/pages/api/shop/search.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/pages/api') diff --git a/src/pages/api/shop/search.js b/src/pages/api/shop/search.js index b6b8c795..29471f7b 100644 --- a/src/pages/api/shop/search.js +++ b/src/pages/api/shop/search.js @@ -39,7 +39,7 @@ export default async function handler(req, res) { paramOrderBy += 'flashsale_price_f ASC'; break; default: - paramOrderBy += 'product_rating_f DESC, price_discount_f DESC'; + paramOrderBy += ''; break; } @@ -56,7 +56,7 @@ export default async function handler(req, res) { `start=${parseInt(offset)}`, `rows=${limit}`, `sort=${paramOrderBy}`, - `fq=-publish_b:false`, + `fq=-publish_b:false, product_rating_f:[13 TO *], discount_tier1_v2_f:[1 TO *]`, ]; if (priceFrom > 0 || priceTo > 0) { -- cgit v1.2.3 From e26e9b44c88cf6cf76ba3ab1d8e8408bf45c61ca Mon Sep 17 00:00:00 2001 From: trisusilo48 Date: Wed, 7 Aug 2024 10:35:54 +0700 Subject: cr fq solr search --- src/pages/api/shop/search.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/pages/api') diff --git a/src/pages/api/shop/search.js b/src/pages/api/shop/search.js index 29471f7b..5c2d4ffc 100644 --- a/src/pages/api/shop/search.js +++ b/src/pages/api/shop/search.js @@ -56,7 +56,7 @@ export default async function handler(req, res) { `start=${parseInt(offset)}`, `rows=${limit}`, `sort=${paramOrderBy}`, - `fq=-publish_b:false, product_rating_f:[13 TO *], discount_tier1_v2_f:[1 TO *]`, + `fq=-publish_b:false, product_rating_f:[13 TO *], price_tier1_v2_f:[1 TO *]`, ]; if (priceFrom > 0 || priceTo > 0) { -- cgit v1.2.3 From af15f29e8e057b338cbf9d8264edf703a7d624e6 Mon Sep 17 00:00:00 2001 From: trisusilo48 Date: Thu, 8 Aug 2024 08:35:52 +0700 Subject: cr query filter product rating --- src/pages/api/shop/search.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/pages/api') diff --git a/src/pages/api/shop/search.js b/src/pages/api/shop/search.js index 5c2d4ffc..d5a7ab31 100644 --- a/src/pages/api/shop/search.js +++ b/src/pages/api/shop/search.js @@ -56,7 +56,7 @@ export default async function handler(req, res) { `start=${parseInt(offset)}`, `rows=${limit}`, `sort=${paramOrderBy}`, - `fq=-publish_b:false, product_rating_f:[13 TO *], price_tier1_v2_f:[1 TO *]`, + `fq=-publish_b:false, product_rating_f:[8 TO *], price_tier1_v2_f:[1 TO *]`, ]; if (priceFrom > 0 || priceTo > 0) { -- cgit v1.2.3 From 0b7db052b04ab983632463232fc8190a6f69143a Mon Sep 17 00:00:00 2001 From: trisusilo48 Date: Thu, 8 Aug 2024 15:06:27 +0700 Subject: update q --- src/pages/api/shop/search.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/pages/api') diff --git a/src/pages/api/shop/search.js b/src/pages/api/shop/search.js index d5a7ab31..b886985c 100644 --- a/src/pages/api/shop/search.js +++ b/src/pages/api/shop/search.js @@ -42,7 +42,10 @@ export default async function handler(req, res) { paramOrderBy += ''; break; } - + + let checkQ = q.trim().split(/\s+/); + let newQ = checkQ.length > 1 ? escapeSolrQuery(q) + '*' : escapeSolrQuery(q); + let offset = (page - 1) * limit; let parameter = [ 'facet.field=manufacture_name_s', @@ -51,7 +54,7 @@ export default async function handler(req, res) { 'indent=true', `facet.query=${escapeSolrQuery(q)}`, `q.op=${operation}`, - `q=${escapeSolrQuery(q)}`, + `q=${newQ}`, 'qf=name_s', `start=${parseInt(offset)}`, `rows=${limit}`, @@ -77,7 +80,10 @@ export default async function handler(req, res) { parameter.push( `fq=${brand .split(',') - .map((manufacturer) => `manufacture_name:"${encodeURIComponent(manufacturer)}"`) + .map( + (manufacturer) => + `manufacture_name:"${encodeURIComponent(manufacturer)}"` + ) .join(' OR ')}` ); if (category) -- cgit v1.2.3 From a0c053de428bcf40a8435921023290a56bd7d8ea Mon Sep 17 00:00:00 2001 From: trisusilo48 Date: Fri, 9 Aug 2024 14:28:01 +0700 Subject: tunning uqery for sku --- src/pages/api/shop/search.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'src/pages/api') diff --git a/src/pages/api/shop/search.js b/src/pages/api/shop/search.js index b886985c..6f98efcb 100644 --- a/src/pages/api/shop/search.js +++ b/src/pages/api/shop/search.js @@ -43,7 +43,7 @@ export default async function handler(req, res) { break; } - let checkQ = q.trim().split(/\s+/); + let checkQ = q.trim().split(/[\s\+\-\!\(\)\{\}\[\]\^"~\*\?:\\\/]+/); let newQ = checkQ.length > 1 ? escapeSolrQuery(q) + '*' : escapeSolrQuery(q); let offset = (page - 1) * limit; @@ -126,12 +126,14 @@ export default async function handler(req, res) { const escapeSolrQuery = (query) => { if (query == '*') return query; + + query = query.replace(/-/g, ' '); - const specialChars = /([\+\-\!\(\)\{\}\[\]\^"~\*\?:\\\/])/g; + const specialChars = /([\+\!\(\)\{\}\[\]\^"~\*\?:\\\/])/g; const words = query.split(/\s+/); const escapedWords = words.map((word) => { if (specialChars.test(word)) { - return `"${word.replace(specialChars, '\\$1')}"`; + return word.replace(specialChars, '\\$1'); } return word; }); @@ -139,6 +141,7 @@ const escapeSolrQuery = (query) => { return escapedWords.join(' '); }; + /*const productResponseMap = (products, pricelist) => { return products.map((product) => { let price = product.price_tier1_v2_f || 0 -- cgit v1.2.3