added platformType request param to /mobile/app API endpoint
This commit is contained in:
		
							parent
							
								
									3a243c821a
								
							
						
					
					
						commit
						06ad4bdc43
					
				@ -31,6 +31,7 @@ import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
import org.thingsboard.server.common.data.exception.ThingsboardException;
 | 
			
		||||
import org.thingsboard.server.common.data.id.MobileAppId;
 | 
			
		||||
import org.thingsboard.server.common.data.mobile.MobileApp;
 | 
			
		||||
import org.thingsboard.server.common.data.oauth2.PlatformType;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageData;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageLink;
 | 
			
		||||
import org.thingsboard.server.config.annotations.ApiOperation;
 | 
			
		||||
@ -76,7 +77,9 @@ public class MobileAppController extends BaseController {
 | 
			
		||||
    @ApiOperation(value = "Get mobile app infos (getTenantMobileAppInfos)", notes = SYSTEM_AUTHORITY_PARAGRAPH)
 | 
			
		||||
    @PreAuthorize("hasAnyAuthority('SYS_ADMIN')")
 | 
			
		||||
    @GetMapping(value = "/mobile/app")
 | 
			
		||||
    public PageData<MobileApp> getTenantMobileApps(@Parameter(description = PAGE_SIZE_DESCRIPTION, required = true)
 | 
			
		||||
    public PageData<MobileApp> getTenantMobileApps(@Parameter(description = "Platform type: ANDROID or IOS")
 | 
			
		||||
                                                   @RequestParam(required = false) PlatformType platformType,
 | 
			
		||||
                                                   @Parameter(description = PAGE_SIZE_DESCRIPTION, required = true)
 | 
			
		||||
                                                   @RequestParam int pageSize,
 | 
			
		||||
                                                   @Parameter(description = PAGE_NUMBER_DESCRIPTION, required = true)
 | 
			
		||||
                                                   @RequestParam int page,
 | 
			
		||||
@ -88,7 +91,7 @@ public class MobileAppController extends BaseController {
 | 
			
		||||
                                                   @RequestParam(required = false) String sortOrder) throws ThingsboardException {
 | 
			
		||||
        accessControlService.checkPermission(getCurrentUser(), Resource.MOBILE_APP, Operation.READ);
 | 
			
		||||
        PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
 | 
			
		||||
        return mobileAppService.findMobileAppsByTenantId(getTenantId(), pageLink);
 | 
			
		||||
        return mobileAppService.findMobileAppsByTenantId(getTenantId(), platformType, pageLink);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ApiOperation(value = "Get mobile info by id (getMobileAppInfoById)", notes = SYSTEM_AUTHORITY_PARAGRAPH)
 | 
			
		||||
 | 
			
		||||
@ -308,7 +308,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService {
 | 
			
		||||
            jwtSettingsService.saveJwtSettings(jwtSettings);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        List<MobileApp> mobiles = mobileAppDao.findByTenantId(TenantId.SYS_TENANT_ID, new PageLink(Integer.MAX_VALUE,0)).getData();
 | 
			
		||||
        List<MobileApp> mobiles = mobileAppDao.findByTenantId(TenantId.SYS_TENANT_ID, null, new PageLink(Integer.MAX_VALUE,0)).getData();
 | 
			
		||||
        if (CollectionUtils.isNotEmpty(mobiles)) {
 | 
			
		||||
            mobiles.stream()
 | 
			
		||||
                    .filter(mobileApp -> !validateKeyLength(mobileApp.getAppSecret()))
 | 
			
		||||
 | 
			
		||||
@ -21,10 +21,10 @@ import org.junit.After;
 | 
			
		||||
import org.junit.Before;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.thingsboard.server.common.data.StringUtils;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.mobile.AndroidQrCodeConfig;
 | 
			
		||||
import org.thingsboard.server.common.data.mobile.IosQrCodeConfig;
 | 
			
		||||
import org.thingsboard.server.common.data.mobile.MobileApp;
 | 
			
		||||
import org.thingsboard.server.common.data.oauth2.PlatformType;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageData;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageLink;
 | 
			
		||||
import org.thingsboard.server.dao.service.DaoSqlTest;
 | 
			
		||||
@ -59,7 +59,7 @@ public class MobileAppControllerTest extends AbstractControllerTest {
 | 
			
		||||
        PageData<MobileApp> pageData = doGetTypedWithPageLink("/api/mobile/app?", PAGE_DATA_MOBILE_APP_TYPE_REF, new PageLink(10, 0));
 | 
			
		||||
        assertThat(pageData.getData()).isEmpty();
 | 
			
		||||
 | 
			
		||||
        MobileApp mobileApp = validMobileApp(TenantId.SYS_TENANT_ID, "my.test.package");
 | 
			
		||||
        MobileApp mobileApp = validMobileApp("my.test.package", PlatformType.ANDROID);
 | 
			
		||||
        MobileApp savedMobileApp = doPost("/api/mobile/app", mobileApp, MobileApp.class);
 | 
			
		||||
 | 
			
		||||
        PageData<MobileApp> pageData2 = doGetTypedWithPageLink("/api/mobile/app?", PAGE_DATA_MOBILE_APP_TYPE_REF, new PageLink(10, 0));
 | 
			
		||||
@ -76,7 +76,7 @@ public class MobileAppControllerTest extends AbstractControllerTest {
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testSaveMobileAppWithShortAppSecret() throws Exception {
 | 
			
		||||
        MobileApp mobileApp = validMobileApp(TenantId.SYS_TENANT_ID, "mobileApp.ce");
 | 
			
		||||
        MobileApp mobileApp = validMobileApp( "mobileApp.ce", PlatformType.ANDROID);
 | 
			
		||||
        mobileApp.setAppSecret("short");
 | 
			
		||||
        doPost("/api/mobile/app", mobileApp)
 | 
			
		||||
                .andExpect(status().isBadRequest())
 | 
			
		||||
@ -85,7 +85,7 @@ public class MobileAppControllerTest extends AbstractControllerTest {
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testShouldNotSaveMobileAppWithWrongQrCodeConf() throws Exception {
 | 
			
		||||
        MobileApp mobileApp = validMobileApp(TenantId.SYS_TENANT_ID, "mobileApp.ce");
 | 
			
		||||
        MobileApp mobileApp = validMobileApp("mobileApp.ce", PlatformType.ANDROID);
 | 
			
		||||
        AndroidQrCodeConfig androidQrCodeConfig = AndroidQrCodeConfig.builder()
 | 
			
		||||
                .enabled(true)
 | 
			
		||||
                .appPackage(null)
 | 
			
		||||
@ -110,7 +110,7 @@ public class MobileAppControllerTest extends AbstractControllerTest {
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testShouldNotSaveMobileAppWithWrongIosConf() throws Exception {
 | 
			
		||||
        MobileApp mobileApp = validMobileApp(TenantId.SYS_TENANT_ID, "mobileApp.ce");
 | 
			
		||||
        MobileApp mobileApp = validMobileApp("mobileApp.ce", PlatformType.ANDROID);
 | 
			
		||||
        IosQrCodeConfig iosQrCodeConfig = IosQrCodeConfig.builder()
 | 
			
		||||
                .enabled(true)
 | 
			
		||||
                .appId(null)
 | 
			
		||||
@ -127,12 +127,27 @@ public class MobileAppControllerTest extends AbstractControllerTest {
 | 
			
		||||
                .andExpect(status().isOk());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private MobileApp validMobileApp(TenantId tenantId, String mobileAppName) {
 | 
			
		||||
        MobileApp MobileApp = new MobileApp();
 | 
			
		||||
        MobileApp.setTenantId(tenantId);
 | 
			
		||||
        MobileApp.setPkgName(mobileAppName);
 | 
			
		||||
        MobileApp.setAppSecret(StringUtils.randomAlphanumeric(24));
 | 
			
		||||
        return MobileApp;
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testGetTenantAppsByPlatformTypeSaveMobileApp() throws Exception {
 | 
			
		||||
        MobileApp androidApp = doPost("/api/mobile/app", validMobileApp("android.1", PlatformType.ANDROID), MobileApp.class);
 | 
			
		||||
        MobileApp androidApp2 = doPost("/api/mobile/app", validMobileApp("android.2", PlatformType.ANDROID), MobileApp.class);
 | 
			
		||||
        MobileApp iosApp = doPost("/api/mobile/app", validMobileApp("ios.1", PlatformType.IOS), MobileApp.class);
 | 
			
		||||
 | 
			
		||||
        PageData<MobileApp> pageData = doGetTypedWithPageLink("/api/mobile/app?", PAGE_DATA_MOBILE_APP_TYPE_REF, new PageLink(10, 0));
 | 
			
		||||
        assertThat(pageData.getData()).hasSize(3);
 | 
			
		||||
        assertThat(pageData.getData()).containsExactlyInAnyOrder(androidApp, androidApp2, iosApp);
 | 
			
		||||
 | 
			
		||||
        PageData<MobileApp> androidPageData = doGetTypedWithPageLink("/api/mobile/app?platformType=ANDROID&", PAGE_DATA_MOBILE_APP_TYPE_REF, new PageLink(10, 0));
 | 
			
		||||
        assertThat(androidPageData.getData()).hasSize(2);
 | 
			
		||||
        assertThat(androidPageData.getData()).containsExactlyInAnyOrder(androidApp, androidApp2);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private MobileApp validMobileApp(String mobileAppName, PlatformType platformType) {
 | 
			
		||||
        MobileApp mobileApp = new MobileApp();
 | 
			
		||||
        mobileApp.setPkgName(mobileAppName);
 | 
			
		||||
        mobileApp.setAppSecret(StringUtils.randomAlphanumeric(24));
 | 
			
		||||
        mobileApp.setPlatformType(platformType);
 | 
			
		||||
        return mobileApp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -23,14 +23,13 @@ import org.junit.Before;
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Value;
 | 
			
		||||
import org.thingsboard.server.common.data.StringUtils;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.mobile.AndroidQrCodeConfig;
 | 
			
		||||
import org.thingsboard.server.common.data.mobile.IosQrCodeConfig;
 | 
			
		||||
import org.thingsboard.server.common.data.mobile.MobileApp;
 | 
			
		||||
import org.thingsboard.server.common.data.mobile.MobileAppBundle;
 | 
			
		||||
import org.thingsboard.server.common.data.mobile.MobileAppBundleInfo;
 | 
			
		||||
import org.thingsboard.server.common.data.mobile.QrCodeSettings;
 | 
			
		||||
import org.thingsboard.server.common.data.mobile.QRCodeConfig;
 | 
			
		||||
import org.thingsboard.server.common.data.mobile.QrCodeSettings;
 | 
			
		||||
import org.thingsboard.server.common.data.oauth2.PlatformType;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageData;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageLink;
 | 
			
		||||
@ -68,7 +67,7 @@ public class QrCodeSettingsControllerTest extends AbstractControllerTest {
 | 
			
		||||
    public void setUp() throws Exception {
 | 
			
		||||
        loginSysAdmin();
 | 
			
		||||
 | 
			
		||||
        MobileApp androidApp = validMobileApp(TenantId.SYS_TENANT_ID, "my.android.package", PlatformType.ANDROID, true);
 | 
			
		||||
        MobileApp androidApp = validMobileApp( "my.android.package", PlatformType.ANDROID);
 | 
			
		||||
        AndroidQrCodeConfig androidQrCodeConfig = AndroidQrCodeConfig.builder()
 | 
			
		||||
                .appPackage(ANDROID_PACKAGE_NAME)
 | 
			
		||||
                .sha256CertFingerprints(ANDROID_APP_SHA256)
 | 
			
		||||
@ -78,7 +77,7 @@ public class QrCodeSettingsControllerTest extends AbstractControllerTest {
 | 
			
		||||
        androidApp.setQrCodeConfig(androidQrCodeConfig);
 | 
			
		||||
        MobileApp savedAndroidApp = doPost("/api/mobile/app", androidApp, MobileApp.class);
 | 
			
		||||
 | 
			
		||||
        MobileApp iosApp = validMobileApp(TenantId.SYS_TENANT_ID, "my.ios.package", PlatformType.IOS, true);
 | 
			
		||||
        MobileApp iosApp = validMobileApp( "my.ios.package", PlatformType.IOS);
 | 
			
		||||
        IosQrCodeConfig iosQrCodeConfig = IosQrCodeConfig.builder()
 | 
			
		||||
                .appId(APPLE_APP_ID)
 | 
			
		||||
                .enabled(true)
 | 
			
		||||
@ -101,7 +100,7 @@ public class QrCodeSettingsControllerTest extends AbstractControllerTest {
 | 
			
		||||
        qrCodeSettings.setMobileAppBundleId(null);
 | 
			
		||||
        qrCodeSettings.setQrCodeConfig(qrCodeConfig);
 | 
			
		||||
 | 
			
		||||
        doPost("/api/qr/settings", qrCodeSettings)
 | 
			
		||||
        doPost("/api/mobile/qr/settings", qrCodeSettings)
 | 
			
		||||
                .andExpect(status().isOk());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -249,12 +248,12 @@ public class QrCodeSettingsControllerTest extends AbstractControllerTest {
 | 
			
		||||
        assertThat(customerCustomAppParsedDeepLink.group(1)).isEqualTo("localhost");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private MobileApp validMobileApp(TenantId tenantId, String mobileAppName, PlatformType platformType, boolean oauth2Enabled) {
 | 
			
		||||
        MobileApp MobileApp = new MobileApp();
 | 
			
		||||
        MobileApp.setTenantId(tenantId);
 | 
			
		||||
        MobileApp.setPkgName(mobileAppName);
 | 
			
		||||
        MobileApp.setPlatformType(platformType);
 | 
			
		||||
        MobileApp.setAppSecret(StringUtils.randomAlphanumeric(24));
 | 
			
		||||
        return MobileApp;
 | 
			
		||||
    private MobileApp validMobileApp(String mobileAppName, PlatformType platformType) {
 | 
			
		||||
        MobileApp mobileApp = new MobileApp();
 | 
			
		||||
        mobileApp.setTenantId(tenantId);
 | 
			
		||||
        mobileApp.setPkgName(mobileAppName);
 | 
			
		||||
        mobileApp.setPlatformType(platformType);
 | 
			
		||||
        mobileApp.setAppSecret(StringUtils.randomAlphanumeric(24));
 | 
			
		||||
        return mobileApp;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -30,7 +30,7 @@ public interface MobileAppService extends EntityDaoService {
 | 
			
		||||
 | 
			
		||||
    MobileApp findMobileAppById(TenantId tenantId, MobileAppId mobileAppId);
 | 
			
		||||
 | 
			
		||||
    PageData<MobileApp> findMobileAppsByTenantId(TenantId tenantId, PageLink pageLink);
 | 
			
		||||
    PageData<MobileApp> findMobileAppsByTenantId(TenantId tenantId, PlatformType platformType, PageLink pageLink);
 | 
			
		||||
 | 
			
		||||
    MobileApp findByBundleIdAndPlatformType(TenantId tenantId, MobileAppBundleId mobileAppBundleId, PlatformType platformType);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -20,6 +20,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
 | 
			
		||||
import jakarta.validation.Valid;
 | 
			
		||||
import jakarta.validation.constraints.NotBlank;
 | 
			
		||||
import jakarta.validation.constraints.NotEmpty;
 | 
			
		||||
import jakarta.validation.constraints.NotNull;
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
import lombok.EqualsAndHashCode;
 | 
			
		||||
import lombok.ToString;
 | 
			
		||||
@ -47,8 +48,9 @@ public class MobileApp extends BaseData<MobileAppId> implements HasTenantId, Has
 | 
			
		||||
    @Length(fieldName = "appSecret", min = 16, max = 2048, message = "must be at least 16 and max 2048 characters")
 | 
			
		||||
    private String appSecret;
 | 
			
		||||
    @Schema(description = "Application platform type: ANDROID or IOS", requiredMode = Schema.RequiredMode.REQUIRED)
 | 
			
		||||
    @NotNull
 | 
			
		||||
    private PlatformType platformType;
 | 
			
		||||
    @Schema(description = "Application status: PUBLISHED, DEPRECATED, SUSPENDED", requiredMode = Schema.RequiredMode.REQUIRED)
 | 
			
		||||
    @Schema(description = "Application status: PUBLISHED, DEPRECATED, SUSPENDED, DRAFT", requiredMode = Schema.RequiredMode.REQUIRED)
 | 
			
		||||
    private MobileAppStatus status;
 | 
			
		||||
    @Schema(description = "Application version info")
 | 
			
		||||
    @Valid
 | 
			
		||||
 | 
			
		||||
@ -36,6 +36,7 @@ import org.thingsboard.server.dao.entity.AbstractEntityService;
 | 
			
		||||
import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent;
 | 
			
		||||
import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent;
 | 
			
		||||
import org.thingsboard.server.dao.oauth2.OAuth2ClientDao;
 | 
			
		||||
import org.thingsboard.server.dao.service.DataValidator;
 | 
			
		||||
 | 
			
		||||
import java.util.Comparator;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
@ -52,10 +53,14 @@ public class MobileAppBundleServiceImpl extends AbstractEntityService implements
 | 
			
		||||
    private OAuth2ClientDao oauth2ClientDao;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private MobileAppBundleDao mobileAppBundleDao;
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private DataValidator<MobileAppBundle> mobileAppBundleDataValidator;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public MobileAppBundle saveMobileAppBundle(TenantId tenantId, MobileAppBundle mobileAppBundle) {
 | 
			
		||||
        log.trace("Executing saveMobileAppBundle [{}]", mobileAppBundle);
 | 
			
		||||
        mobileAppBundleDataValidator.validate(mobileAppBundle, b -> tenantId);
 | 
			
		||||
        try {
 | 
			
		||||
            MobileAppBundle savedMobileApp = mobileAppBundleDao.save(tenantId, mobileAppBundle);
 | 
			
		||||
            eventPublisher.publishEvent(SaveEntityEvent.builder().tenantId(tenantId).entity(savedMobileApp).build());
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ public interface MobileAppDao extends Dao<MobileApp> {
 | 
			
		||||
 | 
			
		||||
    MobileApp findByBundleIdAndPlatformType(TenantId tenantId, MobileAppBundleId mobileAppBundleId, PlatformType platformType);
 | 
			
		||||
 | 
			
		||||
    PageData<MobileApp> findByTenantId(TenantId tenantId, PageLink pageLink);
 | 
			
		||||
    PageData<MobileApp> findByTenantId(TenantId tenantId, PlatformType platformType, PageLink pageLink);
 | 
			
		||||
 | 
			
		||||
    void deleteByTenantId(TenantId tenantId);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -71,9 +71,9 @@ public class MobileAppServiceImpl extends AbstractEntityService implements Mobil
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public PageData<MobileApp> findMobileAppsByTenantId(TenantId tenantId, PageLink pageLink) {
 | 
			
		||||
    public PageData<MobileApp> findMobileAppsByTenantId(TenantId tenantId, PlatformType platformType, PageLink pageLink) {
 | 
			
		||||
        log.trace("Executing findMobileAppInfosByTenantId [{}]", tenantId);
 | 
			
		||||
        return mobileAppDao.findByTenantId(tenantId, pageLink);
 | 
			
		||||
        return mobileAppDao.findByTenantId(tenantId, platformType, pageLink);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,60 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright © 2016-2024 The Thingsboard Authors
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed 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.thingsboard.server.dao.service.validator;
 | 
			
		||||
 | 
			
		||||
import lombok.AllArgsConstructor;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import org.thingsboard.server.common.data.id.MobileAppId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.mobile.MobileApp;
 | 
			
		||||
import org.thingsboard.server.common.data.mobile.MobileAppBundle;
 | 
			
		||||
import org.thingsboard.server.common.data.oauth2.PlatformType;
 | 
			
		||||
import org.thingsboard.server.dao.exception.DataValidationException;
 | 
			
		||||
import org.thingsboard.server.dao.mobile.MobileAppDao;
 | 
			
		||||
import org.thingsboard.server.dao.service.DataValidator;
 | 
			
		||||
 | 
			
		||||
@Component
 | 
			
		||||
@AllArgsConstructor
 | 
			
		||||
public class MobileAppBundleDataValidator extends DataValidator<MobileAppBundle> {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private MobileAppDao mobileAppDao;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void validateDataImpl(TenantId tenantId, MobileAppBundle mobileAppBundle) {
 | 
			
		||||
        MobileAppId androidAppId = mobileAppBundle.getAndroidAppId();
 | 
			
		||||
        if (androidAppId != null) {
 | 
			
		||||
            MobileApp androidApp = mobileAppDao.findById(tenantId, androidAppId.getId());
 | 
			
		||||
            if (androidApp == null) {
 | 
			
		||||
                throw new DataValidationException("Mobile app bundle refers to non-existing android app!");
 | 
			
		||||
            }
 | 
			
		||||
            if (androidApp.getPlatformType() != PlatformType.ANDROID) {
 | 
			
		||||
                throw new DataValidationException("Mobile app bundle refers to wrong android app! Platform type of specified app is " + androidApp.getPlatformType());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        MobileAppId iosAppId = mobileAppBundle.getIosAppId();
 | 
			
		||||
        if (iosAppId != null) {
 | 
			
		||||
            MobileApp iosApp = mobileAppDao.findById(tenantId, iosAppId.getId());
 | 
			
		||||
            if (iosApp == null) {
 | 
			
		||||
                throw new DataValidationException("Mobile app bundle refers to non-existing ios app!");
 | 
			
		||||
            }
 | 
			
		||||
            if (iosApp.getPlatformType() != PlatformType.IOS) {
 | 
			
		||||
                throw new DataValidationException("Mobile app bundle refers to wrong ios app! Platform type of specified app is " + iosApp.getPlatformType());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -60,8 +60,8 @@ public class JpaMobileAppDao extends JpaAbstractDao<MobileAppEntity, MobileApp>
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public PageData<MobileApp> findByTenantId(TenantId tenantId, PageLink pageLink) {
 | 
			
		||||
        return DaoUtil.toPageData(mobileAppRepository.findByTenantId(tenantId.getId(), pageLink.getTextSearch(), DaoUtil.toPageable(pageLink)));
 | 
			
		||||
    public PageData<MobileApp> findByTenantId(TenantId tenantId, PlatformType platformType, PageLink pageLink) {
 | 
			
		||||
        return DaoUtil.toPageData(mobileAppRepository.findByTenantId(tenantId.getId(), platformType, pageLink.getTextSearch(), DaoUtil.toPageable(pageLink)));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 | 
			
		||||
@ -30,8 +30,10 @@ import java.util.UUID;
 | 
			
		||||
public interface MobileAppRepository extends JpaRepository<MobileAppEntity, UUID> {
 | 
			
		||||
 | 
			
		||||
    @Query("SELECT a FROM MobileAppEntity a WHERE a.tenantId = :tenantId AND " +
 | 
			
		||||
            "(:platformType is NULL OR a.platformType = :platformType) AND" +
 | 
			
		||||
            "(:searchText is NULL OR ilike(a.pkgName, concat('%', :searchText, '%')) = true)")
 | 
			
		||||
    Page<MobileAppEntity> findByTenantId(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                                         @Param("platformType") PlatformType platformType,
 | 
			
		||||
                                         @Param("searchText") String searchText,
 | 
			
		||||
                                         Pageable pageable);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -21,6 +21,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.thingsboard.server.common.data.StringUtils;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.mobile.MobileApp;
 | 
			
		||||
import org.thingsboard.server.common.data.oauth2.PlatformType;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageData;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageLink;
 | 
			
		||||
import org.thingsboard.server.dao.mobile.MobileAppService;
 | 
			
		||||
@ -48,7 +49,7 @@ public class MobileAppServiceTest extends AbstractServiceTest {
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    public void testSaveMobileApp() {
 | 
			
		||||
        MobileApp MobileApp = validMobileApp(TenantId.SYS_TENANT_ID, "mobileApp.ce", true);
 | 
			
		||||
        MobileApp MobileApp = validMobileApp("mobileApp.ce", PlatformType.IOS);
 | 
			
		||||
        MobileApp savedMobileApp = mobileAppService.saveMobileApp(SYSTEM_TENANT_ID, MobileApp);
 | 
			
		||||
 | 
			
		||||
        MobileApp retrievedMobileApp = mobileAppService.findMobileAppById(savedMobileApp.getTenantId(), savedMobileApp.getId());
 | 
			
		||||
@ -70,20 +71,19 @@ public class MobileAppServiceTest extends AbstractServiceTest {
 | 
			
		||||
    public void testGetTenantMobileApps() {
 | 
			
		||||
        List<MobileApp> mobileApps = new ArrayList<>();
 | 
			
		||||
        for (int i = 0; i < 5; i++) {
 | 
			
		||||
            MobileApp oAuth2Client = validMobileApp(TenantId.SYS_TENANT_ID, StringUtils.randomAlphabetic(5), true);
 | 
			
		||||
            MobileApp oAuth2Client = validMobileApp(StringUtils.randomAlphabetic(5), PlatformType.ANDROID);
 | 
			
		||||
            MobileApp savedOauth2Client = mobileAppService.saveMobileApp(SYSTEM_TENANT_ID, oAuth2Client);
 | 
			
		||||
            mobileApps.add(savedOauth2Client);
 | 
			
		||||
        }
 | 
			
		||||
        PageData<MobileApp> retrieved = mobileAppService.findMobileAppsByTenantId(TenantId.SYS_TENANT_ID, new PageLink(10, 0));
 | 
			
		||||
        PageData<MobileApp> retrieved = mobileAppService.findMobileAppsByTenantId(TenantId.SYS_TENANT_ID, null, new PageLink(10, 0));
 | 
			
		||||
        assertThat(retrieved.getData()).containsOnlyOnceElementsOf(mobileApps);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private MobileApp validMobileApp(TenantId tenantId, String mobileAppName, boolean oauth2Enabled) {
 | 
			
		||||
    private MobileApp validMobileApp(String mobileAppName, PlatformType platformType) {
 | 
			
		||||
        MobileApp MobileApp = new MobileApp();
 | 
			
		||||
        MobileApp.setTenantId(tenantId);
 | 
			
		||||
        MobileApp.setPkgName(mobileAppName);
 | 
			
		||||
        MobileApp.setAppSecret(StringUtils.randomAlphanumeric(24));
 | 
			
		||||
        MobileApp.setPlatformType(platformType);
 | 
			
		||||
        return MobileApp;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user