renamed db column, added validation on mobile app creation
This commit is contained in:
parent
5790ee1642
commit
119354a441
@ -33,7 +33,7 @@ CREATE TABLE IF NOT EXISTS mobile_app_bundle (
|
||||
ALTER TABLE mobile_app ADD COLUMN IF NOT EXISTS platform_type varchar(32),
|
||||
ADD COLUMN IF NOT EXISTS status varchar(32),
|
||||
ADD COLUMN IF NOT EXISTS version_info varchar(16384),
|
||||
ADD COLUMN IF NOT EXISTS qr_code_config varchar(16384),
|
||||
ADD COLUMN IF NOT EXISTS store_info varchar(16384),
|
||||
DROP CONSTRAINT IF EXISTS mobile_app_pkg_name_key;
|
||||
|
||||
-- rename mobile_app_oauth2_client to mobile_app_bundle_oauth2_client
|
||||
@ -107,7 +107,7 @@ $$
|
||||
SELECT id into androidAppId FROM mobile_app WHERE pkg_name = qrCodeRecord.android_config::jsonb ->> 'appPackage' AND platform_type = 'ANDROID';
|
||||
IF androidAppId IS NULL THEN
|
||||
androidAppId := uuid_generate_v4();
|
||||
INSERT INTO mobile_app(id, created_time, tenant_id, pkg_name, platform_type, status, qr_code_config)
|
||||
INSERT INTO mobile_app(id, created_time, tenant_id, pkg_name, platform_type, status, store_info)
|
||||
VALUES (androidAppId, (extract(epoch from now()) * 1000), qrCodeRecord.tenant_id,
|
||||
qrCodeRecord.android_config::jsonb ->> 'appPackage', 'ANDROID', 'PUBLISHED', qrCodeRecord.android_config::jsonb - 'appPackage');
|
||||
generatedBundleId := uuid_generate_v4();
|
||||
@ -115,7 +115,7 @@ $$
|
||||
VALUES (generatedBundleId, (extract(epoch from now()) * 1000), qrCodeRecord.tenant_id, 'App bundle for qr code', androidAppId);
|
||||
UPDATE qr_code_settings SET mobile_app_bundle_id = generatedBundleId WHERE id = qrCodeRecord.id;
|
||||
ELSE
|
||||
UPDATE mobile_app SET qr_code_config = qrCodeRecord.android_config::jsonb - 'appPackage' WHERE id = androidAppId;
|
||||
UPDATE mobile_app SET store_info = qrCodeRecord.android_config::jsonb - 'appPackage' WHERE id = androidAppId;
|
||||
UPDATE qr_code_settings SET mobile_app_bundle_id = (SELECT id FROM mobile_app_bundle WHERE mobile_app_bundle.android_app_id = androidAppId) WHERE id = qrCodeRecord.id;
|
||||
END IF;
|
||||
|
||||
@ -124,7 +124,7 @@ $$
|
||||
SELECT id into iosAppId FROM mobile_app WHERE pkg_name = iosPkgName AND platform_type = 'IOS';
|
||||
IF iosAppId IS NULL THEN
|
||||
iosAppId := uuid_generate_v4();
|
||||
INSERT INTO mobile_app(id, created_time, tenant_id, pkg_name, platform_type, status, qr_code_config)
|
||||
INSERT INTO mobile_app(id, created_time, tenant_id, pkg_name, platform_type, status, store_info)
|
||||
VALUES (iosAppId, (extract(epoch from now()) * 1000), qrCodeRecord.tenant_id,
|
||||
iosPkgName, 'IOS', 'PUBLISHED', qrCodeRecord.ios_config);
|
||||
IF generatedBundleId IS NULL THEN
|
||||
@ -136,7 +136,7 @@ $$
|
||||
UPDATE mobile_app_bundle SET ios_app_id = iosAppId WHERE id = generatedBundleId;
|
||||
END IF;
|
||||
ELSE
|
||||
UPDATE mobile_app SET qr_code_config = qrCodeRecord.ios_config WHERE id = iosAppId;
|
||||
UPDATE mobile_app SET store_info = qrCodeRecord.ios_config WHERE id = iosAppId;
|
||||
UPDATE qr_code_settings SET mobile_app_bundle_id = (SELECT id FROM mobile_app_bundle WHERE mobile_app_bundle.ios_app_id = iosAppId) WHERE id = qrCodeRecord.id;
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
@ -32,6 +32,7 @@ import org.thingsboard.server.common.data.page.PageLink;
|
||||
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.service.DataValidator;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
@ -42,10 +43,13 @@ public class MobileAppServiceImpl extends AbstractEntityService implements Mobil
|
||||
|
||||
@Autowired
|
||||
private MobileAppDao mobileAppDao;
|
||||
@Autowired
|
||||
private DataValidator<MobileApp> mobileAppDataValidator;
|
||||
|
||||
@Override
|
||||
public MobileApp saveMobileApp(TenantId tenantId, MobileApp mobileApp) {
|
||||
log.trace("Executing saveMobileApp [{}]", mobileApp);
|
||||
mobileAppDataValidator.validate(mobileApp, a -> tenantId);
|
||||
try {
|
||||
MobileApp savedMobileApp = mobileAppDao.save(tenantId, mobileApp);
|
||||
eventPublisher.publishEvent(SaveEntityEvent.builder().tenantId(tenantId).entity(savedMobileApp).build());
|
||||
|
||||
@ -451,7 +451,7 @@ public class ModelConstants {
|
||||
public static final String MOBILE_APP_PLATFORM_TYPE_PROPERTY = "platform_type";
|
||||
public static final String MOBILE_APP_STATUS_PROPERTY = "status";
|
||||
public static final String MOBILE_APP_VERSION_INFO_PROPERTY = "version_info";
|
||||
public static final String MOBILE_APP_QR_CODE_CONFIG_PROPERTY = "qr_code_config";
|
||||
public static final String MOBILE_APP_STORE_INFO_PROPERTY = "store_info";
|
||||
|
||||
/**
|
||||
* Mobile application bundle constants.
|
||||
|
||||
@ -67,8 +67,8 @@ public class MobileAppEntity extends BaseSqlEntity<MobileApp> {
|
||||
private JsonNode versionInfo;
|
||||
|
||||
@Convert(converter = JsonConverter.class)
|
||||
@Column(name = ModelConstants.MOBILE_APP_QR_CODE_CONFIG_PROPERTY)
|
||||
private JsonNode qrCodeConfig;
|
||||
@Column(name = ModelConstants.MOBILE_APP_STORE_INFO_PROPERTY)
|
||||
private JsonNode storeInfo;
|
||||
|
||||
public MobileAppEntity() {
|
||||
super();
|
||||
@ -84,7 +84,7 @@ public class MobileAppEntity extends BaseSqlEntity<MobileApp> {
|
||||
this.platformType = mobile.getPlatformType();
|
||||
this.status = mobile.getStatus();
|
||||
this.versionInfo = toJson(mobile.getVersionInfo());
|
||||
this.qrCodeConfig = toJson(mobile.getStoreInfo());
|
||||
this.storeInfo = toJson(mobile.getStoreInfo());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -100,7 +100,7 @@ public class MobileAppEntity extends BaseSqlEntity<MobileApp> {
|
||||
mobile.setPlatformType(platformType);
|
||||
mobile.setStatus(status);
|
||||
mobile.setVersionInfo(fromJson(versionInfo, MobileAppVersionInfo.class));
|
||||
mobile.setStoreInfo(fromJson(qrCodeConfig, StoreInfo.class));
|
||||
mobile.setStoreInfo(fromJson(storeInfo, StoreInfo.class));
|
||||
return mobile;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,46 @@
|
||||
/**
|
||||
* 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.stereotype.Component;
|
||||
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.dao.exception.DataValidationException;
|
||||
import org.thingsboard.server.dao.service.DataValidator;
|
||||
|
||||
@Component
|
||||
@AllArgsConstructor
|
||||
public class MobileAppDataValidator extends DataValidator<MobileApp> {
|
||||
|
||||
@Override
|
||||
protected void validateDataImpl(TenantId tenantId, MobileApp mobileApp) {
|
||||
if (mobileApp.getPlatformType() == PlatformType.ANDROID) {
|
||||
if (mobileApp.getStoreInfo() != null && mobileApp.getStoreInfo().isEnabled() &&
|
||||
(mobileApp.getStoreInfo().getSha256CertFingerprints() == null || mobileApp.getStoreInfo().getStoreLink() == null)) {
|
||||
throw new DataValidationException("Sha256CertFingerprints and store link are required");
|
||||
}
|
||||
} else if (mobileApp.getPlatformType() == PlatformType.IOS) {
|
||||
if (mobileApp.getStoreInfo() != null && mobileApp.getStoreInfo().isEnabled() &&
|
||||
(mobileApp.getStoreInfo().getAppId() == null || mobileApp.getStoreInfo().getStoreLink() == null)) {
|
||||
throw new DataValidationException("AppId and store link are required");
|
||||
}
|
||||
} else {
|
||||
throw new DataValidationException("Wrong application platform type");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -16,18 +16,26 @@
|
||||
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.MobileAppBundleId;
|
||||
import org.thingsboard.server.common.data.id.TenantId;
|
||||
import org.thingsboard.server.common.data.mobile.MobileApp;
|
||||
import org.thingsboard.server.common.data.mobile.QRCodeConfig;
|
||||
import org.thingsboard.server.common.data.mobile.QrCodeSettings;
|
||||
import org.thingsboard.server.common.data.mobile.StoreInfo;
|
||||
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 QrCodeSettingsDataValidator extends DataValidator<QrCodeSettings> {
|
||||
|
||||
@Autowired
|
||||
MobileAppDao mobileAppDao;
|
||||
|
||||
@Override
|
||||
protected void validateDataImpl(TenantId tenantId, QrCodeSettings qrCodeSettings) {
|
||||
MobileAppBundleId mobileAppBundleId = qrCodeSettings.getMobileAppBundleId();
|
||||
@ -35,6 +43,19 @@ public class QrCodeSettingsDataValidator extends DataValidator<QrCodeSettings> {
|
||||
if (!qrCodeSettings.isUseDefaultApp() && (mobileAppBundleId == null)) {
|
||||
throw new DataValidationException("Mobile app bundle is required to use custom application!");
|
||||
}
|
||||
if (!qrCodeSettings.isUseDefaultApp()){
|
||||
MobileApp androidApp = mobileAppDao.findByBundleIdAndPlatformType(tenantId, mobileAppBundleId, PlatformType.ANDROID);
|
||||
StoreInfo androidStoreInfo = androidApp.getStoreInfo();
|
||||
if (androidStoreInfo == null) {
|
||||
throw new DataValidationException("Android app store info is empty! ");
|
||||
}
|
||||
|
||||
MobileApp iosApp = mobileAppDao.findByBundleIdAndPlatformType(tenantId, mobileAppBundleId, PlatformType.IOS);
|
||||
StoreInfo iosStoreInfo = iosApp.getStoreInfo();
|
||||
if (iosStoreInfo == null) {
|
||||
throw new DataValidationException("IOS app store info is empty! ");
|
||||
}
|
||||
}
|
||||
if (qrCodeConfig == null) {
|
||||
throw new DataValidationException("Qr code configuration is required!");
|
||||
}
|
||||
|
||||
@ -637,7 +637,7 @@ CREATE TABLE IF NOT EXISTS mobile_app (
|
||||
platform_type varchar(32),
|
||||
status varchar(32),
|
||||
version_info varchar(16384),
|
||||
qr_code_config varchar(16384),
|
||||
store_info varchar(16384),
|
||||
CONSTRAINT pkg_platform_unique UNIQUE (pkg_name, platform_type)
|
||||
);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user