Browse Source

Merge pull request #9867 from thingsboard/fixes/image-gallery

Image gallery improvements
pull/9881/head
Andrew Shvayka 3 years ago
committed by GitHub
parent
commit
0a0f521053
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 26
      application/src/main/java/org/thingsboard/server/controller/ImageController.java
  2. 23
      application/src/test/java/org/thingsboard/server/controller/ImageControllerTest.java
  3. 4
      dao/src/main/java/org/thingsboard/server/dao/resource/BaseImageService.java
  4. 18
      ui-ngx/src/assets/locale/locale.constant-en_US.json

26
application/src/main/java/org/thingsboard/server/controller/ImageController.java

@ -16,6 +16,8 @@
package org.thingsboard.server.controller; package org.thingsboard.server.controller;
import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiParam;
import lombok.Builder;
import lombok.Data;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -49,6 +51,7 @@ import org.thingsboard.server.common.data.id.TenantId;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.Authority;
import org.thingsboard.server.common.data.tenant.profile.DefaultTenantProfileConfiguration;
import org.thingsboard.server.common.data.util.ThrowingSupplier; import org.thingsboard.server.common.data.util.ThrowingSupplier;
import org.thingsboard.server.dao.resource.ImageCacheKey; import org.thingsboard.server.dao.resource.ImageCacheKey;
import org.thingsboard.server.dao.resource.ImageService; import org.thingsboard.server.dao.resource.ImageService;
@ -281,6 +284,19 @@ public class ImageController extends BaseController {
return (result.isSuccess() ? ResponseEntity.ok() : ResponseEntity.badRequest()).body(result); return (result.isSuccess() ? ResponseEntity.ok() : ResponseEntity.badRequest()).body(result);
} }
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN', 'CUSTOMER_USER')")
@GetMapping("/api/image/specs")
public ImageSpecs getImageUploadSpecs() throws ThingsboardException {
SecurityUser user = getCurrentUser();
if (user.isSystemAdmin()) {
return ImageSpecs.DEFAULT;
}
DefaultTenantProfileConfiguration tenantProfileConfig = tenantProfileCache.get(user.getTenantId()).getDefaultProfileConfiguration();
return ImageSpecs.builder()
.maximumSize(tenantProfileConfig.getMaxResourceSize())
.build();
}
private ResponseEntity<ByteArrayResource> downloadIfChanged(String type, String key, String etag, boolean preview) throws Exception { private ResponseEntity<ByteArrayResource> downloadIfChanged(String type, String key, String etag, boolean preview) throws Exception {
ImageCacheKey cacheKey = ImageCacheKey.forImage(getTenantId(type), key, preview); ImageCacheKey cacheKey = ImageCacheKey.forImage(getTenantId(type), key, preview);
return downloadIfChanged(cacheKey, etag, () -> checkImageInfo(type, key, Operation.READ)); return downloadIfChanged(cacheKey, etag, () -> checkImageInfo(type, key, Operation.READ));
@ -343,4 +359,14 @@ public class ImageController extends BaseController {
return tenantId; return tenantId;
} }
@Data
@Builder
public static class ImageSpecs {
private final long maximumSize;
public static final ImageSpecs DEFAULT = ImageSpecs.builder()
.maximumSize(0)
.build();
}
} }

23
application/src/test/java/org/thingsboard/server/controller/ImageControllerTest.java

@ -33,6 +33,7 @@ import org.thingsboard.server.common.data.ResourceType;
import org.thingsboard.server.common.data.TbResourceInfo; import org.thingsboard.server.common.data.TbResourceInfo;
import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageData;
import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.common.data.page.PageLink;
import org.thingsboard.server.controller.ImageController.ImageSpecs;
import org.thingsboard.server.dao.service.DaoSqlTest; import org.thingsboard.server.dao.service.DaoSqlTest;
import org.thingsboard.server.dao.sql.resource.TbResourceRepository; import org.thingsboard.server.dao.sql.resource.TbResourceRepository;
@ -240,6 +241,28 @@ public class ImageControllerTest extends AbstractControllerTest {
doGet("/api/images/public/" + publicKey).andExpect(status().isNotFound()); doGet("/api/images/public/" + publicKey).andExpect(status().isNotFound());
} }
@Test
public void testGetImageUploadSpecs() throws Exception {
ImageSpecs specs = doGet("/api/image/specs", ImageSpecs.class);
assertThat(specs.getMaximumSize()).isZero();
loginSysAdmin();
updateDefaultTenantProfileConfig(tenantProfileConfig -> {
tenantProfileConfig.setMaxResourceSize(100);
});
loginTenantAdmin();
specs = doGet("/api/image/specs", ImageSpecs.class);
assertThat(specs.getMaximumSize()).isEqualTo(100);
loginSysAdmin();
updateDefaultTenantProfileConfig(tenantProfileConfig -> {
tenantProfileConfig.setMaxResourceSize(0);
});
loginTenantAdmin();
specs = doGet("/api/image/specs", ImageSpecs.class);
assertThat(specs.getMaximumSize()).isEqualTo(0);
}
private TbResourceInfo updateImagePublicStatus(String filename, boolean isPublic) throws Exception { private TbResourceInfo updateImagePublicStatus(String filename, boolean isPublic) throws Exception {
return doPut("/api/images/tenant/" + filename + "/public/" + isPublic, "", TbResourceInfo.class); return doPut("/api/images/tenant/" + filename + "/public/" + isPublic, "", TbResourceInfo.class);
} }

4
dao/src/main/java/org/thingsboard/server/dao/resource/BaseImageService.java

@ -138,8 +138,8 @@ public class BaseImageService extends BaseResourceService implements ImageServic
@Override @Override
@SneakyThrows @SneakyThrows
public TbResourceInfo saveImage(TbResource image) { public TbResourceInfo saveImage(TbResource image) {
if (image.getId() == null && StringUtils.isEmpty(image.getResourceKey())) { if (image.getId() == null) {
image.setResourceKey(getUniqueKey(image.getTenantId(), image.getFileName())); image.setResourceKey(getUniqueKey(image.getTenantId(), StringUtils.defaultIfEmpty(image.getResourceKey(), image.getFileName())));
} }
resourceValidator.validate(image, TbResourceInfo::getTenantId); resourceValidator.validate(image, TbResourceInfo::getTenantId);

18
ui-ngx/src/assets/locale/locale.constant-en_US.json

@ -4056,15 +4056,15 @@
"maximum-rule-chains": "Rule chains maximum number", "maximum-rule-chains": "Rule chains maximum number",
"maximum-rule-chains-required": "Rule chains maximum number is required.", "maximum-rule-chains-required": "Rule chains maximum number is required.",
"maximum-rule-chains-range": "Rule chains maximum number can't be negative", "maximum-rule-chains-range": "Rule chains maximum number can't be negative",
"maximum-resources-sum-data-size": "Resource files sum size", "maximum-resources-sum-data-size": "Maximum total size of resources files (bytes)",
"maximum-resources-sum-data-size-required": "Resource files sum size is required.", "maximum-resources-sum-data-size-required": "Maximum total size of resources files is required.",
"maximum-resources-sum-data-size-range": "Resource files sum size can't be negative", "maximum-resources-sum-data-size-range": "Maximum total size of resources files can't be negative",
"maximum-resource-size": "Resource maximum size", "maximum-resource-size": "Maximum resource file size (bytes)",
"maximum-resource-size-required": "Resource maximum size is required", "maximum-resource-size-required": "Maximum resource file size is required",
"maximum-resource-size-range": "Resource maximum size can't be negative", "maximum-resource-size-range": "Maximum resource file size can't be negative",
"maximum-ota-packages-sum-data-size": "OTA package files sum size", "maximum-ota-packages-sum-data-size": "Maximum total size of OTA package files (bytes)",
"maximum-ota-package-sum-data-size-required": "OTA package files sum size is required.", "maximum-ota-package-sum-data-size-required": "Maximum total size of OTA package files is required.",
"maximum-ota-package-sum-data-size-range": "OTA package files sum size can't be negative", "maximum-ota-package-sum-data-size-range": "Maximum total size of OTA package files can't be negative",
"rest-requests-for-tenant": "REST requests for tenant", "rest-requests-for-tenant": "REST requests for tenant",
"transport-tenant-telemetry-msg-rate-limit": "Transport tenant telemetry messages", "transport-tenant-telemetry-msg-rate-limit": "Transport tenant telemetry messages",
"transport-tenant-telemetry-data-points-rate-limit": "Transport tenant telemetry data points", "transport-tenant-telemetry-data-points-rate-limit": "Transport tenant telemetry data points",

Loading…
Cancel
Save