diff --git a/src/main/java/in/koreatech/koin/admin/member/controller/AdminMemberApi.java b/src/main/java/in/koreatech/koin/admin/member/controller/AdminMemberApi.java deleted file mode 100644 index 332f91a0e7..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/controller/AdminMemberApi.java +++ /dev/null @@ -1,132 +0,0 @@ -package in.koreatech.koin.admin.member.controller; - -import static in.koreatech.koin.admin.history.enums.DomainType.MEMBERS; -import static in.koreatech.koin.domain.user.model.UserType.ADMIN; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; - -import in.koreatech.koin.admin.history.aop.AdminActivityLogging; -import in.koreatech.koin.admin.member.dto.AdminMemberRequest; -import in.koreatech.koin.admin.member.dto.AdminMemberResponse; -import in.koreatech.koin.admin.member.dto.AdminMembersResponse; -import in.koreatech.koin.admin.member.enums.TrackTag; -import in.koreatech.koin.global.auth.Auth; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; - -@Tag(name = "(Admin) AdminMember: BCSDLab 회원", description = "관리자 권한으로 BCSDLab 회원 정보를 관리한다") -public interface AdminMemberApi { - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "페이지별 BCSDLab 회원 리스트 조회") - @SecurityRequirement(name = "Jwt Authentication") - @GetMapping("/admin/members") - ResponseEntity getMembers( - @RequestParam(name = "page", defaultValue = "1") Integer page, - @RequestParam(name = "limit", defaultValue = "50", required = false) Integer limit, - @RequestParam(name = "track") TrackTag track, - @RequestParam(name = "is_deleted", defaultValue = "false") Boolean isDeleted, - @Auth(permit = {ADMIN}) Integer adminId - ); - - @ApiResponses( - value = { - @ApiResponse(responseCode = "201"), - @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "BCSDLab 회원 생성") - @SecurityRequirement(name = "Jwt Authentication") - @PostMapping("/admin/members") - @AdminActivityLogging(domain = MEMBERS) - ResponseEntity createMember( - @RequestBody @Valid AdminMemberRequest request, - @Auth(permit = {ADMIN}) Integer adminId - ); - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - @ApiResponse(responseCode = "401", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "BCSDLab 회원 조회") - @SecurityRequirement(name = "Jwt Authentication") - @GetMapping("/admin/members/{id}") - ResponseEntity getMember( - @PathVariable("id") Integer memberId, - @Auth(permit = {ADMIN}) Integer adminId - ); - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - @ApiResponse(responseCode = "401", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "BCSDLab 회원 삭제") - @SecurityRequirement(name = "Jwt Authentication") - @DeleteMapping("/admin/members/{id}") - @AdminActivityLogging(domain = MEMBERS, domainIdParam = "memberId") - ResponseEntity deleteMember( - @PathVariable("id") Integer memberId, - @Auth(permit = {ADMIN}) Integer adminId - ); - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - @ApiResponse(responseCode = "401", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "BCSDLab 회원 수정") - @SecurityRequirement(name = "Jwt Authentication") - @PutMapping("/admin/members/{id}") - @AdminActivityLogging(domain = MEMBERS, domainIdParam = "memberId") - ResponseEntity updateMember( - @PathVariable("id") Integer memberId, - @RequestBody @Valid AdminMemberRequest request, - @Auth(permit = {ADMIN}) Integer adminId - ); - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - @ApiResponse(responseCode = "401", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "BCSDLab 회원 삭제 취소") - @SecurityRequirement(name = "Jwt Authentication") - @PostMapping("/admin/members/{id}/undelete") - @AdminActivityLogging(domain = MEMBERS, domainIdParam = "memberId") - ResponseEntity undeleteMember( - @PathVariable("id") Integer memberId, - @Auth(permit = {ADMIN}) Integer adminId - ); -} diff --git a/src/main/java/in/koreatech/koin/admin/member/controller/AdminMemberController.java b/src/main/java/in/koreatech/koin/admin/member/controller/AdminMemberController.java deleted file mode 100644 index b715d7eee5..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/controller/AdminMemberController.java +++ /dev/null @@ -1,92 +0,0 @@ -package in.koreatech.koin.admin.member.controller; - -import static in.koreatech.koin.admin.history.enums.DomainType.MEMBERS; -import static in.koreatech.koin.domain.user.model.UserType.ADMIN; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import in.koreatech.koin.admin.history.aop.AdminActivityLogging; -import in.koreatech.koin.admin.member.dto.AdminMemberRequest; -import in.koreatech.koin.admin.member.dto.AdminMemberResponse; -import in.koreatech.koin.admin.member.dto.AdminMembersResponse; -import in.koreatech.koin.admin.member.enums.TrackTag; -import in.koreatech.koin.admin.member.service.AdminMemberService; -import in.koreatech.koin.global.auth.Auth; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class AdminMemberController implements AdminMemberApi { - - private final AdminMemberService adminMemberService; - - @GetMapping("/admin/members") - public ResponseEntity getMembers( - @RequestParam(name = "page", defaultValue = "1") Integer page, - @RequestParam(name = "limit", defaultValue = "50", required = false) Integer limit, - @RequestParam(name = "track") TrackTag track, - @RequestParam(name = "is_deleted", defaultValue = "false") Boolean isDeleted, - @Auth(permit = {ADMIN}) Integer adminId - ) { - return ResponseEntity.ok().body(adminMemberService.getMembers(page, limit, track, isDeleted)); - } - - @PostMapping("/admin/members") - @AdminActivityLogging(domain = MEMBERS) - public ResponseEntity createMember( - @RequestBody @Valid AdminMemberRequest request, - @Auth(permit = {ADMIN}) Integer adminId - ) { - adminMemberService.createMember(request); - return ResponseEntity.status(HttpStatus.CREATED).build(); - } - - @GetMapping("/admin/members/{id}") - public ResponseEntity getMember( - @PathVariable("id") Integer memberId, - @Auth(permit = {ADMIN}) Integer adminId - ) { - return ResponseEntity.ok().body(adminMemberService.getMember(memberId)); - } - - @DeleteMapping("/admin/members/{id}") - @AdminActivityLogging(domain = MEMBERS, domainIdParam = "memberId") - public ResponseEntity deleteMember( - @PathVariable("id") Integer memberId, - @Auth(permit = {ADMIN}) Integer adminId - ) { - adminMemberService.deleteMember(memberId); - return ResponseEntity.ok().build(); - } - - @PutMapping("/admin/members/{id}") - @AdminActivityLogging(domain = MEMBERS, domainIdParam = "memberId") - public ResponseEntity updateMember( - @PathVariable("id") Integer memberId, - @RequestBody @Valid AdminMemberRequest request, - @Auth(permit = {ADMIN}) Integer adminId - ) { - adminMemberService.updateMember(memberId, request); - return ResponseEntity.ok().build(); - } - - @PostMapping("/admin/members/{id}/undelete") - @AdminActivityLogging(domain = MEMBERS, domainIdParam = "memberId") - public ResponseEntity undeleteMember( - @PathVariable("id") Integer memberId, - @Auth(permit = {ADMIN}) Integer adminId - ) { - adminMemberService.undeleteMember(memberId); - return ResponseEntity.ok().build(); - } -} diff --git a/src/main/java/in/koreatech/koin/admin/member/controller/AdminTrackApi.java b/src/main/java/in/koreatech/koin/admin/member/controller/AdminTrackApi.java deleted file mode 100644 index 94101dfdea..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/controller/AdminTrackApi.java +++ /dev/null @@ -1,175 +0,0 @@ -package in.koreatech.koin.admin.member.controller; - -import static in.koreatech.koin.admin.history.enums.DomainType.TECHSTACKS; -import static in.koreatech.koin.admin.history.enums.DomainType.TRACKS; -import static in.koreatech.koin.domain.user.model.UserType.ADMIN; - -import java.util.List; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; - -import in.koreatech.koin.admin.history.aop.AdminActivityLogging; -import in.koreatech.koin.admin.member.dto.AdminTechStackRequest; -import in.koreatech.koin.admin.member.dto.AdminTechStackResponse; -import in.koreatech.koin.admin.member.dto.AdminTrackRequest; -import in.koreatech.koin.admin.member.dto.AdminTrackResponse; -import in.koreatech.koin.admin.member.dto.AdminTrackSingleResponse; -import in.koreatech.koin.global.auth.Auth; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; - -@Tag(name = "(Admin) Track: BCSDLab 트랙", description = "관리자 권한으로 BCSDLab 트랙 정보를 관리한다") -public interface AdminTrackApi { - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - @ApiResponse(responseCode = "401", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "트랙 목록 조회") - @SecurityRequirement(name = "Jwt Authentication") - @GetMapping("/admin/tracks") - ResponseEntity> getTracks( - @Auth(permit = {ADMIN}) Integer adminId - ); - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - @ApiResponse(responseCode = "401", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "409", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "트랙 생성") - @SecurityRequirement(name = "Jwt Authentication") - @PostMapping("/admin/tracks") - @AdminActivityLogging(domain = TRACKS) - ResponseEntity createTrack( - @RequestBody @Valid AdminTrackRequest request, - @Auth(permit = {ADMIN}) Integer adminId - ); - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - @ApiResponse(responseCode = "401", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "트랙 단건 조회") - @SecurityRequirement(name = "Jwt Authentication") - @GetMapping("/admin/tracks/{id}") - ResponseEntity getTrack( - @PathVariable("id") Integer trackId, - @Auth(permit = {ADMIN}) Integer adminId - ); - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - @ApiResponse(responseCode = "401", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "409", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "트랙 수정") - @SecurityRequirement(name = "Jwt Authentication") - @PutMapping("/admin/tracks/{id}") - @AdminActivityLogging(domain = TRACKS, domainIdParam = "trackId") - ResponseEntity updateTrack( - @PathVariable("id") Integer trackId, - @RequestBody @Valid AdminTrackRequest request, - @Auth(permit = {ADMIN}) Integer adminId - ); - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - @ApiResponse(responseCode = "204", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "트랙 삭제") - @SecurityRequirement(name = "Jwt Authentication") - @DeleteMapping("/admin/tracks/{id}") - @AdminActivityLogging(domain = TRACKS, domainIdParam = "trackId") - ResponseEntity deleteTrack( - @PathVariable("id") Integer trackId, - @Auth(permit = {ADMIN}) Integer adminId - ); - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - @ApiResponse(responseCode = "401", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "기술스택 생성") - @SecurityRequirement(name = "Jwt Authentication") - @PostMapping("/admin/techStacks") - @AdminActivityLogging(domain = TECHSTACKS) - ResponseEntity createTechStack( - @RequestBody @Valid AdminTechStackRequest request, - @RequestParam(value = "trackName") String trackName, - @Auth(permit = {ADMIN}) Integer adminId - ); - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - @ApiResponse(responseCode = "401", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "기술스택 수정") - @SecurityRequirement(name = "Jwt Authentication") - @PutMapping("/admin/techStacks/{id}") - @AdminActivityLogging(domain = TECHSTACKS, domainIdParam = "techStackId") - ResponseEntity updateTechStack( - @RequestBody @Valid AdminTechStackRequest request, - @RequestParam(value = "trackName") String trackName, - @PathVariable("id") Integer techStackId, - @Auth(permit = {ADMIN}) Integer adminId - ); - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - @ApiResponse(responseCode = "204", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "401", content = @Content(schema = @Schema(hidden = true))), - @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "기술스택 삭제") - @SecurityRequirement(name = "Jwt Authentication") - @DeleteMapping("/admin/techStacks/{id}") - @AdminActivityLogging(domain = TECHSTACKS, domainIdParam = "techStackId") - ResponseEntity deleteTechStack( - @PathVariable("id") Integer techStackId, - @Auth(permit = {ADMIN}) Integer adminId - ); -} diff --git a/src/main/java/in/koreatech/koin/admin/member/controller/AdminTrackController.java b/src/main/java/in/koreatech/koin/admin/member/controller/AdminTrackController.java deleted file mode 100644 index fb3324a319..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/controller/AdminTrackController.java +++ /dev/null @@ -1,116 +0,0 @@ -package in.koreatech.koin.admin.member.controller; - -import static in.koreatech.koin.admin.history.enums.DomainType.TECHSTACKS; -import static in.koreatech.koin.admin.history.enums.DomainType.TRACKS; -import static in.koreatech.koin.domain.user.model.UserType.ADMIN; - -import java.util.List; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import in.koreatech.koin.admin.history.aop.AdminActivityLogging; -import in.koreatech.koin.admin.member.dto.AdminTechStackRequest; -import in.koreatech.koin.admin.member.dto.AdminTechStackResponse; -import in.koreatech.koin.admin.member.dto.AdminTrackRequest; -import in.koreatech.koin.admin.member.dto.AdminTrackResponse; -import in.koreatech.koin.admin.member.dto.AdminTrackSingleResponse; -import in.koreatech.koin.admin.member.service.AdminTrackService; -import in.koreatech.koin.global.auth.Auth; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class AdminTrackController implements AdminTrackApi { - - private final AdminTrackService adminTrackService; - - @GetMapping("/admin/tracks") - public ResponseEntity> getTracks( - @Auth(permit = {ADMIN}) Integer adminId - ) { - var response = adminTrackService.getTracks(); - return ResponseEntity.ok(response); - } - - @PostMapping("/admin/tracks") - @AdminActivityLogging(domain = TRACKS) - public ResponseEntity createTrack( - @RequestBody @Valid AdminTrackRequest request, - @Auth(permit = {ADMIN}) Integer adminId - ) { - var response = adminTrackService.createTrack(request); - return ResponseEntity.ok(response); - } - - @GetMapping("/admin/tracks/{id}") - public ResponseEntity getTrack( - @PathVariable("id") Integer trackId, - @Auth(permit = {ADMIN}) Integer adminId - ) { - var response = adminTrackService.getTrack(trackId); - return ResponseEntity.ok(response); - } - - @PutMapping("/admin/tracks/{id}") - @AdminActivityLogging(domain = TRACKS, domainIdParam = "trackId") - public ResponseEntity updateTrack( - @PathVariable("id") Integer trackId, - @RequestBody @Valid AdminTrackRequest request, - @Auth(permit = {ADMIN}) Integer adminId - ) { - var response = adminTrackService.updateTrack(trackId, request); - return ResponseEntity.ok(response); - } - - @DeleteMapping("/admin/tracks/{id}") - @AdminActivityLogging(domain = TRACKS, domainIdParam = "trackId") - public ResponseEntity deleteTrack( - @PathVariable("id") Integer trackId, - @Auth(permit = {ADMIN}) Integer adminId - ) { - adminTrackService.deleteTrack(trackId); - return ResponseEntity.ok().build(); - } - - @PostMapping("/admin/techStacks") - @AdminActivityLogging(domain = TECHSTACKS) - public ResponseEntity createTechStack( - @RequestBody @Valid AdminTechStackRequest request, - @RequestParam String trackName, - @Auth(permit = {ADMIN}) Integer adminId - ) { - var response = adminTrackService.createTechStack(request, trackName); - return ResponseEntity.ok(response); - } - - @PutMapping("/admin/techStacks/{id}") - @AdminActivityLogging(domain = TECHSTACKS, domainIdParam = "techStackId") - public ResponseEntity updateTechStack( - @RequestBody @Valid AdminTechStackRequest request, - @RequestParam String trackName, - @PathVariable("id") Integer techStackId, - @Auth(permit = {ADMIN}) Integer adminId - ) { - var response = adminTrackService.updateTechStack(request, trackName, techStackId); - return ResponseEntity.ok(response); - } - - @DeleteMapping("/admin/techStacks/{id}") - @AdminActivityLogging(domain = TECHSTACKS, domainIdParam = "techStackId") - public ResponseEntity deleteTechStack( - @PathVariable("id") Integer techStackId, - @Auth(permit = {ADMIN}) Integer adminId - ) { - adminTrackService.deleteTechStack(techStackId); - return ResponseEntity.ok().build(); - } -} diff --git a/src/main/java/in/koreatech/koin/admin/member/dto/AdminMemberRequest.java b/src/main/java/in/koreatech/koin/admin/member/dto/AdminMemberRequest.java deleted file mode 100644 index 015a9aa0b4..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/dto/AdminMemberRequest.java +++ /dev/null @@ -1,55 +0,0 @@ -package in.koreatech.koin.admin.member.dto; - -import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; - -import com.fasterxml.jackson.databind.annotation.JsonNaming; - -import in.koreatech.koin.domain.member.model.Member; -import in.koreatech.koin.domain.member.model.Track; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; -import jakarta.validation.constraints.Size; - -@JsonNaming(value = SnakeCaseStrategy.class) -public record AdminMemberRequest( - @NotNull(message = "이름은 필수입니다.") - @Size(max = 50, message = "이름의 길이는 최대 50자입니다.") - @Schema(description = "이름", example = "김주원", requiredMode = REQUIRED) - String name, - - @Size(max = 10, message = "학번의 길이는 최대 10자입니다.") - @Schema(description = "소속 트랙", example = "2019136037") - String studentNumber, - - @NotNull(message = "트랙은 필수입니다.") - @Pattern(regexp = "^(Android|BackEnd|FrontEnd|Game|UI\\/UX|HR|iOS|P&M)$", message = "트랙의 형식이 올바르지 않습니다.") - @Schema(description = "고유 id", example = "BackEnd", requiredMode = REQUIRED) - String track, - - @NotNull(message = "직급은 필수입니다.") - @Pattern(regexp = "^(Mentor|Regular)$", message = "직급의 형식이 올바르지 않습니다.") - @Schema(description = "직급", example = "Regular", requiredMode = REQUIRED) - String position, - - @Email(message = "이메일의 길이는 최대 100자입니다.") - @Schema(description = "이메일", example = "damiano102777@naver.com") - String email, - - @Size(max = 65535, message = "이미지 링크의 길이는 최대 65535자입니다.") - @Schema(description = "이미지 링크", example = "https://example.com") - String imageUrl -) { - public Member toMember(Track track) { - return Member.builder() - .name(name) - .studentNumber(studentNumber) - .track(track) - .position(position) - .email(email) - .imageUrl(imageUrl) - .build(); - } -} diff --git a/src/main/java/in/koreatech/koin/admin/member/dto/AdminMemberResponse.java b/src/main/java/in/koreatech/koin/admin/member/dto/AdminMemberResponse.java deleted file mode 100644 index b73a371acf..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/dto/AdminMemberResponse.java +++ /dev/null @@ -1,49 +0,0 @@ -package in.koreatech.koin.admin.member.dto; - -import static com.fasterxml.jackson.databind.PropertyNamingStrategies.*; -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; - -import com.fasterxml.jackson.databind.annotation.JsonNaming; - -import in.koreatech.koin.domain.member.model.Member; -import io.swagger.v3.oas.annotations.media.Schema; - -@JsonNaming(value = SnakeCaseStrategy.class) -public record AdminMemberResponse( - @Schema(description = "고유 id", example = "1", requiredMode = REQUIRED) - Integer id, - - @Schema(description = "이름", example = "김주원", requiredMode = REQUIRED) - String name, - - @Schema(description = "학번", example = "2019136037") - String studentNumber, - - @Schema(description = "트랙 이름", example = "BackEnd", requiredMode = REQUIRED) - String track, - - @Schema(description = "직책", example = "Regular", requiredMode = REQUIRED) - String position, - - @Schema(description = "이메일", example = "damiano102777@naver.com") - String email, - - @Schema(description = "이미지 url", example = "https://static.koreatech.in/test.png") - String imageUrl, - - @Schema(description = "삭제(soft delete) 여부", example = "false", requiredMode = REQUIRED) - boolean isDeleted -) { - public static AdminMemberResponse from(Member member) { - return new AdminMemberResponse( - member.getId(), - member.getName(), - member.getStudentNumber(), - member.getTrack() != null ? member.getTrack().getName() : null, - member.getPosition(), - member.getEmail(), - member.getImageUrl(), - member.isDeleted() - ); - } -} diff --git a/src/main/java/in/koreatech/koin/admin/member/dto/AdminMembersResponse.java b/src/main/java/in/koreatech/koin/admin/member/dto/AdminMembersResponse.java deleted file mode 100644 index 8fd942268b..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/dto/AdminMembersResponse.java +++ /dev/null @@ -1,86 +0,0 @@ -package in.koreatech.koin.admin.member.dto; - -import static com.fasterxml.jackson.databind.PropertyNamingStrategies.*; -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; - -import java.util.List; -import java.util.stream.Collectors; - -import org.springframework.data.domain.Page; - -import com.fasterxml.jackson.databind.annotation.JsonNaming; - -import in.koreatech.koin.domain.member.model.Member; -import in.koreatech.koin.common.model.Criteria; -import io.swagger.v3.oas.annotations.media.Schema; - -@JsonNaming(value = SnakeCaseStrategy.class) -public record AdminMembersResponse( - @Schema(description = "조건에 해당하는 총 회원의 수", example = "57", requiredMode = REQUIRED) - Long totalCount, - - @Schema(description = "조건에 해당하는 회원 중에 현재 페이지에서 조회된 수", example = "10", requiredMode = REQUIRED) - Integer currentCount, - - @Schema(description = "조건에 해당하는 회원들을 조회할 수 있는 최대 페이지", example = "6", requiredMode = REQUIRED) - Integer totalPage, - - @Schema(description = "현재 페이지", example = "2", requiredMode = REQUIRED) - Integer currentPage, - - @Schema(description = "회원 정보 리스트", requiredMode = REQUIRED) - List members -) { - public static AdminMembersResponse of(Page pagedResult, Criteria criteria) { - return new AdminMembersResponse( - pagedResult.getTotalElements(), - pagedResult.getContent().size(), - pagedResult.getTotalPages(), - criteria.getPage() + 1, - pagedResult.getContent() - .stream() - .map(SimpleMemberInformation::from) - .collect(Collectors.toList()) - ); - } - @JsonNaming(value = SnakeCaseStrategy.class) - private record SimpleMemberInformation( - @Schema(description = "고유 id", example = "1", requiredMode = REQUIRED) - Integer id, - - @Schema(description = "이름", example = "김주원", requiredMode = REQUIRED) - String name, - - @Schema(description = "학번", example = "2019136037") - String studentNumber, - - @Schema(description = "트랙 이름", example = "BackEnd", requiredMode = REQUIRED) - String track, - - @Schema(description = "직책", example = "Regular", requiredMode = REQUIRED) - String position, - - @Schema(description = "이메일", example = "damiano102777@naver.com") - String email, - - @Schema(description = "이미지 url", example = "https://static.koreatech.in/test.png") - String imageUrl, - - @Schema(description = "삭제(soft delete) 여부", example = "false", requiredMode = REQUIRED) - boolean isDeleted - ) { - - public static SimpleMemberInformation from(Member member) { - return new SimpleMemberInformation( - member.getId(), - member.getName(), - member.getStudentNumber(), - member.getTrack().getName(), - member.getPosition(), - member.getEmail(), - member.getImageUrl(), - member.isDeleted() - ); - } - } -} diff --git a/src/main/java/in/koreatech/koin/admin/member/dto/AdminTechStackRequest.java b/src/main/java/in/koreatech/koin/admin/member/dto/AdminTechStackRequest.java deleted file mode 100644 index 1643ef943e..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/dto/AdminTechStackRequest.java +++ /dev/null @@ -1,37 +0,0 @@ -package in.koreatech.koin.admin.member.dto; - -import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; - -import com.fasterxml.jackson.databind.annotation.JsonNaming; - -import in.koreatech.koin.domain.member.model.TechStack; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; - -@JsonNaming(SnakeCaseStrategy.class) -public record AdminTechStackRequest( - @Schema(description = "이미지 링크", example = "http://url.com") - String imageUrl, - - @Schema(description = "기술 스택명", example = "Spring", requiredMode = REQUIRED) - @NotBlank(message = "기술 스택명은 비워둘 수 없습니다.") - String name, - - @Schema(description = "기술 스택 설명", example = "스프링은 웹 프레임워크이다") - String description, - - @Schema(description = "삭제 여부", example = "false") - boolean isDeleted -) { - - public TechStack toEntity(Integer trackId) { - return TechStack.builder() - .imageUrl(imageUrl) - .trackId(trackId) - .name(name) - .description(description) - .isDeleted(isDeleted) - .build(); - } -} diff --git a/src/main/java/in/koreatech/koin/admin/member/dto/AdminTechStackResponse.java b/src/main/java/in/koreatech/koin/admin/member/dto/AdminTechStackResponse.java deleted file mode 100644 index 3562d76354..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/dto/AdminTechStackResponse.java +++ /dev/null @@ -1,56 +0,0 @@ -package in.koreatech.koin.admin.member.dto; - -import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; - -import java.time.LocalDateTime; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.databind.annotation.JsonNaming; - -import in.koreatech.koin.domain.member.model.TechStack; -import io.swagger.v3.oas.annotations.media.Schema; - -@JsonNaming(SnakeCaseStrategy.class) -public record AdminTechStackResponse( - - @Schema(description = "기술스택 고유 ID", example = "1", requiredMode = REQUIRED) - Integer id, - - @Schema(description = "이미지 링크", example = "http://url.com", requiredMode = REQUIRED) - String imageUrl, - - @Schema(description = "기술 스택명", example = "Spring", requiredMode = REQUIRED) - String name, - - @Schema(description = "기술 스택 설명", example = "스프링은 웹 프레임워크이다", requiredMode = REQUIRED) - String description, - - @Schema(description = "트랙 고유 ID", example = "2", requiredMode = REQUIRED) - Integer trackId, - - @Schema(description = "삭제 여부", example = "false", requiredMode = REQUIRED) - Boolean isDeleted, - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "생성 일자", example = "2024-01-15 12:00:00", requiredMode = REQUIRED) - LocalDateTime createdAt, - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "수정 일자", example = "2024-01-15 12:00:00", requiredMode = REQUIRED) - LocalDateTime updatedAt -) { - - public static AdminTechStackResponse from(TechStack techStack) { - return new AdminTechStackResponse( - techStack.getId(), - techStack.getImageUrl(), - techStack.getName(), - techStack.getDescription(), - techStack.getTrackId(), - techStack.isDeleted(), - techStack.getCreatedAt(), - techStack.getUpdatedAt() - ); - } -} diff --git a/src/main/java/in/koreatech/koin/admin/member/dto/AdminTrackRequest.java b/src/main/java/in/koreatech/koin/admin/member/dto/AdminTrackRequest.java deleted file mode 100644 index cbe9b6e1a0..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/dto/AdminTrackRequest.java +++ /dev/null @@ -1,34 +0,0 @@ -package in.koreatech.koin.admin.member.dto; - -import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; - -import com.fasterxml.jackson.databind.annotation.JsonNaming; - -import in.koreatech.koin.domain.member.model.Track; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; - -@JsonNaming(SnakeCaseStrategy.class) -public record AdminTrackRequest( - @Schema(description = "트랙 명", example = "Backend", requiredMode = REQUIRED) - @NotBlank(message = "트랙명은 비워둘 수 없습니다.") - String name, - - @Schema(description = "인원 수", example = "15") - @NotNull(message = "인원 수는 비워둘 수 없습니다.") - Integer headcount, - - @Schema(description = "삭제 여부", example = "false") - boolean isDeleted -) { - - public Track toEntity() { - return Track.builder() - .name(name) - .headcount(headcount) - .isDeleted(isDeleted) - .build(); - } -} diff --git a/src/main/java/in/koreatech/koin/admin/member/dto/AdminTrackResponse.java b/src/main/java/in/koreatech/koin/admin/member/dto/AdminTrackResponse.java deleted file mode 100644 index db90979c45..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/dto/AdminTrackResponse.java +++ /dev/null @@ -1,47 +0,0 @@ -package in.koreatech.koin.admin.member.dto; - -import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; - -import java.time.LocalDateTime; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.databind.annotation.JsonNaming; - -import in.koreatech.koin.domain.member.model.Track; -import io.swagger.v3.oas.annotations.media.Schema; - -@JsonNaming(SnakeCaseStrategy.class) -public record AdminTrackResponse( - @Schema(description = "트랙 고유 ID", example = "1", requiredMode = REQUIRED) - Integer id, - - @Schema(description = "트랙 명", example = "Backend", requiredMode = REQUIRED) - String name, - - @Schema(description = "인원 수", example = "15", requiredMode = REQUIRED) - Integer headcount, - - @Schema(description = "삭제 여부", example = "false", requiredMode = REQUIRED) - Boolean isDeleted, - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "생성 일자", example = "2023-01-04 12:00:01", requiredMode = REQUIRED) - LocalDateTime createdAt, - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "수정 일자", example = "2023-01-04 12:00:01", requiredMode = REQUIRED) - LocalDateTime updatedAt -) { - - public static AdminTrackResponse from(Track track) { - return new AdminTrackResponse( - track.getId(), - track.getName(), - track.getHeadcount(), - track.isDeleted(), - track.getCreatedAt(), - track.getUpdatedAt() - ); - } -} diff --git a/src/main/java/in/koreatech/koin/admin/member/dto/AdminTrackSingleResponse.java b/src/main/java/in/koreatech/koin/admin/member/dto/AdminTrackSingleResponse.java deleted file mode 100644 index 13329280e6..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/dto/AdminTrackSingleResponse.java +++ /dev/null @@ -1,136 +0,0 @@ -package in.koreatech.koin.admin.member.dto; - -import static com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.NOT_REQUIRED; -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; - -import java.time.LocalDateTime; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonNaming; - -import in.koreatech.koin.domain.member.model.Member; -import in.koreatech.koin.domain.member.model.TechStack; -import in.koreatech.koin.domain.member.model.Track; -import io.swagger.v3.oas.annotations.media.Schema; - -@JsonNaming(SnakeCaseStrategy.class) -public record AdminTrackSingleResponse( - @JsonProperty("TrackName") - @Schema(description = "트랙 명", example = "Backend", requiredMode = REQUIRED) - String trackName, - - @JsonProperty("Members") - List innerMemberResponses, - - @JsonProperty("TechStacks") - List innerTechStackResponses -) { - - public static AdminTrackSingleResponse of(Track track, List members, List techStacks) { - return new AdminTrackSingleResponse( - track.getName(), - members.stream() - .map(member -> InnerMemberResponse.from(member, track.getName())) - .toList(), - techStacks.stream() - .map(InnerTechStackResponse::from) - .toList() - ); - } - - @JsonNaming(value = SnakeCaseStrategy.class) - private record InnerMemberResponse( - @Schema(description = "BCSD 회원 고유 ID", example = "1", requiredMode = REQUIRED) - Integer id, - - @Schema(description = "이름", example = "최준호", requiredMode = REQUIRED) - String name, - - @Schema(description = "학번", example = "2019136135", requiredMode = NOT_REQUIRED) - String studentNumber, - - @Schema(description = "동아리 포지션 `Beginner`, `Regular`, `Mentor`", example = "Regular", requiredMode = REQUIRED) - String position, - - @Schema(description = "트랙 명", example = "Backend", requiredMode = REQUIRED) - String track, - - @Schema(description = "이메일", example = "koin123@koreatech.ac.kr", requiredMode = NOT_REQUIRED) - String email, - - @Schema(description = "이미지 Url", example = "https://static.koreatech.in/example/image.png", requiredMode = NOT_REQUIRED) - String imageUrl, - - @Schema(description = "삭제 여부", example = "false", requiredMode = REQUIRED) - Boolean isDeleted, - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "생성 일자", example = "2023-01-04 12:00:01", requiredMode = REQUIRED) - LocalDateTime createdAt, - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "수정 일자", example = "2023-01-04 12:00:01", requiredMode = REQUIRED) - LocalDateTime updatedAt - ) { - - public static InnerMemberResponse from(Member member, String trackName) { - return new InnerMemberResponse( - member.getId(), - member.getName(), - member.getStudentNumber(), - member.getPosition(), - trackName, - member.getEmail(), - member.getImageUrl(), - member.isDeleted(), - member.getCreatedAt(), - member.getUpdatedAt() - ); - } - } - - @JsonNaming(value = SnakeCaseStrategy.class) - private record InnerTechStackResponse( - @Schema(description = "기술 스택 고유 ID", example = "1", requiredMode = REQUIRED) - Integer id, - - @Schema(description = "기술 이름", example = "Backend") - String name, - - @Schema(description = "기술 설명", example = "15") - String description, - - @Schema(description = "이미지 Url", example = "https://static.koreatech.in/example/image.png") - String imageUrl, - - @Schema(description = "트랙 ID", example = "1") - Integer trackId, - - @Schema(description = "삭제 여부", example = "false") - Boolean isDeleted, - - @Schema(description = "생성 일자", example = "2023-01-04 12:00:01") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime createdAt, - - @Schema(description = "수정 일자", example = "2023-01-04 12:00:01") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updatedAt - ) { - - public static InnerTechStackResponse from(TechStack techStack) { - return new InnerTechStackResponse( - techStack.getId(), - techStack.getName(), - techStack.getDescription(), - techStack.getImageUrl(), - techStack.getTrackId(), - techStack.isDeleted(), - techStack.getCreatedAt(), - techStack.getUpdatedAt() - ); - } - } -} - diff --git a/src/main/java/in/koreatech/koin/admin/member/enums/TrackTag.java b/src/main/java/in/koreatech/koin/admin/member/enums/TrackTag.java deleted file mode 100644 index 62324c16c5..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/enums/TrackTag.java +++ /dev/null @@ -1,22 +0,0 @@ -package in.koreatech.koin.admin.member.enums; - -import lombok.Getter; - -@Getter -public enum TrackTag { - ANDROID("Android"), - BACKEND("BackEnd"), - FRONTEND("FrontEnd"), - GAME("Game"), - PM("P&M"), - HR("HR"), - UI_UX("UI/UX"), - IOS("iOS"), - ; - - private final String tag; - - TrackTag(String tag) { - this.tag = tag; - } -} diff --git a/src/main/java/in/koreatech/koin/admin/member/exception/TechStackNotFoundException.java b/src/main/java/in/koreatech/koin/admin/member/exception/TechStackNotFoundException.java deleted file mode 100644 index a9856c6dfe..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/exception/TechStackNotFoundException.java +++ /dev/null @@ -1,20 +0,0 @@ -package in.koreatech.koin.admin.member.exception; - -import in.koreatech.koin.global.exception.custom.DataNotFoundException; - -public class TechStackNotFoundException extends DataNotFoundException { - - private static final String DEFAULT_MESSAGE = "존재하지 않는 기술스택입니다."; - - protected TechStackNotFoundException(String message) { - super(message); - } - - protected TechStackNotFoundException(String message, String detail) { - super(message, detail); - } - - public static TechStackNotFoundException withDetail(String detail) { - return new TechStackNotFoundException(DEFAULT_MESSAGE, detail); - } -} diff --git a/src/main/java/in/koreatech/koin/admin/member/exception/TrackNameDuplicationException.java b/src/main/java/in/koreatech/koin/admin/member/exception/TrackNameDuplicationException.java deleted file mode 100644 index d47d2e49d6..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/exception/TrackNameDuplicationException.java +++ /dev/null @@ -1,20 +0,0 @@ -package in.koreatech.koin.admin.member.exception; - -import in.koreatech.koin.global.exception.custom.DuplicationException; - -public class TrackNameDuplicationException extends DuplicationException { - - private static final String DEFAULT_MESSAGE = "트랙명이 이미 존재합니다"; - - protected TrackNameDuplicationException(String message) { - super(message); - } - - protected TrackNameDuplicationException(String message, String detail) { - super(message, detail); - } - - public static TrackNameDuplicationException withDetail(String name) { - return new TrackNameDuplicationException(DEFAULT_MESSAGE, "name: " + name); - } -} diff --git a/src/main/java/in/koreatech/koin/admin/member/repository/AdminMemberRepository.java b/src/main/java/in/koreatech/koin/admin/member/repository/AdminMemberRepository.java deleted file mode 100644 index 4bd51b56fa..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/repository/AdminMemberRepository.java +++ /dev/null @@ -1,50 +0,0 @@ -package in.koreatech.koin.admin.member.repository; - -import java.util.List; -import java.util.Optional; - -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.EntityGraph; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.Repository; - -import in.koreatech.koin.domain.member.exception.MemberNotFoundException; -import in.koreatech.koin.domain.member.model.Member; -import org.springframework.data.repository.query.Param; - -public interface AdminMemberRepository extends Repository { - - @EntityGraph(attributePaths = {"track"}) - @Query("select m from Member m where m.track.name = :trackName and m.isDeleted = :isDeleted") - Page findAllByTrackAndIsDeleted( - @Param("trackName") String trackName, - @Param("isDeleted") Boolean isDeleted, - Pageable pageable); - - @EntityGraph(attributePaths = {"track"}) - @Query("select count(m) from Member m where m.track.name = :trackName and m.isDeleted = :isDeleted") - Integer countAllByTrackAndIsDeleted( - @Param("trackName") String trackName, - @Param("isDeleted") Boolean isDeleted); - - Member save(Member member); - - List findByTrackId(Integer id); - - @EntityGraph(attributePaths = {"track"}) - Optional findByName(String name); - - default Member getByName(String name) { - return findByName(name) - .orElseThrow(() -> MemberNotFoundException.withDetail("name: " + name)); - } - - @EntityGraph(attributePaths = {"track"}) - Optional findById(Integer id); - - default Member getById(Integer id) { - return findById(id) - .orElseThrow(() -> MemberNotFoundException.withDetail("id: " + id)); - } -} diff --git a/src/main/java/in/koreatech/koin/admin/member/repository/AdminTechStackRepository.java b/src/main/java/in/koreatech/koin/admin/member/repository/AdminTechStackRepository.java deleted file mode 100644 index 9ae8143173..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/repository/AdminTechStackRepository.java +++ /dev/null @@ -1,23 +0,0 @@ -package in.koreatech.koin.admin.member.repository; - -import java.util.List; -import java.util.Optional; - -import org.springframework.data.repository.Repository; - -import in.koreatech.koin.admin.member.exception.TechStackNotFoundException; -import in.koreatech.koin.domain.member.model.TechStack; - -public interface AdminTechStackRepository extends Repository { - - TechStack save(TechStack techStack); - - Optional findById(Integer id); - - List findAllByTrackId(Integer id); - - default TechStack getById(Integer id) { - return findById(id) - .orElseThrow(() -> TechStackNotFoundException.withDetail("id : " + id)); - } -} diff --git a/src/main/java/in/koreatech/koin/admin/member/repository/AdminTrackRepository.java b/src/main/java/in/koreatech/koin/admin/member/repository/AdminTrackRepository.java deleted file mode 100644 index 4477a2bbb7..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/repository/AdminTrackRepository.java +++ /dev/null @@ -1,30 +0,0 @@ -package in.koreatech.koin.admin.member.repository; - -import java.util.List; -import java.util.Optional; - -import org.springframework.data.repository.Repository; - -import in.koreatech.koin.domain.member.exception.TrackNotFoundException; -import in.koreatech.koin.domain.member.model.Track; - -public interface AdminTrackRepository extends Repository { - - Track save(Track track); - - List findAll(); - - Optional findById(Integer trackId); - - Optional findByName(String trackName); - - default Track getById(Integer trackId) { - return findById(trackId) - .orElseThrow(() -> TrackNotFoundException.withDetail("trackId: " + trackId)); - } - - default Track getByName(String trackName) { - return findByName(trackName) - .orElseThrow(() -> TrackNotFoundException.withDetail("name: " + trackName)); - } -} diff --git a/src/main/java/in/koreatech/koin/admin/member/service/AdminMemberService.java b/src/main/java/in/koreatech/koin/admin/member/service/AdminMemberService.java deleted file mode 100644 index b9740f8499..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/service/AdminMemberService.java +++ /dev/null @@ -1,76 +0,0 @@ -package in.koreatech.koin.admin.member.service; - -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Sort; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import in.koreatech.koin.admin.member.dto.AdminMemberRequest; -import in.koreatech.koin.admin.member.dto.AdminMemberResponse; -import in.koreatech.koin.admin.member.dto.AdminMembersResponse; -import in.koreatech.koin.admin.member.enums.TrackTag; -import in.koreatech.koin.admin.member.repository.AdminMemberRepository; -import in.koreatech.koin.admin.member.repository.AdminTrackRepository; -import in.koreatech.koin.domain.member.model.Member; -import in.koreatech.koin.domain.member.model.Track; -import in.koreatech.koin.common.model.Criteria; -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class AdminMemberService { - - private final AdminMemberRepository adminMemberRepository; - private final AdminTrackRepository adminTrackRepository; - - public AdminMembersResponse getMembers(Integer page, Integer limit, TrackTag track, Boolean isDeleted) { - Integer total = adminMemberRepository.countAllByTrackAndIsDeleted(track.getTag(), isDeleted); - - Criteria criteria = Criteria.of(page, limit, total); - PageRequest pageRequest = PageRequest.of(criteria.getPage(), criteria.getLimit(), - Sort.by(Sort.Direction.ASC, "id")); - - Page result = adminMemberRepository.findAllByTrackAndIsDeleted(track.getTag(), isDeleted, pageRequest); - - return AdminMembersResponse.of(result, criteria); - } - - @Transactional - public void createMember(AdminMemberRequest request) { - Track track = adminTrackRepository.getByName(request.track()); - Member member = request.toMember(track); - adminMemberRepository.save(member); - } - - public AdminMemberResponse getMember(Integer memberId) { - Member member = adminMemberRepository.getById(memberId); - return AdminMemberResponse.from(member); - } - - @Transactional - public void deleteMember(Integer memberId) { - Member member = adminMemberRepository.getById(memberId); - member.delete(); - } - - @Transactional - public void updateMember(Integer memberId, AdminMemberRequest request) { - Member member = adminMemberRepository.getById(memberId); - - String currentTrackName = member.getTrack().getName(); - String changedTrackName = request.track(); - if (!currentTrackName.equals(changedTrackName)) { - member.updateTrack(adminTrackRepository.getByName(request.track())); - } - - member.update(request.name(), request.studentNumber(), request.position(), request.email(), request.imageUrl()); - } - - @Transactional - public void undeleteMember(Integer memberId) { - Member member = adminMemberRepository.getById(memberId); - member.undelete(); - } -} diff --git a/src/main/java/in/koreatech/koin/admin/member/service/AdminTrackService.java b/src/main/java/in/koreatech/koin/admin/member/service/AdminTrackService.java deleted file mode 100644 index 57af6b991c..0000000000 --- a/src/main/java/in/koreatech/koin/admin/member/service/AdminTrackService.java +++ /dev/null @@ -1,99 +0,0 @@ -package in.koreatech.koin.admin.member.service; - -import java.util.List; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import in.koreatech.koin.admin.member.dto.AdminTechStackRequest; -import in.koreatech.koin.admin.member.dto.AdminTechStackResponse; -import in.koreatech.koin.admin.member.dto.AdminTrackRequest; -import in.koreatech.koin.admin.member.dto.AdminTrackResponse; -import in.koreatech.koin.admin.member.dto.AdminTrackSingleResponse; -import in.koreatech.koin.admin.member.exception.TrackNameDuplicationException; -import in.koreatech.koin.admin.member.repository.AdminMemberRepository; -import in.koreatech.koin.admin.member.repository.AdminTechStackRepository; -import in.koreatech.koin.admin.member.repository.AdminTrackRepository; -import in.koreatech.koin.domain.member.model.Member; -import in.koreatech.koin.domain.member.model.TechStack; -import in.koreatech.koin.domain.member.model.Track; -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class AdminTrackService { - - private final AdminTrackRepository adminTrackRepository; - private final AdminMemberRepository adminMemberRepository; - private final AdminTechStackRepository adminTechStackRepository; - - public List getTracks() { - return adminTrackRepository.findAll().stream() - .map(AdminTrackResponse::from) - .toList(); - } - - @Transactional - public AdminTrackResponse createTrack(AdminTrackRequest request) { - if (adminTrackRepository.findByName(request.name()).isPresent()) { - throw TrackNameDuplicationException.withDetail("name: " + request.name()); - } - Track track = request.toEntity(); - Track savedTrack = adminTrackRepository.save(track); - return AdminTrackResponse.from(savedTrack); - } - - public AdminTrackSingleResponse getTrack(Integer trackId) { - Track track = adminTrackRepository.getById(trackId); - List members = adminMemberRepository.findByTrackId(trackId); - List techStacks = adminTechStackRepository.findAllByTrackId(trackId); - return AdminTrackSingleResponse.of(track, members, techStacks); - } - - @Transactional - public AdminTrackResponse updateTrack(Integer trackId, AdminTrackRequest request) { - if (adminTrackRepository.findByName(request.name()).isPresent()) { - throw TrackNameDuplicationException.withDetail("name: " + request.name()); - } - Track track = adminTrackRepository.getById(trackId); - track.update(request.name(), request.headcount(), request.isDeleted()); - return AdminTrackResponse.from(track); - } - - @Transactional - public void deleteTrack(Integer trackId) { - Track track = adminTrackRepository.getById(trackId); - track.delete(); - } - - @Transactional - public AdminTechStackResponse createTechStack(AdminTechStackRequest request, String trackName) { - Track track = adminTrackRepository.getByName(trackName); - TechStack techStack = request.toEntity(track.getId()); - TechStack savedTechStack = adminTechStackRepository.save(techStack); - return AdminTechStackResponse.from(savedTechStack); - } - - @Transactional - public AdminTechStackResponse updateTechStack( - AdminTechStackRequest request, - String trackName, - Integer techStackId - ) { - TechStack techStack = adminTechStackRepository.getById(techStackId); - Integer id = techStack.getTrackId(); - if (trackName != null) { - Track track = adminTrackRepository.getByName(trackName); - id = track.getId(); - } - techStack.update(id, request.imageUrl(), request.name(), request.description(), request.isDeleted()); - return AdminTechStackResponse.from(techStack); - } - - @Transactional - public void deleteTechStack(Integer techStackId) { - TechStack techStack = adminTechStackRepository.getById(techStackId); - techStack.delete(); - } -} diff --git a/src/main/java/in/koreatech/koin/domain/member/controller/MemberApi.java b/src/main/java/in/koreatech/koin/domain/member/controller/MemberApi.java deleted file mode 100644 index ddd2725cc9..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/controller/MemberApi.java +++ /dev/null @@ -1,40 +0,0 @@ -package in.koreatech.koin.domain.member.controller; - -import java.util.List; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; - -import in.koreatech.koin.domain.member.dto.MemberResponse; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.tags.Tag; - -@Tag(name = "(Normal) Member : BCSDLab 회원", description = "BCSDLab 회원 정보를 관리한다") -public interface MemberApi { - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - } - ) - @Operation(summary = "회원 목록 조회") - @GetMapping("/members") - ResponseEntity> getMembers(); - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "특정 회원 조회") - @GetMapping("/members/{id}") - ResponseEntity getMember( - @PathVariable Integer id - ); -} diff --git a/src/main/java/in/koreatech/koin/domain/member/controller/MemberController.java b/src/main/java/in/koreatech/koin/domain/member/controller/MemberController.java deleted file mode 100644 index ea8176c3f9..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/controller/MemberController.java +++ /dev/null @@ -1,33 +0,0 @@ -package in.koreatech.koin.domain.member.controller; - -import java.util.List; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -import in.koreatech.koin.domain.member.dto.MemberResponse; -import in.koreatech.koin.domain.member.service.MemberService; -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class MemberController implements MemberApi { - - private final MemberService memberService; - - @GetMapping("/members") - public ResponseEntity> getMembers() { - var response = memberService.getMembers(); - return ResponseEntity.ok(response); - } - - @GetMapping("/members/{id}") - public ResponseEntity getMember( - @PathVariable Integer id - ) { - var response = memberService.getMember(id); - return ResponseEntity.ok(response); - } -} diff --git a/src/main/java/in/koreatech/koin/domain/member/controller/TrackApi.java b/src/main/java/in/koreatech/koin/domain/member/controller/TrackApi.java deleted file mode 100644 index 489b41697a..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/controller/TrackApi.java +++ /dev/null @@ -1,45 +0,0 @@ -package in.koreatech.koin.domain.member.controller; - -import static io.swagger.v3.oas.annotations.enums.ParameterIn.PATH; - -import java.util.List; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; - -import in.koreatech.koin.domain.member.dto.TrackResponse; -import in.koreatech.koin.domain.member.dto.TrackSingleResponse; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.tags.Tag; - -@Tag(name = "(BCSDLab) Track: BCSDLab 트랙", description = "BCSDLab 트랙 정보를 관리한다") -public interface TrackApi { - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "트랙 목록 조회") - @GetMapping("/tracks") - ResponseEntity> getTracks(); - - @ApiResponses( - value = { - @ApiResponse(responseCode = "200"), - @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))), - } - ) - @Operation(summary = "트랙 단건 조회") - @GetMapping("/tracks/{id}") - ResponseEntity getTrack( - @Parameter(in = PATH) @PathVariable Integer id - ); -} diff --git a/src/main/java/in/koreatech/koin/domain/member/controller/TrackController.java b/src/main/java/in/koreatech/koin/domain/member/controller/TrackController.java deleted file mode 100644 index 6b9d8cfad4..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/controller/TrackController.java +++ /dev/null @@ -1,34 +0,0 @@ -package in.koreatech.koin.domain.member.controller; - -import java.util.List; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -import in.koreatech.koin.domain.member.dto.TrackResponse; -import in.koreatech.koin.domain.member.dto.TrackSingleResponse; -import in.koreatech.koin.domain.member.service.TrackService; -import lombok.RequiredArgsConstructor; - -@RestController -@RequiredArgsConstructor -public class TrackController implements TrackApi { - - private final TrackService trackService; - - @GetMapping("/tracks") - public ResponseEntity> getTracks() { - List tracksResponse = trackService.getTracks(); - return ResponseEntity.ok(tracksResponse); - } - - @GetMapping("/tracks/{id}") - public ResponseEntity getTrack( - @PathVariable Integer id - ) { - TrackSingleResponse response = trackService.getTrack(id); - return ResponseEntity.ok(response); - } -} diff --git a/src/main/java/in/koreatech/koin/domain/member/dto/MemberResponse.java b/src/main/java/in/koreatech/koin/domain/member/dto/MemberResponse.java deleted file mode 100644 index d1082ce869..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/dto/MemberResponse.java +++ /dev/null @@ -1,64 +0,0 @@ -package in.koreatech.koin.domain.member.dto; - -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.NOT_REQUIRED; -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; - -import java.time.LocalDateTime; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy; -import com.fasterxml.jackson.databind.annotation.JsonNaming; - -import in.koreatech.koin.domain.member.model.Member; -import io.swagger.v3.oas.annotations.media.Schema; - -@JsonNaming(SnakeCaseStrategy.class) -public record MemberResponse( - @Schema(example = "1", requiredMode = REQUIRED) - Integer id, - - @Schema(example = "최준호", requiredMode = REQUIRED) - String name, - - @Schema(example = "2019136135", requiredMode = NOT_REQUIRED) - String studentNumber, - - @Schema(example = "Backend", requiredMode = NOT_REQUIRED) - String track, - - @Schema(example = "Regular", requiredMode = REQUIRED) - String position, - - @Schema(example = "juno@gmail.com", requiredMode = NOT_REQUIRED) - String email, - - @Schema(example = "https://static.koreatech.in/bcsdlab_page_assets/img/people/juno.jpg", requiredMode = NOT_REQUIRED) - String imageUrl, - - @Schema(example = "false", requiredMode = REQUIRED) - boolean isDeleted, - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "생성 일자", example = "2020-08-14 16:26:35", requiredMode = REQUIRED) - LocalDateTime createdAt, - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "수정 일자", example = "2021-08-16 06:42:44", requiredMode = REQUIRED) - LocalDateTime updatedAt -) { - - public static MemberResponse from(Member member) { - return new MemberResponse( - member.getId(), - member.getName(), - member.getStudentNumber(), - member.getTrack().getName(), - member.getPosition(), - member.getEmail(), - member.getImageUrl(), - member.isDeleted(), - member.getCreatedAt(), - member.getUpdatedAt() - ); - } -} diff --git a/src/main/java/in/koreatech/koin/domain/member/dto/TrackResponse.java b/src/main/java/in/koreatech/koin/domain/member/dto/TrackResponse.java deleted file mode 100644 index 7cf6265203..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/dto/TrackResponse.java +++ /dev/null @@ -1,47 +0,0 @@ -package in.koreatech.koin.domain.member.dto; - -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; - -import java.time.LocalDateTime; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; - -import in.koreatech.koin.domain.member.model.Track; -import io.swagger.v3.oas.annotations.media.Schema; - -@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class) -public record TrackResponse( - @Schema(description = "트랙 고유 ID", example = "1", requiredMode = REQUIRED) - Integer id, - - @Schema(description = "트랙 명", example = "Backend", requiredMode = REQUIRED) - String name, - - @Schema(description = "인원 수", example = "15", requiredMode = REQUIRED) - Integer headcount, - - @Schema(description = "삭제 여부", example = "false", requiredMode = REQUIRED) - Boolean isDeleted, - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "생성 일자", example = "2023-01-04 12:00:01", requiredMode = REQUIRED) - LocalDateTime createdAt, - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "수정 일자", example = "2023-01-04 12:00:01", requiredMode = REQUIRED) - LocalDateTime updatedAt -) { - - public static TrackResponse from(Track track) { - return new TrackResponse( - track.getId(), - track.getName(), - track.getHeadcount(), - track.isDeleted(), - track.getCreatedAt(), - track.getUpdatedAt() - ); - } -} diff --git a/src/main/java/in/koreatech/koin/domain/member/dto/TrackSingleResponse.java b/src/main/java/in/koreatech/koin/domain/member/dto/TrackSingleResponse.java deleted file mode 100644 index 31286f1f76..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/dto/TrackSingleResponse.java +++ /dev/null @@ -1,134 +0,0 @@ -package in.koreatech.koin.domain.member.dto; - -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.NOT_REQUIRED; -import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED; - -import java.time.LocalDateTime; -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; - -import in.koreatech.koin.domain.member.model.Member; -import in.koreatech.koin.domain.member.model.TechStack; -import in.koreatech.koin.domain.member.model.Track; -import io.swagger.v3.oas.annotations.media.Schema; - -public record TrackSingleResponse( - @JsonProperty("TrackName") - @Schema(description = "트랙 명", example = "Backend", requiredMode = REQUIRED) - String trackName, - - @JsonProperty("TechStacks") - List innerTechStackResponses, - - @JsonProperty("Members") - List innerMemberResponses -) { - - public static TrackSingleResponse of(Track track, List members, List techStacks) { - return new TrackSingleResponse( - track.getName(), - techStacks.stream() - .map(InnerTechStackResponse::from) - .toList(), - members.stream() - .map(member -> InnerMemberResponse.from(member, track.getName())) - .toList() - ); - } - - @JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class) - private record InnerTechStackResponse( - @Schema(description = "기술 스택 고유 ID", example = "1", requiredMode = REQUIRED) - Integer id, - - @Schema(description = "기술 이름", example = "Backend") - String name, - - @Schema(description = "기술 설명", example = "15") - String description, - - @Schema(description = "이미지 Url", example = "https://static.koreatech.in/example/image.png") - String imageUrl, - - @Schema(description = "트랙 ID", example = "1") - Integer trackId, - - @Schema(description = "삭제 여부", example = "false") - Boolean isDeleted, - - @Schema(description = "생성 일자", example = "2023-01-04 12:00:01") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime createdAt, - - @Schema(description = "수정 일자", example = "2023-01-04 12:00:01") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updatedAt - ) { - - public static InnerTechStackResponse from(TechStack techStack) { - return new InnerTechStackResponse( - techStack.getId(), - techStack.getName(), - techStack.getDescription(), - techStack.getImageUrl(), - techStack.getTrackId(), - techStack.isDeleted(), - techStack.getCreatedAt(), - techStack.getUpdatedAt() - ); - } - } - - @JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class) - private record InnerMemberResponse( - @Schema(description = "BCSD 회원 고유 ID", example = "1", requiredMode = REQUIRED) - Integer id, - - @Schema(description = "이름", example = "최준호", requiredMode = REQUIRED) - String name, - - @Schema(description = "학번", example = "2019136135", requiredMode = NOT_REQUIRED) - String studentNumber, - - @Schema(description = "동아리 포지션 `Beginner`, `Regular`, `Mentor`", example = "Regular", requiredMode = REQUIRED) - String position, - - @Schema(description = "트랙 명", example = "Backend", requiredMode = REQUIRED) - String track, - - @Schema(description = "이메일", example = "koin123@koreatech.ac.kr", requiredMode = NOT_REQUIRED) - String email, - - @Schema(description = "이미지 Url", example = "https://static.koreatech.in/example/image.png", requiredMode = NOT_REQUIRED) - String imageUrl, - - @Schema(description = "삭제 여부", example = "false", requiredMode = REQUIRED) - Boolean isDeleted, - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "생성 일자", example = "2023-01-04 12:00:01", requiredMode = REQUIRED) - LocalDateTime createdAt, - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Schema(description = "수정 일자", example = "2023-01-04 12:00:01", requiredMode = REQUIRED) - LocalDateTime updatedAt - ) { - - public static InnerMemberResponse from(Member member, String trackName) { - return new InnerMemberResponse( - member.getId(), - member.getName(), - member.getStudentNumber(), - member.getPosition(), - trackName, - member.getEmail(), - member.getImageUrl(), - member.isDeleted(), - member.getCreatedAt(), - member.getUpdatedAt() - ); - } - } -} diff --git a/src/main/java/in/koreatech/koin/domain/member/exception/MemberNotFoundException.java b/src/main/java/in/koreatech/koin/domain/member/exception/MemberNotFoundException.java deleted file mode 100644 index c809812358..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/exception/MemberNotFoundException.java +++ /dev/null @@ -1,20 +0,0 @@ -package in.koreatech.koin.domain.member.exception; - -import in.koreatech.koin.global.exception.custom.DataNotFoundException; - -public class MemberNotFoundException extends DataNotFoundException { - - private static final String DEFAULT_MESSAGE = "존재하지 않는 BCSD 회원입니다."; - - public MemberNotFoundException(String message) { - super(message); - } - - public MemberNotFoundException(String message, String detail) { - super(message, detail); - } - - public static MemberNotFoundException withDetail(String detail) { - return new MemberNotFoundException(DEFAULT_MESSAGE, detail); - } -} diff --git a/src/main/java/in/koreatech/koin/domain/member/exception/TrackNotFoundException.java b/src/main/java/in/koreatech/koin/domain/member/exception/TrackNotFoundException.java deleted file mode 100644 index 2e8bfba790..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/exception/TrackNotFoundException.java +++ /dev/null @@ -1,20 +0,0 @@ -package in.koreatech.koin.domain.member.exception; - -import in.koreatech.koin.global.exception.custom.DataNotFoundException; - -public class TrackNotFoundException extends DataNotFoundException { - - private static final String DEFAULT_MESSAGE = "존재하지 않는 트랙입니다."; - - public TrackNotFoundException(String message) { - super(message); - } - - public TrackNotFoundException(String message, String detail) { - super(message, detail); - } - - public static TrackNotFoundException withDetail(String detail) { - return new TrackNotFoundException(DEFAULT_MESSAGE, detail); - } -} diff --git a/src/main/java/in/koreatech/koin/domain/member/model/Member.java b/src/main/java/in/koreatech/koin/domain/member/model/Member.java deleted file mode 100644 index 8123778dac..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/model/Member.java +++ /dev/null @@ -1,102 +0,0 @@ -package in.koreatech.koin.domain.member.model; - -import static jakarta.persistence.FetchType.LAZY; -import static jakarta.persistence.GenerationType.IDENTITY; -import static lombok.AccessLevel.PROTECTED; - -import in.koreatech.koin.common.model.BaseEntity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import jakarta.persistence.Table; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -/** - * BCSDLab 회원에 대한 정보를 다루는 엔티티 - */ -@Getter -@Entity -@Table(name = "members") -@NoArgsConstructor(access = PROTECTED) -public class Member extends BaseEntity { - - @Id - @GeneratedValue(strategy = IDENTITY) - private Integer id; - - @Size(max = 50) - @NotNull - @Column(name = "name", nullable = false, length = 50) - private String name; - - @Size(max = 20) - @Column(name = "student_number", length = 20) - private String studentNumber; - - @NotNull - @ManyToOne(fetch = LAZY) - @JoinColumn(name = "track_id") - private Track track; - - @Size(max = 20) - @NotNull - @Column(name = "position", nullable = false, length = 20) - private String position; - - @Size(max = 100) - @Column(name = "email", length = 100) - private String email; - - @Column(name = "image_url") - private String imageUrl; - - @NotNull - @Column(name = "is_deleted", nullable = false) - private boolean isDeleted = false; - - @Builder - private Member( - String name, - String studentNumber, - Track track, - String position, - String email, - String imageUrl, - boolean isDeleted - ) { - this.name = name; - this.studentNumber = studentNumber; - this.track = track; - this.position = position; - this.email = email; - this.imageUrl = imageUrl; - this.isDeleted = isDeleted; - } - - public void delete() { - this.isDeleted = true; - } - - public void undelete() { - this.isDeleted = false; - } - - public void update(String name, String studentNumber, String position, String email, String imageUrl) { - this.name = name; - this.studentNumber = studentNumber; - this.position = position; - this.email = email; - this.imageUrl = imageUrl; - } - - public void updateTrack(Track track) { - this.track = track; - } -} diff --git a/src/main/java/in/koreatech/koin/domain/member/model/TechStack.java b/src/main/java/in/koreatech/koin/domain/member/model/TechStack.java deleted file mode 100644 index c678a3c5ed..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/model/TechStack.java +++ /dev/null @@ -1,73 +0,0 @@ -package in.koreatech.koin.domain.member.model; - -import static jakarta.persistence.GenerationType.IDENTITY; -import static lombok.AccessLevel.PROTECTED; - -import in.koreatech.koin.common.model.BaseEntity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Entity -@Table(name = "tech_stacks") -@NoArgsConstructor(access = PROTECTED) -public class TechStack extends BaseEntity { - - @Id - @GeneratedValue(strategy = IDENTITY) - private Integer id; - - @Column(name = "image_url") - private String imageUrl; - - @Size(max = 50) - @NotNull - @Column(name = "name", nullable = false, length = 50) - private String name; - - @Size(max = 100) - @Column(name = "description", length = 100) - private String description; - - @Column(name = "track_id") - private Integer trackId; - - @NotNull - @Column(name = "is_deleted", nullable = false) - private boolean isDeleted = false; - - @Builder - private TechStack( - String imageUrl, - String name, - String description, - Integer trackId, - boolean isDeleted - ) { - this.imageUrl = imageUrl; - this.trackId = trackId; - this.name = name; - this.description = description; - this.isDeleted = isDeleted; - } - - public void update(Integer trackId, String imageUrl, String name, String description, boolean isDeleted) { - this.imageUrl = imageUrl; - this.trackId = trackId; - this.name = name; - this.description = description; - this.isDeleted = isDeleted; - } - - public void delete() { - this.isDeleted = true; - } -} diff --git a/src/main/java/in/koreatech/koin/domain/member/model/Track.java b/src/main/java/in/koreatech/koin/domain/member/model/Track.java deleted file mode 100644 index 046c231292..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/model/Track.java +++ /dev/null @@ -1,57 +0,0 @@ -package in.koreatech.koin.domain.member.model; - -import static lombok.AccessLevel.PROTECTED; - -import in.koreatech.koin.common.model.BaseEntity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Entity -@Getter -@Table(name = "tracks") -@NoArgsConstructor(access = PROTECTED) -public class Track extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer id; - - @Size(max = 50) - @NotNull - @Column(name = "name", nullable = false, length = 50) - private String name; - - @NotNull - @Column(name = "headcount", nullable = false) - private Integer headcount; - - @NotNull - @Column(name = "is_deleted", nullable = false) - private boolean isDeleted = false; - - @Builder - private Track(String name, Integer headcount, boolean isDeleted) { - this.name = name; - this.headcount = headcount != null ? headcount : 0; - this.isDeleted = isDeleted; - } - - public void update(String name, Integer headcount, boolean isDeleted) { - this.name = name; - this.headcount = headcount; - this.isDeleted = isDeleted; - } - - public void delete() { - this.isDeleted = true; - } -} diff --git a/src/main/java/in/koreatech/koin/domain/member/repository/MemberRepository.java b/src/main/java/in/koreatech/koin/domain/member/repository/MemberRepository.java deleted file mode 100644 index cde93f1cf5..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/repository/MemberRepository.java +++ /dev/null @@ -1,29 +0,0 @@ -package in.koreatech.koin.domain.member.repository; - -import java.util.List; -import java.util.Optional; - -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.EntityGraph; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.Repository; - -import in.koreatech.koin.domain.member.exception.MemberNotFoundException; -import in.koreatech.koin.domain.member.model.Member; - -public interface MemberRepository extends Repository { - - Member save(Member member); - - List findAllByTrackIdAndIsDeletedFalse(Integer id); - - List findAll(); - - Optional findById(Integer id); - - default Member getById(Integer id) { - return findById(id) - .orElseThrow(() -> MemberNotFoundException.withDetail("id: " + id)); - } -} diff --git a/src/main/java/in/koreatech/koin/domain/member/repository/TechStackRepository.java b/src/main/java/in/koreatech/koin/domain/member/repository/TechStackRepository.java deleted file mode 100644 index 018e02ee66..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/repository/TechStackRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package in.koreatech.koin.domain.member.repository; - -import java.util.List; - -import org.springframework.data.repository.Repository; - -import in.koreatech.koin.domain.member.model.TechStack; - -public interface TechStackRepository extends Repository { - - TechStack save(TechStack techStack); - - List findAllByTrackId(Integer id); -} diff --git a/src/main/java/in/koreatech/koin/domain/member/repository/TrackRepository.java b/src/main/java/in/koreatech/koin/domain/member/repository/TrackRepository.java deleted file mode 100644 index aa310cdb11..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/repository/TrackRepository.java +++ /dev/null @@ -1,23 +0,0 @@ -package in.koreatech.koin.domain.member.repository; - -import java.util.List; -import java.util.Optional; - -import org.springframework.data.repository.Repository; - -import in.koreatech.koin.domain.member.exception.TrackNotFoundException; -import in.koreatech.koin.domain.member.model.Track; - -public interface TrackRepository extends Repository { - - Track save(Track track); - - List findAll(); - - Optional findById(Integer trackId); - - default Track getById(Integer trackId) { - return findById(trackId) - .orElseThrow(() -> TrackNotFoundException.withDetail("trackId: " + trackId)); - } -} diff --git a/src/main/java/in/koreatech/koin/domain/member/service/MemberService.java b/src/main/java/in/koreatech/koin/domain/member/service/MemberService.java deleted file mode 100644 index c2f3c33065..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/service/MemberService.java +++ /dev/null @@ -1,30 +0,0 @@ -package in.koreatech.koin.domain.member.service; - -import java.util.List; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import in.koreatech.koin.domain.member.dto.MemberResponse; -import in.koreatech.koin.domain.member.repository.MemberRepository; -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class MemberService { - - private final MemberRepository memberRepository; - - public List getMembers() { - var members = memberRepository.findAll(); - return members.stream() - .map(MemberResponse::from) - .toList(); - } - - public MemberResponse getMember(Integer id) { - var member = memberRepository.getById(id); - return MemberResponse.from(member); - } -} diff --git a/src/main/java/in/koreatech/koin/domain/member/service/TrackService.java b/src/main/java/in/koreatech/koin/domain/member/service/TrackService.java deleted file mode 100644 index fe23ba50ab..0000000000 --- a/src/main/java/in/koreatech/koin/domain/member/service/TrackService.java +++ /dev/null @@ -1,38 +0,0 @@ -package in.koreatech.koin.domain.member.service; - -import java.util.List; - -import org.springframework.stereotype.Service; - -import in.koreatech.koin.domain.member.dto.TrackResponse; -import in.koreatech.koin.domain.member.dto.TrackSingleResponse; -import in.koreatech.koin.domain.member.model.Member; -import in.koreatech.koin.domain.member.model.TechStack; -import in.koreatech.koin.domain.member.model.Track; -import in.koreatech.koin.domain.member.repository.MemberRepository; -import in.koreatech.koin.domain.member.repository.TechStackRepository; -import in.koreatech.koin.domain.member.repository.TrackRepository; -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class TrackService { - - private final TrackRepository trackRepository; - private final MemberRepository memberRepository; - private final TechStackRepository techStackRepository; - - public List getTracks() { - return trackRepository.findAll().stream() - .map(TrackResponse::from) - .toList(); - } - - public TrackSingleResponse getTrack(Integer id) { - Track track = trackRepository.getById(id); - List member = memberRepository.findAllByTrackIdAndIsDeletedFalse(id); - List techStacks = techStackRepository.findAllByTrackId(id); - - return TrackSingleResponse.of(track, member, techStacks); - } -} diff --git a/src/test/java/in/koreatech/koin/acceptance/admin/AdminMemberApiTest.java b/src/test/java/in/koreatech/koin/acceptance/admin/AdminMemberApiTest.java deleted file mode 100644 index 2ef9ccc58c..0000000000 --- a/src/test/java/in/koreatech/koin/acceptance/admin/AdminMemberApiTest.java +++ /dev/null @@ -1,276 +0,0 @@ -package in.koreatech.koin.acceptance.admin; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.assertj.core.api.SoftAssertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; - -import in.koreatech.koin.acceptance.AcceptanceTest; -import in.koreatech.koin.acceptance.fixture.MemberAcceptanceFixture; -import in.koreatech.koin.acceptance.fixture.TrackAcceptanceFixture; -import in.koreatech.koin.acceptance.fixture.UserAcceptanceFixture; -import in.koreatech.koin.admin.member.repository.AdminMemberRepository; -import in.koreatech.koin.admin.manager.model.Admin; -import in.koreatech.koin.domain.member.model.Member; - -public class AdminMemberApiTest extends AcceptanceTest { - - @Autowired - private MemberAcceptanceFixture memberFixture; - - @Autowired - private TrackAcceptanceFixture trackFixture; - - @Autowired - private UserAcceptanceFixture userFixture; - - @Autowired - private AdminMemberRepository adminMemberRepository; - - @BeforeAll - void setup() { - clear(); - } - - @Test - void BCSDLab_회원들의_정보를_조회한다() throws Exception { - memberFixture.최준호(trackFixture.backend()); - - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - mockMvc.perform( - get("/admin/members") - .header("Authorization", "Bearer " + token) - .param("page", "1") - .param("track", "BACKEND") - .param("is_deleted", "false") - ) - .andExpect(status().isOk()) - .andExpect(content().json(""" - { - "total_count": 1, - "current_count": 1, - "total_page": 1, - "current_page": 1, - "members": [ - { - "id": 1, - "name": "최준호", - "student_number": "2019136135", - "track": "BackEnd", - "position": "Regular", - "email": "testjuno@gmail.com", - "image_url": "https://imagetest.com/juno.jpg", - "is_deleted": false - } - ] - } - """)); - } - - @Test - void 관리자_권한으로_BCSDLab_회원을_추가한다() throws Exception { - trackFixture.backend(); - - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - String jsonBody = """ - { - "name": "최준호", - "student_number": "2019136135", - "track": "BackEnd", - "position": "Regular", - "email": "testjuno@gmail.com", - "image_url": "https://imagetest.com/juno.jpg" - } - """; - - mockMvc.perform( - post("/admin/members") - .header("Authorization", "Bearer " + token) - .contentType(MediaType.APPLICATION_JSON) - .content(jsonBody) - ) - .andExpect(status().isCreated()); - - Member savedMember = adminMemberRepository.getByName("최준호"); - - SoftAssertions.assertSoftly(softly -> { - softly.assertThat(savedMember.getName()).isEqualTo("최준호"); - softly.assertThat(savedMember.getStudentNumber()).isEqualTo("2019136135"); - softly.assertThat(savedMember.getTrack().getName()).isEqualTo("BackEnd"); - softly.assertThat(savedMember.getPosition()).isEqualTo("Regular"); - softly.assertThat(savedMember.getEmail()).isEqualTo("testjuno@gmail.com"); - softly.assertThat(savedMember.getImageUrl()).isEqualTo("https://imagetest.com/juno.jpg"); - softly.assertThat(savedMember.isDeleted()).isEqualTo(false); - }); - } - - @Test - void BCSDLab_회원_정보를_조회한다() throws Exception { - memberFixture.최준호(trackFixture.backend()); - - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - mockMvc.perform( - get("/admin/members/{id}", 1) - .header("Authorization", "Bearer " + token) - ) - .andExpect(status().isOk()) - .andExpect(content().json(""" - { - "id": 1, - "name": "최준호", - "student_number": "2019136135", - "track": "BackEnd", - "position": "Regular", - "email": "testjuno@gmail.com", - "image_url": "https://imagetest.com/juno.jpg", - "is_deleted": false - } - """)); - } - - @Test - void BCSDLab_회원_정보를_삭제한다() throws Exception { - Member member = memberFixture.최준호(trackFixture.backend()); - Integer memberId = member.getId(); - - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - mockMvc.perform( - delete("/admin/members/{id}", memberId) - .header("Authorization", "Bearer " + token) - ) - .andExpect(status().isOk()); - - Member savedMember = adminMemberRepository.getById(memberId); - - SoftAssertions.assertSoftly(softly -> { - softly.assertThat(savedMember.getName()).isEqualTo("최준호"); - softly.assertThat(savedMember.getStudentNumber()).isEqualTo("2019136135"); - softly.assertThat(savedMember.getTrack().getName()).isEqualTo("BackEnd"); - softly.assertThat(savedMember.getPosition()).isEqualTo("Regular"); - softly.assertThat(savedMember.getEmail()).isEqualTo("testjuno@gmail.com"); - softly.assertThat(savedMember.getImageUrl()).isEqualTo("https://imagetest.com/juno.jpg"); - softly.assertThat(savedMember.isDeleted()).isEqualTo(true); - }); - } - - @Test - void BCSDLab_회원_정보를_수정한다() throws Exception { - Member member = memberFixture.최준호(trackFixture.backend()); - Integer memberId = member.getId(); - - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - String jsonBody = """ - { - "name": "최준호", - "student_number": "2019136135", - "track": "BackEnd", - "position": "Mentor", - "email": "testjuno@gmail.com", - "image_url": "https://imagetest.com/juno.jpg" - } - """; - - mockMvc.perform( - put("/admin/members/{id}", memberId) - .header("Authorization", "Bearer " + token) - .contentType(MediaType.APPLICATION_JSON) - .content(jsonBody) - ) - .andExpect(status().isOk()); - - Member updatedMember = adminMemberRepository.getById(memberId); - - SoftAssertions.assertSoftly(softly -> { - softly.assertThat(updatedMember.getName()).isEqualTo("최준호"); - softly.assertThat(updatedMember.getStudentNumber()).isEqualTo("2019136135"); - softly.assertThat(updatedMember.getTrack().getName()).isEqualTo("BackEnd"); - softly.assertThat(updatedMember.getPosition()).isEqualTo("Mentor"); - softly.assertThat(updatedMember.getEmail()).isEqualTo("testjuno@gmail.com"); - softly.assertThat(updatedMember.getImageUrl()).isEqualTo("https://imagetest.com/juno.jpg"); - softly.assertThat(updatedMember.isDeleted()).isEqualTo(false); - }); - } - - @Test - void BCSDLab_회원_정보를_트랙과_함께_수정한다() throws Exception { - Member member = memberFixture.최준호(trackFixture.backend()); - trackFixture.frontend(); - Integer memberId = member.getId(); - - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - String jsonBody = """ - { - "name": "최준호", - "student_number": "2019136135", - "track": "FrontEnd", - "position": "Mentor", - "email": "testjuno@gmail.com", - "image_url": "https://imagetest.com/juno.jpg" - } - """; - - mockMvc.perform( - put("/admin/members/{id}", memberId) - .header("Authorization", "Bearer " + token) - .contentType(MediaType.APPLICATION_JSON) - .content(jsonBody) - ) - .andExpect(status().isOk()); - - Member updatedMember = adminMemberRepository.getById(memberId); - - SoftAssertions.assertSoftly(softly -> { - softly.assertThat(updatedMember.getName()).isEqualTo("최준호"); - softly.assertThat(updatedMember.getStudentNumber()).isEqualTo("2019136135"); - softly.assertThat(updatedMember.getTrack().getName()).isEqualTo("FrontEnd"); - softly.assertThat(updatedMember.getPosition()).isEqualTo("Mentor"); - softly.assertThat(updatedMember.getEmail()).isEqualTo("testjuno@gmail.com"); - softly.assertThat(updatedMember.getImageUrl()).isEqualTo("https://imagetest.com/juno.jpg"); - softly.assertThat(updatedMember.isDeleted()).isEqualTo(false); - }); - } - - @Test - void BCSDLab_회원_정보를_삭제를_취소한다() throws Exception { - Member member = memberFixture.최준호_삭제(trackFixture.backend()); - Integer memberId = member.getId(); - - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - mockMvc.perform( - post("/admin/members/{id}/undelete", memberId) - .header("Authorization", "Bearer " + token) - ) - .andExpect(status().isOk()); - - Member savedMember = adminMemberRepository.getById(memberId); - - SoftAssertions.assertSoftly(softly -> { - softly.assertThat(savedMember.getName()).isEqualTo("최준호"); - softly.assertThat(savedMember.getStudentNumber()).isEqualTo("2019136135"); - softly.assertThat(savedMember.getTrack().getName()).isEqualTo("BackEnd"); - softly.assertThat(savedMember.getPosition()).isEqualTo("Regular"); - softly.assertThat(savedMember.getEmail()).isEqualTo("testjuno@gmail.com"); - softly.assertThat(savedMember.getImageUrl()).isEqualTo("https://imagetest.com/juno.jpg"); - softly.assertThat(savedMember.isDeleted()).isEqualTo(false); - }); - } -} diff --git a/src/test/java/in/koreatech/koin/acceptance/admin/AdminTrackApiTest.java b/src/test/java/in/koreatech/koin/acceptance/admin/AdminTrackApiTest.java deleted file mode 100644 index 057f6bb37a..0000000000 --- a/src/test/java/in/koreatech/koin/acceptance/admin/AdminTrackApiTest.java +++ /dev/null @@ -1,406 +0,0 @@ -package in.koreatech.koin.acceptance.admin; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.assertj.core.api.SoftAssertions; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; - -import in.koreatech.koin.acceptance.AcceptanceTest; -import in.koreatech.koin.acceptance.fixture.DepartmentAcceptanceFixture; -import in.koreatech.koin.acceptance.fixture.MemberAcceptanceFixture; -import in.koreatech.koin.acceptance.fixture.TechStackAcceptanceFixture; -import in.koreatech.koin.acceptance.fixture.TrackAcceptanceFixture; -import in.koreatech.koin.acceptance.fixture.UserAcceptanceFixture; -import in.koreatech.koin.admin.member.repository.AdminTechStackRepository; -import in.koreatech.koin.admin.member.repository.AdminTrackRepository; -import in.koreatech.koin.admin.manager.model.Admin; -import in.koreatech.koin.domain.member.model.TechStack; -import in.koreatech.koin.domain.member.model.Track; -import in.koreatech.koin.domain.student.model.Department; -import in.koreatech.koin.domain.student.model.Student; - -public class AdminTrackApiTest extends AcceptanceTest { - - @Autowired - private TrackAcceptanceFixture trackFixture; - - @Autowired - private MemberAcceptanceFixture memberFixture; - - @Autowired - private TechStackAcceptanceFixture techStackFixture; - - @Autowired - private UserAcceptanceFixture userFixture; - - @Autowired - private DepartmentAcceptanceFixture departmentFixture; - - @Autowired - private AdminTrackRepository adminTrackRepository; - - @Autowired - private AdminTechStackRepository adminTechStackRepository; - - @BeforeAll - void setup() { - clear(); - } - - @Test - void 관리자가_BCSDLab_트랙_정보를_조회한다_관리자가_아니면_403_반환() throws Exception { - Department department = departmentFixture.컴퓨터공학부(); - Student student = userFixture.준호_학생(department, null); - String token = userFixture.getToken(student.getUser()); - - mockMvc.perform( - get("/admin/tracks") - .header("Authorization", "Bearer " + token) - ) - .andExpect(status().isForbidden()); - } - - @Test - void 관리자가_BCSDLab_트랙_정보를_조회한다() throws Exception { - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - trackFixture.backend(); - trackFixture.frontend(); - trackFixture.ios(); - - mockMvc.perform( - get("/admin/tracks") - .header("Authorization", "Bearer " + token) - ) - .andExpect(status().isOk()) - .andExpect(content().json(""" - [ - { - "id": 1, - "name": "BackEnd", - "headcount": 0, - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - }, - { - "id": 2, - "name": "FrontEnd", - "headcount": 0, - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - }, - { - "id": 3, - "name": "iOS", - "headcount": 0, - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - } - ] - """)); - } - - @Test - void 관리자가_BCSDLab_트랙_정보를_생성한다() throws Exception { - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - mockMvc.perform( - post("/admin/tracks") - .header("Authorization", "Bearer " + token) - .contentType(MediaType.APPLICATION_JSON) - .content(""" - { - "name": "BackEnd", - "headcount": 20 - } - """) - ) - .andExpect(status().isOk()) - .andExpect(content().json(""" - { - "id": 1, - "name": "BackEnd", - "headcount": 20, - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - } - """)); - } - - @Test - void 관리자가_BCSDLab_트랙_정보를_생성한다_이미_있는_트랙명이면_409_반환() throws Exception { - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - trackFixture.backend(); - - mockMvc.perform( - post("/admin/tracks") - .header("Authorization", "Bearer " + token) - .contentType(MediaType.APPLICATION_JSON) - .content(""" - { - "name": "BackEnd", - "headcount": 20 - } - """) - ) - .andExpect(status().isConflict()); - } - - @Test - void 관리자가_BCSDLab_트랙_단거_정보를_조회한다() throws Exception { - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - Track backend = trackFixture.backend(); - trackFixture.ai(); // 삭제된 트랙 - memberFixture.배진호(backend); // 삭제된 멤버 - memberFixture.최준호(backend); - techStackFixture.java(backend); - techStackFixture.adobeFlash(backend); //삭제된 기술스택 - - mockMvc.perform( - get("/admin/tracks/{id}", backend.getId()) - .header("Authorization", "Bearer " + token) - ) - .andExpect(status().isOk()) - .andExpect(content().json(""" - { - "TrackName": "BackEnd", - "Members": [ - { - "id": 1, - "name": "배진호", - "student_number": "2020136061", - "position": "Regular", - "track": "BackEnd", - "email": "testjhb@gmail.com", - "image_url": "https://imagetest.com/jino.jpg", - "is_deleted": true, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - }, - { - "id": 2, - "name": "최준호", - "student_number": "2019136135", - "position": "Regular", - "track": "BackEnd", - "email": "testjuno@gmail.com", - "image_url": "https://imagetest.com/juno.jpg", - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - } - ], - "TechStacks": [ - { - "id": 1, - "name": "Java", - "description": "Language", - "image_url": "https://testimageurl.com", - "track_id": 1, - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - }, - { - "id": 2, - "name": "AdobeFlash", - "description": "deleted", - "image_url": "https://testimageurl.com", - "track_id": 1, - "is_deleted": true, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - } - ] - } - """)); - } - - @Test - void 관리자가_BCSDLab_트랙_정보를_수정한다() throws Exception { - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - Track backEnd = trackFixture.backend(); - - mockMvc.perform( - put("/admin/tracks/{id}", backEnd.getId()) - .header("Authorization", "Bearer " + token) - .contentType(MediaType.APPLICATION_JSON) - .content(""" - { - "name": "frontEnd", - "headcount": 20 - } - """) - ) - .andExpect(status().isOk()) - .andExpect(content().json(""" - { - "id": 1, - "name": "frontEnd", - "headcount": 20, - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - } - """)); - } - - @Test - void 관리자가_BCSDLab_트랙_정보를_수정한다_이미_있는_트랙명이면_409_반환() throws Exception { - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - Track backEnd = trackFixture.backend(); - - mockMvc.perform( - put("/admin/tracks/{id}", backEnd.getId()) - .header("Authorization", "Bearer " + token) - .contentType(MediaType.APPLICATION_JSON) - .content(""" - { - "name": "BackEnd", - "headcount": 20 - } - """) - ) - .andExpect(status().isConflict()); - } - - @Test - void 관리자가_BCSDLab_트랙_정보를_삭제한다() throws Exception { - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - Track backEnd = trackFixture.backend(); - - mockMvc.perform( - delete("/admin/tracks/{id}", backEnd.getId()) - .header("Authorization", "Bearer " + token) - ) - .andExpect(status().isOk()); - - Track updatedTrack = adminTrackRepository.getById(backEnd.getId()); - - SoftAssertions.assertSoftly(softly -> { - softly.assertThat(updatedTrack.getName()).isEqualTo(backEnd.getName()); - softly.assertThat(updatedTrack.getHeadcount()).isEqualTo(backEnd.getHeadcount()); - softly.assertThat(updatedTrack.isDeleted()).isEqualTo(true); - }); - } - - @Test - void 관리자가_BCSDLab_기술스택_정보를_생성한다() throws Exception { - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - trackFixture.frontend(); - Track backEnd = trackFixture.backend(); - - mockMvc.perform( - post("/admin/techStacks") - .header("Authorization", "Bearer " + token) - .contentType(MediaType.APPLICATION_JSON) - .content(""" - { - "image_url": "https://url.com", - "name": "Spring", - "description": "스프링은 웹 프레임워크이다" - } - """) - .param("trackName", backEnd.getName()) - ) - .andExpect(status().isOk()) - .andExpect(content().json(""" - { - "id": 1, - "image_url": "https://url.com", - "name": "Spring", - "description": "스프링은 웹 프레임워크이다", - "track_id": 2, - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - } - """)); - } - - @Test - void 관리자가_BCSDLab_기술스택_정보를_수정한다() throws Exception { - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - TechStack java = techStackFixture.java(trackFixture.frontend()); - Track backEnd = trackFixture.backend(); - - mockMvc.perform( - put("/admin/techStacks/{id}", java.getId()) - .header("Authorization", "Bearer " + token) - .contentType(MediaType.APPLICATION_JSON) - .content(""" - { - "image_url": "https://java.com", - "name": "JAVA", - "description": "java의 TrackID를 BackEnd로 수정한다.", - "is_deleted": true - } - """) - .param("trackName", backEnd.getName()) - ) - .andExpect(status().isOk()) - .andExpect(content().json(""" - { - "id": 1, - "image_url": "https://java.com", - "name": "JAVA", - "description": "java의 TrackID를 BackEnd로 수정한다.", - "track_id": 2, - "is_deleted": true, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - } - """)); - } - - @Test - void 관리자가_기술스택_정보를_삭제한다() throws Exception { - Admin adminUser = userFixture.코인_운영자(); - String token = userFixture.getToken(adminUser.getUser()); - - Track backEnd = trackFixture.backend(); - TechStack java = techStackFixture.java(backEnd); - - mockMvc.perform( - delete("/admin/techStacks/{id}", java.getId()) - .header("Authorization", "Bearer " + token) - - ) - .andExpect(status().isOk()); - - TechStack updatedtechStack = adminTechStackRepository.getById(java.getId()); - - SoftAssertions.assertSoftly(softly -> { - softly.assertThat(updatedtechStack.getImageUrl()).isEqualTo(java.getImageUrl()); - softly.assertThat(updatedtechStack.getName()).isEqualTo(java.getName()); - softly.assertThat(updatedtechStack.getDescription()).isEqualTo(java.getDescription()); - softly.assertThat(updatedtechStack.getTrackId()).isEqualTo(backEnd.getId()); - softly.assertThat(updatedtechStack.isDeleted()).isEqualTo(true); - }); - } -} diff --git a/src/test/java/in/koreatech/koin/acceptance/domain/MemberApiTest.java b/src/test/java/in/koreatech/koin/acceptance/domain/MemberApiTest.java deleted file mode 100644 index e5397eb259..0000000000 --- a/src/test/java/in/koreatech/koin/acceptance/domain/MemberApiTest.java +++ /dev/null @@ -1,113 +0,0 @@ -package in.koreatech.koin.acceptance.domain; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MvcResult; - -import in.koreatech.koin.acceptance.AcceptanceTest; -import in.koreatech.koin.acceptance.fixture.MemberAcceptanceFixture; -import in.koreatech.koin.acceptance.support.JsonAssertions; -import in.koreatech.koin.domain.member.model.Member; -import in.koreatech.koin.domain.member.model.Track; -import in.koreatech.koin.domain.member.repository.TrackRepository; - -class MemberApiTest extends AcceptanceTest { - - @Autowired - private TrackRepository trackRepository; - - @Autowired - private MemberAcceptanceFixture memberFixture; - - Track backend; - Track frontend; - - @BeforeAll - void setUp() { - clear(); - backend = trackRepository.save( - Track.builder() - .name("BackEnd") - .build() - ); - frontend = trackRepository.save( - Track.builder() - .name("FrontEnd") - .build() - ); - } - - @Test - void BCSDLab_회원의_정보를_조회한다() throws Exception { - Member member = memberFixture.최준호(backend); - - MvcResult result = mockMvc.perform( - get("/members/{id}", member.getId()) - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isOk()) - .andReturn(); - - JsonAssertions.assertThat(result.getResponse().getContentAsString()) - .isEqualTo(""" - { - "id": 1, - "name": "최준호", - "student_number": "2019136135", - "track": "BackEnd", - "position": "Regular", - "email": "testjuno@gmail.com", - "image_url": "https://imagetest.com/juno.jpg", - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - }""" - ); - } - - @Test - void BCSDLab_회원들의_정보를_조회한다() throws Exception { - memberFixture.최준호(backend); - memberFixture.박한수(frontend); - - mockMvc.perform( - get("/members") - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isOk()) - .andExpect(content().json(""" - [ - { - "id": 1, - "name": "최준호", - "student_number": "2019136135", - "track": "BackEnd", - "position": "Regular", - "email": "testjuno@gmail.com", - "image_url": "https://imagetest.com/juno.jpg", - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - }, - { - "id": 2, - "name": "박한수", - "student_number": "2019136064", - "track": "FrontEnd", - "position": "Regular", - "email": "testhsp@gmail.com", - "image_url": "https://imagetest.com/juno.jpg", - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - } - ] - """)); - } -} diff --git a/src/test/java/in/koreatech/koin/acceptance/domain/TrackApiTest.java b/src/test/java/in/koreatech/koin/acceptance/domain/TrackApiTest.java deleted file mode 100644 index b279be368e..0000000000 --- a/src/test/java/in/koreatech/koin/acceptance/domain/TrackApiTest.java +++ /dev/null @@ -1,185 +0,0 @@ -package in.koreatech.koin.acceptance.domain; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; - -import in.koreatech.koin.acceptance.AcceptanceTest; -import in.koreatech.koin.acceptance.fixture.MemberAcceptanceFixture; -import in.koreatech.koin.acceptance.fixture.TechStackAcceptanceFixture; -import in.koreatech.koin.acceptance.fixture.TrackAcceptanceFixture; -import in.koreatech.koin.domain.member.model.Track; - -class TrackApiTest extends AcceptanceTest { - - @Autowired - private TrackAcceptanceFixture trackFixture; - - @Autowired - private MemberAcceptanceFixture memberFixture; - - @Autowired - private TechStackAcceptanceFixture techStackFixture; - - @BeforeAll - void setup() { - clear(); - } - - @Test - void BCSDLab_트랙_정보를_조회한다() throws Exception { - trackFixture.backend(); - trackFixture.frontend(); - trackFixture.ios(); - - mockMvc.perform( - get("/tracks") - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isOk()) - .andExpect(content().json(""" - [ - { - "id": 1, - "name": "BackEnd", - "headcount": 0, - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - }, - { - "id": 2, - "name": "FrontEnd", - "headcount": 0, - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - }, - { - "id": 3, - "name": "iOS", - "headcount": 0, - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - } - ] - """)); - } - - @Test - void BCSDLab_트랙_정보_단건_조회_삭제된_멤버는_조회하지_않는다() throws Exception { - Track track = trackFixture.backend(); - memberFixture.배진호(track); // 삭제된 멤버 - memberFixture.최준호(track); - techStackFixture.java(track); - - mockMvc.perform( - get("/tracks/{id}", track.getId()) - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isOk()) - .andExpect(content().json(""" - { - "TrackName": "BackEnd", - "TechStacks": [ - { - "id": 1, - "name": "Java", - "description": "Language", - "image_url": "https://testimageurl.com", - "track_id": 1, - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - } - ], - "Members": [ - { - "id": 2, - "name": "최준호", - "student_number": "2019136135", - "position": "Regular", - "track": "BackEnd", - "email": "testjuno@gmail.com", - "image_url": "https://imagetest.com/juno.jpg", - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - } - ] - } - """)); - } - - @Test - void BCSDLab_트랙_정보_단건_조회() throws Exception { - Track track = trackFixture.backend(); - memberFixture.최준호(track); - techStackFixture.java(track); - - mockMvc.perform( - get("/tracks/{id}", track.getId()) - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isOk()) - .andExpect(content().json(""" - { - "TrackName": "BackEnd", - "TechStacks": [ - { - "id": 1, - "name": "Java", - "description": "Language", - "image_url": "https://testimageurl.com", - "track_id": 1, - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - } - ], - "Members": [ - { - "id": 1, - "name": "최준호", - "student_number": "2019136135", - "position": "Regular", - "track": "BackEnd", - "email": "testjuno@gmail.com", - "image_url": "https://imagetest.com/juno.jpg", - "is_deleted": false, - "created_at": "2024-01-15 12:00:00", - "updated_at": "2024-01-15 12:00:00" - } - ] - } - """)); - } - - @Test - void BCSDLab_트랙_정보_단건_조회_트랙에_속한_멤버와_기술스택이_없을_때() throws Exception { - Track track = trackFixture.frontend(); - - mockMvc.perform( - get("/tracks/{id}", track.getId()) - .contentType(MediaType.APPLICATION_JSON) - ) - .andExpect(status().isOk()) - .andExpect(content().json(""" - { - "TrackName": "FrontEnd", - "TechStacks": [ - - ], - "Members": [ - - ] - } - """)); - } -} diff --git a/src/test/java/in/koreatech/koin/acceptance/fixture/MemberAcceptanceFixture.java b/src/test/java/in/koreatech/koin/acceptance/fixture/MemberAcceptanceFixture.java deleted file mode 100644 index bc86da6a5f..0000000000 --- a/src/test/java/in/koreatech/koin/acceptance/fixture/MemberAcceptanceFixture.java +++ /dev/null @@ -1,80 +0,0 @@ -package in.koreatech.koin.acceptance.fixture; - -import org.springframework.stereotype.Component; - -import in.koreatech.koin.domain.member.model.Member; -import in.koreatech.koin.domain.member.model.Track; -import in.koreatech.koin.domain.member.repository.MemberRepository; -import in.koreatech.koin.domain.member.repository.TrackRepository; - -@Component -@SuppressWarnings("NonAsciiCharacters") -public class MemberAcceptanceFixture { - - private final MemberRepository memberRepository; - private final TrackRepository trackRepository; - - public MemberAcceptanceFixture( - MemberRepository memberRepository, - TrackRepository trackRepository - ) { - this.memberRepository = memberRepository; - this.trackRepository = trackRepository; - } - - public Member 최준호(Track track) { - return memberRepository.save( - Member.builder() - .isDeleted(false) - .studentNumber("2019136135") - .imageUrl("https://imagetest.com/juno.jpg") - .name("최준호") - .position("Regular") - .track(track) - .email("testjuno@gmail.com") - .build() - ); - } - - public Member 박한수(Track track) { - return memberRepository.save( - Member.builder() - .isDeleted(false) - .studentNumber("2019136064") - .imageUrl("https://imagetest.com/juno.jpg") - .name("박한수") - .position("Regular") - .track(track) - .email("testhsp@gmail.com") - .build() - ); - } - - public Member 배진호(Track track) { - return memberRepository.save( - Member.builder() - .isDeleted(true) - .studentNumber("2020136061") - .imageUrl("https://imagetest.com/jino.jpg") - .name("배진호") - .position("Regular") - .track(track) - .email("testjhb@gmail.com") - .build() - ); - } - - public Member 최준호_삭제(Track track) { - return memberRepository.save( - Member.builder() - .isDeleted(true) - .studentNumber("2019136135") - .imageUrl("https://imagetest.com/juno.jpg") - .name("최준호") - .position("Regular") - .track(track) - .email("testjuno@gmail.com") - .build() - ); - } -} diff --git a/src/test/java/in/koreatech/koin/acceptance/fixture/TechStackAcceptanceFixture.java b/src/test/java/in/koreatech/koin/acceptance/fixture/TechStackAcceptanceFixture.java deleted file mode 100644 index 8453745462..0000000000 --- a/src/test/java/in/koreatech/koin/acceptance/fixture/TechStackAcceptanceFixture.java +++ /dev/null @@ -1,40 +0,0 @@ -package in.koreatech.koin.acceptance.fixture; - -import org.springframework.stereotype.Component; - -import in.koreatech.koin.domain.member.model.TechStack; -import in.koreatech.koin.domain.member.model.Track; -import in.koreatech.koin.domain.member.repository.TechStackRepository; - -@Component -public class TechStackAcceptanceFixture { - - private final TechStackRepository techStackRepository; - - public TechStackAcceptanceFixture(TechStackRepository techStackRepository) { - this.techStackRepository = techStackRepository; - } - - public TechStack java(Track track) { - return techStackRepository.save( - TechStack.builder() - .imageUrl("https://testimageurl.com") - .trackId(track.getId()) - .name("Java") - .description("Language") - .build() - ); - } - - public TechStack adobeFlash(Track track) { - return techStackRepository.save( - TechStack.builder() - .imageUrl("https://testimageurl.com") - .trackId(track.getId()) - .name("AdobeFlash") - .description("deleted") - .isDeleted(true) - .build() - ); - } -} diff --git a/src/test/java/in/koreatech/koin/acceptance/fixture/TrackAcceptanceFixture.java b/src/test/java/in/koreatech/koin/acceptance/fixture/TrackAcceptanceFixture.java deleted file mode 100644 index 5265afb6e7..0000000000 --- a/src/test/java/in/koreatech/koin/acceptance/fixture/TrackAcceptanceFixture.java +++ /dev/null @@ -1,49 +0,0 @@ -package in.koreatech.koin.acceptance.fixture; - -import org.springframework.stereotype.Component; - -import in.koreatech.koin.domain.member.model.Track; -import in.koreatech.koin.domain.member.repository.TrackRepository; - -@Component -public class TrackAcceptanceFixture { - - private final TrackRepository trackRepository; - - public TrackAcceptanceFixture(TrackRepository trackRepository) { - this.trackRepository = trackRepository; - } - - public Track backend() { - return trackRepository.save( - Track.builder() - .name("BackEnd") - .build() - ); - } - - public Track frontend() { - return trackRepository.save( - Track.builder() - .name("FrontEnd") - .build() - ); - } - - public Track ios() { - return trackRepository.save( - Track.builder() - .name("iOS") - .build() - ); - } - - public Track ai() { - return trackRepository.save( - Track.builder() - .name("AI") - .isDeleted(true) - .build() - ); - } -}