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) } // MoveTicket relocates a ticket to another project; Undo moves it back. type MoveTicket struct { Store ticket.Store TimeStore ticket.TimeStore Before ticket.Ticket After ticket.Ticket // ProjectID is the destination; other fields from Before } func (c *MoveTicket) Name() string { return "move ticket" } func (c *MoveTicket) Execute(ctx context.Context) error { _ = ctx moved, err := c.Store.Move(c.Before.ID, c.After.ProjectID) if err != nil { return err } c.After = moved if c.TimeStore != nil { if err := c.TimeStore.RetargetTicket(moved.ID, moved.ProjectID); err != nil { return err } } return nil } func (c *MoveTicket) Undo(ctx context.Context) error { _ = ctx moved, err := c.Store.Move(c.After.ID, c.Before.ProjectID) if err != nil { return err } c.Before = moved if c.TimeStore != nil { if err := c.TimeStore.RetargetTicket(moved.ID, moved.ProjectID); err != nil { return err } } return nil }