11package clap .server .adapter .outbound .persistense .mapper ;
22
3+ import clap .server .adapter .outbound .persistense .entity .member .DepartmentEntity ;
34import clap .server .adapter .outbound .persistense .entity .member .MemberEntity ;
5+ import clap .server .domain .model .member .Department ;
46import clap .server .domain .model .member .Member ;
57import clap .server .domain .model .member .MemberInfo ;
8+ import org .hibernate .Hibernate ;
69import org .mapstruct .Mapper ;
710import org .mapstruct .Mapping ;
811import org .mapstruct .Named ;
912import org .springframework .beans .factory .annotation .Autowired ;
1013
11- @ Mapper (componentModel = "spring" , uses = { DepartmentPersistenceMapper . class } )
14+ @ Mapper (componentModel = "spring" )
1215public abstract class MemberPersistenceMapper {
1316
1417 @ Autowired
1518 protected DepartmentPersistenceMapper departmentPersistenceMapper ;
1619
17- @ Mapping (source = "name" , target = "memberInfo.name" )
18- @ Mapping (source = "email" , target = "memberInfo.email" )
19- @ Mapping (source = "nickname" , target = "memberInfo.nickname" )
20- @ Mapping (source = "role" , target = "memberInfo.role" )
21- @ Mapping (source = "departmentRole" , target = "memberInfo.departmentRole" )
22- @ Mapping (source = "department" , target = "memberInfo.department" )
23- @ Mapping (source = "reviewer" , target = "memberInfo.isReviewer" )
24- @ Mapping (source = "admin" , target = "admin" , qualifiedByName = "toDomain" )
25- @ Mapping (source = "createdAt" , target = "createdAt" )
26- @ Mapping (source = "updatedAt" , target = "updatedAt" )
27- @ Mapping (source = "memberId" , target = "memberId" )
20+ @ Mapping (target = "memberInfo" , expression = "java(memberEntityToMemberInfo(entity))" )
21+ @ Mapping (target = "department" , expression = "java(mapDepartment(entity))" )
22+ @ Mapping (target = "admin" , ignore = true )
23+ @ Mapping (source = "entity.createdAt" , target = "createdAt" )
24+ @ Mapping (source = "entity.updatedAt" , target = "updatedAt" )
25+ @ Mapping (source = "entity.memberId" , target = "memberId" )
2826 public abstract Member toDomain (MemberEntity entity );
2927
28+ protected MemberInfo memberEntityToMemberInfo (MemberEntity memberEntity ) {
29+ if (memberEntity == null ) {
30+ return null ;
31+ }
32+
33+ DepartmentEntity departmentEntity = memberEntity .getDepartment ();
34+ Department department = (departmentEntity != null && Hibernate .isInitialized (departmentEntity ))
35+ ? departmentPersistenceMapper .toDomain (departmentEntity )
36+ : null ;
37+
38+ return MemberInfo .builder ()
39+ .name (memberEntity .getName ())
40+ .email (memberEntity .getEmail ())
41+ .nickname (memberEntity .getNickname ())
42+ .role (memberEntity .getRole ())
43+ .departmentRole (memberEntity .getDepartmentRole ())
44+ .isReviewer (memberEntity .isReviewer ())
45+ .department (department )
46+ .build ();
47+ }
48+
49+ protected Department mapDepartment (MemberEntity entity ) {
50+ DepartmentEntity department = entity .getDepartment ();
51+ if (department == null ) {
52+ return null ;
53+ }
54+
55+ if (!Hibernate .isInitialized (department )) {
56+ return null ;
57+ }
58+
59+ return departmentPersistenceMapper .toDomain (department );
60+ }
61+
3062 @ Mapping (source = "memberInfo.name" , target = "name" )
3163 @ Mapping (source = "memberInfo.email" , target = "email" )
3264 @ Mapping (source = "memberInfo.nickname" , target = "nickname" )
@@ -40,6 +72,7 @@ public abstract class MemberPersistenceMapper {
4072 @ Mapping (source = "memberId" , target = "memberId" )
4173 public abstract MemberEntity toEntity (Member member );
4274
75+
4376 @ Named ("toDomain" )
4477 protected Member toDomainAdmin (MemberEntity admin ) {
4578 if (admin == null ) return null ;
0 commit comments