Pull request #465: RED-4249-When I edit or create a dossier as an owner I want to select from multiple watermark configurations
Merge in RED/persistence-service from RED-4249_fix5 to master * commit '91d37f5c6043eb973584948f4e002cad6d03d6ae': RED-4249-When I edit or create a dossier as an owner I want to select from multiple watermark configurations
This commit is contained in:
commit
5936d66b46
@ -6,6 +6,8 @@ import lombok.Builder;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@Builder
|
@Builder
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@ -21,6 +23,9 @@ public class Watermark {
|
|||||||
private int opacity;
|
private int opacity;
|
||||||
private int fontSize;
|
private int fontSize;
|
||||||
private String fontType;
|
private String fontType;
|
||||||
|
private String createdBy;
|
||||||
|
private OffsetDateTime dateAdded;
|
||||||
|
private OffsetDateTime dateModified;
|
||||||
private WatermarkOrientation orientation;
|
private WatermarkOrientation orientation;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package com.iqser.red.service.persistence.service.v1.api.resources;
|
package com.iqser.red.service.persistence.service.v1.api.resources;
|
||||||
|
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
@ -11,6 +12,7 @@ import java.util.List;
|
|||||||
public interface WatermarkResource {
|
public interface WatermarkResource {
|
||||||
|
|
||||||
String WATERMARK_PATH = "/watermark";
|
String WATERMARK_PATH = "/watermark";
|
||||||
|
String CHECK_USED_REST_PATH = "/used";
|
||||||
String WATERMARK_ID_PARAMETER_NAME = "watermarkId";
|
String WATERMARK_ID_PARAMETER_NAME = "watermarkId";
|
||||||
String WATERMARK_ID_PATH_VARIABLE = "/{" + WATERMARK_ID_PARAMETER_NAME + "}";
|
String WATERMARK_ID_PATH_VARIABLE = "/{" + WATERMARK_ID_PARAMETER_NAME + "}";
|
||||||
|
|
||||||
@ -30,4 +32,8 @@ public interface WatermarkResource {
|
|||||||
@DeleteMapping(value = WATERMARK_PATH + WATERMARK_ID_PATH_VARIABLE)
|
@DeleteMapping(value = WATERMARK_PATH + WATERMARK_ID_PATH_VARIABLE)
|
||||||
void deleteWatermark(@PathVariable(WATERMARK_ID_PARAMETER_NAME) long watermarkId);
|
void deleteWatermark(@PathVariable(WATERMARK_ID_PARAMETER_NAME) long watermarkId);
|
||||||
|
|
||||||
|
@ResponseStatus(value = HttpStatus.OK)
|
||||||
|
@GetMapping(value = WATERMARK_PATH + CHECK_USED_REST_PATH , produces = MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
JSONPrimitive<Boolean> isWatermarkUsed(@RequestParam(WATERMARK_ID_PARAMETER_NAME) long watermarkId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import org.hibernate.annotations.Fetch;
|
|||||||
import org.hibernate.annotations.FetchMode;
|
import org.hibernate.annotations.FetchMode;
|
||||||
|
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@Builder
|
@Builder
|
||||||
@ -40,7 +41,12 @@ public class WatermarkEntity {
|
|||||||
private int fontSize;
|
private int fontSize;
|
||||||
@Column
|
@Column
|
||||||
private String fontType;
|
private String fontType;
|
||||||
|
@Column
|
||||||
|
private String createdBy;
|
||||||
|
@Column
|
||||||
|
private OffsetDateTime dateAdded;
|
||||||
|
@Column
|
||||||
|
private OffsetDateTime dateModified;
|
||||||
@Column
|
@Column
|
||||||
@Enumerated(EnumType.STRING)
|
@Enumerated(EnumType.STRING)
|
||||||
private WatermarkOrientation orientation;
|
private WatermarkOrientation orientation;
|
||||||
|
|||||||
@ -15,6 +15,8 @@ import org.springframework.beans.BeanUtils;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.transaction.Transactional;
|
import javax.transaction.Transactional;
|
||||||
|
import java.time.OffsetDateTime;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@ -56,7 +58,8 @@ public class WatermarkService {
|
|||||||
if (loadedWatermark.isPresent()) {
|
if (loadedWatermark.isPresent()) {
|
||||||
validateDossierTemplateId(watermark.getDossierTemplateId(), loadedWatermark.get().getDossierTemplateId());
|
validateDossierTemplateId(watermark.getDossierTemplateId(), loadedWatermark.get().getDossierTemplateId());
|
||||||
validateWatermarkNameIsUnique(watermark.getName(), loadedWatermark.get().getDossierTemplateId(), loadedWatermark.get().getId());
|
validateWatermarkNameIsUnique(watermark.getName(), loadedWatermark.get().getDossierTemplateId(), loadedWatermark.get().getId());
|
||||||
BeanUtils.copyProperties(watermark, loadedWatermark.get(), "dossierTemplateId");
|
BeanUtils.copyProperties(watermark, loadedWatermark.get(), "dossierTemplateId", "createdBy", "dateAdded", "dateModified");
|
||||||
|
loadedWatermark.get().setDateModified(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
|
||||||
var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(loadedWatermark.get().getDossierTemplateId());
|
var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(loadedWatermark.get().getDossierTemplateId());
|
||||||
loadedWatermark.get().setDossierTemplate(dossierTemplate);
|
loadedWatermark.get().setDossierTemplate(dossierTemplate);
|
||||||
return loadedWatermark.get();
|
return loadedWatermark.get();
|
||||||
@ -64,7 +67,8 @@ public class WatermarkService {
|
|||||||
validateDossierTemplateId(watermark.getDossierTemplateId(), null);
|
validateDossierTemplateId(watermark.getDossierTemplateId(), null);
|
||||||
validateWatermarkNameIsUnique(watermark.getName(), watermark.getDossierTemplateId(), 0);
|
validateWatermarkNameIsUnique(watermark.getName(), watermark.getDossierTemplateId(), 0);
|
||||||
WatermarkEntity watermarkEntity = new WatermarkEntity();
|
WatermarkEntity watermarkEntity = new WatermarkEntity();
|
||||||
BeanUtils.copyProperties(watermark, watermarkEntity, "id");
|
BeanUtils.copyProperties(watermark, watermarkEntity, "id", "dateAdded", "dateModified");
|
||||||
|
watermarkEntity.setDateAdded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
|
||||||
var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(watermark.getDossierTemplateId());
|
var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(watermark.getDossierTemplateId());
|
||||||
watermarkEntity.setDossierTemplate(dossierTemplate);
|
watermarkEntity.setDossierTemplate(dossierTemplate);
|
||||||
return watermarkRepository.save(watermarkEntity);
|
return watermarkRepository.save(watermarkEntity);
|
||||||
@ -73,7 +77,8 @@ public class WatermarkService {
|
|||||||
validateDossierTemplateId(watermark.getDossierTemplateId(), null);
|
validateDossierTemplateId(watermark.getDossierTemplateId(), null);
|
||||||
validateWatermarkNameIsUnique(watermark.getName(), watermark.getDossierTemplateId(), 0);
|
validateWatermarkNameIsUnique(watermark.getName(), watermark.getDossierTemplateId(), 0);
|
||||||
WatermarkEntity watermarkEntity = new WatermarkEntity();
|
WatermarkEntity watermarkEntity = new WatermarkEntity();
|
||||||
BeanUtils.copyProperties(watermark, watermarkEntity, "id");
|
BeanUtils.copyProperties(watermark, watermarkEntity, "id", "dateAdded", "dateModified");
|
||||||
|
watermarkEntity.setDateAdded(OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS));
|
||||||
var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(watermark.getDossierTemplateId());
|
var dossierTemplate = dossierTemplatePersistenceService.getDossierTemplate(watermark.getDossierTemplateId());
|
||||||
watermarkEntity.setDossierTemplate(dossierTemplate);
|
watermarkEntity.setDossierTemplate(dossierTemplate);
|
||||||
return watermarkRepository.save(watermarkEntity);
|
return watermarkRepository.save(watermarkEntity);
|
||||||
@ -112,4 +117,10 @@ public class WatermarkService {
|
|||||||
return watermarkRepository.findByDossierTemplateId(dossierTemplateId);
|
return watermarkRepository.findByDossierTemplateId(dossierTemplateId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isWatermarkUsed(long watermarkId) {
|
||||||
|
watermarkRepository.findById(watermarkId); //check if watermark exists
|
||||||
|
int count = dossierRepository.countDossiersWithWatermarkInUse(watermarkId);
|
||||||
|
return count != 0;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -66,4 +66,7 @@ public interface DossierRepository extends JpaRepository<DossierEntity, String>
|
|||||||
@Modifying
|
@Modifying
|
||||||
@Query("update DossierEntity d set d.previewWatermarkId = null where d.previewWatermarkId = :previewWatermarkId")
|
@Query("update DossierEntity d set d.previewWatermarkId = null where d.previewWatermarkId = :previewWatermarkId")
|
||||||
int countDeletePreviewWatermark(long previewWatermarkId);
|
int countDeletePreviewWatermark(long previewWatermarkId);
|
||||||
|
|
||||||
|
@Query("select count(d) from DossierEntity d where d.watermarkId = :watermarkId or d.previewWatermarkId = :watermarkId")
|
||||||
|
int countDossiersWithWatermarkInUse(long watermarkId);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,13 +1,12 @@
|
|||||||
package com.iqser.red.service.peristence.v1.server.controller;
|
package com.iqser.red.service.peristence.v1.server.controller;
|
||||||
|
|
||||||
import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService;
|
import com.iqser.red.service.persistence.management.v1.processor.service.WatermarkService;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark;
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.configuration.Watermark;
|
||||||
import com.iqser.red.service.persistence.service.v1.api.resources.WatermarkResource;
|
import com.iqser.red.service.persistence.service.v1.api.resources.WatermarkResource;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -38,4 +37,8 @@ public class WatermarkController implements WatermarkResource {
|
|||||||
watermarkService.deleteWatermark(watermarkId);
|
watermarkService.deleteWatermark(watermarkId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public JSONPrimitive<Boolean> isWatermarkUsed(@RequestParam(WATERMARK_ID_PARAMETER_NAME) long watermarkId) {
|
||||||
|
return JSONPrimitive.of(watermarkService.isWatermarkUsed(watermarkId));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
-- add the generated id to watermark_configuration table
|
-- add the generated id to watermark_configuration table
|
||||||
alter table watermark_configuration add column id BIGINT GENERATED ALWAYS AS IDENTITY;
|
alter table watermark_configuration add column id BIGINT GENERATED ALWAYS AS IDENTITY;
|
||||||
alter table watermark_configuration add column name VARCHAR (255), add column enabled BOOLEAN DEFAULT TRUE;
|
alter table watermark_configuration add column name VARCHAR (255), add column enabled BOOLEAN DEFAULT TRUE, add column created_by VARCHAR (255), add column date_added TIMESTAMP WITHOUT TIME ZONE, add column date_modified TIMESTAMP WITHOUT TIME ZONE;
|
||||||
--initialise the new columns for the current watermark configurations
|
--initialise the new columns for the current watermark configurations
|
||||||
update watermark_configuration set name = 'Watermark ' || id, enabled = true;
|
update watermark_configuration set name = 'Watermark ' || id, enabled = true;
|
||||||
|
|
||||||
|
|||||||
@ -66,6 +66,10 @@ public class DossierTest extends AbstractPersistenceServerServiceTest {
|
|||||||
|
|
||||||
var watermarkConfig = watermarkClient.createOrUpdateWatermark(watermark);
|
var watermarkConfig = watermarkClient.createOrUpdateWatermark(watermark);
|
||||||
|
|
||||||
|
watermark.setEnabled(false);
|
||||||
|
watermark.setName("watermark disabled");
|
||||||
|
var watermarkConfigDisabled = watermarkClient.createOrUpdateWatermark(watermark);
|
||||||
|
|
||||||
var allDossiers = dossierClient.getAllDossiers(false, false);
|
var allDossiers = dossierClient.getAllDossiers(false, false);
|
||||||
assertThat(allDossiers.size()).isEqualTo(1);
|
assertThat(allDossiers.size()).isEqualTo(1);
|
||||||
assertThat(allDossiers.get(0)).isEqualTo(dossier);
|
assertThat(allDossiers.get(0)).isEqualTo(dossier);
|
||||||
@ -79,7 +83,7 @@ public class DossierTest extends AbstractPersistenceServerServiceTest {
|
|||||||
cru.setWatermarkId(watermarkConfig.getId());
|
cru.setWatermarkId(watermarkConfig.getId());
|
||||||
BeanUtils.copyProperties(dossier, cru);
|
BeanUtils.copyProperties(dossier, cru);
|
||||||
cru.setDossierName("Dossier 1 Update");
|
cru.setDossierName("Dossier 1 Update");
|
||||||
cru.setPreviewWatermarkId(watermarkConfig.getId());
|
cru.setPreviewWatermarkId(watermarkConfigDisabled.getId());
|
||||||
// Create dossier status
|
// Create dossier status
|
||||||
CreateOrUpdateDossierStatusRequest crudsr = new CreateOrUpdateDossierStatusRequest();
|
CreateOrUpdateDossierStatusRequest crudsr = new CreateOrUpdateDossierStatusRequest();
|
||||||
crudsr.setName("name1");
|
crudsr.setName("name1");
|
||||||
@ -91,11 +95,20 @@ public class DossierTest extends AbstractPersistenceServerServiceTest {
|
|||||||
|
|
||||||
cru.setDossierStatusId(loadedDossierStatus.getId());
|
cru.setDossierStatusId(loadedDossierStatus.getId());
|
||||||
|
|
||||||
|
try {
|
||||||
|
dossierClient.updateDossier(cru, dossier.getId());
|
||||||
|
} catch (FeignException e) {
|
||||||
|
assertThat(e.status()).isEqualTo(400);
|
||||||
|
}
|
||||||
|
|
||||||
|
cru.setPreviewWatermarkId(watermarkConfig.getId());
|
||||||
var updated = dossierClient.updateDossier(cru, dossier.getId());
|
var updated = dossierClient.updateDossier(cru, dossier.getId());
|
||||||
assertThat(updated.getDossierName()).isEqualTo("Dossier 1 Update");
|
assertThat(updated.getDossierName()).isEqualTo("Dossier 1 Update");
|
||||||
assertThat(updated.getPreviewWatermarkId()).isEqualTo(watermarkConfig.getId());
|
assertThat(updated.getPreviewWatermarkId()).isEqualTo(watermarkConfig.getId());
|
||||||
assertThat(updated.getDossierStatusId()).isEqualTo(loadedDossierStatus.getId());
|
assertThat(updated.getDossierStatusId()).isEqualTo(loadedDossierStatus.getId());
|
||||||
|
|
||||||
|
assertThat(watermarkClient.isWatermarkUsed(watermarkConfig.getId())).isEqualTo(JSONPrimitive.of(true));
|
||||||
|
|
||||||
// put dossier status to null
|
// put dossier status to null
|
||||||
cru.setDossierStatusId(null);
|
cru.setDossierStatusId(null);
|
||||||
updated = dossierClient.updateDossier(cru, dossier.getId());
|
updated = dossierClient.updateDossier(cru, dossier.getId());
|
||||||
|
|||||||
@ -3,7 +3,12 @@ package com.iqser.red.service.peristence.v1.server.integration.tests;
|
|||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.junit.Assert.assertThrows;
|
import static org.junit.Assert.assertThrows;
|
||||||
|
|
||||||
|
import com.iqser.red.service.peristence.v1.server.integration.client.DossierClient;
|
||||||
|
import com.iqser.red.service.peristence.v1.server.integration.service.DossierTesterAndProvider;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.model.common.JSONPrimitive;
|
||||||
|
import com.iqser.red.service.persistence.service.v1.api.model.dossiertemplate.dossier.CreateOrUpdateDossierRequest;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.springframework.beans.BeanUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
||||||
import com.iqser.red.service.peristence.v1.server.integration.client.WatermarkClient;
|
import com.iqser.red.service.peristence.v1.server.integration.client.WatermarkClient;
|
||||||
@ -19,9 +24,15 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private DossierTemplateTesterAndProvider dossierTemplateTesterAndProvider;
|
private DossierTemplateTesterAndProvider dossierTemplateTesterAndProvider;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DossierTesterAndProvider dossierTesterAndProvider;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private WatermarkClient watermarkClient;
|
private WatermarkClient watermarkClient;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private DossierClient dossierClient;
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testWatermark() {
|
public void testWatermark() {
|
||||||
@ -42,10 +53,12 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest {
|
|||||||
watermark.setOpacity(20);
|
watermark.setOpacity(20);
|
||||||
watermark.setOrientation(WatermarkOrientation.DIAGONAL);
|
watermark.setOrientation(WatermarkOrientation.DIAGONAL);
|
||||||
watermark.setDossierTemplateId(dossierTemplate.getId());
|
watermark.setDossierTemplateId(dossierTemplate.getId());
|
||||||
|
watermark.setCreatedBy("user");
|
||||||
|
|
||||||
var saved = watermarkClient.createOrUpdateWatermark(watermark);
|
var saved = watermarkClient.createOrUpdateWatermark(watermark);
|
||||||
var loadedWatermark = watermarkClient.getWatermark(saved.getId());
|
var loadedWatermark = watermarkClient.getWatermark(saved.getId());
|
||||||
assertThat(loadedWatermark).isEqualTo(saved);
|
assertThat(loadedWatermark).isEqualTo(saved);
|
||||||
|
assertThat(saved.getDateAdded()).isNotNull();
|
||||||
// try to save the same watermark without id
|
// try to save the same watermark without id
|
||||||
try {
|
try {
|
||||||
watermarkClient.createOrUpdateWatermark(watermark);
|
watermarkClient.createOrUpdateWatermark(watermark);
|
||||||
@ -62,9 +75,27 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest {
|
|||||||
|
|
||||||
// update current watermark
|
// update current watermark
|
||||||
saved.setFontSize(14);
|
saved.setFontSize(14);
|
||||||
|
saved.setEnabled(true);
|
||||||
saved.setDossierTemplateId(null);
|
saved.setDossierTemplateId(null);
|
||||||
var updated = watermarkClient.createOrUpdateWatermark(saved);
|
var updated = watermarkClient.createOrUpdateWatermark(saved);
|
||||||
assertThat(updated.getDossierTemplateId()).isEqualTo(dossierTemplate.getId());
|
assertThat(updated.getDossierTemplateId()).isEqualTo(dossierTemplate.getId());
|
||||||
|
assertThat(updated.getDateModified()).isNotNull();
|
||||||
|
assertThat(updated.isEnabled()).isTrue();
|
||||||
|
|
||||||
|
assertThat(watermarkClient.isWatermarkUsed(updated.getId())).isEqualTo(JSONPrimitive.of(false));
|
||||||
|
|
||||||
|
var dossier = dossierTesterAndProvider.provideTestDossier(dossierTemplate);
|
||||||
|
|
||||||
|
// update dossier with watermark config
|
||||||
|
CreateOrUpdateDossierRequest cru = new CreateOrUpdateDossierRequest();
|
||||||
|
|
||||||
|
BeanUtils.copyProperties(dossier, cru);
|
||||||
|
cru.setWatermarkId(updated.getId());
|
||||||
|
|
||||||
|
var updatedDossier = dossierClient.updateDossier(cru, dossier.getId());
|
||||||
|
assertThat(updatedDossier.getWatermarkId()).isEqualTo(updated.getId());
|
||||||
|
|
||||||
|
assertThat(watermarkClient.isWatermarkUsed(updated.getId())).isEqualTo(JSONPrimitive.of(true));
|
||||||
|
|
||||||
// update current watermark with new dossier template id
|
// update current watermark with new dossier template id
|
||||||
updated.setDossierTemplateId("dossierTemplate2");
|
updated.setDossierTemplateId("dossierTemplate2");
|
||||||
@ -90,6 +121,7 @@ public class WatermarkTest extends AbstractPersistenceServerServiceTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user