[Redmine API] 구성원(member) 다중 insert

    레드마인에서는 사용자(user)와 구성원(member)으로 나뉜다.

    사용자는 레드마인에 접속하는 유저를 의미하고, 구성원은 각 프로젝트별로 할당된 사용자를 의미한다.

    그러니까 프로젝트에 사용자가 접근할 수 있도록, 해당 프로젝트의 구성원으로 등록해야 하는 것이다.  (^^..)

     

    레드마인 API 문서에서는 단일 구성원을 선택했을 경우에 대한 예시만 나와있었다.

    그런데 나는 프로젝트의 구성원을 지정 시, 구성원을 여러명 지정하여 insert 하고 싶었다... ㅎ 이런저런 시행착오 끝에 방법을 찾아냈다.

     

     

    안됨

    1. user_id : [20,21]

    role_ids는 객체 배열로 넘겨주길래 나도 배열로 넘여줬다. 안됨

    {
      "membership":
      {
        "user_id": [20, 21],
        "role_ids": [ 4 , 5]
      }
    
    }
    
    1. membership * 2

    membership 객체를 두번 연속으로 날려봤다. 안 됨

    {
      "membership":
      {
        "user_id": [20],
        "role_ids": [ 4 , 5]
      }
    	
    	,"membership":
      {
        "user_id": [21],
        "role_ids": [ 4 , 5]
      }
    }
    

     

     

    role_ids는 개발자, 관리자를 다중으로 선택할 수 있는데,,.
    왜 user_id는 다중으로 선택할 수 없을까..
    김땡땡과 신똥똥 두 명의 사용자를 한 방에 insert할 수는 없을까...... 

     

     

    user_ids로 넘겨보자! 

     

     

    • "user_ids": [] 배열로 id 넣기

    이렇게 넣으면 정상적으로 응답 데이터가 온다!!!!!!!!! 

    {
      "membership":
      {
        "user_ids": [20, 21, 22, 25, 26],
        "role_ids": [ 4 , 5]
      }
    
    }
    

     

     

    응답은 user_ids 배열의 첫 번째 Index 정보만 return 된다. 

     

    {
        "membership": {
            "id": 24,
            "project": {
                "id": 12,
                "name": "수정 테스트 1"
            },
            "user": {
                "id": 20,
                "name": "비읍 Lang"
            },
            "roles": [
                {
                    "id": 4,
                    "name": "개발자"
                },
                {
                    "id": 5,
                    "name": "보고자"
                }
            ]
        }
    }
    

    DB에는 정상적으로 다중 사용자가  insert 된 것을 확인했다. 

    레드마인 화면도 마찬가지

     

    검증

    단일 사용자만 요청해도 에러 발생하지 않음을 확인했다.

    {
      "membership":
      {
        "user_ids": [27],
        "role_ids": [ 4 , 5]
      }
    
    }
    

     


    api는 저런 형태로 요청하는 걸 알았으니

    이제 데이터를 이고지고 DB로 옮기는 일만 남았다.

     

     

    Request Body

    {
        "user_ids": [14,21],
        "role_ids": [4,5]
    }
    

     

    프로젝트 id는 쿼리스트링으로 전달하기 때문에 Request Body에는 담지 않았다.

    암튼 위와 같은 요청이 왔을 경우 API DB에는 다음과 같이 insert 되어야 한다.

    1) insert into tb_member (project_id, user_id) values (12, 14);

    2) insert into tb_member (project_id, user_id) values (12, 21);

    ( role_ids는 redmine API를 호출할 때 필요한 데이터이므로 , 지금은 무시하도록 하자. )

     

     

    MemberController.java

    API DB에 정상적으로 insert 되었을 경우에만 redmine API를 호출하였다.

    정상적으로 insert 되지 않을 경우 null이 반환된다.

     // 구성원 생성
        @PostMapping("/createMember")
        public JSONObject createMember(@RequestBody Map<String,JSONArray> params, @RequestParam (required = false) int projectId){
    
            MemberDto memberDto = MemberDto.builder().membership(params).projectId(projectId).build();
    
           int result = memberService.createMember(memberDto, projectId);
    
            JSONObject res = null;
    
            // api DB에 정상적으로 insert 되었을 경우
            if(result > 0 ){
                res =  webClient.post().uri("/projects/" + projectId + "/memberships.json")
                        .header(HttpHeaders.AUTHORIZATION, AdminAuth.BASIC_BASE_64.getKey())
                        .bodyValue(memberDto)     // set body value
                        .retrieve()                 // client message 전송
                        .bodyToMono(JSONObject.class)  // body type
                        .block();                   // await
            }
    
            return res;
        }

     

    MemberServiceImpl.java

    dto.toEntoty() 메서드를 이용해 dto를 엔티티로 변경하고, 이 값을 List <Member>에 담았다.

    반복문을 돌면서, 구성원 ID를 기준으로 DB에 insert 한다. 이렇게 하면 List 사이즈만큼 (=내가 요청 보낸 사용자 수만큼) 반복문이 돌면서 DB에 insert 된다.

      // 구성원 생성
        @Override
        public int createMember(MemberDto dto, int projectId) {
    
            int result = 0;
    
            List <Member> memberEntity = dto.toEntity();
    
            // 구성원 ID 별로 DB에 insert됨
            for(int i=0; i<memberEntity.size(); i++){
                System.out.println("memberEntity.get(i)" + memberEntity.get(i).getUserId());
                memberRepository.save(memberEntity.get(i));
                result = memberEntity.size();
            }
    
            return result;
        }

     

    MemberDto.java

    구성원 ID 별로 DB에 각각 insert 되어야 하기 때문에 반환 타입은 List <Member>로 정의하였다.

    membership.get("user_ids")는 JSONArray 타입이다.

    user_ids.size만큼 반복문을 돌면서, Member Entity를 생성해 member에 담아주고, 이를 다시 List에 담아 return 하는 로직이다.

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public class MemberDto {
    
        Map<String, JSONArray> membership;
    
        int projectId;
    
        // 구성원을 다중 선택할 수 있기 때문에 반환 타입은 List<Member>
        public List<Member> toEntity(){
    
            List <Member> res = new ArrayList<>();
            Member member = null;
    
            for(int i=0; i<membership.get("user_ids").size(); i++){
                // System.out.println("use_ids ==== > " + membership.get("user_ids").get(i));
                member =  Member.builder()
                        .userId((Integer) membership.get("user_ids").get(i))
                        .projectId(projectId)
                        .build();
                res.add(member);
            }
    
            return res;
        }
    
    }

     

    정상적으로 레드마인 API DB에 insert 되었을 경우 response Data는 다음과 같다.

    insert 한 user는 2명인데, 반환되는 데이터는 제일 처음 입력한 user ID (14번)만 반환된다.

    {
        "membership": {
            "id": 34,
            "project": {
                "id": 12,
                "name": "수정 테스트 1"
            },
            "user": {
                "id": 14,
                "name": "성은 김"
            },
            "roles": [
                {
                    "id": 4,
                    "name": "개발자"
                },
                {
                    "id": 5,
                    "name": "보고자"
                }
            ]
        }
    }
    

     

    API DB와 Redmine DB 모두 2건 insert 된 것을 확인할 수 있다.

    API DB

    Redmine DB

     


     

    뿌듯해..

    짜릿해..

     

     

    728x90

    댓글