Esempio n. 1
0
    def update_product(self, _req):
        try:
            product_id = _req['entity_id']
        except KeyError:
            return {"error": "missing mandatory parameter 'entity_id'"}

        rsp = send_message('read-model', 'get_entity', {
            'name': 'product',
            'id': product_id
        })
        if 'error' in rsp:
            rsp['error'] += ' (from read-model)'
            return rsp

        product = rsp['result']
        if not product:
            return {"error": "could not find product"}

        # set new props
        product['entity_id'] = product_id
        try:
            product['name'] = _req['name']
            product['price'] = _req['price']
        except KeyError:
            return {
                "result": "missing mandatory parameter 'name' and/or 'price"
            }

        # trigger event
        self.event_store.publish('product',
                                 create_event('entity_updated', product))

        return {"result": True}
Esempio n. 2
0
    def create_carts(self, _req):
        carts = _req if isinstance(_req, list) else [_req]
        cart_ids = []

        for cart in carts:
            res, product_id = self._check_inventory(cart['product_ids'])
            if not res:
                return {
                    'error': 'product {} is out of stock'.format(product_id)
                }

            try:
                new_cart = CartService._create_entity(cart['customer_id'],
                                                      cart['product_ids'])
            except KeyError:
                return {
                    "error":
                    "missing mandatory parameter 'customer_id' and/or 'product_ids'"
                }

            # trigger event
            self.event_store.publish('cart',
                                     create_event('entity_created', new_cart))

            cart_ids.append(new_cart['entity_id'])

        return {"result": cart_ids}
Esempio n. 3
0
    def delete_billing(self, _req):
        try:
            billing_id = _req['entity_id']
        except KeyError:
            return {
                "error": "missing mandatory parameter 'entity_id'"
            }

        rsp = send_message('read-model', 'get_entitiy', {'name': 'billing', 'id': billing_id})
        if 'error' in rsp:
            rsp['error'] += ' (from read-model)'
            return rsp

        billing = rsp['result']
        if not billing:
            return {
                "error": "could not find billing"
            }

        # trigger event
        self.event_store.publish('billing', create_event('entity_deleted', billing))

        return {
            "result": True
        }
    def update_shipping(self, _req):
        try:
            shipping_id = _req['entity_id']
        except KeyError:
            return {"error": "missing mandatory parameter 'entity_id'"}

        rsp = send_message('read-model', 'get_entity', {
            'name': 'shipping',
            'id': shipping_id
        })
        if 'error' in rsp:
            rsp['error'] += ' (from read-model)'
            return rsp

        shipping = rsp['result']
        if not shipping:
            return {"error": "could not find shipping"}

        # set new props
        shipping['entity_id'] = shipping_id
        try:
            shipping['order_id'] = _req['order_id']
            shipping['delivered'] = _req['delivered']
        except KeyError:
            return {
                "result":
                "missing mandatory parameter 'order_id' and/or 'delivered"
            }

        # trigger event
        self.event_store.publish('shipping',
                                 create_event('entity_updated', shipping))

        return {"result": True}
Esempio n. 5
0
    def create_billings(self, _req):
        billings = _req if isinstance(_req, list) else [_req]
        billing_ids = []

        for billing in billings:
            res = self._check_amount(billing)
            if not res:
                return {
                    'error': 'amount is not accurate'
                }

            try:
                new_billing = BillingService._create_entity(billing['order_id'], billing['amount'])
            except KeyError:
                return {
                    "error": "missing mandatory parameter 'order_id' and/or 'amount'"
                }

            # trigger event
            self.event_store.publish('billing', create_event('entity_created', new_billing))

            billing_ids.append(new_billing['entity_id'])

        return {
            "result": billing_ids
        }
    def update_inventory(self, _req):
        try:
            inventory_id = _req['entity_id']
        except KeyError:
            return {"error": "missing mandatory parameter 'entity_id'"}

        rsp = send_message('read-model', 'get_entity', {
            'name': 'inventory',
            'id': inventory_id
        })
        if 'error' in rsp:
            rsp['error'] += ' (from read-model)'
            return rsp

        inventory = rsp['result']
        if not inventory:
            return {"error": "could not find inventory"}

        # set new props
        inventory['entity_id'] = inventory_id
        try:
            inventory['product_id'] = _req['product_id']
            inventory['amount'] = _req['amount']
        except KeyError:
            return {
                "result":
                "missing mandatory parameter 'product_id' and/or 'amount"
            }

        # trigger event
        self.event_store.publish('inventory',
                                 create_event('entity_updated', inventory))

        return {"result": True}
    def _decr_inventory(self, _product_id, _value=1):
        rsp = send_message('read-model', 'get_entity', {
            'name': 'inventory',
            'props': {
                'product_id': _product_id
            }
        })
        if 'error' in rsp:
            raise Exception(rsp['error'] + ' (from read-model)')

        inventory = rsp['result']
        if not inventory:
            logging.warning(
                "could not find inventory for product {}".format(_product_id))
            return False

        if int(inventory['amount']) - (_value if _value else 1) < 0:
            logging.info("product {} is out of stock".format(_product_id))
            return False

        inventory['amount'] = int(
            inventory['amount']) - (_value if _value else 1)

        # trigger event
        self.event_store.publish('inventory',
                                 create_event('entity_updated', inventory))

        return True
Esempio n. 8
0
    def update_order(self, _req):
        try:
            order_id = _req['entity_id']
        except KeyError:
            return {
                "error": "missing mandatory parameter 'entity_id'"
            }

        rsp = send_message('read-model', 'get_entity', {'name': 'order', 'id': order_id})
        if 'error' in rsp:
            rsp['error'] += ' (from read-model)'
            return rsp

        order = rsp['result']
        if not order:
            return {
                "error": "could not find order"
            }

        # set new props
        order['entity_id'] = order_id
        try:
            order['cart_id'] = _req['cart_id']
            order['status'] = _req['status']
        except KeyError:
            return {
                "result": "missing mandatory parameter 'cart_id' and/or 'status"
            }

        # trigger event
        self.event_store.publish('order', create_event('entity_updated', order))

        return {
            "result": True
        }
    def billing_created(self, _item):
        if _item.event_action != 'entity_created':
            return

        billing = json.loads(_item.event_data)
        shipping = ShippingService._create_entity(billing['order_id'])
        self.event_store.publish('shipping',
                                 create_event('entity_created', shipping))
Esempio n. 10
0
    def send(self, _req):
        if not _req['to'] or not _req['msg']:
            return {"error": "missing mandatory parameter 'to' and/or 'msg'"}

        # trigger event
        self.event_store.publish(
            'mail',
            create_event('mail_sent', {
                "recipient": _req['to'],
                "message": _req['msg']
            }))
Esempio n. 11
0
    def shipping_updated(self, _item):
        if _item.event_action != 'entity_updated':
            return

        shipping = json.loads(_item.event_data)
        if not shipping['delivered']:
            return

        rsp = send_message('read-model', 'get_entity', {'name': 'order', 'id': shipping['order_id']})
        order = rsp['result']
        order['status'] = 'DELIVERED'
        self.event_store.publish('order', create_event('entity_updated', order))
Esempio n. 12
0
    def billing_deleted(self, _item):
        if _item.event_action != 'entity_delted':
            return

        billing = json.loads(_item.event_data)
        rsp = send_message('read-model', 'get_entity', {'name': 'order', 'id': billing['order_id']})
        order = rsp['result']
        if not order['status'] == 'CLEARED':
            return

        order['status'] = 'UNCLEARED'
        self.event_store.publish('order', create_event('entity_updated', order))
Esempio n. 13
0
    def update_cart(self, _req):
        try:
            cart_id = _req['entity_id']
        except KeyError:
            return {"error": "missing mandatory parameter 'entity_id'"}

        rsp = send_message('read-model', 'get_entity', {
            'name': 'order',
            'props': {
                'cart_id': cart_id
            }
        })
        if 'error' in rsp:
            rsp['error'] += ' (from read-model)'
            return rsp

        order = rsp['result']
        if order and not order['status'] == 'CREATED':
            return {"error": "order {} in progress".format(order['entity_id'])}

        rsp = send_message('read-model', 'get_entity', {
            'name': 'cart',
            'id': cart_id
        })
        if 'error' in rsp:
            rsp['error'] += ' (from read-model)'
            return rsp

        cart = rsp['result']
        if not cart:
            return {"error": "could not find cart {}".format(cart_id)}

        # set new props
        cart['entity_id'] = cart_id
        try:
            cart['customer_id'] = _req['customer_id']
            cart['product_ids'] = _req['product_ids']
        except KeyError:
            return {
                "result":
                "missing mandatory parameter 'customer_id' and/or 'product_ids"
            }

        res, product_id = self._check_inventory(cart['product_ids'])
        if not res:
            return {'error': 'product {} is out of stock'.format(product_id)}

        # trigger event
        self.event_store.publish('cart', create_event('entity_updated', cart))

        return {"result": True}
    def order_created(self, _item):
        if _item.event_action != 'entity_created':
            return

        order = json.loads(_item.event_data)
        rsp = send_message('read-model', 'get_entity', {
            'name': 'cart',
            'id': order['cart_id']
        })
        cart = rsp['result']
        result = self._decr_from_cart(cart)
        order['status'] = 'IN_STOCK' if result else 'OUT_OF_STOCK'
        self.event_store.publish('order', create_event('entity_updated',
                                                       order))
    def update_customer(self, _req):
        try:
            customer = CustomerService._create_entity(_req['name'],
                                                      _req['email'])
        except KeyError:
            return {
                "error": "missing mandatory parameter 'name' and/or 'email'"
            }

        try:
            customer['entity_id'] = _req['entity_id']
        except KeyError:
            return {"error": "missing mandatory parameter 'entity_id'"}

        # trigger event
        self.event_store.publish('customer',
                                 create_event('entity_updated', customer))

        return {"result": True}
Esempio n. 16
0
    def create_orders(self, _req):
        orders = _req if isinstance(_req, list) else [_req]
        order_ids = []

        for order in orders:
            try:
                new_order = OrderService._create_entity(order['cart_id'])
            except KeyError:
                return {
                    "error": "missing mandatory parameter 'cart_id'"
                }

            # trigger event
            self.event_store.publish('order', create_event('entity_created', new_order))

            order_ids.append(new_order['entity_id'])

        return {
            "result": order_ids
        }
Esempio n. 17
0
    def update_billing(self, _req):
        try:
            billing_id = _req['entity_id']
        except KeyError:
            return {
                "error": "missing mandatory parameter 'entity_id'"
            }

        rsp = send_message('read-model', 'get_entitiy', {'name': 'billing', 'id': billing_id})
        if 'error' in rsp:
            rsp['error'] += ' (from read-model)'
            return rsp

        billing = rsp['result']
        if not billing:
            return {
                "error": "could not find billing"
            }

        # set new props
        billing['entity_id'] = billing_id
        try:
            billing['order_id'] = _req['order_id']
            billing['amount'] = _req['amount']
        except KeyError:
            return {
                "result": "missing mandatory parameter 'order_id' and/or 'amount"
            }

        res = self._check_amount(billing)
        if not res:
            return {
                'error': 'amount is not accurate'
            }

        # trigger event
        self.event_store.publish('billing', create_event('entity_updated', billing))

        return {
            "result": True
        }
    def create_customers(self, _req):
        customers = _req if isinstance(_req, list) else [_req]
        customer_ids = []

        for customer in customers:
            try:
                new_customer = CustomerService._create_entity(
                    customer['name'], customer['email'])
            except KeyError:
                return {
                    "error":
                    "missing mandatory parameter 'name' and/or 'email'"
                }

            # trigger event
            self.event_store.publish(
                'customer', create_event('entity_created', new_customer))

            customer_ids.append(new_customer['entity_id'])

        return {"result": customer_ids}
    def create_inventories(self, _req):
        inventory = _req if isinstance(_req, list) else [_req]
        inventory_ids = []

        for inventory in inventory:
            try:
                new_inventory = InventoryService._create_entity(
                    inventory['product_id'], inventory['amount'])
            except KeyError:
                return {
                    "error":
                    "missing mandatory parameter 'product_id' and/or 'amount'"
                }

            # trigger event
            self.event_store.publish(
                'inventory', create_event('entity_created', new_inventory))

            inventory_ids.append(new_inventory['entity_id'])

        return {"result": inventory_ids}
    def create_shippings(self, _req):
        shippings = _req if isinstance(_req, list) else [_req]
        shipping_ids = []

        for shipping in shippings:
            try:
                new_shipping = ShippingService._create_entity(
                    shipping['order_id'])
            except KeyError:
                return {
                    "error":
                    "missing mandatory parameter 'order_id' and/or 'delivered'"
                }

            # trigger event
            self.event_store.publish(
                'shipping', create_event('entity_created', new_shipping))

            shipping_ids.append(new_shipping['entity_id'])

        return {"result": shipping_ids}
Esempio n. 21
0
    def create_products(self, _req):
        products = _req if isinstance(_req, list) else [_req]
        product_ids = []

        for product in products:
            try:
                new_product = ProductService._create_entity(
                    product['name'], product['price'])
            except KeyError:
                return {
                    "error":
                    "missing mandatory parameter 'name' and/or 'price'"
                }

            # trigger event
            self.event_store.publish(
                'product', create_event('entity_created', new_product))

            product_ids.append(new_product['entity_id'])

        return {"result": product_ids}
Esempio n. 22
0
    def delete_cart(self, _req):
        try:
            cart_id = _req['entity_id']
        except KeyError:
            return {"error": "missing mandatory parameter 'entity_id'"}

        rsp = send_message('read-model', 'get_entity', {
            'name': 'cart',
            'id': cart_id
        })
        if 'error' in rsp:
            rsp['error'] += ' (from read-model)'
            return rsp

        cart = rsp['result']
        if not cart:
            return {"error": "could not find cart"}

        # trigger event
        self.event_store.publish('cart', create_event('entity_deleted', cart))

        return {"result": True}
    def _decr_from_cart(self, _cart):
        try:
            product_ids = _cart['product_ids']
        except KeyError:
            raise Exception("missing mandatory parameter 'product_ids'")

        rsp = send_message('read-model', 'get_entities', {
            'name': 'inventory',
            'props': {
                'product_id': product_ids
            }
        })
        if 'error' in rsp:
            raise Exception(rsp['error'] + ' (from read-model)')

        inventories = rsp['result']

        # count products
        product_counts = []
        for inventory in inventories:
            found = product_ids.count(inventory['product_id'])

            # check amount
            if found > int(inventory['amount']):
                logging.info("product {} is out of stock".format(
                    inventory['product_id']))
                return False

            product_counts.append((inventory, found))

        # decrement inventory
        for inventory, count in product_counts:
            inventory['amount'] = int(inventory['amount']) - count

            # trigger event
            self.event_store.publish('inventory',
                                     create_event('entity_updated', inventory))

        return True