Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
1438e42
Merge pull request #197 from CodIN-INU/develop
X1n9fU Mar 31, 2025
a5d7c59
Merge pull request #198 from CodIN-INU/develop
X1n9fU Mar 31, 2025
9a188ff
Merge pull request #199 from CodIN-INU/develop
X1n9fU Mar 31, 2025
a8347f4
Merge pull request #200 from CodIN-INU/develop
X1n9fU Apr 1, 2025
7470b29
Merge pull request #201 from CodIN-INU/develop
X1n9fU Apr 1, 2025
536e1b9
Merge pull request #205 from CodIN-INU/develop
X1n9fU Apr 4, 2025
6ce9683
chore : 허용된 email 추가
X1n9fU Apr 11, 2025
d9e33b8
refactor: Email 도메인 리팩토링
doma17 Jun 23, 2025
7c9007e
remove: EmailAuthService, EmailSendService 제거
doma17 Jun 23, 2025
a252670
test: Email Service 테스트 추가
doma17 Jun 24, 2025
878ffa1
refactor: #207 수정사항 적용
doma17 Jun 25, 2025
6ad71a1
refactor: #207 수정사항 적용 2
doma17 Jun 25, 2025
e2db74e
fixup! refactor: #207 수정사항 적용 2
doma17 Jun 25, 2025
63ad8ec
refactor: #207 수정사항 적용 3
doma17 Jun 25, 2025
03b6114
test: #207 수정사항 적용 5
doma17 Jun 25, 2025
5a0de40
test: #207 수정사항 적용 6
doma17 Jun 25, 2025
7cb6206
refactor : Info package 내부 구조 평탄화
X1n9fU Jun 30, 2025
a78eaa4
feat : Partner(제휴 업체) Entity 설계 및 Read 기능 구현
X1n9fU Jun 30, 2025
1d54470
fix : GlobalException, ErrorCode interface 설정. ChatException 제작
X1n9fU Jun 27, 2025
456f8bd
fix : 불필요한 Getter 삭제 및 GlobalExceptionHandler에 ChattingException 추가
X1n9fU Jun 27, 2025
e4635d0
style : 코드 스타일 일치를 위한 공백 제거
X1n9fU Jun 30, 2025
4e665a9
refactor : InfoException, InfoErrorCode 생성 및 GlobalExceptionHandler 에 추가
X1n9fU Jun 30, 2025
987cd1d
feat : Partner create 로직 제작
X1n9fU Jun 30, 2025
90795f3
fix : Scheme 작성 및 Department의 JSON 매핑 로직 추가
X1n9fU Jun 30, 2025
9ba2370
feat : 제휴업체 삭제 로직 추가 및 생성 시 이미지 업로드 진행
X1n9fU Jul 1, 2025
f1f851c
test : 제휴업체 기능 반환, 생성, 삭제 로직 테스트 코드 작성
X1n9fU Jul 1, 2025
a55c3c1
fix : JsonCreator name과 value 모두 조회하도록 수정, JsonValue에서 description이 아…
X1n9fU Jul 1, 2025
84e61e0
feat : 제휴업체 위치 location 필드 추가
X1n9fU Jul 1, 2025
e6c1c49
fix : 이미지가 없어도 생성 가능하도록 로직 수정
X1n9fU Jul 1, 2025
11d2eb9
refactor : 코드 인라인화, 불필요한 트랜잭션 삭제
X1n9fU Jul 1, 2025
87db5f8
refactor : 잠시 주석처리, chat 기능 추합 후 주석 해제
X1n9fU Jul 1, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion src/main/java/inu/codin/codin/common/dto/Department.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package inu.codin.codin.common.dto;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Getter
@RequiredArgsConstructor
@Slf4j
public enum Department {

IT_COLLEGE("정보기술대학"),
Expand All @@ -17,13 +21,20 @@ public enum Department {

private final String description;

@JsonCreator
public static Department fromDescription(String description) {
for (Department department : Department.values()) {
if (department.getDescription().equals(description)) {
if (department.name().equals(description) || department.getDescription().equals(description)) {
return department;
}
}

log.warn("정보대 내의 학과가 아닙니다. description : " + description);
return OTHERS;
}

@JsonValue
public String toValue(){
return this.name();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@

import inu.codin.codin.common.response.ExceptionResponse;
import inu.codin.codin.common.security.exception.JwtException;
import inu.codin.codin.domain.chat.chatroom.exception.ChatRoomExistedException;
import inu.codin.codin.domain.chat.exception.*;
import inu.codin.codin.domain.info.exception.InfoErrorCode;
import inu.codin.codin.domain.info.exception.InfoException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.RedisSystemException;
import org.springframework.http.HttpStatus;
Expand Down Expand Up @@ -33,8 +36,8 @@ protected ResponseEntity<ExceptionResponse> handleGlobalException(GlobalExceptio
protected ResponseEntity<ExceptionResponse> handleChatRoomException(ChatRoomException e) {
ChatRoomErrorCode code = e.getErrorCode();
String message = code.message();
if (e instanceof ChatRoomExistedException existedException) //client 측에서 303 상태 코드 확인 후 message의 chatRoomId로 리다이렉션
message = message + "/" + existedException.getChatRoomId();
// if (e instanceof ChatRoomExistedException existedException) //client 측에서 303 상태 코드 확인 후 message의 chatRoomId로 리다이렉션
// message = message + "/" + existedException.getChatRoomId();
return ResponseEntity.status(code.httpStatus())
.body(new ExceptionResponse(message, code.httpStatus().value()));
}
Expand All @@ -46,6 +49,13 @@ protected ResponseEntity<ExceptionResponse> handleChattingException(ChattingExce
.body(new ExceptionResponse(code.message(), code.httpStatus().value()));
}

@ExceptionHandler(InfoException.class)
protected ResponseEntity<ExceptionResponse> handleInfoException(InfoException e) {
InfoErrorCode code = e.getErrorCode();
return ResponseEntity.status(code.httpStatus())
.body(new ExceptionResponse(code.message(), code.httpStatus().value()));
}

@ExceptionHandler(NotFoundException.class)
protected ResponseEntity<ExceptionResponse> handleNotFoundException(NotFoundException e) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package inu.codin.codin.domain.info.domain.lab.controller;
package inu.codin.codin.domain.info.controller;

import inu.codin.codin.common.response.ListResponse;
import inu.codin.codin.common.response.SingleResponse;
import inu.codin.codin.domain.info.domain.lab.dto.request.LabCreateUpdateRequestDto;
import inu.codin.codin.domain.info.domain.lab.dto.response.LabListResponseDto;
import inu.codin.codin.domain.info.domain.lab.dto.response.LabThumbnailResponseDto;
import inu.codin.codin.domain.info.domain.lab.service.LabService;
import inu.codin.codin.domain.info.dto.request.LabCreateUpdateRequestDto;
import inu.codin.codin.domain.info.dto.response.LabListResponseDto;
import inu.codin.codin.domain.info.dto.response.LabThumbnailResponseDto;
import inu.codin.codin.domain.info.service.LabService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package inu.codin.codin.domain.info.domain.office.controller;
package inu.codin.codin.domain.info.controller;

import inu.codin.codin.common.dto.Department;
import inu.codin.codin.common.response.SingleResponse;
import inu.codin.codin.domain.info.domain.office.dto.request.OfficeMemberCreateUpdateRequestDto;
import inu.codin.codin.domain.info.domain.office.dto.request.OfficeUpdateRequestDto;
import inu.codin.codin.domain.info.domain.office.service.OfficeService;
import inu.codin.codin.domain.info.dto.request.OfficeMemberCreateUpdateRequestDto;
import inu.codin.codin.domain.info.dto.request.OfficeUpdateRequestDto;
import inu.codin.codin.domain.info.service.OfficeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package inu.codin.codin.domain.info.controller;

import inu.codin.codin.common.response.ListResponse;
import inu.codin.codin.common.response.SingleResponse;
import inu.codin.codin.domain.info.dto.request.PartnerCreateRequestDto;
import inu.codin.codin.domain.info.dto.response.PartnerDetailsResponseDto;
import inu.codin.codin.domain.info.dto.response.PartnerListResponseDto;
import inu.codin.codin.domain.info.service.PartnerService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/info/partner")
@Tag(name = "Partner API", description = "Partner CRUD")
public class PartnerController {

private final PartnerService partnerService;

@Operation(
summary = "Partner 썸네일 리스트 반환"
)
@GetMapping
public ResponseEntity<ListResponse<PartnerListResponseDto>> getPartnerList() {
return ResponseEntity.ok()
.body(new ListResponse<>(200, "Partner 썸네일 리스트 반환 성공", partnerService.getPartnerList()));
}

@Operation(
summary = "Partner 상세 내역 반환"
)
@GetMapping("/{id}")
public ResponseEntity<SingleResponse<PartnerDetailsResponseDto>> getPartnerDetails(@PathVariable("id") String partnerId) {
return ResponseEntity.ok()
.body(new SingleResponse<>(200, "Partner 상세 내열 반환 성공", partnerService.getPartnerDetails(partnerId)));
}

@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_MANAGER')")
@Operation(
summary = "[ADMIN, MANAGER] Partner 추가"
)
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<?> createPartner(@RequestPart("partnerInfo") @Valid PartnerCreateRequestDto partnerCreateRequestDto,
@RequestPart(value = "mainImage", required = false) MultipartFile mainImage,
@RequestPart(value = "subImages", required = false) List<MultipartFile> subImages ) {
partnerService.createPartner(partnerCreateRequestDto, mainImage, subImages);
return ResponseEntity.status(HttpStatus.CREATED)
.body(new SingleResponse<>(201, "Partner 생성 완료", null));
}

@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_MANAGER')")
@Operation(
summary = "[ADMIN, MANAGER] Partner 삭제"
)
@DeleteMapping("/{id}")
public ResponseEntity<?> deletePartner(@PathVariable("id") String partnerId) {
partnerService.deletePartner(partnerId);
return ResponseEntity.ok()
.body(new SingleResponse<>(200, "Partner 삭제 완료", null));
}

/*
제휴업체 내용 수정
*/
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package inu.codin.codin.domain.info.domain.professor.controller;
package inu.codin.codin.domain.info.controller;

import inu.codin.codin.common.dto.Department;
import inu.codin.codin.common.response.ListResponse;
import inu.codin.codin.common.response.SingleResponse;
import inu.codin.codin.domain.info.domain.professor.dto.request.ProfessorCreateUpdateRequestDto;
import inu.codin.codin.domain.info.domain.professor.dto.response.ProfessorListResponseDto;
import inu.codin.codin.domain.info.domain.professor.dto.response.ProfessorThumbnailResponseDto;
import inu.codin.codin.domain.info.domain.professor.service.ProfessorService;
import inu.codin.codin.domain.info.dto.request.ProfessorCreateUpdateRequestDto;
import inu.codin.codin.domain.info.dto.response.ProfessorListResponseDto;
import inu.codin.codin.domain.info.dto.response.ProfessorThumbnailResponseDto;
import inu.codin.codin.domain.info.service.ProfessorService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package inu.codin.codin.domain.info.domain.lab.dto.request;
package inu.codin.codin.domain.info.dto.request;

import inu.codin.codin.common.dto.Department;
import io.swagger.v3.oas.annotations.media.Schema;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package inu.codin.codin.domain.info.domain.office.dto.request;
package inu.codin.codin.domain.info.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package inu.codin.codin.domain.info.domain.office.dto.request;
package inu.codin.codin.domain.info.dto.request;

import inu.codin.codin.domain.info.domain.office.entity.Office;
import inu.codin.codin.domain.info.entity.Office;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Builder;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package inu.codin.codin.domain.info.dto.request;

import inu.codin.codin.common.dto.Department;
import inu.codin.codin.domain.info.entity.PartnerImg;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import lombok.Builder;
import lombok.Getter;

import java.time.LocalDate;
import java.util.List;

@Getter
@Builder
public class PartnerCreateRequestDto {

@NotBlank
@Schema(description = "제휴업체 가게 이름", example = "홍콩반점 송도점")
private String name;

@NotEmpty
@Schema(description = "제휴 학과", example = "[\"COMPUTER_SCI\", \"INFO_COMM\", \"EMBEDDED\"]")
private List<Department> tags;

@NotEmpty
@Schema(description = "제휴 혜택", example = "[\"탕수육 주문 시, 탕수육 공짜!\", \"평일 언제나 80% 대박 할인!\"]")
private List<String> benefits;

@Schema(description = "제휴 시작 날짜", example = "2025-03-01")
private LocalDate startDate;

@Schema(description = "제휴 종료 날짜", example = "2026-03-01")
private LocalDate endDate;

@Schema(description = "제휴업체 가게 위치", example = "인천 연수구 송도동 3-2")
private String location;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package inu.codin.codin.domain.info.domain.professor.dto.request;
package inu.codin.codin.domain.info.dto.request;

import inu.codin.codin.common.dto.Department;
import io.swagger.v3.oas.annotations.media.Schema;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package inu.codin.codin.domain.info.domain.lab.dto.response;
package inu.codin.codin.domain.info.dto.response;

import inu.codin.codin.domain.info.domain.lab.entity.Lab;
import inu.codin.codin.domain.info.entity.Lab;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import org.bson.types.ObjectId;

/*
연구실 리스트 반환 DTO
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package inu.codin.codin.domain.info.domain.lab.dto.response;
package inu.codin.codin.domain.info.dto.response;

import inu.codin.codin.common.dto.Department;
import inu.codin.codin.domain.info.domain.lab.entity.Lab;
import inu.codin.codin.domain.info.entity.Lab;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Builder;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package inu.codin.codin.domain.info.domain.office.dto.response;
package inu.codin.codin.domain.info.dto.response;

import inu.codin.codin.common.dto.Department;
import inu.codin.codin.domain.info.domain.office.entity.Office;
import inu.codin.codin.domain.info.entity.Office;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Builder;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package inu.codin.codin.domain.info.domain.office.dto.response;
package inu.codin.codin.domain.info.dto.response;

import inu.codin.codin.domain.info.domain.office.entity.OfficeMember;
import inu.codin.codin.domain.info.entity.OfficeMember;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Builder;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package inu.codin.codin.domain.info.dto.response;

import com.fasterxml.jackson.annotation.JsonFormat;
import inu.codin.codin.common.dto.Department;
import inu.codin.codin.domain.info.entity.Partner;
import inu.codin.codin.domain.info.entity.PartnerImg;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Getter;

import java.time.LocalDate;
import java.util.List;

@Builder
@Getter
public class PartnerDetailsResponseDto {

@Schema(description = "제휴업체 가게 이름", example = "홍콩반점 송도점")
private String name;

@Schema(description = "제휴 학과", example = "[\"COMPUTER_SCI\", \"INFO_COMM\", \"EMBEDDED\"]")
private List<Department> tags;

@Schema(description = "제휴 혜택", example = "[\"탕수육 주문 시, 탕수육 공짜!\", \"평일 언제나 80% 대박 할인!\"]")
private List<String> benefits;

@Schema(description = "제휴 시작 날짜", example = "2025-03-01")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private LocalDate startDate;

@Schema(description = "제휴 종료 날짜", example = "2026-03-01")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
private LocalDate endDate;

@Schema(description = "제휴업체 가게 위치", example = "인천 연수구 송도동 3-2")
private String location;

@Schema(description = "제휴업체 가게 이미지")
private PartnerImg img;

public static PartnerDetailsResponseDto from(Partner partner){
return PartnerDetailsResponseDto.builder()
.name(partner.getName())
.tags(partner.getTags())
.benefits(partner.getBenefits())
.startDate(partner.getStartDate())
.endDate(partner.getEndDate())
.location(partner.getLocation())
.img(partner.getImg())
.build();
}
}
Loading