|
41 | 41 | import alfio.repository.*;
|
42 | 42 | import alfio.repository.user.OrganizationRepository;
|
43 | 43 | 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; |
44 | 48 | import lombok.extern.log4j.Log4j2;
|
| 49 | +import org.apache.commons.lang3.ObjectUtils; |
45 | 50 | import org.apache.commons.lang3.StringUtils;
|
46 | 51 | import org.apache.commons.lang3.Validate;
|
47 | 52 | import org.apache.commons.lang3.tuple.Pair;
|
|
56 | 61 | import org.springframework.transaction.support.TransactionTemplate;
|
57 | 62 |
|
58 | 63 | import java.io.IOException;
|
| 64 | +import java.lang.reflect.Field; |
59 | 65 | import java.math.BigDecimal;
|
60 | 66 | import java.time.Clock;
|
61 | 67 | import java.time.ZoneId;
|
@@ -922,6 +928,9 @@ public void updateTicketOwner(Ticket ticket,
|
922 | 928 | PartialTicketTextGenerator ownerChangeTextBuilder,
|
923 | 929 | Optional<UserDetails> userDetails) {
|
924 | 930 |
|
| 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 | + |
925 | 934 | String newEmail = updateTicketOwner.getEmail().trim();
|
926 | 935 | CustomerName customerName = new CustomerName(updateTicketOwner.getFullName(), updateTicketOwner.getFirstName(), updateTicketOwner.getLastName(), event);
|
927 | 936 | ticketRepository.updateTicketOwner(ticket.getUuid(), newEmail, customerName.getFullName(), customerName.getFirstName(), customerName.getLastName());
|
@@ -958,6 +967,52 @@ public void updateTicketOwner(Ticket ticket,
|
958 | 967 | ticketReservationRepository.updateAssignee(reservation.getId(), username);
|
959 | 968 | }
|
960 | 969 | 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 | + } |
961 | 1016 | }
|
962 | 1017 |
|
963 | 1018 | private boolean isAdmin(Optional<UserDetails> userDetails) {
|
|
0 commit comments