diff --git a/seller-app-api/services/product.service.js b/seller-app-api/services/product.service.js index c8d96ff..c869c3f 100644 --- a/seller-app-api/services/product.service.js +++ b/seller-app-api/services/product.service.js @@ -4,8 +4,7 @@ import {ConfirmRequest, InitRequest, SelectRequest} from "../models"; import logger from "../lib/logger"; var config = require('../lib/config'); -const strapiAccessToken = config.get("strapi").apiToken -const strapiURI = config.get("strapi").serverUrl +const serverUrl = config.get("seller").serverUrl const BPP_ID = config.get("sellerConfig").BPP_ID const BPP_URI = config.get("sellerConfig").BPP_URI @@ -15,8 +14,8 @@ class ProductService { let headers = {}; let httpRequest = new HttpRequest( - strapiURI, - '/api/products', + serverUrl, + '/api/v1/products/search', 'get', {}, headers @@ -37,8 +36,8 @@ class ProductService { let headers = {}; let httpRequest = new HttpRequest( - strapiURI, - `/api/products?filters[name][$eq]=${searchProduct}`, //TODO: allow $like query + serverUrl, + `/api/v1/products/search`, //TODO: allow $like query 'get', {}, headers @@ -73,7 +72,7 @@ class ProductService { let qouteItemsDetails = {} let httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/products/${item.id}`, 'get', {}, @@ -186,7 +185,7 @@ class ProductService { let qouteItemsDetails = {} let httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/products/${item.id}`, 'get', {}, @@ -259,7 +258,7 @@ class ProductService { let qouteItemsDetails = {} let httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/products/${item.id}`, 'get', {}, @@ -317,7 +316,7 @@ class ProductService { } let httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/order-items`, 'POST', {data: productItems}, @@ -337,7 +336,7 @@ class ProductService { let confirm = {} let httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/orders`, 'POST', {data: confirmData}, @@ -367,7 +366,7 @@ class ProductService { return 0/3; let httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/products/${id}`, 'get', {}, @@ -385,7 +384,7 @@ class ProductService { // headers['Authorization'] = `Bearer ${strapiAccessToken}`; let httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/orders?populate[0]=order_items&populate[1]=order_items.product`, 'get', {}, @@ -403,7 +402,7 @@ class ProductService { // headers['Authorization'] = `Bearer ${strapiAccessToken}`; let httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/orders/${id}?populate[0]=order_items&populate[1]=order_items.product`, 'get', {}, @@ -422,7 +421,7 @@ class ProductService { console.log(data) let httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/products/${id}`, 'put', {data: data}, @@ -442,7 +441,7 @@ class ProductService { console.log(data); let httpRequest = new HttpRequest( - strapiURI, + serverUrl, '/api/products', 'post', {data}, @@ -477,7 +476,7 @@ class ProductService { let confirm = {} let httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/orders?filters[order_id][$eq]=${statusRequest.message.order_id}`, 'GET', {}, @@ -494,7 +493,7 @@ class ProductService { //update order level state httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/orders/${result.data.data[0].id}`, 'PUT', {data:updateOrder}, @@ -533,7 +532,7 @@ class ProductService { let confirm = {} let httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/orders?filters[order_id][$eq]=${cancelRequest.message.order_id}`, 'GET', {}, @@ -550,7 +549,7 @@ class ProductService { //update order level state httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/orders/${result.data.data[0].id}`, 'PUT', {data:updateOrder}, @@ -611,7 +610,7 @@ class ProductService { let qouteItemsDetails = {} let httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/products/${item.id}`, 'get', {}, @@ -670,7 +669,7 @@ class ProductService { value: item.price.value } let httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/order-items`, 'POST', {data: productItems}, @@ -692,7 +691,7 @@ class ProductService { let confirm = {} let httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/orders`, 'POST', {data: confirmData}, @@ -761,7 +760,7 @@ class ProductService { let qouteItemsDetails = {} let httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/products/${item.id}`, 'get', {}, @@ -873,7 +872,7 @@ class ProductService { let qouteItemsDetails = {} let httpRequest = new HttpRequest( - strapiURI, + serverUrl, `/api/products/${item.id}`, 'get', {}, diff --git a/seller-app-api/utils/schemaMapping.js b/seller-app-api/utils/schemaMapping.js index d1432b7..29cc3a9 100644 --- a/seller-app-api/utils/schemaMapping.js +++ b/seller-app-api/utils/schemaMapping.js @@ -12,23 +12,23 @@ exports.getProducts = async (data) => { let item = { "id": items.id, "descriptor": { - "name": items.attributes.name, + "name": items.productName, "symbol": "https://awstoazures3.blob.core.windows.net/signcatch-master/production/products/images/10997/1629350300589Oshon-Coffee-Star-Jar-jpg", - "short_desc": items.attributes.description, - "long_desc": items.attributes.description, + "short_desc": items.description, + "long_desc": items.longDescription, "images": [ "https://awstoazures3.blob.core.windows.net/signcatch-master/production/products/images/10997/1629350300589Oshon-Coffee-Star-Jar-jpg" ] }, "price": { "currency": "INR", - "value": items.attributes.price + "value": items.MRP }, - "location_id": "8fdd9880-3d0c-444a-8038-fb98ec65f7b6", + "location_id": "8fdd9880-3d0c-444a-8038-fb98ec65f7b6", //TODO: FIX "matched": true, - "@ondc/org/returnable": items.attributes?.isReturnable??false, - "@ondc/org/cancellable": items.attributes?.isCancellable??false, - "@ondc/org/available_on_cod": true, + "@ondc/org/returnable": items.isReturnable??false, + "@ondc/org/cancellable": items.isCancellable??false, + "@ondc/org/available_on_cod": items.availableOnCod, "@ondc/org/time_to_ship": "PT48H" } productAvailable.push(item) @@ -44,6 +44,21 @@ exports.getProducts = async (data) => { "context": {...context}, "message": { "catalog": { + "bpp/fulfillments": + [ + { + "id":"1", + "type":"Delivery" + }, + { + "id":"2", + "type":"Self-Pickup" + }, + { + "id":"3", + "type":"Delivery and Self-Pickup" + } + ], "bpp/descriptor": { "name": "Bech", "symbol": "https://uploads-ssl.webflow.com/5f5b3175374e04e897cf2a3d/5f5b3175374e04ade4cf2b56_bechbrand.svg", diff --git a/seller/app/modules/product/v1/services/product.service.js b/seller/app/modules/product/v1/services/product.service.js new file mode 100644 index 0000000..162e8a6 --- /dev/null +++ b/seller/app/modules/product/v1/services/product.service.js @@ -0,0 +1,78 @@ +import { v1 as uuidv1 } from 'uuid'; +import MESSAGES from '../../../../lib/utils/messages'; +import Product from '../../models/product.model'; +import { + NoRecordFoundError, + DuplicateRecordFoundError, + BadRequestParameterError, +} from '../../../../lib/errors'; +import s3 from "../../../../lib/utils/s3Utils"; + +class ProductService { + async create(data) { + try { + let query = {}; + + const organizationExist = await Product.findOne({productName:data.productName}); + if (organizationExist) { + throw new DuplicateRecordFoundError(MESSAGES.PRODUCT_ALREADY_EXISTS); + } + let product = new Product(data); + let savedProduct= await product.save(); + + return savedProduct; + } catch (err) { + console.log(`[ProductService] [create] Error in creating product ${data.organizationId}`,err); + throw err; + } + } + + async list(params) { + try { + let query={}; + if(params.name){ + query.name = { $regex: params.name, $options: 'i' }; + } + const data = await Product.find(query).sort({createdAt:1}).skip(params.offset).limit(params.limit); + const count = await Product.count(query) + let products={ + count, + data + }; + return products; + } catch (err) { + console.log('[ProductService] [getAll] Error in getting all organization ',err); + throw err; + } + } + + async search(params) { + try { + let query={}; + + const data = await Product.find(query).sort({createdAt:1}).skip(params.offset).limit(params.limit); + const count = await Product.count(query) + let products={ + count, + data + }; + return products; + } catch (err) { + console.log('[ProductService] [getAll] Error in getting all from organization ',err); + throw err; + } + } + + async get(organizationId) { + try { + let doc = await Product.findOne({_id:organizationId}).lean(); + return doc; + + } catch (err) { + console.log(`[OrganizationService] [get] Error in getting organization by id - ${organizationId}`,err); + throw err; + } + } + +} +export default ProductService; diff --git a/seller/app/modules/product/v1/validationSchema/api-params-validation-schema/product.validate.schema.js b/seller/app/modules/product/v1/validationSchema/api-params-validation-schema/product.validate.schema.js new file mode 100644 index 0000000..11e28db --- /dev/null +++ b/seller/app/modules/product/v1/validationSchema/api-params-validation-schema/product.validate.schema.js @@ -0,0 +1,94 @@ +import Joi from 'joi'; + +module.exports = { + create: () => { + return Joi.object({ + productCode: Joi.string(), + productName: Joi.string(), + MRP: Joi.number(), + retailPrice: Joi.number(), + purchasePrice: Joi.number(), + HSNCode: Joi.string(), + GST_Percentage: Joi.number(), + productCategory: Joi.string(), + productSubcategory1: Joi.string(), + productSubcategory2: Joi.string(), + productSubcategory3: Joi.string(), + quantity: Joi.number(), + barcode: Joi.number(), + maxAllowedQty: Joi.number(), + packQty:Joi.number(), + UOM: Joi.string(),//units of measure + length: Joi.number(), + breadth: Joi.number(), + height: Joi.number(), + weight: Joi.number(), + isReturnable: Joi.boolean(), + returnWindow: Joi.string(), + isVegetarian: Joi.boolean(), + manufacturerName: Joi.string(), + manufacturedDate: Joi.string(), + nutritionalInfo: Joi.string(), + additiveInfo: Joi.string(), + instructions: Joi.string(), + isCancellable: Joi.boolean(), + availableOnCod: Joi.boolean(), + longDescription: Joi.string(), + description: Joi.string(), + images: Joi.array(), + }); + }, + setStoreDetails:()=>{ + return Joi.object({ + categories: Joi.array(), + logo: Joi.string(), + location: {lat:Joi.number(),long:Joi.number()}, + locationAvailabilityPANIndia:Joi.boolean(), + city:Joi.array(), + defaultCancellable:Joi.boolean(), + defaultReturnable:Joi.boolean(), + supportDetails:{ + email:Joi.string(), + mobile:Joi.string() + } + }); + }, + updateStoreDetails:()=>{ + return Joi.object({ + categories: Joi.array(), + logo: Joi.string(), + location: {lat:Joi.number(),long:Joi.number()}, + locationAvailabilityPANIndia:Joi.boolean(), + city:Joi.array(), + defaultCancellable:Joi.boolean(), + defaultReturnable:Joi.boolean(), + supportDetails:{ + email:Joi.string(), + mobile:Joi.string() + } + }); + }, + get:()=>{ + return Joi.object({ + organizationId: Joi.string().guid({ + version: ['uuidv4'] + }), + }); + }, + + getStoreDetails:()=>{ + return Joi.object({ + organizationId: Joi.string().guid({ + version: ['uuidv4'] + }), + }); + }, + + list:()=>{ + return Joi.object({ + name:Joi.string().empty(''), + offset:Joi.number(), + limit:Joi.number() + }); + } +};