Skip to content

Commit 68f73b4

Browse files
committed
2 parents fe978c2 + 9779537 commit 68f73b4

33 files changed

+393
-124
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
name: OromaminC Backend Service Release
2+
3+
on:
4+
push:
5+
branches:
6+
- release
7+
8+
env:
9+
REGISTRY: ghcr.io
10+
IMAGE_NAME: ${{ github.repository }}
11+
12+
jobs:
13+
14+
tagging:
15+
name: 태깅 및 릴리즈
16+
runs-on: ubuntu-latest
17+
outputs:
18+
tag_name: ${{ steps.tag_version.outputs.new_tag }}
19+
20+
steps:
21+
- uses: actions/checkout@v4
22+
23+
- name: versioning and tagging
24+
id: tag_version
25+
uses: mathieudutour/[email protected]
26+
with:
27+
github_token: ${{ secrets.GITHUB_TOKEN }}
28+
29+
- name: releasing
30+
uses: ncipollo/release-action@v1
31+
with:
32+
tag: ${{ steps.tag_version.outputs.new_tag }}
33+
name: ${{ steps.tag_version.outputs.new_tag }}
34+
body: ${{ steps.tag_version.outputs.changelog }}
35+
36+
build-image:
37+
name: 도커 이미지 빌드
38+
runs-on: ubuntu-latest
39+
needs: tagging
40+
41+
permissions:
42+
contents: read
43+
packages: write
44+
attestations: write
45+
id-token: write
46+
47+
steps:
48+
- name: Check out Repository
49+
uses: actions/checkout@v4
50+
51+
- name: Setting for Developent
52+
run: echo "${{ secrets.APPLICATION_DEV_YML }}" > src/main/resources/application-dev.yml
53+
54+
- name: Sign in github container registry
55+
uses: docker/login-action@v3
56+
with:
57+
registry: ${{ env.REGISTRY }}
58+
username: ${{ github.actor }}
59+
password: ${{ secrets.GITHUB_TOKEN }}
60+
61+
- name: Extract metadata
62+
id: meta
63+
uses: docker/metadata-action@v5
64+
with:
65+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
66+
tags: |
67+
type=sha
68+
type=raw,value=${{ needs.tagging.outputs.tag_name }}
69+
type=raw,value=latest
70+
71+
- name: Build and Push Image
72+
uses: docker/build-push-action@v6
73+
with:
74+
context: .
75+
push: true
76+
tags: ${{ steps.meta.outputs.tags }}
77+
labels: ${{ steps.meta.outputs.labels }}

Dockerfile

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
FROM gradle:jdk21 as builder
2+
3+
WORKDIR /libs
4+
5+
COPY gradlew .
6+
COPY gradle gradle
7+
COPY build.gradle .
8+
COPY settings.gradle .
9+
10+
RUN ./gradlew dependencies --no-daemon || true
11+
12+
COPY src src
13+
14+
RUN ./gradlew build --no-daemon -x test
15+
16+
17+
FROM openjdk:21-slim
18+
19+
WORKDIR /app
20+
21+
COPY --from=builder /libs/build/libs/*.jar app.jar
22+
23+
ENTRYPOINT ["java", "-Dspring.profiles.active=dev", "-jar", "app.jar"]
24+

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ plugins {
55
}
66

77
group = 'com.oronaminc'
8-
version = '0.0.1-SNAPSHOT'
8+
version = '0.1'
99

1010
java {
1111
toolchain {

src/main/java/com/oronaminc/join/document/service/DocumentService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.oronaminc.join.document.service;
22

3+
import java.util.UUID;
4+
35
import org.springframework.stereotype.Service;
6+
import org.springframework.transaction.annotation.Transactional;
47

58
import com.oronaminc.join.document.dao.DocumentRepository;
69
import com.oronaminc.join.document.dto.DocumentRequest;
@@ -11,20 +14,17 @@
1114
import com.oronaminc.join.infra.service.S3Service;
1215
import com.oronaminc.join.member.domain.MemberType;
1316
import com.oronaminc.join.room.domain.Room;
14-
import jakarta.transaction.Transactional;
1517

1618
import lombok.RequiredArgsConstructor;
1719

18-
import java.util.UUID;
19-
20-
2120
@Service
2221
@RequiredArgsConstructor
2322
public class DocumentService {
2423

2524
private final DocumentRepository documentRepository;
2625
private final S3Service s3Service;
2726

27+
@Transactional
2828
public void deleteByRoomId(Long roomId) {
2929
documentRepository.deleteByRoomId(roomId);
3030
}

src/main/java/com/oronaminc/join/member/domain/Member.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,8 @@ public class Member extends BaseEntity {
3030
public void updateNickname(String nickname) {
3131
this.nickname = nickname;
3232
}
33+
34+
public void registerGuest() {
35+
this.email = "GUEST_" + this.id;
36+
}
3337
}
Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.oronaminc.join.member.security;
22

3+
import static com.oronaminc.join.member.util.MemberMapper.*;
4+
35
import java.util.Map;
46
import java.util.Optional;
57

@@ -12,7 +14,6 @@
1214

1315
import com.oronaminc.join.member.dao.MemberRepository;
1416
import com.oronaminc.join.member.domain.Member;
15-
import com.oronaminc.join.member.domain.MemberType;
1617
import com.oronaminc.join.member.dto.GuestLoginRequest;
1718
import com.oronaminc.join.member.service.MemberReader;
1819

@@ -39,45 +40,19 @@ public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2Authentic
3940

4041
Optional<Member> optionalMember = memberReader.findByEmail(kakaoAccount.get("email").toString());
4142

42-
Member member = optionalMember.orElseGet(
43-
() -> memberRepository.save(
44-
Member.builder()
45-
.email(kakaoAccount.get("email").toString())
46-
.nickname(profile.get("nickname").toString())
47-
.profileImage(profile.get("profile_image_url").toString())
48-
.memberType(MemberType.MEMBER)
49-
.build()
50-
)
51-
);
52-
53-
return MemberDetails.builder()
54-
.id(member.getId())
55-
.name(member.getEmail())
56-
.nickname(member.getNickname())
57-
.role(member.getMemberType())
58-
.build();
43+
Member member = optionalMember.orElseGet(() -> memberRepository.save(toKakaoMember(kakaoAccount, profile)));
44+
45+
return toOAuth2MemberDetails(member);
5946
}
6047

6148
@Transactional
6249
public MemberDetails loadGuest(GuestLoginRequest guestLoginRequest) {
63-
Member guest = Member.builder()
64-
.email(null)
65-
.nickname(guestLoginRequest.nickname())
66-
.profileImage(null)
67-
.memberType(MemberType.GUEST)
68-
.build();
50+
Member guest = toGuestMember(guestLoginRequest);
6951

7052
memberRepository.save(guest);
53+
guest.registerGuest();
7154

72-
// 1. 비회원 MemberDetails 생성
73-
MemberDetails memberDetails = MemberDetails.builder()
74-
.id(guest.getId())
75-
.name("GUEST_" + guest.getId())
76-
.nickname(guest.getNickname())
77-
.role(MemberType.GUEST)
78-
.build();
79-
80-
return memberDetails;
55+
return toGuestMemberDetails(guest);
8156
}
8257

8358
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.oronaminc.join.member.util;
2+
3+
import java.util.Map;
4+
5+
import com.oronaminc.join.member.domain.Member;
6+
import com.oronaminc.join.member.domain.MemberType;
7+
import com.oronaminc.join.member.dto.GuestLoginRequest;
8+
import com.oronaminc.join.member.security.MemberDetails;
9+
10+
import lombok.AccessLevel;
11+
import lombok.AllArgsConstructor;
12+
13+
@AllArgsConstructor(access = AccessLevel.PRIVATE)
14+
public class MemberMapper {
15+
public static MemberDetails toOAuth2MemberDetails(Member member) {
16+
return MemberDetails.builder()
17+
.id(member.getId())
18+
.name(member.getEmail())
19+
.nickname(member.getNickname())
20+
.role(member.getMemberType())
21+
.build();
22+
}
23+
24+
public static MemberDetails toGuestMemberDetails(Member guest) {
25+
return MemberDetails.builder()
26+
.id(guest.getId())
27+
.name(guest.getEmail())
28+
.nickname(guest.getNickname())
29+
.role(MemberType.GUEST)
30+
.build();
31+
}
32+
33+
public static Member toGuestMember(GuestLoginRequest guestLoginRequest) {
34+
return Member.builder()
35+
.email(null)
36+
.nickname(guestLoginRequest.nickname())
37+
.profileImage(null)
38+
.memberType(MemberType.GUEST)
39+
.build();
40+
}
41+
42+
public static Member toKakaoMember(Map<String, Object> kakaoAccount, Map<String, Object> profile) {
43+
return Member.builder()
44+
.email(kakaoAccount.get("email").toString())
45+
.nickname(profile.get("nickname").toString())
46+
.profileImage(profile.get("profile_image_url").toString())
47+
.memberType(MemberType.MEMBER)
48+
.build();
49+
}
50+
}

src/main/java/com/oronaminc/join/participant/domain/Participant.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
package com.oronaminc.join.participant.domain;
22

3-
import jakarta.persistence.Column;
4-
import jakarta.persistence.FetchType;
5-
import jakarta.persistence.Index;
6-
import jakarta.persistence.Table;
73
import java.time.LocalDateTime;
84

95
import com.oronaminc.join.global.entity.BaseEntity;
106
import com.oronaminc.join.member.domain.Member;
117
import com.oronaminc.join.room.domain.Room;
12-
import jakarta.persistence.*;
8+
9+
import jakarta.persistence.Column;
10+
import jakarta.persistence.Entity;
11+
import jakarta.persistence.EnumType;
12+
import jakarta.persistence.Enumerated;
13+
import jakarta.persistence.FetchType;
14+
import jakarta.persistence.GeneratedValue;
15+
import jakarta.persistence.GenerationType;
16+
import jakarta.persistence.Id;
17+
import jakarta.persistence.Index;
18+
import jakarta.persistence.JoinColumn;
19+
import jakarta.persistence.ManyToOne;
20+
import jakarta.persistence.Table;
1321
import lombok.AccessLevel;
1422
import lombok.AllArgsConstructor;
1523
import lombok.Builder;
@@ -44,4 +52,8 @@ public class Participant extends BaseEntity {
4452
private ParticipantType participantType;
4553

4654
private LocalDateTime exitedAt;
55+
56+
public void updateExitAt() {
57+
this.exitedAt = LocalDateTime.now();
58+
}
4759
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.oronaminc.join.participant.event;
2+
3+
import org.springframework.context.event.EventListener;
4+
import org.springframework.stereotype.Component;
5+
6+
import com.oronaminc.join.participant.service.ParticipantService;
7+
import com.oronaminc.join.room.event.RoomExitEvent;
8+
9+
import lombok.RequiredArgsConstructor;
10+
11+
@Component
12+
@RequiredArgsConstructor
13+
public class ParticipantEventHandler {
14+
15+
private final ParticipantService participantService;
16+
17+
@EventListener
18+
public void exitRoomEvent(RoomExitEvent roomExitEvent) {
19+
participantService.updateExitAt(roomExitEvent.roomId(), roomExitEvent.memberId());
20+
}
21+
}

src/main/java/com/oronaminc/join/participant/service/ParticipantService.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,22 @@
2020
import lombok.RequiredArgsConstructor;
2121

2222
@Service
23-
@Transactional
23+
@Transactional(readOnly=true)
2424
@RequiredArgsConstructor
2525
public class ParticipantService {
2626
private final ParticipantRepository participantRepository;
2727
private final ParticipantReader participantReader;
2828
private final MemberReader memberReader;
2929

30+
@Transactional
3031
public void savePresenterAndTeam(String presenterEmail, List<String> teamEmail, Room room) {
3132
saveMemberParticipantByEmail(presenterEmail, room, ParticipantType.PRESENTER);
3233
for (String email : teamEmail) {
3334
saveMemberParticipantByEmail(email, room, ParticipantType.TEAM);
3435
}
3536
}
3637

38+
@Transactional
3739
public void saveMemberParticipantByEmail(String email, Room room, ParticipantType participantType) {
3840
Member participantMember = memberReader.getByEmail(email);
3941
if (participantMember.getMemberType().equals(MemberType.GUEST)) {
@@ -42,7 +44,8 @@ public void saveMemberParticipantByEmail(String email, Room room, ParticipantTyp
4244
Participant participant = ParticipantMapper.toParticipant(participantMember, room, participantType);
4345
participantRepository.save(participant);
4446
}
45-
47+
48+
@Transactional
4649
public void saveParticipantById(Long memberId, Room room, ParticipantType participantType) {
4750
Member participantMember = memberReader.getById(memberId);
4851
if (participantReader.existsByRoomIdAndMemberId(room.getId(), participantMember.getId())) {
@@ -67,6 +70,7 @@ public List<Participant> getTeam(Long roomId) {
6770
return participantReader.findAllByRoomIdAndParticipantType(roomId, ParticipantType.TEAM);
6871
}
6972

73+
@Transactional
7074
public void updateTeam(Room room, List<String> emails) {
7175
List<Participant> team = this.getTeam(room.getId());
7276
for (Participant participant : team) {
@@ -87,7 +91,14 @@ public void validatePresenter(Long roomId, Long memberId) {
8791
}
8892
}
8993

94+
@Transactional
9095
public void deleteParticipantByRoomId(Long roomId) {
9196
participantRepository.deleteByRoomId(roomId);
9297
}
98+
99+
@Transactional
100+
public void updateExitAt(Long roomId, Long memberId) {
101+
Participant participant = participantReader.getByRoomIdAndMemberId(roomId, memberId);
102+
participant.updateExitAt();
103+
}
93104
}

0 commit comments

Comments
 (0)