Redmine은 사용자와 회원으로 나뉩니다.
사용자는 Redmine에 액세스하는 사용자이고 구성원은 개별 프로젝트에 할당된 사용자입니다.
즉, 사용자가 프로젝트에 접근하기 위해서는 해당 프로젝트의 구성원으로 등록되어 있어야 합니다. (^^..)
Redmine API 문서에는 단일 구성원을 선택하는 예가 하나만 있습니다.
그런데 프로젝트 구성원을 지정할 때 여러 구성원을 지정한 다음 삽입하고 싶은데… 시행착오 끝에 방법을 찾았습니다.
아니요
- 사용자 ID: (20,21)
role_ids는 개체의 배열로 전달되므로 배열로도 전달합니다.아니요
{
"membership":
{
"user_id": (20, 21),
"role_ids": ( 4 , 5)
}
}
- 회원* 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번 삽입되었음을 알 수 있다.
데이터 베이스

붉은 광석 데이터베이스


매우 자랑스럽습니다…
신나는..

