mirror of
https://repository.entgra.net/community/device-mgt-core.git
synced 2025-10-06 02:01:45 +00:00
Merge pull request 'HierarchicalGrouping' (#137) from ThilinaPremachandra/device-mgt-core:syncHierarchicalGrouping into master
Reviewed-on: https://repository.entgra.net/community/device-mgt-core/pulls/137
This commit is contained in:
commit
d17925cf7f
@ -40,6 +40,7 @@ import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.DeviceToGroupsAssign
|
|||||||
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.ErrorResponse;
|
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.ErrorResponse;
|
||||||
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.RoleList;
|
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.RoleList;
|
||||||
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.Constants;
|
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.Constants;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroupRoleWrapper;
|
||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import javax.ws.rs.Consumes;
|
import javax.ws.rs.Consumes;
|
||||||
@ -182,6 +183,13 @@ import java.util.List;
|
|||||||
key = "perm:groups:devices-types",
|
key = "perm:groups:devices-types",
|
||||||
roles = {"Internal/devicemgt-user"},
|
roles = {"Internal/devicemgt-user"},
|
||||||
permissions = {"/device-mgt/groups/devices/types"}
|
permissions = {"/device-mgt/groups/devices/types"}
|
||||||
|
),
|
||||||
|
@Scope(
|
||||||
|
name = "View whether the groups has relevant device types",
|
||||||
|
description = "View whether the groups has relevant device types",
|
||||||
|
key = "perm:groups:add",
|
||||||
|
roles = {"Internal/devicemgt-user"},
|
||||||
|
permissions = {"/device-mgt/groups/device-types"}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@ -1229,4 +1237,77 @@ public interface GroupManagementService {
|
|||||||
required = true)
|
required = true)
|
||||||
List<String> identifiers);
|
List<String> identifiers);
|
||||||
|
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/roles/share")
|
||||||
|
@ApiOperation(
|
||||||
|
produces = MediaType.APPLICATION_JSON,
|
||||||
|
httpMethod = HTTPConstants.HEADER_POST,
|
||||||
|
value = "Consolidated API for Creating a Device Group, Adding Devices, and Sharing",
|
||||||
|
notes = "This API can be used to create a new device group, add devices to the group, and share the group with user roles.",
|
||||||
|
tags = "Device Group Management",
|
||||||
|
extensions = {
|
||||||
|
@Extension(properties = {
|
||||||
|
@ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:add")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiResponses(
|
||||||
|
value = {
|
||||||
|
@ApiResponse(
|
||||||
|
code = 201,
|
||||||
|
message = "Created. \n Device group has successfully been created.",
|
||||||
|
responseHeaders = {
|
||||||
|
@ResponseHeader(
|
||||||
|
name = "Content-Location",
|
||||||
|
description = "The URL of the created group."),
|
||||||
|
@ResponseHeader(
|
||||||
|
name = "Content-Type",
|
||||||
|
description = "The content type of the body."),
|
||||||
|
@ResponseHeader(
|
||||||
|
name = "ETag",
|
||||||
|
description = "Entity Tag of the response resource.\n" +
|
||||||
|
"Used by caches, or in conditional requests."),
|
||||||
|
@ResponseHeader(
|
||||||
|
name = "Last-Modified",
|
||||||
|
description = "Date and time the resource has been modified the last time.\n" +
|
||||||
|
"Used by caches, or in conditional requests.")
|
||||||
|
}
|
||||||
|
),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 303,
|
||||||
|
message = "See Other. \n Source can be retrieved from the URL specified at the Location " +
|
||||||
|
"header.",
|
||||||
|
responseHeaders = {
|
||||||
|
@ResponseHeader(
|
||||||
|
name = "Content-Location",
|
||||||
|
description = "The Source URL of the document.")}),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 400,
|
||||||
|
message = "Bad Request. \n Invalid request or validation error.",
|
||||||
|
response = ErrorResponse.class),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 401,
|
||||||
|
message = "Unauthorized. \n Current logged in user is not authorized to perform the operation.",
|
||||||
|
response = ErrorResponse.class),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 404,
|
||||||
|
message = "Group not found.",
|
||||||
|
response = ErrorResponse.class),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 406,
|
||||||
|
message = "Not Acceptable.\n The requested media type is not supported."),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 500,
|
||||||
|
message = "Internal Server Error. \n " +
|
||||||
|
"Server error occurred while creating the group or adding devices or sharing the group.",
|
||||||
|
response = ErrorResponse.class)
|
||||||
|
})
|
||||||
|
Response createGroupWithRoles(@ApiParam(
|
||||||
|
name = "group",
|
||||||
|
value = "Define the group object with data.",
|
||||||
|
required = true)
|
||||||
|
@Valid DeviceGroupRoleWrapper group
|
||||||
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,9 +36,16 @@ import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroup;
|
|||||||
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.DeviceGroupList;
|
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.DeviceGroupList;
|
||||||
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.ErrorResponse;
|
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.ErrorResponse;
|
||||||
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.Constants;
|
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.Constants;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroupRoleWrapper;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import javax.ws.rs.*;
|
|
||||||
|
import javax.ws.rs.Consumes;
|
||||||
|
import javax.ws.rs.DefaultValue;
|
||||||
|
import javax.ws.rs.GET;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
import javax.ws.rs.Produces;
|
||||||
|
import javax.ws.rs.QueryParam;
|
||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
|
|
||||||
@ -368,4 +375,79 @@ public interface GroupManagementAdminService {
|
|||||||
required = true)
|
required = true)
|
||||||
@Valid DeviceGroup group);
|
@Valid DeviceGroup group);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/roles/share")
|
||||||
|
@ApiOperation(
|
||||||
|
produces = MediaType.APPLICATION_JSON,
|
||||||
|
httpMethod = HTTPConstants.HEADER_POST,
|
||||||
|
value = "Consolidated API for Creating a Device Group, Adding Devices, and Sharing",
|
||||||
|
notes = "This API can be used to create a new device group, add devices to the group, and share the group with user roles.",
|
||||||
|
tags = "Device Group Management",
|
||||||
|
extensions = {
|
||||||
|
@Extension(properties = {
|
||||||
|
@ExtensionProperty(name = Constants.SCOPE, value = "perm:groups:add")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@ApiResponses(
|
||||||
|
value = {
|
||||||
|
@ApiResponse(
|
||||||
|
code = 201,
|
||||||
|
message = "Created. \n Device group has successfully been created.",
|
||||||
|
responseHeaders = {
|
||||||
|
@ResponseHeader(
|
||||||
|
name = "Content-Location",
|
||||||
|
description = "The URL of the created group."),
|
||||||
|
@ResponseHeader(
|
||||||
|
name = "Content-Type",
|
||||||
|
description = "The content type of the body."),
|
||||||
|
@ResponseHeader(
|
||||||
|
name = "ETag",
|
||||||
|
description = "Entity Tag of the response resource.\n" +
|
||||||
|
"Used by caches, or in conditional requests."),
|
||||||
|
@ResponseHeader(
|
||||||
|
name = "Last-Modified",
|
||||||
|
description = "Date and time the resource has been modified the last time.\n" +
|
||||||
|
"Used by caches, or in conditional requests.")
|
||||||
|
}
|
||||||
|
),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 303,
|
||||||
|
message = "See Other. \n Source can be retrieved from the URL specified at the Location " +
|
||||||
|
"header.",
|
||||||
|
responseHeaders = {
|
||||||
|
@ResponseHeader(
|
||||||
|
name = "Content-Location",
|
||||||
|
description = "The Source URL of the document.")}),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 400,
|
||||||
|
message = "Bad Request. \n Invalid request or validation error.",
|
||||||
|
response = ErrorResponse.class),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 401,
|
||||||
|
message = "Unauthorized. \n Current logged in user is not authorized to perform the operation.",
|
||||||
|
response = ErrorResponse.class),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 404,
|
||||||
|
message = "Group not found.",
|
||||||
|
response = ErrorResponse.class),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 406,
|
||||||
|
message = "Not Acceptable.\n The requested media type is not supported."),
|
||||||
|
@ApiResponse(
|
||||||
|
code = 500,
|
||||||
|
message = "Internal Server Error. \n " +
|
||||||
|
"Server error occurred while creating the group or adding devices or sharing the group.",
|
||||||
|
response = ErrorResponse.class)
|
||||||
|
})
|
||||||
|
Response createGroupWithRoles(@ApiParam(
|
||||||
|
name = "group",
|
||||||
|
value = "Define the group object with data.",
|
||||||
|
required = true)
|
||||||
|
@Valid DeviceGroupRoleWrapper group
|
||||||
|
|
||||||
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,6 +18,14 @@
|
|||||||
|
|
||||||
package io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl;
|
package io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl;
|
||||||
|
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroup;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroupConstants;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroupRoleWrapper;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceTypesOfGroups;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupAlreadyExistException;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupManagementException;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupNotExistException;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.RoleDoesNotExistException;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.wso2.carbon.CarbonConstants;
|
import org.wso2.carbon.CarbonConstants;
|
||||||
@ -29,13 +37,6 @@ import io.entgra.device.mgt.core.device.mgt.common.GroupPaginationRequest;
|
|||||||
import io.entgra.device.mgt.core.device.mgt.common.PaginationResult;
|
import io.entgra.device.mgt.core.device.mgt.common.PaginationResult;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException;
|
import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceNotFoundException;
|
import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceNotFoundException;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroup;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroupConstants;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceTypesOfGroups;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupAlreadyExistException;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupManagementException;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupNotExistException;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.RoleDoesNotExistException;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService;
|
import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService;
|
||||||
import io.entgra.device.mgt.core.device.mgt.core.service.GroupManagementProviderService;
|
import io.entgra.device.mgt.core.device.mgt.core.service.GroupManagementProviderService;
|
||||||
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.DeviceGroupList;
|
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.DeviceGroupList;
|
||||||
@ -430,4 +431,37 @@ public class GroupManagementServiceImpl implements GroupManagementService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@POST
|
||||||
|
@Path("/roles/share")
|
||||||
|
@Override
|
||||||
|
public Response createGroupWithRoles(DeviceGroupRoleWrapper groups) {
|
||||||
|
if (groups == null) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).build();
|
||||||
|
}
|
||||||
|
groups.setOwner(PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername());
|
||||||
|
groups.setStatus(DeviceGroupConstants.GroupStatus.ACTIVE);
|
||||||
|
try {
|
||||||
|
DeviceMgtAPIUtils.getGroupManagementProviderService().createGroupWithRoles(groups, DEFAULT_ADMIN_ROLE, DEFAULT_ADMIN_PERMISSIONS);
|
||||||
|
DeviceGroup group = DeviceMgtAPIUtils.getGroupManagementProviderService().getGroup(groups.getName(),
|
||||||
|
PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername().isEmpty());
|
||||||
|
if (group != null) {
|
||||||
|
DeviceMgtAPIUtils.getGroupManagementProviderService().manageGroupSharing(group.getGroupId(), groups.getUserRoles());
|
||||||
|
return Response.status(Response.Status.CREATED).entity(group.getGroupId()).build();
|
||||||
|
} else {
|
||||||
|
String msg = "Error occurred while retrieving newly created group.";
|
||||||
|
log.error(msg);
|
||||||
|
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
|
||||||
|
}
|
||||||
|
} catch (GroupManagementException e) {
|
||||||
|
String msg = "Error occurred while adding " + groups.getName() + " group";
|
||||||
|
log.error(msg, e);
|
||||||
|
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
|
||||||
|
} catch (GroupAlreadyExistException e) {
|
||||||
|
String msg = "Group already exists with name : " + groups.getName() + ".";
|
||||||
|
log.warn(msg);
|
||||||
|
return Response.status(Response.Status.CONFLICT).entity(msg).build();
|
||||||
|
} catch (RoleDoesNotExistException e) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -17,21 +17,25 @@
|
|||||||
*/
|
*/
|
||||||
package io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl.admin;
|
package io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl.admin;
|
||||||
|
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroup;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroupConstants;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroupRoleWrapper;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupAlreadyExistException;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupManagementException;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.RoleDoesNotExistException;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.GroupPaginationRequest;
|
import io.entgra.device.mgt.core.device.mgt.common.GroupPaginationRequest;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.PaginationResult;
|
import io.entgra.device.mgt.core.device.mgt.common.PaginationResult;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroup;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroupConstants;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupAlreadyExistException;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupManagementException;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.DeviceGroupList;
|
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.beans.DeviceGroupList;
|
||||||
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.api.admin.GroupManagementAdminService;
|
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.api.admin.GroupManagementAdminService;
|
||||||
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl.util.RequestValidationUtil;
|
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl.util.RequestValidationUtil;
|
||||||
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.DeviceMgtAPIUtils;
|
import io.entgra.device.mgt.core.device.mgt.api.jaxrs.util.DeviceMgtAPIUtils;
|
||||||
|
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||||
|
|
||||||
import javax.ws.rs.DefaultValue;
|
import javax.ws.rs.DefaultValue;
|
||||||
import javax.ws.rs.GET;
|
import javax.ws.rs.GET;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
import javax.ws.rs.Path;
|
import javax.ws.rs.Path;
|
||||||
import javax.ws.rs.QueryParam;
|
import javax.ws.rs.QueryParam;
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
@ -144,4 +148,31 @@ public class GroupManagementAdminServiceImpl implements GroupManagementAdminServ
|
|||||||
return Response.status(Response.Status.CONFLICT).entity(msg).build();
|
return Response.status(Response.Status.CONFLICT).entity(msg).build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@POST
|
||||||
|
@Path("/roles/share")
|
||||||
|
@Override
|
||||||
|
public Response createGroupWithRoles(DeviceGroupRoleWrapper group) {
|
||||||
|
if (group == null) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).build();
|
||||||
|
}
|
||||||
|
group.setOwner(PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername());
|
||||||
|
group.setStatus(DeviceGroupConstants.GroupStatus.ACTIVE);
|
||||||
|
try {
|
||||||
|
DeviceMgtAPIUtils.getGroupManagementProviderService().createGroupWithRoles(group, DEFAULT_ADMIN_ROLE, DEFAULT_ADMIN_PERMISSIONS);
|
||||||
|
DeviceMgtAPIUtils.getGroupManagementProviderService().manageGroupSharing(group.getGroupId(), group.getUserRoles());
|
||||||
|
return Response.status(Response.Status.CREATED).build();
|
||||||
|
} catch (GroupManagementException e) {
|
||||||
|
String msg = "Error occurred while adding " + group.getName() + " group";
|
||||||
|
log.error(msg, e);
|
||||||
|
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
|
||||||
|
} catch (GroupAlreadyExistException e) {
|
||||||
|
String msg = "Group already exists with name : " + group.getName() + ".";
|
||||||
|
log.warn(msg);
|
||||||
|
return Response.status(Response.Status.CONFLICT).entity(msg).build();
|
||||||
|
} catch (RoleDoesNotExistException e) {
|
||||||
|
return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,151 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 - 2023, Entgra (Pvt) Ltd. (http://www.entgra.io) All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Entgra (Pvt) Ltd. 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 io.entgra.device.mgt.core.device.mgt.common.group.mgt;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import io.swagger.annotations.ApiParam;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Holds Device Group details and expose to external access
|
||||||
|
*/
|
||||||
|
@ApiModel(value = "DeviceGroupRoleWrapper", description = "This class carries all information related to a managed device group.")
|
||||||
|
public class DeviceGroupRoleWrapper implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1998121711L;
|
||||||
|
|
||||||
|
@ApiModelProperty(name = "id", value = "ID of the device group in the device group information database.")
|
||||||
|
private int id;
|
||||||
|
|
||||||
|
@ApiModelProperty(name = "description", value = "The device group description that can be set on the device group by the user.", required = true)
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
@ApiModelProperty(name = "name", value = "The device group name that can be set on the device group by the user.", required = true)
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private String owner;
|
||||||
|
|
||||||
|
@ApiModelProperty(name = "status", value = "The status of group that needs updating/retrieval.")
|
||||||
|
private String status;
|
||||||
|
|
||||||
|
@ApiModelProperty(name = "parentGroupId", value = "Group ID of parent group")
|
||||||
|
private int parentGroupId;
|
||||||
|
|
||||||
|
@ApiModelProperty(name = "parentPath", value = "Path of parent group")
|
||||||
|
private String parentPath;
|
||||||
|
|
||||||
|
@ApiModelProperty(name = "childrenGroups", value = "Children groups")
|
||||||
|
private List<DeviceGroup> childrenGroups;
|
||||||
|
|
||||||
|
@ApiModelProperty(name = "userRoles", value = "User roles")
|
||||||
|
private List<String> userRoles;
|
||||||
|
|
||||||
|
public DeviceGroupRoleWrapper() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public DeviceGroupRoleWrapper(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(String status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, String> groupProperties;
|
||||||
|
|
||||||
|
public int getGroupId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGroupId(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOwner() {
|
||||||
|
return owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOwner(String owner) {
|
||||||
|
this.owner = owner;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getGroupProperties() {
|
||||||
|
return groupProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGroupProperties(Map<String, String> groupProperties) {
|
||||||
|
this.groupProperties = groupProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getParentGroupId() {
|
||||||
|
return parentGroupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParentGroupId(int parentGroupId) {
|
||||||
|
this.parentGroupId = parentGroupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getParentPath() {
|
||||||
|
return parentPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParentPath(String parentPath) {
|
||||||
|
this.parentPath = parentPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<DeviceGroup> getChildrenGroups() {
|
||||||
|
return childrenGroups;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setChildrenGroups(List<DeviceGroup> childrenGroups) {
|
||||||
|
this.childrenGroups = childrenGroups;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getUserRoles() {
|
||||||
|
return userRoles;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserRoles(List<String> userRoles) {
|
||||||
|
this.userRoles = userRoles;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -23,6 +23,7 @@ import io.entgra.device.mgt.core.device.mgt.common.GroupPaginationRequest;
|
|||||||
import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest;
|
import io.entgra.device.mgt.core.device.mgt.common.PaginationRequest;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.exceptions.ReportManagementException;
|
import io.entgra.device.mgt.core.device.mgt.common.exceptions.ReportManagementException;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroup;
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroup;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroupRoleWrapper;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -41,6 +42,18 @@ public interface GroupDAO {
|
|||||||
*/
|
*/
|
||||||
int addGroup(DeviceGroup deviceGroup, int tenantId) throws GroupManagementDAOException;
|
int addGroup(DeviceGroup deviceGroup, int tenantId) throws GroupManagementDAOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add properties for device group.
|
||||||
|
* Note that groupId parameter is considered seperately due to the groupId parameter passed with
|
||||||
|
* device group Payload is ignored in the add/update logic instead the internal groupId reference is used.
|
||||||
|
*
|
||||||
|
* @param groups to be added.
|
||||||
|
* @param tenantId of the group.
|
||||||
|
* @return sql execution result.
|
||||||
|
* @throws GroupManagementDAOException
|
||||||
|
*/
|
||||||
|
int addGroupWithRoles(DeviceGroupRoleWrapper groups, int tenantId) throws GroupManagementDAOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add properties for device group.
|
* Add properties for device group.
|
||||||
* Note that groupId parameter is considered seperately due to the groupId parameter passed with
|
* Note that groupId parameter is considered seperately due to the groupId parameter passed with
|
||||||
@ -53,6 +66,18 @@ public interface GroupDAO {
|
|||||||
*/
|
*/
|
||||||
boolean addGroupProperties(DeviceGroup deviceGroup, int groupId, int tenantId) throws GroupManagementDAOException;
|
boolean addGroupProperties(DeviceGroup deviceGroup, int groupId, int tenantId) throws GroupManagementDAOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update properties for device group.
|
||||||
|
* Note that groupId parameter is considered seperately due to the groupId parameter passed with
|
||||||
|
* device group Payload is ignored in the add/update logic instead the internal groupId reference is used.
|
||||||
|
*
|
||||||
|
* @param groups to be updated.
|
||||||
|
* @param tenantId of the group.
|
||||||
|
* @return sql execution result.
|
||||||
|
* @throws GroupManagementDAOException
|
||||||
|
*/
|
||||||
|
boolean addGroupPropertiesWithRoles(DeviceGroupRoleWrapper groups, int groupId, int tenantId) throws GroupManagementDAOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update properties for device group.
|
* Update properties for device group.
|
||||||
* Note that groupId parameter is considered seperately due to the groupId parameter passed with
|
* Note that groupId parameter is considered seperately due to the groupId parameter passed with
|
||||||
|
|||||||
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
package io.entgra.device.mgt.core.device.mgt.core.dao.impl;
|
package io.entgra.device.mgt.core.device.mgt.core.dao.impl;
|
||||||
|
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroupRoleWrapper;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
@ -53,7 +54,7 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
|
|||||||
throws GroupManagementDAOException {
|
throws GroupManagementDAOException {
|
||||||
try {
|
try {
|
||||||
Connection conn = GroupManagementDAOFactory.getConnection();
|
Connection conn = GroupManagementDAOFactory.getConnection();
|
||||||
String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH FROM DM_GROUP "
|
String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH, PARENT_GROUP_ID FROM DM_GROUP "
|
||||||
+ "WHERE TENANT_ID = ?";
|
+ "WHERE TENANT_ID = ?";
|
||||||
if (StringUtils.isNotBlank(request.getGroupName())) {
|
if (StringUtils.isNotBlank(request.getGroupName())) {
|
||||||
sql += " AND GROUP_NAME LIKE ?";
|
sql += " AND GROUP_NAME LIKE ?";
|
||||||
@ -115,7 +116,7 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
Connection conn = GroupManagementDAOFactory.getConnection();
|
Connection conn = GroupManagementDAOFactory.getConnection();
|
||||||
String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH FROM DM_GROUP WHERE TENANT_ID = ?";
|
String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH, PARENT_GROUP_ID FROM DM_GROUP WHERE TENANT_ID = ?";
|
||||||
if (StringUtils.isNotBlank(request.getGroupName())) {
|
if (StringUtils.isNotBlank(request.getGroupName())) {
|
||||||
sql += " AND GROUP_NAME LIKE ?";
|
sql += " AND GROUP_NAME LIKE ?";
|
||||||
}
|
}
|
||||||
@ -179,11 +180,11 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
|
|||||||
Connection conn = GroupManagementDAOFactory.getConnection();
|
Connection conn = GroupManagementDAOFactory.getConnection();
|
||||||
String sql;
|
String sql;
|
||||||
if (deviceGroup.getStatus() == null || deviceGroup.getStatus().isEmpty()) {
|
if (deviceGroup.getStatus() == null || deviceGroup.getStatus().isEmpty()) {
|
||||||
sql = "INSERT INTO DM_GROUP(DESCRIPTION, GROUP_NAME, OWNER, TENANT_ID, PARENT_PATH) "
|
sql = "INSERT INTO DM_GROUP(DESCRIPTION, GROUP_NAME, OWNER, TENANT_ID, PARENT_PATH, PARENT_GROUP_ID) "
|
||||||
+ "VALUES (?, ?, ?, ?, ?)";
|
|
||||||
} else {
|
|
||||||
sql = "INSERT INTO DM_GROUP(DESCRIPTION, GROUP_NAME, OWNER, TENANT_ID, PARENT_PATH, STATUS) "
|
|
||||||
+ "VALUES (?, ?, ?, ?, ?, ?)";
|
+ "VALUES (?, ?, ?, ?, ?, ?)";
|
||||||
|
} else {
|
||||||
|
sql = "INSERT INTO DM_GROUP(DESCRIPTION, GROUP_NAME, OWNER, TENANT_ID, PARENT_PATH, PARENT_GROUP_ID, STATUS) "
|
||||||
|
+ "VALUES (?, ?, ?, ?, ?, ?, ?)";
|
||||||
hasStatus = true;
|
hasStatus = true;
|
||||||
}
|
}
|
||||||
stmt = conn.prepareStatement(sql, new String[]{"ID"});
|
stmt = conn.prepareStatement(sql, new String[]{"ID"});
|
||||||
@ -192,10 +193,10 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
|
|||||||
stmt.setString(3, deviceGroup.getOwner());
|
stmt.setString(3, deviceGroup.getOwner());
|
||||||
stmt.setInt(4, tenantId);
|
stmt.setInt(4, tenantId);
|
||||||
stmt.setString(5, deviceGroup.getParentPath());
|
stmt.setString(5, deviceGroup.getParentPath());
|
||||||
|
stmt.setInt(6, deviceGroup.getParentGroupId());
|
||||||
if (hasStatus) {
|
if (hasStatus) {
|
||||||
stmt.setString(6, deviceGroup.getStatus());
|
stmt.setString(7, deviceGroup.getStatus());
|
||||||
}
|
}
|
||||||
|
|
||||||
stmt.executeUpdate();
|
stmt.executeUpdate();
|
||||||
rs = stmt.getGeneratedKeys();
|
rs = stmt.getGeneratedKeys();
|
||||||
if (rs.next()) {
|
if (rs.next()) {
|
||||||
@ -210,6 +211,47 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int addGroupWithRoles(DeviceGroupRoleWrapper groups, int tenantId) throws GroupManagementDAOException {
|
||||||
|
int groupId = -1;
|
||||||
|
boolean hasStatus = false;
|
||||||
|
try {
|
||||||
|
Connection conn = GroupManagementDAOFactory.getConnection();
|
||||||
|
String sql;
|
||||||
|
if (groups.getStatus() == null || groups.getStatus().isEmpty()) {
|
||||||
|
sql = "INSERT INTO DM_GROUP(DESCRIPTION, GROUP_NAME, OWNER, TENANT_ID, PARENT_PATH, PARENT_GROUP_ID) "
|
||||||
|
+ "VALUES (?, ?, ?, ?, ?, ?)";
|
||||||
|
} else {
|
||||||
|
sql = "INSERT INTO DM_GROUP(DESCRIPTION, GROUP_NAME, OWNER, TENANT_ID, PARENT_PATH, PARENT_GROUP_ID, STATUS) "
|
||||||
|
+ "VALUES (?, ?, ?, ?, ?, ?, ?)";
|
||||||
|
hasStatus = true;
|
||||||
|
}
|
||||||
|
try (PreparedStatement stmt = conn.prepareStatement(sql, new String[]{"ID"})) {
|
||||||
|
stmt.setString(1, groups.getDescription());
|
||||||
|
stmt.setString(2, groups.getName());
|
||||||
|
stmt.setString(3, groups.getOwner());
|
||||||
|
stmt.setInt(4, tenantId);
|
||||||
|
stmt.setString(5, groups.getParentPath());
|
||||||
|
stmt.setInt(6, groups.getParentGroupId());
|
||||||
|
if (hasStatus) {
|
||||||
|
stmt.setString(7, groups.getStatus());
|
||||||
|
}
|
||||||
|
stmt.executeUpdate();
|
||||||
|
try (ResultSet rs = stmt.getGeneratedKeys();) {
|
||||||
|
if (rs.next()) {
|
||||||
|
groupId = rs.getInt(1);
|
||||||
|
}
|
||||||
|
return groupId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
String msg = "Error occurred while adding deviceGroup '" +
|
||||||
|
groups.getName() + "'";
|
||||||
|
log.error(msg);
|
||||||
|
throw new GroupManagementDAOException(msg, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean addGroupProperties(DeviceGroup deviceGroup, int groupId, int tenantId)
|
public boolean addGroupProperties(DeviceGroup deviceGroup, int groupId, int tenantId)
|
||||||
throws GroupManagementDAOException {
|
throws GroupManagementDAOException {
|
||||||
boolean status;
|
boolean status;
|
||||||
@ -238,6 +280,33 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean addGroupPropertiesWithRoles(DeviceGroupRoleWrapper groups, int groupId, int tenantId)
|
||||||
|
throws GroupManagementDAOException {
|
||||||
|
boolean status;
|
||||||
|
try {
|
||||||
|
Connection conn = GroupManagementDAOFactory.getConnection();
|
||||||
|
try (PreparedStatement stmt = conn.prepareStatement(
|
||||||
|
"INSERT INTO GROUP_PROPERTIES(GROUP_ID, PROPERTY_NAME, " +
|
||||||
|
"PROPERTY_VALUE, TENANT_ID) VALUES (?, ?, ?, ?)")) {
|
||||||
|
for (Map.Entry<String, String> entry : groups.getGroupProperties().entrySet()) {
|
||||||
|
stmt.setInt(1, groupId);
|
||||||
|
stmt.setString(2, entry.getKey());
|
||||||
|
stmt.setString(3, entry.getValue());
|
||||||
|
stmt.setInt(4, tenantId);
|
||||||
|
stmt.addBatch();
|
||||||
|
}
|
||||||
|
stmt.executeBatch();
|
||||||
|
status = true;
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
String msg = "Error occurred while adding properties for group '" +
|
||||||
|
groups.getName() + "' values : " + groups.getGroupProperties();
|
||||||
|
log.error(msg);
|
||||||
|
throw new GroupManagementDAOException(msg, e);
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean updateGroupProperties(DeviceGroup deviceGroup, int groupId, int tenantId)
|
public boolean updateGroupProperties(DeviceGroup deviceGroup, int groupId, int tenantId)
|
||||||
throws GroupManagementDAOException {
|
throws GroupManagementDAOException {
|
||||||
boolean status;
|
boolean status;
|
||||||
@ -495,7 +564,7 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
|
|||||||
ResultSet resultSet = null;
|
ResultSet resultSet = null;
|
||||||
try {
|
try {
|
||||||
Connection conn = GroupManagementDAOFactory.getConnection();
|
Connection conn = GroupManagementDAOFactory.getConnection();
|
||||||
String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH FROM DM_GROUP WHERE ID = ? "
|
String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH, PARENT_GROUP_ID FROM DM_GROUP WHERE ID = ? "
|
||||||
+ "AND TENANT_ID = ?";
|
+ "AND TENANT_ID = ?";
|
||||||
stmt = conn.prepareStatement(sql);
|
stmt = conn.prepareStatement(sql);
|
||||||
stmt.setInt(1, groupId);
|
stmt.setInt(1, groupId);
|
||||||
@ -518,7 +587,7 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
|
|||||||
public List<DeviceGroup> getChildrenGroups(String parentPath, int tenantId) throws GroupManagementDAOException {
|
public List<DeviceGroup> getChildrenGroups(String parentPath, int tenantId) throws GroupManagementDAOException {
|
||||||
try {
|
try {
|
||||||
Connection conn = GroupManagementDAOFactory.getConnection();
|
Connection conn = GroupManagementDAOFactory.getConnection();
|
||||||
String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH FROM DM_GROUP "
|
String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH, PARENT_GROUP_ID FROM DM_GROUP "
|
||||||
+ "WHERE PARENT_PATH LIKE ? AND TENANT_ID = ?";
|
+ "WHERE PARENT_PATH LIKE ? AND TENANT_ID = ?";
|
||||||
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
||||||
stmt.setString(1, parentPath + "%");
|
stmt.setString(1, parentPath + "%");
|
||||||
@ -543,7 +612,7 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
|
|||||||
public List<DeviceGroup> getRootGroups(int tenantId) throws GroupManagementDAOException {
|
public List<DeviceGroup> getRootGroups(int tenantId) throws GroupManagementDAOException {
|
||||||
try {
|
try {
|
||||||
Connection conn = GroupManagementDAOFactory.getConnection();
|
Connection conn = GroupManagementDAOFactory.getConnection();
|
||||||
String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH FROM DM_GROUP "
|
String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH, PARENT_GROUP_ID FROM DM_GROUP "
|
||||||
+ "WHERE PARENT_PATH LIKE ? AND TENANT_ID = ?";
|
+ "WHERE PARENT_PATH LIKE ? AND TENANT_ID = ?";
|
||||||
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
||||||
stmt.setString(1, "/");
|
stmt.setString(1, "/");
|
||||||
@ -571,7 +640,7 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
|
|||||||
List<DeviceGroup> deviceGroupBuilders = new ArrayList<>();
|
List<DeviceGroup> deviceGroupBuilders = new ArrayList<>();
|
||||||
try {
|
try {
|
||||||
Connection conn = GroupManagementDAOFactory.getConnection();
|
Connection conn = GroupManagementDAOFactory.getConnection();
|
||||||
String sql = "SELECT G.ID, G.GROUP_NAME, G.DESCRIPTION, G.OWNER, G.STATUS, G.PARENT_PATH FROM DM_GROUP G " +
|
String sql = "SELECT G.ID, G.GROUP_NAME, G.DESCRIPTION, G.OWNER, G.STATUS, G.PARENT_PATH, G.PARENT_GROUP_ID FROM DM_GROUP G " +
|
||||||
"INNER JOIN DM_DEVICE_GROUP_MAP GM ON G.ID = GM.GROUP_ID " +
|
"INNER JOIN DM_DEVICE_GROUP_MAP GM ON G.ID = GM.GROUP_ID " +
|
||||||
"WHERE GM.DEVICE_ID = ? AND GM.TENANT_ID = ?";
|
"WHERE GM.DEVICE_ID = ? AND GM.TENANT_ID = ?";
|
||||||
stmt = conn.prepareStatement(sql);
|
stmt = conn.prepareStatement(sql);
|
||||||
@ -709,7 +778,7 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
|
|||||||
try {
|
try {
|
||||||
Connection conn = GroupManagementDAOFactory.getConnection();
|
Connection conn = GroupManagementDAOFactory.getConnection();
|
||||||
String sql =
|
String sql =
|
||||||
"SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH FROM DM_GROUP "
|
"SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH, PARENT_GROUP_ID FROM DM_GROUP "
|
||||||
+ "WHERE LOWER(GROUP_NAME) = LOWER(?) AND TENANT_ID = ?";
|
+ "WHERE LOWER(GROUP_NAME) = LOWER(?) AND TENANT_ID = ?";
|
||||||
stmt = conn.prepareStatement(sql);
|
stmt = conn.prepareStatement(sql);
|
||||||
stmt.setString(1, groupName);
|
stmt.setString(1, groupName);
|
||||||
@ -880,7 +949,7 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
|
|||||||
List<DeviceGroup> deviceGroupList = null;
|
List<DeviceGroup> deviceGroupList = null;
|
||||||
try {
|
try {
|
||||||
Connection conn = GroupManagementDAOFactory.getConnection();
|
Connection conn = GroupManagementDAOFactory.getConnection();
|
||||||
String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH FROM DM_GROUP g, " +
|
String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH, PARENT_GROUP_ID P FROM DM_GROUP g, " +
|
||||||
"(SELECT GROUP_ID FROM DM_ROLE_GROUP_MAP WHERE ROLE IN (";
|
"(SELECT GROUP_ID FROM DM_ROLE_GROUP_MAP WHERE ROLE IN (";
|
||||||
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
@ -994,7 +1063,7 @@ public abstract class AbstractGroupDAOImpl implements GroupDAO {
|
|||||||
List<DeviceGroup> deviceGroupList = null;
|
List<DeviceGroup> deviceGroupList = null;
|
||||||
try {
|
try {
|
||||||
Connection conn = GroupManagementDAOFactory.getConnection();
|
Connection conn = GroupManagementDAOFactory.getConnection();
|
||||||
String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH FROM DM_GROUP "
|
String sql = "SELECT ID, DESCRIPTION, GROUP_NAME, OWNER, STATUS, PARENT_PATH, PARENT_GROUP_ID FROM DM_GROUP "
|
||||||
+ "WHERE OWNER = ? AND TENANT_ID = ?";
|
+ "WHERE OWNER = ? AND TENANT_ID = ?";
|
||||||
stmt = conn.prepareStatement(sql);
|
stmt = conn.prepareStatement(sql);
|
||||||
stmt.setString(1, username);
|
stmt.setString(1, username);
|
||||||
|
|||||||
@ -18,6 +18,9 @@
|
|||||||
|
|
||||||
package io.entgra.device.mgt.core.device.mgt.core.dao.impl.group;
|
package io.entgra.device.mgt.core.device.mgt.core.dao.impl.group;
|
||||||
|
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroupRoleWrapper;
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.apache.solr.common.StringUtils;
|
import org.apache.solr.common.StringUtils;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.Device;
|
import io.entgra.device.mgt.core.device.mgt.common.Device;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroup;
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroup;
|
||||||
@ -39,6 +42,8 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class PostgreSQLGroupDAOImpl extends AbstractGroupDAOImpl {
|
public class PostgreSQLGroupDAOImpl extends AbstractGroupDAOImpl {
|
||||||
|
|
||||||
|
private static final Log log = LogFactory.getLog(PostgreSQLGroupDAOImpl.class);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int addGroup(DeviceGroup deviceGroup, int tenantId) throws GroupManagementDAOException {
|
public int addGroup(DeviceGroup deviceGroup, int tenantId) throws GroupManagementDAOException {
|
||||||
PreparedStatement stmt = null;
|
PreparedStatement stmt = null;
|
||||||
@ -49,7 +54,7 @@ public class PostgreSQLGroupDAOImpl extends AbstractGroupDAOImpl {
|
|||||||
Connection conn = GroupManagementDAOFactory.getConnection();
|
Connection conn = GroupManagementDAOFactory.getConnection();
|
||||||
String sql;
|
String sql;
|
||||||
if(StringUtils.isEmpty(deviceGroup.getStatus())) {
|
if(StringUtils.isEmpty(deviceGroup.getStatus())) {
|
||||||
sql = "INSERT INTO DM_GROUP(DESCRIPTION, GROUP_NAME, OWNER, TENANT_ID, PARENT_PATH) " +
|
sql = "INSERT INTO DM_GROUP(DESCRIPTION, GROUP_NAME, OWNER, TENANT_ID, PARENT_PATH, PARENT_GROUP_ID) " +
|
||||||
"VALUES (?, ?, ?, ?) RETURNING ID";
|
"VALUES (?, ?, ?, ?) RETURNING ID";
|
||||||
} else {
|
} else {
|
||||||
sql = "INSERT INTO DM_GROUP(DESCRIPTION, GROUP_NAME, OWNER, TENANT_ID, PARENT_PATH, STATUS) " +
|
sql = "INSERT INTO DM_GROUP(DESCRIPTION, GROUP_NAME, OWNER, TENANT_ID, PARENT_PATH, STATUS) " +
|
||||||
@ -79,6 +84,46 @@ public class PostgreSQLGroupDAOImpl extends AbstractGroupDAOImpl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int addGroupWithRoles(DeviceGroupRoleWrapper groups, int tenantId) throws GroupManagementDAOException {
|
||||||
|
int groupId = -1;
|
||||||
|
boolean hasStatus = false;
|
||||||
|
try {
|
||||||
|
Connection conn = GroupManagementDAOFactory.getConnection();
|
||||||
|
String sql;
|
||||||
|
if (StringUtils.isEmpty(groups.getStatus())) {
|
||||||
|
sql = "INSERT INTO DM_GROUP(DESCRIPTION, GROUP_NAME, OWNER, TENANT_ID, PARENT_PATH) " +
|
||||||
|
"VALUES (?, ?, ?, ?) RETURNING ID";
|
||||||
|
} else {
|
||||||
|
sql = "INSERT INTO DM_GROUP(DESCRIPTION, GROUP_NAME, OWNER, TENANT_ID, PARENT_PATH, STATUS) " +
|
||||||
|
"VALUES (?, ?, ?, ?, ?) RETURNING ID";
|
||||||
|
hasStatus = true;
|
||||||
|
}
|
||||||
|
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
|
||||||
|
stmt.setString(1, groups.getDescription());
|
||||||
|
stmt.setString(2, groups.getName());
|
||||||
|
stmt.setString(3, groups.getOwner());
|
||||||
|
stmt.setInt(4, tenantId);
|
||||||
|
stmt.setString(5, groups.getParentPath());
|
||||||
|
if (hasStatus) {
|
||||||
|
stmt.setString(6, groups.getStatus());
|
||||||
|
}
|
||||||
|
stmt.execute();
|
||||||
|
try (ResultSet rs = stmt.getGeneratedKeys()) {
|
||||||
|
if (rs.next()) {
|
||||||
|
groupId = rs.getInt(1);
|
||||||
|
}
|
||||||
|
return groupId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
String msg = "Error occurred while adding deviceGroup '" +
|
||||||
|
groups.getName() + "'";
|
||||||
|
log.error(msg);
|
||||||
|
throw new GroupManagementDAOException(msg, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Device> getDevices(int groupId, int startIndex, int rowCount, int tenantId)
|
public List<Device> getDevices(int groupId, int startIndex, int rowCount, int tenantId)
|
||||||
throws GroupManagementDAOException {
|
throws GroupManagementDAOException {
|
||||||
|
|||||||
@ -87,6 +87,7 @@ public final class GroupManagementDAOUtil {
|
|||||||
group.setOwner(resultSet.getString("OWNER"));
|
group.setOwner(resultSet.getString("OWNER"));
|
||||||
group.setStatus(resultSet.getString("STATUS"));
|
group.setStatus(resultSet.getString("STATUS"));
|
||||||
group.setParentPath(resultSet.getString("PARENT_PATH"));
|
group.setParentPath(resultSet.getString("PARENT_PATH"));
|
||||||
|
group.setParentGroupId(resultSet.getInt("PARENT_GROUP_ID"));
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -24,6 +24,7 @@ import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceNotFoundExce
|
|||||||
import io.entgra.device.mgt.core.device.mgt.common.GroupPaginationRequest;
|
import io.entgra.device.mgt.core.device.mgt.common.GroupPaginationRequest;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.PaginationResult;
|
import io.entgra.device.mgt.core.device.mgt.common.PaginationResult;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroup;
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroup;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroupRoleWrapper;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceTypesOfGroups;
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceTypesOfGroups;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupAlreadyExistException;
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupAlreadyExistException;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupManagementException;
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupManagementException;
|
||||||
@ -48,6 +49,16 @@ public interface GroupManagementProviderService {
|
|||||||
void createGroup(DeviceGroup deviceGroup, String defaultRole,
|
void createGroup(DeviceGroup deviceGroup, String defaultRole,
|
||||||
String[] defaultPermissions) throws GroupManagementException, GroupAlreadyExistException;
|
String[] defaultPermissions) throws GroupManagementException, GroupAlreadyExistException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add new device group and create default role with default permissions.
|
||||||
|
*
|
||||||
|
* @param groups to add
|
||||||
|
* @param defaultRole of the deviceGroup
|
||||||
|
* @param defaultPermissions of the default role
|
||||||
|
* @throws GroupManagementException
|
||||||
|
*/
|
||||||
|
void createGroupWithRoles(DeviceGroupRoleWrapper groups, String defaultRole, String[] defaultPermissions) throws GroupManagementException, GroupAlreadyExistException, RoleDoesNotExistException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update existing device group.
|
* Update existing device group.
|
||||||
*
|
*
|
||||||
|
|||||||
@ -18,9 +18,24 @@
|
|||||||
|
|
||||||
package io.entgra.device.mgt.core.device.mgt.core.service;
|
package io.entgra.device.mgt.core.device.mgt.core.service;
|
||||||
|
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroup;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroupConstants;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroupRoleWrapper;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceTypesOfGroups;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupAlreadyExistException;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupManagementException;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupNotExistException;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.RoleDoesNotExistException;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.core.dao.DeviceDAO;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.core.dao.DeviceManagementDAOException;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.core.dao.DeviceManagementDAOFactory;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.core.dao.GroupDAO;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.core.dao.GroupManagementDAOException;
|
||||||
|
import io.entgra.device.mgt.core.device.mgt.core.dao.GroupManagementDAOFactory;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.netbeans.lib.cvsclient.commandLine.command.status;
|
||||||
import org.wso2.carbon.CarbonConstants;
|
import org.wso2.carbon.CarbonConstants;
|
||||||
import org.wso2.carbon.context.CarbonContext;
|
import org.wso2.carbon.context.CarbonContext;
|
||||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||||
@ -33,14 +48,6 @@ import io.entgra.device.mgt.core.device.mgt.common.GroupPaginationRequest;
|
|||||||
import io.entgra.device.mgt.core.device.mgt.common.PaginationResult;
|
import io.entgra.device.mgt.core.device.mgt.common.PaginationResult;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.exceptions.TrackerAlreadyExistException;
|
import io.entgra.device.mgt.core.device.mgt.common.exceptions.TrackerAlreadyExistException;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.exceptions.TransactionManagementException;
|
import io.entgra.device.mgt.core.device.mgt.common.exceptions.TransactionManagementException;
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroup;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceGroupConstants;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.DeviceTypesOfGroups;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupAlreadyExistException;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupManagementException;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.GroupNotExistException;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.common.group.mgt.RoleDoesNotExistException;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.core.dao.*;
|
|
||||||
import io.entgra.device.mgt.core.device.mgt.core.event.config.GroupAssignmentEventOperationExecutor;
|
import io.entgra.device.mgt.core.device.mgt.core.event.config.GroupAssignmentEventOperationExecutor;
|
||||||
import io.entgra.device.mgt.core.device.mgt.core.geo.task.GeoFenceEventOperationManager;
|
import io.entgra.device.mgt.core.device.mgt.core.geo.task.GeoFenceEventOperationManager;
|
||||||
import io.entgra.device.mgt.core.device.mgt.core.internal.DeviceManagementDataHolder;
|
import io.entgra.device.mgt.core.device.mgt.core.internal.DeviceManagementDataHolder;
|
||||||
@ -57,7 +64,6 @@ import java.util.HashMap;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ExecutionException;
|
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@ -142,6 +148,59 @@ public class GroupManagementProviderServiceImpl implements GroupManagementProvid
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void createGroupWithRoles(DeviceGroupRoleWrapper groups, String defaultRole, String[] defaultPermissions) throws GroupManagementException {
|
||||||
|
if (groups == null) {
|
||||||
|
String msg = "Received incomplete data for createGroup";
|
||||||
|
log.error(msg);
|
||||||
|
throw new GroupManagementException(msg);
|
||||||
|
}
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("Creating group '" + groups.getName() + "'");
|
||||||
|
}
|
||||||
|
int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
|
||||||
|
try {
|
||||||
|
GroupManagementDAOFactory.beginTransaction();
|
||||||
|
DeviceGroup existingGroup = this.groupDAO.getGroup(groups.getName(), tenantId);
|
||||||
|
if (existingGroup == null) {
|
||||||
|
if (groups.getParentGroupId() == 0) {
|
||||||
|
groups.setParentPath(DeviceGroupConstants.HierarchicalGroup.SEPERATOR);
|
||||||
|
} else {
|
||||||
|
DeviceGroup immediateParentGroup = groupDAO.getGroup(groups.getParentGroupId(), tenantId);
|
||||||
|
if (immediateParentGroup == null) {
|
||||||
|
GroupManagementDAOFactory.rollbackTransaction();
|
||||||
|
String msg = "Parent group with group ID '" + groups.getParentGroupId() + "' does not exist. Hence creating of group '" + groups.getName() + "' was not success";
|
||||||
|
log.error(msg);
|
||||||
|
throw new GroupManagementException(msg);
|
||||||
|
}
|
||||||
|
String parentPath = DeviceManagerUtil.createParentPath(immediateParentGroup);
|
||||||
|
groups.setParentPath(parentPath);
|
||||||
|
}
|
||||||
|
int updatedGroupID = this.groupDAO.addGroupWithRoles(groups, tenantId);
|
||||||
|
if (groups.getGroupProperties() != null && groups.getGroupProperties().size() > 0) {
|
||||||
|
this.groupDAO.addGroupPropertiesWithRoles(groups, updatedGroupID, tenantId);
|
||||||
|
}
|
||||||
|
GroupManagementDAOFactory.commitTransaction();
|
||||||
|
} else {
|
||||||
|
throw new GroupManagementException("Group exist with name " + groups.getName());
|
||||||
|
}
|
||||||
|
} catch (GroupManagementDAOException e) {
|
||||||
|
GroupManagementDAOFactory.rollbackTransaction();
|
||||||
|
String msg = e.getMessage();
|
||||||
|
log.error(msg, e);
|
||||||
|
throw new GroupManagementException(msg, e);
|
||||||
|
} catch (TransactionManagementException e) {
|
||||||
|
String msg = "Error occurred while initiating transaction.";
|
||||||
|
log.error(msg, e);
|
||||||
|
throw new GroupManagementException(msg, e);
|
||||||
|
} finally {
|
||||||
|
GroupManagementDAOFactory.closeConnection();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (log.isDebugEnabled()) {
|
||||||
|
log.debug("DeviceGroup added: " + groups.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -16,6 +16,7 @@ CREATE TABLE IF NOT EXISTS DM_GROUP (
|
|||||||
OWNER VARCHAR(45) DEFAULT NULL,
|
OWNER VARCHAR(45) DEFAULT NULL,
|
||||||
PARENT_PATH VARCHAR(255) DEFAULT NULL,
|
PARENT_PATH VARCHAR(255) DEFAULT NULL,
|
||||||
TENANT_ID INTEGER DEFAULT 0,
|
TENANT_ID INTEGER DEFAULT 0,
|
||||||
|
PARENT_GROUP_ID INTEGER DEFAULT 0,
|
||||||
PRIMARY KEY (ID)
|
PRIMARY KEY (ID)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -20,6 +20,7 @@ CREATE TABLE IF NOT EXISTS DM_GROUP (
|
|||||||
OWNER VARCHAR(45) DEFAULT NULL,
|
OWNER VARCHAR(45) DEFAULT NULL,
|
||||||
PARENT_PATH VARCHAR(255) DEFAULT NULL,
|
PARENT_PATH VARCHAR(255) DEFAULT NULL,
|
||||||
TENANT_ID INTEGER DEFAULT 0,
|
TENANT_ID INTEGER DEFAULT 0,
|
||||||
|
PARENT_GROUP_ID INTEGER DEFAULT 0,
|
||||||
PRIMARY KEY (ID)
|
PRIMARY KEY (ID)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -25,6 +25,7 @@ CREATE TABLE IF NOT EXISTS DM_GROUP (
|
|||||||
OWNER VARCHAR(255) DEFAULT NULL,
|
OWNER VARCHAR(255) DEFAULT NULL,
|
||||||
PARENT_PATH VARCHAR(255) DEFAULT NULL,
|
PARENT_PATH VARCHAR(255) DEFAULT NULL,
|
||||||
TENANT_ID INTEGER DEFAULT 0,
|
TENANT_ID INTEGER DEFAULT 0,
|
||||||
|
PARENT_GROUP_ID INTEGER DEFAULT 0,
|
||||||
PRIMARY KEY (ID)
|
PRIMARY KEY (ID)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -41,6 +41,7 @@ IF NOT EXISTS(SELECT *
|
|||||||
OWNER VARCHAR(255) DEFAULT NULL,
|
OWNER VARCHAR(255) DEFAULT NULL,
|
||||||
PARENT_PATH VARCHAR(255) DEFAULT NULL,
|
PARENT_PATH VARCHAR(255) DEFAULT NULL,
|
||||||
TENANT_ID INTEGER DEFAULT 0,
|
TENANT_ID INTEGER DEFAULT 0,
|
||||||
|
PARENT_GROUP_ID INTEGER DEFAULT 0,
|
||||||
PRIMARY KEY (ID)
|
PRIMARY KEY (ID)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -29,6 +29,7 @@ CREATE TABLE IF NOT EXISTS DM_GROUP (
|
|||||||
OWNER VARCHAR(255) DEFAULT NULL,
|
OWNER VARCHAR(255) DEFAULT NULL,
|
||||||
PARENT_PATH VARCHAR(255) DEFAULT NULL,
|
PARENT_PATH VARCHAR(255) DEFAULT NULL,
|
||||||
TENANT_ID INTEGER DEFAULT 0,
|
TENANT_ID INTEGER DEFAULT 0,
|
||||||
|
PARENT_GROUP_ID INTEGER DEFAULT 0,
|
||||||
PRIMARY KEY (ID)
|
PRIMARY KEY (ID)
|
||||||
)
|
)
|
||||||
ENGINE = InnoDB;
|
ENGINE = InnoDB;
|
||||||
|
|||||||
@ -52,6 +52,7 @@ CREATE TABLE DM_GROUP (
|
|||||||
OWNER VARCHAR2(255) DEFAULT NULL,
|
OWNER VARCHAR2(255) DEFAULT NULL,
|
||||||
PARENT_PATH VARCHAR2(255) DEFAULT NULL,
|
PARENT_PATH VARCHAR2(255) DEFAULT NULL,
|
||||||
TENANT_ID NUMBER(10) DEFAULT 0,
|
TENANT_ID NUMBER(10) DEFAULT 0,
|
||||||
|
PARENT_GROUP_ID NUMBER(10) DEFAULT 0,
|
||||||
CONSTRAINT PK_DM_GROUP PRIMARY KEY (ID)
|
CONSTRAINT PK_DM_GROUP PRIMARY KEY (ID)
|
||||||
)
|
)
|
||||||
/
|
/
|
||||||
|
|||||||
@ -23,6 +23,7 @@ CREATE TABLE IF NOT EXISTS DM_GROUP (
|
|||||||
OWNER VARCHAR(45) DEFAULT NULL,
|
OWNER VARCHAR(45) DEFAULT NULL,
|
||||||
PARENT_PATH VARCHAR(255) DEFAULT NULL,
|
PARENT_PATH VARCHAR(255) DEFAULT NULL,
|
||||||
TENANT_ID INTEGER DEFAULT 0,
|
TENANT_ID INTEGER DEFAULT 0,
|
||||||
|
PARENT_GROUP_ID INTEGER DEFAULT 0,
|
||||||
PRIMARY KEY (ID)
|
PRIMARY KEY (ID)
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user