diff --git a/api/src/main/java/com/databasir/api/ProjectController.java b/api/src/main/java/com/databasir/api/ProjectController.java index c390f7b..f3707eb 100644 --- a/api/src/main/java/com/databasir/api/ProjectController.java +++ b/api/src/main/java/com/databasir/api/ProjectController.java @@ -1,5 +1,6 @@ package com.databasir.api; +import com.databasir.api.config.security.DatabasirUserDetails; import com.databasir.api.validator.CronExpressionValidator; import com.databasir.common.JsonData; import com.databasir.core.domain.log.annotation.Operation; @@ -11,6 +12,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.web.PageableDefault; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -71,7 +73,11 @@ public class ProjectController { public JsonData> list(@PageableDefault(sort = "id", direction = Sort.Direction.DESC) Pageable page, ProjectListCondition condition) { - return JsonData.ok(projectService.list(page, condition)); + DatabasirUserDetails user = (DatabasirUserDetails) SecurityContextHolder.getContext() + .getAuthentication() + .getPrincipal(); + Integer userId = user.getUserPojo().getId(); + return JsonData.ok(projectService.list(userId, page, condition)); } @PostMapping(Routes.GroupProject.TEST_CONNECTION) diff --git a/core/src/main/java/com/databasir/core/domain/project/converter/ProjectResponseConverter.java b/core/src/main/java/com/databasir/core/domain/project/converter/ProjectResponseConverter.java index 046b9fa..ae34874 100644 --- a/core/src/main/java/com/databasir/core/domain/project/converter/ProjectResponseConverter.java +++ b/core/src/main/java/com/databasir/core/domain/project/converter/ProjectResponseConverter.java @@ -33,5 +33,6 @@ public interface ProjectResponseConverter { @Mapping(target = "createAt", source = "project.createAt") ProjectSimpleResponse toSimple(ProjectPojo project, DataSourcePojo dataSource, - ProjectSyncRulePojo syncRule); + ProjectSyncRulePojo syncRule, + Boolean isFavorite); } diff --git a/core/src/main/java/com/databasir/core/domain/project/data/ProjectSimpleResponse.java b/core/src/main/java/com/databasir/core/domain/project/data/ProjectSimpleResponse.java index 6c06eea..4aedc43 100644 --- a/core/src/main/java/com/databasir/core/domain/project/data/ProjectSimpleResponse.java +++ b/core/src/main/java/com/databasir/core/domain/project/data/ProjectSimpleResponse.java @@ -19,6 +19,8 @@ public class ProjectSimpleResponse { private Boolean isAutoSync; + private Boolean isFavorite; + private String autoSyncCron; private LocalDateTime createAt; diff --git a/core/src/main/java/com/databasir/core/domain/project/service/ProjectService.java b/core/src/main/java/com/databasir/core/domain/project/service/ProjectService.java index d201fa2..c5e8086 100644 --- a/core/src/main/java/com/databasir/core/domain/project/service/ProjectService.java +++ b/core/src/main/java/com/databasir/core/domain/project/service/ProjectService.java @@ -17,10 +17,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Properties; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -38,6 +35,8 @@ public class ProjectService { private final DataSourcePropertyDao dataSourcePropertyDao; + private final UserFavoriteProjectDao userFavoriteProjectDao; + private final DataSourcePojoConverter dataSourcePojoConverter; private final ProjectPojoConverter projectPojoConverter; @@ -128,7 +127,7 @@ public class ProjectService { projectSyncRuleDao.disableAutoSyncByProjectId(projectId); } - public Page list(Pageable page, ProjectListCondition condition) { + public Page list(Integer userId, Pageable page, ProjectListCondition condition) { Page pageData = projectDao.selectByCondition(page, condition.toCondition()); List projectIds = pageData.getContent() .stream() @@ -140,10 +139,15 @@ public class ProjectService { Map syncRuleMapByProjectId = projectSyncRuleDao.selectInProjectIds(projectIds) .stream() .collect(Collectors.toMap(ProjectSyncRulePojo::getProjectId, Function.identity())); + Set favoriteProjectIds = userFavoriteProjectDao.selectByUserIdAndProjectIds(userId, projectIds) + .stream() + .map(UserFavoriteProjectPojo::getProjectId) + .collect(Collectors.toSet()); return pageData.map(project -> { DataSourcePojo dataSource = dataSourceMapByProjectId.get(project.getId()); ProjectSyncRulePojo syncRule = syncRuleMapByProjectId.get(project.getId()); - return projectResponseConverter.toSimple(project, dataSource, syncRule); + Boolean isFavorite = favoriteProjectIds.contains(project.getId()); + return projectResponseConverter.toSimple(project, dataSource, syncRule, isFavorite); }); } diff --git a/dao/src/main/java/com/databasir/dao/impl/UserFavoriteProjectDao.java b/dao/src/main/java/com/databasir/dao/impl/UserFavoriteProjectDao.java index 8a2ba16..4683df6 100644 --- a/dao/src/main/java/com/databasir/dao/impl/UserFavoriteProjectDao.java +++ b/dao/src/main/java/com/databasir/dao/impl/UserFavoriteProjectDao.java @@ -10,6 +10,7 @@ import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Repository; +import java.util.Collections; import java.util.List; import static com.databasir.dao.Tables.*; @@ -59,4 +60,14 @@ public class UserFavoriteProjectDao extends BaseDao { .fetchInto(UserFavoriteProjectPojo.class); return new PageImpl<>(data, request, total); } + + public List selectByUserIdAndProjectIds(Integer userId, List projectIds) { + if (projectIds == null || projectIds.isEmpty()) { + return Collections.emptyList(); + } + return this.getDslContext() + .select(USER_FAVORITE_PROJECT.fields()).from(USER_FAVORITE_PROJECT) + .where(USER_FAVORITE_PROJECT.USER_ID.eq(userId).and(USER_FAVORITE_PROJECT.PROJECT_ID.in(projectIds))) + .fetchInto(UserFavoriteProjectPojo.class); + } }