(Redmine API) 멤버가 여러 번 삽입됨

Redmine은 사용자와 회원으로 나뉩니다.

사용자는 Redmine에 액세스하는 사용자이고 구성원은 개별 프로젝트에 할당된 사용자입니다.

즉, 사용자가 프로젝트에 접근하기 위해서는 해당 프로젝트의 구성원으로 등록되어 있어야 합니다. (^^..)

Redmine API 문서에는 단일 구성원을 선택하는 예가 하나만 있습니다.

그런데 프로젝트 구성원을 지정할 때 여러 구성원을 지정한 다음 삽입하고 싶은데… 시행착오 끝에 방법을 찾았습니다.

아니요

  1. 사용자 ID: (20,21)

role_ids는 개체의 배열로 전달되므로 배열로도 전달합니다.아니요

{
  "membership":
  {
    "user_id": (20, 21),
    "role_ids": ( 4 , 5)
  }

}
  1. 회원* 2

멤버 개체를 연속으로 두 번 날립니다.아니요

{
  "membership":
  {
    "user_id": (20),
    "role_ids": ( 4 , 5)
  }
	
	,"membership":
  {
    "user_id": (21),
    "role_ids": ( 4 , 5)
  }
}


role_ids는 여러 개발자와 관리자를 선택할 수 있습니다.
user_id를 다중 선택할 수 없는 이유는 무엇입니까?
동시에 두 명의 사용자를 삽입할 수 없습니다. 되지 않을까…..


user_ids전달하자!

존재하다

  • “user_ids”:() ID를 배열에 넣습니다.

이렇게 쓰면 응답데이터가 정상적으로 옵니다! ! ! ! ! ! ! ! ! !

{
  "membership":
  {
    "user_ids": (20, 21, 22, 25, 26),
    "role_ids": ( 4 , 5)
  }

}

user_ids 배열의 첫 번째 인덱스 정보만 응답으로 반환됩니다.

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


여러 사용자가 데이터베이스에 올바르게 삽입되었는지 확인합니다.

Redmine 화면도 마찬가지입니다.


확인하다

사용자 요청이 한 번만 있어도 오류가 발생하지 않았는지 확인합니다.

{
  "membership":
  {
    "user_ids": (27),
    "role_ids": ( 4 , 5)
  }

}



이 양식의 API 요청을 알고 있습니다.

이제 남은 것은 데이터를 로드하고 데이터베이스로 이동하는 것입니다.

요청 본문

{
    "user_ids": (14,21),
    "role_ids": (4,5)
}

프로젝트 ID는 쿼리 문자열로 전송되기 때문에 요청 본문에 포함되지 않습니다.

어쨌든 위와 같은 요청이 오면 다음과 같이 API DB에 넣어야 한다.

1) tb_member(project_id, user_id) 값(12, 14)에 삽입;

2) tb_member(project_id, user_id) 값(12, 21)에 삽입;

(role_ids는 redmine API를 호출하는 데 필요한 데이터이므로 지금은 무시하십시오.)

멤버 컨트롤러.자바

redmine API는 API DB에 정상적으로 삽입하는 동안에만 호출됩니다.

정상적인 삽입이 없으면 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에 넣습니다. 가운데.

루핑 시 멤버 ID를 기준으로 데이터베이스에 삽입합니다. 이렇게 하면 목록의 크기(= 요청한 사용자 수)만큼의 사용자가 반복해서 데이터베이스에 삽입됩니다.

  // 구성원 생성
    @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에 넣어야 하므로 리턴 타입은 List로 정의한다. .

Membership.get(“user_ids”)은 JSONArray 유형입니다.

이것은 user_ids.size를 순회하고, Member Entity를 만들고, Member를 넣고, List를 다시 넣고, 반환하는 논리입니다.

@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;
    }

}

정상적으로 Redmine API DB에 삽입할 때 응답 데이터는 다음과 같다.

2명의 사용자가 삽입되었지만 처음 반환된 사용자 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번 삽입되었음을 알 수 있다.

데이터 베이스


붉은 광석 데이터베이스




매우 자랑스럽습니다…

신나는..