Skip to content

Commit

Permalink
Merge pull request #32 from selab-hs/develop
Browse files Browse the repository at this point in the history
release v1.0.5
  • Loading branch information
HwangHarim authored Jul 23, 2024
2 parents dfc6bd3 + eee2cfb commit 4e44538
Show file tree
Hide file tree
Showing 14 changed files with 141 additions and 13 deletions.
10 changes: 10 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ dependencies {
/** database */
runtimeOnly 'com.mysql:mysql-connector-j'

/**Querydsl*/
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

/** swagger */
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.4.0'
runtimeOnly 'com.github.therapi:therapi-runtime-javadoc-scribe:0.15.0'
Expand Down Expand Up @@ -73,3 +79,7 @@ sourceSets {
}
}
}

clean {
delete file('src/main/generated')
}
3 changes: 2 additions & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
version='1.0.5-SNAPSHOT'
version='1.0.5'

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.urlshortener.actionlog.repository;

import com.urlshortener.actionlog.domain.SystemActionLog;

import java.util.List;

public interface SystemActionLogCustomRepository {
List<SystemActionLog> findNullMemberIdLogsLimitedTo1000();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.urlshortener.actionlog.repository;

import com.querydsl.jpa.impl.JPAQueryFactory;
import com.urlshortener.actionlog.domain.SystemActionLog;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;

import static com.urlshortener.actionlog.domain.QSystemActionLog.systemActionLog;

@Repository
@AllArgsConstructor
public class SystemActionLogCustomRepositoryImpl implements SystemActionLogCustomRepository {
private final JPAQueryFactory query;

@Override
public List<SystemActionLog> findNullMemberIdLogsLimitedTo1000() {
return query.selectFrom(systemActionLog)
.where(systemActionLog.memberId.isNull())
.limit(1000)
.fetch();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.urlshortener.actionlog.domain.SystemActionLog;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -11,13 +10,10 @@

@Repository
@Transactional(readOnly = true)
public interface SystemActionLogRepository extends JpaRepository<SystemActionLog, Long> {
public interface SystemActionLogRepository extends JpaRepository<SystemActionLog, Long>, SystemActionLogCustomRepository {
Long countByCreatedAtBetween(LocalDateTime startAt, LocalDateTime endAt);

List<SystemActionLog> findByUrlId(Long urlId);

Long countByUrlId(Long urlId);

@Query("SELECT sal FROM SystemActionLog sal WHERE sal.memberId IS NULL")
List<SystemActionLog> findNullMemberIdLogsLimitedTo1000();
}
8 changes: 8 additions & 0 deletions src/main/java/com/urlshortener/config/database/JpaConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,16 @@

import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableJpaAuditing
@EnableJpaRepositories(basePackages = {
"com.urlshortener.actionlog.repository", // 해당 리포지토리 포함되어 있는지 확인
"com.urlshortener.shortener.repository",
"com.urlshortener.member.repository"
}, repositoryImplementationPostfix = "Impl")
@EnableTransactionManagement
public class JpaConfig {
}
18 changes: 18 additions & 0 deletions src/main/java/com/urlshortener/config/database/QueryDslConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.urlshortener.config.database;

import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QueryDslConfig {
@PersistenceContext
private EntityManager entityManager;

@Bean
public JPAQueryFactory jpaQueryFactory() {
return new JPAQueryFactory(entityManager);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.urlshortener.member.service.MemberService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
Expand All @@ -25,8 +26,10 @@ public class MemberRestController {
* @return
*/
@PostMapping
public ResponseEntity<?> createMember(@RequestBody JoinMemberRequest request) {
var member = memberService.createMember(request);
public ResponseEntity<?> createMember(
@RequestBody JoinMemberRequest request,
HttpServletRequest httpRequest) {
var member = memberService.createMember(request, httpRequest);

return ResponseDto.created(member);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,21 @@
import com.urlshortener.member.domain.dto.response.MemberResponseDto;
import com.urlshortener.member.domain.vo.Email;
import com.urlshortener.member.repository.MemberRepository;
import com.urlshortener.shortener.repository.ShortUrlRepository;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import static com.urlshortener.util.HttpUtil.getClientIdFromCookie;

@Slf4j
@Service
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
private final ShortUrlRepository shortUrlRepository;

/**
* 회원가입 기능을 수행하는 메서드
Expand All @@ -26,13 +31,16 @@ public class MemberService {
* @return
*/
@Transactional
public MemberResponseDto createMember(JoinMemberRequest request) {
public MemberResponseDto createMember(JoinMemberRequest request, HttpServletRequest httpRequest) {
if (memberRepository.existsByEmail(new Email(request.getEmail()))) {
throw new DuplicateMemberException(ErrorMessage.DUPLICATE_MEMBER_EXCEPTION);
}
var member = memberRepository.save(
new Member(request.getEmail(),
request.getPassword()));
shortUrlRepository.updateShortenerUrlMemberId(
getClientIdFromCookie(httpRequest),
member.getId());

return MemberResponseDto.from(member.getId(), member.getEmail().getEmail());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.urlshortener.shortener.repository;

public interface ShortUrlCustomRepository {
void updateShortenerUrlMemberId(String uuid, Long memberId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.urlshortener.shortener.repository;

import com.querydsl.jpa.impl.JPAQueryFactory;
import com.urlshortener.shortener.domain.QShortUrl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Repository
@RequiredArgsConstructor
public class ShortUrlCustomRepositoryImpl implements ShortUrlCustomRepository {

private final JPAQueryFactory query;

@Override
@Transactional
public void updateShortenerUrlMemberId(String uuid, Long memberId) {
final int batchSize = 1000;
long lastId = 0;
List<Long> ids;

do {
ids = query.select(QShortUrl.shortUrl.id)
.from(QShortUrl.shortUrl)
.where(QShortUrl.shortUrl.uuid.eq(uuid)
.and(QShortUrl.shortUrl.id.gt(lastId)))
.orderBy(QShortUrl.shortUrl.id.asc())
.limit(batchSize)
.fetch();

if (!ids.isEmpty()) {
query.update(QShortUrl.shortUrl)
.where(QShortUrl.shortUrl.id.in(ids))
.set(QShortUrl.shortUrl.memberId, memberId)
.execute();

lastId = ids.get(ids.size() - 1); // Update last processed id
}
} while (ids.size() == batchSize); // 마지막 배치가 최대 크기에 도달했을 때 반복
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

@Transactional(readOnly = true)
@Repository
public interface ShortUrlRepository extends JpaRepository<ShortUrl, Long> {
public interface ShortUrlRepository extends JpaRepository<ShortUrl, Long>, ShortUrlCustomRepository {
List<ShortUrl> findAllByIdIn(List<Long> ids);

List<ShortUrl> findByMemberId(Long memberId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,12 @@ public ShortUrlModel getShortUrl(long originUrlId) {
});
}

/**
* 유저가 생성한 url 을 제공하는 메서드
*
* @param user
* @return
*/
public List<ShortCodeAndSystemActionLogResponse> getFindByMemberId(AuthUser user) {
if (user == null) {
throw new IllegalStateException();
Expand Down
3 changes: 0 additions & 3 deletions src/main/java/com/urlshortener/util/HttpUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,10 @@
import com.urlshortener.error.exception.url.NotFoundClientIdHeaderException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Value;

import java.util.Arrays;

public class HttpUtil {
@Value("${security.separator}")
public static String TOKEN_CODE;

/**
* ip 검사
Expand Down

0 comments on commit 4e44538

Please sign in to comment.