This is an automated email from the ASF dual-hosted git repository.

dockerzhang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/inlong.git


The following commit(s) were added to refs/heads/master by this push:
     new 1ba62ecc0b [INLONG-10363][Manager] Support template multi tenant 
management (#10372)
1ba62ecc0b is described below

commit 1ba62ecc0ba1fb5b6ccc188c3ca88cbec34dbf51
Author: fuweng11 <76141879+fuwen...@users.noreply.github.com>
AuthorDate: Tue Jun 11 20:51:32 2024 +0800

    [INLONG-10363][Manager] Support template multi tenant management (#10372)
---
 .../manager/common/enums/OperationTarget.java      |   4 +-
 .../manager/dao/entity/TenantTemplateEntity.java}  |  44 ++++----
 .../dao/mapper/TenantTemplateEntityMapper.java}    |  35 +++----
 .../resources/mappers/TemplateEntityMapper.xml     |   1 +
 .../mappers/TenantTemplateEntityMapper.xml         | 112 +++++++++++++++++++++
 .../inlong/manager/pojo/stream/TemplateField.java  |   2 +-
 .../manager/pojo/stream/TenantTemplateInfo.java    |  63 ++++++++++++
 .../pojo/stream/TenantTemplatePageRequest.java     |  48 +++++++++
 .../manager/pojo/stream/TenantTemplateRequest.java |  53 ++++++++++
 .../service/stream/TemplateServiceImpl.java        |  47 +++++++++
 .../main/resources/h2/apache_inlong_manager.sql    |  18 ++++
 .../manager-web/sql/apache_inlong_manager.sql      |  21 +++-
 inlong-manager/manager-web/sql/changes-1.13.0.sql  |  19 ++++
 .../manager/web/controller/TemplateController.java | 106 +++++++++++++++++++
 14 files changed, 522 insertions(+), 51 deletions(-)

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 e6c866a0e1..d92fb31b33 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-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java
 
b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/TenantTemplateEntity.java
similarity index 61%
copy from 
inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java
copy to 
inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/TenantTemplateEntity.java
index e6c866a0e1..e1ceb81143 100644
--- 
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java
+++ 
b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/entity/TenantTemplateEntity.java
@@ -15,35 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.inlong.manager.common.enums;
+package org.apache.inlong.manager.dao.entity;
 
-/**
- * Operation target
- */
-public enum OperationTarget {
-
-    TENANT,
-
-    GROUP,
-
-    STREAM,
-
-    SOURCE,
-
-    SINK,
-
-    CONSUME,
-
-    WORKFLOW,
-
-    NODE,
-
-    CLUSTER,
+import lombok.Data;
 
-    TRANSFORM,
+import java.io.Serializable;
+import java.util.Date;
 
-    INLONG_ROLE,
+@Data
+public class TenantTemplateEntity implements Serializable {
 
-    TENANT_ROLE
+    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-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java
 
b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/TenantTemplateEntityMapper.java
similarity index 52%
copy from 
inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java
copy to 
inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/TenantTemplateEntityMapper.java
index e6c866a0e1..22c037a278 100644
--- 
a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/enums/OperationTarget.java
+++ 
b/inlong-manager/manager-dao/src/main/java/org/apache/inlong/manager/dao/mapper/TenantTemplateEntityMapper.java
@@ -15,35 +15,28 @@
  * limitations under the License.
  */
 
-package org.apache.inlong.manager.common.enums;
+package org.apache.inlong.manager.dao.mapper;
 
-/**
- * Operation target
- */
-public enum OperationTarget {
-
-    TENANT,
-
-    GROUP,
-
-    STREAM,
+import org.apache.inlong.manager.dao.entity.TenantTemplateEntity;
+import org.apache.inlong.manager.pojo.cluster.TenantClusterTagPageRequest;
 
-    SOURCE,
+import org.springframework.stereotype.Repository;
 
-    SINK,
+import java.util.List;
 
-    CONSUME,
+@Repository
+public interface TenantTemplateEntityMapper {
 
-    WORKFLOW,
+    int updateByIdSelective(TenantTemplateEntity record);
 
-    NODE,
+    int insert(TenantTemplateEntity record);
 
-    CLUSTER,
+    TenantTemplateEntity selectByPrimaryKey(Integer id);
 
-    TRANSFORM,
+    TenantTemplateEntity selectByUniqueKey(String templateName, String tenant);
 
-    INLONG_ROLE,
+    List<TenantTemplateEntity> selectByTemplateName(String templateName);
 
-    TENANT_ROLE
+    List<TenantTemplateEntity> 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 9766c9c9d8..93e020cf64 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 ))
             )
             <if test="visibleRange != null">
                 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 0000000000..025bc963a1
--- /dev/null
+++ 
b/inlong-manager/manager-dao/src/main/resources/mappers/TenantTemplateEntityMapper.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd";>
+<mapper 
namespace="org.apache.inlong.manager.dao.mapper.TenantTemplateEntityMapper">
+    <resultMap id="BaseResultMap" 
type="org.apache.inlong.manager.dao.entity.TenantTemplateEntity">
+        <id column="id" jdbcType="INTEGER" property="id" />
+        <result column="tenant" jdbcType="VARCHAR" property="tenant" />
+        <result column="template_name" jdbcType="VARCHAR" 
property="templateName" />
+        <result column="is_deleted" jdbcType="INTEGER" property="isDeleted" />
+        <result column="creator" jdbcType="VARCHAR" property="creator" />
+        <result column="modifier" jdbcType="VARCHAR" property="modifier" />
+        <result column="create_time" jdbcType="TIMESTAMP" 
property="createTime" />
+        <result column="modify_time" jdbcType="TIMESTAMP" 
property="modifyTime" />
+        <result column="version" jdbcType="INTEGER" property="version" />
+    </resultMap>
+    <sql id="Base_Column_List">
+        id, tenant, template_name, is_deleted, creator, modifier, create_time, 
modify_time,
+        version
+    </sql>
+    <select id="selectByPrimaryKey" parameterType="java.lang.Integer" 
resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List" />
+        from tenant_template
+        where id = #{id,jdbcType=INTEGER}
+    </select>
+    <select id="selectByUniqueKey" resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List" />
+        from tenant_template
+        where tenant = #{tenant,jdbcType=VARCHAR}
+        and template_name = #{templateName,jdbcType=VARCHAR}
+        and is_deleted = 0
+    </select>
+    <select id="selectByTemplateName" parameterType="java.lang.String" 
resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List" />
+        from tenant_template
+        where is_deleted = 0
+        and template_name = #{templateName,jdbcType=VARCHAR}
+    </select>
+    <select id="selectByCondition" 
parameterType="org.apache.inlong.manager.pojo.stream.TenantTemplatePageRequest"
+            resultMap="BaseResultMap">
+        select
+        <include refid="Base_Column_List" />
+        from tenant_template
+        <where>
+            is_deleted = 0
+            <if test="tenant != null and tenant != ''">
+                and tenant = #{tenant,jdbcType=VARCHAR}
+            </if>
+            <if test="keyword != null and keyword != ''">
+                and template_name like CONCAT('%', #{keyword}, '%')
+            </if>
+            <if test="tenantList != null and tenantList.size() > 0">
+                and tenant in
+                <foreach item="item" index="index" collection="tenantList" 
open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+        group by template_name, tenant
+        order by modify_time desc
+    </select>
+    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
+        delete from tenant_template
+        where id = #{id,jdbcType=INTEGER}
+    </delete>
+    <insert id="insert" 
parameterType="org.apache.inlong.manager.dao.entity.TenantTemplateEntity">
+        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})
+    </insert>
+    <update id="updateByIdSelective" 
parameterType="org.apache.inlong.manager.dao.entity.TenantTemplateEntity">
+        update tenant_template
+        <set>
+            <if test="tenant != null">
+                tenant = #{tenant,jdbcType=VARCHAR},
+            </if>
+            <if test="templateName != null">
+                template_name = #{templateName,jdbcType=VARCHAR},
+            </if>
+            <if test="isDeleted != null">
+                is_deleted = #{isDeleted,jdbcType=INTEGER},
+            </if>
+            <if test="modifier != null">
+                modifier = #{modifier,jdbcType=VARCHAR},
+            </if>
+            version = #{version,jdbcType=INTEGER} + 1
+        </set>
+        where id = #{id,jdbcType=INTEGER}
+        and version = #{version,jdbcType=INTEGER}
+    </update>
+</mapper>
\ 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 1eef158969..19d7385739 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 0000000000..0710f14f46
--- /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 0000000000..bf53f44dd2
--- /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<String> 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 0000000000..702f1c346e
--- /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 f394730f37..4e04ac0bdd 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.CommonBeanUtils;
 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.ArrayList;
 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 class TemplateServiceImpl implements TemplateService {
         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,16 @@ public class TemplateServiceImpl implements 
TemplateService {
         TemplateInfo templateInfo = 
CommonBeanUtils.copyProperties(templateEntity, TemplateInfo::new);
         List<TemplateField> templateFields = 
getTemplateFields(templateEntity.getId());
         templateInfo.setFieldList(templateFields);
+        List<TenantTemplateEntity> tenantTemplateEntities = 
tenantTemplateEntityMapper.selectByTemplateName(
+                templateName);
+        if (Objects.equals(templateEntity.getVisibleRange(), 
TemplateVisibleRange.TENANT.name())
+                && CollectionUtils.isNotEmpty(tenantTemplateEntities)) {
+            List<String> tenantList = tenantTemplateEntities.stream()
+                    .map(TenantTemplateEntity::getTenant)
+                    .collect(Collectors.toList());
+            checkVis(templateEntity, tenantList, operator);
+            templateInfo.setTenantList(tenantList);
+        }
         return templateInfo;
     }
 
@@ -127,6 +151,12 @@ public class TemplateServiceImpl implements 
TemplateService {
         PageResult<TemplateInfo> pageResult = PageResult.fromPage(entityPage)
                 .map(entity -> {
                     TemplateInfo response = 
CommonBeanUtils.copyProperties(entity, TemplateInfo::new);
+
+                    List<String> 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 +314,21 @@ public class TemplateServiceImpl implements 
TemplateService {
         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 9739482638..3864ffcbe3 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 3184f880e8..cd31161b1c 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 f671e57c86..ecb38b543d 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';
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 0000000000..3f3e2fd3c8
--- /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<Integer> 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<Boolean> 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<TemplateInfo> 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<PageResult<TemplateInfo>> 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<Boolean> 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<Boolean> delete(@RequestParam String templateName) {
+        String username = LoginUserUtils.getLoginUser().getName();
+        return Response.success(templateService.delete(templateName, 
username));
+    }
+
+}


Reply via email to