diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/RegisterMemberCsvController.java b/src/main/java/clap/server/adapter/inbound/web/admin/RegisterMemberCsvController.java index b0a982a3..cce5b486 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/RegisterMemberCsvController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/RegisterMemberCsvController.java @@ -7,14 +7,19 @@ import clap.server.exception.AdapterException; import clap.server.exception.code.FileErrorcode; 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.tags.Tag; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.annotation.Secured; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; @@ -27,11 +32,12 @@ public class RegisterMemberCsvController { private final RegisterMemberCSVUsecase registerMemberCSVUsecase; @Operation(summary = "CSV 파일로 회원 등록 API") - @PostMapping("/members/upload") + @PostMapping(value = "/members/upload", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) @Secured("ROLE_ADMIN") public ResponseEntity registerMembersFromCsv( @AuthenticationPrincipal SecurityUserDetails userInfo, - @RequestParam("file") MultipartFile file) throws IOException { + @Parameter(content = @Content(mediaType = MediaType.MULTIPART_FORM_DATA_VALUE)) + @RequestParam("file") @NotNull MultipartFile file) throws IOException { if (!FileTypeValidator.validCSVFile(file.getInputStream())) { throw new AdapterException(FileErrorcode.UNSUPPORTED_FILE_TYPE);} int addedCount = registerMemberCSVUsecase.registerMembersFromCsv(userInfo.getUserId(), file); diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/FindMemberRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/FindMemberRequest.java index 5fa2249c..84a3b37a 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/FindMemberRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/FindMemberRequest.java @@ -3,7 +3,9 @@ import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; +import org.springdoc.core.annotations.ParameterObject; +@ParameterObject public record FindMemberRequest( @NotNull @Schema(description = "회원 이름", example = "양시훈") diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/RegisterMemberRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/RegisterMemberRequest.java index 10f82be1..89920c72 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/RegisterMemberRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/admin/request/RegisterMemberRequest.java @@ -24,7 +24,7 @@ public record RegisterMemberRequest( Long departmentId, @NotNull @Schema(description = "회원 역할") MemberRole role, - @NotBlank @Schema(description = "회원 직책") + @Schema(description = "회원 직책") String departmentRole ) { } diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/log/request/FilterLogRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/log/request/FilterLogRequest.java index 6685d933..cbdea698 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/log/request/FilterLogRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/log/request/FilterLogRequest.java @@ -3,9 +3,11 @@ import clap.server.adapter.outbound.persistense.entity.log.constant.LogStatus; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; +import org.springdoc.core.annotations.ParameterObject; import java.util.List; +@ParameterObject public record FilterLogRequest( @Schema(description = "검색 기간 (단위: 시간)", example = "1, 24, 168, 730, 2190 (1시간, 24시간, 1주일, 1개월, 3개월)") diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/request/FilterTaskBoardRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/request/FilterTaskBoardRequest.java index 758e8720..9ba6fc4d 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/request/FilterTaskBoardRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/request/FilterTaskBoardRequest.java @@ -2,9 +2,11 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; +import org.springdoc.core.annotations.ParameterObject; import java.util.List; +@ParameterObject public record FilterTaskBoardRequest( @Schema(description = "라벨 ID") Long labelId, diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/request/FilterTaskListRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/request/FilterTaskListRequest.java index eb7f3527..07d0edc5 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/request/FilterTaskListRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/request/FilterTaskListRequest.java @@ -4,9 +4,11 @@ import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; +import org.springdoc.core.annotations.ParameterObject; import java.util.List; +@ParameterObject public record FilterTaskListRequest( @Schema(description = "검색 기간 (단위: 시간)", example = "1, 24, 168, 730, 2190 (1시간, 24시간, 1주일, 1개월, 3개월)") diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/request/FilterTeamStatusRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/request/FilterTeamStatusRequest.java index 91524ffc..5c73089b 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/request/FilterTeamStatusRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/request/FilterTeamStatusRequest.java @@ -3,9 +3,11 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import org.springdoc.core.annotations.ParameterObject; import java.util.List; +@ParameterObject public record FilterTeamStatusRequest( @Schema(description = "정렬 기준 (기여도순, 기본)", example = "DEFAULT") @NotNull diff --git a/src/main/java/clap/server/adapter/inbound/web/history/PostCommentController.java b/src/main/java/clap/server/adapter/inbound/web/history/PostCommentController.java index 18b020ec..a4998c77 100644 --- a/src/main/java/clap/server/adapter/inbound/web/history/PostCommentController.java +++ b/src/main/java/clap/server/adapter/inbound/web/history/PostCommentController.java @@ -10,6 +10,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; @@ -47,6 +48,7 @@ public void createComment( public void createAttachmentComment( @AuthenticationPrincipal SecurityUserDetails userInfo, @PathVariable Long taskId, + @Parameter(content = @Content(mediaType = MediaType.MULTIPART_FORM_DATA_VALUE)) @RequestPart(name = "attachment") @NotNull MultipartFile attachment) { saveCommentAttachmentUsecase.saveCommentAttachment(userInfo.getUserId(), taskId, attachment); } diff --git a/src/main/java/clap/server/adapter/inbound/web/member/MemberInfoController.java b/src/main/java/clap/server/adapter/inbound/web/member/MemberInfoController.java index b82a0863..45863739 100644 --- a/src/main/java/clap/server/adapter/inbound/web/member/MemberInfoController.java +++ b/src/main/java/clap/server/adapter/inbound/web/member/MemberInfoController.java @@ -12,6 +12,8 @@ import clap.server.exception.ApplicationException; import clap.server.exception.code.FileErrorcode; 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.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; @@ -50,6 +52,7 @@ public ResponseEntity getMemberDetailInfo(@Authenticat @PatchMapping(value = "/info", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_VALUE}) public void updateMemberDetailInfo( @RequestPart(name = "memberInfo") UpdateMemberInfoRequest request, + @Parameter(description = "image/jpeg, image/pjpeg, image/png, image/gif, image/bmp, image/x-windows-bmp 형식만 가능합니다.", content = @Content(mediaType = MediaType.MULTIPART_FORM_DATA_VALUE)) @RequestPart(name = "profileImage", required = false) MultipartFile profileImage, @AuthenticationPrincipal SecurityUserDetails userInfo) throws IOException { if (profileImage !=null && !FileTypeValidator.validImageFile(profileImage.getInputStream())) { diff --git a/src/main/java/clap/server/adapter/inbound/web/task/ChangeTaskController.java b/src/main/java/clap/server/adapter/inbound/web/task/ChangeTaskController.java index f35fc290..10cb98f0 100644 --- a/src/main/java/clap/server/adapter/inbound/web/task/ChangeTaskController.java +++ b/src/main/java/clap/server/adapter/inbound/web/task/ChangeTaskController.java @@ -14,8 +14,6 @@ import clap.server.common.annotation.architecture.WebAdapter; import clap.server.common.annotation.log.LogType; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; diff --git a/src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java b/src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java index b721536e..193c68fe 100644 --- a/src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java +++ b/src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java @@ -12,7 +12,8 @@ import clap.server.exception.AdapterException; import clap.server.exception.code.TaskErrorCode; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; @@ -43,8 +44,9 @@ public class ManagementTaskController { @PostMapping(consumes = {MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_VALUE}) @Secured({"ROLE_MANAGER", "ROLE_USER"}) public ResponseEntity createTask( + @Parameter(description = "작업 내용", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE)) @RequestPart(name = "taskInfo") @Valid CreateTaskRequest createTaskRequest, - @Schema(description = "파일은 5개 이하만 업로드 가능합니다.") + @Parameter(description = "파일은 5개 이하만 업로드 가능합니다.", content = @Content(mediaType = MediaType.MULTIPART_FORM_DATA_VALUE)) @RequestPart(name = "attachment", required = false) List attachments, @AuthenticationPrincipal SecurityUserDetails userInfo ) { @@ -60,7 +62,7 @@ public ResponseEntity createTask( public void updateTask( @PathVariable @NotNull Long taskId, @RequestPart(name = "taskInfo") @Valid UpdateTaskRequest updateTaskRequest, - @Schema(description = "하나의 작업에는 총 5개 이하만 업로드 가능합니다.") + @Parameter(description = "파일은 5개 이하만 업로드 가능합니다.", content = @Content(mediaType = MediaType.MULTIPART_FORM_DATA_VALUE)) @RequestPart(name = "attachment", required = false) List attachments, @AuthenticationPrincipal SecurityUserDetails userInfo) { if (attachments != null && attachments.size() > 5) { diff --git a/src/main/java/clap/server/adapter/outbound/persistense/entity/log/constant/LogStatus.java b/src/main/java/clap/server/adapter/outbound/persistense/entity/log/constant/LogStatus.java index 849cb05b..34a99aba 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/entity/log/constant/LogStatus.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/entity/log/constant/LogStatus.java @@ -7,7 +7,6 @@ @RequiredArgsConstructor public enum LogStatus { LOGIN("로그인"), - LOGOUT("로그아웃"), REQUEST_CREATED("요청 생성"), REQUEST_UPDATED("요청 수정"), REQUEST_CANCELLED("요청 취소"), diff --git a/src/main/java/clap/server/adapter/outbound/persistense/entity/task/TaskEntity.java b/src/main/java/clap/server/adapter/outbound/persistense/entity/task/TaskEntity.java index d5f465c0..6227a4ea 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/entity/task/TaskEntity.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/entity/task/TaskEntity.java @@ -5,9 +5,11 @@ import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; import jakarta.persistence.*; import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import org.hibernate.annotations.SQLRestriction; import java.time.LocalDateTime; @@ -16,6 +18,7 @@ @Getter @SuperBuilder @NoArgsConstructor(access = AccessLevel.PROTECTED) +@SQLRestriction("is_deleted = false") public class TaskEntity extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -68,4 +71,8 @@ public class TaskEntity extends BaseTimeEntity { @Column(nullable = false) private int attachmentCount; + + @Column(name="is_deleted", nullable = false) + @Builder.Default + private boolean isDeleted = Boolean.FALSE; } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/mapper/TaskPersistenceMapper.java b/src/main/java/clap/server/adapter/outbound/persistense/mapper/TaskPersistenceMapper.java index 053d8290..1f312abe 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/mapper/TaskPersistenceMapper.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/mapper/TaskPersistenceMapper.java @@ -1,10 +1,20 @@ package clap.server.adapter.outbound.persistense.mapper; +import clap.server.adapter.outbound.persistense.entity.task.CommentEntity; import clap.server.adapter.outbound.persistense.entity.task.TaskEntity; import clap.server.adapter.outbound.persistense.mapper.common.PersistenceMapper; +import clap.server.domain.model.task.Comment; import clap.server.domain.model.task.Task; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; @Mapper(componentModel = "spring", uses = {MemberPersistenceMapper.class, LabelPersistenceMapper.class, CategoryPersistenceMapper.class}) public interface TaskPersistenceMapper extends PersistenceMapper { + @Override + @Mapping(source = "deleted", target = "isDeleted") + Task toDomain(final TaskEntity entity); + + @Override + @Mapping(source = "deleted", target = "isDeleted") + TaskEntity toEntity(final Task domain); } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/log/AnonymousLogCustomRepositoryImpl.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/log/AnonymousLogCustomRepositoryImpl.java index cc9aefea..80cc61b2 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/log/AnonymousLogCustomRepositoryImpl.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/log/AnonymousLogCustomRepositoryImpl.java @@ -36,7 +36,7 @@ public Page filterAnonymousLogs(FilterLogRequest request, Pa builder.and(anonymousLogEntity.loginNickname.contains(request.nickName())); } if (!request.clientIp().isEmpty()) { - builder.and(anonymousLogEntity.clientIp.contains(request.clientIp())); + builder.and(anonymousLogEntity.clientIp.startsWith(request.clientIp())); } OrderSpecifier orderSpecifier = sortDirection.equalsIgnoreCase("ASC") ? anonymousLogEntity.requestAt.asc() diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/log/MemberLogCustomRepositoryImpl.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/log/MemberLogCustomRepositoryImpl.java index 29154e8e..dca33624 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/log/MemberLogCustomRepositoryImpl.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/log/MemberLogCustomRepositoryImpl.java @@ -40,7 +40,7 @@ public Page filterMemberLogs(FilterLogRequest request, Pageable builder.and(memberEntity.nickname.contains(request.nickName())); } if (!request.clientIp().isEmpty()) { - builder.and(memberLogEntity.clientIp.contains(request.clientIp())); + builder.and(memberLogEntity.clientIp.startsWith(request.clientIp())); } OrderSpecifier orderSpecifier = sortDirection.equalsIgnoreCase("ASC") ? memberLogEntity.requestAt.asc() @@ -56,6 +56,7 @@ public Page filterMemberLogs(FilterLogRequest request, Pageable .fetch(); long total = queryFactory .selectFrom(memberLogEntity) + .leftJoin(memberLogEntity.member, memberEntity) .where(builder) .fetch().size(); return new PageImpl<>(result, pageable, total); diff --git a/src/main/java/clap/server/application/service/admin/CsvParseService.java b/src/main/java/clap/server/application/service/admin/CsvParseService.java index 38578481..8d2db89a 100644 --- a/src/main/java/clap/server/application/service/admin/CsvParseService.java +++ b/src/main/java/clap/server/application/service/admin/CsvParseService.java @@ -61,7 +61,7 @@ private Member mapToMember(String[] fields, List departments) { .findFirst() .orElseThrow(() -> new ApplicationException(DepartmentErrorCode.DEPARTMENT_NOT_FOUND)); - managerDepartmentPolicy.validateDepartment(department, MemberRole.valueOf(fields[3].trim())); + managerDepartmentPolicy.validateDepartment(department, MemberRole.valueOf(fields[5].trim())); MemberInfo memberInfo = toMemberInfo( fields[0].trim(), // name fields[4].trim(), // email diff --git a/src/main/java/clap/server/application/service/history/PostCommentService.java b/src/main/java/clap/server/application/service/history/PostCommentService.java index 416a14db..eaa20d31 100644 --- a/src/main/java/clap/server/application/service/history/PostCommentService.java +++ b/src/main/java/clap/server/application/service/history/PostCommentService.java @@ -25,6 +25,8 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import java.util.Objects; + @ApplicationService @RequiredArgsConstructor public class PostCommentService implements SaveCommentUsecase, SaveCommentAttachmentUsecase { @@ -54,10 +56,10 @@ public void save(Long memberId, Long taskId, CreateCommentRequest request) { Member processor = task.getProcessor(); Member requester = task.getRequester(); - if (member.getMemberInfo().getRole() == MemberRole.ROLE_USER) { - publishNotification(processor, task, request.content(), requester.getNickname()); + if (Objects.equals(member.getMemberId(), requester.getMemberId())) { + publishNotification(processor, task, request.content(), member.getNickname()); } else { - publishNotification(requester, task, request.content(), processor.getNickname()); + publishNotification(requester, task, request.content(), member.getNickname()); } } diff --git a/src/main/java/clap/server/application/service/log/LogService.java b/src/main/java/clap/server/application/service/log/LogService.java index 019ef2ba..b241d521 100644 --- a/src/main/java/clap/server/application/service/log/LogService.java +++ b/src/main/java/clap/server/application/service/log/LogService.java @@ -5,7 +5,6 @@ import clap.server.application.port.outbound.auth.loginLog.LoadLoginLogPort; import clap.server.application.port.outbound.log.CommandLogPort; import clap.server.application.port.outbound.log.LoggingPort; -import clap.server.common.utils.ClientIpParseUtil; import clap.server.domain.model.auth.LoginLog; import clap.server.domain.model.log.AnonymousLog; import clap.server.domain.model.log.MemberLog; diff --git a/src/main/java/clap/server/config/aop/LoggingAspect.java b/src/main/java/clap/server/config/aop/LoggingAspect.java index da7de978..90b745ae 100644 --- a/src/main/java/clap/server/config/aop/LoggingAspect.java +++ b/src/main/java/clap/server/config/aop/LoggingAspect.java @@ -7,7 +7,6 @@ import clap.server.common.annotation.log.LogType; import clap.server.exception.BaseException; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -88,9 +87,9 @@ public Object logApiRequests(ProceedingJoinPoint joinPoint) throws Throwable { private void handleLoginLog(int statusCode, HttpServletRequest request, String customCode, LogStatus logStatus, Object result) throws JsonProcessingException { if (statusCode == HttpStatus.SC_OK) { - loggingPort.createAnonymousLog(request, statusCode, customCode, logStatus, result, getRequestBody(request), getNicknameFromRequestBody(request)); + loggingPort.createAnonymousLog(request, statusCode, customCode, logStatus, result, getRequestBody(request), getNicknameFromParameter(request)); } else { - loggingPort.createLoginFailedLog(request, statusCode, customCode, logStatus, getRequestBody(request), getNicknameFromRequestBody(request)); + loggingPort.createLoginFailedLog(request, statusCode, customCode, logStatus, getRequestBody(request), getNicknameFromParameter(request)); } } @@ -102,14 +101,8 @@ private LogStatus getLogType(MethodSignature methodSignature) { } } - private String getNicknameFromRequestBody(HttpServletRequest request) { - try { - String requestBody = getRequestBody(request); - JsonNode jsonNode = objectMapper.readTree(requestBody); - return jsonNode.has("nickname") ? jsonNode.get("nickname").asText() : null; - } catch (Exception e) { - return null; - } + private String getNicknameFromParameter(HttpServletRequest request) { + return request.getParameter("nickname"); } private String getRequestBody(HttpServletRequest request) { diff --git a/src/main/java/clap/server/domain/model/task/Attachment.java b/src/main/java/clap/server/domain/model/task/Attachment.java index 3d48ff55..21f02f64 100644 --- a/src/main/java/clap/server/domain/model/task/Attachment.java +++ b/src/main/java/clap/server/domain/model/task/Attachment.java @@ -45,9 +45,13 @@ public void softDelete() { } public static String formatFileSize(long size) { - if (size < 1024) return size + " B"; - int z = (63 - Long.numberOfLeadingZeros(size)) / 10; - return String.format("%.1f %sB", (double) size / (1L << (z * 10)), " KMGTPE".charAt(z)); + if (size < 1024) { + return size + " B"; + } else if (size < 1024 * 1024) { + return String.format("%.1f KB", size / 1024.0); + } else { + return String.format("%.1f MB", size / (1024.0 * 1024.0)); + } } } diff --git a/src/main/java/clap/server/domain/model/task/Task.java b/src/main/java/clap/server/domain/model/task/Task.java index 0352b2e0..d3b80a16 100644 --- a/src/main/java/clap/server/domain/model/task/Task.java +++ b/src/main/java/clap/server/domain/model/task/Task.java @@ -36,6 +36,7 @@ public class Task extends BaseTime { private LocalDateTime dueDate; private LocalDateTime finishedAt; private int attachmentCount; + private boolean isDeleted; public static Task createTask(Member member, Category category, String title, String description, int attachmentCount) { return Task.builder() @@ -116,6 +117,7 @@ public void cancelTask(Long requesterId) { throw new DomainException(NOT_A_REQUESTER); } this.taskStatus = TaskStatus.TERMINATED; + this.isDeleted = true; this.finishedAt = LocalDateTime.now(); } } diff --git a/src/main/resources/db/migration/dev/V20250210365__Modify_Log_Status_From_Api_Log.sql b/src/main/resources/db/migration/dev/V20250210365__Modify_Log_Status_From_Api_Log.sql new file mode 100644 index 00000000..b9b69e64 --- /dev/null +++ b/src/main/resources/db/migration/dev/V20250210365__Modify_Log_Status_From_Api_Log.sql @@ -0,0 +1,4 @@ +ALTER TABLE api_log + MODIFY COLUMN log_status ENUM('LOGIN', 'REQUEST_CREATED', 'REQUEST_UPDATED', 'REQUEST_CANCELLED', + 'REQUEST_APPROVED', 'ASSIGNER_CHANGED', 'COMMENT_ADDED', + 'COMMENT_UPDATED', 'STATUS_CHANGED', 'TASK_VIEWED') NOT NULL; \ No newline at end of file diff --git a/src/main/resources/db/migration/dev/V20250210367__Add_Is_Deleted_From_Task.sql b/src/main/resources/db/migration/dev/V20250210367__Add_Is_Deleted_From_Task.sql new file mode 100644 index 00000000..bcda8a24 --- /dev/null +++ b/src/main/resources/db/migration/dev/V20250210367__Add_Is_Deleted_From_Task.sql @@ -0,0 +1,2 @@ +ALTER TABLE task + ADD COLUMN is_deleted BOOLEAN DEFAULT FALSE; \ No newline at end of file diff --git a/src/test/java/clap/server/application/service/admin/RegisterMemberCsvServiceTest.java b/src/test/java/clap/server/application/service/admin/RegisterMemberCSVServiceTest.java similarity index 97% rename from src/test/java/clap/server/application/service/admin/RegisterMemberCsvServiceTest.java rename to src/test/java/clap/server/application/service/admin/RegisterMemberCSVServiceTest.java index e28b309b..623a9384 100644 --- a/src/test/java/clap/server/application/service/admin/RegisterMemberCsvServiceTest.java +++ b/src/test/java/clap/server/application/service/admin/RegisterMemberCSVServiceTest.java @@ -3,6 +3,8 @@ import clap.server.application.port.inbound.domain.MemberService; import clap.server.application.port.outbound.member.CommandMemberPort; import clap.server.application.port.outbound.member.LoadMemberPort; +import clap.server.application.service.admin.CsvParseService; +import clap.server.application.service.admin.RegisterMemberCSVService; import clap.server.domain.model.member.Department; import clap.server.domain.model.member.Member; import clap.server.domain.model.member.MemberInfo;