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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 125 additions & 0 deletions src/main/java/com/umc/timeto/block/controller/BlockController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
package com.umc.timeto.block.controller;

import com.umc.timeto.block.dto.BlockAddDTO;
import com.umc.timeto.block.dto.BlockResponseNumDTO;
import com.umc.timeto.block.service.BlockService;
import com.umc.timeto.global.apiPayload.code.ResponseCode;
import com.umc.timeto.global.apiPayload.dto.ResponseDTO;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.YearMonth;
import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/block")
public class BlockController {

private final BlockService blockService;

private Long getMemberId(Authentication authentication) {
return (Long) authentication.getPrincipal();
}

@Operation(summary = "νƒ€μž„λΈ”λŸ­ μ €μž₯", description = "ν•  일 μ‹œμž‘ μ‹œκ°„μ„ λ°›μ•„μ„œ 블둝을 μ €μž₯ν•©λ‹ˆλ‹€. λΈ”λ‘μ—λŠ” 일정 κ²ΉμΉ¨ 검사가 μ‘΄μž¬ν•©λ‹ˆλ‹€." +
"(ex: 일정 1이 7:30~8:30 일떄, 일정2의 생성/이동은 8:30λΆ„ 이상뢀터 κ°€λŠ₯)")
@PatchMapping("/{todoId}")
public ResponseEntity<?> createBlock(
@PathVariable Long todoId,
@RequestBody BlockAddDTO req,
Authentication authentication
) {
var res= blockService.createBlock(todoId, req, getMemberId(authentication));

return ResponseEntity
.status(ResponseCode.SUCCESS_ADD_BLOCK.getStatus().value())
.body(new ResponseDTO<>(ResponseCode.SUCCESS_ADD_BLOCK, res));
}

@Operation(summary = "λ‚ μ§œλ³„ νƒ€μž„λΈ”λŸ­ 쑰회", description = "μž…λ ₯받은 λ‚ μ§œ(yyyy-MM-DD)에 μƒμ„±λœ νƒ€μž„ λΈ”λŸ­λ“€μ„ μ‘°νšŒν•©λ‹ˆλ‹€ 블둝 쑰회 κΈ°λ³Έ(메인) 화면에 μ‚¬μš©ν•©λ‹ˆλ‹€. ")
@GetMapping("/day")
public ResponseEntity<?> getBlockByDay(
// κΈ°λ³Έ format: yyyy-MM-DD
@RequestParam LocalDate date,
Authentication authentication
) {
var res= blockService.getBlockByDay(date, getMemberId(authentication));

return ResponseEntity
.status(ResponseCode.SUCCESS_GET_BLOCKLIST.getStatus().value())
.body(new ResponseDTO<>(ResponseCode.SUCCESS_GET_BLOCKLIST, res));
}

@Operation(summary = "ν•œλ‹¬ λ‚ μ§œλ³„ νƒ€μž„λΈ”λŸ­ 수",
description = "μž…λ ₯받은 λ‚ μ§œ(YYYY-MM)에 μƒμ„±λœ νƒ€μž„ λΈ”λŸ­ 수λ₯Ό μ‘°νšŒν•©λ‹ˆλ‹€")
@GetMapping("/month")
public ResponseEntity<ResponseDTO<List<BlockResponseNumDTO>>> getBlockNumByMonth(
@RequestParam
@DateTimeFormat(pattern = "yyyy-MM")
YearMonth yearMonth,
Authentication authentication
) {

var res = blockService.getBlockNumByMonth(yearMonth, getMemberId(authentication));

return ResponseEntity
.status(ResponseCode.SUCCESS_GET_BLOCK_NUMBER.getStatus().value())
.body(new ResponseDTO<>(ResponseCode.SUCCESS_GET_BLOCK_NUMBER, res));
}

@Operation(summary = "블둝 μ†Œμš”μ‹œκ°„ λ³€κ²½",
description = "블둝 μ†Œμš”μ‹œκ°„ λ³€κ²½ μ‹œ μ‚¬μš©ν•©λ‹ˆλ‹€. ν•  일 λ‚΄λΆ€μ—μ„œλ§Œ μ†Œμš”μ‹œκ°„ 변경이 κ°€λŠ₯ν•˜λ‹€λ©΄ μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€. ")
@PatchMapping("/{blockId}/duration")
public ResponseEntity<ResponseDTO<Void>> updateDuration(
@PathVariable Long blockId,
@RequestParam LocalTime duration,
Authentication authentication
) {

blockService.updateBlockDuration(
blockId,
getMemberId(authentication),
duration
);

return ResponseEntity.ok(
new ResponseDTO<>(ResponseCode.SUCCESS_UPDATE_BLOCK, null)
);
}


@Operation(summary = "블둝 이동",
description = "블둝을 λ“œλž˜κ·Έ&λ“œλ‘­μœΌλ‘œ μ΄λ™ν–ˆμ„ λ•Œ 정보λ₯Ό κ°±μ‹ ν•©λ‹ˆλ‹€. λ³€κ²½λœ μ‹œμž‘ μ‹œκ°„μ„ μž…λ ₯으둜 λ°›μŠ΅λ‹ˆλ‹€. " +
"μ΄λ™λœ μ‹œκ°„μ΄ λ‹€λ₯Έ 일정과 κ²ΉμΉ  경우 κ°±μ‹ λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. startAt format: yyyy-MM-dd'T'HH:mm")
@PatchMapping("/{blockId}/move")
public ResponseEntity<ResponseDTO<Void>> moveBlock(
@PathVariable Long blockId,
@RequestParam
@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm")
LocalDateTime startAt,
Authentication authentication
) {

blockService.moveBlock(
blockId,
getMemberId(authentication),
startAt
);

return ResponseEntity.ok(
new ResponseDTO<>(ResponseCode.SUCCESS_UPDATE_BLOCK, null)
);
}




}
21 changes: 21 additions & 0 deletions src/main/java/com/umc/timeto/block/dto/BlockAddDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.umc.timeto.block.dto;


import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import java.time.LocalDateTime;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BlockAddDTO {
@NotBlank(message = "startAt은 ν•„μˆ˜ μž…λ ₯ κ°’μž…λ‹ˆλ‹€.")
@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm")
private LocalDateTime startAt;
}
18 changes: 18 additions & 0 deletions src/main/java/com/umc/timeto/block/dto/BlockResponseDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.umc.timeto.block.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BlockResponseDTO {
private Long blockId;
private Long todoId;
private LocalDateTime startAt;
private LocalDateTime endAt;
}
28 changes: 28 additions & 0 deletions src/main/java/com/umc/timeto/block/dto/BlockResponseDetailDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.umc.timeto.block.dto;

import com.umc.timeto.todo.domain.enums.TodoPriority;
import com.umc.timeto.todo.domain.enums.TodoState;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BlockResponseDetailDTO {
private Long blockId;
private Long todoId;
private LocalDateTime startAt;
private LocalDateTime endAt;
private String todoName;
private TodoPriority priority;
private TodoState state;
private String goalName;
private String color;


}
18 changes: 18 additions & 0 deletions src/main/java/com/umc/timeto/block/dto/BlockResponseNumDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.umc.timeto.block.dto;


import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDate;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BlockResponseNumDTO {
private LocalDate date;
private Long count;
}
68 changes: 68 additions & 0 deletions src/main/java/com/umc/timeto/block/entity/Block.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package com.umc.timeto.block.entity;

import com.umc.timeto.todo.domain.Todo;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import java.time.LocalDateTime;
import java.time.LocalTime;

@Entity
@Getter
@NoArgsConstructor
public class Block {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long blockId;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "todo_id")
private Todo todo;

@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm")
private LocalDateTime startAt;
@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm")
private LocalDateTime endAt;
// blockμ—μ„œλŠ” startAt, endAt μž…λ ₯λ°›κ³  todoo 에 startAt μ €μž₯ 및 duration update
//Duration: localtime

public Block(Todo todo, LocalDateTime startAt) {
this.todo=todo;

LocalDateTime normalizedStart = normalize(startAt);
this.startAt = normalizedStart;
LocalTime duration = todo.getDuration();

LocalDateTime calculatedEnd = normalizedStart
.plusHours(duration.getHour())
.plusMinutes(duration.getMinute());

this.endAt = normalize(calculatedEnd);
}

public void updateTime(LocalDateTime startAt, LocalDateTime endAt) {
this.startAt = normalize(startAt);
this.endAt = normalize(endAt);
}

private LocalDateTime normalize(LocalDateTime time) {
return time.withSecond(0).withNano(0);
}

@PrePersist
@PreUpdate
private void trimSeconds() {
if (startAt != null) {
startAt = startAt.withSecond(0).withNano(0);
}
if (endAt != null) {
endAt = endAt.withSecond(0).withNano(0);
}
}



}
40 changes: 40 additions & 0 deletions src/main/java/com/umc/timeto/block/repository/BlockRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.umc.timeto.block.repository;

import com.umc.timeto.block.entity.Block;
import org.springframework.data.jpa.repository.JpaRepository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

public interface BlockRepository extends JpaRepository<Block, Long> {
Optional<Block> findByTodo_TodoId(Long todoId);


List<Block> findByTodo_Folder_Goal_Member_MemberIdAndStartAtBetween(
Long memberId,
LocalDateTime start,
LocalDateTime end
);
List<Block> findByTodo_Folder_Goal_Member_MemberIdAndStartAtGreaterThanEqualAndStartAtLessThan(
Long memberId,
LocalDateTime start,
LocalDateTime end
);


List<Block> findByTodo_Folder_Goal_Member_MemberIdAndStartAtLessThanAndEndAtGreaterThan(
Long memberId,
LocalDateTime endAt,
LocalDateTime startAt
);

List<Block> findByTodo_Folder_Goal_Member_MemberIdAndBlockIdNotAndStartAtLessThanAndEndAtGreaterThan(
Long memberId,
Long blockId,
LocalDateTime endAt,
LocalDateTime startAt
);

Optional<Block> findByBlockIdAndTodo_Folder_Goal_Member_MemberId(Long blockId, Long memberId);
}
33 changes: 33 additions & 0 deletions src/main/java/com/umc/timeto/block/service/BlockService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.umc.timeto.block.service;

import com.umc.timeto.block.dto.BlockAddDTO;
import com.umc.timeto.block.dto.BlockResponseDTO;
import com.umc.timeto.block.dto.BlockResponseDetailDTO;
import com.umc.timeto.block.dto.BlockResponseNumDTO;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.YearMonth;
import java.util.List;

public interface BlockService {
BlockResponseDTO createBlock(Long todoId, BlockAddDTO req, Long memberId);


List<BlockResponseDetailDTO> getBlockByDay(LocalDate date, Long memberId);

List<BlockResponseNumDTO> getBlockNumByMonth(YearMonth yearMonth, Long memberId);

BlockResponseDTO updateBlockDuration(Long blockId, Long memberId, LocalTime newDuration);
void updateBlockDurationByTodo(Long todoId, Long memberId, LocalTime newDuration);


BlockResponseDTO moveBlock(Long blockId, Long memberId, LocalDateTime newStart);






}
Loading