Skip to content

Commit

Permalink
[MERGE] ãfriendRepository 충돌 해결
Browse files Browse the repository at this point in the history
  • Loading branch information
2hy2on committed Jan 2, 2024
2 parents 4126255 + 69da52b commit c008fb3
Show file tree
Hide file tree
Showing 33 changed files with 452 additions and 72 deletions.
68 changes: 68 additions & 0 deletions .github/workflows/gradle.yml
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 }}
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,6 @@ out/
### VS Code ###
.vscode/

### Security ###
*.yml
*.properties
4 changes: 4 additions & 0 deletions Dockerfile
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"]
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ dependencies {
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'

// swagger
// Swagger
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0")
}

Expand Down
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
) {
}
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);
}
}
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
) {
}
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
) {
}
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
) {
}
38 changes: 38 additions & 0 deletions src/main/java/com/teami/domain/friend/entity/Friend.java
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);
}
}
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 src/main/java/com/teami/domain/friend/service/FriendService.java
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);
}
}
26 changes: 0 additions & 26 deletions src/main/java/com/teami/domain/member/entitty/Friend.java

This file was deleted.

4 changes: 2 additions & 2 deletions src/main/java/com/teami/domain/member/entitty/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class Member extends BaseEntity {
private String nickname;

@Column(nullable = false)
private String pasword;
private String password;

@Column(nullable = false)
private String refreshToken;
Expand All @@ -33,7 +33,7 @@ public class Member extends BaseEntity {
public Member(MemberRequest req){
this.loginId = req.getLoginId();
this.nickname = req.getNickname();
this.pasword = req.getPassword();
this.password = req.getPassword();
this.refreshToken = "ddddd";

}
Expand Down
Loading

0 comments on commit c008fb3

Please sign in to comment.