Skip to content

Commit

Permalink
[Feat] 디스코드 알람 파일 조회 (#61)
Browse files Browse the repository at this point in the history
* chore : querydsl 설정 추가

* fix : member id명 수정

* feat : 디스코드 알람 파일 조회 로직 구현

* fix : 트랜잭션 적용 변경
  • Loading branch information
iiqcov authored Nov 17, 2024
1 parent c26cbd1 commit 1a6173c
Show file tree
Hide file tree
Showing 13 changed files with 164 additions and 3 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,6 @@ out/

### VS Code ###
.vscode/

### Querydsl ###
/src/main/generated/
19 changes: 19 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ dependencies {

// QueryDSL
implementation "com.querydsl:querydsl-jpa:${querydslVersion}:jakarta"
implementation "com.querydsl:querydsl-apt:${querydslVersion}:jakarta"
annotationProcessor "com.querydsl:querydsl-apt:${querydslVersion}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
Expand Down Expand Up @@ -137,6 +141,7 @@ spotless {
removeUnusedImports()
trimTrailingWhitespace()
endWithNewline()
targetExclude("src/main/generated/**/*.java")
}
}

Expand All @@ -162,3 +167,17 @@ tasks.register('makeGitHooksExecutable', Exec) {
tasks.withType(JavaCompile) {
dependsOn("makeGitHooksExecutable")
}

def querydslDir = 'src/main/generated'

sourceSets {
main.java.srcDirs += [ querydslDir ]
}

tasks.withType(JavaCompile) {
options.annotationProcessorGeneratedSourcesDirectory = file(querydslDir)
}

clean {
delete file(querydslDir)
}
25 changes: 25 additions & 0 deletions src/main/java/gigedi/dev/domain/discord/api/AlarmController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package gigedi.dev.domain.discord.api;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import gigedi.dev.domain.discord.application.AlarmService;
import gigedi.dev.domain.discord.dto.response.GetAlarmFileListResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;

@Tag(name = "Alarm", description = "Alarm 관련 API")
@RestController
@RequestMapping("/api/v1/alarm")
@RequiredArgsConstructor
public class AlarmController {
private final AlarmService alarmService;

@Operation(summary = "알람 정보 파일 조회", description = "알람이 설정되어있는 파일 리스틀를 조회하는 API")
@GetMapping("/discord")
public GetAlarmFileListResponse discordSocialLogin() {
return alarmService.getAlarmFileList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package gigedi.dev.domain.discord.application;

import java.util.List;
import java.util.stream.Collectors;

import org.springframework.stereotype.Service;

import gigedi.dev.domain.discord.domain.Discord;
import gigedi.dev.domain.discord.dto.response.AlarmFileResponse;
import gigedi.dev.domain.discord.dto.response.GetAlarmFileListResponse;
import gigedi.dev.domain.file.application.AuthorityService;
import gigedi.dev.domain.member.domain.Member;
import gigedi.dev.global.util.MemberUtil;
import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class AlarmService {
private final DiscordService discordService;
private final AuthorityService authorityService;
private final MemberUtil memberUtil;

public GetAlarmFileListResponse getAlarmFileList() {
Member currentMember = memberUtil.getCurrentMember();
Discord connectedDiscord = discordService.findConnectedDiscord();
List<AlarmFileResponse> alarmList =
authorityService.getRelatedAuthorityList(currentMember.getId()).stream()
.map(AlarmFileResponse::from)
.collect(Collectors.toList());
return new GetAlarmFileListResponse(connectedDiscord.getEmail(), alarmList);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,30 @@
import lombok.RequiredArgsConstructor;

@Service
@Transactional
@RequiredArgsConstructor
public class DiscordService {
private final MemberUtil memberUtil;
private final DiscordRepository discordRepository;

@Transactional
public Discord saveDiscord(Discord discord) {
return discordRepository.save(discord);
}

@Transactional(readOnly = true)
public Discord findConnectedDiscord() {
Member currentMember = memberUtil.getCurrentMember();
return discordRepository
.findByMember(currentMember)
.orElseThrow(() -> new CustomException(ErrorCode.DISCORD_ACCOUNT_NOT_FOUND));
}

@Transactional
public void deleteDiscord(Discord discord) {
discordRepository.delete(discord);
}

@Transactional(readOnly = true)
public void validateDiscordExistsForMember() {
Member currentMember = memberUtil.getCurrentMember();
if (discordRepository.findByMember(currentMember).isPresent()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package gigedi.dev.domain.discord.dto.response;

import gigedi.dev.domain.file.domain.Authority;

public record AlarmFileResponse(Long authorityId, String fileName, boolean isAlarmActive) {
public static AlarmFileResponse from(Authority authority) {
return new AlarmFileResponse(
authority.getAuthorityId(), authority.getFile().getFileName(), authority.isAlarm());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package gigedi.dev.domain.discord.dto.response;

import java.util.List;

public record GetAlarmFileListResponse(String discordEmail, List<AlarmFileResponse> alarmList) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package gigedi.dev.domain.file.application;

import java.util.List;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import gigedi.dev.domain.file.dao.AuthorityRepository;
import gigedi.dev.domain.file.domain.Authority;
import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class AuthorityService {
private final AuthorityRepository authorityRepository;

@Transactional(readOnly = true)
public List<Authority> getRelatedAuthorityList(Long memberId) {
return authorityRepository.findRelatedAuthorities(memberId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import gigedi.dev.domain.file.domain.File;

@Repository
public interface AuthorityRepository extends JpaRepository<Authority, Long> {
public interface AuthorityRepository
extends JpaRepository<Authority, Long>, AuthorityRepositoryCustom {
Optional<Authority> findByFigmaAndFile(Figma figma, File file);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package gigedi.dev.domain.file.dao;

import java.util.List;

import gigedi.dev.domain.file.domain.Authority;

public interface AuthorityRepositoryCustom {
List<Authority> findRelatedAuthorities(Long memberId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package gigedi.dev.domain.file.dao;

import java.util.List;

import com.querydsl.jpa.impl.JPAQueryFactory;

import gigedi.dev.domain.auth.domain.QFigma;
import gigedi.dev.domain.file.domain.Authority;
import gigedi.dev.domain.file.domain.QAuthority;
import gigedi.dev.domain.member.domain.QMember;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class AuthorityRepositoryImpl implements AuthorityRepositoryCustom {
private final JPAQueryFactory queryFactory;

@Override
public List<Authority> findRelatedAuthorities(Long memberId) {
return queryFactory
.selectFrom(QAuthority.authority)
.join(QAuthority.authority.figma, QFigma.figma)
.join(QFigma.figma.member, QMember.member)
.where(
QMember.member
.id
.eq(memberId)
.and(QMember.member.deletedAt.isNull())
.and(QFigma.figma.deletedAt.isNull()))
.fetch();
}
}
2 changes: 1 addition & 1 deletion src/main/java/gigedi/dev/domain/member/domain/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class Member extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_id")
private Long Id;
private Long id;

@Embedded private OauthInfo oauthInfo;

Expand Down
2 changes: 2 additions & 0 deletions src/main/java/gigedi/dev/global/util/MemberUtil.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package gigedi.dev.global.util;

import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import gigedi.dev.domain.member.dao.MemberRepository;
import gigedi.dev.domain.member.domain.Member;
Expand All @@ -15,6 +16,7 @@ public class MemberUtil {
private final SecurityUtil securityUtil;
private final MemberRepository memberRepository;

@Transactional(readOnly = true)
public Member getCurrentMember() {
return memberRepository
.findById(securityUtil.getCurrentMemberId())
Expand Down

0 comments on commit 1a6173c

Please sign in to comment.