Commit 3c4ee1288d2982c2f25d215d07c5247218af636d
Merge branch 'develop/3.3-firmware' of https://github.com/YevhenBondarenko/thing…
…sboard into YevhenBondarenko-develop/3.3-firmware
Showing
14 changed files
with
149 additions
and
11 deletions
... | ... | @@ -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); | ... | ... |
... | ... | @@ -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 | } | ... | ... |