Skip to content

Commit

Permalink
Add case events when manually snoozing and unsnoozing cases.
Browse files Browse the repository at this point in the history
  • Loading branch information
apognu committed Mar 6, 2025
1 parent fea1feb commit 44b8dd7
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 9 deletions.
14 changes: 13 additions & 1 deletion api/handle_cases.go
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,9 @@ type CaseSnoozeParams struct {
func handleSnoozeCase(uc usecases.Usecases) func(c *gin.Context) {
return func(c *gin.Context) {
ctx := c.Request.Context()
creds, _ := utils.CredentialsFromCtx(ctx)

userId := creds.ActorIdentity.UserId
caseId := c.Param("case_id")

var params CaseSnoozeParams
Expand All @@ -182,6 +185,7 @@ func handleSnoozeCase(uc usecases.Usecases) func(c *gin.Context) {
caseUsecase := uc.NewCaseUseCase()

req := models.CaseSnoozeRequest{
UserId: userId,
CaseId: caseId,
Until: params.Until,
}
Expand All @@ -198,12 +202,20 @@ func handleSnoozeCase(uc usecases.Usecases) func(c *gin.Context) {
func handleUnsnoozeCase(uc usecases.Usecases) func(c *gin.Context) {
return func(c *gin.Context) {
ctx := c.Request.Context()
creds, _ := utils.CredentialsFromCtx(ctx)

userId := creds.ActorIdentity.UserId
caseId := c.Param("case_id")

uc := usecasesWithCreds(ctx, uc)
caseUsecase := uc.NewCaseUseCase()

if err := caseUsecase.Unsnooze(ctx, caseId); err != nil {
req := models.CaseSnoozeRequest{
UserId: userId,
CaseId: caseId,
}

if err := caseUsecase.Unsnooze(ctx, req); err != nil {
presentError(ctx, c, err)
return
}
Expand Down
5 changes: 5 additions & 0 deletions models/case.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ func (c Case) GetMetadata() CaseMetadata {
}
}

func (c Case) IsSnoozed() bool {
return c.SnoozedUntil != nil && c.SnoozedUntil.After(time.Now())
}

func (c CaseStatus) IsFinalized() bool {
return c == CaseDiscarded || c == CaseResolved
}
Expand Down Expand Up @@ -113,6 +117,7 @@ type ReviewCaseDecisionsBody struct {
}

type CaseSnoozeRequest struct {
UserId UserId
CaseId string
Until time.Time
}
2 changes: 2 additions & 0 deletions models/case_event.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ const (
SanctionCheckReviewed CaseEventType = "sanction_check_reviewed"
DecisionAdded CaseEventType = "decision_added"
DecisionReviewed CaseEventType = "decision_reviewed"
CaseSnoozed CaseEventType = "case_snoozed"
CaseUnsnoozed CaseEventType = "case_unsnoozed"
)

type CaseEventResourceType string
Expand Down
57 changes: 49 additions & 8 deletions usecases/case_usecase.go
Original file line number Diff line number Diff line change
Expand Up @@ -377,24 +377,65 @@ func (uc *CaseUseCase) Snooze(ctx context.Context, req models.CaseSnoozeRequest)
return err
}

return uc.repository.SnoozeCase(ctx, uc.executorFactory.NewExecutor(), req)
return uc.transactionFactory.Transaction(ctx, func(tx repositories.Transaction) error {
if err := uc.repository.SnoozeCase(ctx, tx, req); err != nil {
return err
}

var previousSnooze *string

if c.IsSnoozed() {
previousSnooze = utils.Ptr(c.SnoozedUntil.Format(time.RFC3339))
}

event := models.CreateCaseEventAttributes{
UserId: string(req.UserId),
CaseId: req.CaseId,
EventType: models.CaseSnoozed,
NewValue: utils.Ptr(req.Until.Format(time.RFC3339)),
PreviousValue: previousSnooze,
}

if err = uc.repository.CreateCaseEvent(ctx, tx, event); err != nil {
return err
}

return nil
})
}

func (uc *CaseUseCase) Unsnooze(ctx context.Context, caseId string) error {
c, err := uc.repository.GetCaseById(ctx, uc.executorFactory.NewExecutor(), caseId)
func (uc *CaseUseCase) Unsnooze(ctx context.Context, req models.CaseSnoozeRequest) error {
c, err := uc.repository.GetCaseById(ctx, uc.executorFactory.NewExecutor(), req.CaseId)
if err != nil {
return err
}

if c.SnoozedUntil == nil || c.SnoozedUntil.Before(time.Now()) {
if !c.IsSnoozed() {
return errors.Wrap(models.ConflictError, "case is not currently snoozed")
}

if err := uc.enforceSecurity.ReadOrUpdateCase(c, []string{c.InboxId}); err != nil {
return err
}
return uc.transactionFactory.Transaction(ctx, func(tx repositories.Transaction) error {
if err := uc.enforceSecurity.ReadOrUpdateCase(c, []string{c.InboxId}); err != nil {
return err
}

if err = uc.repository.UnsnoozeCase(ctx, uc.executorFactory.NewExecutor(), req.CaseId); err != nil {
return err
}

return uc.repository.UnsnoozeCase(ctx, uc.executorFactory.NewExecutor(), caseId)
event := models.CreateCaseEventAttributes{
UserId: string(req.UserId),
CaseId: req.CaseId,
EventType: models.CaseUnsnoozed,
PreviousValue: utils.Ptr(c.SnoozedUntil.Format(time.RFC3339)),
}

if err = uc.repository.CreateCaseEvent(ctx, tx, event); err != nil {
return err
}

return err
})
}

func isIdenticalCaseUpdate(updateCaseAttributes models.UpdateCaseAttributes, c models.Case) bool {
Expand Down

0 comments on commit 44b8dd7

Please sign in to comment.