From f069d0bdc16b579a88e5099d4ad9c5146e51a3f1 Mon Sep 17 00:00:00 2001 From: vran Date: Thu, 24 Feb 2022 19:30:16 +0800 Subject: [PATCH] feat: add project favorite api --- .../main/java/com/databasir/api/Routes.java | 9 + .../databasir/api/UserProjectController.java | 55 ++++ .../FavoriteProjectPageResponseConverter.java | 22 ++ .../data/FavoriteProjectCreateRequest.java | 5 + .../data/FavoriteProjectPageCondition.java | 26 ++ .../data/FavoriteProjectPageResponse.java | 29 +++ .../user/service/UserProjectService.java | 85 +++++++ .../java/com/databasir/dao/Databasir.java | 7 + .../main/java/com/databasir/dao/Indexes.java | 2 + .../main/java/com/databasir/dao/Keys.java | 3 + .../main/java/com/databasir/dao/Tables.java | 6 + .../dao/tables/UserFavoriteProject.java | 163 ++++++++++++ .../tables/pojos/UserFavoriteProjectPojo.java | 113 +++++++++ .../records/UserFavoriteProjectRecord.java | 235 ++++++++++++++++++ .../java/com/databasir/dao/impl/BaseDao.java | 10 + .../dao/impl/UserFavoriteProjectDao.java | 62 +++++ .../db/migration/V1.3__favorite_project.sql | 9 + 17 files changed, 841 insertions(+) create mode 100644 api/src/main/java/com/databasir/api/UserProjectController.java create mode 100644 core/src/main/java/com/databasir/core/domain/user/converter/FavoriteProjectPageResponseConverter.java create mode 100644 core/src/main/java/com/databasir/core/domain/user/data/FavoriteProjectCreateRequest.java create mode 100644 core/src/main/java/com/databasir/core/domain/user/data/FavoriteProjectPageCondition.java create mode 100644 core/src/main/java/com/databasir/core/domain/user/data/FavoriteProjectPageResponse.java create mode 100644 core/src/main/java/com/databasir/core/domain/user/service/UserProjectService.java create mode 100644 dao/generated-src/jooq/main/java/com/databasir/dao/tables/UserFavoriteProject.java create mode 100644 dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/UserFavoriteProjectPojo.java create mode 100644 dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/UserFavoriteProjectRecord.java create mode 100644 dao/src/main/java/com/databasir/dao/impl/UserFavoriteProjectDao.java create mode 100644 dao/src/main/resources/db/migration/V1.3__favorite_project.sql diff --git a/api/src/main/java/com/databasir/api/Routes.java b/api/src/main/java/com/databasir/api/Routes.java index 49b8697..e6b213f 100644 --- a/api/src/main/java/com/databasir/api/Routes.java +++ b/api/src/main/java/com/databasir/api/Routes.java @@ -25,6 +25,15 @@ public interface Routes { String ADD_OR_REMOVE_SYS_OWNER = BASE + "/users/{userId}/sys_owners"; } + interface UserProject { + + String LIST = BASE + "/user_projects/favorites"; + + String ADD = BASE + "/user_projects/favorites/{projectId}"; + + String REMOVE = BASE + "/user_projects/favorites/{projectId}"; + } + interface Group { String LIST = BASE + "/groups"; diff --git a/api/src/main/java/com/databasir/api/UserProjectController.java b/api/src/main/java/com/databasir/api/UserProjectController.java new file mode 100644 index 0000000..8981667 --- /dev/null +++ b/api/src/main/java/com/databasir/api/UserProjectController.java @@ -0,0 +1,55 @@ +package com.databasir.api; + +import com.databasir.api.config.security.DatabasirUserDetails; +import com.databasir.common.JsonData; +import com.databasir.core.domain.user.data.FavoriteProjectPageCondition; +import com.databasir.core.domain.user.data.FavoriteProjectPageResponse; +import com.databasir.core.domain.user.service.UserProjectService; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.web.PageableDefault; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import static org.springframework.data.domain.Sort.Direction.DESC; + +@RestController +@RequiredArgsConstructor +@Validated +public class UserProjectController { + + private final UserProjectService userProjectService; + + @GetMapping(Routes.UserProject.LIST) + public JsonData> listFavorites( + @PageableDefault(sort = "id", direction = DESC) Pageable pageable, + FavoriteProjectPageCondition condition) { + DatabasirUserDetails user = (DatabasirUserDetails) SecurityContextHolder.getContext() + .getAuthentication() + .getPrincipal(); + Integer userId = user.getUserPojo().getId(); + return JsonData.ok(userProjectService.listFavorites(pageable, userId, condition)); + } + + @PostMapping(Routes.UserProject.ADD) + public JsonData addFavorite(@PathVariable Integer projectId) { + DatabasirUserDetails user = (DatabasirUserDetails) SecurityContextHolder.getContext() + .getAuthentication() + .getPrincipal(); + Integer userId = user.getUserPojo().getId(); + userProjectService.addFavorites(projectId, userId); + return JsonData.ok(); + } + + @DeleteMapping(Routes.UserProject.REMOVE) + public JsonData removeFavorite(@PathVariable Integer projectId) { + DatabasirUserDetails user = (DatabasirUserDetails) SecurityContextHolder.getContext() + .getAuthentication() + .getPrincipal(); + Integer userId = user.getUserPojo().getId(); + userProjectService.removeFavorites(projectId, userId); + return JsonData.ok(); + } +} diff --git a/core/src/main/java/com/databasir/core/domain/user/converter/FavoriteProjectPageResponseConverter.java b/core/src/main/java/com/databasir/core/domain/user/converter/FavoriteProjectPageResponseConverter.java new file mode 100644 index 0000000..15d4543 --- /dev/null +++ b/core/src/main/java/com/databasir/core/domain/user/converter/FavoriteProjectPageResponseConverter.java @@ -0,0 +1,22 @@ +package com.databasir.core.domain.user.converter; + +import com.databasir.core.domain.user.data.FavoriteProjectPageResponse; +import com.databasir.dao.tables.pojos.*; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +@Mapper(componentModel = "spring") +public interface FavoriteProjectPageResponseConverter { + + @Mapping(target = "projectId", source = "project.id") + @Mapping(target = "projectName", source = "project.name") + @Mapping(target = "projectDescription", source = "project.description") + @Mapping(target = "groupId", source = "group.id") + @Mapping(target = "groupName", source = "group.name") + @Mapping(target = "createAt", source = "favoriteProject.createAt") + FavoriteProjectPageResponse to(UserFavoriteProjectPojo favoriteProject, + ProjectPojo project, + DataSourcePojo dataSource, + ProjectSyncRulePojo projectSyncRule, + GroupPojo group); +} diff --git a/core/src/main/java/com/databasir/core/domain/user/data/FavoriteProjectCreateRequest.java b/core/src/main/java/com/databasir/core/domain/user/data/FavoriteProjectCreateRequest.java new file mode 100644 index 0000000..b2403ec --- /dev/null +++ b/core/src/main/java/com/databasir/core/domain/user/data/FavoriteProjectCreateRequest.java @@ -0,0 +1,5 @@ +package com.databasir.core.domain.user.data; + +public class FavoriteProjectCreateRequest { + +} diff --git a/core/src/main/java/com/databasir/core/domain/user/data/FavoriteProjectPageCondition.java b/core/src/main/java/com/databasir/core/domain/user/data/FavoriteProjectPageCondition.java new file mode 100644 index 0000000..65320f7 --- /dev/null +++ b/core/src/main/java/com/databasir/core/domain/user/data/FavoriteProjectPageCondition.java @@ -0,0 +1,26 @@ +package com.databasir.core.domain.user.data; + +import com.databasir.dao.Tables; +import lombok.Data; +import org.jooq.Condition; +import org.jooq.impl.DSL; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class FavoriteProjectPageCondition { + + private String projectNameContains; + + public Condition toCondition(Integer userId) { + List conditions = new ArrayList<>(); + conditions.add(Tables.USER_FAVORITE_PROJECT.USER_ID.eq(userId)); + if (projectNameContains != null && !projectNameContains.trim().equals("")) { + conditions.add(Tables.PROJECT.NAME.contains(projectNameContains)); + } + return conditions.stream() + .reduce(Condition::and) + .orElse(DSL.trueCondition()); + } +} diff --git a/core/src/main/java/com/databasir/core/domain/user/data/FavoriteProjectPageResponse.java b/core/src/main/java/com/databasir/core/domain/user/data/FavoriteProjectPageResponse.java new file mode 100644 index 0000000..34f50db --- /dev/null +++ b/core/src/main/java/com/databasir/core/domain/user/data/FavoriteProjectPageResponse.java @@ -0,0 +1,29 @@ +package com.databasir.core.domain.user.data; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class FavoriteProjectPageResponse { + + private Integer projectId; + + private String projectName; + + private String projectDescription; + + private Boolean isAutoSync; + + private String autoSyncCron; + + private Integer groupId; + + private String groupName; + + private String databaseType; + + private String databaseName; + + private LocalDateTime createAt; +} diff --git a/core/src/main/java/com/databasir/core/domain/user/service/UserProjectService.java b/core/src/main/java/com/databasir/core/domain/user/service/UserProjectService.java new file mode 100644 index 0000000..e831580 --- /dev/null +++ b/core/src/main/java/com/databasir/core/domain/user/service/UserProjectService.java @@ -0,0 +1,85 @@ +package com.databasir.core.domain.user.service; + +import com.databasir.core.domain.DomainErrors; +import com.databasir.core.domain.user.converter.FavoriteProjectPageResponseConverter; +import com.databasir.core.domain.user.data.FavoriteProjectPageCondition; +import com.databasir.core.domain.user.data.FavoriteProjectPageResponse; +import com.databasir.dao.impl.*; +import com.databasir.dao.tables.pojos.*; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.function.Function; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class UserProjectService { + + private final UserFavoriteProjectDao userFavoriteProjectDao; + + private final ProjectDao projectDao; + + private final ProjectSyncRuleDao projectSyncRuleDao; + + private final DataSourceDao dataSourceDao; + + private final GroupDao groupDao; + + private final FavoriteProjectPageResponseConverter favoriteProjectPageResponseConverter; + + public Page listFavorites(Pageable pageable, + Integer userId, + FavoriteProjectPageCondition condition) { + var data = userFavoriteProjectDao.selectByCondition(pageable, condition.toCondition(userId)); + // project data + var projectIdList = data.map(UserFavoriteProjectPojo::getProjectId).toList(); + var projectPojos = projectDao.selectInIds(projectIdList); + var projectMapById = projectPojos.stream() + .collect(Collectors.toMap(ProjectPojo::getId, Function.identity())); + // dataSource data + var dataSourceMapByProjectId = dataSourceDao.selectInProjectIds(projectIdList) + .stream() + .collect(Collectors.toMap(DataSourcePojo::getProjectId, Function.identity())); + // project sync rule data + var projectSyncRuleMapByProjectId = projectSyncRuleDao.selectInProjectIds(projectIdList) + .stream() + .collect(Collectors.toMap(ProjectSyncRulePojo::getProjectId, Function.identity())); + // group data + var groupIdList = projectPojos.stream().map(ProjectPojo::getGroupId).collect(Collectors.toList()); + var groupMapById = groupDao.selectInIds(groupIdList) + .stream() + .collect(Collectors.toMap(GroupPojo::getId, Function.identity())); + // response data + return data.map(favorite -> { + ProjectPojo project = projectMapById.get(favorite.getProjectId()); + DataSourcePojo dataSource = dataSourceMapByProjectId.get(favorite.getProjectId()); + ProjectSyncRulePojo projectSyncRule = projectSyncRuleMapByProjectId.get(favorite.getProjectId()); + GroupPojo group = null; + if (project != null) { + group = groupMapById.get(project.getGroupId()); + } + return favoriteProjectPageResponseConverter.to(favorite, project, dataSource, projectSyncRule, group); + }); + } + + @Transactional + public void addFavorites(Integer projectId, Integer userId) { + if (!projectDao.existsById(projectId)) { + throw DomainErrors.PROJECT_NOT_FOUND.exception(); + } + if (!userFavoriteProjectDao.exists(userId, projectId)) { + userFavoriteProjectDao.insert(userId, projectId); + } + } + + public void removeFavorites(Integer projectId, Integer userId) { + if (userFavoriteProjectDao.exists(userId, projectId)) { + userFavoriteProjectDao.delete(userId, projectId); + } + } + +} diff --git a/dao/generated-src/jooq/main/java/com/databasir/dao/Databasir.java b/dao/generated-src/jooq/main/java/com/databasir/dao/Databasir.java index 88e3539..6e86c78 100644 --- a/dao/generated-src/jooq/main/java/com/databasir/dao/Databasir.java +++ b/dao/generated-src/jooq/main/java/com/databasir/dao/Databasir.java @@ -21,6 +21,7 @@ import com.databasir.dao.tables.TableDocument; import com.databasir.dao.tables.TableIndexDocument; import com.databasir.dao.tables.TableTriggerDocument; import com.databasir.dao.tables.User; +import com.databasir.dao.tables.UserFavoriteProject; import com.databasir.dao.tables.UserRole; import java.util.Arrays; @@ -129,6 +130,11 @@ public class Databasir extends SchemaImpl { */ public final User USER = User.USER; + /** + * The table databasir.user_favorite_project. + */ + public final UserFavoriteProject USER_FAVORITE_PROJECT = UserFavoriteProject.USER_FAVORITE_PROJECT; + /** * The table databasir.user_role. */ @@ -167,6 +173,7 @@ public class Databasir extends SchemaImpl { TableIndexDocument.TABLE_INDEX_DOCUMENT, TableTriggerDocument.TABLE_TRIGGER_DOCUMENT, User.USER, + UserFavoriteProject.USER_FAVORITE_PROJECT, UserRole.USER_ROLE ); } diff --git a/dao/generated-src/jooq/main/java/com/databasir/dao/Indexes.java b/dao/generated-src/jooq/main/java/com/databasir/dao/Indexes.java index 9c24e68..42f58ef 100644 --- a/dao/generated-src/jooq/main/java/com/databasir/dao/Indexes.java +++ b/dao/generated-src/jooq/main/java/com/databasir/dao/Indexes.java @@ -11,6 +11,7 @@ import com.databasir.dao.tables.TableColumnDocument; import com.databasir.dao.tables.TableDocument; import com.databasir.dao.tables.TableIndexDocument; import com.databasir.dao.tables.TableTriggerDocument; +import com.databasir.dao.tables.UserFavoriteProject; import org.jooq.Index; import org.jooq.OrderField; @@ -38,4 +39,5 @@ public class Indexes { public static final Index TABLE_COLUMN_DOCUMENT_IDX_TABLE_DOCUMENT_ID = Internal.createIndex(DSL.name("idx_table_document_id"), TableColumnDocument.TABLE_COLUMN_DOCUMENT, new OrderField[] { TableColumnDocument.TABLE_COLUMN_DOCUMENT.TABLE_DOCUMENT_ID }, false); public static final Index TABLE_INDEX_DOCUMENT_IDX_TABLE_DOCUMENT_ID = Internal.createIndex(DSL.name("idx_table_document_id"), TableIndexDocument.TABLE_INDEX_DOCUMENT, new OrderField[] { TableIndexDocument.TABLE_INDEX_DOCUMENT.TABLE_DOCUMENT_ID }, false); public static final Index TABLE_TRIGGER_DOCUMENT_IDX_TABLE_DOCUMENT_ID = Internal.createIndex(DSL.name("idx_table_document_id"), TableTriggerDocument.TABLE_TRIGGER_DOCUMENT, new OrderField[] { TableTriggerDocument.TABLE_TRIGGER_DOCUMENT.TABLE_DOCUMENT_ID }, false); + public static final Index USER_FAVORITE_PROJECT_IDX_USER_ID = Internal.createIndex(DSL.name("idx_user_id"), UserFavoriteProject.USER_FAVORITE_PROJECT, new OrderField[] { UserFavoriteProject.USER_FAVORITE_PROJECT.USER_ID }, false); } diff --git a/dao/generated-src/jooq/main/java/com/databasir/dao/Keys.java b/dao/generated-src/jooq/main/java/com/databasir/dao/Keys.java index 1661bfb..4fdfa66 100644 --- a/dao/generated-src/jooq/main/java/com/databasir/dao/Keys.java +++ b/dao/generated-src/jooq/main/java/com/databasir/dao/Keys.java @@ -21,6 +21,7 @@ import com.databasir.dao.tables.TableDocument; import com.databasir.dao.tables.TableIndexDocument; import com.databasir.dao.tables.TableTriggerDocument; import com.databasir.dao.tables.User; +import com.databasir.dao.tables.UserFavoriteProject; import com.databasir.dao.tables.UserRole; import com.databasir.dao.tables.records.DataSourcePropertyRecord; import com.databasir.dao.tables.records.DataSourceRecord; @@ -38,6 +39,7 @@ import com.databasir.dao.tables.records.TableColumnDocumentRecord; import com.databasir.dao.tables.records.TableDocumentRecord; import com.databasir.dao.tables.records.TableIndexDocumentRecord; import com.databasir.dao.tables.records.TableTriggerDocumentRecord; +import com.databasir.dao.tables.records.UserFavoriteProjectRecord; import com.databasir.dao.tables.records.UserRecord; import com.databasir.dao.tables.records.UserRoleRecord; @@ -83,6 +85,7 @@ public class Keys { public static final UniqueKey KEY_USER_PRIMARY = Internal.createUniqueKey(User.USER, DSL.name("KEY_user_PRIMARY"), new TableField[] { User.USER.ID }, true); public static final UniqueKey KEY_USER_UK_EMAIL = Internal.createUniqueKey(User.USER, DSL.name("KEY_user_uk_email"), new TableField[] { User.USER.EMAIL }, true); public static final UniqueKey KEY_USER_UK_USERNAME = Internal.createUniqueKey(User.USER, DSL.name("KEY_user_uk_username"), new TableField[] { User.USER.USERNAME }, true); + public static final UniqueKey KEY_USER_FAVORITE_PROJECT_PRIMARY = Internal.createUniqueKey(UserFavoriteProject.USER_FAVORITE_PROJECT, DSL.name("KEY_user_favorite_project_PRIMARY"), new TableField[] { UserFavoriteProject.USER_FAVORITE_PROJECT.ID }, true); public static final UniqueKey KEY_USER_ROLE_PRIMARY = Internal.createUniqueKey(UserRole.USER_ROLE, DSL.name("KEY_user_role_PRIMARY"), new TableField[] { UserRole.USER_ROLE.ID }, true); public static final UniqueKey KEY_USER_ROLE_UK_USER_ID_GROUP_ID_ROLE = Internal.createUniqueKey(UserRole.USER_ROLE, DSL.name("KEY_user_role_uk_user_id_group_id_role"), new TableField[] { UserRole.USER_ROLE.USER_ID, UserRole.USER_ROLE.GROUP_ID, UserRole.USER_ROLE.ROLE }, true); } diff --git a/dao/generated-src/jooq/main/java/com/databasir/dao/Tables.java b/dao/generated-src/jooq/main/java/com/databasir/dao/Tables.java index 7e6b962..9feeba6 100644 --- a/dao/generated-src/jooq/main/java/com/databasir/dao/Tables.java +++ b/dao/generated-src/jooq/main/java/com/databasir/dao/Tables.java @@ -21,6 +21,7 @@ import com.databasir.dao.tables.TableDocument; import com.databasir.dao.tables.TableIndexDocument; import com.databasir.dao.tables.TableTriggerDocument; import com.databasir.dao.tables.User; +import com.databasir.dao.tables.UserFavoriteProject; import com.databasir.dao.tables.UserRole; @@ -115,6 +116,11 @@ public class Tables { */ public static final User USER = User.USER; + /** + * The table databasir.user_favorite_project. + */ + public static final UserFavoriteProject USER_FAVORITE_PROJECT = UserFavoriteProject.USER_FAVORITE_PROJECT; + /** * The table databasir.user_role. */ diff --git a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/UserFavoriteProject.java b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/UserFavoriteProject.java new file mode 100644 index 0000000..89758d9 --- /dev/null +++ b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/UserFavoriteProject.java @@ -0,0 +1,163 @@ +/* + * This file is generated by jOOQ. + */ +package com.databasir.dao.tables; + + +import com.databasir.dao.Databasir; +import com.databasir.dao.Indexes; +import com.databasir.dao.Keys; +import com.databasir.dao.tables.records.UserFavoriteProjectRecord; + +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.List; + +import org.jooq.Field; +import org.jooq.ForeignKey; +import org.jooq.Identity; +import org.jooq.Index; +import org.jooq.Name; +import org.jooq.Record; +import org.jooq.Row4; +import org.jooq.Schema; +import org.jooq.Table; +import org.jooq.TableField; +import org.jooq.TableOptions; +import org.jooq.UniqueKey; +import org.jooq.impl.DSL; +import org.jooq.impl.SQLDataType; +import org.jooq.impl.TableImpl; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class UserFavoriteProject extends TableImpl { + + private static final long serialVersionUID = 1L; + + /** + * The reference instance of databasir.user_favorite_project + */ + public static final UserFavoriteProject USER_FAVORITE_PROJECT = new UserFavoriteProject(); + + /** + * The class holding records for this type + */ + @Override + public Class getRecordType() { + return UserFavoriteProjectRecord.class; + } + + /** + * The column databasir.user_favorite_project.id. + */ + public final TableField ID = createField(DSL.name("id"), SQLDataType.INTEGER.nullable(false).identity(true), this, ""); + + /** + * The column databasir.user_favorite_project.user_id. + */ + public final TableField USER_ID = createField(DSL.name("user_id"), SQLDataType.INTEGER.nullable(false), this, ""); + + /** + * The column databasir.user_favorite_project.project_id. + */ + public final TableField PROJECT_ID = createField(DSL.name("project_id"), SQLDataType.INTEGER.nullable(false), this, ""); + + /** + * The column databasir.user_favorite_project.create_at. + */ + public final TableField CREATE_AT = createField(DSL.name("create_at"), SQLDataType.LOCALDATETIME(0).nullable(false).defaultValue(DSL.field("CURRENT_TIMESTAMP", SQLDataType.LOCALDATETIME)), this, ""); + + private UserFavoriteProject(Name alias, Table aliased) { + this(alias, aliased, null); + } + + private UserFavoriteProject(Name alias, Table aliased, Field[] parameters) { + super(alias, null, aliased, parameters, DSL.comment(""), TableOptions.table()); + } + + /** + * Create an aliased databasir.user_favorite_project table + * reference + */ + public UserFavoriteProject(String alias) { + this(DSL.name(alias), USER_FAVORITE_PROJECT); + } + + /** + * Create an aliased databasir.user_favorite_project table + * reference + */ + public UserFavoriteProject(Name alias) { + this(alias, USER_FAVORITE_PROJECT); + } + + /** + * Create a databasir.user_favorite_project table reference + */ + public UserFavoriteProject() { + this(DSL.name("user_favorite_project"), null); + } + + public UserFavoriteProject(Table child, ForeignKey key) { + super(child, key, USER_FAVORITE_PROJECT); + } + + @Override + public Schema getSchema() { + return aliased() ? null : Databasir.DATABASIR; + } + + @Override + public List getIndexes() { + return Arrays.asList(Indexes.USER_FAVORITE_PROJECT_IDX_USER_ID); + } + + @Override + public Identity getIdentity() { + return (Identity) super.getIdentity(); + } + + @Override + public UniqueKey getPrimaryKey() { + return Keys.KEY_USER_FAVORITE_PROJECT_PRIMARY; + } + + @Override + public UserFavoriteProject as(String alias) { + return new UserFavoriteProject(DSL.name(alias), this); + } + + @Override + public UserFavoriteProject as(Name alias) { + return new UserFavoriteProject(alias, this); + } + + /** + * Rename this table + */ + @Override + public UserFavoriteProject rename(String name) { + return new UserFavoriteProject(DSL.name(name), null); + } + + /** + * Rename this table + */ + @Override + public UserFavoriteProject rename(Name name) { + return new UserFavoriteProject(name, null); + } + + // ------------------------------------------------------------------------- + // Row4 type methods + // ------------------------------------------------------------------------- + + @Override + public Row4 fieldsRow() { + return (Row4) super.fieldsRow(); + } +} diff --git a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/UserFavoriteProjectPojo.java b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/UserFavoriteProjectPojo.java new file mode 100644 index 0000000..84db740 --- /dev/null +++ b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/UserFavoriteProjectPojo.java @@ -0,0 +1,113 @@ +/* + * This file is generated by jOOQ. + */ +package com.databasir.dao.tables.pojos; + + +import java.io.Serializable; +import java.time.LocalDateTime; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class UserFavoriteProjectPojo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer id; + private Integer userId; + private Integer projectId; + private LocalDateTime createAt; + + public UserFavoriteProjectPojo() {} + + public UserFavoriteProjectPojo(UserFavoriteProjectPojo value) { + this.id = value.id; + this.userId = value.userId; + this.projectId = value.projectId; + this.createAt = value.createAt; + } + + public UserFavoriteProjectPojo( + Integer id, + Integer userId, + Integer projectId, + LocalDateTime createAt + ) { + this.id = id; + this.userId = userId; + this.projectId = projectId; + this.createAt = createAt; + } + + /** + * Getter for databasir.user_favorite_project.id. + */ + public Integer getId() { + return this.id; + } + + /** + * Setter for databasir.user_favorite_project.id. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * Getter for databasir.user_favorite_project.user_id. + */ + public Integer getUserId() { + return this.userId; + } + + /** + * Setter for databasir.user_favorite_project.user_id. + */ + public void setUserId(Integer userId) { + this.userId = userId; + } + + /** + * Getter for databasir.user_favorite_project.project_id. + */ + public Integer getProjectId() { + return this.projectId; + } + + /** + * Setter for databasir.user_favorite_project.project_id. + */ + public void setProjectId(Integer projectId) { + this.projectId = projectId; + } + + /** + * Getter for databasir.user_favorite_project.create_at. + */ + public LocalDateTime getCreateAt() { + return this.createAt; + } + + /** + * Setter for databasir.user_favorite_project.create_at. + */ + public void setCreateAt(LocalDateTime createAt) { + this.createAt = createAt; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("UserFavoriteProjectPojo ("); + + sb.append(id); + sb.append(", ").append(userId); + sb.append(", ").append(projectId); + sb.append(", ").append(createAt); + + sb.append(")"); + return sb.toString(); + } +} diff --git a/dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/UserFavoriteProjectRecord.java b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/UserFavoriteProjectRecord.java new file mode 100644 index 0000000..37d4058 --- /dev/null +++ b/dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/UserFavoriteProjectRecord.java @@ -0,0 +1,235 @@ +/* + * This file is generated by jOOQ. + */ +package com.databasir.dao.tables.records; + + +import com.databasir.dao.tables.UserFavoriteProject; +import com.databasir.dao.tables.pojos.UserFavoriteProjectPojo; + +import java.time.LocalDateTime; + +import org.jooq.Field; +import org.jooq.Record1; +import org.jooq.Record4; +import org.jooq.Row4; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * This class is generated by jOOQ. + */ +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class UserFavoriteProjectRecord extends UpdatableRecordImpl implements Record4 { + + private static final long serialVersionUID = 1L; + + /** + * Setter for databasir.user_favorite_project.id. + */ + public void setId(Integer value) { + set(0, value); + } + + /** + * Getter for databasir.user_favorite_project.id. + */ + public Integer getId() { + return (Integer) get(0); + } + + /** + * Setter for databasir.user_favorite_project.user_id. + */ + public void setUserId(Integer value) { + set(1, value); + } + + /** + * Getter for databasir.user_favorite_project.user_id. + */ + public Integer getUserId() { + return (Integer) get(1); + } + + /** + * Setter for databasir.user_favorite_project.project_id. + */ + public void setProjectId(Integer value) { + set(2, value); + } + + /** + * Getter for databasir.user_favorite_project.project_id. + */ + public Integer getProjectId() { + return (Integer) get(2); + } + + /** + * Setter for databasir.user_favorite_project.create_at. + */ + public void setCreateAt(LocalDateTime value) { + set(3, value); + } + + /** + * Getter for databasir.user_favorite_project.create_at. + */ + public LocalDateTime getCreateAt() { + return (LocalDateTime) get(3); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + @Override + public Record1 key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Record4 type implementation + // ------------------------------------------------------------------------- + + @Override + public Row4 fieldsRow() { + return (Row4) super.fieldsRow(); + } + + @Override + public Row4 valuesRow() { + return (Row4) super.valuesRow(); + } + + @Override + public Field field1() { + return UserFavoriteProject.USER_FAVORITE_PROJECT.ID; + } + + @Override + public Field field2() { + return UserFavoriteProject.USER_FAVORITE_PROJECT.USER_ID; + } + + @Override + public Field field3() { + return UserFavoriteProject.USER_FAVORITE_PROJECT.PROJECT_ID; + } + + @Override + public Field field4() { + return UserFavoriteProject.USER_FAVORITE_PROJECT.CREATE_AT; + } + + @Override + public Integer component1() { + return getId(); + } + + @Override + public Integer component2() { + return getUserId(); + } + + @Override + public Integer component3() { + return getProjectId(); + } + + @Override + public LocalDateTime component4() { + return getCreateAt(); + } + + @Override + public Integer value1() { + return getId(); + } + + @Override + public Integer value2() { + return getUserId(); + } + + @Override + public Integer value3() { + return getProjectId(); + } + + @Override + public LocalDateTime value4() { + return getCreateAt(); + } + + @Override + public UserFavoriteProjectRecord value1(Integer value) { + setId(value); + return this; + } + + @Override + public UserFavoriteProjectRecord value2(Integer value) { + setUserId(value); + return this; + } + + @Override + public UserFavoriteProjectRecord value3(Integer value) { + setProjectId(value); + return this; + } + + @Override + public UserFavoriteProjectRecord value4(LocalDateTime value) { + setCreateAt(value); + return this; + } + + @Override + public UserFavoriteProjectRecord values(Integer value1, Integer value2, Integer value3, LocalDateTime value4) { + value1(value1); + value2(value2); + value3(value3); + value4(value4); + return this; + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached UserFavoriteProjectRecord + */ + public UserFavoriteProjectRecord() { + super(UserFavoriteProject.USER_FAVORITE_PROJECT); + } + + /** + * Create a detached, initialised UserFavoriteProjectRecord + */ + public UserFavoriteProjectRecord(Integer id, Integer userId, Integer projectId, LocalDateTime createAt) { + super(UserFavoriteProject.USER_FAVORITE_PROJECT); + + setId(id); + setUserId(userId); + setProjectId(projectId); + setCreateAt(createAt); + } + + /** + * Create a detached, initialised UserFavoriteProjectRecord + */ + public UserFavoriteProjectRecord(UserFavoriteProjectPojo value) { + super(UserFavoriteProject.USER_FAVORITE_PROJECT); + + if (value != null) { + setId(value.getId()); + setUserId(value.getUserId()); + setProjectId(value.getProjectId()); + setCreateAt(value.getCreateAt()); + } + } +} diff --git a/dao/src/main/java/com/databasir/dao/impl/BaseDao.java b/dao/src/main/java/com/databasir/dao/impl/BaseDao.java index ab81128..872ab8c 100644 --- a/dao/src/main/java/com/databasir/dao/impl/BaseDao.java +++ b/dao/src/main/java/com/databasir/dao/impl/BaseDao.java @@ -28,6 +28,10 @@ public abstract class BaseDao { return getDslContext().fetchExists(table, identity().eq(id)); } + public boolean exists(Condition condition) { + return getDslContext().fetchExists(table, condition); + } + public T insertAndReturnId(R pojo) { Record record = getDslContext().newRecord(table, pojo); UpdatableRecord updatableRecord = (UpdatableRecord) record; @@ -46,6 +50,12 @@ public abstract class BaseDao { return Arrays.stream(getDslContext().batchInsert(records).execute()).sum(); } + public int delete(Condition condition) { + return getDslContext() + .deleteFrom(table).where(condition) + .execute(); + } + public int deleteById(T id) { return getDslContext() .deleteFrom(table).where(identity().eq(id)) diff --git a/dao/src/main/java/com/databasir/dao/impl/UserFavoriteProjectDao.java b/dao/src/main/java/com/databasir/dao/impl/UserFavoriteProjectDao.java new file mode 100644 index 0000000..8a2ba16 --- /dev/null +++ b/dao/src/main/java/com/databasir/dao/impl/UserFavoriteProjectDao.java @@ -0,0 +1,62 @@ +package com.databasir.dao.impl; + +import com.databasir.dao.tables.pojos.UserFavoriteProjectPojo; +import lombok.Getter; +import org.jooq.Condition; +import org.jooq.DSLContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; + +import java.util.List; + +import static com.databasir.dao.Tables.*; + +@Repository +public class UserFavoriteProjectDao extends BaseDao { + + @Autowired + @Getter + private DSLContext dslContext; + + public UserFavoriteProjectDao() { + super(USER_FAVORITE_PROJECT, UserFavoriteProjectPojo.class); + } + + public boolean exists(Integer userId, Integer projectId) { + return exists(USER_FAVORITE_PROJECT.USER_ID.eq(userId) + .and(USER_FAVORITE_PROJECT.PROJECT_ID.eq(projectId))); + } + + public void insert(Integer userId, Integer projectId) { + UserFavoriteProjectPojo pojo = new UserFavoriteProjectPojo(); + pojo.setUserId(userId); + pojo.setProjectId(projectId); + this.insertAndReturnId(pojo); + } + + public void delete(Integer userId, Integer projectId) { + this.delete(USER_FAVORITE_PROJECT.USER_ID.eq(userId) + .and(USER_FAVORITE_PROJECT.PROJECT_ID.eq(projectId))); + } + + public Page selectByCondition(Pageable request, Condition condition) { + int total = getDslContext() + .selectCount().from(USER_FAVORITE_PROJECT) + .innerJoin(USER).on(USER.ID.eq(USER_FAVORITE_PROJECT.USER_ID)) + .innerJoin(PROJECT).on(PROJECT.ID.eq(USER_FAVORITE_PROJECT.PROJECT_ID)) + .where(PROJECT.DELETED.eq(false).and(condition)) + .fetchOne(0, int.class); + List data = getDslContext() + .select(USER_FAVORITE_PROJECT.fields()).from(USER_FAVORITE_PROJECT) + .innerJoin(USER).on(USER.ID.eq(USER_FAVORITE_PROJECT.USER_ID)) + .innerJoin(PROJECT).on(PROJECT.ID.eq(USER_FAVORITE_PROJECT.PROJECT_ID)) + .where(PROJECT.DELETED.eq(false).and(condition)) + .orderBy(getSortFields(request.getSort())) + .offset(request.getOffset()).limit(request.getPageSize()) + .fetchInto(UserFavoriteProjectPojo.class); + return new PageImpl<>(data, request, total); + } +} diff --git a/dao/src/main/resources/db/migration/V1.3__favorite_project.sql b/dao/src/main/resources/db/migration/V1.3__favorite_project.sql new file mode 100644 index 0000000..095829b --- /dev/null +++ b/dao/src/main/resources/db/migration/V1.3__favorite_project.sql @@ -0,0 +1,9 @@ +CREATE TABLE IF NOT EXISTS user_favorite_project +( + id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, + user_id INT NOT NULL, + project_id INT NOT NULL, + create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE uk_user_id_project_id (user_id, project_id) +) CHARSET utf8mb4 + COLLATE utf8mb4_unicode_ci;