-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
33 changed files
with
452 additions
and
72 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
# This workflow uses actions that are not certified by GitHub. | ||
# They are provided by a third-party and are governed by | ||
# separate terms of service, privacy policy, and support | ||
# documentation. | ||
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time | ||
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle | ||
|
||
name: Java CI with Gradle # workflow 이름 | ||
|
||
on: | ||
push: | ||
branches: [ "develop" ] | ||
|
||
permissions: | ||
contents: read | ||
|
||
jobs: | ||
build: | ||
|
||
runs-on: ubuntu-latest | ||
|
||
steps: | ||
- uses: actions/checkout@v3 | ||
- name: Set up JDK 17 | ||
uses: actions/setup-java@v3 | ||
with: | ||
java-version: '17' | ||
distribution: 'temurin' | ||
|
||
- name: make application.yml | ||
run: | | ||
# create application.yml | ||
cd ./src/main | ||
mkdir resources | ||
cd ./resources | ||
# application.yml 파일 생성하기 | ||
touch ./application.yml | ||
# Secrets에 저장한 값을 application.yml 파일에 쓰기 | ||
echo "${{ secrets.YML }}" >> ./application.yml | ||
shell: bash | ||
|
||
- name: Build with Gradle | ||
run: | | ||
chmod +x ./gradlew | ||
./gradlew clean build -x test | ||
## 도커 이미지 빌드 후 도커허브에 push하기 | ||
- name: web docker build and push | ||
run: | | ||
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} | ||
docker build -t ${{ secrets.DOCKER_REPO }} . | ||
docker push ${{ secrets.DOCKER_REPO }} | ||
## 서버에 접속하여 도커 이미지를 pull 받고 실행하기 | ||
- name: executing remote ssh commands using password | ||
uses: appleboy/[email protected] | ||
with: | ||
host: ${{ secrets.HOST }} | ||
username: ubuntu | ||
key: ${{ secrets.KEY }} | ||
port: 22 | ||
script: | | ||
sudo docker image rm ${{ secrets.DOCKER_REPO }} | ||
sudo docker pull ${{ secrets.DOCKER_REPO }} | ||
sudo docker run -d -p 8080:8080 ${{ secrets.DOCKER_REPO }} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -36,4 +36,6 @@ out/ | |
### VS Code ### | ||
.vscode/ | ||
|
||
### Security ### | ||
*.yml | ||
*.properties |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
FROM openjdk:17 | ||
ARG JAR_FILE=build/libs/*.jar | ||
COPY ${JAR_FILE} handy.jar | ||
ENTRYPOINT ["java","-jar","/handy.jar"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
6 changes: 6 additions & 0 deletions
6
src/main/java/com/teami/domain/calendar/controller/dto/response/CalendarInfo.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
package com.teami.domain.calendar.controller.dto.response; | ||
|
||
public record CalendarInfo( | ||
Long calendarId | ||
) { | ||
} |
43 changes: 43 additions & 0 deletions
43
src/main/java/com/teami/domain/friend/controller/FriendController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
package com.teami.domain.friend.controller; | ||
|
||
import com.teami.domain.friend.controller.dto.response.FriendCalendarInfo; | ||
import com.teami.domain.friend.controller.dto.response.FriendListResponse; | ||
import com.teami.domain.friend.service.FriendService; | ||
import com.teami.global.apiPayload.ApiResponse; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.web.bind.annotation.*; | ||
|
||
@RestController | ||
@RequiredArgsConstructor | ||
@RequestMapping("/api/friend") | ||
public class FriendController { | ||
private final FriendService friendService; | ||
|
||
// 친구 추가 | ||
@PostMapping("/create/{receiverId}/{senderId}") | ||
public ApiResponse<Void> crateFriend(@PathVariable Long receiverId, @PathVariable Long senderId) { | ||
friendService.createFriend(receiverId, senderId); | ||
return ApiResponse.onSuccess(null); | ||
} | ||
|
||
// 친구 삭제 | ||
@DeleteMapping("/{requesterId}/{requestedId}") | ||
public ApiResponse<Void> deleteFriend(@PathVariable Long requesterId, @PathVariable Long requestedId) { | ||
friendService.deleteFriend(requesterId, requestedId); | ||
return ApiResponse.onSuccess(null); | ||
} | ||
|
||
// 친구 목록 조회 | ||
@GetMapping("/list") | ||
public ApiResponse<FriendListResponse> getFriendList(@RequestParam Long memberId) { | ||
FriendListResponse response = friendService.getFriendList(memberId); | ||
return ApiResponse.onSuccess(response); | ||
} | ||
|
||
// 친구 캘린더 아이디 조회 | ||
@GetMapping("/calendar/{friendMemberId}") | ||
public ApiResponse<FriendCalendarInfo> getFriendCalendarInfo(@RequestParam Long memberId, @PathVariable Long friendMemberId) { | ||
FriendCalendarInfo response = friendService.getCalendarInfo(memberId, friendMemberId); | ||
return ApiResponse.onSuccess(response); | ||
} | ||
} |
8 changes: 8 additions & 0 deletions
8
src/main/java/com/teami/domain/friend/controller/dto/response/FriendCalendarInfo.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
package com.teami.domain.friend.controller.dto.response; | ||
|
||
public record FriendCalendarInfo( | ||
Long memberId, | ||
Long friendMemberId, | ||
Long calendarId | ||
) { | ||
} |
14 changes: 14 additions & 0 deletions
14
src/main/java/com/teami/domain/friend/controller/dto/response/FriendInfo.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package com.teami.domain.friend.controller.dto.response; | ||
|
||
import com.teami.domain.calendar.controller.dto.response.CalendarInfo; | ||
import lombok.Builder; | ||
|
||
import java.util.List; | ||
|
||
@Builder | ||
public record FriendInfo( | ||
Long id, | ||
String nickname, | ||
List<CalendarInfo> calendarInfoList | ||
) { | ||
} |
12 changes: 12 additions & 0 deletions
12
src/main/java/com/teami/domain/friend/controller/dto/response/FriendListResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package com.teami.domain.friend.controller.dto.response; | ||
|
||
import lombok.Builder; | ||
|
||
import java.util.List; | ||
|
||
@Builder | ||
public record FriendListResponse( | ||
Long memberId, | ||
List<Long> friendMemberIdList | ||
) { | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
package com.teami.domain.friend.entity; | ||
|
||
import com.teami.domain.member.entitty.Member; | ||
import com.teami.global.common.BaseEntity; | ||
import jakarta.persistence.*; | ||
import lombok.*; | ||
import org.hibernate.annotations.Where; | ||
|
||
@Getter | ||
@Entity | ||
@Table(name = "friend") | ||
@Builder | ||
@NoArgsConstructor(access = AccessLevel.PROTECTED) | ||
@AllArgsConstructor | ||
@Where(clause = "deleted_at is null") | ||
public class Friend extends BaseEntity { | ||
@Id | ||
@GeneratedValue(strategy = GenerationType.IDENTITY) | ||
private Long id; | ||
|
||
@ManyToOne(fetch = FetchType.LAZY, optional = false) | ||
@JoinColumn(name = "member1_id") | ||
private Member member1; | ||
|
||
@ManyToOne(fetch = FetchType.LAZY, optional = false) | ||
@JoinColumn(name = "member2_id") | ||
private Member member2; | ||
|
||
@Builder | ||
public Friend(Member member1, Member member2) { | ||
this.member1 = member1; | ||
this.member2 = member2; | ||
} | ||
|
||
public static Friend createFriend(Member member1, Member member2) { | ||
return new Friend(member1, member2); | ||
} | ||
} |
14 changes: 12 additions & 2 deletions
14
src/main/java/com/teami/domain/friend/repository/FriendRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,21 @@ | ||
package com.teami.domain.friend.repository; | ||
|
||
import com.teami.domain.member.entitty.Friend; | ||
|
||
import com.teami.domain.friend.entity.Friend; | ||
import com.teami.domain.member.entitty.Member; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.data.jpa.repository.Query; | ||
import org.springframework.data.repository.query.Param; | ||
|
||
import java.util.List; | ||
import java.util.Optional; | ||
|
||
public interface FriendRepository extends JpaRepository<Friend, Long> { | ||
@Query(value = "SELECT member2_id FROM friend WHERE member1_id = :member1Id", nativeQuery = true) | ||
List<Long> findFriendIdByMember1Id(@Param("member1Id") Long member1Id); | ||
@Query(value = "SELECT member1_id FROM friend WHERE member2_id = :member2Id", nativeQuery = true) | ||
List<Long> findFriendIdByMember2Id(@Param("member2Id") Long member2Id); | ||
|
||
boolean existsByMember1_IdAndMember2_Id(Long member1Id, Long member2Id); | ||
Optional<Friend> findFriendByMember1AndMember2(Member member1, Member member2);} | ||
Optional<Friend> findFriendByMember1AndMember2(Member member1, Member member2); | ||
} |
92 changes: 92 additions & 0 deletions
92
src/main/java/com/teami/domain/friend/service/FriendService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
package com.teami.domain.friend.service; | ||
|
||
import com.teami.domain.calendar.repository.CalendarRepository; | ||
import com.teami.domain.friend.controller.dto.response.FriendCalendarInfo; | ||
import com.teami.domain.friend.controller.dto.response.FriendListResponse; | ||
import com.teami.domain.friend.entity.Friend; | ||
import com.teami.domain.friend.repository.FriendRepository; | ||
import com.teami.domain.member.entitty.Member; | ||
import com.teami.domain.member.service.MemberService; | ||
import com.teami.global.apiPayload.ExceptionHandler; | ||
import com.teami.global.apiPayload.code.status.ErrorStatus; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
import java.util.List; | ||
import java.util.stream.Collectors; | ||
import java.util.stream.Stream; | ||
|
||
@Service | ||
@Transactional(readOnly = true) | ||
@RequiredArgsConstructor | ||
public class FriendService { | ||
private final FriendRepository friendRepository; | ||
private final MemberService memberService; | ||
private final CalendarRepository calendarRepository; | ||
|
||
@Transactional | ||
public Long createFriend(Long member1Id, Long member2Id) { | ||
validateSameMember(member1Id, member2Id); | ||
validateAlreadyFriend(member1Id, member2Id); | ||
|
||
Member member1 = memberService.findById(member1Id); | ||
Member member2 = memberService.findById(member2Id); | ||
|
||
return friendRepository.save(Friend.createFriend(member1, member2)).getId(); | ||
} | ||
|
||
private void validateSameMember(Long member1Id, Long member2Id) { | ||
if (member1Id.equals(member2Id)) { | ||
throw new ExceptionHandler(ErrorStatus.SELF_FRIEND_REQUEST_NOT_ALLOWED); | ||
} | ||
} | ||
|
||
private void validateAlreadyFriend(Long member1Id, Long member2Id) { | ||
if (friendRepository.existsByMember1_IdAndMember2_Id(member1Id, member2Id) || | ||
friendRepository.existsByMember1_IdAndMember2_Id(member2Id, member1Id)) { | ||
throw new ExceptionHandler(ErrorStatus.ALREADY_EXIST_FRIEND); | ||
} | ||
} | ||
|
||
public Friend findFriendByMember1AndMember2(Member member1, Member member2) { | ||
return friendRepository.findFriendByMember1AndMember2(member1, member2) | ||
.or(() -> friendRepository.findFriendByMember1AndMember2(member2, member1)) | ||
.orElseThrow(() -> new ExceptionHandler(ErrorStatus.FRIEND_NOT_FOUND)); | ||
} | ||
|
||
public List<Long> findFriendsIdByMemberId(Long memberId) { | ||
List<Long> list1 = friendRepository.findFriendIdByMember1Id(memberId); | ||
List<Long> list2 = friendRepository.findFriendIdByMember2Id(memberId); | ||
return Stream.concat(list1.stream(), list2.stream()) | ||
.collect(Collectors.toList()); | ||
} | ||
|
||
@Transactional | ||
public void deleteFriend(Long requesterId, Long requestedId) { | ||
Member requester = memberService.findById(requesterId); | ||
Member requested = memberService.findById(requestedId); | ||
|
||
Friend friend = findFriendByMember1AndMember2(requester, requested); | ||
friend.markAsDeleted(); | ||
} | ||
|
||
public FriendListResponse getFriendList(Long memberId) { | ||
return new FriendListResponse(memberId, findFriendsIdByMemberId(memberId)); | ||
} | ||
|
||
private void validateFriend(Long member1Id, Long member2Id) { | ||
if (!friendRepository.existsByMember1_IdAndMember2_Id(member1Id, member2Id) | ||
&& !friendRepository.existsByMember1_IdAndMember2_Id(member2Id, member1Id)) { | ||
throw new ExceptionHandler(ErrorStatus.FRIEND_NOT_FOUND); | ||
} | ||
} | ||
|
||
public FriendCalendarInfo getCalendarInfo(Long memberId, Long friendMemberId) { | ||
validateFriend(memberId, friendMemberId); | ||
Member friendMember = memberService.findById(friendMemberId); | ||
|
||
Long calendarId = calendarRepository.findByMemberAndIsComplete(friendMember, false).get().getId(); | ||
return new FriendCalendarInfo(memberId, friendMemberId, calendarId); | ||
} | ||
} |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.