1
1
package de .muenchen .oss .dbs .ticketing .eventing .mailhandler .application .usecase ;
2
2
3
3
import com .fasterxml .jackson .dataformat .xml .XmlMapper ;
4
+ import de .muenchen .oss .dbs .ticketing .eai .client .model .ArticleAttachment ;
4
5
import de .muenchen .oss .dbs .ticketing .eai .client .model .ArticleInternal ;
5
6
import de .muenchen .oss .dbs .ticketing .eai .client .model .TicketInternal ;
7
+ import de .muenchen .oss .dbs .ticketing .eai .client .model .UpdateTicketDTO ;
6
8
import de .muenchen .oss .dbs .ticketing .eventing .handlercore .application .port .in .EventHandlerInPort ;
7
9
import de .muenchen .oss .dbs .ticketing .eventing .handlercore .application .port .out .TicketingOutPort ;
8
10
import de .muenchen .oss .dbs .ticketing .eventing .handlercore .domain .model .Event ;
11
+ import de .muenchen .oss .dbs .ticketing .eventing .mailhandler .adapter .out .mail .MailMessage ;
9
12
import de .muenchen .oss .dbs .ticketing .eventing .mailhandler .application .port .out .SendMailOutPort ;
10
13
import de .muenchen .oss .dbs .ticketing .eventing .mailhandler .config .MailHandlerProperties ;
14
+ import de .muenchen .oss .dbs .ticketing .eventing .mailhandler .exceptions .NoValidArticleException ;
11
15
import java .io .IOException ;
12
16
import java .io .InputStream ;
17
+ import java .util .HashMap ;
13
18
import java .util .Map ;
14
19
import java .util .stream .Collectors ;
15
20
import lombok .RequiredArgsConstructor ;
22
27
public class EventHandlingUseCase implements EventHandlerInPort {
23
28
private static final String INTERNAL_ATTACHMENTS_ARTICLE_TITLE = "Interner Artikel für interne Anhänge." ;
24
29
private static final String FORM_ATTACHMENT_NAME = "XML-Daten.xml" ;
30
+ public static final String TICKETING_VERTRAUENSNIVEAU = "ticketingVertrauensniveau" ;
31
+ public static final String LEGACY_POSTKORB_HANDLE = "legacyPostkorbHandle" ;
32
+ public static final String ACCOUNT_SOURCE = "accountSource" ;
33
+
34
+ public static final String TO_POSTBOX_DEFAULT = "send" ;
35
+ public static final String TO_POSTBOX_HIGH = "send_high_authLevel" ;
25
36
26
37
private final XmlMapper xmlMapper = new XmlMapper ();
27
38
private final MailHandlerProperties mailHandlerProperties ;
@@ -36,52 +47,94 @@ public void handleEvent(final Event event) {
36
47
return ;
37
48
}
38
49
log .info ("Handling event" );
39
- // find event ticket
40
- final TicketInternal ticket = ticketingOutPort .getTicket (event .ticket ());
41
- // get parsed form
42
- final Map <String , Object > form = getParsedForm (ticket );
43
- // send mail
44
- final String subject = buildSubject (ticket , form );
45
- final String body = buildBody (ticket );
46
- sendMailOutport .sendMail (
47
- mailHandlerProperties .getRecipient (), subject , body );
48
- log .info ("Handled event successfully" );
50
+ try {
51
+ // find event ticket
52
+ final TicketInternal ticket = ticketingOutPort .getTicket (event .ticket ());
53
+ //check if ticket should be sent
54
+ if (!isRelevantTicket (ticket )) {
55
+ log .debug ("Ticket not relevant" );
56
+ return ;
57
+ }
58
+ // get parsed form
59
+ final Map <String , Object > form = getParsedForm (ticket );
60
+ //find relevant article
61
+ final ArticleInternal article = findRelevantArticle (ticket );
62
+ sendMail (ticket , form , article );
63
+
64
+ //reset flag sende_nachricht_nach_extern
65
+ resetTicket (ticket );
66
+
67
+ log .info ("Event handled successfully" );
68
+ } catch (NoValidArticleException e ) {
69
+ log .error (e .getMessage ());
70
+ log .error ("Event NOT handled successfully" );
71
+ }
49
72
}
50
73
51
74
private boolean isRelevantEvent (final Event event ) {
52
75
log .debug ("checking event: " + event );
53
76
return
54
- // state was changed
55
- mailHandlerProperties .getStateChangeAction ().equals (event .action ()) &&
56
- // new state is closed
57
- mailHandlerProperties .getClosedState ().equals (event .status ()) &&
58
- // is relevant anliegen
77
+ // state was changed by trigger send-to-postbox
78
+ mailHandlerProperties .getTicketChangeAction ().equals (event .action ()) &&
79
+ // is relevant anliegen
59
80
mailHandlerProperties .getRelevantTicketTypes ().contains (event .anliegenart ()) &&
60
81
// user does have an lhmExtId (i.e. BayernID or BundID user)
61
82
event .lhmExtId () != null && !event .lhmExtId ().isEmpty ();
62
83
}
63
84
64
- private String buildSubject (final TicketInternal ticket , final Map <String , Object > form ) {
65
- return "[%s;%s;%s;%s] Ihr Anliegen '%s' wurde abschließend bearbeitet"
66
- .formatted (
67
- form .get ("legacyPostkorbHandle" ),
68
- form .get ("accountSource" ),
69
- form .get ("ticketingVertrauensniveau" ),
70
- "Dummy" ,
71
- ticket .getTitle ());
85
+ private boolean isRelevantTicket (final TicketInternal ticket ) {
86
+ log .debug ("Checking value of sende_nachricht_nach_extern: " + ticket .getSendeNachrichtNachExtern ());
87
+ return TO_POSTBOX_DEFAULT .equals (ticket .getSendeNachrichtNachExtern ()) || TO_POSTBOX_HIGH .equals (ticket .getSendeNachrichtNachExtern ());
72
88
}
73
89
74
- private String buildBody (final TicketInternal ticket ) {
90
+ private ArticleInternal findRelevantArticle (final TicketInternal ticket ) throws NoValidArticleException {
75
91
assert ticket .getArticles () != null ;
76
92
return ticket .getArticles ().stream ()
77
- // only public articles of type "web" or "note"
93
+ // find last public articles of type "note"
78
94
.filter (i -> Boolean .FALSE .equals (i .getInternal ()) &&
79
- (ArticleInternal .TypeEnum .WEB .equals (i .getType ()) || ArticleInternal .TypeEnum .NOTE .equals (i .getType ())))
80
- // format single article
81
- .map (i -> "Titel: %s<br>Body: %s" .formatted (i .getSubject (), i .getBody ()))
82
- // build body
83
- .collect (Collectors .joining ("<hr>" ));
95
+ ArticleInternal .TypeEnum .NOTE .equals (i .getType ()))
96
+ .reduce ((first , second ) -> second )
97
+ .orElseThrow (() -> new NoValidArticleException ("no valid article found in ticket " + ticket .getId ()));
98
+ }
99
+
100
+ private void sendMail (final TicketInternal ticket , final Map <String , Object > form , final ArticleInternal article ) {
101
+ final String recipient = mailHandlerProperties .getRecipient ();
102
+ final String subject = buildSubject (ticket , form );
103
+ log .debug ("Created subject: " + subject );
104
+ final String body = buildBody (article );
105
+ log .debug ("Created body: " + body );
106
+ final Map <String , InputStream > attachments = buildAttachments (article );
107
+ sendMailOutport .sendMail (new MailMessage (recipient , subject , body , attachments ));
108
+ }
84
109
110
+ private String buildSubject (final TicketInternal ticket , final Map <String , Object > form ) {
111
+ final String authlevel ;
112
+ if (form .get (TICKETING_VERTRAUENSNIVEAU ) == null ) {
113
+ log .error ("no ticketingVertrauensniveau found in ticket " + ticket .getId () + " - setting level1" );
114
+ authlevel = "level1" ;
115
+ } else {
116
+ authlevel = TO_POSTBOX_HIGH .equals (ticket .getSendeNachrichtNachExtern ()) ? "level3" : String .valueOf (form .get (TICKETING_VERTRAUENSNIVEAU ));
117
+ }
118
+
119
+ return "[%s;%s;%s;%s] Neue Nachricht zu Ihrem Anliegen '%s'"
120
+ .formatted (
121
+ form .get (LEGACY_POSTKORB_HANDLE ),
122
+ form .get (ACCOUNT_SOURCE ),
123
+ authlevel ,
124
+ "Zammad-Eventing" ,
125
+ ticket .getTitle ());
126
+ }
127
+
128
+ private String buildBody (final ArticleInternal article ) {
129
+ return article .getBody ();
130
+ }
131
+
132
+ private Map <String , InputStream > buildAttachments (final ArticleInternal article ) {
133
+ if (article .getAttachments () == null ) {
134
+ return new HashMap <>();
135
+ }
136
+ return article .getAttachments ().stream ().collect (Collectors .toMap (ArticleAttachment ::getFilename ,
137
+ a -> ticketingOutPort .getAttachmentContent (article .getTicketId (), article .getId (), a .getId ())));
85
138
}
86
139
87
140
private Map <String , Object > getParsedForm (final TicketInternal ticket ) {
@@ -109,4 +162,12 @@ private Map<String, Object> getParsedForm(final TicketInternal ticket) {
109
162
throw new RuntimeException (e );
110
163
}
111
164
}
165
+
166
+ private void resetTicket (final TicketInternal ticket ) {
167
+ final UpdateTicketDTO updateTicketDTO = new UpdateTicketDTO ();
168
+ updateTicketDTO .setId (ticket .getId ());
169
+ updateTicketDTO .setDirektkennwort (ticket .getDirektkennwort ());
170
+ updateTicketDTO .setSendeNachrichtNachExtern (null );
171
+ ticketingOutPort .updateTicket (updateTicketDTO );
172
+ }
112
173
}
0 commit comments