diff --git a/feedme/Dockerfile b/feedme/Dockerfile index 03a10c3..11d3d58 100644 --- a/feedme/Dockerfile +++ b/feedme/Dockerfile @@ -27,4 +27,4 @@ RUN ./gradlew clean build -x test ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod", "/app/build/libs/feedme-0.0.1-SNAPSHOT.jar"] # Expose port 8080 -EXPOSE 8080 +EXPOSE 8085 diff --git a/feedme/build.gradle b/feedme/build.gradle index bed2937..b278c59 100644 --- a/feedme/build.gradle +++ b/feedme/build.gradle @@ -27,6 +27,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-websocket' + implementation 'org.springframework.boot:spring-boot-starter-webflux' + version = '0.0.1-SNAPSHOT' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.mysql:mysql-connector-j' runtimeOnly 'com.h2database:h2' @@ -59,7 +61,7 @@ dependencies { //redis implementation 'org.springframework.boot:spring-boot-starter-data-redis' - // .env 받아오기 + // ..env 받아오기 implementation 'io.github.cdimascio:java-dotenv:5.2.2' //JUnit4 추가 diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/AlarmSetRequestDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/AlarmSetRequestDTO.java new file mode 100644 index 0000000..bf6069c --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/AlarmSetRequestDTO.java @@ -0,0 +1,10 @@ +package com.todoslave.feedme.DTO; + +import lombok.Getter; + +@Getter +public class AlarmSetRequestDTO { + + int alarmTime; + +} diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/CreatureChatResponseDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/CreatureChatResponseDTO.java new file mode 100644 index 0000000..19e2e60 --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/CreatureChatResponseDTO.java @@ -0,0 +1,12 @@ +package com.todoslave.feedme.DTO; + +import lombok.Data; + +import java.time.LocalDate; +import java.util.List; + +@Data +public class CreatureChatResponseDTO { + private LocalDate day; + private List contents; +} diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/CreatureInfoResponseDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/CreatureInfoResponseDTO.java index 23dc755..e52f952 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/CreatureInfoResponseDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/CreatureInfoResponseDTO.java @@ -9,6 +9,7 @@ public class CreatureInfoResponseDTO { private String name; private String img; + private int level; private int exp; private int day; diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/CreatureMakeRequestDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/CreatureMakeRequestDTO.java index 598a81b..555eeae 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/CreatureMakeRequestDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/CreatureMakeRequestDTO.java @@ -9,6 +9,8 @@ public class CreatureMakeRequestDTO { String keyword; -// MultipartFile photo; + // AI 구현시 이걸로 바꿔야함 + // MultipartFile photo; String photo; + } diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/CreatureTodoResponseDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/CreatureTodoResponseDTO.java index ad40a08..1f66343 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/CreatureTodoResponseDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/CreatureTodoResponseDTO.java @@ -12,6 +12,5 @@ public class CreatureTodoResponseDTO { private String content; private LocalDate createdAt; private int isCompleted; - - +// private boolean diaryIsCompleted; } diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/DiaryRequestDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/DiaryRequestDTO.java new file mode 100644 index 0000000..a1a54c8 --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/DiaryRequestDTO.java @@ -0,0 +1,11 @@ +package com.todoslave.feedme.DTO; + +import lombok.Data; + + +@Data +public class DiaryRequestDTO { + + private int skip; + private int limit; +} diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/DiaryResponseDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/DiaryResponseDTO.java new file mode 100644 index 0000000..bc1c07f --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/DiaryResponseDTO.java @@ -0,0 +1,14 @@ +package com.todoslave.feedme.DTO; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class DiaryResponseDTO { + + private String content; + private LocalDateTime createdAt; + private String diaryImg; + +} diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/FeedCommentDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/FeedCommentDTO.java index 523f326..bb738f4 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/FeedCommentDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/FeedCommentDTO.java @@ -6,6 +6,7 @@ @Data public class FeedCommentDTO { + private String email; private int feedComentId; private String nickname; private String comment; diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/FeedDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/FeedDTO.java index 3e19d68..f6d6f03 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/FeedDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/FeedDTO.java @@ -2,16 +2,20 @@ import lombok.Data; +import java.time.LocalDateTime; import java.util.List; @Data public class FeedDTO { private int feedId; + private String email; private String nickname; private String img; private String caption; - private String time; + private LocalDateTime lastCreateTime; private int likes; + private boolean myLike; + private List comments; } diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/FeedResponseDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/FeedResponseDTO.java index 74a0f03..7b688d2 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/FeedResponseDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/FeedResponseDTO.java @@ -3,6 +3,7 @@ import lombok.Data; import java.sql.Timestamp; +import java.time.LocalDateTime; @Data @@ -14,6 +15,6 @@ public class FeedResponseDTO { private String author; private String likeCnt; - private Timestamp createdAt; + private LocalDateTime createdAt; } diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/FriendInfoResponseDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/FriendInfoResponseDTO.java new file mode 100644 index 0000000..56be3bc --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/FriendInfoResponseDTO.java @@ -0,0 +1,17 @@ +package com.todoslave.feedme.DTO; + +import lombok.Data; + +@Data +public class FriendInfoResponseDTO { + + private int friendId; + private String roomId; + private String nickname; + private String creatureNickname; + private String creatureImg; + private int level; + private int exp; + private int join; + +} diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/FriendReqResponseDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/FriendReqResponseDTO.java index 98530b0..43a82fa 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/FriendReqResponseDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/FriendReqResponseDTO.java @@ -1,8 +1,11 @@ package com.todoslave.feedme.DTO; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; import lombok.Data; @Data +@JsonInclude(Include.NON_NULL) public class FriendReqResponseDTO { // 친구 요청 ID diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/FriendReqRequestDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/FriendRequestDTO.java similarity index 68% rename from feedme/src/main/java/com/todoslave/feedme/DTO/FriendReqRequestDTO.java rename to feedme/src/main/java/com/todoslave/feedme/DTO/FriendRequestDTO.java index e12b511..3a503d8 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/FriendReqRequestDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/FriendRequestDTO.java @@ -1,9 +1,10 @@ package com.todoslave.feedme.DTO; +import lombok.Data; import lombok.Getter; -@Getter -public class FriendReqRequestDTO { +@Data +public class FriendRequestDTO { // 상대방 닉네임 private String counterpartNickname; diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/FriendResponseDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/FriendResponseDTO.java index 9ce80a0..5583183 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/FriendResponseDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/FriendResponseDTO.java @@ -7,5 +7,6 @@ public class FriendResponseDTO { private int friendId; private String counterpartNickname; + private String creatureimg; } diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/MemberChatMessageRequestDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/MemberChatMessageRequestDTO.java index 2c64ec4..7ba5dde 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/MemberChatMessageRequestDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/MemberChatMessageRequestDTO.java @@ -5,6 +5,9 @@ @Getter public class MemberChatMessageRequestDTO { - private String message; + + int sendId; + String content; + } diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/MemberChatResponseDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/MemberChatResponseDTO.java new file mode 100644 index 0000000..5da2148 --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/MemberChatResponseDTO.java @@ -0,0 +1,12 @@ +package com.todoslave.feedme.DTO; + +import lombok.Data; + +import java.util.List; + +@Data +public class MemberChatResponseDTO { + private int memberId; + private List chatData; + +} \ No newline at end of file diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/MemberSearchResponseDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/MemberSearchResponseDTO.java index 292c19f..f581e29 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/MemberSearchResponseDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/MemberSearchResponseDTO.java @@ -6,5 +6,6 @@ public class MemberSearchResponseDTO { String nickname; boolean isFriend; + boolean isRequested; String creatureImg; } diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/MemberSignupRequestDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/MemberSignupRequestDTO.java index 9af8a4e..75cd0cd 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/MemberSignupRequestDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/MemberSignupRequestDTO.java @@ -3,16 +3,18 @@ import lombok.Data; import java.sql.Timestamp; +import java.time.LocalDate; +import java.time.LocalDateTime; @Data public class MemberSignupRequestDTO { - String email; + private String email; - String nickname; + private String nickname; - String userRole = "ROLE_USER"; - - Timestamp birthday; + private String userRole = "ROLE_USER"; +// Timestamp birthday; + private LocalDate birthday; } diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/MypageResponseDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/MypageResponseDTO.java index f76088a..f9e1620 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/MypageResponseDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/MypageResponseDTO.java @@ -5,6 +5,8 @@ import java.time.LocalDate; @Data public class MypageResponseDTO { + + private int sendId; private String nickname; private String email; private LocalDate brithday; diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/TodoCreateRequestDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/TodoCreateRequestDTO.java index 1f8257b..d84c44a 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/TodoCreateRequestDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/TodoCreateRequestDTO.java @@ -1,8 +1,9 @@ package com.todoslave.feedme.DTO; +import lombok.Data; import lombok.Getter; -@Getter +@Data public class TodoCreateRequestDTO { private String content; diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/TodoDailyRequestDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/TodoDailyRequestDTO.java index 1548247..31571f5 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/TodoDailyRequestDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/TodoDailyRequestDTO.java @@ -1,9 +1,11 @@ package com.todoslave.feedme.DTO; import java.time.LocalDate; + +import lombok.Data; import lombok.Getter; -@Getter +@Data public class TodoDailyRequestDTO { private LocalDate date; diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/TodoModifyRequestDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/TodoModifyRequestDTO.java index 08f3220..eab8bf4 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/TodoModifyRequestDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/TodoModifyRequestDTO.java @@ -1,8 +1,9 @@ package com.todoslave.feedme.DTO; +import lombok.Data; import lombok.Getter; -@Getter +@Data public class TodoModifyRequestDTO { private int id; diff --git a/feedme/src/main/java/com/todoslave/feedme/DTO/TodoRequestDTO.java b/feedme/src/main/java/com/todoslave/feedme/DTO/TodoRequestDTO.java index db3556e..c2d2bad 100644 --- a/feedme/src/main/java/com/todoslave/feedme/DTO/TodoRequestDTO.java +++ b/feedme/src/main/java/com/todoslave/feedme/DTO/TodoRequestDTO.java @@ -1,9 +1,11 @@ package com.todoslave.feedme.DTO; import java.time.LocalDate; + +import lombok.Data; import lombok.Getter; -@Getter +@Data public class TodoRequestDTO { private LocalDate date; diff --git a/feedme/src/main/java/com/todoslave/feedme/FeedmeApplication.java b/feedme/src/main/java/com/todoslave/feedme/FeedmeApplication.java index abe624d..431666a 100644 --- a/feedme/src/main/java/com/todoslave/feedme/FeedmeApplication.java +++ b/feedme/src/main/java/com/todoslave/feedme/FeedmeApplication.java @@ -23,7 +23,7 @@ public static void main(String[] args) { System.setProperty("DB_USERNAME", dotenv.get("DB_USERNAME")); System.setProperty("DB_PASSWORD", dotenv.get("DB_PASSWORD")); System.setProperty("JWT_SECRET_KEY", dotenv.get("JWT_SECRET_KEY")); - + System.setProperty("GPT_SECRET_KEY", dotenv.get("GPT_SECRET_KEY")); // Run the Spring Boot application SpringApplication.run(FeedmeApplication.class, args); } diff --git a/feedme/src/main/java/com/todoslave/feedme/Hello.java b/feedme/src/main/java/com/todoslave/feedme/Hello.java deleted file mode 100644 index 0a12b4d..0000000 --- a/feedme/src/main/java/com/todoslave/feedme/Hello.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.todoslave.feedme; - -import lombok.Getter; -import lombok.Setter; - -@Getter @Setter -public class Hello { - - private String data; - -} diff --git a/feedme/src/main/java/com/todoslave/feedme/config/CorsConfig.java b/feedme/src/main/java/com/todoslave/feedme/config/CorsConfig.java index 249fe63..df77c03 100644 --- a/feedme/src/main/java/com/todoslave/feedme/config/CorsConfig.java +++ b/feedme/src/main/java/com/todoslave/feedme/config/CorsConfig.java @@ -11,9 +11,10 @@ public class CorsConfig implements WebMvcConfigurer{ @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") - .allowedOrigins("http://localhost:8080", "null") // 'null' 오리진 허용 + .allowedOrigins("https://i11b104.p.ssafy.io/api/", "https://i11b104.p.ssafy.io") // 'null' 오리진 허용 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*") .allowCredentials(true); } } + diff --git a/feedme/src/main/java/com/todoslave/feedme/config/WebSocketConfig.java b/feedme/src/main/java/com/todoslave/feedme/config/WebSocketConfig.java index 2e92014..02b3f18 100644 --- a/feedme/src/main/java/com/todoslave/feedme/config/WebSocketConfig.java +++ b/feedme/src/main/java/com/todoslave/feedme/config/WebSocketConfig.java @@ -1,3 +1,30 @@ +//package com.todoslave.feedme.config; +// +//import org.springframework.context.annotation.Configuration; +//import org.springframework.messaging.simp.config.MessageBrokerRegistry; +//import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +//import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +//import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; +// +//@Configuration +//@EnableWebSocketMessageBroker +//public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { +// +// @Override +// public void configureMessageBroker(MessageBrokerRegistry config) { +// config.enableSimpleBroker("/chatting", "/chatRoom"); +// config.setApplicationDestinationPrefixes("/chat"); +// } +// +// @Override +// public void registerStompEndpoints(StompEndpointRegistry registry) { +// registry.addEndpoint("/friendChat") +// .setAllowedOriginPatterns("http://localhost:8080","null") // 명시적인 오리진 사용 +// .withSockJS(); +// } +//} + +//0810 진기가 보내준 파일 package com.todoslave.feedme.config; import org.springframework.context.annotation.Configuration; @@ -18,8 +45,10 @@ public void configureMessageBroker(MessageBrokerRegistry config) { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { - registry.addEndpoint("/friendChat") - .setAllowedOriginPatterns("http://localhost:8080","null") // 명시적인 오리진 사용 + registry.addEndpoint("/ws/friendChat") + + .setAllowedOriginPatterns("*") .withSockJS(); + } -} +} \ No newline at end of file diff --git a/feedme/src/main/java/com/todoslave/feedme/config/gpt/OpenAiConfig.java b/feedme/src/main/java/com/todoslave/feedme/config/gpt/OpenAiConfig.java new file mode 100644 index 0000000..b771919 --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/config/gpt/OpenAiConfig.java @@ -0,0 +1,21 @@ +package com.todoslave.feedme.config.gpt; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class OpenAiConfig { + @Value("${openai.api.key}") + private String openAiKey; + @Bean + public RestTemplate template(){ + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getInterceptors().add((request, body, execution) -> { + request.getHeaders().add("Authorization", "Bearer " + openAiKey); + return execution.execute(request, body); + }); + return restTemplate; + } +} \ No newline at end of file diff --git a/feedme/src/main/java/com/todoslave/feedme/config/security/RedisConfig.java b/feedme/src/main/java/com/todoslave/feedme/config/security/RedisConfig.java index 7f73431..9ad0d4e 100644 --- a/feedme/src/main/java/com/todoslave/feedme/config/security/RedisConfig.java +++ b/feedme/src/main/java/com/todoslave/feedme/config/security/RedisConfig.java @@ -1,29 +1,30 @@ package com.todoslave.feedme.config.security; -import lombok.RequiredArgsConstructor; -import org.springframework.boot.autoconfigure.data.redis.RedisProperties; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; @Configuration -@EnableRedisRepositories -@RequiredArgsConstructor public class RedisConfig { - private final RedisProperties redisProperties; + @Value("${spring.redis.host}") + private String redisHost; + + @Value("${spring.redis.port}") + private String redisPort; @Bean public RedisConnectionFactory redisConnectionFactory() { RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(); - redisStandaloneConfiguration.setHostName(redisProperties.getHost()); - redisStandaloneConfiguration.setPort(redisProperties.getPort()); - redisStandaloneConfiguration.setPassword(redisProperties.getPassword()); - return new LettuceConnectionFactory(redisStandaloneConfiguration); + redisStandaloneConfiguration.setHostName(redisHost); + redisStandaloneConfiguration.setPort(Integer.parseInt(redisPort)); + // redisStandaloneConfiguration.setPassword(redisPassword); + LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration); + return lettuceConnectionFactory; } @Bean @@ -39,4 +40,47 @@ public RedisConnectionFactory redisConnectionFactory() { return redisTemplate; } -} \ No newline at end of file +} + +//package com.todoslave.feedme.config.security; +// +//import lombok.RequiredArgsConstructor; +//import org.springframework.boot.autoconfigure.data.redis.RedisProperties; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.data.redis.connection.RedisConnectionFactory; +//import org.springframework.data.redis.connection.RedisStandaloneConfiguration; +//import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +//import org.springframework.data.redis.core.RedisTemplate; +//import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; +// +//@Configuration +//@EnableRedisRepositories +//@RequiredArgsConstructor +//public class RedisConfig { +// +// private final RedisProperties redisProperties; +// +// @Bean +// public RedisConnectionFactory redisConnectionFactory() { +// RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(); +// redisStandaloneConfiguration.setHostName(redisProperties.getHost()); +// redisStandaloneConfiguration.setPort(redisProperties.getPort()); +// redisStandaloneConfiguration.setPassword(redisProperties.getPassword()); +// return new LettuceConnectionFactory(redisStandaloneConfiguration); +// } +// +// @Bean +// public RedisTemplate redisTemplate() { +// +// // redisTemplate 를 받아와서 set, get, delete 를 사용 +// RedisTemplate redisTemplate = new RedisTemplate<>(); +// /* +// * setKeySerializer, setValueSerializer 설정 +// * redis-cli 을 통해 직접 데이터를 조회 시 알아볼 수 없는 형태로 출력되는 것을 방지 +// */ +// redisTemplate.setConnectionFactory(redisConnectionFactory()); +// +// return redisTemplate; +// } +//} \ No newline at end of file diff --git a/feedme/src/main/java/com/todoslave/feedme/config/security/SecurityConfig.java b/feedme/src/main/java/com/todoslave/feedme/config/security/SecurityConfig.java index 3b5b6f7..bb9c158 100644 --- a/feedme/src/main/java/com/todoslave/feedme/config/security/SecurityConfig.java +++ b/feedme/src/main/java/com/todoslave/feedme/config/security/SecurityConfig.java @@ -33,31 +33,31 @@ public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http .httpBasic(HttpBasicConfigurer::disable) + http.httpBasic(HttpBasicConfigurer::disable) .csrf(CsrfConfigurer::disable) .cors(Customizer.withDefaults()) .sessionManagement(configurer -> configurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // .sessionCreationPolicy(SessionCreationPolicy.STATELESS) // 세션관리 정책을 STATELESS(세션이 있으면 쓰지도 않고, 없으면 만들지도 않는다) .authorizeHttpRequests((requests) -> requests - .requestMatchers("/token/**").permitAll() - .requestMatchers("/", "/css/**","/images/**","/js/**","/favicon.ico","/h2-console/**").permitAll() - .requestMatchers("/login/oauth2/code/**","/login/**","/testsite" ,"/signup", "/user", "/v3/api-docs/**", "/swagger-ui/**","/creature", "/swagger-ui.html", "/users/**").permitAll() // 유저 설정 - .requestMatchers("/ws/**").permitAll() + .requestMatchers("/token/**", "/bot/**").permitAll() + .requestMatchers("/", "/css/**", "/images/**", "/js/**", "/favicon.ico", "/h2-console/**").permitAll() + .requestMatchers("/login/oauth2/code/**", "/login/**", "/testsite", "/signup", "/user", "/v3/api-docs/**", + "/swagger-ui/**", "/creature", "/swagger-ui.html", "/users/**").permitAll() // 유저 설정 + .requestMatchers("/ws/**","/alarms/**").permitAll() .anyRequest().authenticated() ) .oauth2Login(oauth2 -> oauth2 - .loginPage("/test") + .loginPage("https://i11b104.p.ssafy.io") .userInfoEndpoint(userInfo -> userInfo.userService(customOAuth2UserService)) // OAuth2 로그인시 사용자 정보를 가져오는 엔드포인트와 사용자 서비스를 설정 .failureHandler(oAuth2LoginFailureHandler) // OAuth2 로그인 실패시 처리할 핸들러를 지정해준다. .successHandler(oAuth2LoginSuccessHandler) // OAuth2 로그인 성공시 처리할 핸들러를 지정해준다. ); - // JWT 인증 필터를 UsernamePasswordAuthenticationFilter 앞에 추가한다. return http.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class) - .addFilterBefore(jwtExceptionFilter, UsernamePasswordAuthenticationFilter.class) + .addFilterBefore(jwtExceptionFilter, JwtAuthFilter.class) .build(); } @@ -66,6 +66,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { // CORS 설정 CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); + configuration.addAllowedOrigin("https://i11b104.p.ssafy.io"); // 특정 도메인 허용 configuration.addAllowedOriginPattern("*"); configuration.addAllowedMethod("*"); // 모든 HTTP 메서드 허용 configuration.addAllowedHeader("*"); // 모든 헤더 허용 @@ -75,4 +76,4 @@ CorsConfigurationSource corsConfigurationSource() { source.registerCorsConfiguration("/**", configuration); // 모든 경로에 대해 CORS 구성 적용 return source; } - } \ No newline at end of file +} \ No newline at end of file diff --git a/feedme/src/main/java/com/todoslave/feedme/config/security/WebConfig.java b/feedme/src/main/java/com/todoslave/feedme/config/security/WebConfig.java index 8c7621b..37973e3 100644 --- a/feedme/src/main/java/com/todoslave/feedme/config/security/WebConfig.java +++ b/feedme/src/main/java/com/todoslave/feedme/config/security/WebConfig.java @@ -1,24 +1,24 @@ -package com.todoslave.feedme.config.security; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -public class WebConfig { - - @Bean - public WebMvcConfigurer corsConfigurer() { - return new WebMvcConfigurer() { - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**") - .allowedOrigins("http://localhost:3000") - .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") - .allowedHeaders("*") - .allowCredentials(true); - } - }; - } -} +//package com.todoslave.feedme.config.security; +// +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.web.servlet.config.annotation.CorsRegistry; +//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +// +//@Configuration +//public class WebConfig { +// +// @Bean +// public WebMvcConfigurer corsConfigurer() { +// return new WebMvcConfigurer() { +// @Override +// public void addCorsMappings(CorsRegistry registry) { +// registry.addMapping("/**") +// .allowedOrigins("http://localhost:3000") +// .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") +// .allowedHeaders("*") +// .allowCredentials(true); +// } +// }; +// } +//} diff --git a/feedme/src/main/java/com/todoslave/feedme/config/security/WebSecurityConfig.java b/feedme/src/main/java/com/todoslave/feedme/config/security/WebSecurityConfig.java index 7a921f7..a3f0ba1 100644 --- a/feedme/src/main/java/com/todoslave/feedme/config/security/WebSecurityConfig.java +++ b/feedme/src/main/java/com/todoslave/feedme/config/security/WebSecurityConfig.java @@ -1,4 +1,4 @@ -////package com.todoslave.feedme.config.security; + ////package com.todoslave.feedme.config.security; ////// //////import com.todoslave.feedme.service.UserDetailService; //////import lombok.RequiredArgsConstructor; diff --git a/feedme/src/main/java/com/todoslave/feedme/config/security/filter/JwtAuthFilter.java b/feedme/src/main/java/com/todoslave/feedme/config/security/filter/JwtAuthFilter.java index 494a3f5..d55b80e 100644 --- a/feedme/src/main/java/com/todoslave/feedme/config/security/filter/JwtAuthFilter.java +++ b/feedme/src/main/java/com/todoslave/feedme/config/security/filter/JwtAuthFilter.java @@ -1,147 +1,21 @@ -package com.todoslave.feedme.config.security.filter; - - -import com.todoslave.feedme.login.dto.RefreshToken; -import com.todoslave.feedme.login.dto.TokenResponseStatus; -import com.todoslave.feedme.login.util.SecurityUserDto; -import com.todoslave.feedme.domain.entity.membership.Member; -import com.todoslave.feedme.login.Handler.JWTUtill; -import com.todoslave.feedme.repository.MemberRepository; -import com.todoslave.feedme.repository.RefreshTokenRepository; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.oauth2.jwt.JwtException; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; -import org.springframework.web.filter.OncePerRequestFilter; - -import java.io.IOException; -import java.util.List; -import java.util.Optional; - -@RequiredArgsConstructor -@Slf4j -@Component -public class JwtAuthFilter extends OncePerRequestFilter { - - private final JWTUtill jwtUtil; - private final MemberRepository memberRepository; - - private final RefreshTokenRepository tokenRepository; - - @Override - protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException { - return request.getRequestURI().contains("token/refresh"); - } - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - - // request Header에서 AccessToken을 가져온다. - String atc = request.getHeader("Authorization"); - - - - // 토큰 검사 생략(모두 허용 URL의 경우 토큰 검사 통과) - if (!StringUtils.hasText(atc)) { - doFilter(request, response, filterChain); - return; - } - - // AccessToken을 검증하고, 만료되었을경우 예외를 발생시킨다. - if (!jwtUtil.verifyToken(atc)) { - - Optional refreshToken = tokenRepository.findByAccessToken(atc); - -// System.out.println("access token: " + atc + "이고요"); -// System.out.println("refresh token: " + refreshToken+"입니다"); -// System.out.println(refreshToken.toString()); -// System.out.println("refresh token: " + refreshToken.get().getRefreshToken()+"입니다"); - - if (refreshToken.isPresent() && jwtUtil.verifyToken(refreshToken.get().getRefreshToken())) { - - - // RefreshToken 객체를 꺼내온다. - RefreshToken resultToken = refreshToken.get(); - // 권한과 아이디를 추출해 새로운 액세스토큰을 만든다. - String newAccessToken = jwtUtil.generateAccessToken(resultToken.getId(), jwtUtil.getRole(resultToken.getRefreshToken())); - // 액세스 토큰의 값을 수정해준다. - resultToken.updateAccessToken(newAccessToken); - tokenRepository.save(resultToken); - - // 새로운 액세스 토큰을 헤더에 추가 - response.setHeader("Authorization", "Bearer " + newAccessToken); - - // 기존 요청을 업데이트된 토큰과 함께 다시 처리 - request.setAttribute("Authorization", "Bearer " + newAccessToken); - SecurityContextHolder.getContext().setAuthentication(getAuthentication(SecurityUserDto.builder() - .id(Integer.valueOf(resultToken.getId())) - .email(jwtUtil.getUid(resultToken.getAccessToken())) - .role(jwtUtil.getRole(resultToken.getAccessToken())) - .build())); - - // 기존 필터 체인을 다시 호출 - filterChain.doFilter(request, response); - - } else{ - throw new JwtException("Refresh 토큰과 Access Token 모두 만료되었습니다."); // 로그아웃 처리 - } - } - - // AccessToken의 값이 있고, 유효한 경우에 진행한다. - if (jwtUtil.verifyToken(atc)) { - - // AccessToken 내부의 payload에 있는 email로 user를 조회한다. 없다면 예외를 발생시킨다 -> 정상 케이스가 아님 - Member findMember = memberRepository.findByEmail(jwtUtil.getUid(atc)) - .orElseThrow(IllegalStateException::new); - - // SecurityContext에 등록할 User 객체를 만들어준다. - SecurityUserDto userDto = SecurityUserDto.builder() - .id(findMember.getId()) - .email(findMember.getEmail()) - .role("ROLE_".concat(findMember.getUserRole())) - .nickname(findMember.getNickname()) - .build(); - - // SecurityContext에 인증 객체를 등록해준다. - Authentication auth = getAuthentication(userDto); - SecurityContextHolder.getContext().setAuthentication(auth); - } - - filterChain.doFilter(request, response); - } - - - - public Authentication getAuthentication(SecurityUserDto member) { - return new UsernamePasswordAuthenticationToken(member, "", - List.of(new SimpleGrantedAuthority(member.getRole()))); - } - -} - //package com.todoslave.feedme.config.security.filter; // // +//import com.todoslave.feedme.login.dto.RefreshToken; +//import com.todoslave.feedme.login.dto.TokenResponseStatus; //import com.todoslave.feedme.login.util.SecurityUserDto; //import com.todoslave.feedme.domain.entity.membership.Member; //import com.todoslave.feedme.login.Handler.JWTUtill; //import com.todoslave.feedme.repository.MemberRepository; +//import com.todoslave.feedme.repository.RefreshTokenRepository; //import jakarta.servlet.FilterChain; //import jakarta.servlet.ServletException; //import jakarta.servlet.http.HttpServletRequest; //import jakarta.servlet.http.HttpServletResponse; //import lombok.RequiredArgsConstructor; //import lombok.extern.slf4j.Slf4j; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.http.ResponseEntity; //import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; //import org.springframework.security.core.Authentication; //import org.springframework.security.core.authority.SimpleGrantedAuthority; @@ -153,6 +27,7 @@ public Authentication getAuthentication(SecurityUserDto member) { // //import java.io.IOException; //import java.util.List; +//import java.util.Optional; // //@RequiredArgsConstructor //@Slf4j @@ -162,15 +37,21 @@ public Authentication getAuthentication(SecurityUserDto member) { // private final JWTUtill jwtUtil; // private final MemberRepository memberRepository; // +// private final RefreshTokenRepository tokenRepository; +// // @Override // protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException { -// return request.getRequestURI().contains("token/refresh"); +// return request.getRequestURI().contains("token/"); // } +// // @Override // protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { +// // // request Header에서 AccessToken을 가져온다. // String atc = request.getHeader("Authorization"); // +// +// // // 토큰 검사 생략(모두 허용 URL의 경우 토큰 검사 통과) // if (!StringUtils.hasText(atc)) { // doFilter(request, response, filterChain); @@ -179,9 +60,42 @@ public Authentication getAuthentication(SecurityUserDto member) { // // // AccessToken을 검증하고, 만료되었을경우 예외를 발생시킨다. // if (!jwtUtil.verifyToken(atc)) { -// throw new JwtException("Access Token 만료!"); // +// Optional refreshToken = tokenRepository.findByAccessToken(atc); +// +//// System.out.println("access token: " + atc + "이고요"); +//// System.out.println("refresh token: " + refreshToken+"입니다"); +//// System.out.println(refreshToken.toString()); +//// System.out.println("refresh token: " + refreshToken.get().getRefreshToken()+"입니다"); +// +// if (refreshToken.isPresent() && jwtUtil.verifyToken(refreshToken.get().getRefreshToken())) { +// +// +// // RefreshToken 객체를 꺼내온다. +// RefreshToken resultToken = refreshToken.get(); +// // 권한과 아이디를 추출해 새로운 액세스토큰을 만든다. +// String newAccessToken = jwtUtil.generateAccessToken(resultToken.getId(), jwtUtil.getRole(resultToken.getRefreshToken())); +// // 액세스 토큰의 값을 수정해준다. +// resultToken.updateAccessToken(newAccessToken); +// tokenRepository.save(resultToken); +// +// // 새로운 액세스 토큰을 헤더에 추가 +// response.setHeader("Authorization", "Bearer " + newAccessToken); +// +// // 기존 요청을 업데이트된 토큰과 함께 다시 처리 +// request.setAttribute("Authorization", "Bearer " + newAccessToken); +// SecurityContextHolder.getContext().setAuthentication(getAuthentication(SecurityUserDto.builder() +// .id(Integer.valueOf(resultToken.getId())) +// .email(jwtUtil.getUid(resultToken.getAccessToken())) +// .role(jwtUtil.getRole(resultToken.getAccessToken())) +// .build())); +// +// // 기존 필터 체인을 다시 호출 +// filterChain.doFilter(request, response); // +// } else{ +// throw new JwtException("Refresh 토큰과 Access Token 모두 만료되었습니다."); // 로그아웃 처리 +// } // } // // // AccessToken의 값이 있고, 유효한 경우에 진행한다. @@ -214,4 +128,89 @@ public Authentication getAuthentication(SecurityUserDto member) { // List.of(new SimpleGrantedAuthority(member.getRole()))); // } // -//} \ No newline at end of file +//} + +package com.todoslave.feedme.config.security.filter; + + +import com.todoslave.feedme.login.util.SecurityUserDto; +import com.todoslave.feedme.domain.entity.membership.Member; +import com.todoslave.feedme.login.Handler.JWTUtill; +import com.todoslave.feedme.repository.MemberRepository; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.jwt.JwtException; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; +import java.util.List; + +@RequiredArgsConstructor +@Slf4j +@Component +public class JwtAuthFilter extends OncePerRequestFilter { + + private final JWTUtill jwtUtil; + private final MemberRepository memberRepository; + + @Override + protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException { + return request.getRequestURI().contains("token/refresh"); + } + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + // request Header에서 AccessToken을 가져온다. + String atc = request.getHeader("Authorization"); + + // 토큰 검사 생략(모두 허용 URL의 경우 토큰 검사 통과) + if (!StringUtils.hasText(atc)) { + doFilter(request, response, filterChain); + return; + } + + // AccessToken을 검증하고, 만료되었을경우 예외를 발생시킨다. + if (!jwtUtil.verifyToken(atc)) { + throw new JwtException("Access Token 만료!"); + } + + // AccessToken의 값이 있고, 유효한 경우에 진행한다. + if (jwtUtil.verifyToken(atc)) { + + // AccessToken 내부의 payload에 있는 email로 user를 조회한다. 없다면 예외를 발생시킨다 -> 정상 케이스가 아님 + Member findMember = memberRepository.findByEmail(jwtUtil.getUid(atc)) + .orElseThrow(IllegalStateException::new); + + // SecurityContext에 등록할 User 객체를 만들어준다. + SecurityUserDto userDto = SecurityUserDto.builder() + .id(findMember.getId()) + .email(findMember.getEmail()) + .role("ROLE_".concat(findMember.getUserRole())) + .nickname(findMember.getNickname()) + .build(); + + // SecurityContext에 인증 객체를 등록해준다. + Authentication auth = getAuthentication(userDto); + SecurityContextHolder.getContext().setAuthentication(auth); + } + + filterChain.doFilter(request, response); + } + + + + public Authentication getAuthentication(SecurityUserDto member) { + return new UsernamePasswordAuthenticationToken(member, "", + List.of(new SimpleGrantedAuthority(member.getRole()))); + } + +} \ No newline at end of file diff --git a/feedme/src/main/java/com/todoslave/feedme/controller/AlarmController.java b/feedme/src/main/java/com/todoslave/feedme/controller/AlarmController.java index 0b3d237..302d667 100644 --- a/feedme/src/main/java/com/todoslave/feedme/controller/AlarmController.java +++ b/feedme/src/main/java/com/todoslave/feedme/controller/AlarmController.java @@ -1,12 +1,16 @@ package com.todoslave.feedme.controller; import com.todoslave.feedme.DTO.AlarmResponseDTO; +import com.todoslave.feedme.DTO.AlarmSetRequestDTO; import com.todoslave.feedme.login.util.SecurityUtil; import com.todoslave.feedme.DTO.PaginationRequestDTO; import com.todoslave.feedme.domain.entity.alarm.Alarm; import com.todoslave.feedme.service.AlarmService; +import java.util.List; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Slice; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @@ -16,28 +20,38 @@ @RequestMapping("/alarms") public class AlarmController { + @Autowired private final SecurityUtil securityUtil; + @Autowired private AlarmService alarmService; - @GetMapping(value = "/subscribe/alarm") - public SseEmitter subscribe(){ - return alarmService.createEmitter(); - } - - @GetMapping(value = "/subscribe/friend") + @GetMapping(value = "/subscribe/friend", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter friendSubscribe(){ + System.out.println("subscribe open!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); return alarmService.friendCreateEmitter(); } - @GetMapping(value = "/subscribe/chat") + @GetMapping(value = "/subscribe/alarm", produces = MediaType.TEXT_EVENT_STREAM_VALUE) + public SseEmitter subscribe(){ + System.out.println("subscribe open!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + return alarmService.createEmitter(); + } + + @GetMapping(value = "/subscribe/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public SseEmitter chatSubscribe(){ return alarmService.renewCreateEmitter(); } + @PostMapping("/time") + public ResponseEntity alarmTimeSetting(@RequestBody AlarmSetRequestDTO alarmSetRequestDTO){ + alarmService.createAlarmtime(alarmSetRequestDTO); + return ResponseEntity.noContent().build(); + } + // 생일, 투두 @GetMapping() - private ResponseEntity> loadAlarms(PaginationRequestDTO paginationRequestDTO) { - return ResponseEntity.ok(alarmService.loadAlarms(paginationRequestDTO)); + private ResponseEntity> loadAlarms() { + return ResponseEntity.ok(alarmService.loadAlarms()); } diff --git a/feedme/src/main/java/com/todoslave/feedme/controller/AuthController.java b/feedme/src/main/java/com/todoslave/feedme/controller/AuthController.java index 0f1eb8f..ec1fda2 100644 --- a/feedme/src/main/java/com/todoslave/feedme/controller/AuthController.java +++ b/feedme/src/main/java/com/todoslave/feedme/controller/AuthController.java @@ -8,6 +8,7 @@ import com.todoslave.feedme.login.Service.RefreshTokenService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestHeader; @@ -20,8 +21,11 @@ @RequiredArgsConstructor public class AuthController { + @Autowired private final RefreshTokenRepository tokenRepository; + @Autowired private final RefreshTokenService tokenService; + @Autowired private final JWTUtill jwtUtil; @PostMapping("token/logout") @@ -34,18 +38,13 @@ public ResponseEntity logout(@RequestHeader("Authorization") @PostMapping("/token/refresh") public ResponseEntity refresh(@RequestHeader("Authorization") final String accessToken) { - + System.out.println("이게되야해"); // 액세스 토큰으로 Refresh 토큰 객체를 조회 Optional refreshToken = tokenRepository.findByAccessToken(accessToken); - System.out.println(refreshToken.get().getRefreshToken()); - - // RefreshToken이 존재하고 유효하다면 실행 if (refreshToken.isPresent() && jwtUtil.verifyToken(refreshToken.get().getRefreshToken())) { - - // RefreshToken 객체를 꺼내온다. RefreshToken resultToken = refreshToken.get(); // 권한과 아이디를 추출해 새로운 액세스토큰을 만든다. @@ -53,9 +52,6 @@ public ResponseEntity refresh(@RequestHeader("Authorization // 액세스 토큰의 값을 수정해준다. resultToken.updateAccessToken(newAccessToken); tokenRepository.save(resultToken); - System.out.println(); - System.out.println(accessToken); - System.out.println(resultToken); // 새로운 액세스 토큰을 반환해준다. return ResponseEntity.ok(TokenResponseStatus.addStatus(200, newAccessToken)); diff --git a/feedme/src/main/java/com/todoslave/feedme/controller/CreatureChatController.java b/feedme/src/main/java/com/todoslave/feedme/controller/CreatureChatController.java new file mode 100644 index 0000000..1013d74 --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/controller/CreatureChatController.java @@ -0,0 +1,23 @@ +package com.todoslave.feedme.controller; + +import com.todoslave.feedme.DTO.MemberChatResponseDTO; +import com.todoslave.feedme.service.CreatureChatService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/api/chat") +@RequiredArgsConstructor +public class CreatureChatController { + + private final CreatureChatService creatureChatService; + + @GetMapping("/creature") + public ResponseEntity getCreatureChatData() { + MemberChatResponseDTO chatData = creatureChatService.getCreatureChat(); + return ResponseEntity.ok(chatData); + } +} \ No newline at end of file diff --git a/feedme/src/main/java/com/todoslave/feedme/controller/CreatureController.java b/feedme/src/main/java/com/todoslave/feedme/controller/CreatureController.java index 2fff89a..15006cc 100644 --- a/feedme/src/main/java/com/todoslave/feedme/controller/CreatureController.java +++ b/feedme/src/main/java/com/todoslave/feedme/controller/CreatureController.java @@ -8,6 +8,7 @@ import com.todoslave.feedme.service.CreatureService; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -32,10 +33,25 @@ public ResponseEntity createCreature(@RequestBody CreatureMakeRequestDTO requ return ResponseEntity.ok(Map.of("creatureId", creature.getId(), "message", "크리쳐가 성공적으로 생성되었습니다.")); } +// @Operation(summary = "크리쳐 생성") 이거는!!! 나중에 파일 전송시에! +// @PostMapping("/creature") +// public ResponseEntity createCreature(@ModelAttribute CreatureMakeRequestDTO request, +// @RequestHeader("Authorization") final String accessToken) { +// Member member = SecurityUtil.getCurrentMember(); +// +// Creature creature = creatureService.createFristCreature(request.getKeyword(), +// request.getPhoto(), +// request.getCreatureName()); +// +// return ResponseEntity.ok(Map.of("creatureId", creature.getId(), "message", "크리쳐가 성공적으로 생성되었습니다.")); +// } + + @Operation(summary = "크리쳐 보기") @GetMapping public ResponseEntity getCreatures(@RequestHeader("Authorization") final String accessToken) { - CreatureInfoResponseDTO creature = creatureService.creatureInfo(); + + CreatureInfoResponseDTO creature = creatureService.creatureInfo(SecurityUtil.getCurrentMember()); return new ResponseEntity(creature, HttpStatus.OK); } diff --git a/feedme/src/main/java/com/todoslave/feedme/controller/CreatureTodoController.java b/feedme/src/main/java/com/todoslave/feedme/controller/CreatureTodoController.java index d35c2f1..3aa0104 100644 --- a/feedme/src/main/java/com/todoslave/feedme/controller/CreatureTodoController.java +++ b/feedme/src/main/java/com/todoslave/feedme/controller/CreatureTodoController.java @@ -4,11 +4,13 @@ import com.todoslave.feedme.service.CreatureTodoService; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.time.LocalDate; import java.util.ArrayList; +import java.util.Date; import java.util.List; @RestController @@ -16,6 +18,7 @@ @RequiredArgsConstructor public class CreatureTodoController { + @Autowired final private CreatureTodoService creatureTodoService; // 크리쳐 투두 생성 @@ -46,7 +49,9 @@ public ResponseEntity> getCreatureTodoMainDaily() // 메인 달력에서 일정 불러오기 @GetMapping("/calendar/daily") @Operation(summary = "해당일의 크리쳐 투두 목록 가져오기") - public ResponseEntity> findCalendarCreatureTodoList(@RequestBody CretureTodoRequestDTO cretureTodoRequestDTO) { + public ResponseEntity> findCalendarCreatureTodoList(@RequestParam("date") LocalDate date) { + CretureTodoRequestDTO cretureTodoRequestDTO = new CretureTodoRequestDTO(); + cretureTodoRequestDTO.setDate(date); List list = creatureTodoService.getCreatureTodoCalendarDaily(cretureTodoRequestDTO); return ResponseEntity.ok(list); } @@ -54,7 +59,11 @@ public ResponseEntity> findCalendarCreatureTodoLis // 할일 목록에서 일정(일) 불러오기 @Operation(summary = "할일 목록에서 일정(일) 불러오기 - 다음날 이동 가능하게") @GetMapping("/todolist/daily") - public ResponseEntity> findDailyCreatureTodoList(@RequestBody CreatureTodoDailyRequestDTO creatureTodoDailyRequestDTO){ + public ResponseEntity> findDailyCreatureTodoList(@RequestParam("date") LocalDate date, + @RequestParam("next") int next){ + CreatureTodoDailyRequestDTO creatureTodoDailyRequestDTO = new CreatureTodoDailyRequestDTO(); + creatureTodoDailyRequestDTO.setDate(date); + creatureTodoDailyRequestDTO.setNext(next); return ResponseEntity.ok(creatureTodoService.getCreatureTodoListDaily(creatureTodoDailyRequestDTO)); } diff --git a/feedme/src/main/java/com/todoslave/feedme/controller/DayOffController.java b/feedme/src/main/java/com/todoslave/feedme/controller/DayOffController.java new file mode 100644 index 0000000..657900e --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/controller/DayOffController.java @@ -0,0 +1,48 @@ +package com.todoslave.feedme.controller; + +import com.todoslave.feedme.login.util.SecurityUtil; +import com.todoslave.feedme.service.DayOffService; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; + +@RestController +@RequestMapping("/dayoff") +@RequiredArgsConstructor +public class DayOffController { + + private final DayOffService dayOffService; + + //여기서 기존에 일기 쓴 기록이 있거나, 아니면 해당일에 한게 아무것도 없으면 버튼이 안눌리게 만들어 줘야해 + @Operation(summary = "일기 생성 버튼 활성화") + @GetMapping("/{canFinishDay}") + public ResponseEntity checkDiaryCreationEligibility(@PathVariable LocalDate canFinishDay) { + + int userId = SecurityUtil.getCurrentUserId(); + + // 해당 날짜에 이미 완료된 작업이 있는지 확인 + boolean actionAllowed = dayOffService.isActionAllowed(userId, canFinishDay); + + // 해당 날짜에 기록이 없는지 확인 (기록이 없으면 true) + boolean hasNoClearData = dayOffService.notFindClearData(canFinishDay); + + System.out.println("테스팅"); + System.out.println(actionAllowed); // 있어서 false + System.out.println(hasNoClearData); // 없어서 true + + // 버튼이 비활성화 되어야 하는 경우 (이미 완료된 작업이 있거나 기록이 없는 경우) + if (!actionAllowed || !hasNoClearData) { + return ResponseEntity.ok(false); + } + + // 버튼이 활성화 되어야 하는 경우 + return ResponseEntity.ok(true); + } + + + +} diff --git a/feedme/src/main/java/com/todoslave/feedme/controller/DiaryController.java b/feedme/src/main/java/com/todoslave/feedme/controller/DiaryController.java new file mode 100644 index 0000000..ca1717c --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/controller/DiaryController.java @@ -0,0 +1,34 @@ + +package com.todoslave.feedme.controller; + +import com.todoslave.feedme.DTO.DiaryRequestDTO; +import com.todoslave.feedme.DTO.DiaryResponseDTO; +import com.todoslave.feedme.service.DiaryService; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/diary") +public class DiaryController { + + private final DiaryService diaryService; + + @PostMapping("/list") + public ResponseEntity> getDiaryList( + @RequestBody DiaryRequestDTO paginationRequest) { + + int skip = paginationRequest.getSkip(); + int limit = paginationRequest.getLimit(); + + Pageable pageable = PageRequest.of(skip / limit, limit, Sort.by("createdAt").descending()); + Page diaryPage = diaryService.getDiaryList(pageable); + + return ResponseEntity.ok(diaryPage); + } +} \ No newline at end of file diff --git a/feedme/src/main/java/com/todoslave/feedme/controller/FeedController.java b/feedme/src/main/java/com/todoslave/feedme/controller/FeedController.java index 44bbb77..1cf1efd 100644 --- a/feedme/src/main/java/com/todoslave/feedme/controller/FeedController.java +++ b/feedme/src/main/java/com/todoslave/feedme/controller/FeedController.java @@ -7,6 +7,7 @@ import com.todoslave.feedme.service.FeedService; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -18,6 +19,7 @@ @RequiredArgsConstructor public class FeedController { + @Autowired private final FeedService feedService; // 피드 생성 @@ -48,7 +50,7 @@ public ResponseEntity delectFeed(@PathVariable int feedId) { } // 좋아요/좋아요 취소 버튼 - @Operation(summary = "피드 삭제") + @Operation(summary = "피드 좋아요/취소") @PostMapping("/{feedId}/like") public void likeButton(@PathVariable int feedId) { feedService.toggleLike(feedId); diff --git a/feedme/src/main/java/com/todoslave/feedme/controller/FriendController.java b/feedme/src/main/java/com/todoslave/feedme/controller/FriendController.java index 366e46e..99c1ad0 100644 --- a/feedme/src/main/java/com/todoslave/feedme/controller/FriendController.java +++ b/feedme/src/main/java/com/todoslave/feedme/controller/FriendController.java @@ -1,15 +1,20 @@ package com.todoslave.feedme.controller; -import com.todoslave.feedme.DTO.FriendReqRequestDTO; +import com.todoslave.feedme.DTO.FriendInfoResponseDTO; import com.todoslave.feedme.DTO.FriendReqResponseDTO; +import com.todoslave.feedme.DTO.FriendRequestDTO; import com.todoslave.feedme.DTO.FriendResponseDTO; import com.todoslave.feedme.DTO.MemberChatListResponseDTO; import com.todoslave.feedme.DTO.PaginationRequestDTO; +import com.todoslave.feedme.domain.entity.communication.FriendRequest; import com.todoslave.feedme.service.AlarmService; import com.todoslave.feedme.service.FriendService; import com.todoslave.feedme.service.MemberChatService; import com.todoslave.feedme.service.MemberService; +import io.swagger.v3.oas.annotations.Operation; +import java.io.IOException; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Slice; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -21,36 +26,51 @@ @RequestMapping("/friends") public class FriendController { - static private MemberService memberService; - static private FriendService friendService; - static private AlarmService alarmService; - static private MemberChatService memberChatService; + @Autowired + MemberService memberService; + @Autowired + FriendService friendService; + @Autowired + AlarmService alarmService; + @Autowired + MemberChatService memberChatService; // 친구 요청하기 @PostMapping - public ResponseEntity addFriend(FriendReqRequestDTO friendReqRequestDTO){ + public ResponseEntity addFriend(@RequestBody FriendRequestDTO friendReqRequestDTO) throws IOException { + friendService.requestFriend(friendReqRequestDTO); return ResponseEntity.noContent().build(); } // 친구 삭제하기 - @DeleteMapping("/{id}") - public ResponseEntity removeFriend(@RequestParam("id") int friendId){ - friendService.deleteFriend(friendId); + @DeleteMapping() + public ResponseEntity removeFriend(@RequestParam("counterpartNickname") String counterpartNickname){ + FriendRequestDTO friendRequestDTO = new FriendRequestDTO(); + friendRequestDTO.setCounterpartNickname(counterpartNickname); + friendService.deleteFriend(friendRequestDTO); return ResponseEntity.noContent().build(); } + //친구 정보 얻기 + @Operation(summary = "친구 닉네임 검색") + @GetMapping("/info") + public ResponseEntity findFriendInfo(@RequestParam String counterpartNickname){ + FriendRequestDTO friendRequestDTO = new FriendRequestDTO(); + friendRequestDTO.setCounterpartNickname(counterpartNickname); + return ResponseEntity.ok(friendService.getFriendInfo(friendRequestDTO)); + } + // 친구 목록 불러오기 - @GetMapping + @GetMapping("/list") public ResponseEntity> findFriends(){ return ResponseEntity.ok(friendService.getFriends()); } // 친구 요청 목록 조회 @GetMapping("/request") - public ResponseEntity> findRequestFriend( - PaginationRequestDTO paginationRequestDTO){ - return ResponseEntity.ok(friendService.getRequestFriend(paginationRequestDTO)); + public ResponseEntity> findRequestFriend() { + return ResponseEntity.ok(friendService.getRequestFriend()); } // 친구 요청 수락하기 diff --git a/feedme/src/main/java/com/todoslave/feedme/controller/MemberChatController.java b/feedme/src/main/java/com/todoslave/feedme/controller/MemberChatController.java index c0e3d6f..01bb729 100644 --- a/feedme/src/main/java/com/todoslave/feedme/controller/MemberChatController.java +++ b/feedme/src/main/java/com/todoslave/feedme/controller/MemberChatController.java @@ -11,6 +11,8 @@ import java.util.ArrayList; import java.util.List; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.event.EventListener; import org.springframework.data.domain.Slice; import org.springframework.data.redis.connection.Message; import org.springframework.data.redis.connection.MessageListener; @@ -19,20 +21,40 @@ import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.Payload; import org.springframework.messaging.handler.annotation.SendTo; +import org.springframework.messaging.simp.stomp.StompHeaderAccessor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.socket.messaging.SessionConnectEvent; +import org.springframework.web.socket.messaging.SessionDisconnectEvent; @RequiredArgsConstructor @RestController @RequestMapping("/friends/chats") public class MemberChatController { + @Autowired private final MemberChatService chatService; + @Autowired private final MemberService memberService; + @PostMapping("/connect") + public ResponseEntity webSocketConnect(@RequestParam("room") String roomId){ + System.out.println("enter the socket : "+roomId); + chatService.enterTheRoom(roomId); + return ResponseEntity.noContent().build(); + } + + @PostMapping("/disconnect") + public ResponseEntity webSocketDisConnect(@RequestParam("room") String roomId){ + System.out.println("close the socket : "+roomId); + chatService.exitTheRoom(roomId); + return ResponseEntity.noContent().build(); + } + // 유저의 채팅방 목록들 불러오기 @GetMapping public ResponseEntity> findChatRoomList(){ @@ -42,11 +64,11 @@ public ResponseEntity> findChatRoomList(){ // 메세지 불러오기 @MessageMapping("/loadMessages/{roomId}") @SendTo("/chatRoom/loadMessages/{roomId}") - public Slice findMessages(@DestinationVariable String roomId, + public Slice findMessages(@DestinationVariable String roomId, @Payload PaginationRequestDTO request){ - Slice messages = chatService.getChatMessage(roomId, request.getSkip(), request.getLimit()); + Slice messages = chatService.getChatMessage(roomId, request.getSkip(), request.getLimit()); - for (MemberChatMessage message : messages) { + for (MemberChatMessageResponseDTO message : messages) { System.out.println(message.toString()); } @@ -56,9 +78,9 @@ public Slice findMessages(@DestinationVariable String roomId, // 메세지 저장 @MessageMapping("/messages/{roomId}") @SendTo("/chatRoom/messages/{roomId}") - public MemberChatMessageResponseDTO sendMessage(@DestinationVariable String roomId, @Payload MemberChatMessageRequestDTO memberChatMessageRequestDTO) + public MemberChatMessageResponseDTO sendMessage(@DestinationVariable String roomId, @Payload MemberChatMessageRequestDTO request) throws IOException { - return chatService.insertChatMessage(roomId, memberChatMessageRequestDTO); + return chatService.insertChatMessage(roomId, request); } diff --git a/feedme/src/main/java/com/todoslave/feedme/controller/MemberController.java b/feedme/src/main/java/com/todoslave/feedme/controller/MemberController.java index b6161d0..a1361a6 100644 --- a/feedme/src/main/java/com/todoslave/feedme/controller/MemberController.java +++ b/feedme/src/main/java/com/todoslave/feedme/controller/MemberController.java @@ -1,5 +1,6 @@ package com.todoslave.feedme.controller; +import com.todoslave.feedme.DTO.FriendInfoResponseDTO; import com.todoslave.feedme.DTO.MemberSearchResponseDTO; import com.todoslave.feedme.DTO.MemberSignupRequestDTO; import com.todoslave.feedme.DTO.MypageResponseDTO; @@ -59,6 +60,7 @@ public ResponseEntity> getUsers(@PathVariable Stri return new ResponseEntity>(list, HttpStatus.OK); } + @Operation(summary = "맴버 가입") @PostMapping public ResponseEntity signupMember(@RequestBody MemberSignupRequestDTO memberSignupRequestDTO){ diff --git a/feedme/src/main/java/com/todoslave/feedme/controller/TodoCategoryController.java b/feedme/src/main/java/com/todoslave/feedme/controller/TodoCategoryController.java index 61a7ee4..11e1350 100644 --- a/feedme/src/main/java/com/todoslave/feedme/controller/TodoCategoryController.java +++ b/feedme/src/main/java/com/todoslave/feedme/controller/TodoCategoryController.java @@ -8,14 +8,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor @@ -31,13 +24,14 @@ public ResponseEntity> findTodoCategories(){ } @PostMapping("/{name}") - public ResponseEntity createTodoCategory(@PathVariable String name){ + public ResponseEntity createTodoCategory(@PathVariable("name") String name){ + System.out.println(name+"되어요?"); return ResponseEntity.ok(todoCategoryService.insertCategory(name)); } @DeleteMapping - public ResponseEntity removeTodoCategory(@RequestBody TodoCategoryRequestDTO category){ - todoCategoryService.deleteCategory(category.getId()); + public ResponseEntity removeTodoCategory(@RequestParam("categoryId") int categoryId){ + todoCategoryService.deleteCategory(categoryId); return ResponseEntity.noContent().build(); } diff --git a/feedme/src/main/java/com/todoslave/feedme/controller/TodoController.java b/feedme/src/main/java/com/todoslave/feedme/controller/TodoController.java index c2c2820..d1a7598 100644 --- a/feedme/src/main/java/com/todoslave/feedme/controller/TodoController.java +++ b/feedme/src/main/java/com/todoslave/feedme/controller/TodoController.java @@ -14,14 +14,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RequiredArgsConstructor @RestController @@ -32,16 +25,19 @@ public class TodoController { // 할일 목록에서 일정(일) 불러오기 @GetMapping("/todolist/daily") - public ResponseEntity> findDailyTodoList(@RequestBody - TodoDailyRequestDTO todoDailyRequestDTO){ - + public ResponseEntity> findDailyTodoList(@RequestParam("date")LocalDate date, + @RequestParam("next")int next){ + TodoDailyRequestDTO todoDailyRequestDTO = new TodoDailyRequestDTO(); + todoDailyRequestDTO.setDate(date); + todoDailyRequestDTO.setNext(next); return ResponseEntity.ok(todoService.getTodoListDaily(todoDailyRequestDTO)); } // 메인 달력에서 일정 불러오기 @GetMapping("/calendar/daily") - public ResponseEntity> findCalendarTodoList(@RequestBody TodoRequestDTO todoRequestDTO){ - + public ResponseEntity> findCalendarTodoList(@RequestParam("date")LocalDate date){ + TodoRequestDTO todoRequestDTO = new TodoRequestDTO(); + todoRequestDTO.setDate(date); return ResponseEntity.ok(todoService.getTodoCalendarDaily(todoRequestDTO)); } @@ -54,14 +50,19 @@ public ResponseEntity> findMainInCompleted(){ // 월별 일정 완/미완 불러오기 @GetMapping("/calendar") - public ResponseEntity> findCalendarIsCompleted(@RequestBody TodoRequestDTO todoRequestDTO){ - + public ResponseEntity> findCalendarIsCompleted(@RequestParam("date")LocalDate date){ + TodoRequestDTO todoRequestDTO = new TodoRequestDTO(); + todoRequestDTO.setDate(date); return ResponseEntity.ok(todoService.getTodoCalendarCompleted(todoRequestDTO)); } // 투두 생성 @PostMapping - public ResponseEntity createTodo(@RequestBody TodoCreateRequestDTO todo){ + public ResponseEntity createTodo(@RequestParam("content")String content, + @RequestParam("categoryId")int categoryId){ + TodoCreateRequestDTO todo = new TodoCreateRequestDTO(); + todo.setContent(content); + todo.setCategoryId(categoryId); return ResponseEntity.ok(todoService.insertTodo(todo)); } @@ -74,7 +75,10 @@ public ResponseEntity removeTodo(@PathVariable int id){ // 투두 수정 @PatchMapping() - public ResponseEntity modifyTodo(@RequestBody TodoModifyRequestDTO todoModifyRequestDTO){ + public ResponseEntity modifyTodo(@RequestParam("id") int id, @RequestParam("content")String content){ + TodoModifyRequestDTO todoModifyRequestDTO = new TodoModifyRequestDTO(); + todoModifyRequestDTO.setId(id); + todoModifyRequestDTO.setContent(content); return ResponseEntity.ok(todoService.updateTodo(todoModifyRequestDTO)); } @@ -86,7 +90,9 @@ public ResponseEntity completeTodo(@PathVariable int id){ //오늘 (어제 포함) 일정 완료하기 @PostMapping("/complete/complateAll") - public ResponseEntity allCompleteTodo(@RequestBody TodoRequestDTO todoRequestDTO){ + public ResponseEntity allCompleteTodo(@RequestParam("date")LocalDate date){ + TodoRequestDTO todoRequestDTO = new TodoRequestDTO(); + todoRequestDTO.setDate(date); return ResponseEntity.ok(todoService.AllcompleteTodo(todoRequestDTO)); } diff --git a/feedme/src/main/java/com/todoslave/feedme/domain/entity/avatar/Creature.java b/feedme/src/main/java/com/todoslave/feedme/domain/entity/avatar/Creature.java index a285c95..c79b727 100644 --- a/feedme/src/main/java/com/todoslave/feedme/domain/entity/avatar/Creature.java +++ b/feedme/src/main/java/com/todoslave/feedme/domain/entity/avatar/Creature.java @@ -39,6 +39,11 @@ public class Creature { @Column(name = "creature_name") private String creatureName; + //크리쳐 키워드 + @Column(name = "creature_keyword") + private String creatureKeyword; + + //==연관관계 메서드==// public void setMember(Member member) { this.member = member; diff --git a/feedme/src/main/java/com/todoslave/feedme/domain/entity/communication/MemberChatRoom.java b/feedme/src/main/java/com/todoslave/feedme/domain/entity/communication/MemberChatRoom.java index 8d0b34c..5fb07ac 100644 --- a/feedme/src/main/java/com/todoslave/feedme/domain/entity/communication/MemberChatRoom.java +++ b/feedme/src/main/java/com/todoslave/feedme/domain/entity/communication/MemberChatRoom.java @@ -30,7 +30,7 @@ public class MemberChatRoom { private LocalDateTime receiveTime; public MemberChatRoom(){ - receiveTime = LocalDateTime.MIN; + receiveTime = LocalDateTime.of(1970, 1, 1, 0, 0); } } diff --git a/feedme/src/main/java/com/todoslave/feedme/domain/entity/diary/PictureDiary.java b/feedme/src/main/java/com/todoslave/feedme/domain/entity/diary/PictureDiary.java index 5462671..51bd4e8 100644 --- a/feedme/src/main/java/com/todoslave/feedme/domain/entity/diary/PictureDiary.java +++ b/feedme/src/main/java/com/todoslave/feedme/domain/entity/diary/PictureDiary.java @@ -22,16 +22,15 @@ public class PictureDiary { @JsonBackReference private Member member; + //일기쓴 날 + @Column(name = "created_at", nullable = false, updatable = false) + private LocalDateTime createdAt; + //일기 내용 @Lob @Column(name = "content", nullable = false, columnDefinition = "TEXT") private String content; - //일기쓴 날 - @CreationTimestamp - @Column(name = "created_at", nullable = false, updatable = false) - private LocalDateTime createdAt; - //==연관관계 메서드==// public void setMember(Member member) { this.member = member; diff --git a/feedme/src/main/java/com/todoslave/feedme/domain/entity/membership/Member.java b/feedme/src/main/java/com/todoslave/feedme/domain/entity/membership/Member.java index aa6e2c0..d4f1d11 100644 --- a/feedme/src/main/java/com/todoslave/feedme/domain/entity/membership/Member.java +++ b/feedme/src/main/java/com/todoslave/feedme/domain/entity/membership/Member.java @@ -26,6 +26,7 @@ import java.sql.Timestamp; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collection; @@ -60,8 +61,8 @@ public class Member { //유저 디테일은 사용자 인증 정보를 담아두 private String nickname; //생일 - @Column //(nullable = false) - private Timestamp birthday; + @Column (nullable = false) + private LocalDate birthday; // 상태 @Column(name = "status", nullable = false) diff --git a/feedme/src/main/java/com/todoslave/feedme/domain/entity/membership/MemberAlarm.java b/feedme/src/main/java/com/todoslave/feedme/domain/entity/membership/MemberAlarm.java index 1adf1fb..b469006 100644 --- a/feedme/src/main/java/com/todoslave/feedme/domain/entity/membership/MemberAlarm.java +++ b/feedme/src/main/java/com/todoslave/feedme/domain/entity/membership/MemberAlarm.java @@ -10,12 +10,12 @@ import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import java.sql.Time; +import lombok.Data; import lombok.Getter; import lombok.Setter; @Entity -@Getter -@Setter +@Data @Table(name = "memberAlarm") public class MemberAlarm { diff --git a/feedme/src/main/java/com/todoslave/feedme/gpt/dto/ChatGPTRequest.java b/feedme/src/main/java/com/todoslave/feedme/gpt/dto/ChatGPTRequest.java new file mode 100644 index 0000000..0ea3dd0 --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/gpt/dto/ChatGPTRequest.java @@ -0,0 +1,18 @@ +package com.todoslave.feedme.gpt.dto; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class ChatGPTRequest { + private String model; + private List messages; + + public ChatGPTRequest(String model, String prompt) { + this.model = model; + this.messages = new ArrayList<>(); + this.messages.add(new Message("user", prompt)); + } +} \ No newline at end of file diff --git a/feedme/src/main/java/com/todoslave/feedme/gpt/dto/ChatGPTResponse.java b/feedme/src/main/java/com/todoslave/feedme/gpt/dto/ChatGPTResponse.java new file mode 100644 index 0000000..4a6231b --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/gpt/dto/ChatGPTResponse.java @@ -0,0 +1,24 @@ +package com.todoslave.feedme.gpt.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ChatGPTResponse { + private List choices; + + + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Choice { + private int index; + private Message message; + + } +} \ No newline at end of file diff --git a/feedme/src/main/java/com/todoslave/feedme/gpt/dto/CustomBotController.java b/feedme/src/main/java/com/todoslave/feedme/gpt/dto/CustomBotController.java new file mode 100644 index 0000000..bb273c0 --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/gpt/dto/CustomBotController.java @@ -0,0 +1,24 @@ +//package com.todoslave.feedme.gpt.dto; +// +// +// +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.web.bind.annotation.GetMapping; +//import org.springframework.web.bind.annotation.RequestMapping; +//import org.springframework.web.bind.annotation.RequestParam; +//import org.springframework.web.bind.annotation.RestController; +// +//@RestController +//@RequestMapping("/bot") +//public class CustomBotController { +// +// @Autowired +// private CustomBotService botService; +// +// @GetMapping("/chat") +// public String chat(@RequestParam(name = "prompt") String prompt, +// @RequestParam(name = "format", required = false, defaultValue = "{response}") String format) { +// return botService.chat(prompt, format); +// } +// +//} \ No newline at end of file diff --git a/feedme/src/main/java/com/todoslave/feedme/gpt/dto/CustomBotService.java b/feedme/src/main/java/com/todoslave/feedme/gpt/dto/CustomBotService.java new file mode 100644 index 0000000..ff5d75c --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/gpt/dto/CustomBotService.java @@ -0,0 +1,46 @@ +package com.todoslave.feedme.gpt.dto; + +import com.todoslave.feedme.gpt.dto.ChatGPTRequest; +import com.todoslave.feedme.gpt.dto.ChatGPTResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class CustomBotService { + + @Value("${openai.model}") + private String model; + + @Value("${openai.api.url}") + private String apiURL; + + @Autowired + private RestTemplate template; + + public String chat(String prompt) { + // ChatGPT 요청 생성 및 응답 받기 + ChatGPTRequest request = new ChatGPTRequest(model, prompt); + ChatGPTResponse chatGPTResponse = template.postForObject(apiURL, request, ChatGPTResponse.class); + String responseContent = chatGPTResponse.getChoices().get(0).getMessage().getContent(); + + // 요청에 포함된 형식에 맞춰 데이터를 가공 + return processRequestBasedOnFormat(prompt, responseContent); + } + + private String processRequestBasedOnFormat(String prompt, String responseContent) { + // 요청에 "20개의 자료", " ,로 이어서" 등 특정 패턴이 있는지 검사 + if (prompt.contains("20개의 자료") && prompt.contains(",로 이어서")) { + // 데이터를 20개로 나누고 콤마로 연결 + List dataList = Arrays.asList(responseContent.split("\\s+")).subList(0, Math.min(20, responseContent.split("\\s+").length)); + return String.join(", ", dataList); + } + // 다른 형식의 처리도 추가 가능 + return responseContent; + } +} diff --git a/feedme/src/main/java/com/todoslave/feedme/gpt/dto/Message.java b/feedme/src/main/java/com/todoslave/feedme/gpt/dto/Message.java new file mode 100644 index 0000000..2ab05a6 --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/gpt/dto/Message.java @@ -0,0 +1,14 @@ +package com.todoslave.feedme.gpt.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Message { + private String role; + private String content; + +} \ No newline at end of file diff --git a/feedme/src/main/java/com/todoslave/feedme/login/Handler/JWTUtill.java b/feedme/src/main/java/com/todoslave/feedme/login/Handler/JWTUtill.java index 3002642..179da18 100644 --- a/feedme/src/main/java/com/todoslave/feedme/login/Handler/JWTUtill.java +++ b/feedme/src/main/java/com/todoslave/feedme/login/Handler/JWTUtill.java @@ -75,7 +75,9 @@ public String generateRefreshToken(String email, String role) { public String generateAccessToken(String email, String role) { - long tokenPeriod = 1000L * 60L * 30L * 4; // 2시간 + + long tokenPeriod = 1000L * 60L * 30L * 8; // 4시간 + // long tokenPeriod = 1000L * 30L; Claims claims = Jwts.claims().setSubject(email); claims.put("role", role); diff --git a/feedme/src/main/java/com/todoslave/feedme/login/Handler/MyAuthenticationFailureHandler.java b/feedme/src/main/java/com/todoslave/feedme/login/Handler/MyAuthenticationFailureHandler.java index bb06871..ee2a8d8 100644 --- a/feedme/src/main/java/com/todoslave/feedme/login/Handler/MyAuthenticationFailureHandler.java +++ b/feedme/src/main/java/com/todoslave/feedme/login/Handler/MyAuthenticationFailureHandler.java @@ -17,7 +17,7 @@ public class MyAuthenticationFailureHandler implements AuthenticationFailureHand @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { // 인증 실패시 메인 페이지로 이동 - response.sendRedirect("http://localhost:3000/"); + response.sendRedirect("https://i11b104.p.ssafy.io"); } } \ No newline at end of file diff --git a/feedme/src/main/java/com/todoslave/feedme/login/Handler/MyAuthenticationSuccessHandler.java b/feedme/src/main/java/com/todoslave/feedme/login/Handler/MyAuthenticationSuccessHandler.java index e5e8d65..33ba1a1 100644 --- a/feedme/src/main/java/com/todoslave/feedme/login/Handler/MyAuthenticationSuccessHandler.java +++ b/feedme/src/main/java/com/todoslave/feedme/login/Handler/MyAuthenticationSuccessHandler.java @@ -59,7 +59,7 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo // response.setHeader("Authorization", "Bearer " + token.getAccessToken()); // 크리쳐 존재 여부를 쿼리스트링에 담는 url을 만들어준다. - String targetUrl = UriComponentsBuilder.fromUriString("http://localhost:3000/LoginLoding") + String targetUrl = UriComponentsBuilder.fromUriString("https://i11b104.p.ssafy.io/LoginLoding") .queryParam("hasCreature", hasCreature) .queryParam("accessToken", token.getAccessToken()) .build() @@ -72,7 +72,7 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo } else { // 회원이 존재하지 않을경우, 서비스 제공자와 email을 쿼리스트링으로 전달하는 url을 만들어준다. - String targetUrl = UriComponentsBuilder.fromUriString("http://localhost:3000/Signup") + String targetUrl = UriComponentsBuilder.fromUriString("https://i11b104.p.ssafy.io/Signup") .queryParam("email", (String) oAuth2User.getAttribute("email")) .queryParam("provider", provider) .build() diff --git a/feedme/src/main/java/com/todoslave/feedme/mapper/FriendRequestMapper.java b/feedme/src/main/java/com/todoslave/feedme/mapper/FriendRequestMapper.java index a7e2c03..26feffe 100644 --- a/feedme/src/main/java/com/todoslave/feedme/mapper/FriendRequestMapper.java +++ b/feedme/src/main/java/com/todoslave/feedme/mapper/FriendRequestMapper.java @@ -4,19 +4,27 @@ import com.todoslave.feedme.domain.entity.avatar.Creature; import com.todoslave.feedme.domain.entity.communication.FriendRequest; import com.todoslave.feedme.repository.CreatureRepository; -import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; -@RequiredArgsConstructor +@Component public class FriendRequestMapper { - private static CreatureRepository creatureRepository; + private final CreatureRepository creatureRepository; - public static FriendReqResponseDTO toDto(FriendRequest friendRequest){ + @Autowired + public FriendRequestMapper(CreatureRepository creatureRepository) { + this.creatureRepository = creatureRepository; + } + + public FriendReqResponseDTO toDto(FriendRequest friendRequest) { FriendReqResponseDTO dto = new FriendReqResponseDTO(); dto.setId(friendRequest.getId()); dto.setCounterpartNickname(friendRequest.getCounterpartId().getNickname()); Creature creature = creatureRepository.findByMemberId(friendRequest.getId()); - dto.setCreatureImg("http://localhost:8080/image/creature/"+creature.getMember().getId()+"_"+creature.getLevel()); + + dto.setCreatureImg("https://i11b104.p.ssafy.io/image/creature/"+creature.getMember().getId()+"_"+creature.getLevel()); + return dto; } diff --git a/feedme/src/main/java/com/todoslave/feedme/mapper/MessageMapper.java b/feedme/src/main/java/com/todoslave/feedme/mapper/MessageMapper.java new file mode 100644 index 0000000..f6d413d --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/mapper/MessageMapper.java @@ -0,0 +1,29 @@ +package com.todoslave.feedme.mapper; + +import com.todoslave.feedme.DTO.MemberChatMessageResponseDTO; +import com.todoslave.feedme.domain.entity.communication.MemberChatMessage; +import com.todoslave.feedme.domain.entity.membership.Member; +import com.todoslave.feedme.repository.MemberRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +@Component +@RequiredArgsConstructor +public class MessageMapper { + + private final MemberRepository memberRepository; + + public MemberChatMessageResponseDTO toDto(MemberChatMessage message){ + + MemberChatMessageResponseDTO dto = new MemberChatMessageResponseDTO(); + + Member member = memberRepository.getById(message.getSendId()); + dto.setSendNickname(member.getNickname()); + dto.setMessage(message.getContent()); + dto.setTransmitAt(message.getTransmitAt()); + + return dto; + } + +} diff --git a/feedme/src/main/java/com/todoslave/feedme/repository/AlarmRepository.java b/feedme/src/main/java/com/todoslave/feedme/repository/AlarmRepository.java index 6a0dee3..cdb2186 100644 --- a/feedme/src/main/java/com/todoslave/feedme/repository/AlarmRepository.java +++ b/feedme/src/main/java/com/todoslave/feedme/repository/AlarmRepository.java @@ -9,7 +9,7 @@ public interface AlarmRepository extends JpaRepository { - Slice findByMemberId(int memberId, Pageable pageable); + List findByMemberId(int memberId); } diff --git a/feedme/src/main/java/com/todoslave/feedme/repository/CreatureTodoReposito.java b/feedme/src/main/java/com/todoslave/feedme/repository/CreatureTodoReposito.java index 502b637..7f16a10 100644 --- a/feedme/src/main/java/com/todoslave/feedme/repository/CreatureTodoReposito.java +++ b/feedme/src/main/java/com/todoslave/feedme/repository/CreatureTodoReposito.java @@ -17,4 +17,6 @@ public interface CreatureTodoReposito extends JpaRepository findByMemberId(int id); } diff --git a/feedme/src/main/java/com/todoslave/feedme/repository/DiaryRepository.java b/feedme/src/main/java/com/todoslave/feedme/repository/DiaryRepository.java new file mode 100644 index 0000000..1aa5dbf --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/repository/DiaryRepository.java @@ -0,0 +1,7 @@ +package com.todoslave.feedme.repository; + +import com.todoslave.feedme.domain.entity.diary.PictureDiary; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface DiaryRepository extends JpaRepository { +} \ No newline at end of file diff --git a/feedme/src/main/java/com/todoslave/feedme/repository/FriendRepository.java b/feedme/src/main/java/com/todoslave/feedme/repository/FriendRepository.java index ae50dbe..56b7bdc 100644 --- a/feedme/src/main/java/com/todoslave/feedme/repository/FriendRepository.java +++ b/feedme/src/main/java/com/todoslave/feedme/repository/FriendRepository.java @@ -11,6 +11,7 @@ public interface FriendRepository extends JpaRepository { List findAllByMemberId(int memberId); + Friend findByMemberIdAndCounterpartId(int memberId, int counterpartId); boolean existsByMemberIdAndCounterpartId(int memberId, int counterpartId); boolean existsByCounterpartIdAndMemberId(int counterpartId, int memberId); diff --git a/feedme/src/main/java/com/todoslave/feedme/repository/FriendRequestRepository.java b/feedme/src/main/java/com/todoslave/feedme/repository/FriendRequestRepository.java index ea8e14b..c3e2d93 100644 --- a/feedme/src/main/java/com/todoslave/feedme/repository/FriendRequestRepository.java +++ b/feedme/src/main/java/com/todoslave/feedme/repository/FriendRequestRepository.java @@ -2,16 +2,18 @@ import com.todoslave.feedme.domain.entity.communication.Friend; import com.todoslave.feedme.domain.entity.communication.FriendRequest; +import com.todoslave.feedme.domain.entity.membership.Member; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; public interface FriendRequestRepository extends JpaRepository { FriendRequest findById(int id); - Slice findAllByMemberId(int memberId, Pageable pageable); - + List findAllByMemberId(int memberId); + Optional findByMember_IdAndCounterpartId_Id(int memberId, int counterpartId); } diff --git a/feedme/src/main/java/com/todoslave/feedme/repository/MemberAlarmRepository.java b/feedme/src/main/java/com/todoslave/feedme/repository/MemberAlarmRepository.java index 1cf2cae..03251e7 100644 --- a/feedme/src/main/java/com/todoslave/feedme/repository/MemberAlarmRepository.java +++ b/feedme/src/main/java/com/todoslave/feedme/repository/MemberAlarmRepository.java @@ -9,7 +9,6 @@ public interface MemberAlarmRepository extends JpaRepository { -// boolean existsByMemberIdAndReceiveAt(@Param("memberId") int memberId, @Param("receiveAt") int receiveAt); } diff --git a/feedme/src/main/java/com/todoslave/feedme/repository/MemberChatMessageRepository.java b/feedme/src/main/java/com/todoslave/feedme/repository/MemberChatMessageRepository.java index 0331854..47cb62e 100644 --- a/feedme/src/main/java/com/todoslave/feedme/repository/MemberChatMessageRepository.java +++ b/feedme/src/main/java/com/todoslave/feedme/repository/MemberChatMessageRepository.java @@ -12,5 +12,6 @@ public interface MemberChatMessageRepository extends // 메세지 불러오기 Slice findByMemberChatRoomIdOrderByTransmitAtDesc(String memberChatRoomId, Pageable pageable); + void deleteAllByMemberChatRoomId(String memberChatRoomId); } diff --git a/feedme/src/main/java/com/todoslave/feedme/repository/TodoRepository.java b/feedme/src/main/java/com/todoslave/feedme/repository/TodoRepository.java index 63757f2..50448c0 100644 --- a/feedme/src/main/java/com/todoslave/feedme/repository/TodoRepository.java +++ b/feedme/src/main/java/com/todoslave/feedme/repository/TodoRepository.java @@ -21,11 +21,12 @@ public interface TodoRepository extends JpaRepository { @Query("SELECT t FROM Todo t WHERE t.member.id = :memberId AND FUNCTION('DATE', t.createdAt) = :createdAt AND t.isCompleted = :isCompleted") List findAllByMemberIdAndCreatedAtIsCompleted(@Param("memberId") int memberID, @Param("createdAt") LocalDate createdAt,@Param("isCompleted") int isCompleted); - @Query("SELECT t.member.id FROM Todo t WHERE t.createdAt = :createdAt AND t.isCompleted = 0") - List findMemberIdAllByCreatedAtAndIsCompleted(LocalDate createdAt); + List findMemberIdAllByCreatedAtAndIsCompleted(LocalDate createdAt, int isCompleted); @Query("SELECT COUNT(t) FROM Todo t WHERE t.createdAt = :date AND t.isCompleted = :isCompleted") long countTodoByDateAndIsCompleted(@Param("date") LocalDate date, @Param("isCompleted") int isCompleted); List findByMemberIdAndCreatedAt(int memberId, LocalDate createdAt); + + List findByMemberId(int id); } diff --git a/feedme/src/main/java/com/todoslave/feedme/service/AlarmService.java b/feedme/src/main/java/com/todoslave/feedme/service/AlarmService.java index 9536258..81798cc 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/AlarmService.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/AlarmService.java @@ -1,6 +1,7 @@ package com.todoslave.feedme.service; import com.todoslave.feedme.DTO.AlarmResponseDTO; +import com.todoslave.feedme.DTO.AlarmSetRequestDTO; import com.todoslave.feedme.DTO.FriendReqResponseDTO; import com.todoslave.feedme.DTO.MemberChatListResponseDTO; import com.todoslave.feedme.DTO.PaginationRequestDTO; @@ -9,20 +10,22 @@ import com.todoslave.feedme.domain.entity.membership.Member; import java.io.IOException; import java.time.LocalDateTime; +import java.util.List; import org.springframework.data.domain.Slice; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; public interface AlarmService { + SseEmitter friendCreateEmitter(); + void createAlarmtime(AlarmSetRequestDTO alarmSetRequestDTO); SseEmitter createEmitter(); void todoCompleted() throws IOException; - void requestFriendship(FriendReqResponseDTO friendReqResponseDTO) throws IOException; + void requestFriendship(FriendReqResponseDTO friendReqResponseDTO, int memberId) throws IOException; void congratsBirthday() throws IOException; SseEmitter renewCreateEmitter(); - SseEmitter friendCreateEmitter(); - void renewChattingRoom(MemberChatListResponseDTO room) throws IOException; - void sendAlarm(Alarm alarm) throws IOException; - Slice loadAlarms(PaginationRequestDTO paginationRequestDTO); + void renewChattingRoom(MemberChatListResponseDTO room, int memberId, int checked) throws IOException; + public void sendAlarm(T alarm, int type, SseEmitter emitter) throws IOException; + List loadAlarms(); } diff --git a/feedme/src/main/java/com/todoslave/feedme/service/AlarmServiceImpl.java b/feedme/src/main/java/com/todoslave/feedme/service/AlarmServiceImpl.java index c3857b5..4c772c6 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/AlarmServiceImpl.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/AlarmServiceImpl.java @@ -2,19 +2,23 @@ import com.todoslave.feedme.DTO.AlarmResponseDTO; +import com.todoslave.feedme.DTO.AlarmSetRequestDTO; import com.todoslave.feedme.DTO.FriendReqResponseDTO; import com.todoslave.feedme.DTO.MemberChatListResponseDTO; import com.todoslave.feedme.DTO.PaginationRequestDTO; import com.todoslave.feedme.domain.entity.alarm.Alarm; import com.todoslave.feedme.domain.entity.avatar.Creature; import com.todoslave.feedme.domain.entity.communication.MemberChatMessage; +import com.todoslave.feedme.domain.entity.communication.MemberChatRoomChecked; import com.todoslave.feedme.domain.entity.membership.Member; +import com.todoslave.feedme.domain.entity.membership.MemberAlarm; import com.todoslave.feedme.login.util.SecurityUserDto; import com.todoslave.feedme.login.util.SecurityUtil; import com.todoslave.feedme.mapper.AlarmMapper; import com.todoslave.feedme.repository.AlarmRepository; import com.todoslave.feedme.repository.CreatureRepository; import com.todoslave.feedme.repository.MemberAlarmRepository; +import com.todoslave.feedme.repository.MemberChatRoomCheckedRepository; import com.todoslave.feedme.repository.MemberRepository; import com.todoslave.feedme.repository.TodoRepository; import jakarta.transaction.Transactional; @@ -22,10 +26,13 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import javax.swing.text.html.parser.Entity; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -38,16 +45,52 @@ @Service public class AlarmServiceImpl implements AlarmService{ - private AlarmRepository alarmRepository; - private MemberAlarmRepository memberAlarmRepository; - private TodoRepository todoRepository; - private MemberRepository memberRepository; - private CreatureRepository creatureRepository; + private final AlarmRepository alarmRepository; + private final MemberAlarmRepository memberAlarmRepository; + private final TodoRepository todoRepository; + private final MemberRepository memberRepository; + private final CreatureRepository creatureRepository; + private final MemberChatRoomCheckedRepository memberChatRoomCheckedRepository; private final Map emitters = new ConcurrentHashMap<>(); private final Map chatEmitters = new ConcurrentHashMap<>(); private final Map friendEmitters = new ConcurrentHashMap<>(); + @Override + public SseEmitter friendCreateEmitter() { + + int memberId = SecurityUtil.getCurrentUserId(); + + SseEmitter emitter = new SseEmitter(); + friendEmitters.put(memberId, emitter); + + System.out.println("friend subscribe open!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"+memberId); + + if(friendEmitters.get(memberId)!=null){ + System.out.println("friend subscribe has!!!"); + } + + emitter.onCompletion(() -> friendEmitters.remove(memberId)); + emitter.onTimeout(() -> friendEmitters.remove(memberId)); + emitter.onError((e) -> friendEmitters.remove(memberId)); + + return emitter; + } + + @Override + public void createAlarmtime(AlarmSetRequestDTO alarmSetRequestDTO) { + + Member member = SecurityUtil.getCurrentMember(); + + MemberAlarm memberAlarm = new MemberAlarm(); + + memberAlarm.setMember(member); + memberAlarm.setAlarmTime(alarmSetRequestDTO.getAlarmTime()); + + memberAlarm = memberAlarmRepository.save(memberAlarm); + + } + @Override public SseEmitter createEmitter() { @@ -56,6 +99,8 @@ public SseEmitter createEmitter() { SseEmitter emitter = new SseEmitter(); emitters.put(memberId, emitter); + System.out.println("구독 열려용!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"+memberId); + emitter.onCompletion(() -> emitters.remove(memberId)); emitter.onTimeout(() -> emitters.remove(memberId)); emitter.onError((e) -> emitters.remove(memberId)); @@ -68,7 +113,7 @@ public SseEmitter createEmitter() { public void todoCompleted() throws IOException { LocalDate currentDay = LocalDate.now(); - List members = todoRepository.findMemberIdAllByCreatedAtAndIsCompleted(currentDay); + List members = todoRepository.findMemberIdAllByCreatedAtAndIsCompleted(currentDay, 0); for(int memberId : members) { @@ -86,25 +131,15 @@ public void todoCompleted() throws IOException { alarm.setContent("배고픈 " + creature.getCreatureName() + ".. 밥 줄 사람 없나요?"); alarmRepository.save(alarm); - sendAlarm(alarm); + sendAlarm(alarm, 0, emitters.get(memberId)); } } //친구 요청 알림 - public void requestFriendship(FriendReqResponseDTO friendReqResponseDTO) throws IOException { + public void requestFriendship(FriendReqResponseDTO friendReqResponseDTO, int memberId) throws IOException { - int memberId = SecurityUtil.getCurrentUserId(); - SseEmitter emitter = friendEmitters.get(memberId); - - if(emitter!=null) { - SseEmitter.SseEventBuilder event = SseEmitter.event() - .name("friend") - .data(friendReqResponseDTO); - emitter.send(event); - }else{ - System.out.println("Sse Connection is over" + memberId); - } + sendAlarm(friendReqResponseDTO,1, friendEmitters.get(memberId)); } @@ -123,7 +158,7 @@ public void congratsBirthday() throws IOException { alarm.setContent(member.getNickname()+"님! 생일 축하합니다!"); alarmRepository.save(alarm); - sendAlarm(alarm); + sendAlarm(alarm, 0, emitters.get(member.getId())); } @@ -144,70 +179,91 @@ public SseEmitter renewCreateEmitter() { return emitter; } - // 친구 창에서 SSE 구독 - @Override - public SseEmitter friendCreateEmitter() { - int memberId = SecurityUtil.getCurrentUserId(); - - SseEmitter emitter = new SseEmitter(); - friendEmitters.put(memberId, emitter); - - emitter.onCompletion(() -> friendEmitters.remove(memberId)); - emitter.onTimeout(() -> friendEmitters.remove(memberId)); - emitter.onError((e) -> emitters.remove(memberId)); - - return emitter; - } - // 채팅방 갱신 @Override - public void renewChattingRoom(MemberChatListResponseDTO room) throws IOException { - - int memberId = SecurityUtil.getCurrentUserId(); + @Transactional + public void renewChattingRoom(MemberChatListResponseDTO room, int memberId, int checked) throws IOException { SseEmitter emitter = chatEmitters.get(memberId); if(emitter!=null) { + + room.setIsChecked(checked); + SseEmitter.SseEventBuilder event = SseEmitter.event() .name("chattingRoom") .data(room); emitter.send(event); }else{ - System.out.println("Friend don't connected" + memberId); + System.out.println("Sse Connection fail"); } } // 알람 받아라 @Override - public void sendAlarm(Alarm alarm) throws IOException { + public void sendAlarm(T alarm, int type, SseEmitter emitter) throws IOException { - int memberId = SecurityUtil.getCurrentUserId(); - SseEmitter emitter = emitters.get(memberId); + System.out.println("alarm send!!!!!!!!!!"+alarm); if(emitter!=null){ - AlarmResponseDTO dto = AlarmMapper.toDto(alarm); + if(type==0) { + AlarmResponseDTO dto = AlarmMapper.toDto((Alarm) alarm); + + SseEmitter.SseEventBuilder event = SseEmitter.event() + .name("alarm") + .data(dto); + + try { + emitter.send(event); + }catch (IOException e){ + emitter.completeWithError(e); + throw e; + }catch (Exception e){ + emitter.completeWithError(e); + throw new RuntimeException("알람전송중 문제 발생",e); + } + }else if(type==1){ + + SseEmitter.SseEventBuilder event = SseEmitter.event() + .name("friend") + .data(alarm); + + try { + emitter.send(event); + }catch (IOException e){ + emitter.completeWithError(e); + throw e; + }catch (Exception e){ + emitter.completeWithError(e); + throw new RuntimeException("알람전송중 문제 발생",e); + } + } - SseEmitter.SseEventBuilder event = SseEmitter.event() - .name("") - .data(dto); - - emitter.send(event); + }else{ + System.out.println("Sse connect fail"); } } - public Slice loadAlarms(PaginationRequestDTO paginationRequestDTO){ - Pageable pageable = PageRequest.of(paginationRequestDTO.getSkip() / paginationRequestDTO.getLimit(), - paginationRequestDTO.getLimit()); + public List loadAlarms(){ int memberId = SecurityUtil.getCurrentUserId(); - Slice alarm = alarmRepository.findByMemberId(memberId, pageable); + List alarm = alarmRepository.findByMemberId(memberId); + List response = new ArrayList<>(); + + for(Alarm a : alarm){ + + AlarmResponseDTO alarmResponseDTO = new AlarmResponseDTO(); + alarmResponseDTO.setContent(a.getContent()); + response.add(alarmResponseDTO); + + } - return alarm.map(AlarmMapper::toDto); + return response; } diff --git a/feedme/src/main/java/com/todoslave/feedme/service/CreatureChatService.java b/feedme/src/main/java/com/todoslave/feedme/service/CreatureChatService.java new file mode 100644 index 0000000..2d97822 --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/service/CreatureChatService.java @@ -0,0 +1,18 @@ +package com.todoslave.feedme.service; + +import com.todoslave.feedme.DTO.CreatureChatResponseDTO; +import com.todoslave.feedme.DTO.MemberChatResponseDTO; +import com.todoslave.feedme.domain.entity.avatar.Creature; +import com.todoslave.feedme.domain.entity.membership.Member; + +import java.util.List; + +public interface CreatureChatService { + + // 날자와, 한 일을 도려줄건데 + + + MemberChatResponseDTO getCreatureChat(); + + +} diff --git a/feedme/src/main/java/com/todoslave/feedme/service/CreatureChatServiceImpl.java b/feedme/src/main/java/com/todoslave/feedme/service/CreatureChatServiceImpl.java new file mode 100644 index 0000000..47452a4 --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/service/CreatureChatServiceImpl.java @@ -0,0 +1,71 @@ +package com.todoslave.feedme.service; + +import com.todoslave.feedme.DTO.CreatureChatResponseDTO; +import com.todoslave.feedme.DTO.MemberChatResponseDTO; +import com.todoslave.feedme.domain.entity.membership.Member; +import com.todoslave.feedme.domain.entity.task.CreatureTodo; +import com.todoslave.feedme.domain.entity.task.Todo; +import com.todoslave.feedme.login.util.SecurityUtil; +import com.todoslave.feedme.repository.CreatureTodoReposito; +import com.todoslave.feedme.repository.TodoRepository; +import com.todoslave.feedme.service.CreatureChatService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@RequiredArgsConstructor +@Service +public class CreatureChatServiceImpl implements CreatureChatService { + + private final TodoRepository todoRepository; + private final CreatureTodoReposito creatureTodoReposito; + + @Override + public MemberChatResponseDTO getCreatureChat() { + + Member member = SecurityUtil.getCurrentMember(); + int memberId = member.getId(); + Map> groupedData = new HashMap<>(); + + // 멤버의 모든 Todo 리스트 가져오기 + List todoList = todoRepository.findByMemberId(memberId); + for (Todo todo : todoList) { + if (todo.getIsCompleted() == 1) { + LocalDate date = todo.getCreatedAt(); + groupedData.computeIfAbsent(date, k -> new ArrayList<>()).add(todo.getContent()); + } + } + + // 멤버의 모든 CreatureTodo 리스트 가져오기 + List creatureTodoList = creatureTodoReposito.findByMemberId(memberId); + for (CreatureTodo creatureTodo : creatureTodoList) { + if (creatureTodo.getIsCompleted() == 1) { + LocalDate date = creatureTodo.getCreatedAt(); + groupedData.computeIfAbsent(date, k -> new ArrayList<>()).add(creatureTodo.getContent()); + } + } + + // 날짜별 데이터 리스트를 생성 + List chatData = groupedData.entrySet().stream() + .map(entry -> { + CreatureChatResponseDTO dto = new CreatureChatResponseDTO(); + dto.setDay(entry.getKey()); + dto.setContents(entry.getValue()); + return dto; + }) + .collect(Collectors.toList()); + + // 최종 DTO 생성 및 반환 + MemberChatResponseDTO responseDTO = new MemberChatResponseDTO(); + responseDTO.setMemberId(memberId); + responseDTO.setChatData(chatData); + + return responseDTO; + } +} diff --git a/feedme/src/main/java/com/todoslave/feedme/service/CreatureService.java b/feedme/src/main/java/com/todoslave/feedme/service/CreatureService.java index 2c46325..a747e98 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/CreatureService.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/CreatureService.java @@ -4,13 +4,19 @@ import com.todoslave.feedme.DTO.CreatureInfoResponseDTO; import com.todoslave.feedme.domain.entity.avatar.Creature; +import com.todoslave.feedme.domain.entity.membership.Member; +import org.springframework.web.multipart.MultipartFile; + +import javax.swing.*; + + public interface CreatureService { //크리쳐 만들기 Creature createFristCreature(String keyword, String photo, String creatureName); //크리쳐 정보 가져오기 - CreatureInfoResponseDTO creatureInfo(); + CreatureInfoResponseDTO creatureInfo(Member member); //크리쳐 삭제하기 boolean removeCreature(); //크리쳐 경험치 올리기 diff --git a/feedme/src/main/java/com/todoslave/feedme/service/CreatureServiceImpl.java b/feedme/src/main/java/com/todoslave/feedme/service/CreatureServiceImpl.java index 55de04e..87070e1 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/CreatureServiceImpl.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/CreatureServiceImpl.java @@ -9,7 +9,14 @@ import com.todoslave.feedme.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; import javax.swing.*; @@ -20,8 +27,9 @@ @RequiredArgsConstructor public class CreatureServiceImpl implements CreatureService { + @Autowired final private MemberRepository memberRepository; - + @Autowired final private CreatureRepository creatureRepository; //크리쳐 만들기 @@ -33,6 +41,8 @@ public Creature createFristCreature(String keyword, String photo, String creatur Creature creature = new Creature(); //이름 설정하고 creature.setCreatureName(creatureName); + //키워드 저장 + creature.setCreatureKeyword(keyword); //멤버와 매핑 시켜주고 creature.setMember(member); //경험치와 레벨은 자동 0으로 설정 @@ -40,16 +50,64 @@ public Creature createFristCreature(String keyword, String photo, String creatur creatureRepository.save(creature); //저장 //여기서 사진 만들라고 명령 내리시고!!!!!!!!!!!!!!!!!!!!!! + //AI return creature; } + +// @Override +// public Creature createFristCreature(String keyword, MultipartFile photo, String creatureName) { +// Member member = SecurityUtil.getCurrentMember(); +// +// Creature creature = new Creature(); +// creature.setCreatureName(creatureName); +// creature.setMember(member); +// creature.setCreatureKeyword(keyword); + +// // 사진을 AI 서버로 바로 전송 +// sendPhotoToAIServer(photo, keyword); +// +// creatureRepository.save(creature); +// +// return creature; +// } +// +// private void sendPhotoToAIServer(MultipartFile photo, String keyword) { +// // HTTP 클라이언트를 사용하여 파일을 AI 서버에 전송하는 로직 작성 +// // 예시로 RestTemplate 사용 +// RestTemplate restTemplate = new RestTemplate(); +// +// MultiValueMap body = new LinkedMultiValueMap<>(); +// body.add("file", photo.getResource()); // MultipartFile을 바로 전송 +// body.add("keyword", keyword); // 추가로 필요한 파라미터들 +// +// HttpHeaders headers = new HttpHeaders(); +// headers.setContentType(MediaType.MULTIPART_FORM_DATA); +// +// HttpEntity> requestEntity = new HttpEntity<>(body, headers); +// +// String aiServerUrl = "http://ai-server-url/endpoint"; // AI 서버의 URL +// +// ResponseEntity response = restTemplate.postForEntity(aiServerUrl, requestEntity, String.class); +// +// if (!response.getStatusCode().is2xxSuccessful()) { +// throw new RuntimeException("AI 서버로 사진 전송에 실패했습니다."); +// } +// } + + + + + // 크리쳐 보기 @Override - public CreatureInfoResponseDTO creatureInfo() { + + public CreatureInfoResponseDTO creatureInfo(Member member) { + CreatureInfoResponseDTO creatureInfoResponseDTO = new CreatureInfoResponseDTO(); - Member member = SecurityUtil.getCurrentMember(); creatureInfoResponseDTO.setName(member.getCreature().getCreatureName()); + creatureInfoResponseDTO.setLevel(member.getCreature().getLevel()); creatureInfoResponseDTO.setExp(member.getCreature().getExp()); creatureInfoResponseDTO.setImg(generateCreatureImgPath(member)); @@ -95,13 +153,10 @@ public void expUp(int toDoCnt) { // 현재 레벨에 따른 경험치와 레벨업 조건 처리 switch (creature.getLevel()) { case 0: // 알 - System.out.println("여기 들어가니?"); if (nowExp >= 10) { // 레벨업 조건 creature.setLevel(1); creature.setExp(nowExp - 10); } else { - - System.out.println("여기 들어가야 하는데"); System.out.println(nowExp); creature.setExp(nowExp); } @@ -136,6 +191,6 @@ private String generateCreatureImgPath(Member member) { Creature creature = member.getCreature(); int creatureLevel = creature.getLevel(); int creatureId = creature.getId(); - return "http://localhost:8080/image/creature/" + creatureId + "_" +creatureLevel; + return "https://i11b104.p.ssafy.io/image/creature/" + creatureId + "_" +creatureLevel; } } diff --git a/feedme/src/main/java/com/todoslave/feedme/service/CreatureTodoServiceImpl.java b/feedme/src/main/java/com/todoslave/feedme/service/CreatureTodoServiceImpl.java index 0002eb6..4981228 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/CreatureTodoServiceImpl.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/CreatureTodoServiceImpl.java @@ -8,8 +8,11 @@ import com.todoslave.feedme.domain.entity.task.CreatureTodo; import com.todoslave.feedme.login.util.SecurityUtil; import com.todoslave.feedme.repository.CreatureTodoReposito; +import com.todoslave.feedme.repository.DayOffRepository; import com.todoslave.feedme.repository.MissionRepository; +import com.todoslave.feedme.repository.TodoRepository; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.sql.Timestamp; @@ -22,7 +25,12 @@ @RequiredArgsConstructor public class CreatureTodoServiceImpl implements CreatureTodoService{ + final private DayOffRepository dayOffRepository; + + + @Autowired final private MissionRepository missionRepository; + @Autowired final private CreatureTodoReposito creatureTodoRepository; private Random random = new Random(); // 로그인시에 없으면 생성 @@ -70,13 +78,21 @@ public List insertTodo(String weather) { return responseDTOList; } + //일정을 완료 했는지 안했는지 체크 + public boolean isActionAllowed(int memberId, LocalDate date) { + return dayOffRepository.countByMemberIdAndEndDay(memberId, date) == 0; + } + //DTO 변환 private CreatureTodoResponseDTO toResponseDTO(CreatureTodo creatureTodo) { + + return CreatureTodoResponseDTO.builder() .id(creatureTodo.getId()) .content(creatureTodo.getContent()) .createdAt(creatureTodo.getCreatedAt()) .isCompleted(creatureTodo.getIsCompleted()) +// .diaryIsCompleted(!checked) //그래서 역전 .build(); } @@ -136,6 +152,7 @@ public List getCreatureTodoListDaily(CreatureTodoDailyR LocalDate date = creatureTodoDailyRequestDTO.getDate(); //멤버 int memberId = SecurityUtil.getCurrentUserId(); + //누른 버튼 if(creatureTodoDailyRequestDTO.getNext() < 0 ){ //-1 일때 date.minusDays(1); diff --git a/feedme/src/main/java/com/todoslave/feedme/service/DayOffService.java b/feedme/src/main/java/com/todoslave/feedme/service/DayOffService.java index 5e0cc48..0a34171 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/DayOffService.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/DayOffService.java @@ -13,9 +13,16 @@ public interface DayOffService { // DayOff 생성 DayOff saveDayOff(DayOff dayOff); - // 특정 날짜에 DayOff가 있는지 확인 + // 특정 날짜에 DayOff가 있는지 확인 -> 이거로 확인하고 boolean isActionAllowed(int memberId, LocalDate date); + // 이게 이제 그날의 끝낸게 있나 없나 확인 + boolean notFindClearData(LocalDate date); + // DayOff 삭제 void deleteDayOff(int id); + + + + } diff --git a/feedme/src/main/java/com/todoslave/feedme/service/DayOffServiceImpl.java b/feedme/src/main/java/com/todoslave/feedme/service/DayOffServiceImpl.java index a50a89d..5a1bfd2 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/DayOffServiceImpl.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/DayOffServiceImpl.java @@ -1,18 +1,28 @@ package com.todoslave.feedme.service; import com.todoslave.feedme.domain.entity.task.DayOff; +import com.todoslave.feedme.login.util.SecurityUtil; +import com.todoslave.feedme.repository.CreatureTodoReposito; import com.todoslave.feedme.repository.DayOffRepository; +import com.todoslave.feedme.repository.TodoRepository; +import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDate; import java.util.Optional; + @Service public class DayOffServiceImpl implements DayOffService { private final DayOffRepository dayOffRepository; + @Autowired + private TodoRepository todoRepository; + @Autowired + private CreatureTodoReposito creatureTodoReposito; + @Autowired public DayOffServiceImpl(DayOffRepository dayOffRepository) { this.dayOffRepository = dayOffRepository; @@ -33,10 +43,34 @@ public boolean isActionAllowed(int memberId, LocalDate date) { return dayOffRepository.countByMemberIdAndEndDay(memberId, date) == 0; } + @Override + public boolean notFindClearData(LocalDate date) { + long inCompleted = todoRepository.countTodoByDateAndIsCompleted(date, 1)+creatureTodoReposito.countByCreatedAtAndIsCompleted(date,1); + if(inCompleted == 0){ //그날에 한게 없다? + return false; + } + return true; //그날에 한것이 있다! + } + @Override public void deleteDayOff(int id) { dayOffRepository.deleteById(id); } + + + +// //false면 있는거 이게 한 적이 있나 없나 +// boolean checked = isActionAllowed(SecurityUtil.getCurrentMember().getId(), creatureTodo.getCreatedAt()); +// +// +// //아 생각해보니까 이러면 없는날에 안되네,,, +// long inCompleted = todoRepository.countTodoByDateAndIsCompleted(creatureTodo.getCreatedAt(), 0)+creatureTodoReposito.countByCreatedAtAndIsCompleted(creatureTodo.getCreatedAt(),0); +// if(inCompleted==0){ +// checked=false; +// } + + + } diff --git a/feedme/src/main/java/com/todoslave/feedme/service/DiaryService.java b/feedme/src/main/java/com/todoslave/feedme/service/DiaryService.java new file mode 100644 index 0000000..e2b5c9b --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/service/DiaryService.java @@ -0,0 +1,9 @@ +package com.todoslave.feedme.service; + +import com.todoslave.feedme.DTO.DiaryResponseDTO; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface DiaryService { + Page getDiaryList(Pageable pageable); +} diff --git a/feedme/src/main/java/com/todoslave/feedme/service/DiaryServiceImpl.java b/feedme/src/main/java/com/todoslave/feedme/service/DiaryServiceImpl.java new file mode 100644 index 0000000..63d703b --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/service/DiaryServiceImpl.java @@ -0,0 +1,36 @@ +package com.todoslave.feedme.service; + + +import com.todoslave.feedme.DTO.DiaryResponseDTO; +import com.todoslave.feedme.domain.entity.diary.PictureDiary; +import com.todoslave.feedme.login.util.SecurityUtil; +import com.todoslave.feedme.repository.DiaryRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +@Service +public class DiaryServiceImpl implements DiaryService { + + private final DiaryRepository diaryRepository; + + @Autowired + public DiaryServiceImpl(DiaryRepository diaryRepository) { + this.diaryRepository = diaryRepository; + } + + @Override + public Page getDiaryList(Pageable pageable) { + return diaryRepository.findAll(pageable) + .map(this::convertToDTO); + } + + private DiaryResponseDTO convertToDTO(PictureDiary diary) { + DiaryResponseDTO dto = new DiaryResponseDTO(); + dto.setContent(diary.getContent()); + dto.setCreatedAt(diary.getCreatedAt()); + dto.setDiaryImg("https://i11b104.p.ssafy.io/image/pictureDiary/"+ SecurityUtil.getCurrentUserId() +"_"+diary.getCreatedAt()); + return dto; + } +} diff --git a/feedme/src/main/java/com/todoslave/feedme/service/FeedService.java b/feedme/src/main/java/com/todoslave/feedme/service/FeedService.java index 3e8f69a..c115f82 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/FeedService.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/FeedService.java @@ -17,7 +17,6 @@ public interface FeedService { void toggleLike(int feedId); - List getRecentFeeds(); List getRecentFeedsByFriends(); diff --git a/feedme/src/main/java/com/todoslave/feedme/service/FeedServiceImpl.java b/feedme/src/main/java/com/todoslave/feedme/service/FeedServiceImpl.java index b95505a..6a28b44 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/FeedServiceImpl.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/FeedServiceImpl.java @@ -112,7 +112,7 @@ public List getRecentFeedsByFriends() { public List getRecentFeeds() { LocalDateTime thirtyDaysAgo = LocalDateTime.now().minusDays(30); List recentFeeds = feedRepository.findRecentFeeds(thirtyDaysAgo); - // 친구껏만 가져오는 뭔가!!! + // 친구껏만 feed오는 뭔가!!! // @@ -123,12 +123,23 @@ public List getRecentFeeds() { private FeedDTO convertToFeedDTO(Feed feed) { FeedDTO feedDTO = new FeedDTO(); + + FeedLike existingFeedLike = feedLikeRepository.findByMemberAndFeed(SecurityUtil.getCurrentMember(), feed); + + if (existingFeedLike != null) { + feedDTO.setMyLike(false); + }else { + feedDTO.setMyLike(true); + } + + feedDTO.setEmail(feed.getMember().getEmail()); feedDTO.setFeedId(feed.getId()); feedDTO.setNickname(feed.getNickname()); - feedDTO.setImg("http://localhost:8080/image/pictureDiary/"+SecurityUtil.getCurrentUserId()+"_"+feed.getDiaryDay()); // 이미지 처리 로직 필요 + feedDTO.setImg("https://i11b104.p.ssafy.io/image/pictureDiary/"+SecurityUtil.getCurrentUserId()+"_"+feed.getDiaryDay()); // 이미지 처리 로직 필요 feedDTO.setCaption(feed.getContent()); - feedDTO.setTime(feed.getCreatedAt().toString()); + feedDTO.setLastCreateTime(feed.getUpdatedAt()); feedDTO.setLikes(feed.getLikeCount()); + feedDTO.setComments(feed.getFeedComments().stream() .map(this::convertToCommentDTO) .collect(Collectors.toList())); @@ -141,6 +152,7 @@ private FeedCommentDTO convertToCommentDTO(FeedComment comment) { commentDTO.setNickname(comment.getMember().getNickname()); commentDTO.setComment(comment.getContent()); commentDTO.setTime(comment.getCreatedAt().toString()); + commentDTO.setEmail(comment.getMember().getEmail()); return commentDTO; } @@ -148,10 +160,11 @@ private FeedCommentDTO convertToCommentDTO(FeedComment comment) { public FeedResponseDTO convertToDTO(Feed feed) { FeedResponseDTO dto = new FeedResponseDTO(); dto.setId(feed.getId()); - dto.setImg("http://localhost:8080/image/pictureDiary/"+SecurityUtil.getCurrentUserId()+"_"+feed.getDiaryDay()); // 이미지 URL이 엔티티에 없다면 필요에 따라 설정 + dto.setImg("https://i11b104.p.ssafy.io/image/pictureDiary/"+SecurityUtil.getCurrentUserId()+"_"+feed.getDiaryDay()); // 이미지 URL이 엔티티에 없다면 필요에 따라 설정 dto.setContent(feed.getContent()); dto.setAuthor(feed.getNickname()); dto.setLikeCnt(String.valueOf(feed.getLikeCount())); + dto.setCreatedAt(feed.getCreatedAt()); return dto; } diff --git a/feedme/src/main/java/com/todoslave/feedme/service/FriendService.java b/feedme/src/main/java/com/todoslave/feedme/service/FriendService.java index 33f46c8..f936bc3 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/FriendService.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/FriendService.java @@ -1,30 +1,33 @@ package com.todoslave.feedme.service; -import com.todoslave.feedme.DTO.FriendReqRequestDTO; +import com.todoslave.feedme.DTO.FriendInfoResponseDTO; +import com.todoslave.feedme.DTO.FriendRequestDTO; import com.todoslave.feedme.DTO.FriendReqResponseDTO; import com.todoslave.feedme.DTO.FriendResponseDTO; import com.todoslave.feedme.DTO.MemberChatListResponseDTO; import com.todoslave.feedme.DTO.PaginationRequestDTO; -import com.todoslave.feedme.domain.entity.communication.Friend; -import com.todoslave.feedme.domain.entity.communication.FriendRequest; -import com.todoslave.feedme.domain.entity.membership.Member; +import com.todoslave.feedme.domain.entity.communication.FriendRequest; +import java.io.IOException; import java.util.List; import org.springframework.data.domain.Slice; public interface FriendService { // 친구 추가 - void requestFriend(FriendReqRequestDTO friendReqRequestDTO); + void requestFriend(FriendRequestDTO friendRequestDTO) throws IOException; // 친구 삭제 - void deleteFriend(int friendId); + void deleteFriend(FriendRequestDTO friendRequestDTO); + + // 친구 정보 불러오기 + FriendInfoResponseDTO getFriendInfo(FriendRequestDTO friendRequestDTO); // 친구 목록 조회 List getFriends(); // 친구 요청 목록 조회 - Slice getRequestFriend(PaginationRequestDTO paginationRequestDTO); + List getRequestFriend(); // 친구 수락 MemberChatListResponseDTO insertFriendship(int requestId); diff --git a/feedme/src/main/java/com/todoslave/feedme/service/FriendServiceImpl.java b/feedme/src/main/java/com/todoslave/feedme/service/FriendServiceImpl.java index 5d57822..79d8408 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/FriendServiceImpl.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/FriendServiceImpl.java @@ -1,63 +1,131 @@ package com.todoslave.feedme.service; -import com.todoslave.feedme.DTO.FriendReqRequestDTO; +import com.todoslave.feedme.DTO.CreatureInfoResponseDTO; +import com.todoslave.feedme.DTO.FriendInfoResponseDTO; +import com.todoslave.feedme.DTO.FriendRequestDTO; import com.todoslave.feedme.DTO.FriendReqResponseDTO; import com.todoslave.feedme.DTO.FriendResponseDTO; import com.todoslave.feedme.DTO.MemberChatListResponseDTO; import com.todoslave.feedme.DTO.PaginationRequestDTO; +import com.todoslave.feedme.domain.entity.avatar.Creature; import com.todoslave.feedme.domain.entity.communication.Friend; import com.todoslave.feedme.domain.entity.communication.FriendRequest; import com.todoslave.feedme.domain.entity.membership.Member; import com.todoslave.feedme.login.util.SecurityUtil; import com.todoslave.feedme.mapper.FriendRequestMapper; -import com.todoslave.feedme.repository.FriendRepository; -import com.todoslave.feedme.repository.FriendRequestRepository; +import com.todoslave.feedme.repository.*; import jakarta.transaction.Transactional; +import java.io.IOException; import java.util.ArrayList; import lombok.RequiredArgsConstructor; import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; -@RequiredArgsConstructor @Service +@RequiredArgsConstructor public class FriendServiceImpl implements FriendService{ - @Autowired - MemberService memberService; - FriendRepository friendRepository; - FriendRequestRepository friendRequestRepository; - MemberChatService memberChatService; +// private final MemberChatService memberChatService; +// private final CreatureService creatureService; +// private final MemberRepository memberRepository; +// private final FriendRepository friendRepository; +// private final FriendRequestRepository friendRequestRepository; + + + + + //유틸 닉네임으로 찾기 + private Member findByNickname(String nickname) { + return memberRepository.findByNickname(nickname).orElse(null); + } + + @Autowired + MemberChatService memberChatService; + @Autowired + CreatureService creatureService; + @Autowired + MemberRepository memberRepository; + + @Autowired + AlarmService alarmService; + + @Autowired + FriendRepository friendRepository; + @Autowired + FriendRequestRepository friendRequestRepository; + + + private final FriendRequestMapper friendRequestMapper; + private final MemberChatRoomRepository memberChatRoomRepository; + private final MemberChatMessageRepository memberChatMessageRepository; // 친구 요청 @Override - public void requestFriend(FriendReqRequestDTO friendReqRequestDTO) { + public void requestFriend(FriendRequestDTO friendRequestDTO) throws IOException { Member member = SecurityUtil.getCurrentMember(); - Member counterpart = memberService.findByNickname(friendReqRequestDTO.getCounterpartNickname()); + Member counterpart = findByNickname(friendRequestDTO.getCounterpartNickname()); FriendRequest friendRequest = new FriendRequest(); - friendRequest.setMember(member); - friendRequest.setCounterpartId(counterpart); + friendRequest.setMember(counterpart); + friendRequest.setCounterpartId(member); - friendRequestRepository.save(friendRequest); + FriendRequest request = friendRequestRepository.save(friendRequest); + FriendReqResponseDTO friendReqResponseDTO = new FriendReqResponseDTO(); + friendReqResponseDTO.setId(request.getId()); + friendReqResponseDTO.setCounterpartNickname(request.getCounterpartId().getNickname()); + friendReqResponseDTO.setCreatureImg(generateCreatureImgPath(request.getCounterpartId())); + + alarmService.requestFriendship(friendReqResponseDTO, counterpart.getId()); } // 친구 삭제 @Override @Transactional - public void deleteFriend(int friendId) { + public void deleteFriend(FriendRequestDTO friendRequestDTO) { - friendRequestRepository.deleteById(friendId); + Member friend = memberRepository.findByNickname(friendRequestDTO.getCounterpartNickname()).orElseThrow(); + int memberId = SecurityUtil.getCurrentUserId(); + Friend friendId = friendRepository.findByMemberIdAndCounterpartId(memberId, friend.getId()); + friendRepository.deleteById(friendId.getId()); } + // 친구 정보 불러오기 + public FriendInfoResponseDTO getFriendInfo(FriendRequestDTO friendRequestDTO){ + + FriendInfoResponseDTO response = new FriendInfoResponseDTO(); + + Member member = findByNickname(friendRequestDTO.getCounterpartNickname()); + + response.setFriendId(member.getId()); + response.setNickname(member.getNickname()); + + List members = new ArrayList<>(); + + members.add(SecurityUtil.getCurrentUserId()); + members.add(member.getId()); + + response.setRoomId(memberChatRoomRepository.findByParticipantIdsContainingAll(members).getId()); + + CreatureInfoResponseDTO creatureInfoResponseDTO = creatureService.creatureInfo(member); + response.setCreatureNickname(creatureInfoResponseDTO.getName()); + response.setCreatureImg(creatureInfoResponseDTO.getImg()); + response.setLevel(creatureInfoResponseDTO.getLevel()); + response.setExp(creatureInfoResponseDTO.getExp()); + response.setJoin(creatureInfoResponseDTO.getDay()); + + return response; + } + // 친구 목록 불러오기 @Override public List getFriends() { @@ -73,6 +141,7 @@ public List getFriends() { FriendResponseDTO friendResponseDTO = new FriendResponseDTO(); friendResponseDTO.setFriendId(friend.getId()); friendResponseDTO.setCounterpartNickname(counterpart.getNickname()); +// friendResponseDTO.setCreatureimg(imageUtill.); friends.add(friendResponseDTO); } @@ -80,18 +149,38 @@ public List getFriends() { return friends; } + //크리쳐 이미지 주소 + private String generateCreatureImgPath(Member member) { + Creature creature = member.getCreature(); + int creatureLevel = creature.getLevel(); + int creatureId = creature.getId(); + return "https://i11b104.p.ssafy.io/image/creature/" + creatureId + "_" +creatureLevel; + } + + + // 친구 요청 불러오기 - @Override - public Slice getRequestFriend(PaginationRequestDTO paginationRequestDTO) { + public List getRequestFriend() { int memberId = SecurityUtil.getCurrentUserId(); - Pageable pageable = PageRequest.of(paginationRequestDTO.getSkip() / paginationRequestDTO.getLimit(), - paginationRequestDTO.getLimit()); + List friendRequests = friendRequestRepository.findAllByMemberId(memberId); + List friendResponses = new ArrayList<>(); - Slice friendRequests = friendRequestRepository.findAllByMemberId(memberId, pageable); + for(FriendRequest f : friendRequests){ + + FriendReqResponseDTO dto = new FriendReqResponseDTO(); + dto.setId(f.getId()); + dto.setCounterpartNickname(f.getCounterpartId().getNickname()); + String img = generateCreatureImgPath(f.getCounterpartId()); + dto.setCreatureImg(img); + + friendResponses.add(dto); + + } - return friendRequests.map(FriendRequestMapper::toDto); + // Mapper 인스턴스를 사용하여 변환 + return friendResponses; } // 친구 수락 @@ -103,7 +192,7 @@ public MemberChatListResponseDTO insertFriendship(int requestId) { Friend friend = new Friend(); Member member = SecurityUtil.getCurrentMember(); - Member counterpart = friendRequest.getCounterpartId(); + Member counterpart = friendRequest.getMember(); friend.setMember(member); friend.setCounterpart(counterpart); diff --git a/feedme/src/main/java/com/todoslave/feedme/service/MemberChatService.java b/feedme/src/main/java/com/todoslave/feedme/service/MemberChatService.java index b70692c..94f3fa8 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/MemberChatService.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/MemberChatService.java @@ -4,7 +4,6 @@ import com.todoslave.feedme.DTO.MemberChatMessageRequestDTO; import com.todoslave.feedme.DTO.MemberChatMessageResponseDTO; import com.todoslave.feedme.domain.entity.communication.MemberChatMessage; -import com.todoslave.feedme.domain.entity.communication.MemberChatRoom; import java.io.IOException; import java.util.List; import org.springframework.data.domain.Slice; @@ -20,10 +19,14 @@ public interface MemberChatService { public MemberChatListResponseDTO insertChatRoom(List members); // 채팅방 메세지 불러오기 - public Slice getChatMessage(String roomId, int page, int size); + public Slice getChatMessage(String roomId, int page, int size); // 채팅방 메세지 저장 - public MemberChatMessageResponseDTO insertChatMessage(String roomId, MemberChatMessageRequestDTO memberChatMessageRequestDTO) + public MemberChatMessageResponseDTO insertChatMessage(String roomId, MemberChatMessageRequestDTO message) throws IOException; -} \ No newline at end of file + void enterTheRoom(String roomId); + + void exitTheRoom(String roomId); + +} diff --git a/feedme/src/main/java/com/todoslave/feedme/service/MemberChatServiceImpl.java b/feedme/src/main/java/com/todoslave/feedme/service/MemberChatServiceImpl.java index 6be31d0..84013ff 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/MemberChatServiceImpl.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/MemberChatServiceImpl.java @@ -9,15 +9,20 @@ import com.todoslave.feedme.domain.entity.communication.MemberChatRoomChecked; import com.todoslave.feedme.domain.entity.membership.Member; import com.todoslave.feedme.login.util.SecurityUtil; +import com.todoslave.feedme.mapper.MessageMapper; import com.todoslave.feedme.repository.CreatureRepository; import com.todoslave.feedme.repository.MemberChatMessageRepository; import com.todoslave.feedme.repository.MemberChatRoomCheckedRepository; import com.todoslave.feedme.repository.MemberChatRoomRepository; import com.todoslave.feedme.repository.MemberRepository; +import jakarta.transaction.Transactional; import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; @@ -27,14 +32,25 @@ @RequiredArgsConstructor public class MemberChatServiceImpl implements MemberChatService{ + @Autowired private final MemberChatMessageRepository messageRepository; + @Autowired private final MemberChatRoomRepository roomRepository; + @Autowired private final MemberChatRoomCheckedRepository roomCheckedRepository; + @Autowired private final AlarmService alarmService; + @Autowired private final MemberRepository memberRepository; + @Autowired private final MemberChatRoomCheckedRepository memberChatRoomCheckedRepository; + @Autowired private final CreatureRepository creatureRepository; + private final MessageMapper messageMapper; + + Map rooms = new HashMap<>(); + // 채팅방 목록들 가져오기 @Override public List getChatRooms() { @@ -64,12 +80,13 @@ public List getChatRooms() { String nickname = memberRepository.findById(counterPartId).orElseThrow().getNickname(); chatResponse.setNickname(nickname); - Creature creature = creatureRepository.findByMemberId(counterPartId); - - chatResponse.setCreatureImage( - "http://localhost:8080/image/creature/"+creature.getMember().getId()+"_"+creature.getLevel()); +// Creature creature = creatureRepository.findByMemberId(counterPartId); +// +// chatResponse.setCreatureImage( +// "http://localhost:8080/image/creature/"+creature.getMember().getId()+"_"+creature.getLevel()); MemberChatRoomChecked checked = memberChatRoomCheckedRepository.findByMemberChatRoomIdAndMemberId(room.getId(),memberId); chatResponse.setIsChecked(checked.getIsChecked()); + chatListResponse.add(chatResponse); } @@ -83,17 +100,22 @@ public MemberChatListResponseDTO insertChatRoom(List members){ room.setParticipantIds(members); room = roomRepository.save(room); - MemberChatRoomChecked checked = new MemberChatRoomChecked(); - checked.setMemberId(members.get(0)); - checked.setIsChecked(1); - checked.setMemberChatRoomId(room.getId()); - roomCheckedRepository.save(checked); + MemberChatRoomChecked checked1 = new MemberChatRoomChecked(); + checked1.setMemberId(members.get(0)); + checked1.setIsChecked(1); + checked1.setMemberChatRoomId(room.getId()); + roomCheckedRepository.save(checked1); - checked.setMemberId(members.get(1)); - roomCheckedRepository.save(checked); + MemberChatRoomChecked checked2 = new MemberChatRoomChecked(); + checked2.setMemberId(members.get(1)); + checked2.setIsChecked(1); + checked2.setMemberChatRoomId(room.getId()); + roomCheckedRepository.save(checked2); Member countpart = null; + System.out.println("member 리스트 : "+members); + for(int m : members){ if(m!=SecurityUtil.getCurrentUserId()){ countpart = memberRepository.findById(m).orElseThrow(); @@ -106,29 +128,43 @@ public MemberChatListResponseDTO insertChatRoom(List members){ memberChatListResponseDTO.setId(room.getId()); memberChatListResponseDTO.setNickname(countpart.getNickname()); memberChatListResponseDTO.setCreatureImage( - "http://localhost:8080/image/creature/"+creature.getMember().getId()+"_"+creature.getLevel()); + "https://i11b104.p.ssafy.io/image/creature/image/creature/"+creature.getMember().getId()+"_"+creature.getLevel()); memberChatListResponseDTO.setIsChecked(1); return memberChatListResponseDTO; } // 채팅방 메세지 불러오기 - public Slice getChatMessage(String roomId, int skip, int limit){ + @Transactional + public Slice getChatMessage(String roomId, int skip, int limit) { + + if (roomRepository.findById(roomId).orElseThrow() == null) { + return null; + } System.out.println("receive message? service"); Pageable pageable = PageRequest.of(skip / limit, limit); Slice messages = messageRepository.findByMemberChatRoomIdOrderByTransmitAtDesc(roomId, pageable); - return messages; + int memberId = 1; + + System.out.println("memberId is : " + memberId); + System.out.println("Room Id is : " + roomId); + + MemberChatRoomChecked checked = memberChatRoomCheckedRepository.findByMemberChatRoomIdAndMemberId(roomId, memberId); + checked.setIsChecked(1); + + return messages.map(messageMapper::toDto); // MessageMapper 인스턴스를 사용하여 map 메서드 호출 } // 채팅방 메세지 저장 - public MemberChatMessageResponseDTO insertChatMessage(String roomId, MemberChatMessageRequestDTO memberChatMessageRequestDTO) + public MemberChatMessageResponseDTO insertChatMessage(String roomId, MemberChatMessageRequestDTO message) throws IOException { MemberChatMessage memberChatMessage = new MemberChatMessage(); - int memberId = SecurityUtil.getCurrentUserId(); + int memberId = message.getSendId(); + Member member = memberRepository.findById(memberId).orElseThrow(); MemberChatRoom memberChatRoom = roomRepository.findById(roomId).orElseThrow(); String counterpartNickname = null; @@ -142,29 +178,96 @@ public MemberChatMessageResponseDTO insertChatMessage(String roomId, MemberChatM } memberChatMessage.setMemberChatRoomId(roomId); - memberChatMessage.setContent(memberChatMessageRequestDTO.getMessage()); + memberChatMessage.setContent(message.getContent()); memberChatMessage.setSendId(memberId); + System.out.println("memberID is :"+memberId); // 메세지 저장 memberChatMessage = messageRepository.save(memberChatMessage); + int[] members = rooms.get(roomId); + + int connect = 0; + + for(int i=0; i<2; i++){ + if(members[i]==counterPartId){ + connect = 1; + break; + } + } + + if(connect==0){ + MemberChatRoomChecked checked = roomCheckedRepository.findByMemberChatRoomIdAndMemberId(roomId, counterPartId); + checked.setIsChecked(0); + } + MemberChatListResponseDTO memberChatListResponseDTO = new MemberChatListResponseDTO(); memberChatListResponseDTO.setId(roomId); memberChatListResponseDTO.setNickname(counterpartNickname); Creature creature = creatureRepository.findByMemberId(counterPartId); - memberChatListResponseDTO.setCreatureImage("http://localhost:8080/image/creature/"+creature.getMember().getId()+"_"+creature.getLevel()); + memberChatListResponseDTO.setCreatureImage("https://i11b104.p.ssafy.io/image/creature/image/creature/"+creature.getMember().getId()+"_"+creature.getLevel()); + + // 채팅방 갱신 (나) + alarmService.renewChattingRoom(memberChatListResponseDTO, memberId,1); + + memberChatListResponseDTO.setNickname(member.getNickname()); + creature = creatureRepository.findByMemberId(memberId); + + memberChatListResponseDTO.setCreatureImage("https://i11b104.p.ssafy.io/image/creature/image/creature/"+creature.getMember().getId()+"_"+creature.getLevel()); + + // 채팅방 갱신 (상대) + alarmService.renewChattingRoom(memberChatListResponseDTO, counterPartId, 0); - // 채팅방 갱신 - alarmService.renewChattingRoom(memberChatListResponseDTO); MemberChatMessageResponseDTO response = new MemberChatMessageResponseDTO(); response.setMessage(memberChatMessage.getContent()); response.setTransmitAt(memberChatMessage.getTransmitAt()); - response.setSendNickname(SecurityUtil.getCurrentMember().getNickname()); +// response.setSendNickname(SecurityUtil.getCurrentMember().getNickname()); return response; } -} + @Override + @Transactional + public void enterTheRoom(String roomId) { + + if(rooms.get(roomId)==null){ + int[] members = new int[2]; + members[0] = SecurityUtil.getCurrentUserId(); + rooms.put(roomId, members); + }else{ + int[] members = rooms.get(roomId); + for(int i=0; i<2; i++){ + if(members[i]==-1){ + members[i] = SecurityUtil.getCurrentUserId(); + break; + } + } + } + + MemberChatRoomChecked checked = roomCheckedRepository.findByMemberChatRoomIdAndMemberId(roomId, SecurityUtil.getCurrentUserId()); + checked.setIsChecked(1); + + System.out.println("enter the room : "+rooms.get(roomId)); + + } + + @Override + public void exitTheRoom(String roomId) { + + if(rooms.get(roomId)!=null) { + int[] members = rooms.get(roomId); + + for (int i = 0; i < 2; i++) { + if (members[i] == SecurityUtil.getCurrentUserId()) { + members[i] = -1; + break; + } + } + } + + } + +} \ No newline at end of file diff --git a/feedme/src/main/java/com/todoslave/feedme/service/MemberService.java b/feedme/src/main/java/com/todoslave/feedme/service/MemberService.java index 0ae5545..decbc3f 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/MemberService.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/MemberService.java @@ -8,13 +8,19 @@ import java.util.List; import java.util.Optional; -public interface MemberService { +// import java.util.stream.Collectors; + +//@Service +// @Transactional +// public class MemberService { + +// @Autowired +// MemberRepository memberRepository; +// @Autowired +// FriendService friendService; - // 회원 가입 - Member insertMember(Member member); - - // 회원 전체 조회 - List findMembers(); + +public interface MemberService { // 아이디로 회원 찾기 Member findById(int userId); @@ -25,9 +31,6 @@ public interface MemberService { // 닉네임으로 회원 찾기 Member findByNickname(String nickname); - // 이메일 인증 여부 확인 - boolean authenticate(String email); - // 회원 가입 처리 Member registerMember(MemberSignupRequestDTO memberSignupRequestDTO); diff --git a/feedme/src/main/java/com/todoslave/feedme/service/MemberServiceImpl.java b/feedme/src/main/java/com/todoslave/feedme/service/MemberServiceImpl.java index 60438f0..c0cc37c 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/MemberServiceImpl.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/MemberServiceImpl.java @@ -4,8 +4,11 @@ import com.todoslave.feedme.DTO.MemberSignupRequestDTO; import com.todoslave.feedme.DTO.MypageResponseDTO; import com.todoslave.feedme.domain.entity.avatar.Creature; +import com.todoslave.feedme.domain.entity.communication.FriendRequest; import com.todoslave.feedme.domain.entity.membership.Member; import com.todoslave.feedme.login.util.SecurityUtil; +import com.todoslave.feedme.repository.FriendRepository; +import com.todoslave.feedme.repository.FriendRequestRepository; import com.todoslave.feedme.repository.MemberRepository; import lombok.RequiredArgsConstructor; @@ -15,6 +18,7 @@ import java.sql.Timestamp; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.Period; import java.time.ZoneId; import java.util.ArrayList; @@ -26,21 +30,11 @@ @RequiredArgsConstructor public class MemberServiceImpl implements MemberService { - @Autowired private final MemberRepository memberRepository; - @Autowired - private final FriendService friendService; + private final FriendRepository friendRepository; - @Override - public Member insertMember(Member member) { - return memberRepository.save(member); - } - - @Override - public List findMembers() { - return memberRepository.findAll(); - } + private final FriendRequestRepository friendRequestRepository; @Override public Member findById(int userId) { @@ -58,10 +52,6 @@ public Member findByNickname(String nickname) { return memberRepository.findByNickname(nickname).orElse(null); } - @Override - public boolean authenticate(String email) { - return memberRepository.findByEmail(email).isPresent(); - } @Override public Member registerMember(MemberSignupRequestDTO memberSignupRequestDTO) { @@ -99,8 +89,18 @@ public boolean removeMember() { return true; } - @Override + + + + // 친구 인지 확인하기!!! + public boolean isFriend(int memberId, int friendId) { + return friendRepository.existsByMemberIdAndCounterpartId(memberId, friendId) || + friendRepository.existsByCounterpartIdAndMemberId(friendId, memberId); + } + + @Override //맴버 리스트 검색 가져오기 public List getMemberList(String searchvalue) { + List members = memberRepository.findByNicknameContaining(searchvalue); List memberSearchResponse = new ArrayList<>(); @@ -118,12 +118,17 @@ public List getMemberList(String searchvalue) { continue; } - if (friendService.isFriend(member.getId(), SecurityUtil.getCurrentUserId())) { + + if (isFriend(member.getId(), SecurityUtil.getCurrentUserId())) { mem.setFriend(true); } else { mem.setFriend(false); } + // 친구 신청을 보냈는지 체크 + Optional friendRequest = friendRequestRepository.findByMember_IdAndCounterpartId_Id(member.getId(),SecurityUtil.getCurrentUserId()); + mem.setRequested(friendRequest.isPresent()); + memberSearchResponse.add(mem); } @@ -145,13 +150,12 @@ public MypageResponseDTO getMyPage() { myPage.setNickname(member.getNickname()); myPage.setEmail(member.getEmail()); - Timestamp birthdayTimestamp = member.getBirthday(); - LocalDate birthdayLocalDate = birthdayTimestamp.toInstant() - .atZone(ZoneId.systemDefault()) - .toLocalDate(); - myPage.setBrithday(birthdayLocalDate); + LocalDate birthdayTimestamp = member.getBirthday(); + + myPage.setBrithday(birthdayTimestamp); + myPage.setSendId(member.getId()); myPage.setCreatureId(creature.getId()); myPage.setCreatureName(creature.getCreatureName()); myPage.setExp(creature.getExp()); @@ -171,210 +175,6 @@ private String generateCreatureImgPath(Member member) { Creature creature = member.getCreature(); int creatureLevel = creature.getLevel(); int creatureId = creature.getId(); - return "http://localhost:8080/image/creature/" + creatureId + "_" + creatureLevel; + return "https://i11b104.p.ssafy.io/image/creature/" + creatureId + "_" + creatureLevel; } } - - - -//impl 없을 때 -//package com.todoslave.feedme.service; - -// -//import com.todoslave.feedme.DTO.MemberSearchResponseDTO; -//import com.todoslave.feedme.DTO.MemberSignupRequestDTO; -//import com.todoslave.feedme.DTO.MypageResponseDTO; -//import com.todoslave.feedme.domain.entity.avatar.Creature; -//import com.todoslave.feedme.domain.entity.membership.Emotion; -//import com.todoslave.feedme.domain.entity.membership.Member; -//import com.todoslave.feedme.login.util.SecurityUtil; -//import com.todoslave.feedme.repository.MemberRepository; -// -//import lombok.RequiredArgsConstructor; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.stereotype.Service; -//import org.springframework.transaction.annotation.Transactional; -// -//import java.sql.Timestamp; -//import java.time.LocalDate; -//import java.time.Period; -//import java.time.ZoneId; -//import java.util.ArrayList; -//import java.util.List; -//import java.util.Optional; -//import java.util.stream.Collectors; -// -//@Service -//@Transactional -////@Transactional(readOnly = true) //조회에선 -//@RequiredArgsConstructor // 생성자 만들어 주는 얘 -//public class MemberService { -// -// @Autowired -// MemberRepository memberRepository; -// -// @Autowired -// FriendService friendService; -// -// -// //그냥 가입 시켜주는 얘 -// public Member insertMember (Member member) { -// return memberRepository.save(member); -// } -// -// // 회원 전체 조회 -// public List findMembers() { -// return memberRepository.findAll(); -// } -// -// //아이디로 맴버 찾기 -// public Member findById(int userId) { -// return memberRepository.findById(userId) -// .orElseThrow(() -> new RuntimeException("Member not found by id: " + userId)); -// } -// -// //이메일로 찾기 -// public Optional findByEmail(String email) { -// return memberRepository.findByEmail(email); -// } -// -// // 닉네임으로 맴버 찾기 -// public Member findByNickname(String Nickname) { -// return memberRepository.findByNickname(Nickname).orElse(null); -// } -// -// public boolean authenticate(String email) { -// return memberRepository.findByEmail(email).isPresent(); -// } -// -// //회원가입 -// public Member registerMember(MemberSignupRequestDTO memberSignupRequestDTO) { -//// memberRepository.findByEmail(memberSignup.getEmail()).orElseThrow(() -> new RuntimeException("Member not found by email: " + memberSignup.getEmail())); -// -// Member member = new Member(); -// member.setEmail(memberSignupRequestDTO.getEmail()); -// member.setBirthday(memberSignupRequestDTO.getBirthday()); -// member.setNickname(memberSignupRequestDTO.getNickname()); -// member.setUserRole(memberSignupRequestDTO.getUserRole()); -// -// memberRepository.save(member); -// return member; -// } -// -// //맴버 정보 수정 -// public Member updateMember(MemberSignupRequestDTO memberSignupRequestDTO) { -// int id = SecurityUtil.getCurrentUserId(); -// -// Member member = memberRepository.findById(id) -// .orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다.")); -// -// member.setNickname(memberSignupRequestDTO.getNickname()); -// member.setBirthday(memberSignupRequestDTO.getBirthday()); -// member.setUserRole(memberSignupRequestDTO.getUserRole()); -// -// return memberRepository.save(member); -// } -// -// //탈퇴 -// public boolean removeMember() { -// Member member = SecurityUtil.getCurrentMember(); -// -// if (member == null) { -// return false; -// } -// memberRepository.delete(member); -// return true; -// } -// -// //닉네임에 맞는 친구 데려오기 -// public List getMemberList(String searchvalue) { -// -// List members = memberRepository.findByNicknameContaining(searchvalue); -// List memberSearchResponse = new ArrayList<>(); -// -// for (Member member : members) { -// -// MemberSearchResponseDTO mem = new MemberSearchResponseDTO(); -// mem.setNickname(member.getNickname()); -// -// // 크리쳐 존재 여부를 확인 -// if (member.getCreature() != null) { -// mem.setCreatureImg(generateCreatureImgPath(member)); -// } else { -// // 크리쳐가 없는 경우 수행할 다른 액션 -// mem.setCreatureImg("알 이미지"); -// } -// -// if(member.getId() == SecurityUtil.getCurrentUserId()) { -// continue; -// } -// -// if(friendService.isFriend(member.getId(), SecurityUtil.getCurrentUserId())) { -// mem.setFriend(true); -// } else { -// mem.setFriend(false); -// } -// -// memberSearchResponse.add(mem); -// } -// -// return memberSearchResponse; -// } -// -// -// //닉네임 중복 체크 -// public boolean checkNickname(String nickname) { -// -// return memberRepository.findByNickname(nickname).isPresent(); -// -// } -// -// //크리쳐 저장 장소 -// private String generateCreatureImgPath(Member member) { -// Creature creature = member.getCreature(); -// int creatureLevel = creature.getLevel(); -// int creatureId = creature.getId(); -// return "http://localhost:8080/image/creature/" + creatureId + "_" +creatureLevel; -// } -// -// //마이 페이지 불러오기 -// public MypageResponseDTO getMyPage() { -// Member member = SecurityUtil.getCurrentMember(); -// Creature creature = member.getCreature(); -// -// MypageResponseDTO myPage = new MypageResponseDTO(); -// -// myPage.setNickname(member.getNickname()); -// myPage.setEmail(member.getEmail()); -// -// -// //생일 바꾸기 -// Timestamp birthdayTimestamp = member.getBirthday(); -// -// // Timestamp를 LocalDate로 변환 -// LocalDate birthdayLocalDate = birthdayTimestamp.toInstant() -// .atZone(ZoneId.systemDefault()) -// .toLocalDate(); -// -// // 변환된 LocalDate를 myPage에 설정 -// myPage.setBrithday(birthdayLocalDate); -// -// myPage.setCreatureId(creature.getId()); -// myPage.setCreatureName(creature.getCreatureName()); -// myPage.setExp(creature.getExp()); -// myPage.setLevel(creature.getLevel()); -// myPage.setImage(generateCreatureImgPath(member)); -// -// -// LocalDate currentDate = LocalDate.now(); -// // 가입 날짜 가져오기 (Timestamp를 LocalDate로 변환) -// LocalDate joinDate = member.getJoinDate().toLocalDate(); -// // 가입한 날로부터 며칠째인지 계산 -// int daysSinceJoin = Period.between(joinDate, currentDate).getDays(); -// -// myPage.setTogetherDay(daysSinceJoin); -// -// return myPage; -// } -// -//} diff --git a/feedme/src/main/java/com/todoslave/feedme/service/TodoCategoryServiceImpl.java b/feedme/src/main/java/com/todoslave/feedme/service/TodoCategoryServiceImpl.java index 90fd8c8..604afbd 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/TodoCategoryServiceImpl.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/TodoCategoryServiceImpl.java @@ -11,14 +11,18 @@ import java.util.ArrayList; import java.util.List; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class TodoCategoryServiceImpl implements TodoCategoryService { - private final TodoCategoryRepository todoCategoryRepository; - private final MemberRepository memberRepository; + @Autowired + private TodoCategoryRepository todoCategoryRepository; + @Autowired + private MemberRepository memberRepository; + // 카테고리들 가져오기 @Override @@ -68,10 +72,17 @@ public void deleteCategory(int id) { @Override public TodoCategoryResponseDTO insertCategory(String name) { + if(name==null){ + System.out.println("null인데용?"); + } + Member member = SecurityUtil.getCurrentMember(); TodoCategory todoCategory = new TodoCategory(); + System.out.println(" - -- 출력되나?"+name); + System.out.println("- - - 출력되ㅣ시나요>"+member); + todoCategory.setName(name); todoCategory.setMember(member); todoCategory = todoCategoryRepository.save(todoCategory); diff --git a/feedme/src/main/java/com/todoslave/feedme/service/TodoServiceImpl.java b/feedme/src/main/java/com/todoslave/feedme/service/TodoServiceImpl.java index 4d9e896..9295a33 100644 --- a/feedme/src/main/java/com/todoslave/feedme/service/TodoServiceImpl.java +++ b/feedme/src/main/java/com/todoslave/feedme/service/TodoServiceImpl.java @@ -10,6 +10,8 @@ import com.todoslave.feedme.domain.entity.task.CreatureTodo; import com.todoslave.feedme.domain.entity.task.DayOff; import com.todoslave.feedme.domain.entity.task.Todo; +import com.todoslave.feedme.gpt.dto.ChatGPTRequest; +import com.todoslave.feedme.gpt.dto.ChatGPTResponse; import com.todoslave.feedme.login.util.SecurityUtil; import com.todoslave.feedme.repository.CreatureTodoReposito; import com.todoslave.feedme.repository.TodoCategoryRepository; @@ -20,17 +22,27 @@ import java.util.ArrayList; import java.util.List; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; @RequiredArgsConstructor @Service public class TodoServiceImpl implements TodoService { + @Autowired private final TodoRepository todoRepository; + @Autowired private final TodoCategoryRepository todoCategoryRepository; + @Autowired private final CreatureTodoReposito creatureTodoReposito; + @Autowired private final DayOffService dayOffService; - private final CreatureService creatureService; + @Autowired + private final CreatureService creatureService; + @Autowired + private RestTemplate template; // 할일 목록에서 일정(일) 불러오기 @Override @@ -100,6 +112,8 @@ public List getTodoMainDaily() { LocalDate date = LocalDate.now(); + System.out.println("date : "+date); + int memberId = SecurityUtil.getCurrentUserId(); List query = todoRepository.findAllByMemberIdAndCreatedAtIsCompleted(memberId, date, 0); @@ -130,13 +144,15 @@ public List getTodoCalendarCompleted(TodoRequestDTO tod YearMonth yearMonth = YearMonth.of(year, month); LocalDate firstDay = yearMonth.atDay(1); LocalDate lastDay = yearMonth.atEndOfMonth(); - + //리스트 만들고 List todoCounts = new ArrayList<>(); + //1~31일까지 쭉 불러와 for (LocalDate date = firstDay; !date.isAfter(lastDay); date = date.plusDays(1)) { TodoCalendarResponseDTO todoCalendarResponseDTO = new TodoCalendarResponseDTO(); + //안한거 갯수 더라기 long inCompleted = todoRepository.countTodoByDateAndIsCompleted(date, 0)+creatureTodoReposito.countByCreatedAtAndIsCompleted(date,0); todoCalendarResponseDTO.setInCompleted((int)inCompleted); @@ -223,37 +239,116 @@ public TodoResponseDTO completeTodo(int todoId) { @Override public boolean AllcompleteTodo(TodoRequestDTO todoRequestDTO) { LocalDate date = todoRequestDTO.getDate(); - System.out.println("일"); //만약에 완료를 이미 했다면 if(!dayOffService.isActionAllowed(SecurityUtil.getCurrentUserId(),date)){ return false; } - System.out.println("이"); //완료처리 DayOff dayOff = new DayOff(); dayOff.setEndDay(date); dayOff.setMember(SecurityUtil.getCurrentMember()); dayOffService.saveDayOff(dayOff); - System.out.println("삼"); + //일정 끝내기 List todoList = todoRepository.findByMemberIdAndCreatedAt(SecurityUtil.getCurrentUserId(),date); //크리쳐 일정 끝내기 List creatureTodoList = creatureTodoReposito.findByMemberIdAndCreatedAt(SecurityUtil.getCurrentUserId(),date); - //일기 써달라고 하기 - // AI 요청!!!!!!!!!!!!!!!!!!!!! + // StringBuilder로 문자열 누적 + StringBuilder todoAllBuilder = new StringBuilder(); + int completedTodos = 0; + int completedCreatureTodos = 0; + for (Todo todo : todoList) { + if (todo.getIsCompleted() == 1) { + todoAllBuilder.append(todo.getTodoCategory().getName()).append(" - ").append(todo.getContent()).append("\n"); + completedTodos++; + } + } - int completedTodos = (int) todoList.stream().filter(todo -> todo.getIsCompleted() == 1).count(); - int completedCreatureTodos = (int) creatureTodoList.stream().filter(creatureTodo -> creatureTodo.getIsCompleted() == 1).count(); + for (CreatureTodo creatureTodo : creatureTodoList) { + if (creatureTodo.getIsCompleted() == 1) { + todoAllBuilder.append(creatureTodo.getContent()).append("\n"); + completedCreatureTodos++; + } + } + + // todoAll을 String으로 변환 + String todoAll = todoAllBuilder.toString(); + + String generatedDiaryEntry = generateDiaryEntry(todoAll);// 여기서 AI가 했던일을 일기로 만들어줌 + +// System.out.println(todoAll); + System.out.println("이거야"); + System.out.println(generatedDiaryEntry); +// +// +// //요청할때 날자랑 내 id 줘야함 +// // AI 요청!!!!!!!!!!!!!!!!!!!!! +// +// +//// int completedTodos = (int) todoList.stream().filter(todo -> todo.getIsCompleted() == 1).count(); +//// int completedCreatureTodos = (int) creatureTodoList.stream().filter(creatureTodo -> creatureTodo.getIsCompleted() == 1).count(); +// +// System.out.println(completedTodos+completedCreatureTodos); //경험치 올리기 creatureService.expUp(completedTodos+completedCreatureTodos); + //예본 해 return true; } + + + // GPT API 호출을 통해 일기를 생성하는 메서드 + @Value("${openai.api.url}") + private String apiURL; + + private String generateDiaryEntry(String todoAll) { + String prompt = "다음 항목들을 바탕으로 한글로 일기를 작성해주세요. 150자 이내로 없는 얘기를 꾸며쓰지는말고, 자연스럽게 요약해 주세요:\n" + todoAll; + + // GPT API 호출 + ChatGPTRequest request = new ChatGPTRequest("gpt-3.5-turbo", prompt); + ChatGPTResponse response = template.postForObject(apiURL, request, ChatGPTResponse.class); + + // 응답 처리 + if (response != null && !response.getChoices().isEmpty()) { + String diaryEntry = response.getChoices().get(0).getMessage().getContent(); + + // 줄바꿈 제거 + diaryEntry = diaryEntry.replaceAll("\n+", " ").replaceAll("\\s+", " ").trim(); + + // 150자 이내로 요약 + if (diaryEntry.length() > 150) { + diaryEntry = truncateToNearestSentence(diaryEntry, 150); + } + + return diaryEntry; + } + + // 기본 응답 또는 오류 처리 + return "일기 작성에 실패했습니다."; + } + + //만약에 150자가 넘어간다면 + private String truncateToNearestSentence(String text, int maxLength) { + if (text.length() <= maxLength) { + return text; + } + + // 최대 길이에서 가장 가까운 문장의 끝 (마침표)을 찾습니다. + int end = text.lastIndexOf(". ", maxLength); + if (end == -1) { + // 문장이 없으면 최대 길이에서 잘라냅니다. + return text.substring(0, maxLength).trim(); + } + + // 문장이 있으면 해당 문장까지만 반환합니다. + return text.substring(0, end + 1).trim(); + } + } diff --git a/feedme/src/main/java/com/todoslave/feedme/util/StatusCode.java b/feedme/src/main/java/com/todoslave/feedme/util/StatusCode.java new file mode 100644 index 0000000..f4859ee --- /dev/null +++ b/feedme/src/main/java/com/todoslave/feedme/util/StatusCode.java @@ -0,0 +1,7 @@ +package com.todoslave.feedme.util; + +public class StatusCode { + + + +} diff --git a/feedme/src/main/resources/application.properties b/feedme/src/main/resources/application.properties deleted file mode 100644 index bb2ad29..0000000 --- a/feedme/src/main/resources/application.properties +++ /dev/null @@ -1,27 +0,0 @@ -spring.application.name=feedme -spring.main.application-class=com.todoslave.FeedmeApplication - -# MySQL ?? -spring.datasource.url=jdbc:mysql://localhost:3306/feedme -spring.datasource.username=ssafy -spring.datasource.password=ssafy -spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver - -# MongoDB ?? -spring.data.mongodb.host=localhost -spring.data.mongodb.port=27017 -spring.data.mongodb.database=feedme -spring.data.mongodb.uri=mongodb://localhost:27017/feedme - -spring.jpa.hibernate.ddl-auto=update -spring.jpa.show-sql=true -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect -spring.jpa.properties.hibernate.format_sql=true - -logging.level.org.hibernate.SQL=debug -logging.level.org.hibernate.type=trace -# Hibernate? ??? SQL? ???? ??? ?? ??? ?????. - -spring.jackson.time-zone=Asia/Seoul - - diff --git a/feedme/src/main/resources/application.yml b/feedme/src/main/resources/application.yml index 0d56398..d0b9d4e 100644 --- a/feedme/src/main/resources/application.yml +++ b/feedme/src/main/resources/application.yml @@ -1,3 +1,97 @@ +#spring: +# application: +# name: feedme +# admin: +# enabled: false # Spring Boot Admin 비활성화 +# jmx: +# enabled: false # JMX 비활성화 +# main: +# application-class: com.todoslave.FeedmeApplication +# +# security: +# oauth2: +# client: +# registration: +# naver: +# client-id: ${NAVER_CLIENT_ID} +# client-secret: ${NAVER_CLIENT_SECRET} +# client-name: Naver +# redirect-uri: http://localhost:8080/login/oauth2/code/naver +# authorization-grant-type: authorization_code +# scope: +# - name +# - email +# kakao: +# client-id: ${KAKAO_CLIENT_ID} +# client-secret: ${KAKAO_CLIENT_SECRET} +# client-name: Kakao +# client-authentication-method: client_secret_post +# redirect-uri: http://localhost:8080/login/oauth2/code/kakao +# authorization-grant-type: authorization_code +# scope: +# - profile_nickname +# - account_email +# provider: +# naver: +# authorization-uri: https://nid.naver.com/oauth2.0/authorize +# token-uri: https://nid.naver.com/oauth2.0/token +# user-info-uri: https://openapi.naver.com/v1/nid/me +# user-name-attribute: response +# kakao: +# authorizationUri: https://kauth.kakao.com/oauth/authorize +# tokenUri: https://kauth.kakao.com/oauth/token +# userInfoUri: https://kapi.kakao.com/v2/user/me +# userNameAttribute: id +# +# datasource: +# url: jdbc:mysql://localhost:3306/feedme +# username: ${DB_USERNAME} +# password: ${DB_PASSWORD} +# driver-class-name: com.mysql.cj.jdbc.Driver +# +# data: +# mongodb: +# host: localhost +# port: 27017 +# database: feedme +# uri: mongodb://localhost:27017/feedme +# +# jpa: +# hibernate: +# ddl-auto: update +# show-sql: true +# properties: +# hibernate: +# dialect: org.hibernate.dialect.MySQL8Dialect +# format_sql: true +# +#logging: +# level: +# org: +# hibernate: +# SQL: debug +# type: trace +# +#redis: +# host: localhost +# port: 6379 +# +#jwt: +# issuer: todoslave@ssafy.com +# secret_key: ${JWT_SECRET_KEY} +# +# +# #이건 살림 +#openai: +# model: "gpt-3.5-turbo" +# api: +# key: ${GPT_SECRET_KEY} +# url: "https://api.openai.com/v1/chat/completions" + + + + + spring: application: name: feedme @@ -7,7 +101,7 @@ spring: enabled: false # JMX 비활성화 main: application-class: com.todoslave.FeedmeApplication - + allow-circular-references: true #뺄지도? security: oauth2: client: @@ -16,7 +110,7 @@ spring: client-id: ${NAVER_CLIENT_ID} client-secret: ${NAVER_CLIENT_SECRET} client-name: Naver - redirect-uri: http://localhost:8080/login/oauth2/code/naver + redirect-uri: https://i11b104.p.ssafy.io/api/login/oauth2/code/naver authorization-grant-type: authorization_code scope: - name @@ -26,7 +120,7 @@ spring: client-secret: ${KAKAO_CLIENT_SECRET} client-name: Kakao client-authentication-method: client_secret_post - redirect-uri: http://localhost:8080/login/oauth2/code/kakao + redirect-uri: https://i11b104.p.ssafy.io/api/login/oauth2/code/kakao authorization-grant-type: authorization_code scope: - profile_nickname @@ -44,17 +138,22 @@ spring: userNameAttribute: id datasource: - url: jdbc:mysql://localhost:3306/feedme + url: jdbc:mysql://mysql:3306/feedme # MySQL 컨테이너 이름 사용 username: ${DB_USERNAME} password: ${DB_PASSWORD} driver-class-name: com.mysql.cj.jdbc.Driver data: mongodb: - host: localhost + host: mongodb # MongoDB 컨테이너 이름 사용 port: 27017 database: feedme - uri: mongodb://localhost:27017/feedme + uri: mongodb://mongodb:27017/feedme + + redis: + host: redis + port: 6379 + jpa: hibernate: @@ -72,90 +171,15 @@ logging: SQL: debug type: trace -redis: - host: localhost - port: 6379 - jwt: issuer: todoslave@ssafy.com secret_key: ${JWT_SECRET_KEY} +openai: + model: "gpt-3.5-turbo" + api: + key: ${GPT_SECRET_KEY} + url: "https://api.openai.com/v1/chat/completions" -#spring: -# application: -# name: feedme -# main: -# application-class: com.todoslave.FeedmeApplication -# -# security: -# oauth2: -# client: -# registration: -# naver: -# client-id: QdiZgbrsCQdA7Zw1pJNN -# client-secret: iGL_mF23OA -# client-name: Naver -# redirect-uri: http://localhost:8080/login/oauth2/code/naver -# authorization-grant-type: authorization_code -# scope: -# - name -# - email -# kakao: -# client-id: e76f1a4a0c79727d85cd6b3b1969c892 -# client-secret: 69gLvDJgSBZs87Wlus2nXNKHltx0pEYg -# client-name: Kakao -# client-authentication-method: client_secret_post -# redirect-uri: http://localhost:8080/login/oauth2/code/Kakao -# authorization-grant-type: authorization_code -# scope: -# - profile_nickname -# - account_email -# provider: -# naver: -# authorization-uri: https://nid.naver.com/oauth2.0/authorize -# token-uri: https://nid.naver.com/oauth2.0/token -# user-info-uri: https://openapi.naver.com/v1/nid/me -# user-name-attribute: response -# kakao: -# authorizationUri: https://kauth.kakao.com/oauth/authorize -# tokenUri: https://kauth.kakao.com/oauth/token -# userInfoUri: https://kapi.kakao.com/v2/user/me -# userNameAttribute: id -# -# datasource: -# url: jdbc:mysql://localhost:3306/feedme -# username: ssafy -# password: ssafy -# driver-class-name: com.mysql.cj.jdbc.Driver -# -# data: -# mongodb: -# host: localhost -# port: 27017 -# database: feedme -# uri: mongodb://localhost:27017/feedme -# -# jpa: -# hibernate: -# ddl-auto: update -# show-sql: true -# properties: -# hibernate: -# dialect: org.hibernate.dialect.MySQL8Dialect -# format_sql: true -# -#logging: -# level: -# org: -# hibernate: -# SQL: debug -# type: trace -# -#redis: -# host: localhost -# port: 6379 -# -#jwt: -# issuer: todoslave@ssafy.com -# secret_key: SMidolHJFillsogoodteamjangJGnamunifristloverichHSJUSTMANBON -# +server: + port: 8085