1+ package de .tum .aet .devops25 .conceptsvc ;
2+
3+ import java .util .ArrayList ;
4+ import java .util .List ;
5+ import java .util .Objects ;
6+ import java .util .stream .Collectors ;
7+
8+ import de .tum .aet .devops25 .api .generated .model .Concept ;
9+ import de .tum .aet .devops25 .api .generated .model .UpdateConceptRequest ;
10+
11+ public class ConceptMapper {
12+
13+ // DTO → Entity (full mapping for creation/retrieval)
14+ public static ConceptEntity toEntity (Concept dto ) {
15+ if (dto == null ) {
16+ return null ;
17+ }
18+
19+ ConceptEntity entity = new ConceptEntity ();
20+ entity .setId (dto .getId ());
21+ entity .setTitle (dto .getTitle ());
22+ entity .setDescription (dto .getDescription ());
23+
24+ // Enum conversion: API DTO enum → Entity enum
25+ if (dto .getStatus () != null ) {
26+ entity .setStatus (ConceptStatus .valueOf (dto .getStatus ().getValue ()));
27+ }
28+
29+ entity .setUserId (dto .getUserId ());
30+ entity .setNotes (dto .getNotes ());
31+ entity .setVersion (dto .getVersion ());
32+ entity .setCreatedAt (dto .getCreatedAt ());
33+ entity .setUpdatedAt (dto .getUpdatedAt ());
34+ entity .setLastModifiedBy (dto .getLastModifiedBy ());
35+
36+ // Simple collection - defensive copy
37+ entity .setTags (dto .getTags () != null ? new ArrayList <>(dto .getTags ()) : new ArrayList <>());
38+
39+ // Embedded entities
40+ entity .setEventDetails (EventDetailsMapper .toEntity (dto .getEventDetails ()));
41+ entity .setPricing (PricingMapper .toEntity (dto .getPricing ()));
42+
43+ // Child collections with bidirectional relationship handling
44+ if (dto .getAgenda () != null ) {
45+ List <AgendaItemEntity > agendaEntities = dto .getAgenda ().stream ()
46+ .map (AgendaItemMapper ::toEntity )
47+ .filter (Objects ::nonNull )
48+ .collect (Collectors .toList ());
49+ // Set parent reference for bidirectional relationship
50+ agendaEntities .forEach (item -> item .setConcept (entity ));
51+ entity .setAgenda (agendaEntities );
52+ } else {
53+ entity .setAgenda (new ArrayList <>());
54+ }
55+
56+ if (dto .getSpeakers () != null ) {
57+ List <SpeakerEntity > speakerEntities = dto .getSpeakers ().stream ()
58+ .map (SpeakerMapper ::toEntity )
59+ .filter (Objects ::nonNull )
60+ .collect (Collectors .toList ());
61+ // Set parent reference for bidirectional relationship
62+ speakerEntities .forEach (speaker -> speaker .setConcept (entity ));
63+ entity .setSpeakers (speakerEntities );
64+ } else {
65+ entity .setSpeakers (new ArrayList <>());
66+ }
67+
68+ return entity ;
69+ }
70+
71+ // Entity → DTO (full mapping for responses)
72+ public static Concept toDto (ConceptEntity entity ) {
73+ if (entity == null ) {
74+ return null ;
75+ }
76+
77+ Concept dto = new Concept ();
78+ dto .setId (entity .getId ());
79+ dto .setTitle (entity .getTitle ());
80+ dto .setDescription (entity .getDescription ());
81+
82+ // Enum conversion: Entity enum → API DTO enum
83+ if (entity .getStatus () != null ) {
84+ dto .setStatus (Concept .StatusEnum .fromValue (entity .getStatus ().name ()));
85+ }
86+
87+ dto .setUserId (entity .getUserId ());
88+ dto .setNotes (entity .getNotes ());
89+ dto .setVersion (entity .getVersion ());
90+ dto .setCreatedAt (entity .getCreatedAt ());
91+ dto .setUpdatedAt (entity .getUpdatedAt ());
92+ dto .setLastModifiedBy (entity .getLastModifiedBy ());
93+
94+ // Simple collection - defensive copy
95+ dto .setTags (entity .getTags () != null ? new ArrayList <>(entity .getTags ()) : new ArrayList <>());
96+
97+ // Embedded entities
98+ dto .setEventDetails (EventDetailsMapper .toDto (entity .getEventDetails ()));
99+ dto .setPricing (PricingMapper .toDto (entity .getPricing ()));
100+
101+ // Child collections (no concept reference to avoid circular dependency)
102+ if (entity .getAgenda () != null ) {
103+ List <de .tum .aet .devops25 .api .generated .model .AgendaItem > agendaDtos = entity .getAgenda ().stream ()
104+ .map (AgendaItemMapper ::toDto )
105+ .filter (Objects ::nonNull )
106+ .collect (Collectors .toList ());
107+ dto .setAgenda (agendaDtos );
108+ } else {
109+ dto .setAgenda (new ArrayList <>());
110+ }
111+
112+ if (entity .getSpeakers () != null ) {
113+ List <de .tum .aet .devops25 .api .generated .model .Speaker > speakerDtos = entity .getSpeakers ().stream ()
114+ .map (SpeakerMapper ::toDto )
115+ .filter (Objects ::nonNull )
116+ .collect (Collectors .toList ());
117+ dto .setSpeakers (speakerDtos );
118+ } else {
119+ dto .setSpeakers (new ArrayList <>());
120+ }
121+
122+ return dto ;
123+ }
124+
125+ // Partial update for PUT operations - only map non-null fields
126+ public static void updateEntityFromRequest (ConceptEntity entity , UpdateConceptRequest request ) {
127+ if (entity == null || request == null ) {
128+ return ;
129+ }
130+
131+ if (request .getTitle () != null ) {
132+ entity .setTitle (request .getTitle ());
133+ }
134+
135+ if (request .getDescription () != null ) {
136+ entity .setDescription (request .getDescription ());
137+ }
138+
139+ if (request .getStatus () != null ) {
140+ entity .setStatus (ConceptStatus .valueOf (request .getStatus ().getValue ()));
141+ }
142+
143+ if (request .getNotes () != null ) {
144+ entity .setNotes (request .getNotes ());
145+ }
146+
147+ if (request .getTags () != null ) {
148+ entity .setTags (new ArrayList <>(request .getTags ()));
149+ }
150+
151+ // Update embedded entities if provided
152+ if (request .getEventDetails () != null ) {
153+ entity .setEventDetails (EventDetailsMapper .toEntity (request .getEventDetails ()));
154+ }
155+
156+ if (request .getPricing () != null ) {
157+ entity .setPricing (PricingMapper .toEntity (request .getPricing ()));
158+ }
159+
160+ // Update child collections if provided
161+ if (request .getAgenda () != null ) {
162+ // Clear existing and add new
163+ entity .getAgenda ().clear ();
164+ List <AgendaItemEntity > agendaEntities = request .getAgenda ().stream ()
165+ .map (AgendaItemMapper ::toEntity )
166+ .filter (Objects ::nonNull )
167+ .collect (Collectors .toList ());
168+ agendaEntities .forEach (item -> item .setConcept (entity ));
169+ entity .getAgenda ().addAll (agendaEntities );
170+ }
171+
172+ if (request .getSpeakers () != null ) {
173+ // Clear existing and add new
174+ entity .getSpeakers ().clear ();
175+ List <SpeakerEntity > speakerEntities = request .getSpeakers ().stream ()
176+ .map (SpeakerMapper ::toEntity )
177+ .filter (Objects ::nonNull )
178+ .collect (Collectors .toList ());
179+ speakerEntities .forEach (speaker -> speaker .setConcept (entity ));
180+ entity .getSpeakers ().addAll (speakerEntities );
181+ }
182+ }
183+ }
0 commit comments