diff --git a/gradlew b/gradlew old mode 100755 new mode 100644 diff --git a/gradlew.bat b/gradlew.bat index 7101f8e4..25da30db 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,92 +1,92 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/main/java/space/space_spring/controller/PostController.java b/src/main/java/space/space_spring/controller/PostController.java new file mode 100644 index 00000000..4d6e85e7 --- /dev/null +++ b/src/main/java/space/space_spring/controller/PostController.java @@ -0,0 +1,35 @@ +package space.space_spring.controller; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import space.space_spring.argument_resolver.jwtLogin.JwtLoginAuth; +import space.space_spring.dto.post.ReadPostsResponse; +import space.space_spring.entity.UserSpace; +import space.space_spring.response.BaseResponse; +import space.space_spring.service.PostService; +import space.space_spring.util.userSpace.UserSpaceUtils; + +import java.util.List; +import java.util.Optional; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/space/{spaceId}") +@Slf4j +public class PostController { + private final PostService postService; + private final UserSpaceUtils userSpaceUtils; + + @GetMapping("/board") + public BaseResponse> getBoard( + @JwtLoginAuth Long userId, + @PathVariable Long spaceId, + @RequestParam(defaultValue = "all") String filter) { + Optional userInSpace = userSpaceUtils.isUserInSpace(userId, spaceId); + log.info("UserName = {}, UserSpaceAuth = {}", userInSpace.get().getUserName(), userInSpace.get().getUserSpaceAuth()); + List board = postService.getAllPosts(spaceId, filter); + return new BaseResponse<>(board); + } + +} diff --git a/src/main/java/space/space_spring/dao/PostDao.java b/src/main/java/space/space_spring/dao/PostDao.java new file mode 100644 index 00000000..8c1e6bc8 --- /dev/null +++ b/src/main/java/space/space_spring/dao/PostDao.java @@ -0,0 +1,17 @@ +package space.space_spring.dao; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import space.space_spring.entity.Post; +import space.space_spring.entity.Space; + +import java.util.List; + +@Repository +public interface PostDao extends JpaRepository { + + List findBySpace(Space space); + + List findBySpaceAndType(Space space, String type); + +} diff --git a/src/main/java/space/space_spring/dto/post/ReadPostsResponse.java b/src/main/java/space/space_spring/dto/post/ReadPostsResponse.java new file mode 100644 index 00000000..1d5e77ea --- /dev/null +++ b/src/main/java/space/space_spring/dto/post/ReadPostsResponse.java @@ -0,0 +1,60 @@ +package space.space_spring.dto.post; + +import lombok.*; +import space.space_spring.entity.Post; +import space.space_spring.entity.PostImage; +import space.space_spring.entity.UserSpace; +import space.space_spring.util.post.ConvertCreatedDate; + +import java.util.List; + +@Builder +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ReadPostsResponse { + + // 스페이스 관련 + private Long spaceId; + + // 유저 관련 + private Long userId; + private String userProfileImg; + private String userName; + + // 게시글 관련 + private Long postId; + private String title; + private String content; + private List postImage; + private String time; + private String type; + private int post_count; + + // 댓글 및 좋아요 + private int comment_count; + private int like_count; + + public static ReadPostsResponse of(Post post, int postCount, UserSpace userSpace) { + List postImageUrls = post.getPostImages().stream() + .map(PostImage::getPostImgUrl) + .toList(); + + return ReadPostsResponse.builder() + .postId(post.getPostId()) + .spaceId(post.getSpace().getSpaceId()) + .userId(post.getUser().getUserId()) + .userProfileImg(userSpace != null ? userSpace.getUserProfileImg() : null) + .userName(userSpace != null ? userSpace.getUserName() : null) + .title(post.getTitle()) + .content(post.getContent()) + .time(ConvertCreatedDate.setCreatedDate(post.getCreatedAt())) + .type(post.getType()) + .post_count(postCount) + .comment_count(post.getPostComments().size()) + .like_count(post.getLike()) + .postImage(postImageUrls) + .build(); + } +} diff --git a/src/main/java/space/space_spring/entity/BaseEntity.java b/src/main/java/space/space_spring/entity/BaseEntity.java index 4b035dd0..c1130aec 100644 --- a/src/main/java/space/space_spring/entity/BaseEntity.java +++ b/src/main/java/space/space_spring/entity/BaseEntity.java @@ -1,9 +1,11 @@ package space.space_spring.entity; import jakarta.persistence.*; +import lombok.Getter; import java.time.LocalDateTime; +@Getter @MappedSuperclass public abstract class BaseEntity { diff --git a/src/main/java/space/space_spring/entity/Post.java b/src/main/java/space/space_spring/entity/Post.java new file mode 100644 index 00000000..78d0aa90 --- /dev/null +++ b/src/main/java/space/space_spring/entity/Post.java @@ -0,0 +1,42 @@ +package space.space_spring.entity; + +import jakarta.persistence.*; +import lombok.Getter; + +import java.util.List; + +@Entity +@Table(name = "Posts") +@Getter +public class Post extends BaseEntity { + @Id @GeneratedValue + @Column(name = "post_id") + private Long postId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "space_id") + private Space space; + + @Column(name = "title") + private String title; + + @Column(name = "post_content") + private String content; + + @Column(name = "type") + private String type; + + @Column(name = "post_like") + private int like; + + @OneToMany(mappedBy = "post") + private List postImages; + + @OneToMany(mappedBy = "post") + private List postComments; + +} diff --git a/src/main/java/space/space_spring/entity/PostComment.java b/src/main/java/space/space_spring/entity/PostComment.java new file mode 100644 index 00000000..20d9f00f --- /dev/null +++ b/src/main/java/space/space_spring/entity/PostComment.java @@ -0,0 +1,34 @@ +package space.space_spring.entity; + +import jakarta.persistence.*; +import lombok.Getter; + +@Entity +@Table(name = "Post_Comment") +@Getter +public class PostComment extends BaseEntity{ + @Id + @GeneratedValue + @Column(name = "comment_id") + private Long commentId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "space_post_id") + private Post post; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @Column(name = "comment_content") + private String content; + + @Column(name = "comment_like") + private int like; + + @Column(name = "isReply") + private boolean isReply; + + @Column(name = "comment_target_id") + private String targetId; +} diff --git a/src/main/java/space/space_spring/entity/PostImage.java b/src/main/java/space/space_spring/entity/PostImage.java new file mode 100644 index 00000000..9a56aef2 --- /dev/null +++ b/src/main/java/space/space_spring/entity/PostImage.java @@ -0,0 +1,22 @@ +package space.space_spring.entity; + +import jakarta.persistence.*; +import lombok.Getter; + +@Entity +@Table(name = "Post_Image") +@Getter +public class PostImage extends BaseEntity{ + @Id + @GeneratedValue + @Column(name = "post_image_id") + private Long postImgId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "space_post_id") + private Post post; + + @Column(name = "post_image") + private String postImgUrl; + +} diff --git a/src/main/java/space/space_spring/service/PostService.java b/src/main/java/space/space_spring/service/PostService.java new file mode 100644 index 00000000..94f41597 --- /dev/null +++ b/src/main/java/space/space_spring/service/PostService.java @@ -0,0 +1,52 @@ +package space.space_spring.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import space.space_spring.dao.PostDao; +import space.space_spring.dao.UserSpaceDao; +import space.space_spring.dto.post.ReadPostsResponse; +import space.space_spring.entity.Post; +import space.space_spring.entity.Space; +import space.space_spring.entity.UserSpace; +import space.space_spring.util.space.SpaceUtils; +import space.space_spring.util.userSpace.UserSpaceUtils; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class PostService { + + private final SpaceUtils spaceUtils; + private final UserSpaceUtils userSpaceUtils; + private final PostDao postDao; + private final UserSpaceDao userSpaceDao; + + public List getAllPosts(Long spaceId, String filter) { + + // TODO 1: spaceId에 해당하는 space find + Space spaceBySpaceId = spaceUtils.findSpaceBySpaceId(spaceId); + + // TODO 2: 필터에 따라 해당 user의 해당 space 내의 게시판 게시글 리스트 return + List posts; + if("notice".equalsIgnoreCase(filter)) { + posts = postDao.findBySpaceAndType(spaceBySpaceId, "notice"); + } else if ("general".equalsIgnoreCase(filter)){ + posts = postDao.findBySpaceAndType(spaceBySpaceId, "general"); + } else { + // filter = "all" 일 경우 전체 게시글 조회 + posts = postDao.findBySpace(spaceBySpaceId); + } + + int postCount = posts.size(); + + return posts.stream() + .map(post ->{ + Optional userSpace = userSpaceUtils.isUserInSpace(post.getUser().getUserId(), spaceId); + return ReadPostsResponse.of(post, postCount, userSpace.orElse(null)); + }) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/space/space_spring/util/post/ConvertCreatedDate.java b/src/main/java/space/space_spring/util/post/ConvertCreatedDate.java new file mode 100644 index 00000000..838246d9 --- /dev/null +++ b/src/main/java/space/space_spring/util/post/ConvertCreatedDate.java @@ -0,0 +1,24 @@ +package space.space_spring.util.post; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; + +public class ConvertCreatedDate { + public static String setCreatedDate(LocalDateTime createdAt) { + LocalDateTime now = LocalDateTime.now(); + if(ChronoUnit.YEARS.between(createdAt, now) != 0) + return ChronoUnit.YEARS.between(createdAt, now) + "년 전"; + else if(ChronoUnit.MONTHS.between(createdAt, now) != 0) + return ChronoUnit.MONTHS.between(createdAt, now) + "달 전"; + else if(ChronoUnit.WEEKS.between(createdAt, now) != 0) + return ChronoUnit.WEEKS.between(createdAt, now) + "주 전"; + else if(ChronoUnit.DAYS.between(createdAt, now) != 0) + return ChronoUnit.DAYS.between(createdAt, now) + "일 전"; + else if(ChronoUnit.HOURS.between(createdAt, now) != 0) + return ChronoUnit.HOURS.between(createdAt, now) + "시간 전"; + else if (ChronoUnit.MINUTES.between(createdAt, now) != 0) + return ChronoUnit.MINUTES.between(createdAt, now) + "분 전"; + else + return "방금"; + } +}