Skip to content

Commit e4b9811

Browse files
committed
#135 save diff for ticket update, fix reservation-page issue when the reservation is free
1 parent bf3f18d commit e4b9811

File tree

6 files changed

+69
-4
lines changed

6 files changed

+69
-4
lines changed

build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ dependencies {
165165
compile 'com.atlassian.commonmark:commonmark:0.9.0'
166166
compile 'com.ryantenney.passkit4j:passkit4j:2.0.1'
167167
compile 'com.github.ben-manes.caffeine:caffeine:2.5.2'
168+
compile 'de.danielbechler:java-object-diff:0.95-RC5'
168169

169170
testCompile "org.springframework:spring-test:$springVersion"
170171
testCompile "com.insightfullogic:lambda-behave:0.3"

src/main/java/alfio/manager/TicketReservationManager.java

+55
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,12 @@
4141
import alfio.repository.*;
4242
import alfio.repository.user.OrganizationRepository;
4343
import alfio.util.*;
44+
import de.danielbechler.diff.ObjectDifferBuilder;
45+
import de.danielbechler.diff.node.DiffNode;
46+
import de.danielbechler.diff.node.Visit;
47+
import lombok.AllArgsConstructor;
4448
import lombok.extern.log4j.Log4j2;
49+
import org.apache.commons.lang3.ObjectUtils;
4550
import org.apache.commons.lang3.StringUtils;
4651
import org.apache.commons.lang3.Validate;
4752
import org.apache.commons.lang3.tuple.Pair;
@@ -56,6 +61,7 @@
5661
import org.springframework.transaction.support.TransactionTemplate;
5762

5863
import java.io.IOException;
64+
import java.lang.reflect.Field;
5965
import java.math.BigDecimal;
6066
import java.time.Clock;
6167
import java.time.ZoneId;
@@ -922,6 +928,9 @@ public void updateTicketOwner(Ticket ticket,
922928
PartialTicketTextGenerator ownerChangeTextBuilder,
923929
Optional<UserDetails> userDetails) {
924930

931+
Ticket preUpdateTicket = ticketRepository.findByUUID(ticket.getUuid());
932+
Map<String, String> preUpdateTicketFields = ticketFieldRepository.findAllByTicketId(ticket.getId()).stream().collect(Collectors.toMap(TicketFieldValue::getName, TicketFieldValue::getValue));
933+
925934
String newEmail = updateTicketOwner.getEmail().trim();
926935
CustomerName customerName = new CustomerName(updateTicketOwner.getFullName(), updateTicketOwner.getFirstName(), updateTicketOwner.getLastName(), event);
927936
ticketRepository.updateTicketOwner(ticket.getUuid(), newEmail, customerName.getFullName(), customerName.getFirstName(), customerName.getLastName());
@@ -958,6 +967,52 @@ public void updateTicketOwner(Ticket ticket,
958967
ticketReservationRepository.updateAssignee(reservation.getId(), username);
959968
}
960969
pluginManager.handleTicketAssignment(newTicket);
970+
971+
972+
973+
Ticket postUpdateTicket = ticketRepository.findByUUID(ticket.getUuid());
974+
Map<String, String> postUpdateTicketFields = ticketFieldRepository.findAllByTicketId(ticket.getId()).stream().collect(Collectors.toMap(TicketFieldValue::getName, TicketFieldValue::getValue));
975+
976+
DiffNode diffTicket = ObjectDifferBuilder.buildDefault().compare(postUpdateTicket, preUpdateTicket);
977+
DiffNode diffTicketFields = ObjectDifferBuilder.buildDefault().compare(postUpdateTicketFields, preUpdateTicketFields);
978+
FieldChangesSaver diffTicketVisitor = new FieldChangesSaver(preUpdateTicket, postUpdateTicket);
979+
FieldChangesSaver diffTicketFieldsVisitor = new FieldChangesSaver(preUpdateTicketFields, postUpdateTicketFields);
980+
diffTicket.visit(diffTicketVisitor);
981+
diffTicketFields.visit(diffTicketFieldsVisitor);
982+
983+
List<Map<String, Object>> changes = new ArrayList<>(diffTicketVisitor.changes);
984+
changes.addAll(diffTicketFieldsVisitor.changes);
985+
986+
auditingRepository.insert(ticket.getTicketsReservationId(), null, Audit.EventType.UPDATE_TICKET, new Date(), Audit.EntityType.TICKET, Integer.toString(ticket.getId()), Json.toJson(changes));
987+
}
988+
989+
990+
private static class FieldChangesSaver implements DiffNode.Visitor {
991+
992+
private final Object preBase;
993+
private final Object postBase;
994+
995+
private final List<Map<String, Object>> changes = new ArrayList<>();
996+
997+
998+
FieldChangesSaver(Object preBase, Object postBase) {
999+
this.preBase = preBase;
1000+
this.postBase = postBase;
1001+
}
1002+
1003+
@Override
1004+
public void node(DiffNode node, Visit visit) {
1005+
if(node.hasChanges() && node.getState() != DiffNode.State.UNTOUCHED && !node.isRootNode()) {
1006+
Object baseValue = node.canonicalGet(preBase);
1007+
Object workingValue = node.canonicalGet(postBase);
1008+
HashMap<String, Object> change = new HashMap<>();
1009+
change.put("propertyName", node.getPath().toString());
1010+
change.put("state", node.getState());
1011+
change.put("oldValue", baseValue);
1012+
change.put("newValue", workingValue);
1013+
changes.add(change);
1014+
}
1015+
}
9611016
}
9621017

9631018
private boolean isAdmin(Optional<UserDetails> userDetails) {

src/main/resources/alfio/db/HSQLDB/V19_1.11.8__AUDITING.sql

+3-1
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,6 @@ create table auditing (
2323
entity_type varchar(64),
2424
entity_id varchar(512),
2525
modifications clob
26-
);
26+
);
27+
28+
create index "auditing_reservation_id_idx" on auditing(reservation_id);

src/main/resources/alfio/db/MYSQL/V19_1.11.8__AUDITING.sql

+3-1
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,6 @@ create table auditing (
2323
entity_type varchar(64),
2424
entity_id varchar(512),
2525
modifications mediumtext
26-
) ENGINE=InnoDB CHARACTER SET=utf8 COLLATE utf8_bin;;
26+
) ENGINE=InnoDB CHARACTER SET=utf8 COLLATE utf8_bin;
27+
28+
create index auditing_reservation_id_idx on auditing(reservation_id);

src/main/resources/alfio/db/PGSQL/V19_1.11.8__AUDITING.sql

+3-1
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,6 @@ create table auditing (
2323
entity_type varchar(64),
2424
entity_id varchar(512),
2525
modifications text
26-
);
26+
);
27+
28+
create index "auditing_reservation_id_idx" on auditing(reservation_id);

src/main/webapp/WEB-INF/templates/event/reservation-page.ms

+4-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@
160160
{{#field-has-error}}[email]<span class="help-block text-danger">{{#i18n}}{{#field-error}}email{{/field-error}}{{/i18n}}</span>{{/field-has-error}}
161161
</div>
162162

163-
{{^orderSummary.free}}
163+
164164

165165
<div class="page-header">
166166
<h2>{{#i18n}}reservation-page.attendees{{/i18n}}</h2>
@@ -193,6 +193,9 @@
193193
</div>
194194
<div class="clearfix"></div>
195195

196+
197+
{{^orderSummary.free}}
198+
196199
<div class="page-header wMarginTop">
197200
<h2>{{#i18n}}reservation-page.payment{{/i18n}}</h2>
198201
</div>

0 commit comments

Comments
 (0)