mirror of
https://repository.entgra.net/community/device-mgt-core.git
synced 2025-10-06 02:01:45 +00:00
Merge branch 'application-mgt-new' into 'application-mgt-new'
Add a new API endpoint to get app subscription details. See merge request entgra/carbon-device-mgt!340
This commit is contained in:
commit
d1af3d7ed1
@ -0,0 +1,80 @@
|
||||
/* Copyright (c) 2019, 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 org.wso2.carbon.device.application.mgt.common;
|
||||
|
||||
import org.wso2.carbon.device.mgt.common.Device;
|
||||
|
||||
import java.sql.Timestamp;
|
||||
|
||||
public class DeviceSubscriptionData {
|
||||
|
||||
private String action;
|
||||
private Timestamp actionTriggeredTimestamp;
|
||||
private String actionTriggeredBy;
|
||||
private String actionType;
|
||||
private String status;
|
||||
private Device device;
|
||||
|
||||
public String getAction() {
|
||||
return action;
|
||||
}
|
||||
|
||||
public void setAction(String action) {
|
||||
this.action = action;
|
||||
}
|
||||
|
||||
public Timestamp getActionTriggeredTimestamp() {
|
||||
return actionTriggeredTimestamp;
|
||||
}
|
||||
|
||||
public void setActionTriggeredTimestamp(Timestamp actionTriggeredTimestamp) {
|
||||
this.actionTriggeredTimestamp = actionTriggeredTimestamp;
|
||||
}
|
||||
|
||||
public String getActionTriggeredBy() {
|
||||
return actionTriggeredBy;
|
||||
}
|
||||
|
||||
public void setActionTriggeredBy(String actionTriggeredBy) {
|
||||
this.actionTriggeredBy = actionTriggeredBy;
|
||||
}
|
||||
|
||||
public String getActionType() {
|
||||
return actionType;
|
||||
}
|
||||
|
||||
public void setActionType(String actionType) {
|
||||
this.actionType = actionType;
|
||||
}
|
||||
|
||||
public String getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(String status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public Device getDevice() {
|
||||
return device;
|
||||
}
|
||||
|
||||
public void setDevice(Device device) {
|
||||
this.device = device;
|
||||
}
|
||||
}
|
||||
@ -108,4 +108,18 @@ public interface SubscriptionManager {
|
||||
*/
|
||||
PaginationResult getAppInstalledCategories(int offsetValue, int limitValue, String appUUID,
|
||||
String subType) throws ApplicationManagementException;
|
||||
|
||||
/**
|
||||
* This method is responsible to provide application subscription data for given application release UUID.
|
||||
*
|
||||
* @param offsetValue offset
|
||||
* @param limitValue limit
|
||||
* @param appUUID application release UUID
|
||||
* @return {@link PaginationResult}
|
||||
* @throws ApplicationManagementException if offset or limit contains incorrect values, if it couldn't find an
|
||||
* application release for given UUID, if an error occurred while getting device details of subscribed device ids,
|
||||
* if an error occurred while getting subscription details of given application release UUID.
|
||||
*/
|
||||
PaginationResult getAppSubscriptionDetails(int offsetValue, int limitValue, String appUUID)
|
||||
throws ApplicationManagementException;
|
||||
}
|
||||
|
||||
@ -30,6 +30,7 @@ import org.wso2.carbon.apimgt.application.extension.exception.APIManagerExceptio
|
||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||
import org.wso2.carbon.device.application.mgt.common.ApplicationInstallResponse;
|
||||
import org.wso2.carbon.device.application.mgt.common.ApplicationType;
|
||||
import org.wso2.carbon.device.application.mgt.common.DeviceSubscriptionData;
|
||||
import org.wso2.carbon.device.application.mgt.common.DeviceTypes;
|
||||
import org.wso2.carbon.device.application.mgt.common.ExecutionStatus;
|
||||
import org.wso2.carbon.device.application.mgt.common.SubAction;
|
||||
@ -315,6 +316,15 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* THis method is responsible to validate application install or uninstall request.
|
||||
*
|
||||
* @param params params could be either list of {@link DeviceIdentifier} or list of username or list of group
|
||||
* names or list or role names.
|
||||
* @param subType Subscription type. i.e DEVICE or USER or ROLE or GROUP
|
||||
* @param action performing action. i.e Install or Uninstall
|
||||
* @throws BadRequestException if incompatible data is found with app install/uninstall request.
|
||||
*/
|
||||
private <T> void validateRequest(List<T> params, String subType, String action) throws BadRequestException {
|
||||
if (params.isEmpty()) {
|
||||
String msg = "In order to install application release, you should provide list of subscribers. "
|
||||
@ -338,7 +348,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
|
||||
}
|
||||
}
|
||||
|
||||
/***
|
||||
/**
|
||||
* This method perform given action (i.e APP INSTALL or APP UNINSTALL) on given set of devices.
|
||||
*
|
||||
* @param deviceType Application supported device type.
|
||||
@ -424,7 +434,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
|
||||
return applicationInstallResponse;
|
||||
}
|
||||
|
||||
/***
|
||||
/**
|
||||
* Filter given devices and davide given list of device into two sets, those are already application installed
|
||||
* devices and application installable devices.
|
||||
*
|
||||
@ -469,6 +479,13 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
|
||||
return subscribingDeviceIdHolder;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the application categories of a particular application
|
||||
*
|
||||
* @param id Application Id
|
||||
* @return List of application categories.
|
||||
* @throws ApplicationManagementException if error occurred while getting application categories from the DB.
|
||||
*/
|
||||
private List<String> getApplicationCategories(int id) throws ApplicationManagementException {
|
||||
List<String> categories;
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||
@ -528,6 +545,18 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is responsible to update subscription data.
|
||||
*
|
||||
* @param applicationReleaseId Application release Id
|
||||
* @param activities List of {@link Activity}
|
||||
* @param subscribingDeviceIdHolder Subscribing device id holder.
|
||||
* @param params subscribers. If subscription is performed via user, group or role, params is a list of
|
||||
* {@link String}
|
||||
* @param subType Subscription type. i.e USER, GROUP, ROLE or DEVICE
|
||||
* @param action performing action. ie INSTALL or UNINSTALL>
|
||||
* @throws ApplicationManagementException if error occurred while getting or updating subscription data.
|
||||
*/
|
||||
private void updateSubscriptions(int applicationReleaseId, List<Activity> activities,
|
||||
SubscribingDeviceIdHolder subscribingDeviceIdHolder, List<String> params, String subType,
|
||||
String action) throws ApplicationManagementException {
|
||||
@ -685,6 +714,16 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method constructs operation payload to install/uninstall an application.
|
||||
*
|
||||
* @param deviceType Device type
|
||||
* @param application {@link Application} data.
|
||||
* @param action Action is either ININSTALL or UNINSTALL
|
||||
* @return {@link Operation}
|
||||
* @throws ApplicationManagementException if unknown application type is found to generate operation payload or
|
||||
* invalid action is found to generate operation payload.
|
||||
*/
|
||||
private Operation generateOperationPayloadByDeviceType(String deviceType, Application application, String action)
|
||||
throws ApplicationManagementException {
|
||||
try {
|
||||
@ -865,7 +904,6 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
}
|
||||
} catch (ApplicationManagementDAOException e) {
|
||||
ConnectionManagerUtil.rollbackDBTransaction();
|
||||
String msg = "Error occurred when get application release data for application" +
|
||||
" release UUID: " + appUUID;
|
||||
log.error(msg, e);
|
||||
@ -881,8 +919,7 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PaginationResult getAppInstalledCategories(int offsetValue, int limitValue,
|
||||
String appUUID, String subType)
|
||||
public PaginationResult getAppInstalledCategories(int offsetValue, int limitValue, String appUUID, String subType)
|
||||
throws ApplicationManagementException {
|
||||
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||
@ -893,28 +930,24 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
|
||||
.getAppWithRelatedRelease(appUUID, tenantId);
|
||||
int applicationReleaseId = applicationDTO.getApplicationReleaseDTOs().get(0).getId();
|
||||
|
||||
int count = 0;
|
||||
List<String> SubscriptionList = new ArrayList<>();
|
||||
List<String> subscriptionList = new ArrayList<>();
|
||||
|
||||
if (SubscriptionType.USER.toString().equalsIgnoreCase(subType)) {
|
||||
SubscriptionList = subscriptionDAO
|
||||
subscriptionList = subscriptionDAO
|
||||
.getAppSubscribedUsers(offsetValue, limitValue, applicationReleaseId, tenantId);
|
||||
} else if (SubscriptionType.ROLE.toString().equalsIgnoreCase(subType)) {
|
||||
SubscriptionList = subscriptionDAO
|
||||
subscriptionList = subscriptionDAO
|
||||
.getAppSubscribedRoles(offsetValue, limitValue, applicationReleaseId, tenantId);
|
||||
} else if (SubscriptionType.GROUP.toString().equalsIgnoreCase(subType)) {
|
||||
SubscriptionList = subscriptionDAO
|
||||
subscriptionList = subscriptionDAO
|
||||
.getAppSubscribedGroups(offsetValue, limitValue, applicationReleaseId, tenantId);
|
||||
}
|
||||
count = SubscriptionList.size();
|
||||
paginationResult.setData(SubscriptionList);
|
||||
int count = subscriptionList.size();
|
||||
paginationResult.setData(subscriptionList);
|
||||
paginationResult.setRecordsFiltered(count);
|
||||
paginationResult.setRecordsTotal(count);
|
||||
|
||||
return paginationResult;
|
||||
|
||||
} catch (ApplicationManagementDAOException e) {
|
||||
ConnectionManagerUtil.rollbackDBTransaction();
|
||||
String msg = "Error occurred when get application release data for application" +
|
||||
" release UUID: " + appUUID;
|
||||
log.error(msg, e);
|
||||
@ -928,4 +961,97 @@ public class SubscriptionManagerImpl implements SubscriptionManager {
|
||||
ConnectionManagerUtil.closeDBConnection();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public PaginationResult getAppSubscriptionDetails(int offsetValue, int limitValue, String appUUID)
|
||||
throws ApplicationManagementException {
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||
DeviceManagementProviderService deviceManagementProviderService = HelperUtil
|
||||
.getDeviceManagementProviderService();
|
||||
if (offsetValue < 0 || limitValue <= 0) {
|
||||
String msg = "Found incompatible values for offset and limit. Hence please check the request and resend. "
|
||||
+ "Offset " + offsetValue + " limit " + limitValue;
|
||||
log.error(msg);
|
||||
throw new BadRequestException(msg);
|
||||
}
|
||||
|
||||
try {
|
||||
ConnectionManagerUtil.openDBConnection();
|
||||
ApplicationDTO applicationDTO = this.applicationDAO.getAppWithRelatedRelease(appUUID, tenantId);
|
||||
if (applicationDTO == null) {
|
||||
String msg = "Couldn't find an application with application release which has UUID " + appUUID;
|
||||
log.error(msg);
|
||||
throw new NotFoundException(msg);
|
||||
}
|
||||
int applicationReleaseId = applicationDTO.getApplicationReleaseDTOs().get(0).getId();
|
||||
|
||||
List<DeviceSubscriptionDTO> deviceSubscriptionDTOS = subscriptionDAO
|
||||
.getDeviceSubscriptions(applicationReleaseId, tenantId);
|
||||
if (deviceSubscriptionDTOS.isEmpty()) {
|
||||
String msg = "Couldn't found an subscribed devices for application release id: " + applicationReleaseId;
|
||||
log.info(msg);
|
||||
}
|
||||
List<Integer> deviceIdList = deviceSubscriptionDTOS.stream().map(DeviceSubscriptionDTO::getDeviceId)
|
||||
.collect(Collectors.toList());
|
||||
if (deviceIdList.isEmpty()) {
|
||||
PaginationResult paginationResult = new PaginationResult();
|
||||
paginationResult.setData(deviceIdList);
|
||||
paginationResult.setRecordsFiltered(0);
|
||||
paginationResult.setRecordsTotal(0);
|
||||
return paginationResult;
|
||||
}
|
||||
try {
|
||||
//pass the device id list to device manager service method
|
||||
PaginationResult paginationResult = deviceManagementProviderService
|
||||
.getAppSubscribedDevices(offsetValue, limitValue, deviceIdList, null);
|
||||
List<DeviceSubscriptionData> deviceSubscriptionDataList = new ArrayList<>();
|
||||
|
||||
if (!paginationResult.getData().isEmpty()) {
|
||||
List<Device> devices = (List<Device>) paginationResult.getData();
|
||||
for (Device device : devices) {
|
||||
DeviceSubscriptionData deviceSubscriptionData = new DeviceSubscriptionData();
|
||||
for (DeviceSubscriptionDTO subscription : deviceSubscriptionDTOS) {
|
||||
if (subscription.getDeviceId() == device.getId()) {
|
||||
deviceSubscriptionData.setDevice(device);
|
||||
if (subscription.isUnsubscribed()) {
|
||||
deviceSubscriptionData.setAction(Constants.UNSUBSCRIBED);
|
||||
deviceSubscriptionData.setActionTriggeredBy(subscription.getUnsubscribedBy());
|
||||
deviceSubscriptionData
|
||||
.setActionTriggeredTimestamp(subscription.getUnsubscribedTimestamp());
|
||||
} else {
|
||||
deviceSubscriptionData.setAction(Constants.SUBSCRIBED);
|
||||
deviceSubscriptionData.setActionTriggeredBy(subscription.getSubscribedBy());
|
||||
deviceSubscriptionData
|
||||
.setActionTriggeredTimestamp(subscription.getSubscribedTimestamp());
|
||||
}
|
||||
deviceSubscriptionData.setActionType(subscription.getActionTriggeredFrom());
|
||||
deviceSubscriptionData.setStatus(subscription.getStatus());
|
||||
deviceSubscriptionDataList.add(deviceSubscriptionData);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
paginationResult.setData(deviceSubscriptionDataList);
|
||||
return paginationResult;
|
||||
} catch (DeviceManagementException e) {
|
||||
String msg = "service error occurred while getting device data from the device management service. "
|
||||
+ "Device ids " + deviceIdList;
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
}
|
||||
} catch (ApplicationManagementDAOException e) {
|
||||
String msg = "Error occurred when getting application release data for application release UUID: "
|
||||
+ appUUID;
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} catch (DBConnectionException e) {
|
||||
String msg = "DB Connection error occurred while trying to get subscription data of application which has "
|
||||
+ "application release UUID " + appUUID;
|
||||
log.error(msg, e);
|
||||
throw new ApplicationManagementException(msg, e);
|
||||
} finally {
|
||||
ConnectionManagerUtil.closeDBConnection();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -58,6 +58,9 @@ public class Constants {
|
||||
public static final String TENANT_DOMAIN = "TENANT_DOMAIN";
|
||||
public static final String TENANT_ID = "__TENANT_ID_PROP__";
|
||||
public static final String TASK_NAME = "TASK_NAME";
|
||||
public static final String SUBSCRIBED = "SUBSCRIBED";
|
||||
public static final String UNSUBSCRIBED = "UNSUBSCRIBED";
|
||||
|
||||
|
||||
/**
|
||||
* Database types supported by Application Management.
|
||||
|
||||
@ -49,7 +49,7 @@ info = @Info(
|
||||
extensions = {
|
||||
@Extension(properties = {
|
||||
@ExtensionProperty(name = "name", value = "StoreReviewManagementAdminService"),
|
||||
@ExtensionProperty(name = "context", value = "/api/application-mgt-store/v1.0/admin/review"),
|
||||
@ExtensionProperty(name = "context", value = "/api/application-mgt-store/v1.0/admin/reviews"),
|
||||
})
|
||||
}
|
||||
),
|
||||
@ -70,14 +70,13 @@ scopes = {
|
||||
|
||||
@Path("/admin/reviews")
|
||||
@Api(value = "Store Review Management Admin API")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
public interface ReviewManagementStoreAdminAPI {
|
||||
String SCOPE = "scope";
|
||||
|
||||
@DELETE
|
||||
@Path("/{uuid}/{reviewId}")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@Produces(MediaType.WILDCARD)
|
||||
@Consumes(MediaType.WILDCARD)
|
||||
@ApiOperation(
|
||||
consumes = MediaType.APPLICATION_JSON,
|
||||
produces = MediaType.APPLICATION_JSON,
|
||||
|
||||
@ -0,0 +1,132 @@
|
||||
/*
|
||||
* Copyright (c) 2019, Entgra (pvt) Ltd. (http://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 org.wso2.carbon.device.application.mgt.store.api.services.admin;
|
||||
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import io.swagger.annotations.ApiParam;
|
||||
import io.swagger.annotations.ApiResponse;
|
||||
import io.swagger.annotations.ApiResponses;
|
||||
import io.swagger.annotations.Extension;
|
||||
import io.swagger.annotations.ExtensionProperty;
|
||||
import io.swagger.annotations.Info;
|
||||
import io.swagger.annotations.SwaggerDefinition;
|
||||
import io.swagger.annotations.Tag;
|
||||
import org.wso2.carbon.apimgt.annotations.api.Scopes;
|
||||
import org.wso2.carbon.device.application.mgt.common.ErrorResponse;
|
||||
import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.GET;
|
||||
import javax.ws.rs.POST;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.PathParam;
|
||||
import javax.ws.rs.Produces;
|
||||
import javax.ws.rs.QueryParam;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
import javax.ws.rs.core.Response;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* API to handle subscription management related admin tasks.
|
||||
*/
|
||||
@SwaggerDefinition(
|
||||
info = @Info(
|
||||
version = "1.0.0",
|
||||
title = "Subscription Management Admin Service",
|
||||
extensions = {
|
||||
@Extension(properties = {
|
||||
@ExtensionProperty(name = "name", value = "SubscriptionManagementAdminService"),
|
||||
@ExtensionProperty(name = "context", value = "/api/application-mgt-store/v1.0/admin/subscription"),
|
||||
})
|
||||
}
|
||||
),
|
||||
tags = {
|
||||
@Tag(name = "subscription_management, device_management", description = "Subscription Management "
|
||||
+ "related Admin APIs")
|
||||
}
|
||||
)
|
||||
@Scopes(
|
||||
scopes = {
|
||||
@org.wso2.carbon.apimgt.annotations.api.Scope(
|
||||
name = "View Application Subscriptions",
|
||||
description = "View Application Subscriptions.",
|
||||
key = "perm:admin:app:subscription:view",
|
||||
permissions = {"/app-mgt/store/admin/subscription/view"}
|
||||
)
|
||||
}
|
||||
)
|
||||
@Path("/admin/subscription")
|
||||
@Api(value = "Subscription Management Admin API")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
public interface SubscriptionManagementAdminAPI {
|
||||
|
||||
String SCOPE = "scope";
|
||||
|
||||
@GET
|
||||
@Path("/{uuid}")
|
||||
@Produces(MediaType.APPLICATION_JSON)
|
||||
@Consumes(MediaType.APPLICATION_JSON)
|
||||
@ApiOperation(
|
||||
consumes = MediaType.APPLICATION_JSON,
|
||||
produces = MediaType.APPLICATION_JSON,
|
||||
httpMethod = "GET",
|
||||
value = "Get subscription details of specific application.",
|
||||
notes = "This will get the subscription details of specific application",
|
||||
tags = "Subscription Management",
|
||||
extensions = {
|
||||
@Extension(properties = {
|
||||
@ExtensionProperty(name = SCOPE, value = "perm:app:subscription:view")
|
||||
})
|
||||
}
|
||||
)
|
||||
@ApiResponses(
|
||||
value = {
|
||||
@ApiResponse(
|
||||
code = 200,
|
||||
message = "OK. \n Successfully retrieved subscription details.",
|
||||
response = List.class,
|
||||
responseContainer = "List"),
|
||||
@ApiResponse(
|
||||
code = 404,
|
||||
message = "Not Found. \n No Application found which has application release of UUID.",
|
||||
response = ErrorResponse.class),
|
||||
@ApiResponse(
|
||||
code = 500,
|
||||
message = "Internal Server Error. \n Error occurred while getting data",
|
||||
response = ErrorResponse.class)
|
||||
})
|
||||
Response getAppInstalledDevices(
|
||||
@ApiParam(
|
||||
name = "uuid",
|
||||
value = "uuid of the application release.",
|
||||
required = true)
|
||||
@PathParam("uuid") String uuid,
|
||||
@ApiParam(
|
||||
name = "offset",
|
||||
value = "The starting pagination index for the complete list of qualified items.",
|
||||
defaultValue = "0")
|
||||
@QueryParam("offset") int offset,
|
||||
@ApiParam(
|
||||
name = "limit",
|
||||
value = "Provide how many device details you require from the starting pagination index/offset.",
|
||||
defaultValue = "5")
|
||||
@QueryParam("limit") int limit
|
||||
);
|
||||
}
|
||||
@ -18,9 +18,6 @@ package org.wso2.carbon.device.application.mgt.store.api.services.impl.admin;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.wso2.carbon.device.application.mgt.common.PaginationRequest;
|
||||
import org.wso2.carbon.device.application.mgt.common.PaginationResult;
|
||||
import org.wso2.carbon.device.application.mgt.common.Rating;
|
||||
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
||||
import org.wso2.carbon.device.application.mgt.common.exception.ReviewManagementException;
|
||||
import org.wso2.carbon.device.application.mgt.common.services.ReviewManager;
|
||||
@ -28,9 +25,12 @@ import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException;
|
||||
import org.wso2.carbon.device.application.mgt.core.util.APIUtil;
|
||||
import org.wso2.carbon.device.application.mgt.store.api.services.admin.ReviewManagementStoreAdminAPI;
|
||||
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.DELETE;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.PathParam;
|
||||
import javax.ws.rs.Produces;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
import javax.ws.rs.core.Response;
|
||||
|
||||
/**
|
||||
@ -44,6 +44,8 @@ public class ReviewManagementStoreAdminAPIImpl implements ReviewManagementStoreA
|
||||
@Override
|
||||
@DELETE
|
||||
@Path("/{uuid}/{reviewId}")
|
||||
@Produces(MediaType.WILDCARD)
|
||||
@Consumes(MediaType.WILDCARD)
|
||||
public Response deleteReview(
|
||||
@PathParam("uuid") String uuid,
|
||||
@PathParam("reviewId") int reviewId) {
|
||||
|
||||
@ -0,0 +1,81 @@
|
||||
/*
|
||||
* Copyright (c) 2019, 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 org.wso2.carbon.device.application.mgt.store.api.services.impl.admin;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.wso2.carbon.device.application.mgt.common.exception.ApplicationManagementException;
|
||||
import org.wso2.carbon.device.application.mgt.common.services.SubscriptionManager;
|
||||
import org.wso2.carbon.device.application.mgt.core.exception.BadRequestException;
|
||||
import org.wso2.carbon.device.application.mgt.core.exception.NotFoundException;
|
||||
import org.wso2.carbon.device.application.mgt.core.util.APIUtil;
|
||||
import org.wso2.carbon.device.application.mgt.store.api.services.admin.SubscriptionManagementAdminAPI;
|
||||
import org.wso2.carbon.device.mgt.common.PaginationResult;
|
||||
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.DefaultValue;
|
||||
import javax.ws.rs.GET;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.PathParam;
|
||||
import javax.ws.rs.Produces;
|
||||
import javax.ws.rs.QueryParam;
|
||||
import javax.ws.rs.core.Response;
|
||||
|
||||
/**
|
||||
* Implementation of Subscription Management related APIs.
|
||||
*/
|
||||
@Produces({"application/json"})
|
||||
@Path("/admin/subscription")
|
||||
public class SubscriptionManagementAdminAPIImpl implements SubscriptionManagementAdminAPI {
|
||||
|
||||
private static Log log = LogFactory.getLog(SubscriptionManagementAdminAPIImpl.class);
|
||||
|
||||
@GET
|
||||
@Consumes("application/json")
|
||||
@Produces("application/json")
|
||||
@Path("/{uuid}")
|
||||
public Response getAppInstalledDevices(
|
||||
@PathParam("uuid") String uuid,
|
||||
@DefaultValue("0")
|
||||
@QueryParam("offset") int offset,
|
||||
@DefaultValue("5")
|
||||
@QueryParam("limit") int limit) {
|
||||
|
||||
try {
|
||||
SubscriptionManager subscriptionManager = APIUtil.getSubscriptionManager();
|
||||
PaginationResult subscriptionData = subscriptionManager
|
||||
.getAppSubscriptionDetails(offset, limit, uuid);
|
||||
return Response.status(Response.Status.OK).entity(subscriptionData).build();
|
||||
} catch (NotFoundException e) {
|
||||
String msg = "Application with application release UUID: " + uuid + " is not found";
|
||||
log.error(msg, e);
|
||||
return Response.status(Response.Status.NOT_FOUND).entity(msg).build();
|
||||
} catch (BadRequestException e) {
|
||||
String msg = "Found invalid payload for getting application which has UUID: " + uuid
|
||||
+ ". Hence verify the payload";
|
||||
log.error(msg, e);
|
||||
return Response.status(Response.Status.BAD_REQUEST).entity(msg).build();
|
||||
} catch (ApplicationManagementException e) {
|
||||
String msg = "Error occurred while getting app installed devices which has application release UUID of: "
|
||||
+ uuid;
|
||||
log.error(msg, e);
|
||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -24,6 +24,7 @@
|
||||
|
||||
<jaxrs:server id="applicationMgtService" address="/">
|
||||
<jaxrs:serviceBeans>
|
||||
<ref bean="subscriptionMgtAdminServiceBean"/>
|
||||
<ref bean="reviewMgtAdminServiceBean"/>
|
||||
<ref bean="applicationMgtServiceBean"/>
|
||||
<ref bean="reviewMgtServiceBean"/>
|
||||
@ -55,6 +56,7 @@
|
||||
<bean id="swaggerResource" class="io.swagger.jaxrs.listing.ApiListingResource" />
|
||||
|
||||
<bean id="reviewMgtAdminServiceBean" class="org.wso2.carbon.device.application.mgt.store.api.services.impl.admin.ReviewManagementStoreAdminAPIImpl" />
|
||||
<bean id="subscriptionMgtAdminServiceBean" class="org.wso2.carbon.device.application.mgt.store.api.services.impl.admin.SubscriptionManagementAdminAPIImpl" />
|
||||
<bean id="applicationMgtServiceBean" class="org.wso2.carbon.device.application.mgt.store.api.services.impl.ApplicationManagementAPIImpl"/>
|
||||
<bean id="reviewMgtServiceBean" class="org.wso2.carbon.device.application.mgt.store.api.services.impl.ReviewManagementAPIImpl" />
|
||||
<bean id="subscriptionMgtServiceBean" class="org.wso2.carbon.device.application.mgt.store.api.services.impl.SubscriptionManagementAPIImpl"/>
|
||||
|
||||
@ -576,8 +576,18 @@ public interface DeviceDAO {
|
||||
* @param limitValue limit value for get paginated request.
|
||||
* @param status status of the devices.
|
||||
* @return devices - subscribed device details list
|
||||
* @throws {@link DeviceManagementDAOException} if connections establishment fails.
|
||||
* @throws DeviceManagementDAOException if connections establishment fails.
|
||||
*/
|
||||
List<Device> getSubscribedDevices(int offsetValue, int limitValue, List<Integer> deviceIds,
|
||||
int tenantId, String status) throws DeviceManagementDAOException;
|
||||
|
||||
/**
|
||||
* @param deviceIds device ids of the subscribed devices.
|
||||
* @param tenantId tenant id
|
||||
* @param status current status of the device. (e.g ACTIVE, REMOVED, etc)
|
||||
* @return number of subscribed device count.
|
||||
* @throws DeviceManagementDAOException if error occurred while processing the SQL statement.
|
||||
*/
|
||||
int getSubscribedDeviceCount(List<Integer> deviceIds, int tenantId, String status)
|
||||
throws DeviceManagementDAOException;
|
||||
}
|
||||
|
||||
@ -18,6 +18,7 @@
|
||||
|
||||
package org.wso2.carbon.device.mgt.core.dao.impl.device;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.wso2.carbon.device.mgt.common.Device;
|
||||
@ -645,6 +646,52 @@ public class GenericDeviceDAOImpl extends AbstractDeviceDAOImpl {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSubscribedDeviceCount(List<Integer> deviceIds, int tenantId, String status)
|
||||
throws DeviceManagementDAOException {
|
||||
try {
|
||||
Connection conn = this.getConnection();
|
||||
int index = 1;
|
||||
StringJoiner joiner = new StringJoiner(",",
|
||||
"SELECT " +
|
||||
"COUNT(e.DEVICE_ID) AS DEVICE_ID "+
|
||||
"FROM DM_ENROLMENT AS e, DM_DEVICE AS f "+
|
||||
"WHERE " +
|
||||
"e.DEVICE_ID=f.ID AND " +
|
||||
"e.DEVICE_ID IN (", ") AND e.TENANT_ID = ?");
|
||||
|
||||
deviceIds.stream().map(ignored -> "?").forEach(joiner::add);
|
||||
String query = joiner.toString();
|
||||
|
||||
if (!StringUtils.isBlank(status)) {
|
||||
query = query + " AND e.STATUS = ?";
|
||||
}
|
||||
|
||||
try (PreparedStatement ps = conn.prepareStatement(query)) {
|
||||
for (Integer deviceId : deviceIds) {
|
||||
ps.setObject(index++, deviceId);
|
||||
}
|
||||
|
||||
ps.setInt(index++, tenantId);
|
||||
if (!StringUtils.isBlank(status)) {
|
||||
ps.setString(index, status);
|
||||
}
|
||||
|
||||
try (ResultSet rs = ps.executeQuery()) {
|
||||
if (rs.next()) {
|
||||
return rs.getInt("DEVICE_ID");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred while retrieving information of all registered devices " +
|
||||
"according to device ids and the limit area.";
|
||||
log.error(msg, e);
|
||||
throw new DeviceManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
private Connection getConnection() throws SQLException {
|
||||
return DeviceManagementDAOFactory.getConnection();
|
||||
}
|
||||
|
||||
@ -18,6 +18,7 @@
|
||||
|
||||
package org.wso2.carbon.device.mgt.core.dao.impl.device;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.wso2.carbon.device.mgt.common.Device;
|
||||
@ -648,6 +649,52 @@ public class OracleDeviceDAOImpl extends AbstractDeviceDAOImpl {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSubscribedDeviceCount(List<Integer> deviceIds, int tenantId, String status)
|
||||
throws DeviceManagementDAOException {
|
||||
try {
|
||||
Connection conn = this.getConnection();
|
||||
int index = 1;
|
||||
StringJoiner joiner = new StringJoiner(",",
|
||||
"SELECT " +
|
||||
"COUNT(e.DEVICE_ID) AS DEVICE_ID "+
|
||||
"FROM DM_ENROLMENT AS e, DM_DEVICE AS f "+
|
||||
"WHERE " +
|
||||
"e.DEVICE_ID=f.ID AND " +
|
||||
"e.DEVICE_ID IN (", ") AND e.TENANT_ID = ?");
|
||||
|
||||
deviceIds.stream().map(ignored -> "?").forEach(joiner::add);
|
||||
String query = joiner.toString();
|
||||
|
||||
if (!StringUtils.isBlank(status)) {
|
||||
query = query + " AND e.STATUS = ?";
|
||||
}
|
||||
|
||||
try (PreparedStatement ps = conn.prepareStatement(query)) {
|
||||
for (Integer deviceId : deviceIds) {
|
||||
ps.setObject(index++, deviceId);
|
||||
}
|
||||
|
||||
ps.setInt(index++, tenantId);
|
||||
if (!StringUtils.isBlank(status)) {
|
||||
ps.setString(index, status);
|
||||
}
|
||||
|
||||
try (ResultSet rs = ps.executeQuery()) {
|
||||
if (rs.next()) {
|
||||
return rs.getInt("DEVICE_ID");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred while retrieving information of all registered devices " +
|
||||
"according to device ids and the limit area.";
|
||||
log.error(msg, e);
|
||||
throw new DeviceManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
private Connection getConnection() throws SQLException {
|
||||
return DeviceManagementDAOFactory.getConnection();
|
||||
}
|
||||
|
||||
@ -18,6 +18,7 @@
|
||||
|
||||
package org.wso2.carbon.device.mgt.core.dao.impl.device;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.wso2.carbon.device.mgt.common.Device;
|
||||
@ -628,6 +629,52 @@ public class PostgreSQLDeviceDAOImpl extends AbstractDeviceDAOImpl {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSubscribedDeviceCount(List<Integer> deviceIds, int tenantId, String status)
|
||||
throws DeviceManagementDAOException {
|
||||
try {
|
||||
Connection conn = this.getConnection();
|
||||
int index = 1;
|
||||
StringJoiner joiner = new StringJoiner(",",
|
||||
"SELECT " +
|
||||
"COUNT(e.DEVICE_ID) AS DEVICE_ID "+
|
||||
"FROM DM_ENROLMENT AS e, DM_DEVICE AS f "+
|
||||
"WHERE " +
|
||||
"e.DEVICE_ID=f.ID AND " +
|
||||
"e.DEVICE_ID IN (", ") AND e.TENANT_ID = ?");
|
||||
|
||||
deviceIds.stream().map(ignored -> "?").forEach(joiner::add);
|
||||
String query = joiner.toString();
|
||||
|
||||
if (!StringUtils.isBlank(status)) {
|
||||
query = query + " AND e.STATUS = ?";
|
||||
}
|
||||
|
||||
try (PreparedStatement ps = conn.prepareStatement(query)) {
|
||||
for (Integer deviceId : deviceIds) {
|
||||
ps.setObject(index++, deviceId);
|
||||
}
|
||||
|
||||
ps.setInt(index++, tenantId);
|
||||
if (!StringUtils.isBlank(status)) {
|
||||
ps.setString(index, status);
|
||||
}
|
||||
|
||||
try (ResultSet rs = ps.executeQuery()) {
|
||||
if (rs.next()) {
|
||||
return rs.getInt("DEVICE_ID");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred while retrieving information of all registered devices " +
|
||||
"according to device ids and the limit area.";
|
||||
log.error(msg, e);
|
||||
throw new DeviceManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
|
||||
private Connection getConnection() throws SQLException {
|
||||
return DeviceManagementDAOFactory.getConnection();
|
||||
}
|
||||
|
||||
@ -18,6 +18,7 @@
|
||||
|
||||
package org.wso2.carbon.device.mgt.core.dao.impl.device;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.wso2.carbon.device.mgt.common.Device;
|
||||
@ -650,4 +651,50 @@ public class SQLServerDeviceDAOImpl extends AbstractDeviceDAOImpl {
|
||||
}
|
||||
return devices;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSubscribedDeviceCount(List<Integer> deviceIds, int tenantId, String status)
|
||||
throws DeviceManagementDAOException {
|
||||
try {
|
||||
Connection conn = this.getConnection();
|
||||
int index = 1;
|
||||
StringJoiner joiner = new StringJoiner(",",
|
||||
"SELECT " +
|
||||
"COUNT(e.DEVICE_ID) AS DEVICE_ID "+
|
||||
"FROM DM_ENROLMENT AS e, DM_DEVICE AS f "+
|
||||
"WHERE " +
|
||||
"e.DEVICE_ID=f.ID AND " +
|
||||
"e.DEVICE_ID IN (", ") AND e.TENANT_ID = ?");
|
||||
|
||||
deviceIds.stream().map(ignored -> "?").forEach(joiner::add);
|
||||
String query = joiner.toString();
|
||||
|
||||
if (!StringUtils.isBlank(status)) {
|
||||
query = query + " AND e.STATUS = ?";
|
||||
}
|
||||
|
||||
try (PreparedStatement ps = conn.prepareStatement(query)) {
|
||||
for (Integer deviceId : deviceIds) {
|
||||
ps.setObject(index++, deviceId);
|
||||
}
|
||||
|
||||
ps.setInt(index++, tenantId);
|
||||
if (!StringUtils.isBlank(status)) {
|
||||
ps.setString(index, status);
|
||||
}
|
||||
|
||||
try (ResultSet rs = ps.executeQuery()) {
|
||||
if (rs.next()) {
|
||||
return rs.getInt("DEVICE_ID");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred while retrieving information of all registered devices " +
|
||||
"according to device ids and the limit area.";
|
||||
log.error(msg, e);
|
||||
throw new DeviceManagementDAOException(msg, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -802,9 +802,8 @@ public interface DeviceManagementProviderService {
|
||||
* @param limitValue limit value for get paginated request.
|
||||
* @param status status of the devices.
|
||||
* @return {@link PaginationResult}
|
||||
* @throws {@link DeviceManagementException} if any service level or DAO level error occurs.
|
||||
* @throws DeviceManagementException if any service level or DAO level error occurs.
|
||||
*/
|
||||
PaginationResult getAppSubscribedDevices(int offsetValue, int limitValue,
|
||||
List<Integer> devicesIds, String status)
|
||||
throws DeviceManagementException;
|
||||
List<Integer> devicesIds, String status) throws DeviceManagementException;
|
||||
}
|
||||
|
||||
@ -3702,6 +3702,44 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public PaginationResult getAppSubscribedDevices(int offsetValue, int limitValue, List<Integer> devicesIds,
|
||||
String status) throws DeviceManagementException {
|
||||
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Getting all devices details for device ids: " + devicesIds);
|
||||
}
|
||||
PaginationResult paginationResult = new PaginationResult();
|
||||
int count;
|
||||
List<Device> subscribedDeviceDetails;
|
||||
try {
|
||||
DeviceManagementDAOFactory.openConnection();
|
||||
subscribedDeviceDetails = deviceDAO
|
||||
.getSubscribedDevices(offsetValue, limitValue, devicesIds, tenantId, status);
|
||||
if (subscribedDeviceDetails.isEmpty()){
|
||||
paginationResult.setData(new ArrayList<>());
|
||||
paginationResult.setRecordsFiltered(0);
|
||||
paginationResult.setRecordsTotal(0);
|
||||
}
|
||||
count = deviceDAO.getSubscribedDeviceCount(devicesIds, tenantId, status);
|
||||
paginationResult.setData(getAllDeviceInfo(subscribedDeviceDetails));
|
||||
paginationResult.setRecordsFiltered(count);
|
||||
paginationResult.setRecordsTotal(count);
|
||||
return paginationResult;
|
||||
} catch (DeviceManagementDAOException e) {
|
||||
String msg = "Error occurred while retrieving device list for device ids " + devicesIds;
|
||||
log.error(msg, e);
|
||||
throw new DeviceManagementException(msg, e);
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred while opening a connection to the data source";
|
||||
log.error(msg, e);
|
||||
throw new DeviceManagementException(msg, e);
|
||||
} finally {
|
||||
DeviceManagementDAOFactory.closeConnection();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap the device configuration data into DeviceConfiguration bean
|
||||
* @param device Device queried using the properties
|
||||
@ -3722,39 +3760,4 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
|
||||
deviceConfiguration.setDeviceOwner(deviceOwner);
|
||||
return deviceConfiguration;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PaginationResult getAppSubscribedDevices(int offsetValue, int limitValue,
|
||||
List<Integer> devicesIds, String status)
|
||||
throws DeviceManagementException {
|
||||
|
||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Getting all devices details for device ids: " + devicesIds);
|
||||
}
|
||||
PaginationResult paginationResult = new PaginationResult();
|
||||
int count;
|
||||
List<Device> subscribedDeviceDetails;
|
||||
try {
|
||||
DeviceManagementDAOFactory.openConnection();
|
||||
subscribedDeviceDetails = deviceDAO
|
||||
.getSubscribedDevices(offsetValue, limitValue, devicesIds, tenantId, status);
|
||||
count = subscribedDeviceDetails.size();
|
||||
|
||||
} catch (DeviceManagementDAOException e) {
|
||||
String msg = "Error occurred while retrieving device list for device ids " + devicesIds;
|
||||
log.error(msg, e);
|
||||
throw new DeviceManagementException(msg, e);
|
||||
} catch (SQLException e) {
|
||||
String msg = "Error occurred while opening a connection to the data source";
|
||||
log.error(msg, e);
|
||||
throw new DeviceManagementException(msg, e);
|
||||
} finally {
|
||||
DeviceManagementDAOFactory.closeConnection();
|
||||
}
|
||||
paginationResult.setData(getAllDeviceInfo(subscribedDeviceDetails));
|
||||
paginationResult.setRecordsFiltered(count);
|
||||
paginationResult.setRecordsTotal(count);
|
||||
return paginationResult;
|
||||
}
|
||||
}
|
||||
|
||||
@ -156,6 +156,7 @@
|
||||
<Scope>perm:admin:app:review:view</Scope>
|
||||
<Scope>perm:admin:app:publisher:update</Scope>
|
||||
<Scope>perm:admin:app:review:update</Scope>
|
||||
<Scope>perm:admin:app:subscription:view</Scope>
|
||||
<Scope>perm:device-types:types</Scope>
|
||||
<Scope>perm:enterprise:modify</Scope>
|
||||
<Scope>perm:enterprise:view</Scope>
|
||||
@ -255,7 +256,7 @@
|
||||
<Scope>perm:device:enroll</Scope>
|
||||
<Scope>perm:geo-service:analytics-view</Scope>
|
||||
<Scope>perm:geo-service:alerts-manage</Scope>
|
||||
<Scope>appm:rea</Scope>
|
||||
<Scope>appm:read</Scope>
|
||||
<Scope>perm:devices:permanent-delete</Scope>
|
||||
</Scopes>
|
||||
<SSOConfiguration>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user