diff --git a/src/main/java/com/m3pro/groundflip/controller/VersionController.java b/src/main/java/com/m3pro/groundflip/controller/VersionController.java new file mode 100644 index 00000000..f3d6376f --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/controller/VersionController.java @@ -0,0 +1,41 @@ +package com.m3pro.groundflip.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.m3pro.groundflip.domain.dto.Response; +import com.m3pro.groundflip.domain.dto.version.VersionRequest; +import com.m3pro.groundflip.domain.dto.version.VersionResponse; +import com.m3pro.groundflip.service.VersionService; + +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; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api") +@Tag(name = "version", description = "앱 버전 API") +public class VersionController { + private final VersionService versionService; + + @Operation(summary = "앱 버전 post", description = "현재 앱 버전을 등록한다.") + @PostMapping("/version") + public Response postVersion( + @Parameter(description = "버전 저장", required = true) + @RequestBody VersionRequest versionRequest + ) { + versionService.postVersion(versionRequest); + return Response.createSuccessWithNoData(); + } + + @Operation(summary = "앱 버전 get", description = "현재 앱 버전을 가져온다.") + @GetMapping("/version") + public Response getVersion() { + return Response.createSuccess(versionService.getVersion()); + } +} diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java new file mode 100644 index 00000000..a3ccbc4c --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionRequest.java @@ -0,0 +1,17 @@ +package com.m3pro.groundflip.domain.dto.version; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Schema(title = "앱 버전 등록") +public class VersionRequest { + @Schema(description = "앱 버전", example = "1.0.1") + private String version; +} diff --git a/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java new file mode 100644 index 00000000..3e951f35 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/domain/dto/version/VersionResponse.java @@ -0,0 +1,22 @@ +package com.m3pro.groundflip.domain.dto.version; + +import java.time.LocalDateTime; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Schema(title = "앱 버전 get") +public class VersionResponse { + @Schema(description = "앱 버전", example = "1.0.5") + private String version; + + @Schema(description = "생성날짜", example = "2024-08-11 01:37:22.372436") + private LocalDateTime createdDate; +} diff --git a/src/main/java/com/m3pro/groundflip/domain/entity/AppVersion.java b/src/main/java/com/m3pro/groundflip/domain/entity/AppVersion.java new file mode 100644 index 00000000..840f1552 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/domain/entity/AppVersion.java @@ -0,0 +1,39 @@ +package com.m3pro.groundflip.domain.entity; + +import java.time.LocalDateTime; + +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@Table(name = "app_version") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder +@EntityListeners(AuditingEntityListener.class) +public class AppVersion { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "app_version_id") + private Long id; + + private String version; + + @CreatedDate + @Column(name = "created_date", updatable = false) + private LocalDateTime createdDate; +} diff --git a/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java b/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java new file mode 100644 index 00000000..f72c6610 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/repository/AppVersionRepository.java @@ -0,0 +1,17 @@ +package com.m3pro.groundflip.repository; + +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; + +import com.m3pro.groundflip.domain.entity.AppVersion; + +public interface AppVersionRepository extends CrudRepository { + + @Query(value = """ + SELECT av.* + FROM app_version av + ORDER BY av.created_date DESC + limit 1 + """, nativeQuery = true) + AppVersion findLaestetVersion(); +} diff --git a/src/main/java/com/m3pro/groundflip/service/VersionService.java b/src/main/java/com/m3pro/groundflip/service/VersionService.java new file mode 100644 index 00000000..f0186971 --- /dev/null +++ b/src/main/java/com/m3pro/groundflip/service/VersionService.java @@ -0,0 +1,35 @@ +package com.m3pro.groundflip.service; + +import org.springframework.stereotype.Service; + +import com.m3pro.groundflip.domain.dto.version.VersionRequest; +import com.m3pro.groundflip.domain.dto.version.VersionResponse; +import com.m3pro.groundflip.domain.entity.AppVersion; +import com.m3pro.groundflip.repository.AppVersionRepository; + +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class VersionService { + private final AppVersionRepository appVersionRepository; + + @Transactional + public void postVersion(VersionRequest versionRequest) { + appVersionRepository.save( + AppVersion.builder() + .version(versionRequest.getVersion()) + .build() + ); + } + + public VersionResponse getVersion() { + AppVersion appVersion = appVersionRepository.findLaestetVersion(); + + return VersionResponse.builder() + .version(appVersion.getVersion()) + .createdDate(appVersion.getCreatedDate()) + .build(); + } +}