diff --git a/greendar/build.gradle b/greendar/build.gradle index 94f8194..bb241dd 100644 --- a/greendar/build.gradle +++ b/greendar/build.gradle @@ -26,6 +26,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-mail' implementation 'com.google.cloud:google-cloud-storage:2.17.1' implementation 'org.springframework.cloud:spring-cloud-gcp-starter-storage:1.2.8.RELEASE' + implementation 'junit:junit:4.13.1' developmentOnly 'org.springframework.boot:spring-boot-devtools' testImplementation 'org.springframework.boot:spring-boot-starter-test' diff --git a/greendar/build.sh b/greendar/build.sh index 998b10c..4cd12a1 100644 --- a/greendar/build.sh +++ b/greendar/build.sh @@ -1,7 +1,8 @@ #!/bin/bash +echo "start Build!" +./gradlew build PID="Greendar" echo $PID kill kill -9 $(ps -ef | grep $PID | grep -v grep | awk '{print $2 }') -./gradlew build echo "start Application!" nohup java -jar ./build/libs/Greendar.jar & \ No newline at end of file diff --git a/greendar/src/main/java/greendar/GreendarApplication.java b/greendar/src/main/java/greendar/GreendarApplication.java index ab22c0a..63d046a 100644 --- a/greendar/src/main/java/greendar/GreendarApplication.java +++ b/greendar/src/main/java/greendar/GreendarApplication.java @@ -2,7 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +@EnableJpaAuditing @SpringBootApplication public class GreendarApplication { diff --git a/greendar/src/main/java/greendar/domain/eventtodo/api/EventTodoApi.java b/greendar/src/main/java/greendar/domain/eventtodo/api/EventTodoApi.java index 99ee9c6..e01b946 100644 --- a/greendar/src/main/java/greendar/domain/eventtodo/api/EventTodoApi.java +++ b/greendar/src/main/java/greendar/domain/eventtodo/api/EventTodoApi.java @@ -1,19 +1,26 @@ package greendar.domain.eventtodo.api; import greendar.domain.eventtodo.application.EventTodoService; +import greendar.domain.eventtodo.domain.EventTodo; import greendar.domain.eventtodo.dto.EventTodoDtos.EventTodoCompleteUpdateRequestDto; +import greendar.domain.eventtodo.dto.EventTodoDtos.MonthlyAchievementRatio; +import greendar.domain.eventtodo.dto.EventTodoResponseDto; import greendar.domain.member.application.MemberService; import greendar.domain.member.domain.Member; +import greendar.domain.privatetodo.domain.PrivateTodo; import greendar.domain.privatetodo.dto.PrivateTodoDtos.DailyAchievementRatio; +import greendar.domain.privatetodo.dto.PrivateTodoDtos.PrivateTodoResponse; import greendar.global.common.ApiResponse; import greendar.infra.gcp.storage.application.FileService; import java.time.LocalDate; import java.util.List; import java.util.TreeMap; import java.util.stream.Collectors; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -32,26 +39,36 @@ public class EventTodoApi { private final MemberService memberService; private final EventTodoService eventTodoService; private final FileService fileService; - + @DeleteMapping(value = "/image") + public ApiResponse setTempoaryEventTodoImageUrl(@RequestHeader("Authorization") String firebaseToken, + @RequestParam("eventTodoItemId") Long eventTodoItemId) { + memberService.findOneByToken(firebaseToken); + EventTodo eventTodo =eventTodoService.updateEventTodo(null,"EMPTY",eventTodoItemId,firebaseToken); + if(eventTodo == null) return ApiResponse.fail(false); + return ApiResponse.success(true); + } @PutMapping(value = "/image",consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) public ApiResponse updateEventTodoImageUrlByItemId(@RequestHeader("Authorization") String firebaseToken, - @RequestParam("event_todo_id") Long event_todo_id, - @RequestParam("file") MultipartFile file) { - Member member = memberService.findOneByToken(firebaseToken); + @RequestParam("eventTodoItemId") Long eventTodoItemId, + @RequestParam("file") MultipartFile file) { + memberService.findOneByToken(firebaseToken); String imageUrl = fileService.uploadFile(file).getFileUrl(); - return ApiResponse.success(eventTodoService.updateEventTodo(null, imageUrl, - event_todo_id, firebaseToken)); + EventTodoResponseDto result = new EventTodoResponseDto(eventTodoService.updateEventTodo(null, imageUrl, + eventTodoItemId, firebaseToken)); + return ApiResponse.success(result); } @PutMapping(value = "/complete") public ApiResponse updateEventTodoCompleteByItemId(@RequestHeader("Authorization") String firebaseToken, @RequestBody EventTodoCompleteUpdateRequestDto request) { - return ApiResponse.success(eventTodoService.updateEventTodo(request.getComplete(),null, request.getEventTodoItemId(),firebaseToken)); + EventTodoResponseDto result = new EventTodoResponseDto(eventTodoService.updateEventTodo(request.getComplete(),null, request.getEventTodoItemId(),firebaseToken)); + return ApiResponse.success(result); } @GetMapping(value = "/{date}") public ApiResponse getEventTodoByDate(@RequestHeader("Authorization") String firebaseToken, @PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) { Member member = memberService.findOneByToken(firebaseToken); + if(member == null) return ApiResponse.fail("NoMember"); return ApiResponse.success(eventTodoService.getAllEventTodoByOneDay(date,member)); } @GetMapping(value = "/monthly/{date}") @@ -61,18 +78,25 @@ public ApiResponse getEventTodoByMonthlyDate(@RequestHeader("Authorization") Str if(member == null) return ApiResponse.fail("NoMember"); return ApiResponse.success(eventTodoService.getAllEventTodoByOneMonth(date,member)); } - @GetMapping(value = "/monthly/ratio/{date}") - public ApiResponse getEventTodoRatioByDate(@RequestHeader("Authorization") String firebaseToken, + @GetMapping(value = "/monthly/daily/ratio/{date}") + public ApiResponse getEventTodoDailyRatioByDate(@RequestHeader("Authorization") String firebaseToken, @PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) { Member member = memberService.findOneByToken(firebaseToken); - - TreeMap result =eventTodoService.getRatioByDailyInMonth(date,member); + TreeMap result =eventTodoService.getDailyRatioByMonth(date,member); List dailyAchievementRatios = result.entrySet() .stream() .map(DailyAchievementRatio::new) .collect(Collectors.toList()); return ApiResponse.success(dailyAchievementRatios); } + @GetMapping(value = "/monthly/ratio/{date}") + public ApiResponse getEventTodoRatioByDate(@RequestHeader("Authorization") String firebaseToken, + @PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) { + + Member member = memberService.findOneByToken(firebaseToken); + double result = eventTodoService.getMonthlyRatio(date,member); + return ApiResponse.success(new MonthlyAchievementRatio(date,Math.round(result*100)/100.0)); + } } \ No newline at end of file diff --git a/greendar/src/main/java/greendar/domain/eventtodo/application/EventTodoService.java b/greendar/src/main/java/greendar/domain/eventtodo/application/EventTodoService.java index f3205b2..cfed484 100644 --- a/greendar/src/main/java/greendar/domain/eventtodo/application/EventTodoService.java +++ b/greendar/src/main/java/greendar/domain/eventtodo/application/EventTodoService.java @@ -33,6 +33,7 @@ public EventTodo updateEventTodo(Boolean complete , String imageUrl, Long eventT Member member = memberRepository.fineOneByToken(token); EventTodoItem eventTodoItem = eventTodoItemRepository.findOneById(eventTodoItemId); EventTodo eventTodo = eventTodoRepository.findOneByEventTodoItemIdMemberId(member.getId(),eventTodoItem.getId()); + // 생성 if(eventTodo==null) { if(complete == null) @@ -53,20 +54,24 @@ public EventTodo updateEventTodo(Boolean complete , String imageUrl, Long eventT } } - public TreeMap getRatioByDailyInMonth(LocalDate date, Member member) { - + public TreeMap getDailyRatioByMonth(LocalDate date, Member member) { + List dailyAchievements = getEventTodoDailyAchievements(date, member); + return privateTodoService.calculateRatio(dailyAchievements); + } + public double getMonthlyRatio(LocalDate date, Member member) { + List dailyAchievements = getEventTodoDailyAchievements(date, member); + return privateTodoService.calculateMonthlyRatio(dailyAchievements); + } + public List getEventTodoDailyAchievements(LocalDate date, Member member){ List eventTodoItems = eventTodoItemRepository.findAllByMonth(date); List eventTodos = eventTodoRepository.findAllByMonth(date,member); - List eventTodoResponses = getEventTodoResponsesByCompare(eventTodoItems,eventTodos); - List dailyAchievements = eventTodoResponses.stream() + return eventTodoResponses.stream() .map(DailyAchievement::new) .collect(Collectors.toList()); - System.out.println("!--!"); - System.out.println(dailyAchievements); - System.out.println("!--!"); - return privateTodoService.calculateRatio(dailyAchievements); } + + public List getAllEventTodoByOneDay(LocalDate date , Member member) { List eventTodoItems = eventTodoItemRepository.findAllByDay(date); diff --git a/greendar/src/main/java/greendar/domain/eventtodo/domain/EventTodo.java b/greendar/src/main/java/greendar/domain/eventtodo/domain/EventTodo.java index 3eb5212..12da918 100644 --- a/greendar/src/main/java/greendar/domain/eventtodo/domain/EventTodo.java +++ b/greendar/src/main/java/greendar/domain/eventtodo/domain/EventTodo.java @@ -4,6 +4,7 @@ import greendar.domain.eventtodoitem.domain.EventTodoItem; import greendar.domain.member.domain.Member; +import greendar.domain.model.BaseTimeEntity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -17,7 +18,7 @@ @Entity @Getter @Setter -public class EventTodo { +public class EventTodo extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="event_todo_id") diff --git a/greendar/src/main/java/greendar/domain/eventtodo/dto/EventTodoDtos.java b/greendar/src/main/java/greendar/domain/eventtodo/dto/EventTodoDtos.java index c7b079d..7049d5d 100644 --- a/greendar/src/main/java/greendar/domain/eventtodo/dto/EventTodoDtos.java +++ b/greendar/src/main/java/greendar/domain/eventtodo/dto/EventTodoDtos.java @@ -1,5 +1,7 @@ package greendar.domain.eventtodo.dto; +import java.time.LocalDate; +import javax.validation.constraints.NotNull; import lombok.Data; import lombok.NoArgsConstructor; @@ -7,8 +9,20 @@ public class EventTodoDtos { @Data @NoArgsConstructor public static class EventTodoCompleteUpdateRequestDto - { - private Boolean complete; + { @NotNull private Long eventTodoItemId; + @NotNull + private Boolean complete; + } + + @Data + public static class MonthlyAchievementRatio { + private LocalDate date; + private double ratio; + + public MonthlyAchievementRatio(LocalDate date, double ratio) { + this.date = date; + this.ratio = ratio * 100; + } } } diff --git a/greendar/src/main/java/greendar/domain/eventtodo/dto/EventTodoResponseDto.java b/greendar/src/main/java/greendar/domain/eventtodo/dto/EventTodoResponseDto.java index 2a11797..a0499d2 100644 --- a/greendar/src/main/java/greendar/domain/eventtodo/dto/EventTodoResponseDto.java +++ b/greendar/src/main/java/greendar/domain/eventtodo/dto/EventTodoResponseDto.java @@ -3,19 +3,16 @@ import greendar.domain.eventtodo.domain.EventTodo; import greendar.domain.eventtodoitem.domain.EventTodoItem; import java.time.LocalDate; -import lombok.AccessLevel; import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; + @Getter -@Setter public class EventTodoResponseDto{ - private Long eventTodoItemId ; - private String task; - private LocalDate date; - private String imageUrl; - private Boolean complete; + final private Long eventTodoItemId ; + final private String task; + final private LocalDate date; + final private String imageUrl; + final private Boolean complete; public EventTodoResponseDto(EventTodo eventTodo) { this.task = eventTodo.getEventTodoItem().getTask(); diff --git a/greendar/src/main/java/greendar/domain/eventtodoitem/api/EventTodoItemApi.java b/greendar/src/main/java/greendar/domain/eventtodoitem/api/EventTodoItemApi.java index 9d0cfe3..4b5c26b 100644 --- a/greendar/src/main/java/greendar/domain/eventtodoitem/api/EventTodoItemApi.java +++ b/greendar/src/main/java/greendar/domain/eventtodoitem/api/EventTodoItemApi.java @@ -6,6 +6,7 @@ import greendar.global.common.ApiResponse; import java.time.LocalDate; import java.util.List; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.GetMapping; @@ -29,10 +30,15 @@ public ApiResponse getEvenTodoItems(){ return ApiResponse.success(eventTodoItems); } @PostMapping(produces = "application/json;charset=UTF-8") - public ApiResponse addEventTodo(@RequestBody EventTodoPostItemRequestDto request) { + public ApiResponse addEventTodoDate(@Valid @RequestBody EventTodoPostItemRequestDto request) { eventTodoItemService.saveTodo(request.getTask(),request.getDate()); return ApiResponse.success("ok"); } + @PostMapping(value = "/week", produces = "application/json;charset=UTF-8") + public ApiResponse addEventTodoDateWeek(@Valid @RequestBody EventTodoPostItemRequestDto request) { + eventTodoItemService.saveTodoAddWeek(request.getTask(),request.getDate()); + return ApiResponse.success("ok"); + } @GetMapping(value = "/monthly/{date}",produces = "application/json;charset=UTF-8") public ApiResponse getEventTodoItemByMonthlyDate(@PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date){ return ApiResponse.success(eventTodoItemService.findAllByMonth(date)); diff --git a/greendar/src/main/java/greendar/domain/eventtodoitem/domain/EventTodoItem.java b/greendar/src/main/java/greendar/domain/eventtodoitem/domain/EventTodoItem.java index bea6c9d..dff2794 100644 --- a/greendar/src/main/java/greendar/domain/eventtodoitem/domain/EventTodoItem.java +++ b/greendar/src/main/java/greendar/domain/eventtodoitem/domain/EventTodoItem.java @@ -1,5 +1,6 @@ package greendar.domain.eventtodoitem.domain; +import greendar.domain.model.BaseTimeEntity; import java.time.LocalDate; import javax.persistence.Column; import javax.persistence.Entity; @@ -13,7 +14,7 @@ @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class EventTodoItem { +public class EventTodoItem extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="event_todo_item_id") diff --git a/greendar/src/main/java/greendar/domain/eventtodoitem/dto/EventTodoItemDtos.java b/greendar/src/main/java/greendar/domain/eventtodoitem/dto/EventTodoItemDtos.java index a36efc0..d7b3931 100644 --- a/greendar/src/main/java/greendar/domain/eventtodoitem/dto/EventTodoItemDtos.java +++ b/greendar/src/main/java/greendar/domain/eventtodoitem/dto/EventTodoItemDtos.java @@ -2,6 +2,8 @@ import greendar.domain.eventtodoitem.domain.EventTodoItem; import java.time.LocalDate; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; import lombok.AccessLevel; import lombok.Data; import lombok.NoArgsConstructor; @@ -11,13 +13,15 @@ public class EventTodoItemDtos { @Data @NoArgsConstructor public static class EventTodoPostItemRequestDto - { + { @NotEmpty String task; + @NotNull LocalDate date; } @Data @NoArgsConstructor(access = AccessLevel.PROTECTED) public static class EventTodoItemResponseDto{ + private Long event_todo_item_id ; private String task; private LocalDate date; diff --git a/greendar/src/main/java/greendar/domain/member/api/MemberApi.java b/greendar/src/main/java/greendar/domain/member/api/MemberApi.java index 9bcab44..85b31f0 100644 --- a/greendar/src/main/java/greendar/domain/member/api/MemberApi.java +++ b/greendar/src/main/java/greendar/domain/member/api/MemberApi.java @@ -25,7 +25,7 @@ public class MemberApi { private final MemberService memberService; private final FileService fileService; - @GetMapping(value = "/list",produces = "application/json;charset=UTF-8") + @GetMapping(value = "/list", produces = "application/json;charset=UTF-8") public ApiResponse getMembers() { List findMembers = memberService.getAll(); List response = findMembers.stream().map(MemberResponse::new).collect(Collectors.toList()); @@ -34,22 +34,28 @@ public ApiResponse getMembers() { @PostMapping(produces = "application/json;charset=UTF-8") public ApiResponse postMember(@RequestBody MemberPostRequestDto request) { - if(memberService.isNameRedundant(request.getName())){ + if (memberService.isNameRedundant(request.getName())) { return ApiResponse.redundantName(false); } - Member savedMember = memberService.saveMember(request.getName(), request.getPassword(), request.getEmail(), "EMPTY", "HELLO", request.getFirebaseToken()); + Member savedMember = memberService.saveMember(request.getName(), request.getPassword(), request.getEmail(), request.getImageUrl(), request.getMessage(), request.getFirebaseToken()); return ApiResponse.success(new MemberResponse(savedMember)); } + @DeleteMapping(produces = "application/json;charset=UTF-8") + public ApiResponse deleteOneMember(@RequestHeader("Authorization") String firebaseToken) { + memberService.deleteMember(firebaseToken); + return ApiResponse.success("success"); + } + @GetMapping(produces = "application/json;charset=UTF-8") public ApiResponse getMember(@RequestHeader("Authorization") String firebaseToken) { Member member = memberService.findOneByToken(firebaseToken); return ApiResponse.success(member); } - @PostMapping(value = "/validity",produces = "application/json;charset=UTF-8") + @PostMapping(value = "/validity", produces = "application/json;charset=UTF-8") public ApiResponse checkMemberVaild(@RequestHeader("Authorization") String firebaseToken) { - if(memberService.isTokenExists(firebaseToken)){ + if (memberService.isTokenExists(firebaseToken)) { Member member = memberService.findOneByToken(firebaseToken); return ApiResponse.success(new MemberResponse(member)); } diff --git a/greendar/src/main/java/greendar/domain/member/application/MemberService.java b/greendar/src/main/java/greendar/domain/member/application/MemberService.java index dc18c6b..40c1ef7 100644 --- a/greendar/src/main/java/greendar/domain/member/application/MemberService.java +++ b/greendar/src/main/java/greendar/domain/member/application/MemberService.java @@ -20,6 +20,11 @@ public Member saveMember(String name, String password, String email, String imag return memberRepository.saveMember(name, password, email, imageUrl, message, token); } + @Transactional + public void deleteMember(String token) { + memberRepository.deleteMember(token); + } + @Transactional public Member updateProfile(String token, String name, String message) { return memberRepository.updateMemberProfile(token, name, message); @@ -39,13 +44,14 @@ public Member findOneByToken(String token) { return memberRepository.fineOneByToken(token); } - public boolean isNameRedundant(String name){ + public boolean isNameRedundant(String name) { return memberRepository.isMemberNameExists(name); } - public boolean isTokenExists(String token){ + public boolean isTokenExists(String token) { return memberRepository.isMemberTokenExists(token); } + public Member findOne(Long memberId) { return memberRepository.findOne(memberId); } diff --git a/greendar/src/main/java/greendar/domain/member/dao/MemberRepository.java b/greendar/src/main/java/greendar/domain/member/dao/MemberRepository.java index 22de90e..5c3948b 100644 --- a/greendar/src/main/java/greendar/domain/member/dao/MemberRepository.java +++ b/greendar/src/main/java/greendar/domain/member/dao/MemberRepository.java @@ -16,12 +16,17 @@ public class MemberRepository { @PersistenceContext private final EntityManager em; - public Member saveMember(String name,String password, String email, String imageUrl, String message, String token) { - Member member = Member.of(name,password, email, imageUrl, message, token); + public Member saveMember(String name, String password, String email, String imageUrl, String message, String token) { + Member member = Member.of(name, password, email, imageUrl, message, token); em.persist(member); return member; } + public void deleteMember(String inputToken) { + Member member = fineOneByToken(inputToken); + em.remove(member); + } + public Member updateMemberImageUrl(String inputToken, String imageUrl) { Member member = fineOneByToken(inputToken); member.setImageUrl(imageUrl); @@ -37,7 +42,7 @@ public Member updateMemberProfile(String inputToken, String name, String message return member; } - public Member updateMemberEmail(String inputToken, String email){ + public Member updateMemberEmail(String inputToken, String email) { Member member = fineOneByToken(inputToken); member.setEmail(email); em.merge(member); @@ -45,13 +50,14 @@ public Member updateMemberEmail(String inputToken, String email){ } /** - * 파이어베이스 UID가 오류가 있다는 전제 하에 만들어진 함수, - * 그래서 memberId 로 member를 불러오고, UID를 토큰으로 저장 + * 파이어베이스 UID가 오류가 있다는 전제 하에 만들어진 함수, + * 그래서 memberId 로 member를 불러오고, UID를 토큰으로 저장 + * * @param memberId * @param firebaseToken * @return */ - public Member saveFirebaseToken(Long memberId, String firebaseToken){ + public Member saveFirebaseToken(Long memberId, String firebaseToken) { Member member = em.find(Member.class, memberId); member.setToken(firebaseToken); em.merge(member); @@ -60,19 +66,20 @@ public Member saveFirebaseToken(Long memberId, String firebaseToken){ /** * 예외처리 해줘야 함 + * * @param inputToken 파이어베이스 UID * @return 멤버 객체 */ - public Member fineOneByToken(String inputToken){ - return em.createQuery("select m from Member m "+ - "where m.token = :firebaseToken" + public Member fineOneByToken(String inputToken) { + return em.createQuery("select m from Member m " + + "where m.token = :firebaseToken" , Member.class) .setParameter("firebaseToken", inputToken) .getSingleResult(); } - public boolean isMemberTokenExists(String token){ - List memberList = em.createQuery("select m from Member m "+ + public boolean isMemberTokenExists(String token) { + List memberList = em.createQuery("select m from Member m " + "where m.token = :firebaseToken" , Member.class) .setParameter("firebaseToken", token) @@ -80,10 +87,10 @@ public boolean isMemberTokenExists(String token){ return !memberList.isEmpty(); } - public boolean isMemberNameExists(String name){ - List memberList = em.createQuery("select m from Member m "+ - "where m.name = :inputName" - , Member.class) + public boolean isMemberNameExists(String name) { + List memberList = em.createQuery("select m from Member m " + + "where m.name = :inputName" + , Member.class) .setParameter("inputName", name) .getResultList(); return !memberList.isEmpty(); diff --git a/greendar/src/main/java/greendar/domain/member/domain/Member.java b/greendar/src/main/java/greendar/domain/member/domain/Member.java index 31de931..5a44fed 100644 --- a/greendar/src/main/java/greendar/domain/member/domain/Member.java +++ b/greendar/src/main/java/greendar/domain/member/domain/Member.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import greendar.domain.eventtodo.domain.EventTodo; +import greendar.domain.model.BaseTimeEntity; import greendar.domain.privatetodo.domain.PrivateTodo; import java.time.LocalDate; @@ -28,7 +29,7 @@ @Entity @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Member { +public class Member extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/greendar/src/main/java/greendar/domain/member/dto/MemberDtos.java b/greendar/src/main/java/greendar/domain/member/dto/MemberDtos.java index bb92e87..8712d13 100644 --- a/greendar/src/main/java/greendar/domain/member/dto/MemberDtos.java +++ b/greendar/src/main/java/greendar/domain/member/dto/MemberDtos.java @@ -4,14 +4,15 @@ import greendar.domain.member.domain.Member; import lombok.*; +import javax.validation.constraints.NotNull; public class MemberDtos { @Data + @NotNull @NoArgsConstructor - public static class MemberPostRequestDto - { + public static class MemberPostRequestDto { String name; String password; String email; @@ -21,27 +22,25 @@ public static class MemberPostRequestDto } @Data + @NotNull @NoArgsConstructor - public static class MemberEmailGetRequestDto - { + public static class MemberEmailGetRequestDto { private String email; } - @Data + @NotNull @NoArgsConstructor - public static class MemberGetRequestDto - { + public static class MemberGetRequestDto { private Long id; } - @Data + @NotNull @NoArgsConstructor - public static class MemberProfilePutRequestDto - { + public static class MemberProfilePutRequestDto { private Long id; String name; String message; @@ -49,9 +48,9 @@ public static class MemberProfilePutRequestDto @Data + @NotNull @NoArgsConstructor - public static class MemberEmailPasswordPutRequestDto - { + public static class MemberEmailPasswordPutRequestDto { private Long id; String email; } @@ -59,7 +58,7 @@ public static class MemberEmailPasswordPutRequestDto @Data @NoArgsConstructor(access = AccessLevel.PROTECTED) - public static class MemberResponse{ + public static class MemberResponse { private Long id; private String name; private String password; @@ -68,10 +67,11 @@ public static class MemberResponse{ private String message; private String token; - public MemberResponse(Member member){ - this(member.getId(), member.getName(),member.getPassword(),member.getEmail(),member.getImageUrl(),member.getStatusMessage(), member.getToken()); + public MemberResponse(Member member) { + this(member.getId(), member.getName(), member.getPassword(), member.getEmail(), member.getImageUrl(), member.getStatusMessage(), member.getToken()); } - public MemberResponse(Long memberId, String name, String password, String email, String imageUrl,String message, String token) { + + public MemberResponse(Long memberId, String name, String password, String email, String imageUrl, String message, String token) { this.id = memberId; this.name = name; this.password = password; @@ -84,5 +84,4 @@ public MemberResponse(Long memberId, String name, String password, String email, } - } diff --git a/greendar/src/main/java/greendar/domain/model/BaseTimeEntity.java b/greendar/src/main/java/greendar/domain/model/BaseTimeEntity.java new file mode 100644 index 0000000..9680872 --- /dev/null +++ b/greendar/src/main/java/greendar/domain/model/BaseTimeEntity.java @@ -0,0 +1,29 @@ +package greendar.domain.model; + +import java.io.Serializable; +import java.time.LocalDateTime; +import javax.persistence.Column; +import javax.persistence.EntityListeners; +import javax.persistence.MappedSuperclass; +import lombok.Getter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + + + +@Getter +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +public abstract class BaseTimeEntity implements Serializable { + + @CreatedDate + @Column(updatable = false) + private LocalDateTime createdDateTime; + + @LastModifiedDate + private LocalDateTime updatedDateTime; + + protected BaseTimeEntity(){} + +} diff --git a/greendar/src/main/java/greendar/domain/privatetodo/api/PrivateTodoApi.java b/greendar/src/main/java/greendar/domain/privatetodo/api/PrivateTodoApi.java index e04d345..da38acf 100644 --- a/greendar/src/main/java/greendar/domain/privatetodo/api/PrivateTodoApi.java +++ b/greendar/src/main/java/greendar/domain/privatetodo/api/PrivateTodoApi.java @@ -9,15 +9,19 @@ import greendar.domain.privatetodo.dto.PrivateTodoDtos.PrivateTodoPostRequestDto; import greendar.domain.privatetodo.dto.PrivateTodoDtos.PrivateTodoResponse; import greendar.domain.privatetodo.dto.PrivateTodoDtos.PrivateTodoTaskPutRequestDto; +import greendar.domain.privatetodo.dto.PrivateTodoDtos.MonthlyAchievementRatio; import greendar.global.common.ApiResponse; import greendar.infra.gcp.storage.application.FileService; import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; import java.util.TreeMap; import java.util.stream.Collectors; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.MediaType; +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; @@ -47,10 +51,15 @@ public ApiResponse getPrivateTodoByMember(@RequestHeader("Authorization") String .collect(Collectors.toList()); return ApiResponse.success(collect); } - + @DeleteMapping("/{private_todo_id}") + public ApiResponse deletePrivateTodoByMember(@RequestHeader("Authorization") String firebaseToken, @PathVariable Long private_todo_id) { + Member member = memberService.findOneByToken(firebaseToken); + privateTodoService.deleteTodo(private_todo_id); + return ApiResponse.success(true); + } @PostMapping - public ApiResponse addPrivateTodo(@RequestHeader("Authorization") String firebaseToken, - @RequestBody PrivateTodoPostRequestDto request) { + public ApiResponse savePrivateTodo(@RequestHeader("Authorization") String firebaseToken, + @Valid @RequestBody PrivateTodoPostRequestDto request) { Member member = memberService.findOneByToken(firebaseToken); PrivateTodo privateTodo = privateTodoService.saveTodo(member,request.getTask(),request.getDate()); return ApiResponse.success( new PrivateTodoResponse(privateTodo)); @@ -64,7 +73,8 @@ public ApiResponse getPrivateTodoByDate(@RequestHeader("Authorization") String f List collect = result.stream() .map(r->new PrivateTodoResponse(r)) .collect(Collectors.toList()); - if(collect.isEmpty()) return ApiResponse.success("None"); + List empty = new ArrayList<>(); + if(collect.isEmpty()) return ApiResponse.success(empty); return ApiResponse.success(collect); } @@ -79,7 +89,7 @@ public ApiResponse getPrivateTodoByMonthlyDate(@RequestHeader("Authorization") S return ApiResponse.success(collect); } - @GetMapping(value = "/monthly/ratio/{date}") + @GetMapping(value = "/monthly/daily/ratio/{date}") public ApiResponse getPrivateTodoRatioByDate(@RequestHeader("Authorization") String firebaseToken, @PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) { Member member = memberService.findOneByToken(firebaseToken); @@ -87,20 +97,38 @@ public ApiResponse getPrivateTodoRatioByDate(@RequestHeader("Authorization") Str List dailyAchievementRatios = result.entrySet().stream().map(e->new DailyAchievementRatio(e)).collect(Collectors.toList()); return ApiResponse.success(dailyAchievementRatios); } + @GetMapping(value = "/monthly/ratio/{date}") + public ApiResponse getPrivateTodoMonthlyRatioByDate(@RequestHeader("Authorization") String firebaseToken, + @PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) { + Member member = memberService.findOneByToken(firebaseToken); + double result = privateTodoService.getMonthlyRatio(date, member); + MonthlyAchievementRatio monthlyAchievementRatio = new MonthlyAchievementRatio(date, Math.round(result*100)/100.0); + return ApiResponse.success(monthlyAchievementRatio); + } + @PutMapping(value = "/image",consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) public ApiResponse updatePrivateTodoImageUrl(@RequestHeader("Authorization") String firebaseToken, @RequestParam("private_todo_id") Long private_todo_id, @RequestParam("file") MultipartFile file) { - Member member = memberService.findOneByToken(firebaseToken); -// List inputFiles = fileService.uploadFiles(files); + memberService.findOneByToken(firebaseToken); String imageUrl = fileService.uploadFile(file).getFileUrl(); PrivateTodo result = privateTodoService.updatePrivateTodoImageUrl(private_todo_id,imageUrl); return ApiResponse.success(new PrivateTodoResponse(result)); } + + @DeleteMapping (value = "/image") + public ApiResponse setTempoaryPrivateTodoImageUrl(@RequestHeader("Authorization") String firebaseToken, + @RequestParam("private_todo_id") Long private_todo_id) { + memberService.findOneByToken(firebaseToken); + PrivateTodo result = privateTodoService.updatePrivateTodoImageUrl(private_todo_id,"EMPTY"); + if(result==null) ApiResponse.fail(false); + return ApiResponse.success(true); + } + @PutMapping(value = "/complete") public ApiResponse setPrivateTodoComplete(@RequestHeader("Authorization") String firebaseToken, - @RequestBody PrivateTodoCompletePutRequestDto request) { + @Valid @RequestBody PrivateTodoCompletePutRequestDto request) { Member member = memberService.findOneByToken(firebaseToken); if(member == null) return ApiResponse.fail("Wrong FireBaseToken"); PrivateTodo result = privateTodoService.updatePrivateTodoComplete(request.getPrivate_todo_id(),request.getComplete()); @@ -109,7 +137,7 @@ public ApiResponse setPrivateTodoComplete(@RequestHeader("Authorization") String @PutMapping(value = "/task") public ApiResponse setPrivateTodoTask(@RequestHeader("Authorization") String firebaseToken, - @RequestBody PrivateTodoTaskPutRequestDto request) { + @Valid @RequestBody PrivateTodoTaskPutRequestDto request) { Member member = memberService.findOneByToken(firebaseToken); if(member == null) return ApiResponse.fail("Wrong FireBaseToken"); PrivateTodo result = privateTodoService.updatePrivateTodoTask(request.getPrivate_todo_id(),request.getTask()); diff --git a/greendar/src/main/java/greendar/domain/privatetodo/application/PrivateTodoService.java b/greendar/src/main/java/greendar/domain/privatetodo/application/PrivateTodoService.java index e72e8d6..e44c7c4 100644 --- a/greendar/src/main/java/greendar/domain/privatetodo/application/PrivateTodoService.java +++ b/greendar/src/main/java/greendar/domain/privatetodo/application/PrivateTodoService.java @@ -5,65 +5,104 @@ import greendar.domain.privatetodo.dto.PrivateTodoDtos.DailyAchievement; import greendar.domain.privatetodo.dao.PrivateTodoRepository; import greendar.domain.privatetodo.domain.PrivateTodo; + import java.time.LocalDate; import java.util.List; import java.util.TreeMap; + import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -@Transactional(readOnly=true) +@Transactional(readOnly = true) @Service @RequiredArgsConstructor public class PrivateTodoService { private final PrivateTodoRepository privateTodoRepository; + + @Transactional + public PrivateTodo saveTodo(Member member, String task, LocalDate date) { + return privateTodoRepository.saveTodo(member, task, date); + } + @Transactional - public PrivateTodo saveTodo(Member member , String task, LocalDate date) { - return privateTodoRepository.saveTodo(member,task,date); + public void deleteTodo(Long id) { + privateTodoRepository.deleteTodo(id); } + public List getAllPrivateTodoByMember(Member member) { return privateTodoRepository.findAllPrivateTodoByMember(member); } - public List getAllPrivateTodoByOneDay(LocalDate day,Member member) { - return privateTodoRepository.findAllByDay(day,member); + + public List getAllPrivateTodoByOneDay(LocalDate day, Member member) { + return privateTodoRepository.findAllByDay(day, member); } - public List getAllPrivateTodoByOneMonth(LocalDate date,Member member) { - return privateTodoRepository.findAllByMonth(date,member); + + public List getAllPrivateTodoByOneMonth(LocalDate date, Member member) { + return privateTodoRepository.findAllByMonth(date, member); } + public TreeMap getRatioByDailyInMonth(LocalDate date, Member member) { - List dailyAchievements = privateTodoRepository.countRatioByDailyInMonth( date, member); - return calculateRatio(dailyAchievements) ; + List dailyAchievements = privateTodoRepository.countRatioByDailyInMonth(date, member); + return calculateRatio(dailyAchievements); } - public TreeMap calculateRatio(List dailyAchievements){ - TreeMap dailyRatio= new TreeMap<>(); - int count = 1 ; - for(DailyAchievement daily:dailyAchievements ) { + + public double getMonthlyRatio(LocalDate date, Member member) { + List dailyAchievements = privateTodoRepository.countRatioByDailyInMonth(date, member); + return calculateMonthlyRatio(dailyAchievements); + } + public double calculateMonthlyRatio(List dailyAchievements) { + if(dailyAchievements.size() == 0) return 0; + return dailyAchievements.stream() + .filter(daily -> daily.getDone() > 0) + .count() / (double) dailyAchievements.size(); + } + +// public double calculateMonthlyRatio(List dailyAchievements) { +// int doneSum = 0; +// for (DailyAchievement daily : dailyAchievements) { +// if (daily.getDone() > 0) { +// doneSum += 1; +// } +// } +// if (dailyAchievements.size() == 0) { +// return 0; +// } +// return (double) doneSum / (double) dailyAchievements.size(); +// } + + public TreeMap calculateRatio(List dailyAchievements) { + TreeMap dailyRatio = new TreeMap<>(); + int count = 1; + for (DailyAchievement daily : dailyAchievements) { LocalDate dateCheck = daily.getDate(); - if(dailyRatio.containsKey(dateCheck)){ - float tmp = ((dailyRatio.get(dateCheck) + daily.getDone()))*count ; - count+=1; - dailyRatio.put(dateCheck,(tmp/count)); - } - else { - count = 1 ; - dailyRatio.put(dateCheck,daily.getDone()*1.0f); + if (dailyRatio.containsKey(dateCheck)) { + float tmp = ((dailyRatio.get(dateCheck) + daily.getDone())) * count; + count += 1; + dailyRatio.put(dateCheck, (tmp / count)); + } else { + count = 1; + dailyRatio.put(dateCheck, daily.getDone() * 1.0f); } } return dailyRatio; } + @Transactional - public PrivateTodo updatePrivateTodoImageUrl(Long private_todo_id,String imageUrl) { - return privateTodoRepository.updatePrivateTodoImageUrl(private_todo_id,imageUrl); + public PrivateTodo updatePrivateTodoImageUrl(Long private_todo_id, String imageUrl) { + return privateTodoRepository.updatePrivateTodoImageUrl(private_todo_id, imageUrl); } + @Transactional - public PrivateTodo updatePrivateTodoTask(Long private_todo_id,String task) { - return privateTodoRepository.updatePrivateTodoTask(private_todo_id,task); + public PrivateTodo updatePrivateTodoTask(Long private_todo_id, String task) { + return privateTodoRepository.updatePrivateTodoTask(private_todo_id, task); } + @Transactional - public PrivateTodo updatePrivateTodoComplete(Long private_todo_id,Boolean complete) { - return privateTodoRepository.updatePrivateTodoComplete(private_todo_id,complete); + public PrivateTodo updatePrivateTodoComplete(Long private_todo_id, Boolean complete) { + return privateTodoRepository.updatePrivateTodoComplete(private_todo_id, complete); } } diff --git a/greendar/src/main/java/greendar/domain/privatetodo/dao/PrivateTodoRepository.java b/greendar/src/main/java/greendar/domain/privatetodo/dao/PrivateTodoRepository.java index 834aeda..4b795ee 100644 --- a/greendar/src/main/java/greendar/domain/privatetodo/dao/PrivateTodoRepository.java +++ b/greendar/src/main/java/greendar/domain/privatetodo/dao/PrivateTodoRepository.java @@ -25,6 +25,9 @@ public PrivateTodo saveTodo(Member member , String task, LocalDate date) { em.persist(privateTodo); return privateTodo; } + public void deleteTodo(Long id){ + em.remove(em.find(PrivateTodo.class,id)); + } //목록 불러오기 public List findAllPrivateTodoByMember(Member member) { @@ -82,21 +85,4 @@ public PrivateTodo updatePrivateTodoComplete(Long private_todo_id,Boolean comple em.merge(privateTodo); return privateTodo; } - -// public List countRatioByDailyInMonth(LocalDate date,Member member) -// { YearMonth month = YearMonth.from(date); -// LocalDate start = month.atDay(1); -// LocalDate end = month.atEndOfMonth(); -// return em.createQuery("select p.date As date, " + -// "avg(p.complete) As rate " + -// "from PrivateTodo p " + -// "join fetch p.member m " + -// "where m.id = :memberId and p.date between :startDate and :endDate " + -// "group by p.date" -// ,DailyAchievementRateDao.class) -// .setParameter("startDate",start) -// .setParameter("endDate",end) -// .setParameter("memberId",member.getId()) -// .getResultList(); -// } } diff --git a/greendar/src/main/java/greendar/domain/privatetodo/domain/PrivateTodo.java b/greendar/src/main/java/greendar/domain/privatetodo/domain/PrivateTodo.java index b16e990..3184caf 100644 --- a/greendar/src/main/java/greendar/domain/privatetodo/domain/PrivateTodo.java +++ b/greendar/src/main/java/greendar/domain/privatetodo/domain/PrivateTodo.java @@ -3,6 +3,7 @@ import static javax.persistence.FetchType.LAZY; import com.fasterxml.jackson.annotation.JsonIgnore; import greendar.domain.member.domain.Member; +import greendar.domain.model.BaseTimeEntity; import java.time.LocalDate; import javax.persistence.Column; import javax.persistence.Entity; @@ -18,7 +19,7 @@ @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class PrivateTodo { +public class PrivateTodo extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/greendar/src/main/java/greendar/domain/privatetodo/dto/PrivateTodoDtos.java b/greendar/src/main/java/greendar/domain/privatetodo/dto/PrivateTodoDtos.java index adb420e..4d06fce 100644 --- a/greendar/src/main/java/greendar/domain/privatetodo/dto/PrivateTodoDtos.java +++ b/greendar/src/main/java/greendar/domain/privatetodo/dto/PrivateTodoDtos.java @@ -1,60 +1,73 @@ package greendar.domain.privatetodo.dto; -import greendar.domain.eventtodo.domain.EventTodo; import greendar.domain.eventtodo.dto.EventTodoResponseDto; import greendar.domain.privatetodo.domain.PrivateTodo; + import java.io.File; import java.time.LocalDate; import java.util.Map.Entry; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + import lombok.AccessLevel; import lombok.Data; import lombok.NoArgsConstructor; + public class PrivateTodoDtos { @Data @NoArgsConstructor - public static class PrivateTodoPostRequestDto - { - String task; - LocalDate date; - + public static class PrivateTodoPostRequestDto { + @NotBlank + private String task; + @NotNull + private LocalDate date; } + @Data @NoArgsConstructor - public static class PrivateTodoImagePutRequestDto - { + public static class PrivateTodoImagePutRequestDto { + @NotNull private Long private_todo_id; + @NotNull File file; } + @Data @NoArgsConstructor - public static class PrivateTodoCompletePutRequestDto - { - private Long private_todo_id ; + public static class PrivateTodoCompletePutRequestDto { + @NotNull + private Long private_todo_id; + @NotNull private Boolean complete; } + @Data @NoArgsConstructor - public static class PrivateTodoTaskPutRequestDto - { - private Long private_todo_id ; + public static class PrivateTodoTaskPutRequestDto { + @NotNull + private Long private_todo_id; + @NotBlank private String task; } + @Data @NoArgsConstructor(access = AccessLevel.PROTECTED) - public static class PrivateTodoResponse{ - private Long private_todo_id ; + public static class PrivateTodoResponse { + private Long private_todo_id; private String task; private LocalDate date; private String imageUrl; private Boolean complete; - private String memberName; - public PrivateTodoResponse(PrivateTodo privateTodo){ - this(privateTodo.getId(),privateTodo.getTask(),privateTodo.getDate(),privateTodo.getImageUrl(),privateTodo.getComplete(),privateTodo.getMember().getName()); + private String name; + + public PrivateTodoResponse(PrivateTodo privateTodo) { + this(privateTodo.getId(), privateTodo.getTask(), privateTodo.getDate(), privateTodo.getImageUrl(), privateTodo.getComplete(), privateTodo.getMember().getName()); } - public PrivateTodoResponse(Long id , String task, LocalDate date, String imageUrl, Boolean complete,String memberName) { - this.memberName = memberName; - this.private_todo_id =id; + + public PrivateTodoResponse(Long id, String task, LocalDate date, String imageUrl, Boolean complete, String name) { + this.name = name; + this.private_todo_id = id; this.task = task; this.date = date; this.imageUrl = imageUrl; @@ -63,33 +76,42 @@ public PrivateTodoResponse(Long id , String task, LocalDate date, String imageUr } @Data - public static class DailyAchievement{ + public static class DailyAchievement { private LocalDate date; private int done; - public DailyAchievement(PrivateTodo privateTodo){ + + public DailyAchievement(PrivateTodo privateTodo) { this.date = privateTodo.getDate(); - if(privateTodo.getComplete()) this.done = 1; - if(!privateTodo.getComplete()) this.done = 0 ; - } - public DailyAchievement(EventTodo eventTodo){ - this.date = eventTodo.getEventTodoItem().getDate(); - if(eventTodo.getComplete()) this.done = 1; - if(!eventTodo.getComplete()) this.done = 0 ; + if (privateTodo.getComplete()) this.done = 1; + if (!privateTodo.getComplete()) this.done = 0; } + public DailyAchievement(EventTodoResponseDto eventTodoResponseDto) { - this.date=eventTodoResponseDto.getDate(); - if(eventTodoResponseDto.getComplete()) this.done = 1; - if(!eventTodoResponseDto.getComplete()) this.done = 0 ; + this.date = eventTodoResponseDto.getDate(); + if (eventTodoResponseDto.getComplete()) this.done = 1; + if (!eventTodoResponseDto.getComplete()) this.done = 0; } } @Data - public static class DailyAchievementRatio{ + public static class DailyAchievementRatio { private LocalDate date; private float ratio; - public DailyAchievementRatio(Entry result){ + + public DailyAchievementRatio(Entry result) { this.date = result.getKey(); - this.ratio = result.getValue()*100; + this.ratio = result.getValue() * 100; + } + } + + @Data + public static class MonthlyAchievementRatio { + private LocalDate date; + private double ratio; + + public MonthlyAchievementRatio(LocalDate date, double ratio) { + this.date = date; + this.ratio = ratio * 100; } } diff --git a/greendar/src/main/java/greendar/infra/gcp/storage/api/StorageApi.java b/greendar/src/main/java/greendar/infra/gcp/storage/api/StorageApi.java index 67e2ccd..37e318f 100644 --- a/greendar/src/main/java/greendar/infra/gcp/storage/api/StorageApi.java +++ b/greendar/src/main/java/greendar/infra/gcp/storage/api/StorageApi.java @@ -1,5 +1,6 @@ package greendar.infra.gcp.storage.api; +import greendar.global.common.ApiResponse; import greendar.infra.gcp.storage.application.FileService; import greendar.infra.gcp.storage.domain.InputFile; import java.util.List; @@ -12,14 +13,17 @@ import org.springframework.web.multipart.MultipartFile; @RestController -@RequestMapping("/files") @RequiredArgsConstructor - public class StorageApi { private final FileService fileService; - @PostMapping(consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) - public List addFile(@RequestParam("files") MultipartFile[] files){ - return fileService.uploadFiles(files); + @PostMapping(value = "/file",consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) + public ApiResponse addFile(@RequestParam("file") MultipartFile[] file){ + if(file.length > 1) return ApiResponse.fail("add multiple files in file"); + return ApiResponse.success(fileService.uploadFiles(file).get(0).getFileName()); + } + @PostMapping(value = "/files",consumes = {MediaType.MULTIPART_FORM_DATA_VALUE}) + public ApiResponse addFiles(@RequestParam("files") MultipartFile[] files){ + return ApiResponse.success(fileService.uploadFiles(files)); } } diff --git a/greendar/src/main/java/greendar/infra/gcp/storage/application/DataBucketUtil.java b/greendar/src/main/java/greendar/infra/gcp/storage/application/DataBucketUtil.java index b1f9135..54966aa 100644 --- a/greendar/src/main/java/greendar/infra/gcp/storage/application/DataBucketUtil.java +++ b/greendar/src/main/java/greendar/infra/gcp/storage/application/DataBucketUtil.java @@ -49,7 +49,8 @@ public FileDto uploadFile(MultipartFile multipartFile, String fileName,String gc Blob blob = bucket.create(gcpDirectoryName + "/" + fileName + "-" + id.nextString() + checkFileExtension(fileName), fileData, contentType); if(blob != null){ - return new FileDto(blob.getName(),"https://storage.cloud.google.com/"+gcpBucketId+"/"+blob.getName()); + return new FileDto(blob.getName(),"/"+blob.getName()); +// return new FileDto(blob.getName(),"https://storage.cloud.google.com/"+gcpBucketId+"/"+blob.getName()); } }catch (Exception e){ diff --git a/greendar/src/test/java/greendar/domain/privatetodo/api/PrivateTodoApiTest.java b/greendar/src/test/java/greendar/domain/privatetodo/api/PrivateTodoApiTest.java new file mode 100644 index 0000000..ce7518a --- /dev/null +++ b/greendar/src/test/java/greendar/domain/privatetodo/api/PrivateTodoApiTest.java @@ -0,0 +1,54 @@ +package greendar.domain.privatetodo.api; + +import static org.assertj.core.api.Assertions.assertThat; +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 greendar.domain.member.application.MemberService; +import greendar.domain.member.domain.Member; +import greendar.domain.privatetodo.application.PrivateTodoService; +import greendar.domain.privatetodo.domain.PrivateTodo; +import java.net.http.HttpHeaders; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc +class PrivateTodoApiTest { + + @Autowired + private MockMvc mockMvc; + + @MockBean + private MemberService memberService; + + @MockBean + private PrivateTodoService privateTodoService; + + @Test + public void testGetPrivateTodoByNewMember() throws Exception { + memberService.saveMember("cho",null,null,null,null,"testCodeToken"); + + MvcResult result = mockMvc.perform(get("/private/todo") + .header("Authorization", "tokenCodeToken")) + .andExpect(status().isOk()) + .andReturn(); + +// MvcResult result = mockMvc.perform(get("/private/todo") +// .header("Authorization", "token")) +// .andExpect(status().isOk()) +// .andReturn(); + } + + +} \ No newline at end of file diff --git a/greendar/src/test/java/greendar/domain/privatetodo/dao/PrivateTodoRepositoryTest.java b/greendar/src/test/java/greendar/domain/privatetodo/dao/PrivateTodoRepositoryTest.java new file mode 100644 index 0000000..780aa28 --- /dev/null +++ b/greendar/src/test/java/greendar/domain/privatetodo/dao/PrivateTodoRepositoryTest.java @@ -0,0 +1,40 @@ +package greendar.domain.privatetodo.dao; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class PrivateTodoRepositoryTest { + + @Test + void saveTodo() { + } + + @Test + void findAllPrivateTodoByMember() { + } + + @Test + void findAllByDay() { + } + + @Test + void findAllByMonth() { + } + + @Test + void countRatioByDailyInMonth() { + } + + @Test + void updatePrivateTodoImageUrl() { + } + + @Test + void updatePrivateTodoTask() { + } + + @Test + void updatePrivateTodoComplete() { + } +} \ No newline at end of file