레드마인에서는 사용자(user)와 구성원(member)으로 나뉜다.
사용자는 레드마인에 접속하는 유저를 의미하고, 구성원은 각 프로젝트별로 할당된 사용자를 의미한다.
그러니까 프로젝트에 사용자가 접근할 수 있도록, 해당 프로젝트의 구성원으로 등록해야 하는 것이다. (^^..)
레드마인 API 문서에서는 단일 구성원을 선택했을 경우에 대한 예시만 나와있었다.
그런데 나는 프로젝트의 구성원을 지정 시, 구성원을 여러명 지정하여 insert 하고 싶었다... ㅎ 이런저런 시행착오 끝에 방법을 찾아냈다.
안됨
- user_id : [20,21]
role_ids는 객체 배열로 넘겨주길래 나도 배열로 넘여줬다. 안됨
{
"membership":
{
"user_id": [20, 21],
"role_ids": [ 4 , 5]
}
}
- 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
뿌듯해..
짜릿해..
'🏰 Back-end' 카테고리의 다른 글
[SonarQube] Local 환경에서 정적분석 돌려보기 (SonarQube 설치 및 구동) (0) | 2023.07.09 |
---|---|
[MariaDB] 에폭 타임 형태의 TEXT 데이터를 date 타입으로 변환 (1) | 2023.06.11 |
Dump Data insert(=import) (0) | 2023.04.09 |
[Redmine API] webclient를 이용하여 api 서버에서 레드마인 api로 파일 업로드 (0) | 2023.02.18 |
[Docker] 로컬 PC에서 mariaDB container로 접속하기 (0) | 2023.01.27 |
댓글