diff --git a/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java b/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java index fa25d87c..72cb5e24 100644 --- a/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/changedetection/ChangeDetectionApiController.java @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.*; @Tag(name = "변화탐지", description = "변화탐지 API") @RequiredArgsConstructor @RestController -@RequestMapping({"/api/change-detection", "/demo/api/change-detection"}) +@RequestMapping({"/api/change-detection"}) @Transactional public class ChangeDetectionApiController { diff --git a/src/main/java/com/kamco/cd/kamcoback/menu/MenuApiController.java b/src/main/java/com/kamco/cd/kamcoback/menu/MenuApiController.java new file mode 100644 index 00000000..f1efef44 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/menu/MenuApiController.java @@ -0,0 +1,44 @@ +package com.kamco.cd.kamcoback.menu; + +import com.kamco.cd.kamcoback.config.api.ApiResponseDto; +import com.kamco.cd.kamcoback.menu.dto.MenuDto; +import com.kamco.cd.kamcoback.menu.service.MenuService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Tag(name = "메뉴 관리", description = "메뉴 관리 API") +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/menu") +public class MenuApiController { + + private final MenuService menuService; + + @Operation(summary = "목록 조회", description = "모든 메뉴 조회") + @ApiResponses( + value = { + @ApiResponse( + responseCode = "200", + description = "조회 성공", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = MenuDto.Basic.class))), + @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) + @GetMapping + public ApiResponseDto> getFindAll() { + return ApiResponseDto.ok(menuService.getFindAll()); + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/menu/dto/MenuDto.java b/src/main/java/com/kamco/cd/kamcoback/menu/dto/MenuDto.java new file mode 100644 index 00000000..4657cecf --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/menu/dto/MenuDto.java @@ -0,0 +1,67 @@ +package com.kamco.cd.kamcoback.menu.dto; + +import com.kamco.cd.kamcoback.common.utils.interfaces.JsonFormatDttm; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.ZonedDateTime; +import java.util.List; + +public class MenuDto { + + @Schema(name = "Menu Basic", description = "메뉴 기본 정보") + @Getter + @NoArgsConstructor + public static class Basic { + + private String menuUid; + private String menuNm; + private String menuUrl; + private String description; + private Long menuOrder; + private Boolean isUse; + private Boolean deleted; + private Long createdUid; + private Long updatedUid; + + private List children; + + @JsonFormatDttm + private ZonedDateTime createdDttm; + + @JsonFormatDttm + private ZonedDateTime updatedDttm; + + private String menuApiUrl; + + public Basic( + String menuUid, + String menuNm, + String menuUrl, + String description, + Long menuOrder, + Boolean isUse, + Boolean deleted, + Long createdUid, + Long updatedUid, + List children, + ZonedDateTime createdDttm, + ZonedDateTime updatedDttm, + String menuApiUrl) { + this.menuUid = menuUid; + this.menuNm = menuNm; + this.menuUrl = menuUrl; + this.description = description; + this.menuOrder = menuOrder; + this.isUse = isUse; + this.deleted = deleted; + this.createdUid = createdUid; + this.updatedUid = updatedUid; + this.children = children; + this.createdDttm = createdDttm; + this.updatedDttm = updatedDttm; + this.menuApiUrl = menuApiUrl; + } + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/menu/service/MenuService.java b/src/main/java/com/kamco/cd/kamcoback/menu/service/MenuService.java new file mode 100644 index 00000000..6eb05aae --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/menu/service/MenuService.java @@ -0,0 +1,20 @@ +package com.kamco.cd.kamcoback.menu.service; + +import com.kamco.cd.kamcoback.menu.dto.MenuDto; +import com.kamco.cd.kamcoback.postgres.core.MenuCoreService; +import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class MenuService { + private final MenuCoreService menuCoreService; + + @Cacheable(value = "menuFindAll") + public List getFindAll(){ + return menuCoreService.getFindAll(); + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MenuCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MenuCoreService.java new file mode 100644 index 00000000..627df05b --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MenuCoreService.java @@ -0,0 +1,20 @@ +package com.kamco.cd.kamcoback.postgres.core; + +import com.kamco.cd.kamcoback.menu.dto.MenuDto; +import com.kamco.cd.kamcoback.postgres.entity.MenuEntity; +import com.kamco.cd.kamcoback.postgres.repository.menu.MenuRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class MenuCoreService { + + private final MenuRepository menuRepository; + + public List getFindAll() { + return menuRepository.getFindAll().stream().map(MenuEntity::toDto).toList(); + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MenuEntity.java b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MenuEntity.java index be9e68c5..3c6b7fc1 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MenuEntity.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/entity/MenuEntity.java @@ -1,5 +1,6 @@ package com.kamco.cd.kamcoback.postgres.entity; +import com.kamco.cd.kamcoback.menu.dto.MenuDto; import com.kamco.cd.kamcoback.postgres.CommonDateEntity; import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; @@ -47,4 +48,25 @@ public class MenuEntity extends CommonDateEntity { @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL) private List children = new ArrayList<>(); + + @Column(name = "menu_api_uri") + private String menuApiUri; + + public MenuDto.Basic toDto(){ + return new MenuDto.Basic( + this.menuUid, + this.menuNm, + this.menuUrl, + this.description, + this.menuOrder, + this.isUse, + this.deleted, + this.createdUid, + this.updatedUid, + this.children.stream().map(MenuEntity::toDto).toList(), + this.getCreatedDate(), + this.getModifiedDate(), + this.menuApiUri + ); + } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/menu/MenuRepository.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/menu/MenuRepository.java new file mode 100644 index 00000000..5a3c434f --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/menu/MenuRepository.java @@ -0,0 +1,6 @@ +package com.kamco.cd.kamcoback.postgres.repository.menu; + +import com.kamco.cd.kamcoback.postgres.entity.MenuEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MenuRepository extends JpaRepository, MenuRepositoryCustom {} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/menu/MenuRepositoryCustom.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/menu/MenuRepositoryCustom.java new file mode 100644 index 00000000..9cfa8567 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/menu/MenuRepositoryCustom.java @@ -0,0 +1,10 @@ +package com.kamco.cd.kamcoback.postgres.repository.menu; + +import com.kamco.cd.kamcoback.postgres.entity.MenuEntity; + +import java.util.List; + +public interface MenuRepositoryCustom { + + List getFindAll(); +} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/menu/MenuRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/menu/MenuRepositoryImpl.java new file mode 100644 index 00000000..0c3c9471 --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/menu/MenuRepositoryImpl.java @@ -0,0 +1,30 @@ +package com.kamco.cd.kamcoback.postgres.repository.menu; + +import com.kamco.cd.kamcoback.postgres.entity.MenuEntity; +import com.querydsl.core.types.dsl.Expressions; +import com.querydsl.core.types.dsl.StringExpression; +import com.querydsl.jpa.impl.JPAQueryFactory; +import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; + +import java.util.List; + +import static com.kamco.cd.kamcoback.postgres.entity.QMenuEntity.menuEntity; + +public class MenuRepositoryImpl extends QuerydslRepositorySupport implements MenuRepositoryCustom { + + private final JPAQueryFactory queryFactory; + private final StringExpression NULL_STRING = Expressions.stringTemplate("cast(null as text)"); + + public MenuRepositoryImpl(JPAQueryFactory queryFactory) { + super(MenuEntity.class); + this.queryFactory = queryFactory; + } + + @Override + public List getFindAll() { + return queryFactory + .selectFrom(menuEntity) + .where(menuEntity.deleted.isFalse()) + .fetch(); + } +}