From 7d699815f1e39a0fe5f358ff57737adcdf6de624 Mon Sep 17 00:00:00 2001 From: gumberss Date: Sun, 16 Jul 2023 16:26:06 -0300 Subject: [PATCH] feat: publishing an event when the purchase list is disabled and listining this event on the shopping cart module. resolves 196, resolves 197 --- .../out/purchase_list_events.clj | 13 +++++++ .../endpoints/http/purchase_list.clj | 4 +- .../flows/purchase_list.clj | 14 +++++-- .../adapters/in/purchase_list.clj | 9 +++-- .../adapters/in/purchase_list_events.clj | 26 ++++++++----- .../consumers/purchase_list_events.clj | 37 +++++++++++++------ .../modules/shopping_cart/flows/cart.clj | 6 +++ .../schemas/internal/purchase_list.clj | 9 ++++- .../schemas/wire/in/cart_events.clj | 25 +++++++++++++ .../schemas/wire/in/purchase_list.clj | 2 +- .../schemas/wire/in/purchase_list_events.clj | 27 ++------------ .../publishers/purchase_list.clj | 17 +++++++++ .../out/purchase_list_events.clj | 8 ++++ 13 files changed, 143 insertions(+), 54 deletions(-) create mode 100644 src/purchase_listinator/adapters/purchase_list/out/purchase_list_events.clj create mode 100644 src/purchase_listinator/modules/shopping_cart/schemas/wire/in/cart_events.clj create mode 100644 src/purchase_listinator/publishers/purchase_list.clj create mode 100644 src/purchase_listinator/wires/purchase_list/out/purchase_list_events.clj diff --git a/src/purchase_listinator/adapters/purchase_list/out/purchase_list_events.clj b/src/purchase_listinator/adapters/purchase_list/out/purchase_list_events.clj new file mode 100644 index 0000000..707ceaa --- /dev/null +++ b/src/purchase_listinator/adapters/purchase_list/out/purchase_list_events.clj @@ -0,0 +1,13 @@ +(ns purchase-listinator.adapters.purchase-list.out.purchase-list-events + (:require [schema.core :as s] + [purchase-listinator.wires.purchase-list.out.purchase-list-events :as out.purchase-list-events])) + +(s/defn ->PurchaseListDisabledEvent :- out.purchase-list-events/ListDisabledEvent + [list-id :- s/Uuid + user-id :- s/Uuid + moment :- s/Num + event-id :- s/Uuid] + {:purchase-list-id list-id + :user-id user-id + :moment moment + :event-id event-id}) \ No newline at end of file diff --git a/src/purchase_listinator/endpoints/http/purchase_list.clj b/src/purchase_listinator/endpoints/http/purchase_list.clj index 56390f4..d07dae2 100644 --- a/src/purchase_listinator/endpoints/http/purchase_list.clj +++ b/src/purchase_listinator/endpoints/http/purchase_list.clj @@ -39,11 +39,11 @@ (s/defn disable-purchase-lists :- {:status s/Int :body {}} - [{{:keys [datomic]} :component + [{components :component {id :id} :path-params user-id :user-id}] (branch (misc.either/try-right (-> (adapters.misc/string->uuid id) - (flows.purchase-list/disable (adapters.misc/string->uuid user-id) datomic))) + (flows.purchase-list/disable (adapters.misc/string->uuid user-id) components))) misc.http/->Error misc.http/->Success)) diff --git a/src/purchase_listinator/flows/purchase_list.clj b/src/purchase_listinator/flows/purchase_list.clj index 1992cfb..079e5ef 100644 --- a/src/purchase_listinator/flows/purchase_list.clj +++ b/src/purchase_listinator/flows/purchase_list.clj @@ -8,8 +8,9 @@ [purchase-listinator.models.internal.purchase-list.purchase-list :as internal.purchase-list] [purchase-listinator.logic.purchase-list :as logic.purchase-list] [purchase-listinator.logic.purchase-category :as logic.purchase-category] - [cats.monad.either :refer [left left? right]] + [cats.monad.either :refer [left right]] [purchase-listinator.misc.either :as either] + [purchase-listinator.publishers.purchase-list :as publishers.purchase-list] [purchase-listinator.models.internal.purchase-list.purchase-list-management-data :as internal.purchase-list-management-data])) (s/defn get-lists @@ -31,13 +32,20 @@ (datomic.purchase-list/upsert datomic)))))) +(s/defn owner-disabling-the-list + [list-id :- s/Uuid + user-id :- s/Uuid + {:keys [datomic rabbitmq]}] + (datomic.purchase-list/disable list-id datomic) + (publishers.purchase-list/purchase-list-disabled list-id user-id rabbitmq)) + (s/defn disable [list-id :- s/Uuid user-id :- s/Uuid - datomic] + {:keys [datomic] :as components}] (let [allowed-lists-ids (datomic.purchase-list/get-allowed-lists-by-user-id user-id datomic)] (cond - (datomic.purchase-list/existent? list-id user-id datomic) (datomic.purchase-list/disable list-id datomic) + (datomic.purchase-list/existent? list-id user-id datomic) (owner-disabling-the-list list-id user-id components) (some #{list-id} allowed-lists-ids) (-> (dbs.datomic.share/find-share-id user-id list-id datomic) (dbs.datomic.share/remove datomic) (and {:id list-id})) diff --git a/src/purchase_listinator/modules/shopping_cart/adapters/in/purchase_list.clj b/src/purchase_listinator/modules/shopping_cart/adapters/in/purchase_list.clj index f3316d4..de7de3f 100644 --- a/src/purchase_listinator/modules/shopping_cart/adapters/in/purchase_list.clj +++ b/src/purchase_listinator/modules/shopping_cart/adapters/in/purchase_list.clj @@ -1,7 +1,8 @@ (ns purchase-listinator.modules.shopping-cart.adapters.in.purchase-list - (:require [schema.core :as s] - [purchase-listinator.modules.shopping-cart.schemas.wire.in.purchase-list :as shopping-cart.schemas.wire.in.purchase-list] - [purchase-listinator.modules.shopping-cart.schemas.internal.purchase-list :as shopping-cart.schemas.internal.purchase-list])) + (:require + [schema.core :as s] + [purchase-listinator.modules.shopping-cart.schemas.wire.in.purchase-list :as shopping-cart.schemas.wire.in.purchase-list] + [purchase-listinator.modules.shopping-cart.schemas.internal.purchase-list :as shopping-cart.schemas.internal.purchase-list])) (s/defn wire-items->internal :- shopping-cart.schemas.internal.purchase-list/Item [item :- shopping-cart.schemas.wire.in.purchase-list/Item] @@ -15,4 +16,4 @@ (s/defn purchase-list-wire->internal :- shopping-cart.schemas.internal.purchase-list/PurchaseList [{:keys [categories] :as purchase-list} :- shopping-cart.schemas.wire.in.purchase-list/PurchaseList] (-> (assoc purchase-list :categories (map category-wire->internal categories)) - (select-keys (keys shopping-cart.schemas.internal.purchase-list/purchase-list-skeleton)))) \ No newline at end of file + (select-keys (keys shopping-cart.schemas.internal.purchase-list/purchase-list-skeleton)))) diff --git a/src/purchase_listinator/modules/shopping_cart/adapters/in/purchase_list_events.clj b/src/purchase_listinator/modules/shopping_cart/adapters/in/purchase_list_events.clj index e40ea01..02127a1 100644 --- a/src/purchase_listinator/modules/shopping_cart/adapters/in/purchase_list_events.clj +++ b/src/purchase_listinator/modules/shopping_cart/adapters/in/purchase_list_events.clj @@ -1,34 +1,42 @@ (ns purchase-listinator.modules.shopping-cart.adapters.in.purchase-list-events - (:require [schema.core :as s] - [purchase-listinator.modules.shopping-cart.schemas.wire.in.purchase-list-events :as wire.in.purchase-list-events] - [purchase-listinator.modules.shopping-cart.schemas.internal.cart-events :as internal.purchase-list-events])) + (:require + [purchase-listinator.modules.shopping-cart.schemas.internal.purchase-list :as internal.purchase-list] + [schema.core :as s] + [purchase-listinator.modules.shopping-cart.schemas.wire.in.cart-events :as wire.in.cart-events] + [purchase-listinator.modules.shopping-cart.schemas.wire.in.purchase-list-events :as wire.in.purchase-list-events] + + [purchase-listinator.modules.shopping-cart.schemas.internal.cart-events :as internal.purchase-list-events])) (s/defn category-created-event->internal :- internal.purchase-list-events/PurchaseListCategoryCreated - [{:keys [event-id] :as wire} :- wire.in.purchase-list-events/PurchaseCategoryCreatedEvent] + [{:keys [event-id] :as wire} :- wire.in.cart-events/PurchaseCategoryCreatedEvent] (-> (assoc wire :event-type :purchase-list-category-created :id event-id) (dissoc :event-id))) (s/defn category-deleted-event->internal :- internal.purchase-list-events/PurchaseListCategoryDeleted - [{:keys [event-id] :as wire} :- wire.in.purchase-list-events/PurchaseCategoryDeletedEvent] + [{:keys [event-id] :as wire} :- wire.in.cart-events/PurchaseCategoryDeletedEvent] (-> (assoc wire :event-type :purchase-list-category-deleted :id event-id) (dissoc :event-id))) (s/defn item-created-event->internal :- internal.purchase-list-events/PurchaseListItemCreated - [{:keys [event-id] :as wire} :- wire.in.purchase-list-events/PurchaseItemCreatedEvent] + [{:keys [event-id] :as wire} :- wire.in.cart-events/PurchaseItemCreatedEvent] (-> (assoc wire :event-type :purchase-list-item-created :id event-id) (dissoc :event-id))) (s/defn item-deleted-event->internal :- internal.purchase-list-events/PurchaseListItemDeleted - [{:keys [event-id] :as wire} :- wire.in.purchase-list-events/PurchaseItemDeletedEvent] + [{:keys [event-id] :as wire} :- wire.in.cart-events/PurchaseItemDeletedEvent] (-> (assoc wire :event-type :purchase-list-item-deleted :id event-id) (dissoc :event-id))) (s/defn item-changed-event->internal :- internal.purchase-list-events/PurchaseListItemChanged - [{:keys [event-id] :as wire} :- wire.in.purchase-list-events/PurchaseItemChangedEvent] + [{:keys [event-id] :as wire} :- wire.in.cart-events/PurchaseItemChangedEvent] (-> (assoc wire :event-type :purchase-list-item-changed :id event-id) - (dissoc :event-id))) \ No newline at end of file + (dissoc :event-id))) + +(s/defn purchase-list-disabled-wire->internal :- internal.purchase-list/PurchaseListDisabled + [wire :- wire.in.purchase-list-events/ListDisabledEvent] + (select-keys wire (keys internal.purchase-list/purchase-list-disabled-skeleton))) \ No newline at end of file diff --git a/src/purchase_listinator/modules/shopping_cart/diplomat/consumers/purchase_list_events.clj b/src/purchase_listinator/modules/shopping_cart/diplomat/consumers/purchase_list_events.clj index ced08b6..c80e87c 100644 --- a/src/purchase_listinator/modules/shopping_cart/diplomat/consumers/purchase_list_events.clj +++ b/src/purchase_listinator/modules/shopping_cart/diplomat/consumers/purchase_list_events.clj @@ -3,6 +3,7 @@ [purchase-listinator.modules.shopping-cart.schemas.wire.in.shopping :as wire.in.shopping] [purchase-listinator.modules.shopping-cart.flows.cart :as flows.cart] [schema.core :as s] + [purchase-listinator.modules.shopping-cart.schemas.wire.in.cart-events :as wire.in.cart-events] [purchase-listinator.modules.shopping-cart.schemas.wire.in.purchase-list-events :as wire.in.purchase-list-events] [purchase-listinator.modules.shopping-cart.adapters.in.purchase-list-events :as adapters.in.purchase-list-events] [purchase-listinator.modules.shopping-cart.flows.cart-events-reception :as flows.cart-events-reception])) @@ -11,7 +12,7 @@ [_channel _metadata components - event :- wire.in.purchase-list-events/PurchaseCategoryCreatedEvent] + event :- wire.in.cart-events/PurchaseCategoryCreatedEvent] (-> (adapters.in.purchase-list-events/category-created-event->internal event) (flows.cart-events-reception/receive-cart-event-by-list components))) @@ -19,7 +20,7 @@ [_channel _metadata components - event :- wire.in.purchase-list-events/PurchaseCategoryDeletedEvent] + event :- wire.in.cart-events/PurchaseCategoryDeletedEvent] (-> (adapters.in.purchase-list-events/category-deleted-event->internal event) (flows.cart-events-reception/receive-cart-event-by-list components))) @@ -27,7 +28,7 @@ [_channel _metadata components - event :- wire.in.purchase-list-events/PurchaseItemCreatedEvent] + event :- wire.in.cart-events/PurchaseItemCreatedEvent] (-> (adapters.in.purchase-list-events/item-created-event->internal event) (flows.cart-events-reception/receive-cart-event-by-list components))) @@ -35,7 +36,7 @@ [_channel _metadata components - event :- wire.in.purchase-list-events/PurchaseItemDeletedEvent] + event :- wire.in.cart-events/PurchaseItemDeletedEvent] (-> (adapters.in.purchase-list-events/item-deleted-event->internal event) (flows.cart-events-reception/receive-cart-event-by-list components))) @@ -43,7 +44,7 @@ [_channel _metadata components - event :- wire.in.purchase-list-events/PurchaseItemChangedEvent] + event :- wire.in.cart-events/PurchaseItemChangedEvent] (-> (adapters.in.purchase-list-events/item-changed-event->internal event) (flows.cart-events-reception/receive-cart-event-by-list components))) @@ -54,28 +55,42 @@ event :- wire.in.shopping/CloseShoppingEvent] (flows.cart/close-cart event components)) +(s/defn purchase-list-disabled-event-received + [_channel + _metadata + components + event :- wire.in.purchase-list-events/ListDisabledEvent] + (-> (adapters.in.purchase-list-events/purchase-list-disabled-wire->internal event) + (flows.cart/remove-list-cart components))) + (def subscribers [{:exchange :purchase-listinator/purchase-list.category.created :queue :shopping-cart/shopping-list.category.create - :schema wire.in.purchase-list-events/PurchaseCategoryCreatedEvent + :schema wire.in.cart-events/PurchaseCategoryCreatedEvent :handler purchase-list-category-created-event-received} {:exchange :purchase-listinator/purchase-list.category.deleted :queue :shopping-cart/shopping-list.category.delete - :schema wire.in.purchase-list-events/PurchaseCategoryDeletedEvent + :schema wire.in.cart-events/PurchaseCategoryDeletedEvent :handler purchase-list-category-deleted-event-received} {:exchange :purchase-listinator/purchase-list.item.created :queue :shopping-cart/shopping-list.item.create - :schema wire.in.purchase-list-events/PurchaseItemCreatedEvent + :schema wire.in.cart-events/PurchaseItemCreatedEvent :handler purchase-list-item-created-event-received} {:exchange :purchase-listinator/purchase-list.item.deleted :queue :shopping-cart/shopping-list.item.deleted - :schema wire.in.purchase-list-events/PurchaseItemDeletedEvent + :schema wire.in.cart-events/PurchaseItemDeletedEvent :handler purchase-list-item-deleted-event-received} {:exchange :purchase-listinator/purchase-list.item.changed :queue :shopping-cart/shopping-list.item.changed - :schema wire.in.purchase-list-events/PurchaseItemChangedEvent + :schema wire.in.cart-events/PurchaseItemChangedEvent :handler purchase-list-item-changed-event-received} {:exchange :purchase-listinator/shopping.finished :queue :shopping-cart/shopping.finished :schema wire.in.shopping/CloseShoppingEvent - :handler close-shopping-event-received}]) + :handler close-shopping-event-received} + {:exchange :purchase-listinator/purchase-list.disabled + :queue :shopping-cart/purchase-list.disabled + :schema wire.in.purchase-list-events/ListDisabledEvent + :handler purchase-list-disabled-event-received}]) + + diff --git a/src/purchase_listinator/modules/shopping_cart/flows/cart.clj b/src/purchase_listinator/modules/shopping_cart/flows/cart.clj index a0015eb..b0907d8 100644 --- a/src/purchase_listinator/modules/shopping_cart/flows/cart.clj +++ b/src/purchase_listinator/modules/shopping_cart/flows/cart.clj @@ -2,6 +2,7 @@ (:require [purchase-listinator.logic.errors :as logic.errors] [purchase-listinator.misc.general :as misc.general] + [purchase-listinator.modules.shopping-cart.schemas.internal.purchase-list :as internal.purchase-list] [purchase-listinator.modules.shopping-cart.schemas.internal.shopping :as schemas.internal.shopping] [purchase-listinator.modules.shopping-cart.schemas.wire.in.purchase-list :as modules.shopping-cart.schemas.wire.in.purchase-list] [schema.core :as s] @@ -51,3 +52,8 @@ (diplomat.db.redis/delete-global-cart list-id redis) (diplomat.db.redis/delete-shopping-sessions list-id redis)) (producers.shopping-cart-event/shopping-cart-closed shopping all-events rabbitmq-channel)))) + +(s/defn remove-list-cart + [list-disabled :- internal.purchase-list/PurchaseListDisabled + components] + (clojure.pprint/pprint list-disabled)) diff --git a/src/purchase_listinator/modules/shopping_cart/schemas/internal/purchase_list.clj b/src/purchase_listinator/modules/shopping_cart/schemas/internal/purchase_list.clj index 0c84ac3..0bc9b68 100644 --- a/src/purchase_listinator/modules/shopping_cart/schemas/internal/purchase_list.clj +++ b/src/purchase_listinator/modules/shopping_cart/schemas/internal/purchase_list.clj @@ -21,4 +21,11 @@ (def purchase-list-skeleton {:id s/Uuid :categories [Category]}) -(s/defschema PurchaseList purchase-list-skeleton) \ No newline at end of file +(s/defschema PurchaseList purchase-list-skeleton) + +(def purchase-list-disabled-skeleton + {:event-id s/Uuid + :purchase-list-id s/Uuid + :moment s/Num + :user-id s/Uuid}) +(s/defschema PurchaseListDisabled purchase-list-disabled-skeleton) \ No newline at end of file diff --git a/src/purchase_listinator/modules/shopping_cart/schemas/wire/in/cart_events.clj b/src/purchase_listinator/modules/shopping_cart/schemas/wire/in/cart_events.clj new file mode 100644 index 0000000..e6d2c15 --- /dev/null +++ b/src/purchase_listinator/modules/shopping_cart/schemas/wire/in/cart_events.clj @@ -0,0 +1,25 @@ +(ns purchase-listinator.modules.shopping-cart.schemas.wire.in.cart-events + (:require + [purchase-listinator.misc.schema :as misc.schema] + [schema.core :as s] + [purchase-listinator.modules.shopping-cart.schemas.internal.cart-events :as internal.cart-events])) + +(misc.schema/loose-schema PurchaseCategoryCreatedEvent + (-> (assoc internal.cart-events/purchase-list-categoty-created-skeleton :event-id s/Uuid) + (dissoc :id :event-type))) + +(misc.schema/loose-schema PurchaseCategoryDeletedEvent + (-> (assoc internal.cart-events/purchase-list-category-deleted-skeleton :event-id s/Uuid) + (dissoc :id :event-type))) + +(misc.schema/loose-schema PurchaseItemCreatedEvent + (-> (assoc internal.cart-events/purchase-list-item-created-skeleton :event-id s/Uuid) + (dissoc :id :event-type))) + +(misc.schema/loose-schema PurchaseItemDeletedEvent + (-> (assoc internal.cart-events/purchase-item-deleted-skeleton :event-id s/Uuid) + (dissoc :id :event-type))) + +(misc.schema/loose-schema PurchaseItemChangedEvent + (-> (assoc internal.cart-events/purchase-item-changed-skeleton :event-id s/Uuid) + (dissoc :id :event-type))) \ No newline at end of file diff --git a/src/purchase_listinator/modules/shopping_cart/schemas/wire/in/purchase_list.clj b/src/purchase_listinator/modules/shopping_cart/schemas/wire/in/purchase_list.clj index d45de66..1d9bd25 100644 --- a/src/purchase_listinator/modules/shopping_cart/schemas/wire/in/purchase_list.clj +++ b/src/purchase_listinator/modules/shopping_cart/schemas/wire/in/purchase_list.clj @@ -12,4 +12,4 @@ (misc.schema/loose-schema PurchaseList (assoc modules.shopping-cart.schemas.internal.purchase-list/purchase-list-skeleton - :categories [Category])) \ No newline at end of file + :categories [Category])) diff --git a/src/purchase_listinator/modules/shopping_cart/schemas/wire/in/purchase_list_events.clj b/src/purchase_listinator/modules/shopping_cart/schemas/wire/in/purchase_list_events.clj index e9b7b1b..eb86a66 100644 --- a/src/purchase_listinator/modules/shopping_cart/schemas/wire/in/purchase_list_events.clj +++ b/src/purchase_listinator/modules/shopping_cart/schemas/wire/in/purchase_list_events.clj @@ -1,25 +1,6 @@ (ns purchase-listinator.modules.shopping-cart.schemas.wire.in.purchase-list-events - (:require - [purchase-listinator.misc.schema :as misc.schema] - [schema.core :as s] - [purchase-listinator.modules.shopping-cart.schemas.internal.cart-events :as internal.purchase-list-category-events])) + (:require [purchase-listinator.misc.schema :as misc.schema] + [purchase-listinator.modules.shopping-cart.schemas.internal.purchase-list :as modules.shopping-cart.schemas.internal.purchase-list])) -(misc.schema/loose-schema PurchaseCategoryCreatedEvent - (-> (assoc internal.purchase-list-category-events/purchase-list-categoty-created-skeleton :event-id s/Uuid) - (dissoc :id :event-type))) - -(misc.schema/loose-schema PurchaseCategoryDeletedEvent - (-> (assoc internal.purchase-list-category-events/purchase-list-category-deleted-skeleton :event-id s/Uuid) - (dissoc :id :event-type))) - -(misc.schema/loose-schema PurchaseItemCreatedEvent - (-> (assoc internal.purchase-list-category-events/purchase-list-item-created-skeleton :event-id s/Uuid) - (dissoc :id :event-type))) - -(misc.schema/loose-schema PurchaseItemDeletedEvent - (-> (assoc internal.purchase-list-category-events/purchase-item-deleted-skeleton :event-id s/Uuid) - (dissoc :id :event-type))) - -(misc.schema/loose-schema PurchaseItemChangedEvent - (-> (assoc internal.purchase-list-category-events/purchase-item-changed-skeleton :event-id s/Uuid) - (dissoc :id :event-type))) \ No newline at end of file +(misc.schema/loose-schema ListDisabledEvent + modules.shopping-cart.schemas.internal.purchase-list/purchase-list-disabled-skeleton) \ No newline at end of file diff --git a/src/purchase_listinator/publishers/purchase_list.clj b/src/purchase_listinator/publishers/purchase_list.clj new file mode 100644 index 0000000..9ba696b --- /dev/null +++ b/src/purchase_listinator/publishers/purchase_list.clj @@ -0,0 +1,17 @@ +(ns purchase-listinator.publishers.purchase-list + (:require + [purchase-listinator.misc.date :as misc.date] + [purchase-listinator.misc.general :as misc.general] + [schema.core :as s] + [purchase-listinator.adapters.purchase-list.out.purchase-list-events :as adapters.purchase-list.out.purchase-list-events])) + +(s/defn purchase-list-disabled + [list-id :- s/Uuid + user-id :- s/Uuid + {:keys [publish]}] + (publish :purchase-listinator/purchase-list.disabled + (adapters.purchase-list.out.purchase-list-events/->PurchaseListDisabledEvent list-id + user-id + (misc.date/numb-now) + (misc.general/squuid))) + list-id) \ No newline at end of file diff --git a/src/purchase_listinator/wires/purchase_list/out/purchase_list_events.clj b/src/purchase_listinator/wires/purchase_list/out/purchase_list_events.clj new file mode 100644 index 0000000..7ea7c17 --- /dev/null +++ b/src/purchase_listinator/wires/purchase_list/out/purchase_list_events.clj @@ -0,0 +1,8 @@ +(ns purchase-listinator.wires.purchase-list.out.purchase-list-events + (:require [schema.core :as s])) + +(s/defschema ListDisabledEvent + {:event-id s/Uuid + :purchase-list-id s/Uuid + :moment s/Num + :user-id s/Uuid}) \ No newline at end of file