From 014f6545efe18d64b246d8b9b557e787c4df67af Mon Sep 17 00:00:00 2001 From: Jaewon Lee Date: Sat, 21 Sep 2024 12:28:34 +0900 Subject: [PATCH 1/4] =?UTF-8?q?Feat:=20ServerVersionService=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/server/ServerVersionService.java | 10 ++++++++++ .../presentation/v1/server/ServerController.java | 11 ++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/dnd/runus/application/server/ServerVersionService.java diff --git a/src/main/java/com/dnd/runus/application/server/ServerVersionService.java b/src/main/java/com/dnd/runus/application/server/ServerVersionService.java new file mode 100644 index 00000000..5f2b932f --- /dev/null +++ b/src/main/java/com/dnd/runus/application/server/ServerVersionService.java @@ -0,0 +1,10 @@ +package com.dnd.runus.application.server; + +import org.springframework.stereotype.Service; + +@Service +public class ServerVersionService { + public boolean isUpdateRequired(Version version, DeviceType client) { + return version.isOlderThan(client.getMinSupportedVersion()); + } +} diff --git a/src/main/java/com/dnd/runus/presentation/v1/server/ServerController.java b/src/main/java/com/dnd/runus/presentation/v1/server/ServerController.java index 083844a1..48cf30d6 100644 --- a/src/main/java/com/dnd/runus/presentation/v1/server/ServerController.java +++ b/src/main/java/com/dnd/runus/presentation/v1/server/ServerController.java @@ -1,5 +1,8 @@ package com.dnd.runus.presentation.v1.server; +import com.dnd.runus.application.server.DeviceType; +import com.dnd.runus.application.server.ServerVersionService; +import com.dnd.runus.application.server.Version; import com.dnd.runus.presentation.v1.server.dto.response.VersionStatusResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -15,10 +18,12 @@ @RequestMapping("api/v1/servers") public class ServerController { + private final ServerVersionService serverVersionService; + @GetMapping("versions") - @Operation(summary = "앱의 버전을 확인합니다.") + @Operation(summary = "버전 체크", description = "기기의 앱 버전을 확인하고 앱 업데이트가 필요한지 여부를 반환합니다.") public VersionStatusResponse checkVersion(@RequestParam String version) { - // FIXME: 버전 체크 로직 구현 필요 - return new VersionStatusResponse(false); + boolean updateRequired = serverVersionService.isUpdateRequired(Version.parse(version), DeviceType.IOS); + return new VersionStatusResponse(updateRequired); } } From 6c5c082c22cacca9efaa36f52cd12466c29918df Mon Sep 17 00:00:00 2001 From: Jaewon Lee Date: Sat, 21 Sep 2024 12:29:45 +0900 Subject: [PATCH 2/4] =?UTF-8?q?Feat:=20DeviceType,=20Version=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runus/application/server/DeviceType.java | 14 ++++++++++ .../dnd/runus/application/server/Version.java | 27 +++++++++++++++++++ .../v1/server/ServerController.java | 2 +- 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/dnd/runus/application/server/DeviceType.java create mode 100644 src/main/java/com/dnd/runus/application/server/Version.java diff --git a/src/main/java/com/dnd/runus/application/server/DeviceType.java b/src/main/java/com/dnd/runus/application/server/DeviceType.java new file mode 100644 index 00000000..3302f1b7 --- /dev/null +++ b/src/main/java/com/dnd/runus/application/server/DeviceType.java @@ -0,0 +1,14 @@ +package com.dnd.runus.application.server; + +import lombok.Getter; + +@Getter +public enum DeviceType { + IOS(new Version(1, 0, 0)), + ; + private final Version minSupportedVersion; + + DeviceType(Version version) { + this.minSupportedVersion = version; + } +} diff --git a/src/main/java/com/dnd/runus/application/server/Version.java b/src/main/java/com/dnd/runus/application/server/Version.java new file mode 100644 index 00000000..cdc08ced --- /dev/null +++ b/src/main/java/com/dnd/runus/application/server/Version.java @@ -0,0 +1,27 @@ +package com.dnd.runus.application.server; + +public record Version(int major, int minor, int patch) implements Comparable { + public static Version parse(String version) { + String[] split = version.split("\\."); + if (split.length < 2 || split.length > 3) { + throw new IllegalArgumentException("Invalid version format [" + version + "]"); + } + int patch = split.length > 2 ? Integer.parseInt(split[2]) : 0; + return new Version(Integer.parseInt(split[0]), Integer.parseInt(split[1]), patch); + } + + @Override + public int compareTo(Version o) { + if (major != o.major) { + return major - o.major; + } + if (minor != o.minor) { + return minor - o.minor; + } + return patch - o.patch; + } + + public boolean isOlderThan(Version version) { + return compareTo(version) < 0; + } +} diff --git a/src/main/java/com/dnd/runus/presentation/v1/server/ServerController.java b/src/main/java/com/dnd/runus/presentation/v1/server/ServerController.java index 48cf30d6..013c8075 100644 --- a/src/main/java/com/dnd/runus/presentation/v1/server/ServerController.java +++ b/src/main/java/com/dnd/runus/presentation/v1/server/ServerController.java @@ -21,7 +21,7 @@ public class ServerController { private final ServerVersionService serverVersionService; @GetMapping("versions") - @Operation(summary = "버전 체크", description = "기기의 앱 버전을 확인하고 앱 업데이트가 필요한지 여부를 반환합니다.") + @Operation(summary = "앱 버전 지원 여부 확인", description = "기기의 앱 버전을 확인하고 앱 업데이트가 필요한지 여부를 반환합니다.") public VersionStatusResponse checkVersion(@RequestParam String version) { boolean updateRequired = serverVersionService.isUpdateRequired(Version.parse(version), DeviceType.IOS); return new VersionStatusResponse(updateRequired); From 51a9ea33adac60ca6d7a33b2226d66d85f8af441 Mon Sep 17 00:00:00 2001 From: Jaewon Lee Date: Sat, 21 Sep 2024 12:42:32 +0900 Subject: [PATCH 3/4] =?UTF-8?q?Test:=20Version=20parse,=20=EB=B9=84?= =?UTF-8?q?=EA=B5=90=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runus/application/server/VersionTest.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/test/java/com/dnd/runus/application/server/VersionTest.java diff --git a/src/test/java/com/dnd/runus/application/server/VersionTest.java b/src/test/java/com/dnd/runus/application/server/VersionTest.java new file mode 100644 index 00000000..85cc29fd --- /dev/null +++ b/src/test/java/com/dnd/runus/application/server/VersionTest.java @@ -0,0 +1,58 @@ +package com.dnd.runus.application.server; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +import static org.junit.jupiter.api.Assertions.*; + +class VersionTest { + + @Test + void parse() { + Version version = Version.parse("1.2.3"); + assertEquals(1, version.major()); + assertEquals(2, version.minor()); + assertEquals(3, version.patch()); + } + + @Test + void parseWithoutPatch() { + Version version = Version.parse("1.2"); + assertEquals(1, version.major()); + assertEquals(2, version.minor()); + assertEquals(0, version.patch()); + } + + @ParameterizedTest + @MethodSource("compareToProvider") + void compareTo(Version version1, Version version2, int expected) { + assertEquals(expected, version1.compareTo(version2)); + } + + @Test + void isOlderThan() { + Version version = new Version(1, 2, 3); + + assertTrue(version.isOlderThan(new Version(1, 2, 4))); + assertTrue(version.isOlderThan(new Version(1, 3, 0))); + assertTrue(version.isOlderThan(new Version(2, 0, 0))); + + assertFalse(version.isOlderThan(new Version(1, 2, 3))); + assertFalse(version.isOlderThan(new Version(1, 2, 2))); + assertFalse(version.isOlderThan(new Version(1, 1, 0))); + assertFalse(version.isOlderThan(new Version(0, 0, 0))); + } + + private static Object[] compareToProvider() { + return new Object[] { + new Object[] {new Version(1, 2, 3), new Version(1, 2, 3), 0}, + new Object[] {new Version(1, 2, 3), new Version(1, 2, 4), -1}, + new Object[] {new Version(1, 2, 3), new Version(1, 3, 0), -1}, + new Object[] {new Version(1, 2, 3), new Version(2, 0, 0), -1}, + new Object[] {new Version(1, 2, 3), new Version(1, 2, 2), 1}, + new Object[] {new Version(1, 2, 3), new Version(1, 1, 0), 1}, + new Object[] {new Version(1, 2, 3), new Version(0, 0, 0), 1}, + }; + } +} From f166d337dd25d20d70f5181dbab8785a997c98bf Mon Sep 17 00:00:00 2001 From: Jaewon Lee Date: Sat, 21 Sep 2024 12:46:10 +0900 Subject: [PATCH 4/4] =?UTF-8?q?Docs:=20=EC=95=B1=20=EB=B2=84=EC=A0=84=20?= =?UTF-8?q?=EC=A7=80=EC=9B=90=20=ED=99=95=EC=9D=B8=20api=20=ED=8C=8C?= =?UTF-8?q?=EB=9D=BC=EB=AF=B8=ED=84=B0=20=EC=98=88=EC=A0=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dnd/runus/presentation/v1/server/ServerController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/dnd/runus/presentation/v1/server/ServerController.java b/src/main/java/com/dnd/runus/presentation/v1/server/ServerController.java index 013c8075..32a0671d 100644 --- a/src/main/java/com/dnd/runus/presentation/v1/server/ServerController.java +++ b/src/main/java/com/dnd/runus/presentation/v1/server/ServerController.java @@ -5,6 +5,7 @@ import com.dnd.runus.application.server.Version; import com.dnd.runus.presentation.v1.server.dto.response.VersionStatusResponse; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; @@ -22,6 +23,7 @@ public class ServerController { @GetMapping("versions") @Operation(summary = "앱 버전 지원 여부 확인", description = "기기의 앱 버전을 확인하고 앱 업데이트가 필요한지 여부를 반환합니다.") + @Parameter(name = "version", description = "앱 버전", required = true, example = "1.0.0") public VersionStatusResponse checkVersion(@RequestParam String version) { boolean updateRequired = serverVersionService.isUpdateRequired(Version.parse(version), DeviceType.IOS); return new VersionStatusResponse(updateRequired);