Skip to content

Commit c94c07c

Browse files
authored
Merge pull request #69 from YAPP-Github/feat/T3-175
[T3-175] 안드로이드 앱 버전 검증 API
2 parents 2226273 + 1ef981b commit c94c07c

21 files changed

Lines changed: 187 additions & 36 deletions

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package bitnagil.bitnagil_backend.appVersion.Repository;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
5+
import bitnagil.bitnagil_backend.appVersion.domain.AndroidAppVersion;
6+
7+
public interface AndroidAppVersionRepository extends JpaRepository<AndroidAppVersion, Long> {
8+
9+
// major, minor가 가장 높은 AndroidAppVersion을 조회
10+
AndroidAppVersion findFirstByOrderByMajorDescMinorDesc();
11+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package bitnagil.bitnagil_backend.appVersion.controller;
2+
3+
import org.springframework.web.bind.annotation.GetMapping;
4+
import org.springframework.web.bind.annotation.RequestMapping;
5+
import org.springframework.web.bind.annotation.RequestParam;
6+
import org.springframework.web.bind.annotation.RestController;
7+
8+
import bitnagil.bitnagil_backend.appVersion.controller.spec.AndroidAppVersionSpec;
9+
import bitnagil.bitnagil_backend.appVersion.response.ForceUpdateResponse;
10+
import bitnagil.bitnagil_backend.appVersion.service.AndroidAppVersionService;
11+
import bitnagil.bitnagil_backend.global.response.CustomResponseDto;
12+
import lombok.RequiredArgsConstructor;
13+
14+
@RestController
15+
@RequiredArgsConstructor
16+
@RequestMapping(value = "/api/v1/version")
17+
public class AndroidAppVersionController implements AndroidAppVersionSpec {
18+
19+
private final AndroidAppVersionService androidAppVersionService;
20+
21+
@GetMapping("/android/check")
22+
public CustomResponseDto<ForceUpdateResponse> validateForceUpdateRequired(
23+
@RequestParam int major,
24+
@RequestParam int minor,
25+
// 추후에 patch를 최소 버전 기준에 추가될 때 사용하기 위함
26+
@RequestParam int patch) {
27+
28+
return CustomResponseDto.from(androidAppVersionService.validateForceUpdateRequired(major, minor));
29+
}
30+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package bitnagil.bitnagil_backend.appVersion.controller.spec;
2+
3+
import bitnagil.bitnagil_backend.appVersion.response.ForceUpdateResponse;
4+
import bitnagil.bitnagil_backend.global.response.CustomResponseDto;
5+
import bitnagil.bitnagil_backend.global.swagger.ApiTags;
6+
import io.swagger.v3.oas.annotations.Operation;
7+
import io.swagger.v3.oas.annotations.Parameter;
8+
import io.swagger.v3.oas.annotations.Parameters;
9+
import io.swagger.v3.oas.annotations.tags.Tag;
10+
11+
@Tag(name = ApiTags.APP_VERSION)
12+
public interface AndroidAppVersionSpec {
13+
14+
@Operation(
15+
summary = "강제 업데이트 여부 검증",
16+
description = "사용자의 앱 Major, Minor, Patch 버전을 받아 강제 업데이트 필요 여부를 판단합니다."
17+
)
18+
@Parameters({
19+
@Parameter(name = "major", description = "앱 Major 버전", required = true, example = "1"),
20+
@Parameter(name = "minor", description = "앱 Minor 버전", required = true, example = "5"),
21+
@Parameter(name = "patch", description = "앱 Patch 버전 (추후 사용 예정)", required = true, example = "0")
22+
})
23+
CustomResponseDto<ForceUpdateResponse> validateForceUpdateRequired(int major, int minor, int patch);
24+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package bitnagil.bitnagil_backend.appVersion.domain;
2+
3+
import bitnagil.bitnagil_backend.global.entity.BaseTimeEntity;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.GeneratedValue;
6+
import jakarta.persistence.GenerationType;
7+
import jakarta.persistence.Id;
8+
import jakarta.validation.constraints.NotNull;
9+
import lombok.AccessLevel;
10+
import lombok.Getter;
11+
import lombok.NoArgsConstructor;
12+
13+
@Getter
14+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
15+
@Entity
16+
public class AndroidAppVersion extends BaseTimeEntity {
17+
18+
@Id
19+
@GeneratedValue(strategy = GenerationType.IDENTITY)
20+
private Long versionId; // 버전 ID
21+
22+
@NotNull
23+
private Integer major; // 버전의 가장 좌측 숫자
24+
25+
@NotNull
26+
private Integer minor; // 버전의 가장 중앙 숫자
27+
28+
@NotNull
29+
private Integer patch; // 버전의 가장 우측 숫자
30+
}
31+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package bitnagil.bitnagil_backend.appVersion.response;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
7+
@Getter
8+
@AllArgsConstructor
9+
@Builder
10+
public class ForceUpdateResponse {
11+
private boolean forceUpdateYn;
12+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package bitnagil.bitnagil_backend.appVersion.service;
2+
3+
import org.springframework.stereotype.Service;
4+
import org.springframework.transaction.annotation.Transactional;
5+
6+
import bitnagil.bitnagil_backend.appVersion.Repository.AndroidAppVersionRepository;
7+
import bitnagil.bitnagil_backend.appVersion.domain.AndroidAppVersion;
8+
import bitnagil.bitnagil_backend.appVersion.response.ForceUpdateResponse;
9+
import lombok.RequiredArgsConstructor;
10+
11+
@Service
12+
@RequiredArgsConstructor
13+
public class AndroidAppVersionService {
14+
15+
private final AndroidAppVersionRepository androidAppVersionRepository;
16+
17+
@Transactional(readOnly = true)
18+
public ForceUpdateResponse validateForceUpdateRequired(Integer clientMajor, Integer clientMinor) {
19+
20+
AndroidAppVersion latestVersion = androidAppVersionRepository.findFirstByOrderByMajorDescMinorDesc();
21+
22+
// major 비교
23+
if (clientMajor < latestVersion.getMajor()) {
24+
// major 버전이 최소 요구 major 버전보다 낮으면 강제 업데이트 필요
25+
return ForceUpdateResponse.builder()
26+
.forceUpdateYn(true)
27+
.build();
28+
}
29+
30+
if (clientMajor.equals(latestVersion.getMajor())) {
31+
// major 같으면 minor 비교
32+
if (clientMinor < latestVersion.getMinor()) {
33+
return ForceUpdateResponse.builder()
34+
.forceUpdateYn(true)
35+
.build();
36+
}
37+
}
38+
39+
// 강제 업데이트 필요하지 않은 경우
40+
return ForceUpdateResponse.builder()
41+
.forceUpdateYn(false)
42+
.build();
43+
}
44+
}

src/main/java/bitnagil/bitnagil_backend/auth/kakao/domain/CustomOAuth2User.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
import org.springframework.security.core.GrantedAuthority;
77
import org.springframework.security.oauth2.core.user.DefaultOAuth2User;
88

9-
import bitnagil.bitnagil_backend.enums.Role;
10-
import bitnagil.bitnagil_backend.global.entity.HistoryPk;
9+
import bitnagil.bitnagil_backend.user.domain.enums.Role;
1110
import lombok.Getter;
1211

1312
/**

src/main/java/bitnagil/bitnagil_backend/auth/kakao/domain/OAuth2Attribute.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
import java.util.HashMap;
44
import java.util.Map;
55

6-
import bitnagil.bitnagil_backend.enums.SocialType;
6+
import bitnagil.bitnagil_backend.user.domain.enums.SocialType;
77
import bitnagil.bitnagil_backend.global.errorcode.ErrorCode;
88
import bitnagil.bitnagil_backend.global.exception.CustomException;
99
import bitnagil.bitnagil_backend.user.domain.User;
10-
import bitnagil.bitnagil_backend.enums.Role;
10+
import bitnagil.bitnagil_backend.user.domain.enums.Role;
1111
import lombok.Builder;
1212
import lombok.Getter;
1313

src/main/java/bitnagil/bitnagil_backend/auth/kakao/service/CustomOAuth2UserService.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package bitnagil.bitnagil_backend.auth.kakao.service;
22

3-
import java.time.LocalDateTime;
43
import java.util.Collections;
54
import java.util.Map;
65

@@ -17,7 +16,7 @@
1716
import bitnagil.bitnagil_backend.global.errorcode.ErrorCode;
1817
import bitnagil.bitnagil_backend.global.exception.CustomException;
1918
import bitnagil.bitnagil_backend.user.repository.UserRepository;
20-
import bitnagil.bitnagil_backend.enums.SocialType;
19+
import bitnagil.bitnagil_backend.user.domain.enums.SocialType;
2120
import bitnagil.bitnagil_backend.user.domain.User;
2221
import lombok.RequiredArgsConstructor;
2322
import lombok.extern.slf4j.Slf4j;

src/main/java/bitnagil/bitnagil_backend/enums/SocialType.java

Lines changed: 0 additions & 6 deletions
This file was deleted.

0 commit comments

Comments
 (0)