From a037d547757bbd5a195f8fa4555ff5a4a5231a72 Mon Sep 17 00:00:00 2001 From: Fidel Wole Date: Fri, 31 Jan 2025 04:46:41 +0100 Subject: [PATCH] feat(soft-delete): implement soft delete for PaymentOrder and LockPaymentOrder - Created SoftDeleteMixin in schema/mixins.go following Ent documentation for soft delete. - Added SoftDeleteMixin to LockPaymentOrder and PaymentOrder schemas. - Updated PaymentOrder edge in SenderProfile to use entsql.Cascade for proper deletion handling. - Added SkipSoftDelete context utility function to conditionally bypass soft delete logic. --- ent/schema/lockpaymentorder.go | 1 + ent/schema/mixins.go | 14 ++++++++++++++ ent/schema/paymentorder.go | 1 + ent/schema/senderprofile.go | 2 +- utils/utils.go | 18 ++++++++++++++++++ 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/ent/schema/lockpaymentorder.go b/ent/schema/lockpaymentorder.go index 4f9bfea9..c448cd17 100644 --- a/ent/schema/lockpaymentorder.go +++ b/ent/schema/lockpaymentorder.go @@ -19,6 +19,7 @@ type LockPaymentOrder struct { func (LockPaymentOrder) Mixin() []ent.Mixin { return []ent.Mixin{ TimeMixin{}, + SoftDeleteMixin{}, } } diff --git a/ent/schema/mixins.go b/ent/schema/mixins.go index c058bf7a..d7d0aa2b 100644 --- a/ent/schema/mixins.go +++ b/ent/schema/mixins.go @@ -30,3 +30,17 @@ func (TimeMixin) Fields() []ent.Field { UpdateDefault(time.Now), } } + +// SoftDeleteMixin implements the ent.Mixin for soft delete functionality. +type SoftDeleteMixin struct { + mixin.Schema +} + +// Fields of the SoftDeleteMixin. +func (SoftDeleteMixin) Fields() []ent.Field { + return []ent.Field{ + field.Time("deleted_at"). + Optional(). + Nillable(), + } +} diff --git a/ent/schema/paymentorder.go b/ent/schema/paymentorder.go index 769455d0..b9d96f04 100644 --- a/ent/schema/paymentorder.go +++ b/ent/schema/paymentorder.go @@ -18,6 +18,7 @@ type PaymentOrder struct { func (PaymentOrder) Mixin() []ent.Mixin { return []ent.Mixin{ TimeMixin{}, + SoftDeleteMixin{}, } } diff --git a/ent/schema/senderprofile.go b/ent/schema/senderprofile.go index bf6ca68b..01988106 100644 --- a/ent/schema/senderprofile.go +++ b/ent/schema/senderprofile.go @@ -45,7 +45,7 @@ func (SenderProfile) Edges() []ent.Edge { Unique(). Annotations(entsql.OnDelete(entsql.Cascade)), edge.To("payment_orders", PaymentOrder.Type). - Annotations(entsql.OnDelete(entsql.SetNull)), + Annotations(entsql.OnDelete(entsql.Cascade)), edge.To("order_tokens", SenderOrderToken.Type). Annotations(entsql.OnDelete(entsql.Cascade)), edge.To("linked_address", LinkedAddress.Type). diff --git a/utils/utils.go b/utils/utils.go index 54aef04b..99b1b45f 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -532,3 +532,21 @@ func GetTokenRateFromQueue(tokenSymbol string, orderAmount decimal.Decimal, fiat return rateResponse, nil } + +type contextKey string + +const skipSoftDeleteKey contextKey = "skipSoftDelete" + +// SkipSoftDelete adds a context value to skip soft delete logic. +func SkipSoftDelete(ctx context.Context) context.Context { + return context.WithValue(ctx, skipSoftDeleteKey, true) +} + +// IsSkipSoftDelete returns true if the context indicates that soft delete should be skipped. +func IsSkipSoftDelete(ctx context.Context) bool { + val := ctx.Value(skipSoftDeleteKey) + if val != nil { + return val.(bool) + } + return false +} \ No newline at end of file