From ad0e7fbcbc27da9ac1e8570274467156e3835c50 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Wed, 27 Nov 2024 12:51:47 +0200 Subject: [PATCH 1/4] allow mobile deletion if used by mobile bundle --- .../main/data/upgrade/3.8.1/schema_update.sql | 4 ++-- .../controller/MobileAppController.java | 23 ++++++++----------- .../common/data/mobile/LoginMobileInfo.java | 5 +++- .../common/data/mobile/UserMobileInfo.java | 8 ++++++- .../main/resources/sql/schema-entities.sql | 4 ++-- 5 files changed, 25 insertions(+), 19 deletions(-) diff --git a/application/src/main/data/upgrade/3.8.1/schema_update.sql b/application/src/main/data/upgrade/3.8.1/schema_update.sql index e4faca82a5..3aa0f08edf 100644 --- a/application/src/main/data/upgrade/3.8.1/schema_update.sql +++ b/application/src/main/data/upgrade/3.8.1/schema_update.sql @@ -38,8 +38,8 @@ CREATE TABLE IF NOT EXISTS mobile_app_bundle ( ios_app_id uuid UNIQUE, layout_config varchar(16384), oauth2_enabled boolean, - CONSTRAINT fk_android_app_id FOREIGN KEY (android_app_id) REFERENCES mobile_app(id), - CONSTRAINT fk_ios_app_id FOREIGN KEY (ios_app_id) REFERENCES mobile_app(id) + CONSTRAINT fk_android_app_id FOREIGN KEY (android_app_id) REFERENCES mobile_app(id) ON DELETE SET NULL, + CONSTRAINT fk_ios_app_id FOREIGN KEY (ios_app_id) REFERENCES mobile_app(id) ON DELETE SET NULL ); CREATE INDEX IF NOT EXISTS mobile_app_bundle_tenant_id ON mobile_app_bundle(tenant_id); diff --git a/application/src/main/java/org/thingsboard/server/controller/MobileAppController.java b/application/src/main/java/org/thingsboard/server/controller/MobileAppController.java index da206193fb..3626ff4c3e 100644 --- a/application/src/main/java/org/thingsboard/server/controller/MobileAppController.java +++ b/application/src/main/java/org/thingsboard/server/controller/MobileAppController.java @@ -41,6 +41,7 @@ import org.thingsboard.server.common.data.mobile.LoginMobileInfo; import org.thingsboard.server.common.data.mobile.UserMobileInfo; import org.thingsboard.server.common.data.mobile.app.MobileApp; import org.thingsboard.server.common.data.mobile.app.MobileAppVersionInfo; +import org.thingsboard.server.common.data.mobile.app.StoreInfo; import org.thingsboard.server.common.data.mobile.bundle.MobileAppBundle; import org.thingsboard.server.common.data.mobile.layout.MobilePage; import org.thingsboard.server.common.data.oauth2.OAuth2ClientLoginInfo; @@ -55,6 +56,7 @@ import org.thingsboard.server.service.security.permission.Operation; import org.thingsboard.server.service.security.permission.Resource; import java.util.List; +import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; @@ -80,10 +82,12 @@ public class MobileAppController extends BaseController { public LoginMobileInfo getLoginMobileInfo(@Parameter(description = "Mobile application package name") @RequestParam String pkgName, @Parameter(description = "Platform type", schema = @Schema(allowableValues = {"ANDROID", "IOS"})) - @RequestParam PlatformType platform) { + @RequestParam PlatformType platform) throws ThingsboardException { List oauth2Clients = oAuth2ClientService.findOAuth2ClientLoginInfosByMobilePkgNameAndPlatformType(pkgName, platform); - MobileApp mobileApp = mobileAppService.findMobileAppByPkgNameAndPlatformType(pkgName, platform); - return new LoginMobileInfo(oauth2Clients, mobileApp != null ? mobileApp.getVersionInfo() : null); + MobileApp mobileApp = checkNotNull(mobileAppService.findMobileAppByPkgNameAndPlatformType(pkgName, platform)); + StoreInfo storeInfo = Optional.ofNullable(mobileApp).map(MobileApp::getStoreInfo).orElse(null); + MobileAppVersionInfo versionInfo = Optional.ofNullable(mobileApp).map(MobileApp::getVersionInfo).orElse(null); + return new LoginMobileInfo(oauth2Clients, storeInfo, versionInfo); } @ApiOperation(value = "Get user mobile app basic info (getUserMobileInfo)", notes = AVAILABLE_FOR_ANY_AUTHORIZED_USER) @@ -97,17 +101,10 @@ public class MobileAppController extends BaseController { User user = userService.findUserById(securityUser.getTenantId(), securityUser.getId()); HomeDashboardInfo homeDashboardInfo = securityUser.isSystemAdmin() ? null : getHomeDashboardInfo(securityUser, user.getAdditionalInfo()); MobileAppBundle mobileAppBundle = mobileAppBundleService.findMobileAppBundleByPkgNameAndPlatform(securityUser.getTenantId(), pkgName, platform); - return new UserMobileInfo(user, homeDashboardInfo, getVisiblePages(mobileAppBundle)); - } - - @ApiOperation(value = "Get mobile app version info (getMobileVersionInfo)") - @GetMapping(value = "/mobile/versionInfo") - public MobileAppVersionInfo getMobileVersionInfo(@Parameter(description = "Mobile application package name") - @RequestParam String pkgName, - @Parameter(description = "Platform type", schema = @Schema(allowableValues = {"ANDROID", "IOS"})) - @RequestParam PlatformType platform) { MobileApp mobileApp = mobileAppService.findMobileAppByPkgNameAndPlatformType(pkgName, platform); - return mobileApp != null ? mobileApp.getVersionInfo() : null; + StoreInfo storeInfo = Optional.ofNullable(mobileApp).map(MobileApp::getStoreInfo).orElse(null); + MobileAppVersionInfo versionInfo = Optional.ofNullable(mobileApp).map(MobileApp::getVersionInfo).orElse(null); + return new UserMobileInfo(user, storeInfo, versionInfo, homeDashboardInfo, getVisiblePages(mobileAppBundle)); } @ApiOperation(value = "Save Or update Mobile app (saveMobileApp)", diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/mobile/LoginMobileInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/mobile/LoginMobileInfo.java index 059dc17295..a28302bd58 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/mobile/LoginMobileInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/mobile/LoginMobileInfo.java @@ -16,9 +16,12 @@ package org.thingsboard.server.common.data.mobile; import org.thingsboard.server.common.data.mobile.app.MobileAppVersionInfo; +import org.thingsboard.server.common.data.mobile.app.StoreInfo; import org.thingsboard.server.common.data.oauth2.OAuth2ClientLoginInfo; import java.util.List; -public record LoginMobileInfo(List oAuth2ClientLoginInfos, MobileAppVersionInfo versionInfo) { +public record LoginMobileInfo(List oAuth2ClientLoginInfos, + StoreInfo storeInfo, + MobileAppVersionInfo versionInfo) { } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/mobile/UserMobileInfo.java b/common/data/src/main/java/org/thingsboard/server/common/data/mobile/UserMobileInfo.java index f7a4033b16..1d20f17bc1 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/mobile/UserMobileInfo.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/mobile/UserMobileInfo.java @@ -18,7 +18,13 @@ package org.thingsboard.server.common.data.mobile; import com.fasterxml.jackson.databind.JsonNode; import org.thingsboard.server.common.data.HomeDashboardInfo; import org.thingsboard.server.common.data.User; +import org.thingsboard.server.common.data.mobile.app.MobileAppVersionInfo; +import org.thingsboard.server.common.data.mobile.app.StoreInfo; -public record UserMobileInfo(User user, HomeDashboardInfo homeDashboardInfo, JsonNode pages) { +public record UserMobileInfo(User user, + StoreInfo storeInfo, + MobileAppVersionInfo versionInfo, + HomeDashboardInfo homeDashboardInfo, + JsonNode pages) { } diff --git a/dao/src/main/resources/sql/schema-entities.sql b/dao/src/main/resources/sql/schema-entities.sql index edcb8645dd..cccaf9062d 100644 --- a/dao/src/main/resources/sql/schema-entities.sql +++ b/dao/src/main/resources/sql/schema-entities.sql @@ -641,8 +641,8 @@ CREATE TABLE IF NOT EXISTS mobile_app_bundle ( ios_app_id uuid UNIQUE, layout_config varchar(16384), oauth2_enabled boolean, - CONSTRAINT fk_android_app_id FOREIGN KEY (android_app_id) REFERENCES mobile_app(id), - CONSTRAINT fk_ios_app_id FOREIGN KEY (ios_app_id) REFERENCES mobile_app(id) + CONSTRAINT fk_android_app_id FOREIGN KEY (android_app_id) REFERENCES mobile_app(id) ON DELETE SET NULL, + CONSTRAINT fk_ios_app_id FOREIGN KEY (ios_app_id) REFERENCES mobile_app(id) ON DELETE SET NULL ); CREATE TABLE IF NOT EXISTS domain_oauth2_client ( From f09f2c7950ebb443b9911f2892688828f0daefd6 Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Wed, 27 Nov 2024 13:21:40 +0200 Subject: [PATCH 2/4] deleted redundant constraint checks --- .../server/dao/mobile/MobileAppServiceImpl.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/mobile/MobileAppServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/mobile/MobileAppServiceImpl.java index efd152f944..d3434e1016 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/mobile/MobileAppServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/mobile/MobileAppServiceImpl.java @@ -43,7 +43,6 @@ import java.util.Optional; public class MobileAppServiceImpl extends AbstractEntityService implements MobileAppService { private static final String PLATFORM_TYPE_IS_REQUIRED = "Platform type is required if package name is specified"; - private static final String MOBILE_APP_BUNDLE_CONSTRAINT = "The mobile app referenced by the mobile bundle cannot be deleted!"; @Autowired private MobileAppDao mobileAppDao; @@ -68,15 +67,8 @@ public class MobileAppServiceImpl extends AbstractEntityService implements Mobil @Override public void deleteMobileAppById(TenantId tenantId, MobileAppId mobileAppId) { log.trace("Executing deleteMobileAppById [{}]", mobileAppId.getId()); - try { - mobileAppDao.removeById(tenantId, mobileAppId.getId()); - eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId).entityId(mobileAppId).build()); - } catch (Exception e) { - checkConstraintViolation(e, - Map.of("fk_android_app_id", MOBILE_APP_BUNDLE_CONSTRAINT, - "fk_ios_app_id", MOBILE_APP_BUNDLE_CONSTRAINT)); - throw e; - } + mobileAppDao.removeById(tenantId, mobileAppId.getId()); + eventPublisher.publishEvent(DeleteEntityEvent.builder().tenantId(tenantId).entityId(mobileAppId).build()); } @Override From 82324ff3c69d3ee667bc965ec9f52c49831c123b Mon Sep 17 00:00:00 2001 From: dashevchenko Date: Wed, 27 Nov 2024 13:51:28 +0200 Subject: [PATCH 3/4] fixed jpa method --- .../thingsboard/server/dao/sql/oauth2/JpaOAuth2ClientDao.java | 2 +- .../server/dao/sql/oauth2/OAuth2ClientRepository.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/oauth2/JpaOAuth2ClientDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/oauth2/JpaOAuth2ClientDao.java index 6febd651bb..4310e0b705 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/oauth2/JpaOAuth2ClientDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/oauth2/JpaOAuth2ClientDao.java @@ -81,7 +81,7 @@ public class JpaOAuth2ClientDao extends JpaAbstractDao Date: Wed, 27 Nov 2024 16:44:53 +0200 Subject: [PATCH 4/4] fixed not-null check --- .../thingsboard/server/controller/MobileAppController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/controller/MobileAppController.java b/application/src/main/java/org/thingsboard/server/controller/MobileAppController.java index 3626ff4c3e..362539f6b6 100644 --- a/application/src/main/java/org/thingsboard/server/controller/MobileAppController.java +++ b/application/src/main/java/org/thingsboard/server/controller/MobileAppController.java @@ -82,9 +82,9 @@ public class MobileAppController extends BaseController { public LoginMobileInfo getLoginMobileInfo(@Parameter(description = "Mobile application package name") @RequestParam String pkgName, @Parameter(description = "Platform type", schema = @Schema(allowableValues = {"ANDROID", "IOS"})) - @RequestParam PlatformType platform) throws ThingsboardException { + @RequestParam PlatformType platform) { List oauth2Clients = oAuth2ClientService.findOAuth2ClientLoginInfosByMobilePkgNameAndPlatformType(pkgName, platform); - MobileApp mobileApp = checkNotNull(mobileAppService.findMobileAppByPkgNameAndPlatformType(pkgName, platform)); + MobileApp mobileApp = mobileAppService.findMobileAppByPkgNameAndPlatformType(pkgName, platform); StoreInfo storeInfo = Optional.ofNullable(mobileApp).map(MobileApp::getStoreInfo).orElse(null); MobileAppVersionInfo versionInfo = Optional.ofNullable(mobileApp).map(MobileApp::getVersionInfo).orElse(null); return new LoginMobileInfo(oauth2Clients, storeInfo, versionInfo);