Merge pull request #23 from ModelEngine-Group/develop_op

refactor: update service and repository structure to use DTOs and imp…
This commit is contained in:
hhhhsc701
2025-10-24 17:56:32 +08:00
committed by GitHub
36 changed files with 427 additions and 353 deletions

View File

@@ -13,10 +13,9 @@ import org.springframework.scheduling.annotation.EnableScheduling;
@Configuration @Configuration
@EnableAsync @EnableAsync
@EnableScheduling @EnableScheduling
@EntityScan(basePackages = "com.datamate.operator.domain.modal") @EntityScan(basePackages = "com.datamate.operator.domain.model")
@ComponentScan(basePackages = { @ComponentScan(basePackages = {
"com.datamate.operator", "com.datamate.operator"
"com.datamate.shared"
}) })
public class OperatorMarketServiceConfiguration { public class OperatorMarketServiceConfiguration {
// Service configuration class for JAR packaging // Service configuration class for JAR packaging

View File

@@ -1,10 +1,10 @@
package com.datamate.operator.application; package com.datamate.operator.application;
import com.datamate.operator.domain.modal.Category; import com.datamate.operator.domain.repository.CategoryRelationRepository;
import com.datamate.operator.domain.modal.CategoryRelation; import com.datamate.operator.domain.repository.CategoryRepository;
import com.datamate.operator.infrastructure.persistence.mapper.CategoryMapper; import com.datamate.operator.interfaces.dto.CategoryDto;
import com.datamate.operator.infrastructure.persistence.mapper.CategoryRelationMapper; import com.datamate.operator.interfaces.dto.CategoryRelationDto;
import com.datamate.operator.interfaces.dto.CategoryTreeResponse; import com.datamate.operator.interfaces.dto.CategoryTreeResponse;
import com.datamate.operator.interfaces.dto.SubCategory; import com.datamate.operator.interfaces.dto.SubCategory;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@@ -18,30 +18,30 @@ import java.util.stream.Collectors;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class CategoryService { public class CategoryService {
private final CategoryMapper categoryMapper; private final CategoryRepository categoryRepo;
private final CategoryRelationMapper categoryRelationMapper; private final CategoryRelationRepository categoryRelationRepo;
public List<CategoryTreeResponse> getAllCategories() { public List<CategoryTreeResponse> getAllCategories() {
List<Category> allCategories = categoryMapper.findAllCategories(); List<CategoryDto> allCategories = categoryRepo.findAllCategories();
List<CategoryRelation> allRelations = categoryRelationMapper.findAllRelation(); List<CategoryRelationDto> allRelations = categoryRelationRepo.findAllRelation();
Map<Integer, Integer> relationMap = allRelations.stream() Map<Integer, Integer> relationMap = allRelations.stream()
.collect(Collectors.groupingBy( .collect(Collectors.groupingBy(
CategoryRelation::getCategoryId, CategoryRelationDto::getCategoryId,
Collectors.collectingAndThen(Collectors.counting(), Math::toIntExact))); Collectors.collectingAndThen(Collectors.counting(), Math::toIntExact)));
Map<Integer, String> nameMap = allCategories.stream() Map<Integer, String> nameMap = allCategories.stream()
.collect(Collectors.toMap(Category::getId, Category::getName)); .collect(Collectors.toMap(CategoryDto::getId, CategoryDto::getName));
Map<Integer, List<Category>> groupedByParentId = allCategories.stream() Map<Integer, List<CategoryDto>> groupedByParentId = allCategories.stream()
.filter(relation -> relation.getParentId() > 0) .filter(relation -> relation.getParentId() > 0)
.collect(Collectors.groupingBy(Category::getParentId)); .collect(Collectors.groupingBy(CategoryDto::getParentId));
return groupedByParentId.entrySet().stream() return groupedByParentId.entrySet().stream()
.sorted(Map.Entry.comparingByKey()) .sorted(Map.Entry.comparingByKey())
.map(entry -> { .map(entry -> {
Integer parentId = entry.getKey(); Integer parentId = entry.getKey();
List<Category> group = entry.getValue(); List<CategoryDto> group = entry.getValue();
CategoryTreeResponse response = new CategoryTreeResponse(); CategoryTreeResponse response = new CategoryTreeResponse();
response.setId(parentId); response.setId(parentId);
response.setName(nameMap.get(parentId)); response.setName(nameMap.get(parentId));

View File

@@ -1,21 +1,20 @@
package com.datamate.operator.application; package com.datamate.operator.application;
import com.datamate.operator.interfaces.dto.Label; import com.datamate.operator.interfaces.dto.LabelDto;
import com.datamate.operator.interfaces.dto.*;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.Collections; import java.util.Collections;
@Service @Service
public class LabelService { public class LabelService {
public List<Label> getLabels(Integer page, Integer size, String keyword) { public List<LabelDto> getLabels(Integer page, Integer size, String keyword) {
// TODO: 查询标签列表 // TODO: 查询标签列表
return Collections.emptyList(); return Collections.emptyList();
} }
public void updateLabel(String id, List<Label> updateLabelRequest) { public void updateLabel(String id, List<LabelDto> updateLabelDtoRequest) {
// TODO: 更新标签 // TODO: 更新标签
} }
public void createLabels(Label labelsPostRequest) { public void createLabels(LabelDto labelsPostRequest) {
// TODO: 批量创建标签 // TODO: 批量创建标签
} }
} }

View File

@@ -1,13 +1,11 @@
package com.datamate.operator.application; package com.datamate.operator.application;
import com.datamate.operator.domain.converter.OperatorConverter; import com.datamate.operator.infrastructure.converter.OperatorConverter;
import com.datamate.operator.infrastructure.persistence.mapper.CategoryRelationMapper; import com.datamate.operator.domain.model.OperatorView;
import com.datamate.operator.infrastructure.persistence.mapper.OperatorMapper; import com.datamate.operator.domain.repository.CategoryRelationRepository;
import com.datamate.operator.interfaces.dto.CreateOperatorRequest; import com.datamate.operator.domain.repository.OperatorRepository;
import com.datamate.operator.interfaces.dto.OperatorResponse; import com.datamate.operator.domain.repository.OperatorViewRepository;
import com.datamate.operator.interfaces.dto.UpdateOperatorRequest; import com.datamate.operator.interfaces.dto.OperatorDto;
import com.datamate.operator.interfaces.dto.*;
import com.datamate.operator.domain.modal.Operator;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@@ -17,60 +15,42 @@ import java.util.List;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class OperatorService { public class OperatorService {
private final OperatorMapper operatorMapper; private final OperatorRepository operatorRepo;
private final CategoryRelationMapper relationMapper; private final OperatorViewRepository operatorViewRepo;
public List<OperatorResponse> getOperators(Integer page, Integer size, List<Integer> categories, private final CategoryRelationRepository relationRepo;
public List<OperatorDto> getOperators(Integer page, Integer size, List<Integer> categories,
String operatorName, Boolean isStar) { String operatorName, Boolean isStar) {
Integer offset = page * size; List<OperatorView> filteredOperators = operatorViewRepo.findOperatorsByCriteria(page, size, operatorName,
List<Operator> filteredOperators = operatorMapper.findOperatorsByCriteria(size, offset, operatorName,
categories, isStar); categories, isStar);
return filteredOperators.stream() return filteredOperators.stream().map(OperatorConverter.INSTANCE::fromEntityToDto).toList();
.map(OperatorConverter.INSTANCE::operatorToResponse).toList();
} }
public int getOperatorsCount(List<Integer> categories, String operatorName, Boolean isStar) { public int getOperatorsCount(List<Integer> categories, String operatorName, Boolean isStar) {
return operatorMapper.countOperatorsByCriteria(operatorName, categories, isStar); return operatorViewRepo.countOperatorsByCriteria(operatorName, categories, isStar);
} }
public OperatorResponse getOperatorById(String id) { public OperatorDto getOperatorById(String id) {
Operator operator = operatorMapper.findOperatorById(id); OperatorView operator = operatorViewRepo.findOperatorById(id);
return OperatorConverter.INSTANCE.operatorToResponse(operator); return OperatorConverter.INSTANCE.fromEntityToDto(operator);
} }
public OperatorResponse createOperator(CreateOperatorRequest req) { public OperatorDto createOperator(OperatorDto req) {
Operator operator = new Operator(); operatorRepo.insertOperator(req);
operator.setId(req.getId()); relationRepo.batchInsert(req.getId(), req.getCategories());
operator.setName(req.getName()); return getOperatorById(req.getId());
operator.setDescription(req.getDescription());
operator.setVersion(req.getVersion());
operator.setInputs(req.getInputs());
operator.setOutputs(req.getOutputs());
operator.setRuntime(req.getRuntime());
operator.setSettings(req.getSettings());
operatorMapper.insertOperator(operator);
relationMapper.batchInsert(req.getId(), req.getCategories());
return OperatorConverter.INSTANCE.operatorToResponse(operator);
} }
public OperatorResponse updateOperator(String id, UpdateOperatorRequest req) { public OperatorDto updateOperator(String id, OperatorDto req) {
Operator operator = new Operator(); operatorRepo.updateOperator(req);
operator.setId(id); relationRepo.batchInsert(id, req.getCategories());
operator.setName(req.getName());
operator.setDescription(req.getDescription());
operator.setVersion(req.getVersion());
operator.setInputs(req.getInputs());
operator.setOutputs(req.getOutputs());
operator.setRuntime(req.getRuntime());
operator.setSettings(req.getSettings());
operatorMapper.updateOperator(operator);
relationMapper.batchInsert(id, req.getCategories());
return getOperatorById(id); return getOperatorById(id);
} }
public OperatorResponse uploadOperator(MultipartFile file, String description) { public OperatorDto uploadOperator(MultipartFile file, String description) {
// TODO: 文件上传与解析 // TODO: 文件上传与解析
return new OperatorResponse(); return new OperatorDto();
} }
} }

View File

@@ -1,15 +0,0 @@
package com.datamate.operator.domain.modal;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
@AllArgsConstructor
public class RelationCategoryDTO {
private Integer categoryId;
private String operatorId;
private String name;
private Integer parentId;
}

View File

@@ -0,0 +1,18 @@
package com.datamate.operator.domain.model;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
@TableName(value = "t_operator_category", autoResultMap = true)
public class Category {
private Integer id;
private String name;
private String type;
private Integer parentId;
}

View File

@@ -0,0 +1,16 @@
package com.datamate.operator.domain.model;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
@AllArgsConstructor
@TableName(value = "t_operator_category_relation", autoResultMap = true)
public class CategoryRelation {
private Integer categoryId;
private String operatorId;
}

View File

@@ -1,5 +1,6 @@
package com.datamate.operator.domain.modal; package com.datamate.operator.domain.model;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -7,6 +8,7 @@ import java.time.LocalDateTime;
@Getter @Getter
@Setter @Setter
@TableName(value = "t_operator")
public class Operator { public class Operator {
private String id; private String id;
@@ -20,12 +22,12 @@ public class Operator {
private String outputs; private String outputs;
private String categories;
private String runtime; private String runtime;
private String settings; private String settings;
private String fileName;
private Boolean isStar; private Boolean isStar;
private LocalDateTime createdAt; private LocalDateTime createdAt;

View File

@@ -0,0 +1,39 @@
package com.datamate.operator.domain.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
@Getter
@Setter
@TableName(value = "v_operator")
public class OperatorView {
@TableField(value = "operator_id")
private String id;
@TableField(value = "operator_name")
private String name;
private String description;
private String version;
private String inputs;
private String outputs;
private String categories;
private String runtime;
private String settings;
private Boolean isStar;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}

View File

@@ -0,0 +1,15 @@
package com.datamate.operator.domain.repository;
import com.baomidou.mybatisplus.extension.repository.IRepository;
import com.datamate.operator.domain.model.CategoryRelation;
import com.datamate.operator.interfaces.dto.CategoryRelationDto;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface CategoryRelationRepository extends IRepository<CategoryRelation> {
List<CategoryRelationDto> findAllRelation();
void batchInsert(@Param("operatorId") String operatorId, @Param("categories") List<Integer> categories);
}

View File

@@ -0,0 +1,11 @@
package com.datamate.operator.domain.repository;
import com.baomidou.mybatisplus.extension.repository.IRepository;
import com.datamate.operator.domain.model.Category;
import com.datamate.operator.interfaces.dto.CategoryDto;
import java.util.List;
public interface CategoryRepository extends IRepository<Category> {
List<CategoryDto> findAllCategories();
}

View File

@@ -0,0 +1,15 @@
package com.datamate.operator.domain.repository;
import com.baomidou.mybatisplus.extension.repository.IRepository;
import com.datamate.operator.domain.model.Operator;
import com.datamate.operator.interfaces.dto.OperatorDto;
import java.util.List;
public interface OperatorRepository extends IRepository<Operator> {
List<Operator> findAllOperators();
void updateOperator(OperatorDto operator);
void insertOperator(OperatorDto operator);
}

View File

@@ -0,0 +1,15 @@
package com.datamate.operator.domain.repository;
import com.baomidou.mybatisplus.extension.repository.IRepository;
import com.datamate.operator.domain.model.OperatorView;
import java.util.List;
public interface OperatorViewRepository extends IRepository<OperatorView> {
List<OperatorView> findOperatorsByCriteria(Integer page, Integer size, String operatorName,
List<Integer> categories, Boolean isStar);
Integer countOperatorsByCriteria(String operatorName, List<Integer> categories, Boolean isStar);
OperatorView findOperatorById(String id);
}

View File

@@ -0,0 +1,15 @@
package com.datamate.operator.infrastructure.converter;
import com.datamate.operator.domain.model.Category;
import com.datamate.operator.interfaces.dto.CategoryDto;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface CategoryConverter {
CategoryConverter INSTANCE = Mappers.getMapper(CategoryConverter.class);
List<CategoryDto> fromEntityToDto (List<Category> dto);
}

View File

@@ -0,0 +1,15 @@
package com.datamate.operator.infrastructure.converter;
import com.datamate.operator.domain.model.CategoryRelation;
import com.datamate.operator.interfaces.dto.CategoryRelationDto;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface CategoryRelationConverter {
CategoryRelationConverter INSTANCE = Mappers.getMapper(CategoryRelationConverter.class);
List<CategoryRelationDto> fromEntityToDto (List<CategoryRelation> dto);
}

View File

@@ -1,7 +1,8 @@
package com.datamate.operator.domain.converter; package com.datamate.operator.infrastructure.converter;
import com.datamate.operator.domain.modal.Operator; import com.datamate.operator.domain.model.Operator;
import com.datamate.operator.interfaces.dto.OperatorResponse; import com.datamate.operator.domain.model.OperatorView;
import com.datamate.operator.interfaces.dto.OperatorDto;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping; import org.mapstruct.Mapping;
import org.mapstruct.Named; import org.mapstruct.Named;
@@ -16,7 +17,7 @@ public interface OperatorConverter {
OperatorConverter INSTANCE = Mappers.getMapper(OperatorConverter.class); OperatorConverter INSTANCE = Mappers.getMapper(OperatorConverter.class);
@Mapping(target = "categories", source = "categories", qualifiedByName = "stringToList") @Mapping(target = "categories", source = "categories", qualifiedByName = "stringToList")
OperatorResponse operatorToResponse(Operator operator); OperatorDto fromEntityToDto(OperatorView operator);
@Named("stringToList") @Named("stringToList")
static List<Integer> stringToList(String input) { static List<Integer> stringToList(String input) {
@@ -25,4 +26,6 @@ public interface OperatorConverter {
} }
return Arrays.stream(input.split(",")).map(Integer::valueOf).toList(); return Arrays.stream(input.split(",")).map(Integer::valueOf).toList();
} }
Operator fromDtoToEntity(OperatorDto operator);
} }

View File

@@ -0,0 +1,32 @@
package com.datamate.operator.infrastructure.persistence.Impl;
import com.baomidou.mybatisplus.extension.repository.CrudRepository;
import com.datamate.operator.domain.model.CategoryRelation;
import com.datamate.operator.domain.repository.CategoryRelationRepository;
import com.datamate.operator.infrastructure.converter.CategoryRelationConverter;
import com.datamate.operator.infrastructure.persistence.mapper.CategoryRelationMapper;
import com.datamate.operator.interfaces.dto.CategoryRelationDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@RequiredArgsConstructor
public class CategoryRelationRepositoryImpl extends CrudRepository<CategoryRelationMapper, CategoryRelation>
implements CategoryRelationRepository {
private final CategoryRelationMapper mapper;
@Override
public List<CategoryRelationDto> findAllRelation() {
return CategoryRelationConverter.INSTANCE.fromEntityToDto(mapper.selectList(null));
}
@Override
public void batchInsert(String operatorId, List<Integer> categories) {
List<CategoryRelation> categoryRelations = categories.stream()
.map(category -> new CategoryRelation(category, operatorId))
.toList();
mapper.insert(categoryRelations);
}
}

View File

@@ -0,0 +1,24 @@
package com.datamate.operator.infrastructure.persistence.Impl;
import com.baomidou.mybatisplus.extension.repository.CrudRepository;
import com.datamate.operator.domain.model.Category;
import com.datamate.operator.domain.repository.CategoryRepository;
import com.datamate.operator.infrastructure.converter.CategoryConverter;
import com.datamate.operator.infrastructure.persistence.mapper.CategoryMapper;
import com.datamate.operator.interfaces.dto.CategoryDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@RequiredArgsConstructor
public class CategoryRepositoryImpl extends CrudRepository<CategoryMapper, Category> implements CategoryRepository {
private final CategoryMapper mapper;
@Override
public List<CategoryDto> findAllCategories() {
return CategoryConverter.INSTANCE.fromEntityToDto(mapper.selectList(null));
}
}

View File

@@ -0,0 +1,33 @@
package com.datamate.operator.infrastructure.persistence.Impl;
import com.baomidou.mybatisplus.extension.repository.CrudRepository;
import com.datamate.operator.infrastructure.converter.OperatorConverter;
import com.datamate.operator.domain.model.Operator;
import com.datamate.operator.domain.repository.OperatorRepository;
import com.datamate.operator.infrastructure.persistence.mapper.OperatorMapper;
import com.datamate.operator.interfaces.dto.OperatorDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@RequiredArgsConstructor
public class OperatorRepositoryImpl extends CrudRepository<OperatorMapper, Operator> implements OperatorRepository {
private final OperatorMapper mapper;
@Override
public List<Operator> findAllOperators() {
return mapper.selectList(null);
}
@Override
public void updateOperator(OperatorDto operator) {
mapper.updateById(OperatorConverter.INSTANCE.fromDtoToEntity(operator));
}
@Override
public void insertOperator(OperatorDto operator) {
mapper.insert(OperatorConverter.INSTANCE.fromDtoToEntity(operator));
}
}

View File

@@ -0,0 +1,52 @@
package com.datamate.operator.infrastructure.persistence.Impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.repository.CrudRepository;
import com.datamate.operator.domain.model.OperatorView;
import com.datamate.operator.domain.repository.OperatorViewRepository;
import com.datamate.operator.infrastructure.persistence.mapper.OperatorViewMapper;
import io.micrometer.common.util.StringUtils;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@RequiredArgsConstructor
public class OperatorViewRepositoryImpl extends CrudRepository<OperatorViewMapper, OperatorView> implements OperatorViewRepository {
private final OperatorViewMapper mapper;
@Override
public List<OperatorView> findOperatorsByCriteria(Integer page, Integer size, String operatorName,
List<Integer> categories, Boolean isStar) {
QueryWrapper<OperatorView> queryWrapper = Wrappers.query();
queryWrapper.in(CollectionUtils.isNotEmpty(categories), "category_id", categories)
.like(StringUtils.isNotBlank(operatorName), "operator_name", operatorName)
.eq(isStar != null, "is_star", isStar)
.groupBy("operator_id");
Page<OperatorView> queryPage = null;
if (size != null && page != null) {
queryPage = new Page<>(page + 1, size);
}
IPage<OperatorView> operators = mapper.findOperatorsByCriteria(queryPage, queryWrapper);
return operators.getRecords();
}
@Override
public Integer countOperatorsByCriteria(String operatorName, List<Integer> categories, Boolean isStar) {
QueryWrapper<OperatorView> queryWrapper = Wrappers.query();
queryWrapper.in(CollectionUtils.isNotEmpty(categories),"category_id", categories)
.like(StringUtils.isNotBlank(operatorName), "operator_name", operatorName)
.eq(isStar != null, "is_star", isStar);
return mapper.countOperatorsByCriteria(queryWrapper);
}
@Override
public OperatorView findOperatorById(String id) {
return mapper.findOperatorById(id);
}
}

View File

@@ -1,12 +1,9 @@
package com.datamate.operator.infrastructure.persistence.mapper; package com.datamate.operator.infrastructure.persistence.mapper;
import com.datamate.operator.domain.modal.Category; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.datamate.operator.domain.model.Category;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper @Mapper
public interface CategoryMapper { public interface CategoryMapper extends BaseMapper<Category> {
List<Category> findAllCategories();
} }

View File

@@ -1,18 +1,9 @@
package com.datamate.operator.infrastructure.persistence.mapper; package com.datamate.operator.infrastructure.persistence.mapper;
import com.datamate.operator.domain.modal.CategoryRelation; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.datamate.operator.domain.modal.RelationCategoryDTO; import com.datamate.operator.domain.model.CategoryRelation;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper @Mapper
public interface CategoryRelationMapper { public interface CategoryRelationMapper extends BaseMapper<CategoryRelation> {
List<RelationCategoryDTO> findAllRelationWithCategory();
List<CategoryRelation> findAllRelation();
void batchInsert(@Param("operatorId") String operatorId, @Param("categories") List<Integer> categories);
} }

View File

@@ -1,27 +1,9 @@
package com.datamate.operator.infrastructure.persistence.mapper; package com.datamate.operator.infrastructure.persistence.mapper;
import com.datamate.operator.domain.modal.Operator; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.datamate.operator.domain.model.Operator;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper @Mapper
public interface OperatorMapper { public interface OperatorMapper extends BaseMapper<Operator> {
List<Operator> findAllOperators();
List<Operator> findOperatorsByCriteria(@Param("size") Integer size, @Param("offset") Integer offset,
@Param("operatorName") String operatorName,
@Param("categories") List<Integer> categories,
@Param("isStar") Boolean isStar);
Integer countOperatorsByCriteria(@Param("operatorName") String operatorName,
@Param("categories") List<Integer> categories,
@Param("isStar") Boolean isStar);
Operator findOperatorById(@Param("id") String id);
void updateOperator(Operator operator);
void insertOperator(Operator operator);
} }

View File

@@ -0,0 +1,30 @@
package com.datamate.operator.infrastructure.persistence.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.datamate.operator.domain.model.OperatorView;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface OperatorViewMapper extends BaseMapper<OperatorView> {
@Select("SELECT operator_id AS id, operator_name AS name, description, version, inputs, outputs, runtime, " +
"settings, is_star, created_at, updated_at, " +
"GROUP_CONCAT(category_id ORDER BY created_at DESC SEPARATOR ',') AS categories " +
"FROM v_operator ${ew.customSqlSegment}")
IPage<OperatorView> findOperatorsByCriteria(IPage<OperatorView> page,
@Param(Constants.WRAPPER) Wrapper<OperatorView> queryWrapper);
@Select("SELECT COUNT(DISTINCT operator_id) AS count FROM v_operator ${ew.customSqlSegment}")
Integer countOperatorsByCriteria(@Param(Constants.WRAPPER) Wrapper<OperatorView> queryWrapper);
@Select("SELECT operator_id AS id, operator_name AS name, description, version, inputs, outputs, runtime, " +
"settings, is_star, created_at, updated_at, " +
"GROUP_CONCAT(category_id ORDER BY created_at DESC SEPARATOR ',') AS categories " +
"FROM v_operator WHERE operator_id = #{id}")
OperatorView findOperatorById(@Param("id") String id);
}

View File

@@ -1,14 +1,16 @@
package com.datamate.operator.domain.modal; package com.datamate.operator.interfaces.dto;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@Setter @Setter
@Getter @Getter
public class Category { public class CategoryDto {
private Integer id; private Integer id;
private String name; private String name;
private String type;
private Integer parentId; private Integer parentId;
} }

View File

@@ -1,11 +1,11 @@
package com.datamate.operator.domain.modal; package com.datamate.operator.interfaces.dto;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@Setter @Setter
@Getter @Getter
public class CategoryRelation { public class CategoryRelationDto {
private Integer categoryId; private Integer categoryId;
private String operatorId; private String operatorId;

View File

@@ -1,36 +0,0 @@
package com.datamate.operator.interfaces.dto;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* CreateOperatorRequest
*/
@Getter
@Setter
public class CreateOperatorRequest {
private String id;
private String name;
private String description;
private String version;
private String inputs;
private String outputs;
private List<Integer> categories;
private String runtime;
private String settings;
private String fileName;
}

View File

@@ -5,7 +5,7 @@ import lombok.Setter;
@Getter @Getter
@Setter @Setter
public class Label { public class LabelDto {
private String id; private String id;

View File

@@ -8,12 +8,12 @@ import java.time.LocalDateTime;
import java.util.List; import java.util.List;
/** /**
* OperatorResponse * OperatorDto
*/ */
@Getter @Getter
@Setter @Setter
public class OperatorResponse { public class OperatorDto {
private String id; private String id;
private String name; private String name;
@@ -32,6 +32,8 @@ public class OperatorResponse {
private String settings; private String settings;
private String fileName;
private Boolean isStar; private Boolean isStar;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)

View File

@@ -1,32 +0,0 @@
package com.datamate.operator.interfaces.dto;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* UpdateOperatorRequest
*/
@Getter
@Setter
public class UpdateOperatorRequest {
private String name;
private String description;
private String version;
private String inputs;
private String outputs;
private List<Integer> categories;
private String runtime;
private String settings;
}

View File

@@ -1,4 +1,4 @@
package com.datamate.operator.interfaces.api; package com.datamate.operator.interfaces.rest;
import com.datamate.common.infrastructure.common.Response; import com.datamate.common.infrastructure.common.Response;
import com.datamate.common.interfaces.PagedResponse; import com.datamate.common.interfaces.PagedResponse;

View File

@@ -1,9 +1,9 @@
package com.datamate.operator.interfaces.api; package com.datamate.operator.interfaces.rest;
import com.datamate.common.infrastructure.common.Response; import com.datamate.common.infrastructure.common.Response;
import com.datamate.common.interfaces.PagedResponse; import com.datamate.common.interfaces.PagedResponse;
import com.datamate.operator.application.LabelService; import com.datamate.operator.application.LabelService;
import com.datamate.operator.interfaces.dto.Label; import com.datamate.operator.interfaces.dto.LabelDto;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -17,7 +17,7 @@ public class LabelController {
private final LabelService labelService; private final LabelService labelService;
@GetMapping @GetMapping
public ResponseEntity<Response<PagedResponse<Label>>> labelsGet(@RequestParam("page") Integer page, public ResponseEntity<Response<PagedResponse<LabelDto>>> labelsGet(@RequestParam("page") Integer page,
@RequestParam("size") Integer size, @RequestParam("size") Integer size,
@RequestParam("keyword") String keyword) { @RequestParam("keyword") String keyword) {
return ResponseEntity.ok(Response.ok(PagedResponse.of(labelService.getLabels(page, size, keyword)))); return ResponseEntity.ok(Response.ok(PagedResponse.of(labelService.getLabels(page, size, keyword))));
@@ -25,13 +25,13 @@ public class LabelController {
@PutMapping("/{id}") @PutMapping("/{id}")
public ResponseEntity<Response<Object>> labelsIdPut(@PathVariable("id") String id, public ResponseEntity<Response<Object>> labelsIdPut(@PathVariable("id") String id,
@RequestBody List<Label> updateLabelRequest) { @RequestBody List<LabelDto> updateLabelDtoRequest) {
labelService.updateLabel(id, updateLabelRequest); labelService.updateLabel(id, updateLabelDtoRequest);
return ResponseEntity.ok(Response.ok(null)); return ResponseEntity.ok(Response.ok(null));
} }
@PostMapping @PostMapping
public ResponseEntity<Response<Object>> labelsPost(@RequestBody Label labelsPostRequest) { public ResponseEntity<Response<Object>> labelsPost(@RequestBody LabelDto labelsPostRequest) {
labelService.createLabels(labelsPostRequest); labelService.createLabels(labelsPostRequest);
return ResponseEntity.ok(Response.ok(null)); return ResponseEntity.ok(Response.ok(null));
} }

View File

@@ -1,12 +1,10 @@
package com.datamate.operator.interfaces.api; package com.datamate.operator.interfaces.rest;
import com.datamate.common.infrastructure.common.Response; import com.datamate.common.infrastructure.common.Response;
import com.datamate.common.interfaces.PagedResponse; import com.datamate.common.interfaces.PagedResponse;
import com.datamate.operator.application.OperatorService; import com.datamate.operator.application.OperatorService;
import com.datamate.operator.interfaces.dto.CreateOperatorRequest; import com.datamate.operator.interfaces.dto.OperatorDto;
import com.datamate.operator.interfaces.dto.OperatorResponse;
import com.datamate.operator.interfaces.dto.OperatorsListPostRequest; import com.datamate.operator.interfaces.dto.OperatorsListPostRequest;
import com.datamate.operator.interfaces.dto.UpdateOperatorRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -21,8 +19,8 @@ public class OperatorController {
private final OperatorService operatorService; private final OperatorService operatorService;
@PostMapping("/list") @PostMapping("/list")
public ResponseEntity<Response<PagedResponse<OperatorResponse>>> operatorsListPost(@RequestBody OperatorsListPostRequest request) { public ResponseEntity<Response<PagedResponse<OperatorDto>>> operatorsListPost(@RequestBody OperatorsListPostRequest request) {
List<OperatorResponse> responses = operatorService.getOperators(request.getPage(), request.getSize(), List<OperatorDto> responses = operatorService.getOperators(request.getPage(), request.getSize(),
request.getCategories(), request.getOperatorName(), request.getIsStar()); request.getCategories(), request.getOperatorName(), request.getIsStar());
int count = operatorService.getOperatorsCount(request.getCategories(), request.getOperatorName(), int count = operatorService.getOperatorsCount(request.getCategories(), request.getOperatorName(),
request.getIsStar()); request.getIsStar());
@@ -31,23 +29,23 @@ public class OperatorController {
} }
@GetMapping("/{id}") @GetMapping("/{id}")
public ResponseEntity<Response<OperatorResponse>> operatorsIdGet(@PathVariable("id") String id) { public ResponseEntity<Response<OperatorDto>> operatorsIdGet(@PathVariable("id") String id) {
return ResponseEntity.ok(Response.ok(operatorService.getOperatorById(id))); return ResponseEntity.ok(Response.ok(operatorService.getOperatorById(id)));
} }
@PutMapping("/{id}") @PutMapping("/{id}")
public ResponseEntity<Response<OperatorResponse>> operatorsIdPut(@PathVariable("id") String id, public ResponseEntity<Response<OperatorDto>> operatorsIdPut(@PathVariable("id") String id,
@RequestBody UpdateOperatorRequest updateOperatorRequest) { @RequestBody OperatorDto updateOperatorRequest) {
return ResponseEntity.ok(Response.ok(operatorService.updateOperator(id, updateOperatorRequest))); return ResponseEntity.ok(Response.ok(operatorService.updateOperator(id, updateOperatorRequest)));
} }
@PostMapping("/create") @PostMapping("/create")
public ResponseEntity<Response<OperatorResponse>> operatorsCreatePost(@RequestBody CreateOperatorRequest createOperatorRequest) { public ResponseEntity<Response<OperatorDto>> operatorsCreatePost(@RequestBody OperatorDto createOperatorRequest) {
return ResponseEntity.ok(Response.ok(operatorService.createOperator(createOperatorRequest))); return ResponseEntity.ok(Response.ok(operatorService.createOperator(createOperatorRequest)));
} }
@PostMapping("/upload") @PostMapping("/upload")
public ResponseEntity<Response<OperatorResponse>> operatorsUploadPost(@RequestPart(value = "file") MultipartFile file, public ResponseEntity<Response<OperatorDto>> operatorsUploadPost(@RequestPart(value = "file") MultipartFile file,
@RequestParam(value = "description") String description) { @RequestParam(value = "description") String description) {
return ResponseEntity.ok(Response.ok(operatorService.uploadOperator(file, description))); return ResponseEntity.ok(Response.ok(operatorService.uploadOperator(file, description)));
} }

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.datamate.operator.infrastructure.persistence.mapper.CategoryMapper">
<select id="findAllCategories" resultType="com.datamate.operator.domain.modal.Category">
SELECT * FROM t_operator_category
</select>
</mapper>

View File

@@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.datamate.operator.infrastructure.persistence.mapper.CategoryRelationMapper">
<select id="findAllRelationWithCategory" resultType="com.datamate.operator.domain.modal.RelationCategoryDTO">
SELECT tc.id AS id, tcr.operator_id AS operatorId, tc.name AS name, tc.parent_id AS parentId
FROM t_operator_category_relation tcr
LEFT JOIN t_operator_category tc ON tcr.category_id = tc.id
</select>
<select id="findAllRelation" resultType="com.datamate.operator.domain.modal.CategoryRelation">
SELECT category_id, operator_id FROM t_operator_category_relation
</select>
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO t_operator_category_relation (operator_id, category_id)
VALUES
<foreach collection="categories" item="categoryId" separator=",">
(#{operatorId}, #{categoryId})
</foreach>
</insert>
</mapper>

View File

@@ -1,96 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.datamate.operator.infrastructure.persistence.mapper.OperatorMapper">
<select id="findAllOperators" resultType="com.datamate.operator.domain.modal.Operator">
SELECT id, name, description, version, inputs, outputs, runtime, settings, is_star, created_at, updated_at FROM
t_operator
</select>
<select id="findOperatorsByCriteria" parameterType="map" resultType="com.datamate.operator.domain.modal.Operator">
SELECT operator_id as id, operator_name as name, description, version, inputs, outputs, runtime, settings,
is_star, created_at, updated_at, GROUP_CONCAT(category_id ORDER BY created_at DESC SEPARATOR ',') AS categories
FROM v_operator
<where>
<if test="operatorName != null and operatorName != ''">
AND operator_name LIKE CONCAT('%', #{operatorName}, '%')
</if>
<if test="categories != null and !categories.isEmpty()">
AND category_id IN
<foreach collection="categories" item="category" open="(" separator="," close=")">
#{category}
</foreach>
</if>
<if test="isStar != null">
AND is_star = #{isStar}
</if>
</where>
GROUP BY operator_id
<if test="size != null and offset != null">
LIMIT ${size} OFFSET ${offset}
</if>
</select>
<select id="countOperatorsByCriteria" parameterType="map">
SELECT COUNT(DISTINCT operator_id) AS count
FROM v_operator
<where>
<if test="operatorName != null and operatorName != ''">
AND operator_name LIKE CONCAT('%', #{operatorName}, '%')
</if>
<if test="categories != null and !categories.isEmpty()">
AND category_id IN
<foreach collection="categories" item="category" open="(" separator="," close=")">
#{category}
</foreach>
</if>
<if test="isStar != null">
AND is_star = #{isStar}
</if>
</where>
</select>
<select id="findOperatorById" parameterType="string" resultType="com.datamate.operator.domain.modal.Operator">
SELECT operator_id as id, operator_name as name, description, version, inputs, outputs, runtime, settings,
is_star, created_at, updated_at, GROUP_CONCAT(category_id ORDER BY created_at DESC SEPARATOR ',') AS categories
FROM v_operator
WHERE operator_id = #{id}
</select>
<insert id="insertOperator" parameterType="com.datamate.operator.domain.modal.Operator">
INSERT INTO t_operator (id, name, description, version, inputs, outputs, runtime, settings, is_star, created_at, updated_at)
VALUES (#{id}, #{name}, #{description}, #{version}, #{inputs}, #{outputs}, #{runtime}, #{settings}, #{isStar}, NOW(), NOW())
</insert>
<update id="updateOperator" parameterType="com.datamate.operator.domain.modal.Operator">
UPDATE t_operator
<set>
<if test="name != null and name != ''">
name = #{name},
</if>
<if test="description != null and description != ''">
description = #{description},
</if>
<if test="version != null and version != ''">
version = #{version},
</if>
<if test="inputs != null and inputs != ''">
inputs = #{inputs},
</if>
<if test="outputs != null and outputs != ''">
outputs = #{outputs},
</if>
<if test="runtime != null and runtime != ''">
runtime = #{runtime},
</if>
<if test="settings != null and settings != ''">
settings = #{settings},
</if>
<if test="isStar != null">
is_star = #{isStar},
</if>
updated_at = NOW()
</set>
WHERE id = #{id}
</update>
</mapper>