Delete tenant data

Refactor code

Add begin transaction

Refactor code
missing-default-permission
Ashvini Wegodapola 7 months ago
parent f3974c2cb4
commit 159f603605

@ -546,4 +546,5 @@ public interface ApplicationManager {
* @throws ApplicationManagementException thrown if an error occurs when deleting data
*/
void deleteApplicationDataOfTenant(int tenantId) throws ApplicationManagementException;
void deleteApplicationDataByTenantDomain(String tenantDomain) throws ApplicationManagementException;
}

@ -384,6 +384,11 @@
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
</dependency>
<dependency>
<groupId>org.wso2.carbon.multitenancy</groupId>
<artifactId>org.wso2.carbon.tenant.mgt</artifactId>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

@ -96,6 +96,8 @@ import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementEx
import io.entgra.device.mgt.core.device.mgt.core.dto.DeviceType;
import io.entgra.device.mgt.core.device.mgt.core.service.DeviceManagementProviderService;
import org.wso2.carbon.stratos.common.beans.TenantInfoBean;
import org.wso2.carbon.tenant.mgt.services.TenantMgtAdminService;
import org.wso2.carbon.user.api.UserRealm;
import org.wso2.carbon.user.api.UserStoreException;
@ -4427,15 +4429,18 @@ public class ApplicationManagerImpl implements ApplicationManager {
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} catch (ApplicationManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "Database access error is occurred when getting applications for tenant with ID: " + tenantId;
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} catch (LifeCycleManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "Error occurred while deleting life-cycle state data of application releases of the tenant"
+ " of ID: " + tenantId ;
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} catch (ReviewManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "Error occurred while deleting reviews of application releases of the applications"
+ " of tenant ID: " + tenantId ;
log.error(msg, e);
@ -4450,4 +4455,80 @@ public class ApplicationManagerImpl implements ApplicationManager {
ConnectionManagerUtil.closeDBConnection();
}
}
@Override
public void deleteApplicationDataByTenantDomain(String tenantDomain) throws ApplicationManagementException {
int tenantId;
try{
TenantMgtAdminService tenantMgtAdminService = new TenantMgtAdminService();
TenantInfoBean tenantInfoBean = tenantMgtAdminService.getTenant(tenantDomain);
tenantId = tenantInfoBean.getTenantId();
} catch (Exception e) {
String msg = "Error getting tenant ID from domain: "
+ tenantDomain;
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
}
try {
ConnectionManagerUtil.beginDBTransaction();
vppApplicationDAO.deleteAssociationByTenant(tenantId);
vppApplicationDAO.deleteVppUserByTenant(tenantId);
vppApplicationDAO.deleteAssetsByTenant(tenantId);
reviewDAO.deleteReviewsByTenant(tenantId);
subscriptionDAO.deleteOperationMappingByTenant(tenantId);
subscriptionDAO.deleteDeviceSubscriptionByTenant(tenantId);
subscriptionDAO.deleteGroupSubscriptionByTenant(tenantId);
subscriptionDAO.deleteRoleSubscriptionByTenant(tenantId);
subscriptionDAO.deleteUserSubscriptionByTenant(tenantId);
applicationDAO.deleteAppFavouritesByTenant(tenantId);
applicationDAO.deleteApplicationTagsMappingByTenant(tenantId);
applicationDAO.deleteApplicationTagsByTenant(tenantId);
applicationDAO.deleteApplicationCategoryMappingByTenant(tenantId);
applicationDAO.deleteApplicationCategoriesByTenant(tenantId);
subscriptionDAO.deleteScheduledSubscriptionByTenant(tenantId);
lifecycleStateDAO.deleteAppLifecycleStatesByTenant(tenantId);
applicationReleaseDAO.deleteReleasesByTenant(tenantId);
visibilityDAO.deleteAppUnrestrictedRolesByTenant(tenantId);
spApplicationDAO.deleteSPApplicationMappingByTenant(tenantId);
spApplicationDAO.deleteIdentityServerByTenant(tenantId);
applicationDAO.deleteApplicationsByTenant(tenantId);
APIUtil.getApplicationStorageManager().deleteAppFolderOfTenant(tenantId);
ConnectionManagerUtil.commitDBTransaction();
} catch (DBConnectionException e) {
String msg = "Error occurred while observing the database connection to delete applications for tenant with ID: "
+ tenantId;
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} catch (ApplicationManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "Database access error is occurred when getting applications for tenant with ID: " + tenantId;
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} catch (LifeCycleManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "Error occurred while deleting life-cycle state data of application releases of the tenant"
+ " of ID: " + tenantId ;
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} catch (ReviewManagementDAOException e) {
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "Error occurred while deleting reviews of application releases of the applications"
+ " of tenant ID: " + tenantId ;
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} catch (ApplicationStorageManagementException e) {
ConnectionManagerUtil.rollbackDBTransaction();
String msg = "Error occurred while deleting App folder of tenant"
+ " of tenant ID: " + tenantId ;
log.error(msg, e);
throw new ApplicationManagementException(msg, e);
} finally {
ConnectionManagerUtil.closeDBConnection();
}
}
}

@ -17,6 +17,7 @@
*/
package io.entgra.device.mgt.core.device.mgt.api.jaxrs.service.impl.admin;
import io.entgra.device.mgt.core.application.mgt.common.exception.ApplicationManagementException;
import io.entgra.device.mgt.core.device.mgt.common.exceptions.DeviceManagementException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -93,11 +94,13 @@ public class UserManagementAdminServiceImpl implements UserManagementAdminServic
public Response deleteTenantByDomain(@PathParam("tenantDomain") String tenantDomain) {
try {
int tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
if(tenantId != MultitenantConstants.SUPER_TENANT_ID){
if (tenantId != MultitenantConstants.SUPER_TENANT_ID){
String msg = "Only super tenants are allowed to delete tenants";
log.error(msg);
return Response.status(Response.Status.UNAUTHORIZED).entity(msg).build();
}else{
} else {
DeviceMgtAPIUtils.getApplicationManager().deleteApplicationDataByTenantDomain(tenantDomain);
DeviceMgtAPIUtils.getDeviceManagementService().deleteDeviceDataByTenantDomain(tenantDomain);
TenantMgtAdminService tenantMgtAdminService = new TenantMgtAdminService();
tenantMgtAdminService.deleteTenant(tenantDomain);
String msg = "Tenant Deletion process has been initiated for tenant:" + tenantDomain;
@ -108,6 +111,14 @@ public class UserManagementAdminServiceImpl implements UserManagementAdminServic
String msg = "Error deleting tenant: " + tenantDomain;
log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} catch (ApplicationManagementException e) {
String msg = "Error deleting application data of tenant: " + tenantDomain;
log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
} catch (DeviceManagementException e) {
String msg = "Error deleting device data of tenant: " + tenantDomain;
log.error(msg, e);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
}
}

@ -1070,4 +1070,5 @@ public interface DeviceManagementProviderService {
List<Application> getInstalledApplicationsOnDevice(Device device) throws DeviceManagementException;
List<Device> getEnrolledDevicesSince(Date since) throws DeviceManagementException;
List<Device> getEnrolledDevicesPriorTo(Date before) throws DeviceManagementException;
void deleteDeviceDataByTenantDomain(String tenantDomain) throws DeviceManagementException;
}

@ -21,6 +21,7 @@ package io.entgra.device.mgt.core.device.mgt.core.service;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import io.entgra.device.mgt.core.device.mgt.common.metadata.mgt.DeviceStatusManagementService;
import io.entgra.device.mgt.core.device.mgt.core.dao.TenantDAO;
import io.entgra.device.mgt.core.device.mgt.extensions.logger.spi.EntgraLogger;
import io.entgra.device.mgt.core.notification.logger.DeviceEnrolmentLogContext;
import io.entgra.device.mgt.core.notification.logger.impl.EntgraDeviceEnrolmentLoggerImpl;
@ -160,7 +161,6 @@ import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
public class DeviceManagementProviderServiceImpl implements DeviceManagementProviderService,
@ -178,6 +178,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
private final ApplicationDAO applicationDAO;
private MetadataDAO metadataDAO;
private final DeviceStatusDAO deviceStatusDAO;
private final TenantDAO tenantDao;
int count = 0;
public DeviceManagementProviderServiceImpl() {
@ -188,6 +189,7 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
this.enrollmentDAO = DeviceManagementDAOFactory.getEnrollmentDAO();
this.metadataDAO = MetadataManagementDAOFactory.getMetadataDAO();
this.deviceStatusDAO = DeviceManagementDAOFactory.getDeviceStatusDAO();
this.tenantDao = DeviceManagementDAOFactory.getTenantDAO();
/* Registering a listener to retrieve events when some device management service plugin is installed after
* the component is done getting initialized */
@ -5187,4 +5189,94 @@ public class DeviceManagementProviderServiceImpl implements DeviceManagementProv
}
return devices;
}
@Override
public void deleteDeviceDataByTenantDomain(String tenantDomain) throws DeviceManagementException {
int tenantId;
try{
TenantMgtAdminService tenantMgtAdminService = new TenantMgtAdminService();
TenantInfoBean tenantInfoBean = tenantMgtAdminService.getTenant(tenantDomain);
tenantId = tenantInfoBean.getTenantId();
} catch (Exception e) {
String msg = "Error getting tenant ID from domain: "
+ tenantDomain;
log.error(msg);
throw new DeviceManagementException(msg, e);
}
try {
DeviceManagementDAOFactory.beginTransaction();
tenantDao.deleteExternalPermissionMapping(tenantId);
tenantDao.deleteExternalDeviceMappingByTenantId(tenantId);
tenantDao.deleteExternalGroupMappingByTenantId(tenantId);
// TODO: Check whether deleting DM_DEVICE_ORGANIZATION table data is necessary
// tenantDao.deleteDeviceOrganizationByTenantId(tenantId);
tenantDao.deleteDeviceHistoryLastSevenDaysByTenantId(tenantId);
tenantDao.deleteDeviceDetailByTenantId(tenantId);
tenantDao.deleteDeviceLocationByTenantId(tenantId);
tenantDao.deleteDeviceInfoByTenantId(tenantId);
tenantDao.deleteNotificationByTenantId(tenantId);
tenantDao.deleteAppIconsByTenantId(tenantId);
tenantDao.deleteTraccarUnsyncedDevicesByTenantId(tenantId);
tenantDao.deleteDeviceEventGroupMappingByTenantId(tenantId);
tenantDao.deleteDeviceEventByTenantId(tenantId);
tenantDao.deleteGeofenceEventMappingByTenantId(tenantId);
tenantDao.deleteGeofenceGroupMappingByTenantId(tenantId);
tenantDao.deleteGeofenceByTenantId(tenantId);
tenantDao.deleteDeviceGroupPolicyByTenantId(tenantId);
tenantDao.deleteDynamicTaskPropertiesByTenantId(tenantId);
tenantDao.deleteDynamicTaskByTenantId(tenantId);
tenantDao.deleteMetadataByTenantId(tenantId);
tenantDao.deleteOTPDataByTenantId(tenantId);
tenantDao.deleteSubOperationTemplate(tenantId);
tenantDao.deleteDeviceSubTypeByTenantId(tenantId);
tenantDao.deleteCEAPoliciesByTenantId(tenantId);
tenantDao.deleteApplicationByTenantId(tenantId);
tenantDao.deletePolicyCriteriaPropertiesByTenantId(tenantId);
tenantDao.deletePolicyCriteriaByTenantId(tenantId);
tenantDao.deleteCriteriaByTenantId(tenantId);
tenantDao.deletePolicyChangeManagementByTenantId(tenantId);
tenantDao.deletePolicyComplianceFeaturesByTenantId(tenantId);
tenantDao.deletePolicyComplianceStatusByTenantId(tenantId);
tenantDao.deleteRolePolicyByTenantId(tenantId);
tenantDao.deleteUserPolicyByTenantId(tenantId);
tenantDao.deleteDeviceTypePolicyByTenantId(tenantId);
tenantDao.deleteDevicePolicyAppliedByTenantId(tenantId);
tenantDao.deleteDevicePolicyByTenantId(tenantId);
tenantDao.deletePolicyCorrectiveActionByTenantId(tenantId);
tenantDao.deletePolicyByTenantId(tenantId);
tenantDao.deleteProfileFeaturesByTenantId(tenantId);
tenantDao.deleteProfileByTenantId(tenantId);
tenantDao.deleteDeviceOperationResponseLargeByTenantId(tenantId);
tenantDao.deleteDeviceOperationResponseByTenantId(tenantId);
tenantDao.deleteEnrolmentOpMappingByTenantId(tenantId);
tenantDao.deleteDeviceStatusByTenantId(tenantId);
tenantDao.deleteEnrolmentByTenantId(tenantId);
tenantDao.deleteOperationByTenantId(tenantId);
tenantDao.deleteDeviceGroupMapByTenantId(tenantId);
tenantDao.deleteGroupPropertiesByTenantId(tenantId);
tenantDao.deleteDevicePropertiesByTenantId(tenantId);
tenantDao.deleteDeviceByTenantId(tenantId);
tenantDao.deleteRoleGroupMapByTenantId(tenantId);
tenantDao.deleteGroupByTenantId(tenantId);
tenantDao.deleteDeviceCertificateByTenantId(tenantId);
DeviceManagementDAOFactory.commitTransaction();
} catch (DeviceManagementDAOException e) {
DeviceManagementDAOFactory.rollbackTransaction();
String msg = "Error deleting data of tenant of ID: '" + tenantId + "'";
log.error(msg);
throw new DeviceManagementException(msg, e);
} catch (TransactionManagementException e) {
String msg = "Error while initiating transaction when trying to delete tenant info of '" + tenantId + "'";
log.error(msg);
throw new DeviceManagementException(msg, e);
} finally {
DeviceManagementDAOFactory.closeConnection();
}
}
}

@ -142,12 +142,13 @@ public class TenantManagerImpl implements TenantManager {
log.debug("Request is received to delete Device related data of tenant with ID: " + tenantId);
}
try {
DeviceManagementDAOFactory.openConnection();
DeviceManagementDAOFactory.beginTransaction();
tenantDao.deleteExternalPermissionMapping(tenantId);
tenantDao.deleteExternalDeviceMappingByTenantId(tenantId);
tenantDao.deleteExternalGroupMappingByTenantId(tenantId);
tenantDao.deleteDeviceOrganizationByTenantId(tenantId);
// TODO: Check whether deleting DM_DEVICE_ORGANIZATION table data is necessary
// tenantDao.deleteDeviceOrganizationByTenantId(tenantId);
tenantDao.deleteDeviceHistoryLastSevenDaysByTenantId(tenantId);
tenantDao.deleteDeviceDetailByTenantId(tenantId);
tenantDao.deleteDeviceLocationByTenantId(tenantId);
@ -206,8 +207,8 @@ public class TenantManagerImpl implements TenantManager {
String msg = "Error deleting data of tenant of ID: '" + tenantId + "'";
log.error(msg);
throw new TenantMgtException(msg, e);
} catch (SQLException e) {
String msg = "Error accessing the database when trying to delete tenant info of '" + tenantId + "'";
} catch (TransactionManagementException e) {
String msg = "Error initializing transaction when trying to delete tenant info of '" + tenantId + "'";
log.error(msg);
throw new TenantMgtException(msg, e);
} finally {

Loading…
Cancel
Save