Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
129 commits
Select commit Hold shift + click to select a range
4018cee
fix: apply complete .gitignore
sungchaewon May 11, 2025
891f79d
chore(config): H2 DB 설정을 application.properties로 추가
sungchaewon May 11, 2025
f81a3b6
feat(init) : 기본 폴더 및 파일 생성
youngseo22 May 11, 2025
e41d572
feat(config): H2 DB 연결 설정 및 콘솔 확인 완료
sungchaewon May 12, 2025
80a9235
feat(init) : .coderabbit.yaml 파일 생성
youngseo22 May 12, 2025
163c4c8
feat(config): bookmarktag 수정(글자수 등)
sungchaewon May 12, 2025
1bd5c10
feat(config): 코드 내에 필드명 카멜 케이스로 수정
sungchaewon May 12, 2025
8a68855
feat(config): originalPost 카멜 케이스로 변경
sungchaewon May 12, 2025
3d893a0
Merge pull request #5 from FixLog/feature/#4-setup-file-ys
youngseo22 May 12, 2025
9379566
Merge pull request #2 from sungchaewon/feature/#1-setup-properties-cw
sungchaewon May 12, 2025
4f2e4ef
Merge pull request #7 from FixLog/feature/#6-init-coderabbit-ys
youngseo22 May 12, 2025
959c139
feat(follow):팔로우하기 구현
semsemin May 17, 2025
58334eb
feat(unfollow): 언팔로우하기 구현
semsemin May 17, 2025
409ecc3
feat(post) : 기본 파일 생성
youngseo22 May 18, 2025
d4c3444
fix(path) : 경로 오류 수정
youngseo22 May 18, 2025
778a213
feat(followers):나를 팔로우하는 사용자 목록 조회
semsemin May 18, 2025
ec81875
feat(followings): 내가 팔로우하는 목록 조회
semsemin May 18, 2025
dfc7359
fix(gradle): security 주석 해제
semsemin May 18, 2025
e7c7275
rename(package): FixLog로 통일
semsemin May 18, 2025
5f20b7a
rename(package):JAVA 패키지명 관례에 따라 패키지명 소문자로 변경
semsemin May 18, 2025
ad2a49e
feat(post) : 게시글 작성하기 API 구현
youngseo22 May 18, 2025
6fc76a9
Update src/main/java/com/example/fixLog/service/follow/FollowService.…
semsemin May 18, 2025
df08155
rename(post) : 파일명 수정 및 파일 이동
youngseo22 May 18, 2025
50c1318
rename(package):fixlog로 패키지 이름 변경
semsemin May 18, 2025
66ec646
fix(errorcode): 에러코드 수정
semsemin May 18, 2025
b0ae889
feat(post) : 게시글 작성하기 구현 완료
youngseo22 May 20, 2025
2d1d6f1
feat(post) : 게시글 좋아요 구현 완료
youngseo22 May 20, 2025
d411c29
feat(postlike) : 좋아요 삭제 구현 완료
youngseo22 May 20, 2025
7f7637f
fix(response):response에 null 값 제외 - 원래대로 복구
semsemin May 21, 2025
bcfd9fa
feat(postlike) : 좋아요 토글로 로직 수정
youngseo22 May 21, 2025
2051510
feat(bookmark) : 북마크 구현 완료
youngseo22 May 21, 2025
3a0ed94
Merge pull request #10 from FixLog/feature/#8-follow-sm
semsemin May 21, 2025
8a39f14
Merge branch 'develop' into feature/#3-posting-ys
youngseo22 May 21, 2025
1f5a827
fix(post) : 머지 충돌 반영
youngseo22 May 21, 2025
76d599b
fix(conflict) : 머지 시 삭제된 파일 복구
youngseo22 May 21, 2025
9044b97
[FEAT] 게시글 작성하기, 게시글 반응 구현
youngseo22 May 21, 2025
1045e40
fix(signup) : 클론 재설정 및 fixlog 로
sungchaewon May 21, 2025
b9bf640
fix(signup) : ErrorCode 추가 및 findByNickname 메서드 반영
sungchaewon May 21, 2025
3fb8661
feat(member) : 프로필이미지&소개글 도메인에 추가
sungchaewon May 21, 2025
6c0f959
feat(entity): 북마크 엔티티 수정, 북마크 폴더 엔티티 추가
semsemin May 22, 2025
30455fc
fix(gradle): security 주석 해제
semsemin May 22, 2025
5c046ed
fix(entity): bookmark에 userId 삭제
semsemin May 22, 2025
d0a08c2
Merge pull request #20 from FixLog/feature/#19-bookmark-folder-sm
semsemin May 22, 2025
6e9b6af
Merge branch 'develop' into feature/#13-signup-cw
sungchaewon May 23, 2025
8207b96
Merge pull request #18 from FixLog/feature/#13-signup-cw
sungchaewon May 23, 2025
2c97f8f
fix(중간점검)
youngseo22 May 23, 2025
eae8501
fix(domain) : 변수명과 컬럼명 일치
youngseo22 May 24, 2025
6d57768
fix(domain) : tagCategory 수정
youngseo22 May 24, 2025
b9eacda
[FIX] 게시글 작성 및 메인페이지 수정, 도메인 변수명 수정
youngseo22 May 24, 2025
5371d1a
Revert "[FIX] 게시글 작성 및 메인페이지 수정, 도메인 변수명 수정"
youngseo22 May 24, 2025
3b9f4f0
style(typo) : 오타 등 수정
youngseo22 May 24, 2025
59db2ee
[FIX] 도메인 변수명 수정 (추가)
youngseo22 May 24, 2025
9fb9445
Update BookmarkFolder.java
youngseo22 May 24, 2025
677f963
Revert "[FIX] 도메인 변수명 수정 (추가)"
youngseo22 May 24, 2025
e8ceb06
Merge pull request #26 from FixLog/revert-23-revert-21-feature/#3-pos…
youngseo22 May 24, 2025
630f6d6
feat(createFolder): 북마크 폴더 생성 api
semsemin May 24, 2025
c45dc07
Merge branch 'develop' into feature/#3-posting-ys
youngseo22 May 24, 2025
c4d0292
Merge pull request #27 from FixLog/develop
youngseo22 May 24, 2025
e3d55cc
Merge branch 'develop' into feature/#3-posting-ys
youngseo22 May 24, 2025
f690d40
feat(readFolder): 북마크 폴더 전체 목록 조회 api
semsemin May 24, 2025
22790cc
style(typo) : 오타 수정
youngseo22 May 24, 2025
05e7884
Merge branch 'feature/#3-posting-ys' into feature/#11-mainpage-ys
youngseo22 May 24, 2025
57e4f49
fix(domain) : 필요없는 import 삭제
youngseo22 May 24, 2025
5110fcc
feat(updateFolder): 북마크 폴더 이름 수정 api
semsemin May 24, 2025
4742b1d
feat(deleteFolder): 북마크 폴더 삭제 api
semsemin May 24, 2025
fe5f398
feat(moveBookmark): 북마크 폴더 이동 api
semsemin May 24, 2025
8a211b9
comment(bookmark): 기본 폴더 삭제 불가 여부
semsemin May 24, 2025
c6c9dcf
feat(mock): 폴더 mock 데이터 생성
semsemin May 24, 2025
70d9b73
feat(createFolder): 북마크 폴더 생성 api
semsemin May 24, 2025
70fac7c
feat(readFolder): 북마크 폴더 전체 목록 조회 api
semsemin May 24, 2025
2d1d101
feat(updateFolder): 북마크 폴더 이름 수정 api
semsemin May 24, 2025
36eadea
feat(deleteFolder): 북마크 폴더 삭제 api
semsemin May 24, 2025
4849fe5
feat(moveBookmark): 북마크 폴더 이동 api
semsemin May 24, 2025
60bdae5
comment(bookmark): 기본 폴더 삭제 불가 여부
semsemin May 24, 2025
b32ddb2
feat(mock): 폴더 mock 데이터 생성
semsemin May 24, 2025
b66718e
git 충돌 수정
semsemin May 24, 2025
c99eb2c
fix(git): 깃 충돌 해결
semsemin May 24, 2025
7715b91
fix(git): 깃 충돌 해결
semsemin May 24, 2025
756d4eb
Merge pull request #29 from FixLog/feature/#24-bookmark-folder-CRUD-sm
semsemin May 25, 2025
66ffdb4
fix(fileName) : FixLog로 리팩토링
youngseo22 May 25, 2025
49c973b
[FIX] 브랜치 루트 정리
youngseo22 May 25, 2025
e19ec1e
Merge branch 'develop' into feature/#11-mainpage-ys
youngseo22 May 25, 2025
ec9b32a
Merge branch 'develop' into feature/#3-posting-ys
youngseo22 May 25, 2025
fffc616
Merge branch 'develop' into feature/#3-posting-ys
youngseo22 May 25, 2025
47a7e2f
Merge branch 'develop' into feature/#11-mainpage-ys
youngseo22 May 25, 2025
49d0bb8
[FIX] 도메인 변수명 수정 (추가)
youngseo22 May 25, 2025
beecb99
style(typo) : 오타 수정
youngseo22 May 25, 2025
c5f7c04
feat(main) : 메인페이지 조회 구현
youngseo22 May 25, 2025
50f4e91
feat(mainPage) : 메인페이지 구현 완료
youngseo22 May 26, 2025
079d069
feat(mainPage) : 전체보기 페이지 구현
youngseo22 May 26, 2025
484617a
Merge branch 'develop' into feature/#11-mainpage-ys
youngseo22 May 26, 2025
c47d863
fix(postLike) : 게시글 좋아요 return값 변경
youngseo22 May 26, 2025
d539b2f
feat(bookmark) : 북마크 출력 메시지 수정, 본인은 북마크 못하도록
youngseo22 May 26, 2025
f17d11c
fix(mainPage) : 좋아요 개수 추가
youngseo22 May 26, 2025
8f09071
chore: temp rename to resolve casing issue
sungchaewon May 26, 2025
21a460a
chore: rename FixLog to fixlog
sungchaewon May 26, 2025
7cbcd38
[FIX] 좋아요, 북마크 세부 수정
youngseo22 May 26, 2025
424c097
[FEAT] 메인페이지 구현
youngseo22 May 26, 2025
28e1b6c
merge: resolve conflicts with origin/develop
sungchaewon May 26, 2025
1cf826b
fix(conflict): PostService 충돌 해결
sungchaewon May 26, 2025
1e79909
fix(conflict): Post 관련 충돌 및 MainPageController 병합 완료
sungchaewon May 26, 2025
de99205
chore: FixLog 디렉토리 통일 및 로그인 관련 파일 복구, 충돌 해결 완료
sungchaewon May 26, 2025
1c4d845
feat(viewPost) : 게시글 보기 구현 완료
youngseo22 May 26, 2025
5fd66f1
feat(auth): JWT 로그인 기능 및 기본 프로필 설정 추가
sungchaewon May 26, 2025
07fdff5
[FEAT] 게시글 조회 구현
youngseo22 May 27, 2025
6f0708a
Merge pull request #37 from FixLog/feature/#14-login-cw
sungchaewon May 28, 2025
8ba11c3
feat(tag) : 태그 모아보기 구현 완료
youngseo22 May 28, 2025
99478c7
fix(login, signup) : api 경로 수정
sungchaewon May 28, 2025
af460fa
feature(memberdelete) : 회원 탈퇴 구현, fix(login) : USER_ID_NOT_FOUND -> U…
sungchaewon May 28, 2025
e0e3289
fix(member) : 로그인 사용자 정보 받아오도록 수정
youngseo22 May 28, 2025
c826a40
feat(mypost): 내가 쓴 글 보기
semsemin May 28, 2025
b933691
fix(auth): 사용자 인증 jwt로 변경
semsemin May 28, 2025
95ced6a
Merge pull request #50 from FixLog/feature/#25-my-post-sm
semsemin May 28, 2025
16d7242
Merge pull request #48 from FixLog/feature/#41-delete-member-cw
sungchaewon May 28, 2025
1a5a11d
[FEAT] 태그 모음 보기 구현
youngseo22 May 28, 2025
2ffc9b6
Merge branch 'develop' into feat/#46-getMember-ys
youngseo22 May 28, 2025
e1d02a3
[FIX] 회원정보 자동 로딩으로 수정
youngseo22 May 28, 2025
ab908c5
feat(like): 내가 좋아요한 글 보기
semsemin May 28, 2025
38a5e87
fix(error): error code 수정 USER_EMAIL
semsemin May 28, 2025
d8b53cc
feat(bookmark): 특정 폴더의 북마크 목록 조회, 폴더 목록 20개 default
semsemin May 28, 2025
d1b895d
remove(comment): 필요없는 주석, 파일 삭제
semsemin May 28, 2025
af1ac06
Merge pull request #53 from FixLog/feature/#25-my-post-sm
semsemin May 29, 2025
b642392
Merge pull request #55 from FixLog/feature/#54-myfolder-bookmark-sm
semsemin May 29, 2025
ad4bb35
fix(mainpage, tag) : defaultValue 설정
youngseo22 May 29, 2025
90223e0
fix(tag) : 태그 정보 100자까지만 보여주기
youngseo22 May 29, 2025
d765d48
feat(post) : 게시글 작성하기 기능 디벨롭지지
youngseo22 May 30, 2025
2e1a4d9
[FIX] 메인페이지, 태그 모아보기 수정
youngseo22 May 30, 2025
dd95068
[FEAT] 태그 모음 보기 구현
youngseo22 May 30, 2025
2b57c18
[FIX] 게시글 작성하기 보완
youngseo22 May 31, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# .coderabbit.yaml
language: "ko-KR" # 한국말로 설정
early_access: false
reviews:
profile: "chill" # 리뷰 너무 빡세게는 안한다는 뜻
request_changes_workflow: true # 코드래빗이 리뷰 끝나면 알아서 PR 승인하게끔
high_level_summary: true
poem: true
review_status: true
collapse_walkthrough: false
auto_review:
enabled: true
drafts: false
chat:
auto_reply: true
8 changes: 5 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,16 @@ repositories {

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly('io.jsonwebtoken:jjwt-jackson:0.11.5')
runtimeOnly 'com.h2database:h2'
runtimeOnly 'com.mysql:mysql-connector-j'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

Expand Down
Empty file modified gradlew
100644 → 100755
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.example.FixLog.config;

import com.example.FixLog.domain.member.Member;
import com.example.FixLog.exception.CustomException;
import com.example.FixLog.repository.MemberRepository;
import com.example.FixLog.util.JwtUtil;
import java.io.IOException;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import com.example.FixLog.exception.ErrorCode;

public class JwtAuthenticationFilter extends OncePerRequestFilter {

private final JwtUtil jwtUtil;
private final MemberRepository memberRepository;

public JwtAuthenticationFilter(JwtUtil jwtUtil, MemberRepository memberRepository) {
this.jwtUtil = jwtUtil;
this.memberRepository = memberRepository;
}

@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain)
throws ServletException, IOException {

String token = resolveToken(request);

if (token != null && jwtUtil.isTokenValid(token)) {
String email = jwtUtil.getEmailFromToken(token);
Member member = memberRepository.findByEmail(email)
.orElseThrow(() -> new CustomException(ErrorCode.USER_NICKNAME_NOT_FOUND));

Authentication auth = new UsernamePasswordAuthenticationToken(member, null, member.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(auth);
}

filterChain.doFilter(request, response);
}

private String resolveToken(HttpServletRequest request) {
String bearerToken = request.getHeader("Authorization");
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
return bearerToken.substring(7);
}
return null;
}
}
58 changes: 58 additions & 0 deletions src/main/java/com/example/FixLog/config/SecurityConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.example.FixLog.config;

import com.example.FixLog.repository.MemberRepository;
import com.example.FixLog.util.JwtUtil;
import jakarta.servlet.Filter;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@RequiredArgsConstructor
public class SecurityConfig {

private final JwtUtil jwtUtil;
private final MemberRepository memberRepository;

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable())
.authorizeHttpRequests(auth -> auth
.requestMatchers(HttpMethod.POST, "/members/signup").permitAll()
.requestMatchers(HttpMethod.POST, "/auth/login").permitAll()
.requestMatchers(HttpMethod.GET, "/members/check-email").permitAll()
.requestMatchers(HttpMethod.GET, "/members/check-nickname").permitAll()
.requestMatchers(HttpMethod.GET, "/h2-console/**").permitAll()
.anyRequest().authenticated()
)
.headers(headers -> headers.frameOptions(frame -> frame.disable())) // H2 콘솔용
.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

return http.build();
}

@Bean
public Filter jwtAuthenticationFilter() {
return new JwtAuthenticationFilter(jwtUtil, memberRepository);
}

@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}

// 인증 매니저 (선택: 로그인 시 AuthenticationManager 사용 가능)
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
return config.getAuthenticationManager();
}
}
23 changes: 23 additions & 0 deletions src/main/java/com/example/FixLog/controller/AuthController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.example.FixLog.controller;

import com.example.FixLog.dto.Response;
import com.example.FixLog.dto.member.LoginRequestDto;
import com.example.FixLog.dto.member.LoginResponseDto;
import com.example.FixLog.service.AuthService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/auth")
@RequiredArgsConstructor
public class AuthController {

private final AuthService authService;

@PostMapping("/login")
public ResponseEntity<Response<LoginResponseDto>> login(@RequestBody LoginRequestDto requestDto) {
LoginResponseDto result = authService.login(requestDto);
return ResponseEntity.ok(Response.success("로그인 성공", result));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package com.example.FixLog.controller;

import com.example.FixLog.dto.PageResponseDto;
import com.example.FixLog.dto.Response;
import com.example.FixLog.dto.bookmark.request.BookmarkFolderCreateRequest;
import com.example.FixLog.dto.bookmark.request.BookmarkFolderUpdateRequest;
import com.example.FixLog.dto.bookmark.request.BookmarkMoveRequest;
import com.example.FixLog.dto.bookmark.response.BookmarkFolderCreateResponse;
import com.example.FixLog.dto.bookmark.response.BookmarkFolderReadResponse;
import com.example.FixLog.dto.post.MyPostPageResponseDto;
import com.example.FixLog.service.BookmarkFolderService;
import com.example.FixLog.service.BookmarkService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/bookmark-folders")
public class BookmarkFolderController {
private final BookmarkFolderService bookmarkFolderService;
private final BookmarkService bookmarkService;

// 북마크 폴더 생성
@PostMapping
public ResponseEntity<?> createFolder(
@RequestBody BookmarkFolderCreateRequest request,
@RequestParam String requesterEmail
) {
BookmarkFolderCreateResponse response = bookmarkFolderService.createFolder(request.folderName(), requesterEmail);

return ResponseEntity.ok(Response.success("북마크 폴더 생성 성공", response));
}

// 북마크 폴더 이름 수정
@PatchMapping("/{folder_id}")
public ResponseEntity<Response<Void>> updateFolderName(
@PathVariable Long folderId,
@RequestParam String requesterEmail,
@RequestBody BookmarkFolderUpdateRequest request
) {
bookmarkFolderService.updateFolderName(folderId, requesterEmail, request.folderName());
return ResponseEntity.ok(Response.success("폴더 이름 수정 완료", null));
}

// 북마크 폴더 이동
@PatchMapping("/{bookmarkId}/move")
public ResponseEntity<Response<Void>> moveBookmark(
@PathVariable Long bookmarkId,
@RequestParam String requesterEmail,
@RequestBody BookmarkMoveRequest request
) {
bookmarkService.moveBookmarkToFolder(bookmarkId, request.folderId(), requesterEmail);
return ResponseEntity.ok(Response.success("북마크 다른 폴더로 이동 성공", null));
}


// 북마크 폴더 삭제
@DeleteMapping("/{folderId}")
public ResponseEntity<Response<Void>> deleteFolder(
@PathVariable Long folderId,
@RequestParam String requesterEmail
) {
bookmarkFolderService.deleteFolder(folderId, requesterEmail);
return ResponseEntity.ok(Response.success("북마크 폴더 삭제 완료", null));
}

// 북마크 폴더 목록 전체 조회 - MVP
@GetMapping
public ResponseEntity<Response<PageResponseDto<BookmarkFolderReadResponse>>> getFolders(
@AuthenticationPrincipal UserDetails userDetails,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size
) {
String email = userDetails.getUsername();
PageResponseDto<BookmarkFolderReadResponse> response = bookmarkFolderService.getFoldersByEmail(email, page, size);
return ResponseEntity.ok(Response.success("북마크 폴더 목록 전체 조회 성공", response));
}

// 특정 폴더의 북마크 목록 조회 -MVP
@GetMapping("/{folderId}/bookmarks")
public ResponseEntity<Response<PageResponseDto<MyPostPageResponseDto>>> getBookmarksByFolder(
@PathVariable Long folderId,
@AuthenticationPrincipal UserDetails userDetails,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "6") int size,
@RequestParam(defaultValue = "0") int sort
) {
String email = userDetails.getUsername();
PageResponseDto<MyPostPageResponseDto> data = bookmarkService.getBookmarksInFolder(email, folderId, page, sort, size);
return ResponseEntity.ok(Response.success("특정 폴더의 북마크 목록 조회 성공", data));
}


}
65 changes: 65 additions & 0 deletions src/main/java/com/example/FixLog/controller/FollowController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.example.FixLog.controller;

import com.example.FixLog.dto.Response;
import com.example.FixLog.dto.follow.request.FollowRequestDto;
import com.example.FixLog.dto.follow.request.UnfollowRequestDto;
import com.example.FixLog.dto.follow.response.FollowResponseDto;
import com.example.FixLog.dto.follow.response.FollowerListResponseDto;
import com.example.FixLog.dto.follow.response.FollowingListResponseDto;
import com.example.FixLog.service.FollowService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/follow")
@RequiredArgsConstructor
public class FollowController {
private final FollowService followService;

// 팔로우하기
@PostMapping
public ResponseEntity<Response<FollowResponseDto>> follow(
@RequestBody FollowRequestDto followRequestDto,
@AuthenticationPrincipal UserDetails userDetails // jwt 구현 전까지 임시 사용 -> 이후 AuthenticationPrincipal 사용 예정
){
String requesterEmail = userDetails.getUsername();
FollowResponseDto result = followService.follow(requesterEmail, followRequestDto.getTargetMemberId());
return ResponseEntity.ok(Response.success("팔로우 완료", result));
}

// 언팔로우하기
@PostMapping("/unfollow")
public ResponseEntity<Response<Void>> unfollow(
@RequestBody UnfollowRequestDto requestDto,
@AuthenticationPrincipal UserDetails userDetails
) {
String requesterEmail = userDetails.getUsername();
followService.unfollow(requesterEmail, requestDto.getTargetMemberId());
return ResponseEntity.ok(Response.success("언팔로우 완료", null));
}

// 나를 팔로우하는 목록 조회
@GetMapping("/followers")
public ResponseEntity<Response<List<FollowerListResponseDto>>> getMyFollowers(
@AuthenticationPrincipal UserDetails userDetails
) {
String requesterEmail = userDetails.getUsername();
List<FollowerListResponseDto> followers = followService.getMyFollowers(requesterEmail);
return ResponseEntity.ok(Response.success("나를 팔로우하는 목록 조회 성공", followers));
}

// 내가 팔로우하는 목록 조회
@GetMapping("/followings")
public ResponseEntity<Response<List<FollowingListResponseDto>>> getMyFollowings(
@AuthenticationPrincipal UserDetails userDetails
) {
String requesterEmail = userDetails.getUsername();
List<FollowingListResponseDto> followings = followService.getMyFollowings(requesterEmail);
return ResponseEntity.ok(Response.success("내가 팔로우 중인 목록 조회 성공", followings));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.example.FixLog.controller;

import com.example.FixLog.dto.Response;
import com.example.FixLog.dto.main.MainPageResponseDto;
import com.example.FixLog.service.MainPageService;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/main")
public class MainPageController {
private final MainPageService mainPageService;

public MainPageController(MainPageService mainPageService){
this.mainPageService = mainPageService;
}

@GetMapping
public Response<Object> mainPageView(@RequestParam(value = "sort", defaultValue = "0") int sort,
@RequestParam(value = "page", defaultValue = "12") int size){
MainPageResponseDto mainPageView = mainPageService.mainPageView(sort, size);
return Response.success("메인페이지 불러오기 성공", mainPageView);
}

@GetMapping("/full")
public Response<Object> mainPageFullView(@RequestParam(value = "sort", defaultValue = "0") int sort,
@RequestParam(value = "page", defaultValue = "1") int page,
@RequestParam(value = "page", defaultValue = "12") int size){
MainPageResponseDto mainPageFullView = mainPageService.mainPageFullView(sort, page, size);
return Response.success("메인페이지 전체보기 성공", mainPageFullView);
}
}
Loading