22
33'use strict' ;
44
5- class Order {
6- constructor ( items ) {
7- /**
8- * @type {Array.<ShoppingItem> }
9- */
10- this . items = items ;
11-
12- /**
13- * @type {Number }
14- */
15- this . orderPrice = items . reduce ( ( sum , item ) => ( sum || 0 ) + ( item . price * item . quantity ) ) ;
16- }
17- }
5+ const Order = require ( '../models/order' ) ;
186
197class ShoppingCart {
20- constructor ( ) {
21- this . items = [ ] ;
8+ constructor ( opts ) {
9+ opts = opts || { } ;
10+
11+ this . name = opts . name ;
12+ this . items = opts . items || [ ] ;
13+ this . ___class = ShoppingCart . name ;
2214 }
2315
2416 addItem ( item ) {
17+ item . objectId = null ;
18+
2519 this . items . push ( item ) ;
2620 }
2721
22+ deleteItem ( product ) {
23+ const idx = this . items . findIndex ( item => item . product === product ) ;
24+
25+ if ( idx === - 1 ) {
26+ throw new Error ( `No ${ product } in cart` ) ;
27+ }
28+
29+ this . items . splice ( idx , 1 ) ;
30+
31+ return this ;
32+ }
33+
34+ setQuantity ( product , quantity ) {
35+ const productItem = this . items . find ( item => item . product === product ) ;
36+
37+ if ( ! productItem ) {
38+ throw new Error ( `No [${ product } ] in cart` ) ;
39+ }
40+
41+ productItem . quantity = quantity ;
42+
43+ return this ;
44+ }
45+
2846 getItems ( ) {
2947 return this . items ;
3048 }
49+
50+ destroy ( ) {
51+ Backendless . Cache . remove ( this . name , this ) ;
52+ }
53+
54+ save ( ) {
55+ Backendless . Cache . put ( this . name , this ) ;
56+ }
57+
58+ static get ( name , mustExist ) {
59+ Backendless . Cache . setObjectFactory ( ShoppingCart . name , ShoppingCart ) ;
60+
61+ return Backendless . Cache . get ( name ) . then ( cart => {
62+ if ( ! cart && mustExist ) {
63+ throw new Error ( `Shopping cart [${ name } ] does not exist` ) ;
64+ }
65+
66+ return cart ;
67+ } ) ;
68+ }
3169}
3270
3371class ShoppingCartService {
3472
3573 /**
36- * A custom type can be described in jsdoc typedef declaration without having its own class
37- * This will help to build a valid Swager doc but the CodeRunner won't be able to transform a plain JS object
38- * from the request into concrete class.
39- *
40- * @typedef {Object } ShoppingItem
41- * @property {String } objectId
42- * @property {String } product
43- * @property {Number } price
44- * @property {Number } quantity
45- * */
46-
47- /**
48- * @public
4974 * @param {String } cartName
5075 * @param {ShoppingItem } item
51- * @returns {void }
76+ * @returns {Promise.< void> }
5277 */
5378 addItem ( cartName , item ) {
54- let shoppingCart = this . getCart ( cartName ) ;
79+ return this . addItems ( cartName , [ item ] ) ;
80+ }
5581
56- if ( ! shoppingCart ) {
57- shoppingCart = new ShoppingCart ( ) ;
58- }
82+ /**
83+ * @param {String } cartName
84+ * @param {Array.<ShoppingItem> } items
85+ * @returns {Promise.<void> }
86+ */
87+ addItems ( cartName , items ) {
88+ return ShoppingCart . get ( cartName ) . then ( cart => {
89+ if ( ! cart ) {
90+ cart = new ShoppingCart ( { name : cartName } ) ;
91+ }
5992
60- shoppingCart . addItem ( item ) ;
61- item . objectId = null ;
93+ items . forEach ( item => cart . addItem ( item ) ) ;
6294
63- Backendless . Cache . put ( cartName , shoppingCart ) ;
95+ return cart . save ( ) ;
96+ } ) ;
6497 }
6598
6699 /**
67- * @public
68100 * @param {String } cartName
69- * @returns {Promise.<Order> }
101+ * @param {String } product
102+ * @returns {Promise.<void> }
70103 */
71- purchase ( cartName ) {
72- const shoppingCart = this . getCart ( cartName ) ;
73-
74- if ( ! shoppingCart ) {
75- throw new Error ( `Shopping cart ${ cartName } does not exist` ) ;
76- }
77-
78- const order = new Order ( shoppingCart . getItems ( ) ) ;
104+ deleteItem ( cartName , product ) {
105+ return ShoppingCart . get ( cartName , true ) . then ( cart => cart . deleteItem ( product ) . save ( ) ) ;
106+ }
79107
80- return order . save ( )
81- . then ( ( ) => {
82- Backendless . Cache . delete ( cartName ) ;
108+ /**
109+ * @param {String } cartName
110+ * @returns {Promise.<Array.<ShoppingItem>> }
111+ */
112+ getItems ( cartName ) {
113+ return ShoppingCart . get ( cartName , true ) . then ( cart => cart . getItems ( ) ) ;
114+ }
83115
84- return order ;
85- } ) ;
116+ /**
117+ * @param {String } cartName
118+ * @param {String } productName
119+ * @param {Number } quantity
120+ * @returns {Promise.<void> }
121+ */
122+ setQuantity ( cartName , productName , quantity ) {
123+ return ShoppingCart . get ( cartName , true ) . then ( cart => cart . setQuantity ( productName , quantity ) . save ( ) ) ;
86124 }
87125
88126 /**
89- * @private
90127 * @param {String } cartName
91- * @returns {ShoppingCart }
128+ * @returns {Promise.<Order> }
92129 */
93- static getCart ( cartName ) {
94- return Backendless . Cache . get ( cartName , ShoppingCart . class ) ;
130+ purchase ( cartName ) {
131+ return ShoppingCart . get ( cartName , true ) . then ( cart => {
132+ const order = new Order ( cart . getItems ( ) ) ;
133+
134+ return order . save ( )
135+ . then ( ( ) => cart . destroy ( ) )
136+ . then ( ( ) => order ) ;
137+ } ) ;
95138 }
96139}
97140
98- Backendless . ServerCode . addType ( Order ) ;
141+ Backendless . enablePromises ( ) ;
99142Backendless . ServerCode . addService ( ShoppingCartService ) ;
0 commit comments