Skip to content

Commit 59ea5ed

Browse files
authored
[MERGE] Merge pull request #234 from Team-WSS/feat/#233
[FEAT] 최소 지원 버전 API 구현
2 parents ffb61d2 + 9baaf10 commit 59ea5ed

File tree

10 files changed

+230
-1
lines changed

10 files changed

+230
-1
lines changed

src/main/java/org/websoso/WSSServer/config/SecurityConfig.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ public class SecurityConfig {
4141
"/login/callback",
4242
"/login/apple",
4343
"/auth/login/kakao",
44-
"/auth/login/apple"
44+
"/auth/login/apple",
45+
"/minimum-version"
4546
};
4647

4748
@Bean
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package org.websoso.WSSServer.controller;
2+
3+
import static org.springframework.http.HttpStatus.NO_CONTENT;
4+
import static org.springframework.http.HttpStatus.OK;
5+
6+
import jakarta.validation.Valid;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.web.bind.annotation.GetMapping;
10+
import org.springframework.web.bind.annotation.PostMapping;
11+
import org.springframework.web.bind.annotation.RequestBody;
12+
import org.springframework.web.bind.annotation.RequestParam;
13+
import org.springframework.web.bind.annotation.RestController;
14+
import org.websoso.WSSServer.dto.AppVersion.MinimumVersionGetResponse;
15+
import org.websoso.WSSServer.dto.AppVersion.MinimumVersionUpdateRequest;
16+
import org.websoso.WSSServer.service.AppVersionService;
17+
18+
@RestController
19+
@RequiredArgsConstructor
20+
public class AppVersionController {
21+
22+
private final AppVersionService appVersionService;
23+
24+
@GetMapping("/minimum-version")
25+
public ResponseEntity<MinimumVersionGetResponse> getMinimumVersion(@RequestParam String os) {
26+
return ResponseEntity
27+
.status(OK)
28+
.body(appVersionService.getMinimumVersion(os));
29+
}
30+
31+
@PostMapping("/minimum-version")
32+
public ResponseEntity<Void> updateMinimumVersion(@Valid @RequestBody MinimumVersionUpdateRequest request) {
33+
appVersionService.updateMinimumVersion(request);
34+
return ResponseEntity
35+
.status(NO_CONTENT)
36+
.build();
37+
}
38+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.websoso.WSSServer.domain;
2+
3+
import static jakarta.persistence.EnumType.STRING;
4+
5+
import jakarta.persistence.Column;
6+
import jakarta.persistence.Entity;
7+
import jakarta.persistence.EntityListeners;
8+
import jakarta.persistence.Enumerated;
9+
import jakarta.persistence.Id;
10+
import java.time.LocalDateTime;
11+
import lombok.AccessLevel;
12+
import lombok.Getter;
13+
import lombok.NoArgsConstructor;
14+
import org.springframework.data.annotation.LastModifiedDate;
15+
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
16+
import org.websoso.WSSServer.domain.common.OS;
17+
18+
@Entity
19+
@Getter
20+
@EntityListeners(AuditingEntityListener.class)
21+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
22+
public class MinimumVersion {
23+
24+
@Id
25+
@Enumerated(STRING)
26+
@Column(columnDefinition = "varchar(10)", nullable = false)
27+
private OS os;
28+
29+
@Column(columnDefinition = "varchar(20)", nullable = false)
30+
private String minimumVersion;
31+
32+
@LastModifiedDate
33+
@Column(nullable = false)
34+
private LocalDateTime updateDate;
35+
36+
private MinimumVersion(OS os, String minimumVersion) {
37+
this.os = os;
38+
this.minimumVersion = minimumVersion;
39+
this.updateDate = LocalDateTime.now();
40+
}
41+
42+
public static MinimumVersion create(OS os, String minimumVersion) {
43+
return new MinimumVersion(os, minimumVersion);
44+
}
45+
46+
public void updateMinimumVersion(String minimumVersion) {
47+
this.minimumVersion = minimumVersion;
48+
}
49+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.websoso.WSSServer.domain.common;
2+
3+
import static org.websoso.WSSServer.exception.error.CustomMinimumVersionError.OS_NOT_FOUND;
4+
5+
import java.util.Arrays;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Getter;
8+
import org.websoso.WSSServer.exception.exception.CustomMinimumVersionException;
9+
10+
@Getter
11+
@AllArgsConstructor
12+
public enum OS {
13+
14+
ANDROID("android"),
15+
IOS("ios");
16+
17+
private final String label;
18+
19+
public static OS fromLabel(String osLabel) {
20+
return Arrays.stream(OS.values())
21+
.filter(os -> os.label.equalsIgnoreCase(osLabel))
22+
.findFirst()
23+
.orElseThrow(() -> new CustomMinimumVersionException(OS_NOT_FOUND,
24+
"the requested OS value is invalid or not supported"));
25+
}
26+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.websoso.WSSServer.dto.AppVersion;
2+
3+
import java.time.format.DateTimeFormatter;
4+
import org.websoso.WSSServer.domain.MinimumVersion;
5+
6+
public record MinimumVersionGetResponse(
7+
String minimumVersion,
8+
String updateDate
9+
) {
10+
11+
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
12+
13+
public static MinimumVersionGetResponse of(MinimumVersion minimumVersion) {
14+
return new MinimumVersionGetResponse(
15+
minimumVersion.getMinimumVersion(),
16+
minimumVersion.getUpdateDate().format(FORMATTER)
17+
);
18+
}
19+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.websoso.WSSServer.dto.AppVersion;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
5+
public record MinimumVersionUpdateRequest(
6+
@NotBlank(message = "os는 비어 있거나, 공백일 수 없습니다.")
7+
String os,
8+
@NotBlank(message = "최소 지원 버전은 비어 있거나, 공백일 수 없습니다.")
9+
String minimumVersion
10+
) {
11+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.websoso.WSSServer.exception.error;
2+
3+
import static org.springframework.http.HttpStatus.BAD_REQUEST;
4+
import static org.springframework.http.HttpStatus.NOT_FOUND;
5+
6+
import lombok.AllArgsConstructor;
7+
import lombok.Getter;
8+
import org.springframework.http.HttpStatus;
9+
import org.websoso.WSSServer.exception.common.ICustomError;
10+
11+
@AllArgsConstructor
12+
@Getter
13+
public enum CustomMinimumVersionError implements ICustomError {
14+
15+
OS_NOT_FOUND("MINIMUM-VERSION-001", "요청한 OS 값을 찾을 수 없습니다.", NOT_FOUND),
16+
MINIMUM_VERSION_NOT_FOUND("MINIMUM-VERSION-002", "해당 OS에 대한 최소 지원 버전을 찾을 수 없습니다.", BAD_REQUEST);
17+
18+
private final String code;
19+
private final String description;
20+
private final HttpStatus statusCode;
21+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.websoso.WSSServer.exception.exception;
2+
3+
import lombok.Getter;
4+
import org.websoso.WSSServer.exception.common.AbstractCustomException;
5+
import org.websoso.WSSServer.exception.error.CustomMinimumVersionError;
6+
7+
@Getter
8+
public class CustomMinimumVersionException extends AbstractCustomException {
9+
10+
public CustomMinimumVersionException(CustomMinimumVersionError customMinimumVersionError, String message) {
11+
super(customMinimumVersionError, message);
12+
}
13+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.websoso.WSSServer.repository;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
import org.springframework.stereotype.Repository;
5+
import org.websoso.WSSServer.domain.MinimumVersion;
6+
import org.websoso.WSSServer.domain.common.OS;
7+
8+
@Repository
9+
public interface MinimumVersionRepository extends JpaRepository<MinimumVersion, OS> {
10+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.websoso.WSSServer.service;
2+
3+
import static org.websoso.WSSServer.exception.error.CustomMinimumVersionError.MINIMUM_VERSION_NOT_FOUND;
4+
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.stereotype.Service;
7+
import org.springframework.transaction.annotation.Transactional;
8+
import org.websoso.WSSServer.domain.MinimumVersion;
9+
import org.websoso.WSSServer.domain.common.OS;
10+
import org.websoso.WSSServer.dto.AppVersion.MinimumVersionGetResponse;
11+
import org.websoso.WSSServer.dto.AppVersion.MinimumVersionUpdateRequest;
12+
import org.websoso.WSSServer.exception.exception.CustomMinimumVersionException;
13+
import org.websoso.WSSServer.repository.MinimumVersionRepository;
14+
15+
@Service
16+
@RequiredArgsConstructor
17+
@Transactional
18+
public class AppVersionService {
19+
20+
private final MinimumVersionRepository minimumVersionRepository;
21+
22+
@Transactional(readOnly = true)
23+
public MinimumVersionGetResponse getMinimumVersion(String os) {
24+
return MinimumVersionGetResponse.of(minimumVersionRepository.findById(OS.fromLabel(os))
25+
.orElseThrow(() -> new CustomMinimumVersionException(MINIMUM_VERSION_NOT_FOUND,
26+
"the minimum supported version for the specified OS could not be found")));
27+
}
28+
29+
public void updateMinimumVersion(MinimumVersionUpdateRequest request) {
30+
OS os = OS.fromLabel(request.os());
31+
MinimumVersion minimumVersion = minimumVersionRepository.findById(os).orElse(null);
32+
33+
if (minimumVersion == null) {
34+
minimumVersion = MinimumVersion.create(os, request.minimumVersion());
35+
} else {
36+
minimumVersion.updateMinimumVersion(request.minimumVersion());
37+
}
38+
39+
minimumVersionRepository.save(minimumVersion);
40+
}
41+
}

0 commit comments

Comments
 (0)