Commit 3c4ee1288d2982c2f25d215d07c5247218af636d

Authored by Vladyslav_Prykhodko
2 parents 2e5bbe20 8860eef1

Merge branch 'develop/3.3-firmware' of https://github.com/YevhenBondarenko/thing…

…sboard into YevhenBondarenko-develop/3.3-firmware
... ... @@ -37,7 +37,7 @@ CREATE TABLE IF NOT EXISTS firmware (
37 37 content_type varchar(255),
38 38 checksum_algorithm varchar(32),
39 39 checksum varchar(1020),
40   - data binary,
  40 + data bytea,
41 41 additional_info varchar,
42 42 search_text varchar(255),
43 43 CONSTRAINT firmware_tenant_title_version_unq_key UNIQUE (tenant_id, title, version)
... ...
... ... @@ -717,7 +717,7 @@ public abstract class BaseController {
717 717 validateId(firmwareId, "Incorrect firmwareId " + firmwareId);
718 718 Firmware firmware = firmwareService.findFirmwareById(getCurrentUser().getTenantId(), firmwareId);
719 719 checkNotNull(firmware);
720   - accessControlService.checkPermission(getCurrentUser(), Resource.TB_RESOURCE, operation, firmwareId, firmware);
  720 + accessControlService.checkPermission(getCurrentUser(), Resource.FIRMWARE, operation, firmwareId, firmware);
721 721 return firmware;
722 722 } catch (Exception e) {
723 723 throw handleException(e, false);
... ...
... ... @@ -98,7 +98,8 @@ public class FirmwareController extends BaseController {
98 98 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
99 99 @RequestMapping(value = "/firmware", method = RequestMethod.POST)
100 100 @ResponseBody
101   - public FirmwareInfo saveFirmwareInfo(@RequestParam("title") FirmwareInfo firmwareInfo) throws ThingsboardException {
  101 + public FirmwareInfo saveFirmwareInfo(@RequestBody FirmwareInfo firmwareInfo) throws ThingsboardException {
  102 + firmwareInfo.setTenantId(getTenantId());
102 103 checkEntity(firmwareInfo.getId(), firmwareInfo, Resource.FIRMWARE);
103 104 try {
104 105 return firmwareService.saveFirmwareInfo(firmwareInfo);
... ... @@ -112,7 +113,7 @@ public class FirmwareController extends BaseController {
112 113 @ResponseBody
113 114 public Firmware saveFirmwareData(@PathVariable(FIRMWARE_ID) String strFirmwareId,
114 115 @RequestParam String checksum,
115   - @RequestParam String checksumAlgorithm,
  116 + @RequestParam(required = false) String checksumAlgorithm,
116 117 @RequestBody MultipartFile firmwareFile) throws ThingsboardException {
117 118 checkParameter(FIRMWARE_ID, strFirmwareId);
118 119 checkParameter("checksum", checksum);
... ... @@ -123,6 +124,7 @@ public class FirmwareController extends BaseController {
123 124 Firmware firmware = new Firmware(firmwareId);
124 125 firmware.setCreatedTime(info.getCreatedTime());
125 126 firmware.setTenantId(getTenantId());
  127 + firmware.setTitle(info.getTitle());
126 128 firmware.setVersion(info.getVersion());
127 129 firmware.setAdditionalInfo(info.getAdditionalInfo());
128 130
... ... @@ -138,7 +140,7 @@ public class FirmwareController extends BaseController {
138 140 }
139 141
140 142 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
141   - @RequestMapping(value = "/firmware", method = RequestMethod.GET)
  143 + @RequestMapping(value = "/firmwares", method = RequestMethod.GET)
142 144 @ResponseBody
143 145 public PageData<FirmwareInfo> getFirmwares(@RequestParam int pageSize,
144 146 @RequestParam int page,
... ... @@ -154,6 +156,23 @@ public class FirmwareController extends BaseController {
154 156 }
155 157
156 158 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
  159 + @RequestMapping(value = "/firmwares/{hasData}", method = RequestMethod.GET)
  160 + @ResponseBody
  161 + public PageData<FirmwareInfo> getFirmwares(@PathVariable("hasData") boolean hasData,
  162 + @RequestParam int pageSize,
  163 + @RequestParam int page,
  164 + @RequestParam(required = false) String textSearch,
  165 + @RequestParam(required = false) String sortProperty,
  166 + @RequestParam(required = false) String sortOrder) throws ThingsboardException {
  167 + try {
  168 + PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder);
  169 + return checkNotNull(firmwareService.findTenantFirmwaresByTenantIdAndHasData(getTenantId(), hasData, pageLink));
  170 + } catch (Exception e) {
  171 + throw handleException(e);
  172 + }
  173 + }
  174 +
  175 + @PreAuthorize("hasAnyAuthority('TENANT_ADMIN')")
157 176 @RequestMapping(value = "/firmware/{firmwareId}", method = RequestMethod.DELETE)
158 177 @ResponseBody
159 178 public void deleteResource(@PathVariable("firmwareId") String strFirmwareId) throws ThingsboardException {
... ...
... ... @@ -34,6 +34,8 @@ public interface FirmwareService {
34 34
35 35 PageData<FirmwareInfo> findTenantFirmwaresByTenantId(TenantId tenantId, PageLink pageLink);
36 36
  37 + PageData<FirmwareInfo> findTenantFirmwaresByTenantIdAndHasData(TenantId tenantId, boolean hasData, PageLink pageLink);
  38 +
37 39 void deleteFirmware(TenantId tenantId, FirmwareId firmwareId);
38 40
39 41 void deleteFirmwaresByTenantId(TenantId tenantId);
... ...
... ... @@ -31,6 +31,7 @@ public class FirmwareInfo extends SearchTextBasedWithAdditionalInfo<FirmwareId>
31 31 private TenantId tenantId;
32 32 private String title;
33 33 private String version;
  34 + private boolean hasData;
34 35
35 36 public FirmwareInfo() {
36 37 super();
... ...
... ... @@ -70,6 +70,8 @@ public class EntityIdFactory {
70 70 return new ApiUsageStateId(uuid);
71 71 case TB_RESOURCE:
72 72 return new TbResourceId(uuid);
  73 + case FIRMWARE:
  74 + return new FirmwareId(uuid);
73 75 }
74 76 throw new IllegalArgumentException("EntityType " + type + " is not supported!");
75 77 }
... ...
... ... @@ -110,6 +110,13 @@ public class BaseFirmwareService implements FirmwareService {
110 110 }
111 111
112 112 @Override
  113 + public PageData<FirmwareInfo> findTenantFirmwaresByTenantIdAndHasData(TenantId tenantId, boolean hasData, PageLink pageLink) {
  114 + log.trace("Executing findTenantFirmwaresByTenantIdAndHasData, tenantId [{}], hasData [{}] pageLink [{}]", tenantId, hasData, pageLink);
  115 + validateId(tenantId, INCORRECT_TENANT_ID + tenantId);
  116 + validatePageLink(pageLink);
  117 + return firmwareInfoDao.findFirmwareInfoByTenantIdAndHasData(tenantId, hasData, pageLink); }
  118 +
  119 + @Override
113 120 public void deleteFirmware(TenantId tenantId, FirmwareId firmwareId) {
114 121 log.trace("Executing deleteFirmware [{}]", firmwareId);
115 122 validateId(firmwareId, INCORRECT_FIRMWARE_ID + firmwareId);
... ...
... ... @@ -27,4 +27,6 @@ public interface FirmwareInfoDao extends Dao<FirmwareInfo> {
27 27
28 28 PageData<FirmwareInfo> findFirmwareInfoByTenantId(TenantId tenantId, PageLink pageLink);
29 29
  30 + PageData<FirmwareInfo> findFirmwareInfoByTenantIdAndHasData(TenantId tenantId, boolean hasData, PageLink pageLink);
  31 +
30 32 }
... ...
... ... @@ -482,6 +482,7 @@ public class ModelConstants {
482 482 public static final String FIRMWARE_CHECKSUM_COLUMN = "checksum";
483 483 public static final String FIRMWARE_DATA_COLUMN = "data";
484 484 public static final String FIRMWARE_ADDITIONAL_INFO_COLUMN = ADDITIONAL_INFO_PROPERTY;
  485 + public static final String FIRMWARE_HAS_DATA_PROPERTY = "has_data";
485 486
486 487
487 488 /**
... ...
... ... @@ -124,6 +124,7 @@ public class FirmwareEntity extends BaseSqlEntity<Firmware> implements SearchTex
124 124 firmware.setChecksum(checksum);
125 125 if (data != null) {
126 126 firmware.setData(ByteBuffer.wrap(data));
  127 + firmware.setHasData(true);
127 128 }
128 129 firmware.setAdditionalInfo(additionalInfo);
129 130 return firmware;
... ...
... ... @@ -20,6 +20,7 @@ import lombok.Data;
20 20 import lombok.EqualsAndHashCode;
21 21 import org.hibernate.annotations.Type;
22 22 import org.hibernate.annotations.TypeDef;
  23 +import org.thingsboard.common.util.JacksonUtil;
23 24 import org.thingsboard.server.common.data.FirmwareInfo;
24 25 import org.thingsboard.server.common.data.id.FirmwareId;
25 26 import org.thingsboard.server.common.data.id.TenantId;
... ... @@ -31,8 +32,10 @@ import org.thingsboard.server.dao.util.mapping.JsonStringType;
31 32 import javax.persistence.Column;
32 33 import javax.persistence.Entity;
33 34 import javax.persistence.Table;
  35 +import javax.persistence.Transient;
34 36 import java.util.UUID;
35 37
  38 +import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_HAS_DATA_PROPERTY;
36 39 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TABLE_NAME;
37 40 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TENANT_ID_COLUMN;
38 41 import static org.thingsboard.server.dao.model.ModelConstants.FIRMWARE_TITLE_COLUMN;
... ... @@ -62,6 +65,10 @@ public class FirmwareInfoEntity extends BaseSqlEntity<FirmwareInfo> implements S
62 65 @Column(name = SEARCH_TEXT_PROPERTY)
63 66 private String searchText;
64 67
  68 +// @Column(name = FIRMWARE_HAS_DATA_PROPERTY, insertable = false, updatable = false)
  69 + @Transient
  70 + private boolean hasData;
  71 +
65 72 public FirmwareInfoEntity() {
66 73 super();
67 74 }
... ... @@ -75,6 +82,16 @@ public class FirmwareInfoEntity extends BaseSqlEntity<FirmwareInfo> implements S
75 82 this.additionalInfo = firmware.getAdditionalInfo();
76 83 }
77 84
  85 + public FirmwareInfoEntity(UUID id, long createdTime, UUID tenantId, String title, String version, Object additionalInfo, boolean hasData) {
  86 + this.id = id;
  87 + this.createdTime = createdTime;
  88 + this.tenantId = tenantId;
  89 + this.title = title;
  90 + this.version = version;
  91 + this.hasData = hasData;
  92 + this.additionalInfo = JacksonUtil.convertValue(additionalInfo, JsonNode.class);
  93 + }
  94 +
78 95 @Override
79 96 public String getSearchTextSource() {
80 97 return title;
... ... @@ -93,6 +110,7 @@ public class FirmwareInfoEntity extends BaseSqlEntity<FirmwareInfo> implements S
93 110 firmware.setTitle(title);
94 111 firmware.setVersion(version);
95 112 firmware.setAdditionalInfo(additionalInfo);
  113 + firmware.setHasData(hasData);
96 114 return firmware;
97 115 }
98 116 }
... ...
... ... @@ -25,10 +25,22 @@ import org.thingsboard.server.dao.model.sql.FirmwareInfoEntity;
25 25 import java.util.UUID;
26 26
27 27 public interface FirmwareInfoRepository extends CrudRepository<FirmwareInfoEntity, UUID> {
28   - @Query("SELECT fi FROM FirmwareInfoEntity fi WHERE " +
29   - "fi.tenantId = :tenantId " +
30   - "AND LOWER(fi.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
  28 + @Query("SELECT new FirmwareInfoEntity(f.id, f.createdTime, f.tenantId, f.title, f.version, f.additionalInfo, f.data IS NOT NULL) FROM FirmwareEntity f WHERE " +
  29 + "f.tenantId = :tenantId " +
  30 + "AND LOWER(f.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
31 31 Page<FirmwareInfoEntity> findAllByTenantId(@Param("tenantId") UUID tenantId,
32   - @Param("searchText") String searchText,
33   - Pageable pageable);
  32 + @Param("searchText") String searchText,
  33 + Pageable pageable);
  34 +
  35 + @Query("SELECT new FirmwareInfoEntity(f.id, f.createdTime, f.tenantId, f.title, f.version, f.additionalInfo, f.data IS NOT NULL) FROM FirmwareEntity f WHERE " +
  36 + "f.tenantId = :tenantId " +
  37 + "AND ((f.data IS NOT NULL AND :hasData = true) OR (f.data IS NULL AND :hasData = false ))" +
  38 + "AND LOWER(f.searchText) LIKE LOWER(CONCAT(:searchText, '%'))")
  39 + Page<FirmwareInfoEntity> findAllByTenantIdAndHasData(@Param("tenantId") UUID tenantId,
  40 + @Param("hasData") boolean hasData,
  41 + @Param("searchText") String searchText,
  42 + Pageable pageable);
  43 +
  44 + @Query("SELECT new FirmwareInfoEntity(f.id, f.createdTime, f.tenantId, f.title, f.version, f.additionalInfo, f.data IS NOT NULL) FROM FirmwareEntity f WHERE f.id = :id")
  45 + FirmwareInfoEntity findFirmwareInfoById(@Param("id") UUID id);
34 46 }
... ...
... ... @@ -49,6 +49,21 @@ public class JpaFirmwareInfoDao extends JpaAbstractSearchTextDao<FirmwareInfoEnt
49 49 }
50 50
51 51 @Override
  52 + public FirmwareInfo findById(TenantId tenantId, UUID id) {
  53 + return DaoUtil.getData(firmwareInfoRepository.findFirmwareInfoById(id));
  54 + }
  55 +
  56 + @Override
  57 + public FirmwareInfo save(TenantId tenantId, FirmwareInfo firmwareInfo) {
  58 + FirmwareInfo savedFirmware = super.save(tenantId, firmwareInfo);
  59 + if (firmwareInfo.getId() == null) {
  60 + return savedFirmware;
  61 + } else {
  62 + return findById(tenantId, savedFirmware.getId().getId());
  63 + }
  64 + }
  65 +
  66 + @Override
52 67 public PageData<FirmwareInfo> findFirmwareInfoByTenantId(TenantId tenantId, PageLink pageLink) {
53 68 return DaoUtil.toPageData(firmwareInfoRepository
54 69 .findAllByTenantId(
... ... @@ -56,4 +71,14 @@ public class JpaFirmwareInfoDao extends JpaAbstractSearchTextDao<FirmwareInfoEnt
56 71 Objects.toString(pageLink.getTextSearch(), ""),
57 72 DaoUtil.toPageable(pageLink)));
58 73 }
  74 +
  75 + @Override
  76 + public PageData<FirmwareInfo> findFirmwareInfoByTenantIdAndHasData(TenantId tenantId, boolean hasData, PageLink pageLink) {
  77 + return DaoUtil.toPageData(firmwareInfoRepository
  78 + .findAllByTenantIdAndHasData(
  79 + tenantId.getId(),
  80 + hasData,
  81 + Objects.toString(pageLink.getTextSearch(), ""),
  82 + DaoUtil.toPageable(pageLink)));
  83 + }
59 84 }
... ...
... ... @@ -127,7 +127,9 @@ public abstract class BaseFirmwareServiceTest extends AbstractServiceTest {
127 127
128 128 Firmware foundFirmware = firmwareService.findFirmwareById(tenantId, firmware.getId());
129 129 firmware.setAdditionalInfo(JacksonUtil.newObjectNode());
  130 +
130 131 Assert.assertEquals(foundFirmware.getTitle(), firmware.getTitle());
  132 + Assert.assertTrue(foundFirmware.isHasData());
131 133
132 134 firmwareService.deleteFirmware(tenantId, savedFirmwareInfo.getId());
133 135 }
... ... @@ -367,7 +369,10 @@ public abstract class BaseFirmwareServiceTest extends AbstractServiceTest {
367 369 firmware.setChecksumAlgorithm(CHECKSUM_ALGORITHM);
368 370 firmware.setChecksum(CHECKSUM);
369 371 firmware.setData(DATA);
370   - firmwares.add(new FirmwareInfo(firmwareService.saveFirmware(firmware)));
  372 +
  373 + FirmwareInfo info = new FirmwareInfo(firmwareService.saveFirmware(firmware));
  374 + info.setHasData(true);
  375 + firmwares.add(info);
371 376 }
372 377
373 378 List<FirmwareInfo> loadedFirmwares = new ArrayList<>();
... ... @@ -394,4 +399,47 @@ public abstract class BaseFirmwareServiceTest extends AbstractServiceTest {
394 399 Assert.assertTrue(pageData.getData().isEmpty());
395 400 }
396 401
  402 + @Test
  403 + public void testFindTenantFirmwaresByTenantIdAndHasData() {
  404 + List<FirmwareInfo> firmwares = new ArrayList<>();
  405 + for (int i = 0; i < 165; i++) {
  406 + Firmware firmware = new Firmware();
  407 + firmware.setTenantId(tenantId);
  408 + firmware.setTitle(TITLE);
  409 + firmware.setVersion(VERSION + i);
  410 + firmware.setFileName(FILE_NAME);
  411 + firmware.setContentType(CONTENT_TYPE);
  412 + firmware.setChecksumAlgorithm(CHECKSUM_ALGORITHM);
  413 + firmware.setChecksum(CHECKSUM);
  414 + firmware.setData(DATA);
  415 +
  416 + FirmwareInfo info = new FirmwareInfo(firmwareService.saveFirmware(firmware));
  417 + info.setHasData(true);
  418 + firmwares.add(info);
  419 + }
  420 +
  421 + List<FirmwareInfo> loadedFirmwares = new ArrayList<>();
  422 + PageLink pageLink = new PageLink(16);
  423 + PageData<FirmwareInfo> pageData;
  424 + do {
  425 + pageData = firmwareService.findTenantFirmwaresByTenantIdAndHasData(tenantId, true, pageLink);
  426 + loadedFirmwares.addAll(pageData.getData());
  427 + if (pageData.hasNext()) {
  428 + pageLink = pageLink.nextPageLink();
  429 + }
  430 + } while (pageData.hasNext());
  431 +
  432 + Collections.sort(firmwares, idComparator);
  433 + Collections.sort(loadedFirmwares, idComparator);
  434 +
  435 + Assert.assertEquals(firmwares, loadedFirmwares);
  436 +
  437 + firmwareService.deleteFirmwaresByTenantId(tenantId);
  438 +
  439 + pageLink = new PageLink(31);
  440 + pageData = firmwareService.findTenantFirmwaresByTenantId(tenantId, pageLink);
  441 + Assert.assertFalse(pageData.hasNext());
  442 + Assert.assertTrue(pageData.getData().isEmpty());
  443 + }
  444 +
397 445 }
... ...