package command import ( "context" "fmt" "task/internal/ticket" ) // CreateTicket creates a ticket; Undo deletes it. type CreateTicket struct { Store ticket.Store Ticket ticket.Ticket created ticket.Ticket } func (c *CreateTicket) Name() string { return "create ticket" } func (c *CreateTicket) Execute(ctx context.Context) error { _ = ctx created, err := c.Store.Create(c.Ticket) if err != nil { return err } c.created = created c.Ticket = created return nil } func (c *CreateTicket) Undo(ctx context.Context) error { _ = ctx id := c.created.ID if id == "" { id = c.Ticket.ID } if id == "" { return fmt.Errorf("create undo: missing ticket id") } return c.Store.Delete(id) } // DeleteTicket deletes a ticket; Undo restores the snapshot. type DeleteTicket struct { Store ticket.Store Snapshot ticket.Ticket } func (c *DeleteTicket) Name() string { return "delete ticket" } func (c *DeleteTicket) Execute(ctx context.Context) error { _ = ctx if c.Snapshot.ID == "" { return fmt.Errorf("delete: missing ticket id") } return c.Store.Delete(c.Snapshot.ID) } func (c *DeleteTicket) Undo(ctx context.Context) error { _ = ctx _, err := c.Store.Create(c.Snapshot) return err } // UpdateTicket applies a new ticket state; Undo restores Before. type UpdateTicket struct { Store ticket.Store Before ticket.Ticket After ticket.Ticket } func (c *UpdateTicket) Name() string { return "update ticket" } func (c *UpdateTicket) Execute(ctx context.Context) error { _ = ctx return c.Store.Update(c.After) } func (c *UpdateTicket) Undo(ctx context.Context) error { _ = ctx return c.Store.Update(c.Before) }