/
index.p6
93 lines (75 loc) · 2.29 KB
/
index.p6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
use lib <lib ../../lib>;
use Red;
model Event { ... }
model Ticket {
has Str $.id is id;
has Str $.title is column;
has Str $.status is column is rw;
multi method apply-event(@events) {
my $ticket = self;
$ticket .= apply-event: $_ for @events;
$ticket
}
multi method apply-event(::?CLASS:U: Event $_ where .event-type eq "new-ticket") {
::?CLASS.new: :id(.ticket-id), :title(.title), :status(.status)
}
multi method apply-event(::?CLASS:D: Event $_ where .event-type eq "change-status") {
self.status = .status;
self
}
}
model Event is nullable {
has UInt $.id is serial;
has DateTime $.created is column{:!nullable} .= now;
has Str $.ticket-id is column;
has Str $.event-type is column{:!nullable};
has Str $.name is column;
has Str $.title is column;
has Str $.status is column = "opened";
method event-supplier {
$ //= Supplier.new
}
method ^create(|c) {
my \obj = callsame;
Event.event-supplier.emit: obj;
obj
}
method load-events(::?CLASS:U: Str $ticket-id) {
self.^all.grep({ .ticket-id eq $ticket-id })
}
method new-ticket(::?CLASS:U: $ticket-id, $title) {
self.^create:
:$ticket-id,
:event-type<new-ticket>,
:$title,
}
method open(::?CLASS:U: Str $ticket-id) {
self.^create:
:$ticket-id,
:event-type<change-status>,
:status<opened>,
}
method close(::?CLASS:U: Str $ticket-id) {
self.^create:
:$ticket-id,
:event-type<change-status>,
:status<closed>,
}
}
my $*RED-DEBUG = True;
my $*RED-DB = database "SQLite";
start react whenever Event.event-supplier.Supply -> $event {
CATCH { default { .say } }
with Ticket.^load: $event.ticket-id {
my @events = Event.load-events(.id).Seq;
my Ticket $ticket .= apply-event: @events;
$ticket.^save
} else {
Ticket.apply-event($event).^save: :insert;
}
}
Event.^create-table;
Ticket.^create-table;
Event.new-ticket: "aaaaa", "test";
Event.open: "aaaaa";
.say for Ticket.^all