-
Notifications
You must be signed in to change notification settings - Fork 35
Expand file tree
/
Copy pathHold.java
More file actions
135 lines (105 loc) · 3.62 KB
/
Hold.java
File metadata and controls
135 lines (105 loc) · 3.62 KB
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package example.borrow.domain;
import org.jmolecules.ddd.types.Identifier;
import org.jmolecules.event.annotation.DomainEvent;
import org.springframework.data.domain.AbstractAggregateRoot;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.UUID;
import java.util.function.UnaryOperator;
import example.borrow.domain.Patron.PatronId;
import jakarta.persistence.AttributeOverride;
import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
import jakarta.persistence.EmbeddedId;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
import lombok.Getter;
import lombok.NoArgsConstructor;
@SuppressWarnings("JpaDataSourceORMInspection")
@Entity
@NoArgsConstructor
@Table(name = "borrow_holds")
@Getter
public class Hold extends AbstractAggregateRoot<Hold> {
@EmbeddedId
private HoldId id;
@Embedded
@AttributeOverride(name = "barcode", column = @Column(name = "book_barcode"))
private Book.Barcode onBook;
@Embedded
@AttributeOverride(name = "email", column = @Column(name = "patron_id"))
private PatronId heldBy;
private LocalDate dateOfHold;
private LocalDate dateOfCheckout;
private LocalDate dateOfCheckin;
@Enumerated(EnumType.STRING)
private HoldStatus status;
@SuppressWarnings("unused")
@Version
private Long version;
private Hold(PlaceHold placeHold) {
this.id = new HoldId(UUID.randomUUID());
this.onBook = placeHold.inventoryNumber();
this.dateOfHold = placeHold.dateOfHold();
this.heldBy = placeHold.patronId();
this.status = HoldStatus.HOLDING;
this.registerEvent(new BookPlacedOnHold(id.id(), onBook.barcode(), dateOfHold));
}
public static Hold placeHold(PlaceHold command) {
return new Hold(command);
}
public Hold checkout(Checkout command) {
this.dateOfCheckout = command.dateOfCheckout();
this.status = HoldStatus.ACTIVE;
this.registerEvent(new BookCheckedOut(id.id(), onBook.barcode(), dateOfCheckout));
return this;
}
public Hold checkin(Checkin command) {
this.status = HoldStatus.RETURNED;
this.dateOfCheckin = command.dateOfCheckin();
return this;
}
public Hold then(UnaryOperator<Hold> function) {
return function.apply(this);
}
public boolean isHeldBy(PatronId patronId) {
return this.heldBy.equals(patronId);
}
public boolean isCheckedOut() {
return status == HoldStatus.ACTIVE;
}
public record HoldId(UUID id) implements Identifier {
}
public enum HoldStatus {
HOLDING, ACTIVE, RETURNED
}
///
// Commands
///
public record PlaceHold(Book.Barcode inventoryNumber, LocalDate dateOfHold, PatronId patronId) {
}
public record Checkout(HoldId holdId, LocalDate dateOfCheckout, PatronId patronId) {
}
public record Checkin(HoldId holdId, LocalDate dateOfCheckin, PatronId patronId) {}
///
// Events
///
@DomainEvent
public record BookCheckedOut(UUID holdId,
String inventoryNumber,
LocalDate dateOfCheckout) {
}
@DomainEvent
public record BookPlacedOnHold(UUID holdId,
String inventoryNumber,
LocalDate dateOfHold) {
}
@DomainEvent
public record BookCheckedIn(UUID holdId,
String inventoryNumber,
LocalDateTime dateOfCheckin) {
}
}