From 19809c16bf8bee027a2e848cde0a1d9b2454c52c Mon Sep 17 00:00:00 2001 From: fuwenkai <834260992@qq.com> Date: Fri, 7 Jun 2024 10:31:23 +0800 Subject: [PATCH 1/2] [INLONG-10363][Manager] Support template multi tenant management --- .../dao/entity/TenantTemplateEntity.java | 39 ++++++ .../mapper/TenantTemplateEntityMapper.java | 42 +++++++ .../mappers/TemplateEntityMapper.xml | 1 + .../mappers/TenantTemplateEntityMapper.xml | 112 ++++++++++++++++++ .../manager/pojo/stream/TemplateField.java | 2 +- .../pojo/stream/TenantTemplateInfo.java | 63 ++++++++++ .../stream/TenantTemplatePageRequest.java | 48 ++++++++ .../pojo/stream/TenantTemplateRequest.java | 53 +++++++++ .../service/stream/TemplateServiceImpl.java | 43 +++++++ .../resources/h2/apache_inlong_manager.sql | 18 +++ .../manager-web/sql/apache_inlong_manager.sql | 21 +++- .../manager-web/sql/changes-1.13.0.sql | 19 +++ 12 files changed, 459 insertions(+), 2 deletions(-) create mode 100644 inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/TenantTemplateEntity.java create mode 100644 inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/TenantTemplateEntityMapper.java create mode 100644 inlong-manager/manager-dao/src/main/resources/mappers/TenantTemplateEntityMapper.xml create mode 100644 inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplateInfo.java create mode 100644 inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplatePageRequest.java create mode 100644 inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplateRequest.java diff --git a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/TenantTemplateEntity.java b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/TenantTemplateEntity.java new file mode 100644 index 00000000000..e1ceb811430 --- /dev/null +++ b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/TenantTemplateEntity.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.inlong.manager.dao.entity; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class TenantTemplateEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer id; + private String tenant; + private String templateName; + private Integer isDeleted; + private String creator; + private String modifier; + private Date createTime; + private Date modifyTime; + private Integer version; +} \ No newline at end of file diff --git a/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/TenantTemplateEntityMapper.java b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/TenantTemplateEntityMapper.java new file mode 100644 index 00000000000..22c037a2780 --- /dev/null +++ b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/TenantTemplateEntityMapper.java @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.inlong.manager.dao.mapper; + +import org.apache.inlong.manager.dao.entity.TenantTemplateEntity; +import org.apache.inlong.manager.pojo.cluster.TenantClusterTagPageRequest; + +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface TenantTemplateEntityMapper { + + int updateByIdSelective(TenantTemplateEntity record); + + int insert(TenantTemplateEntity record); + + TenantTemplateEntity selectByPrimaryKey(Integer id); + + TenantTemplateEntity selectByUniqueKey(String templateName, String tenant); + + List selectByTemplateName(String templateName); + + List selectByCondition(TenantClusterTagPageRequest request); + +} \ No newline at end of file diff --git a/inlong-manager/manager-dao/src/main/resources/mappers/TemplateEntityMapper.xml b/inlong-manager/manager-dao/src/main/resources/mappers/TemplateEntityMapper.xml index 9766c9c9d84..93e020cf644 100644 --- a/inlong-manager/manager-dao/src/main/resources/mappers/TemplateEntityMapper.xml +++ b/inlong-manager/manager-dao/src/main/resources/mappers/TemplateEntityMapper.xml @@ -75,6 +75,7 @@ and (t.visible_range = "ALL" or (t.visible_range = "IN_CHARGE" and find_in_set(#{currentUser, jdbcType=VARCHAR}, t.in_charges)) + or (t.visible_range = "TENANT" and #{tenant, jdbcType=VARCHAR} in (select tet.tenant from tenant_template tet where tet.template_name = t.name and tet.is_deleted=0 )) ) and t.visible_range = #{visibleRange,jdbcType=VARCHAR} diff --git a/inlong-manager/manager-dao/src/main/resources/mappers/TenantTemplateEntityMapper.xml b/inlong-manager/manager-dao/src/main/resources/mappers/TenantTemplateEntityMapper.xml new file mode 100644 index 00000000000..025bc963a13 --- /dev/null +++ b/inlong-manager/manager-dao/src/main/resources/mappers/TenantTemplateEntityMapper.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + id, tenant, template_name, is_deleted, creator, modifier, create_time, modify_time, + version + + + + + + + delete from tenant_template + where id = #{id,jdbcType=INTEGER} + + + insert into tenant_template (id, tenant, template_name, + creator, modifier) + values (#{id,jdbcType=INTEGER}, #{tenant,jdbcType=VARCHAR}, #{templateName,jdbcType=VARCHAR}, + #{creator,jdbcType=VARCHAR}, #{modifier,jdbcType=VARCHAR}) + + + update tenant_template + + + tenant = #{tenant,jdbcType=VARCHAR}, + + + template_name = #{templateName,jdbcType=VARCHAR}, + + + is_deleted = #{isDeleted,jdbcType=INTEGER}, + + + modifier = #{modifier,jdbcType=VARCHAR}, + + version = #{version,jdbcType=INTEGER} + 1 + + where id = #{id,jdbcType=INTEGER} + and version = #{version,jdbcType=INTEGER} + + \ No newline at end of file diff --git a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TemplateField.java b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TemplateField.java index 1eef158969a..19d7385739f 100644 --- a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TemplateField.java +++ b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TemplateField.java @@ -69,7 +69,7 @@ public class TemplateField implements Serializable { @ApiModelProperty(value = "Value expression of predefined field") private String preExpression; - @ApiModelProperty("Is this field a meta field, 0: no, 1: yes, default is 0") + @ApiModelProperty("Is this field a meta field, 0: no, 1: yes") @Builder.Default private Integer isMetaField = 0; diff --git a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplateInfo.java b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplateInfo.java new file mode 100644 index 00000000000..0710f14f467 --- /dev/null +++ b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplateInfo.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.inlong.manager.pojo.stream; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * Tenant template response + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("Tenant template tag response") +public class TenantTemplateInfo { + + @ApiModelProperty(value = "Primary key") + private Integer id; + + @ApiModelProperty(value = "Template name") + private String templateName; + + @ApiModelProperty(value = "Tenant") + private String tenant; + + @ApiModelProperty(value = "Name of in creator") + private String creator; + + @ApiModelProperty(value = "Name of in modifier") + private String modifier; + + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT+8") + private Date createTime; + + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", timezone = "GMT+8") + private Date modifyTime; + + @ApiModelProperty(value = "Version number") + private Integer version; +} diff --git a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplatePageRequest.java b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplatePageRequest.java new file mode 100644 index 00000000000..bf53f44dd2b --- /dev/null +++ b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplatePageRequest.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.inlong.manager.pojo.stream; + +import org.apache.inlong.manager.pojo.common.PageRequest; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = false) +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("Template paging query request") +public class TenantTemplatePageRequest extends PageRequest { + + @ApiModelProperty(value = "Inlong tenant list") + private List tenantList; + + @ApiModelProperty(value = "Inlong tenant") + private String tenant; + + @ApiModelProperty(value = "Keywords, used for fuzzy query") + private String keyword; +} diff --git a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplateRequest.java b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplateRequest.java new file mode 100644 index 00000000000..702f1c346e8 --- /dev/null +++ b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/TenantTemplateRequest.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.inlong.manager.pojo.stream; + +import org.apache.inlong.manager.common.validation.SaveValidation; +import org.apache.inlong.manager.common.validation.UpdateValidation; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * Tenant template tag request + */ +@Data +@ApiModel("Tenant template tag request") +public class TenantTemplateRequest { + + @ApiModelProperty(value = "Primary key") + @NotNull(groups = UpdateValidation.class, message = "id cannot be null") + private Integer id; + + @ApiModelProperty(value = "Template name") + private String templateName; + + @ApiModelProperty(value = "Inlong tenant which template") + @NotBlank(groups = SaveValidation.class, message = "tenant cannot be blank") + @Length(min = 1, max = 256, message = "length must be between 1 and 256") + private String tenant; + + @ApiModelProperty(value = "Version number") + @NotNull(groups = UpdateValidation.class, message = "version cannot be null") + private Integer version; +} diff --git a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/stream/TemplateServiceImpl.java b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/stream/TemplateServiceImpl.java index f394730f370..872fb57a84b 100644 --- a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/stream/TemplateServiceImpl.java +++ b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/stream/TemplateServiceImpl.java @@ -25,13 +25,16 @@ import org.apache.inlong.manager.common.util.Preconditions; import org.apache.inlong.manager.dao.entity.TemplateEntity; import org.apache.inlong.manager.dao.entity.TemplateFieldEntity; +import org.apache.inlong.manager.dao.entity.TenantTemplateEntity; import org.apache.inlong.manager.dao.mapper.TemplateEntityMapper; import org.apache.inlong.manager.dao.mapper.TemplateFieldEntityMapper; +import org.apache.inlong.manager.dao.mapper.TenantTemplateEntityMapper; import org.apache.inlong.manager.pojo.common.PageResult; import org.apache.inlong.manager.pojo.stream.TemplateField; import org.apache.inlong.manager.pojo.stream.TemplateInfo; import org.apache.inlong.manager.pojo.stream.TemplatePageRequest; import org.apache.inlong.manager.pojo.stream.TemplateRequest; +import org.apache.inlong.manager.pojo.stream.TenantTemplateRequest; import org.apache.inlong.manager.pojo.user.LoginUserUtils; import com.github.pagehelper.Page; @@ -48,6 +51,7 @@ import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; /** * Inlong template service layer implementation @@ -61,6 +65,8 @@ public class TemplateServiceImpl implements TemplateService { private TemplateEntityMapper templateEntityMapper; @Autowired private TemplateFieldEntityMapper templateFieldEntityMapper; + @Autowired + private TenantTemplateEntityMapper tenantTemplateEntityMapper; @Transactional(rollbackFor = Throwable.class) @Override @@ -81,6 +87,14 @@ public Integer save(TemplateRequest request, String operator) { request.setId(templateEntity.getId()); saveField(request); + if (CollectionUtils.isNotEmpty(request.getTenantList())) { + TenantTemplateRequest tagRequest = new TenantTemplateRequest(); + tagRequest.setTemplateName(templateName); + request.getTenantList().forEach(tenant -> { + tagRequest.setTenant(tenant); + this.saveTenantTemplate(tagRequest, operator); + }); + } LOGGER.info("success to save inlong stream info for template name={}", templateName); return templateEntity.getId(); } @@ -106,6 +120,12 @@ public TemplateInfo get(String templateName, String operator) { TemplateInfo templateInfo = CommonBeanUtils.copyProperties(templateEntity, TemplateInfo::new); List templateFields = getTemplateFields(templateEntity.getId()); templateInfo.setFieldList(templateFields); + List tenantList = tenantTemplateEntityMapper + .selectByTemplateName(templateName).stream() + .map(TenantTemplateEntity::getTenant) + .collect(Collectors.toList()); + checkVis(templateEntity, tenantList, operator); + templateInfo.setTenantList(tenantList); return templateInfo; } @@ -127,6 +147,12 @@ public PageResult list(TemplatePageRequest request) { PageResult pageResult = PageResult.fromPage(entityPage) .map(entity -> { TemplateInfo response = CommonBeanUtils.copyProperties(entity, TemplateInfo::new); + + List tenantList = tenantTemplateEntityMapper + .selectByTemplateName(entity.getName()).stream() + .map(TenantTemplateEntity::getTenant) + .collect(Collectors.toList()); + response.setTenantList(tenantList); return response; }); LOGGER.debug("success to list template page, result size {}", pageResult.getList().size()); @@ -284,4 +310,21 @@ public void updateField(TemplateRequest request) { LOGGER.info("success to update template field"); } + public Integer saveTenantTemplate(TenantTemplateRequest request, String operator) { + LOGGER.debug("begin to save tenant template {}", request); + Preconditions.expectNotNull(request, "tenant cluster request cannot be empty"); + Preconditions.expectNotBlank(request.getTemplateName(), ErrorCodeEnum.INVALID_PARAMETER, + "template name cannot be empty"); + Preconditions.expectNotBlank(request.getTenant(), ErrorCodeEnum.INVALID_PARAMETER, + "tenant cannot be empty"); + + TenantTemplateEntity entity = CommonBeanUtils.copyProperties(request, TenantTemplateEntity::new); + entity.setCreator(operator); + entity.setModifier(operator); + tenantTemplateEntityMapper.insert(entity); + LOGGER.info("success to save tenant tag, tenant={}, template name={}", request.getTenant(), + request.getTemplateName()); + return entity.getId(); + } + } diff --git a/inlong-manager/manager-test/src/main/resources/h2/apache_inlong_manager.sql b/inlong-manager/manager-test/src/main/resources/h2/apache_inlong_manager.sql index 9739482638a..3864ffcbe33 100644 --- a/inlong-manager/manager-test/src/main/resources/h2/apache_inlong_manager.sql +++ b/inlong-manager/manager-test/src/main/resources/h2/apache_inlong_manager.sql @@ -942,6 +942,24 @@ CREATE TABLE IF NOT EXISTS `template_field` INDEX `template_field_index` (`template_id`) ); +-- ---------------------------- +-- Table structure for tenant_template +-- ---------------------------- +CREATE TABLE IF NOT EXISTS `tenant_template` +( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Incremental primary key', + `tenant` varchar(256) NOT NULL COMMENT 'Inlong tenant', + `template_name` varchar(128) NOT NULL COMMENT 'template name', + `is_deleted` int(11) DEFAULT '0' COMMENT 'Whether to delete, 0: not deleted, > 0: deleted', + `creator` varchar(64) NOT NULL COMMENT 'Creator name', + `modifier` varchar(64) DEFAULT NULL COMMENT 'Modifier name', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Create time', + `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Modify time', + `version` int(11) NOT NULL DEFAULT '1' COMMENT 'Version number, which will be incremented by 1 after modification', + PRIMARY KEY (`id`), + UNIQUE KEY `unique_tenant_inlong_template` (`tenant`, `template_name`, `is_deleted`) +); + -- ---------------------------- SET FOREIGN_KEY_CHECKS = 1; diff --git a/inlong-manager/manager-web/sql/apache_inlong_manager.sql b/inlong-manager/manager-web/sql/apache_inlong_manager.sql index 3184f880e88..cd31161b1c4 100644 --- a/inlong-manager/manager-web/sql/apache_inlong_manager.sql +++ b/inlong-manager/manager-web/sql/apache_inlong_manager.sql @@ -969,7 +969,7 @@ CREATE TABLE IF NOT EXISTS `template` `version` int(11) NOT NULL DEFAULT '1' COMMENT 'Version number, which will be incremented by 1 after modification', PRIMARY KEY (`id`), UNIQUE KEY `unique_template_name` (`name`, `is_deleted`) - ) ENGINE = InnoDB +) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = 'template'; -- ---------------------------- @@ -995,6 +995,25 @@ CREATE TABLE IF NOT EXISTS `template_field` ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='Template field table'; +-- ---------------------------- +-- Table structure for tenant_template +-- ---------------------------- +CREATE TABLE IF NOT EXISTS `tenant_template` +( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Incremental primary key', + `tenant` varchar(256) NOT NULL COMMENT 'Inlong tenant', + `template_name` varchar(128) NOT NULL COMMENT 'template name', + `is_deleted` int(11) DEFAULT '0' COMMENT 'Whether to delete, 0: not deleted, > 0: deleted', + `creator` varchar(64) NOT NULL COMMENT 'Creator name', + `modifier` varchar(64) DEFAULT NULL COMMENT 'Modifier name', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Create time', + `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Modify time', + `version` int(11) NOT NULL DEFAULT '1' COMMENT 'Version number, which will be incremented by 1 after modification', + PRIMARY KEY (`id`), + UNIQUE KEY `unique_tenant_inlong_template` (`tenant`, `template_name`, `is_deleted`) + ) ENGINE = InnoDB +DEFAULT CHARSET = utf8mb4 COMMENT ='Tenant template table'; + -- ---------------------------- SET FOREIGN_KEY_CHECKS = 1; diff --git a/inlong-manager/manager-web/sql/changes-1.13.0.sql b/inlong-manager/manager-web/sql/changes-1.13.0.sql index f671e57c86a..ecb38b543d6 100644 --- a/inlong-manager/manager-web/sql/changes-1.13.0.sql +++ b/inlong-manager/manager-web/sql/changes-1.13.0.sql @@ -69,3 +69,22 @@ CREATE TABLE IF NOT EXISTS `template_field` INDEX `template_field_index` (`template_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='Template field table'; + +-- ---------------------------- +-- Table structure for tenant_template +-- ---------------------------- +CREATE TABLE IF NOT EXISTS `tenant_template` +( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Incremental primary key', + `tenant` varchar(256) NOT NULL COMMENT 'Inlong tenant', + `template_name` varchar(128) NOT NULL COMMENT 'template name', + `is_deleted` int(11) DEFAULT '0' COMMENT 'Whether to delete, 0: not deleted, > 0: deleted', + `creator` varchar(64) NOT NULL COMMENT 'Creator name', + `modifier` varchar(64) DEFAULT NULL COMMENT 'Modifier name', + `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Create time', + `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Modify time', + `version` int(11) NOT NULL DEFAULT '1' COMMENT 'Version number, which will be incremented by 1 after modification', + PRIMARY KEY (`id`), + UNIQUE KEY `unique_tenant_inlong_template` (`tenant`, `template_name`, `is_deleted`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='Tenant template table'; From 0f66f7f8231df64fc797ae58c3648a9351a8cdfa Mon Sep 17 00:00:00 2001 From: fuwenkai <834260992@qq.com> Date: Tue, 11 Jun 2024 10:08:14 +0800 Subject: [PATCH 2/2] [INLONG-10363][Manager] Fix comment --- .../manager/common/enums/OperationTarget.java | 4 +- .../service/stream/TemplateServiceImpl.java | 16 ++- .../web/controller/TemplateController.java | 106 ++++++++++++++++++ 3 files changed, 119 insertions(+), 7 deletions(-) create mode 100644 inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/TemplateController.java diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java index e6c866a0e13..d92fb31b335 100644 --- a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java +++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java @@ -44,6 +44,8 @@ public enum OperationTarget { INLONG_ROLE, - TENANT_ROLE + TENANT_ROLE, + + TEMPLATE } diff --git a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/stream/TemplateServiceImpl.java b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/stream/TemplateServiceImpl.java index 872fb57a84b..4e04ac0bdd5 100644 --- a/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/stream/TemplateServiceImpl.java +++ b/inlong-manager/manager-service/src/main/java/org/apache/inlong/manager/service/stream/TemplateServiceImpl.java @@ -120,12 +120,16 @@ public TemplateInfo get(String templateName, String operator) { TemplateInfo templateInfo = CommonBeanUtils.copyProperties(templateEntity, TemplateInfo::new); List templateFields = getTemplateFields(templateEntity.getId()); templateInfo.setFieldList(templateFields); - List tenantList = tenantTemplateEntityMapper - .selectByTemplateName(templateName).stream() - .map(TenantTemplateEntity::getTenant) - .collect(Collectors.toList()); - checkVis(templateEntity, tenantList, operator); - templateInfo.setTenantList(tenantList); + List tenantTemplateEntities = tenantTemplateEntityMapper.selectByTemplateName( + templateName); + if (Objects.equals(templateEntity.getVisibleRange(), TemplateVisibleRange.TENANT.name()) + && CollectionUtils.isNotEmpty(tenantTemplateEntities)) { + List tenantList = tenantTemplateEntities.stream() + .map(TenantTemplateEntity::getTenant) + .collect(Collectors.toList()); + checkVis(templateEntity, tenantList, operator); + templateInfo.setTenantList(tenantList); + } return templateInfo; } diff --git a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/TemplateController.java b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/TemplateController.java new file mode 100644 index 00000000000..3f3e2fd3c8f --- /dev/null +++ b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/TemplateController.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.inlong.manager.web.controller; + +import org.apache.inlong.manager.common.enums.OperationTarget; +import org.apache.inlong.manager.common.enums.OperationType; +import org.apache.inlong.manager.common.validation.UpdateValidation; +import org.apache.inlong.manager.pojo.common.PageResult; +import org.apache.inlong.manager.pojo.common.Response; +import org.apache.inlong.manager.pojo.stream.TemplateInfo; +import org.apache.inlong.manager.pojo.stream.TemplatePageRequest; +import org.apache.inlong.manager.pojo.stream.TemplateRequest; +import org.apache.inlong.manager.pojo.user.LoginUserUtils; +import org.apache.inlong.manager.pojo.user.UserRoleCode; +import org.apache.inlong.manager.service.operationlog.OperationLog; +import org.apache.inlong.manager.service.stream.TemplateService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * Inlong Template control layer + */ +@Slf4j +@RestController +@RequestMapping("/api") +@Api(tags = "Inlong-Template-API") +public class TemplateController { + + @Autowired + private TemplateService templateService; + + @RequestMapping(value = "/template/save", method = RequestMethod.POST) + @OperationLog(operation = OperationType.CREATE, operationTarget = OperationTarget.TEMPLATE) + @ApiOperation(value = "Save inlong template") + public Response save(@RequestBody TemplateRequest request) { + int result = templateService.save(request, LoginUserUtils.getLoginUser().getName()); + return Response.success(result); + } + + @RequestMapping(value = "/template/exist/{templateName}", method = RequestMethod.GET) + @ApiOperation(value = "Is the inlong template exists") + @ApiImplicitParam(name = "templateName", dataTypeClass = String.class, required = true) + public Response exist(@PathVariable String templateName) { + return Response.success(templateService.exist(templateName)); + } + + @RequestMapping(value = "/template/get", method = RequestMethod.GET) + @ApiOperation(value = "Get inlong template") + @ApiImplicitParam(name = "templateName", dataTypeClass = String.class, required = true) + public Response get(@RequestParam String templateName) { + return Response.success(templateService.get(templateName, LoginUserUtils.getLoginUser().getName())); + } + + @RequestMapping(value = "/template/list", method = RequestMethod.POST) + @ApiOperation(value = "List inlong template briefs by paginating") + public Response> listByCondition(@RequestBody TemplatePageRequest request) { + request.setCurrentUser(LoginUserUtils.getLoginUser().getName()); + request.setIsAdminRole(LoginUserUtils.getLoginUser().getRoles().contains(UserRoleCode.TENANT_ADMIN)); + return Response.success(templateService.list(request)); + } + + @RequestMapping(value = "/template/update", method = RequestMethod.POST) + @OperationLog(operation = OperationType.UPDATE, operationTarget = OperationTarget.TEMPLATE) + @ApiOperation(value = "Update inlong templater") + public Response update(@Validated(UpdateValidation.class) @RequestBody TemplateRequest request) { + String username = LoginUserUtils.getLoginUser().getName(); + return Response.success(templateService.update(request, username)); + } + + @Deprecated + @RequestMapping(value = "/template/delete", method = RequestMethod.DELETE) + @OperationLog(operation = OperationType.DELETE, operationTarget = OperationTarget.TEMPLATE) + @ApiOperation(value = "Delete inlong template") + @ApiImplicitParam(name = "templateName", dataTypeClass = String.class, required = true) + public Response delete(@RequestParam String templateName) { + String username = LoginUserUtils.getLoginUser().getName(); + return Response.success(templateService.delete(templateName, username)); + } + +}