Added ability to extend using modules
							parent
							
								
									2e5dfd576c
								
							
						
					
					
						commit
						5546341c1c
					
				|  | @ -200,11 +200,6 @@ payments and the sitemap for search engine indexing. | |||
| 
 | ||||
| This email is used for any email receipts which are sent by your website. | ||||
| 
 | ||||
| ##### Free shipping threshold | ||||
| 
 | ||||
| expressCart allows for the addition of a free shipping threshold. The cart will remove the shipping costs once the order has exceeded the `Free shipping threshold` | ||||
| value. If the value of the cart is beneath the `Free shipping threshold`, the cart will add the `Flat shipping rate` to the total amount. | ||||
| 
 | ||||
| ##### Payment Gateway | ||||
| 
 | ||||
| This determines which payment gateway to use. You will also need to configure your payment gateway configuration file here: `/config/<gateway_name>.json` | ||||
|  | @ -321,6 +316,9 @@ The Instore config file is located: `/config/instore.json`. A example Instore se | |||
| ``` | ||||
| Note: No payment is actually processed. The order will move to the `orderStatus` set and the payment is completed instore. | ||||
| 
 | ||||
| ## Modules | ||||
| It's possible to extend the basic functionality of `expressCart` using modules. All modules are loaded from `/lib/modules` at startup and added to the `config` for use throughout the app. There is an example module `shipping-basic` to calculate the flat shipping rate. One way to extend this basic module is to call a Postage service like [easypost](https://www.easypost.com/) to get an accurate rate for your location, package size etc. | ||||
| 
 | ||||
| ## Email settings | ||||
| 
 | ||||
| You will need to configure your SMTP details for expressCart to send email receipts to your customers. | ||||
|  |  | |||
|  | @ -42,14 +42,6 @@ | |||
|             "type": "boolean", | ||||
|             "default": true | ||||
|         }, | ||||
|         "flatShipping": { | ||||
|             "type": "number", | ||||
|             "default": 10 | ||||
|         }, | ||||
|         "freeShippingAmount": { | ||||
|             "type": "number", | ||||
|             "default": 100 | ||||
|         }, | ||||
|         "productsPerRow": { | ||||
|             "type": "number", | ||||
|             "default": 3 | ||||
|  | @ -114,6 +106,26 @@ | |||
|         "enableLanguages": { | ||||
|             "type": "boolean", | ||||
|             "default": true | ||||
|         }, | ||||
|         "modules": { | ||||
|             "type": "object", | ||||
|             "properties": { | ||||
|                 "enabled": { | ||||
|                     "type": "object", | ||||
|                     "properties": { | ||||
|                         "shipping": { | ||||
|                             "type": "string" | ||||
|                         } | ||||
|                     }, | ||||
|                     "required": ["shipping"] | ||||
|                 } | ||||
|             }, | ||||
|             "required": ["enabled"], | ||||
|             "default": { | ||||
|                 "enabled": { | ||||
|                     "shipping": "shipping-basic" | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     "required": [ | ||||
|  | @ -125,7 +137,8 @@ | |||
|         "emailPassword", | ||||
|         "emailAddress", | ||||
|         "paymentGateway", | ||||
|         "databaseConnectionString" | ||||
|         "databaseConnectionString", | ||||
|         "modules" | ||||
|     ], | ||||
|     "additionalProperties": false | ||||
| } | ||||
|  |  | |||
|  | @ -10,8 +10,6 @@ | |||
|     "emailPassword": "this_is_the_smtp_password", | ||||
|     "emailAddress": "hi@markmoffat.com", | ||||
|     "menuEnabled": true, | ||||
|     "flatShipping": 10, | ||||
|     "freeShippingAmount": 100, | ||||
|     "productsPerRow": 3, | ||||
|     "productsPerPage": 6, | ||||
|     "menuTitle": "Menu", | ||||
|  | @ -25,5 +23,10 @@ | |||
|     "trackStock": false, | ||||
|     "orderHook": "", | ||||
|     "availableLanguages": ["en", "it"], | ||||
|     "defaultLocale": "en" | ||||
|     "defaultLocale": "en", | ||||
|     "modules": { | ||||
|         "enabled": { | ||||
|             "shipping": "shipping-basic" | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -131,9 +131,11 @@ const updateTotalCart = (req, res) => { | |||
|     // Update the total items in cart for the badge
 | ||||
|     req.session.totalCartItems = Object.keys(req.session.cart).length; | ||||
| 
 | ||||
|     // under the free shipping threshold
 | ||||
|     if(req.session.totalCartAmount < config.freeShippingAmount){ | ||||
|         req.session.totalCartAmount = req.session.totalCartAmount + parseInt(config.flatShipping); | ||||
|     // Calculate shipping using the loaded module
 | ||||
|     const shippingCost = config.modules.loaded.shipping.calculateShipping(req.session.totalCartAmount); | ||||
|     if(shippingCost > 0){ | ||||
|         req.session.totalCartShipping = parseInt(shippingCost); | ||||
|         req.session.totalCartAmount = req.session.totalCartAmount + parseInt(shippingCost); | ||||
|         req.session.shippingCostApplied = true; | ||||
|     }else{ | ||||
|         req.session.shippingCostApplied = false; | ||||
|  | @ -297,6 +299,19 @@ const getConfig = () => { | |||
|         config.env = ''; | ||||
|     } | ||||
| 
 | ||||
|     // load modules
 | ||||
|     try{ | ||||
|         config.modules.loaded = {}; | ||||
|         Object.keys(config.modules.enabled).forEach((mod) => { | ||||
|             config.modules.loaded[mod] = require(`./modules/${config.modules.enabled[mod]}`); | ||||
|         }); | ||||
|     }catch(ex){ | ||||
|         console.log('Could not load modules, check your config.', ex); | ||||
|         process.exit(1); | ||||
|     } | ||||
| 
 | ||||
|     console.log('config', config); | ||||
| 
 | ||||
|     return config; | ||||
| }; | ||||
| 
 | ||||
|  | @ -369,10 +384,6 @@ const updateConfig = (fields) => { | |||
|         settingsFile.flatShipping = parseInt(fields.flatShipping); | ||||
|     } | ||||
| 
 | ||||
|     if(fields.freeShippingAmount){ | ||||
|         settingsFile.freeShippingAmount = parseInt(fields.freeShippingAmount); | ||||
|     } | ||||
| 
 | ||||
|     if(fields.productsPerRow){ | ||||
|         settingsFile.productsPerRow = parseInt(fields.productsPerRow); | ||||
|     } | ||||
|  |  | |||
|  | @ -0,0 +1,13 @@ | |||
| const shippingAmount = 10; | ||||
| const freeThreshold = 100; | ||||
| 
 | ||||
| const calculateShipping = (amount) => { | ||||
|     if(amount >= freeThreshold){ | ||||
|         return 0; | ||||
|     } | ||||
|     return shippingAmount; | ||||
| }; | ||||
| 
 | ||||
| module.exports = { | ||||
|     calculateShipping | ||||
| }; | ||||
|  | @ -107,9 +107,6 @@ | |||
| 	"Cart URL": "Cart URL", | ||||
| 	"This URL is used in sitemaps and when your customer returns from completing their payment.": "This URL is used in sitemaps and when your customer returns from completing their payment.", | ||||
| 	"This is used as the \"from\" email when sending receipts to your customers.": "This is used as the \"from\" email when sending receipts to your customers.", | ||||
| 	"Flat shipping rate": "Flat shipping rate", | ||||
| 	"A flat shipping rate applied to all orders.": "A flat shipping rate applied to all orders.", | ||||
| 	"Free shipping threshold": "Free shipping threshold", | ||||
| 	"Orders over this value will mean the shipped will the FREE. Set to high value if you always want to charge shipping.": "Orders over this value will mean the shipped will the FREE. Set to high value if you always want to charge shipping.", | ||||
| 	"Payment gateway": "Payment gateway", | ||||
| 	"Payment_Gateway_Info": "You will also need to configure your payment gateway credentials in the `/config/<gateway_name>.json` file.", | ||||
|  |  | |||
|  | @ -109,9 +109,6 @@ | |||
| 	"This URL is used in sitemaps and when your customer returns from completing their payment.": "Questo URL è usato nelle sitemaps e quando il tuo cliente ritorna per completare il suo pagamento", | ||||
| 	"This is used as the \"from\" email when sending receipts to your customers.": "Questo è usato come \"from\" nelle email inviate ai clienti", | ||||
| 	"Cart Email": "Cart Email", | ||||
| 	"Flat shipping rate": "Tariffa di spedizione fissa", | ||||
| 	"A flat shipping rate applied to all orders.": "Una tariffa di spedizione fissa da applicare a tutti gli ordini", | ||||
| 	"Free shipping threshold": "Soglia di spedizione gratuita", | ||||
| 	"Orders over this value will mean the shipped will the FREE. Set to high value if you always want to charge shipping.": "Ordini oltre questo valore avranno la spedizione GRATUITA. Configura un alto valore se vuoi sempre addebitare la spedizione.", | ||||
| 	"Payment gateway": "Gateway pagamento", | ||||
| 	"Payment_Gateway_Info": "Dovrai configurare anche le tue credenziali per il gateway di pagamento nel file `/config/<gateway_name>.json`.", | ||||
|  |  | |||
|  | @ -33,16 +33,6 @@ | |||
|                     <input type="email" class="form-control" name="emailAddress" value="{{config.emailAddress}}" required> | ||||
|                     <p class="help-block">{{ @root.__ "This is used as the \"from\" email when sending receipts to your customers." }}</p> | ||||
|                 </div> | ||||
|                 <div class="form-group"> | ||||
|                     <label>{{ @root.__ "Flat shipping rate" }} *</label> | ||||
|                     <input type="text" class="form-control" name="flatShipping" value="{{config.flatShipping}}" required> | ||||
|                     <p class="help-block">{{ @root.__ "A flat shipping rate applied to all orders." }}</p> | ||||
|                 </div> | ||||
|                 <div class="form-group"> | ||||
|                     <label>{{ @root.__ "Free shipping threshold" }}</label> | ||||
|                     <input type="text" class="form-control" name="freeShippingAmount" value="{{config.freeShippingAmount}}"> | ||||
|                     <p class="help-block">{{ @root.__ "Orders over this value will mean the shipped will the FREE. Set to high value if you always want to charge shipping." }}</p> | ||||
|                 </div> | ||||
|                 <div class="form-group"> | ||||
|                     <label>{{ @root.__ "Payment gateway" }}</label> | ||||
|                     <select class="form-control" name="paymentGateway"> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue