Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,4 @@ out/
.vscode/

/src/main/resources/global-bundle.pem
/src/main/resources/devlink-key.pem
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.mtvs.devlinkbackend.character.controller;

import com.mtvs.devlinkbackend.character.dto.response.UserCharacterListResponseDTO;
import com.mtvs.devlinkbackend.character.dto.response.UserCharacterSingleResponseDTO;
import com.mtvs.devlinkbackend.character.service.UserCharacterViewService;
import com.mtvs.devlinkbackend.util.JwtUtil;
Expand All @@ -24,11 +23,12 @@ public UserCharacterQueryController(JwtUtil jwtUtil, UserCharacterViewService us
@Operation(summary = "캐릭터 조회", description = "캐릭터 ID로 캐릭터를 조회합니다.")
@ApiResponse(responseCode = "200", description = "캐릭터가 성공적으로 조회되었습니다.")
@ApiResponse(responseCode = "404", description = "해당 계정 ID로 캐릭터를 찾을 수 없습니다.")
@GetMapping("/{characterId}")
@GetMapping
public ResponseEntity<UserCharacterSingleResponseDTO> getCharacterByCharacterId(
@PathVariable(name = "characterId") Long characterId) throws Exception {
@RequestHeader(name = "Authorization") String authorizationHeader) throws Exception {

UserCharacterSingleResponseDTO userCharacter = userCharacterViewService.findCharacterByCharacterId(characterId);
String accountId = jwtUtil.getSubjectFromAuthHeaderWithoutAuth(authorizationHeader);
UserCharacterSingleResponseDTO userCharacter = userCharacterViewService.findCharacterByAccountId(accountId);
if (userCharacter == null) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.mtvs.devlinkbackend.member.entity;

public enum AcceptStatus {
DELETED(0),
PENDING(1), // 대기중
ACCEPTED(2), // 수락
REJECTED(3); // 거절

private final int value;

AcceptStatus(int value) {
this.value = value;
}

public int getValue() {
return value;
}

// Integer 값에서 Enum으로 변환하는 메소드
public static AcceptStatus fromValue(int value) {
for (AcceptStatus status : AcceptStatus.values()) {
if (status.getValue() == value) {
return status;
}
}
throw new IllegalArgumentException("Invalid value: " + value);
}
}
55 changes: 55 additions & 0 deletions src/main/java/com/mtvs/devlinkbackend/member/entity/Member.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.mtvs.devlinkbackend.member.entity;

import com.mtvs.devlinkbackend.util.converter.AcceptStatusConverter;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.time.LocalDateTime;

@Table(name = "MEMBER")
@Entity(name = "Member")
@Getter
@NoArgsConstructor
@ToString
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MEMBER_ID")
private Long memberId;

@Column(name = "TYPE")
private String type;

@Column(name = "ASSIGNEES_ID")
private Long assigneesId;

@Column(name = "USER_ID")
private Long userId;

@Column(name = "MOTIVE")
private String motive;

@Column(name = "IS_ACCEPTED")
@Convert(converter = AcceptStatusConverter.class)
private AcceptStatus isAccepted;

@CreationTimestamp
@Column(name = "CREATED_AT", updatable = false)
private LocalDateTime createdAt;

@UpdateTimestamp
@Column(name = "MODIFIED_AT")
private LocalDateTime modifiedAt;

public Member(String type, Long assigneesId, Long userId, String motive, AcceptStatus isAccepted) {
this.type = type;
this.assigneesId = assigneesId;
this.userId = userId;
this.motive = motive;
this.isAccepted = isAccepted;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.mtvs.devlinkbackend.member.repository;

import com.mtvs.devlinkbackend.member.entity.Member;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface MemberRepository extends JpaRepository<Member, Long> {
void deleteMembersByMemberIdIn(List<Long> memberIdList);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.mtvs.devlinkbackend.member.repository;

import com.mtvs.devlinkbackend.member.entity.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface MemberViewRepository extends JpaRepository<Member, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.mtvs.devlinkbackend.member.service;

import com.mtvs.devlinkbackend.member.entity.Member;
import com.mtvs.devlinkbackend.member.repository.MemberRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class MemberService {
private final MemberRepository memberRepository;

public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}

@Transactional
public void registAll(List<Member> memberList) {
memberRepository.saveAll(memberList);
}

@Transactional
public void deleteAll(List<Long> memberIdList) {
memberRepository.deleteMembersByMemberIdIn(memberIdList);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.mtvs.devlinkbackend.member.service;

import org.springframework.stereotype.Service;

@Service
public class MemberViewService {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package com.mtvs.devlinkbackend.team.controller;

import com.mtvs.devlinkbackend.team.dto.request.TeamMemberModifyRequestDTO;
import com.mtvs.devlinkbackend.team.dto.request.TeamRegistRequestDTO;
import com.mtvs.devlinkbackend.team.dto.request.TeamUpdateRequestDTO;
import com.mtvs.devlinkbackend.team.dto.response.TeamSingleReponseDTO;
import com.mtvs.devlinkbackend.team.service.TeamService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/team")
public class TeamCommandController {

private final TeamService teamService;

public TeamCommandController(TeamService teamService) {
this.teamService = teamService;
}

@Operation(summary = "팀 등록", description = "새로운 팀을 등록하고 등록된 팀 정보를 반환합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "201", description = "팀이 성공적으로 등록되었습니다."),
@ApiResponse(responseCode = "400", description = "잘못된 입력 데이터입니다.")
})
@PostMapping
public ResponseEntity<TeamSingleReponseDTO> registTeam(
@RequestBody TeamRegistRequestDTO teamRegistRequestDTO) {

TeamSingleReponseDTO team = teamService.registTeam(teamRegistRequestDTO);
return new ResponseEntity<>(team, HttpStatus.CREATED);
}

@Operation(summary = "팀 업데이트", description = "기존 팀을 업데이트하고 업데이트된 팀 정보를 반환합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "팀이 성공적으로 업데이트되었습니다."),
@ApiResponse(responseCode = "400", description = "잘못된 입력 데이터 또는 권한이 없는 접근입니다."),
@ApiResponse(responseCode = "404", description = "팀을 찾을 수 없습니다.")
})
@PatchMapping
public ResponseEntity<TeamSingleReponseDTO> updateTeam(
@RequestBody TeamUpdateRequestDTO teamUpdateRequestDTO) {

try {
TeamSingleReponseDTO updatedTeam = teamService.updateTeam(teamUpdateRequestDTO);
return ResponseEntity.ok(updatedTeam);
} catch (IllegalArgumentException e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
}
}

@Operation(summary = "팀 멤버 지원", description = "팀에 멤버로 지원합니다.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "성공적으로 추가되었습니다."),
@ApiResponse(responseCode = "403", description = "추가 권한이 없습니다."),
@ApiResponse(responseCode = "404", description = "팀을 찾을 수 없습니다.")
})
@PatchMapping("/apply")
public ResponseEntity<TeamSingleReponseDTO> addMemberToTeam(
@RequestBody TeamMemberModifyRequestDTO teamMemberModifyRequestDTO) {

TeamSingleReponseDTO updatedTeam = teamService.applyMemberToTeam(teamMemberModifyRequestDTO);
return updatedTeam != null ? ResponseEntity.ok(updatedTeam) : ResponseEntity.notFound().build();
}

@Operation(summary = "팀에서 멤버 제거 ", description = "길드에서 멤버를 제거합니다.")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "멤버가 성공적으로 제거되었습니다."),
@ApiResponse(responseCode = "403", description = "제거 권한이 없습니다."),
@ApiResponse(responseCode = "404", description = "팀을 찾을 수 없습니다.")
})
@PatchMapping("/remove")
public ResponseEntity<TeamSingleReponseDTO> removeMemberFromTeam(
@RequestBody TeamMemberModifyRequestDTO teamMemberModifyRequestDTO) throws Exception {

TeamSingleReponseDTO updatedTeam = teamService.removeMemberToTeam(teamMemberModifyRequestDTO);
return updatedTeam != null ? ResponseEntity.ok(updatedTeam) : ResponseEntity.notFound().build();
}

@Operation(summary = "팀 삭제", description = "ID를 통해 팀을 삭제합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "204", description = "팀이 성공적으로 삭제되었습니다."),
@ApiResponse(responseCode = "404", description = "팀을 찾을 수 없습니다.")
})
@DeleteMapping("/{teamId}")
public ResponseEntity<Void> deleteTeam(@PathVariable Long teamId) {
teamService.deleteTeam(teamId);
return ResponseEntity.noContent().build();
}
}
Loading