Commit 1a3f8353 authored by 0Tyler's avatar 0Tyler

gateway:DeviceService:addfilter & gateway:PrivacyService:addfilter

parent 0ce4516b
This diff is collapsed.
......@@ -108,7 +108,7 @@ public class DefaultData implements ApplicationRunner {
.build();
Document document = documentService.add(new MockMultipartFile("file", "test.txt",
"text/plain", "testFileStirng".getBytes()))
"text/plain", "This is fake IOT Device testing file.".getBytes()))
.orElse(Document.builder().build());
PrivacyPolicyReport oxygenPrivacyPolicyReport = PrivacyPolicyReport.builder()
......@@ -240,7 +240,7 @@ public class DefaultData implements ApplicationRunner {
.build();
document = documentService.add(new MockMultipartFile("file", "test.txt",
"text/plain", "testFileStirng".getBytes()))
"text/plain", "This is fake IOT Device testing file.".getBytes()))
.orElse(Document.builder().build());
PrivacyPolicyReport sensorPrivacyPolicyReport = PrivacyPolicyReport.builder()
......
......@@ -5,6 +5,7 @@ import edu.prlab.tyler.iotgateway.cloud.pojo.privacy.PrivacyPolicyReport;
import edu.prlab.tyler.iotgateway.cloud.services.DeviceService;
import edu.prlab.tyler.iotgateway.cloud.services.PrivacyPolicyReportService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.CacheControl;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
......@@ -22,13 +23,15 @@ public class DeviceController {
this.privacyPolicyReportService = privacyPolicyReportService;
}
//新增裝置
@PostMapping("/device")
public ResponseEntity<Device> addDevice(@RequestBody Device device) {
return deviceService.add(device)
.map(ResponseEntity::ok)
.orElseGet(()->ResponseEntity.noContent().build());
.orElseGet(()->ResponseEntity.noContent().cacheControl(CacheControl.noCache()).build());
}
//讀取裝置
@GetMapping("/device/{udn}")
public ResponseEntity<Device> readDevice(@PathVariable(value = "udn",required = false) String udn) {
return deviceService.readByUDN(udn)
......@@ -36,6 +39,7 @@ public class DeviceController {
.orElseGet(()->ResponseEntity.noContent().build());
}
//讀取所有裝置
@GetMapping("/device")
public ResponseEntity<Iterable<Device>> readDevices() {
return Optional.of(deviceService.readll())
......@@ -43,6 +47,7 @@ public class DeviceController {
.orElseGet(()->ResponseEntity.noContent().build());
}
//新增PrivacyPolicyReport
@PostMapping("/privacy")
public ResponseEntity<PrivacyPolicyReport> addPrivacyPolicyReport(@RequestBody PrivacyPolicyReport privacyPolicy) {
return privacyPolicyReportService.add(privacyPolicy)
......@@ -50,6 +55,7 @@ public class DeviceController {
.orElseGet(()->ResponseEntity.noContent().build());
}
//透過UDN讀取PrivacyPolicyReport
@GetMapping("/privacy/{UDN}")
public ResponseEntity<PrivacyPolicyReport> readPrivacyPolicyReportByDevice(@PathVariable(value = "UDN") String UDN) {
return privacyPolicyReportService.readByDevice(UDN)
......
......@@ -25,6 +25,7 @@ public class DocumentController {
this.privacyPolicyReportService = privacyPolicyReportService;
}
//上傳檔案
@PostMapping
public ResponseEntity<Document> uploadFile(@RequestPart MultipartFile file) throws IOException {
return documentService.add(file)
......@@ -32,11 +33,12 @@ public class DocumentController {
.orElseGet(() -> ResponseEntity.noContent().build());
}
//透過裝置ID取得檔案
@GetMapping("/{udn}")
public ResponseEntity<ByteArrayResource> findFile(@PathVariable String udn) {
return privacyPolicyReportService.readByDevice(udn)
.map(privacyReport->privacyReport.getDocument().getId())
.flatMap(id->documentService.readFile(id))
.map(privacyReport -> privacyReport.getDocument().getId())
.flatMap(id -> documentService.readFile(id))
.map(document -> ResponseEntity.ok()
.contentType(MediaType.parseMediaType(document.getFileType()))
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename* = UTF-8''" + CodeTools.encode(document.getFileName()))
......
......@@ -17,6 +17,7 @@ public class GatewayController {
this.service = service;
}
//表達隱私偏好
@PostMapping("/choice")
public ResponseEntity<PrivacyChoice> setPrivacyChoice(@RequestBody PrivacyChoice privacyChoice) {
return service.add(privacyChoice)
......@@ -24,6 +25,7 @@ public class GatewayController {
.orElseGet(() -> ResponseEntity.noContent().build());
}
//取得所有隱私偏好紀錄
@GetMapping("/choice")
public ResponseEntity<Iterable<PrivacyChoice>> readPrivacyChoice() {
return Optional.of(service.readll())
......@@ -31,10 +33,12 @@ public class GatewayController {
.orElseGet(() -> ResponseEntity.noContent().build());
}
//透過裝置取得所有隱私偏好
@GetMapping("/choice/{udn}")
public ResponseEntity<Iterable<PrivacyChoice>> readPrivacyChoiceByDevice(@PathVariable String udn) {
return Optional.ofNullable(service.readPrivacyChoiceByDevice(udn))
.map(ResponseEntity::ok)
.orElseGet(() -> ResponseEntity.noContent().build());
}
}
\ No newline at end of file
......@@ -2,6 +2,7 @@ package edu.prlab.tyler.iotgateway.cloud.util;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.function.Function;
public class CodeTools {
private CodeTools() {
......@@ -15,5 +16,5 @@ public class CodeTools {
return "Error: " + e.getMessage();
}
}
}
......@@ -7,7 +7,6 @@ import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.protocol.core.methods.response.Web3ClientVersion;
import org.web3j.protocol.http.HttpService;
import org.web3j.quorum.Quorum;
import org.web3j.tx.ClientTransactionManager;
......@@ -29,8 +28,8 @@ public class ContractTester {
DefaultGasProvider.GAS_LIMIT
);
private String deviceContractAddress;
private String gateWayContractAddress;
private static String deviceContractAddress;
private static String gatewayContractAddress;
@BeforeClass
public static void setUp() {
......@@ -41,32 +40,34 @@ public class ContractTester {
// Credentials credentials = Credentials.create(privateKey);
Quorum quorum = Quorum.build(new HttpService(rpcUrl));
Web3ClientVersion web3ClientVersion = quorum.web3ClientVersion().sendAsync().get();
String clientVersion = web3ClientVersion.getWeb3ClientVersion();
Assert.assertNotNull(clientVersion);
String userAddress = quorum.ethAccounts().send().getAccounts().get(quorum.ethAccounts().send().getAccounts().size() - 1);
Assert.assertNotNull(userAddress);
ClientTransactionManager manager = new ClientTransactionManager(quorum, userAddress);
//Device
//部屬裝置合約
DeviceContract deviceContract = DeviceContract.deploy(quorum, manager, DEFAULT_GAS_PROVIDER).send();
deviceContractAddress = deviceContract.getContractAddress();
Assert.assertNotNull(deviceContract);
Assert.assertNotNull(deviceContractAddress);
System.out.println("device 合約位置:" + deviceContractAddress);
//設定裝置資訊
TransactionReceipt receipt;
receipt = deviceContract.setdeviceinfo("testdevice").send();
Assert.assertNotNull(receipt);
//設定隱私政策
receipt = deviceContract.setpp("testpp").send();
Assert.assertNotNull(receipt);
//取得裝置資訊
String deviceInfo = deviceContract.deviceInfo().send();
Assert.assertNotNull(deviceInfo);
System.out.println(deviceInfo);
//取得隱私政策
String privacyPolicy = deviceContract.privacypolicy().send();
Assert.assertNotNull(privacyPolicy);
System.out.println(privacyPolicy);
......@@ -97,4 +98,31 @@ public class ContractTester {
// System.out.println("binded : " + bindedString);
}
@Test
public void test2Contract() throws Exception {
Quorum quorum = Quorum.build(new HttpService(rpcUrl));
String userAddress = quorum.ethAccounts().send().getAccounts().get(quorum.ethAccounts().send().getAccounts().size() - 1);
Assert.assertNotNull(userAddress);
ClientTransactionManager manager = new ClientTransactionManager(quorum, userAddress);
GatewayContract gatewayContract = GatewayContract.deploy(quorum, manager, DEFAULT_GAS_PROVIDER).send();
gatewayContractAddress = gatewayContract.getContractAddress();
Assert.assertNotNull(gatewayContract);
Assert.assertNotNull(gatewayContractAddress);
System.out.println("gateway 合約位置:" + gatewayContractAddress);
//根據合約地址取得合約實體
DeviceContract deviceContract = DeviceContract.load(deviceContractAddress, quorum, manager, DEFAULT_GAS_PROVIDER);
//設定Buyer
TransactionReceipt receipt = deviceContract.setBuyer(gatewayContract.getContractAddress()).send();
Assert.assertNotNull(receipt);
System.out.println(receipt);
receipt = gatewayContract.bindRequest(deviceContractAddress).send();
Assert.assertNotNull(receipt);
System.out.println(receipt);
}
}
......@@ -60,12 +60,11 @@ public class GatewayController {
.orElseGet(() -> ResponseEntity.noContent().build());
}
// TODO
//根據使用者取得在此gateway上該使用者的隱私選擇列表(根據時間排序),
//暫時從DB撈,無特定使用者
@GetMapping("/choice")
public ResponseEntity<Iterable<PrivacyChoiceResponse>> readPrivacyChoiceRecordsByUser() {
return privacyService.getPrivacyPolicyChoices()
// TODO 針對使用者取得隱私選擇列表
//根據使用者取得在此gateway上該使用者的隱私選擇列表
@GetMapping("/choice/{account}")
public ResponseEntity<Iterable<PrivacyChoiceResponse>> readPrivacyChoiceRecordsByUser(@PathVariable String account) {
return privacyService.getPrivacyPolicyChoicesByAccount(account)
.map(ResponseEntity::ok)
.orElseGet(() -> ResponseEntity.noContent().build());
}
......
......@@ -6,4 +6,5 @@ import org.springframework.stereotype.Repository;
@Repository
public interface DeviceIndexRepository extends CrudRepository<DeviceIndex, String> {
boolean findByUdnContains(String udn);
}
package edu.prlab.tyler.iotgateway.gateway.services;
import edu.prlab.tyler.iotgateway.cloud.pojo.device.Device;
import edu.prlab.tyler.iotgateway.gateway.pojo.DeviceIndex;
import edu.prlab.tyler.iotgateway.gateway.repositories.DeviceIndexRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
@Service
public class DeviceService {
......@@ -21,11 +24,16 @@ public class DeviceService {
//TODO bind and read from blockchain
public Optional<Device> bindDeviceAndGateway(String udn) {
return remoteService.readDevice(udn);
return Optional.of(deviceIndexRepository.save(DeviceIndex.builder()
.udn(udn).build()))
.flatMap(deviceIndex -> remoteService.readDevice(udn));
}
public Optional<Iterable<Device>> readDevices() {
return remoteService.readDevices();
return remoteService.readDevices()
.map(devices -> StreamSupport.stream(devices.spliterator(), false)
.filter(device -> deviceIndexRepository.existsById(device.getUdn()))
.collect(Collectors.toList()));
}
}
\ No newline at end of file
......@@ -5,6 +5,7 @@ import edu.prlab.tyler.iotgateway.cloud.pojo.privacy.PrivacyPolicyReport;
import edu.prlab.tyler.iotgateway.gateway.model.PrivacyChoiceResponse;
import edu.prlab.tyler.iotgateway.gateway.pojo.PrivacyChoiceIndex;
import edu.prlab.tyler.iotgateway.gateway.repositories.PrivacyChoiceIndexRepository;
import edu.prlab.tyler.iotgateway.gateway.repositories.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -16,11 +17,14 @@ import java.util.stream.StreamSupport;
@Service
public class PrivacyService {
private PrivacyChoiceIndexRepository privacyChoiceIndexRepository;
private UserRepository userRepository;
private RemoteService remoteService;
@Autowired
public PrivacyService(PrivacyChoiceIndexRepository privacyChoiceIndexRepository, RemoteService remoteService) {
public PrivacyService(PrivacyChoiceIndexRepository privacyChoiceIndexRepository, RemoteService remoteService,
UserRepository userRepository) {
this.privacyChoiceIndexRepository = privacyChoiceIndexRepository;
this.userRepository = userRepository;
this.remoteService = remoteService;
}
......@@ -48,9 +52,10 @@ public class PrivacyService {
// new ParameterizedTypeReference<Iterable<PrivacyChoice>>() { }).getBody());
// }
public Optional<Iterable<PrivacyChoiceResponse>> getPrivacyPolicyChoices() {
public Optional<Iterable<PrivacyChoiceResponse>> getPrivacyPolicyChoicesByAccount(String account) {
return remoteService.readPrivacyChoices()
.map(choices -> StreamSupport.stream(choices.spliterator(), false)
.filter(privacyChoice -> privacyChoice.getPrivacyContent().getUser().getAccount().equals(account))
.map(choice -> privacyChoiceIndexRepository.findById(choice.getId())
.map(choiceIndex -> PrivacyChoiceResponse.builder()
.id(choiceIndex.getId())
......
......@@ -57,18 +57,6 @@ public class GatewayHttpApiTest {
.andReturn();
Assert.assertNotNull(result);
//取得裝置清單
result = mvc.perform(MockMvcRequestBuilders
.get("/device")
.accept(MediaType.APPLICATION_JSON_UTF8))
.andDo(print())
.andExpect(status().isOk())
.andReturn();
Iterable<Device> devices = mapper.readValue(result.getResponse().getContentAsString(),
new TypeReference<Iterable<Device>>() {
});
Assert.assertNotNull(devices);
//綁定裝置
result = mvc.perform(MockMvcRequestBuilders
.post("/device/" + "a1252c49-4188-4e6d-a32e-66604c664fb8")
......@@ -81,6 +69,18 @@ public class GatewayHttpApiTest {
Device device= mapper.readValue(result.getResponse().getContentAsString(), Device.class);
Assert.assertNotNull(device);
//取得裝置清單
result = mvc.perform(MockMvcRequestBuilders
.get("/device")
.accept(MediaType.APPLICATION_JSON_UTF8))
.andDo(print())
.andExpect(status().isOk())
.andReturn();
Iterable<Device> devices = mapper.readValue(result.getResponse().getContentAsString(),
new TypeReference<Iterable<Device>>() {
});
Assert.assertNotNull(devices);
//拿取隱私政策
result = mvc.perform(MockMvcRequestBuilders
.get("/privacy/" + "a1252c49-4188-4e6d-a32e-66604c664fb8")
......@@ -117,15 +117,7 @@ public class GatewayHttpApiTest {
//取得所有隱私偏好
result = mvc.perform(MockMvcRequestBuilders
.get("/choice")
.accept(MediaType.APPLICATION_JSON_UTF8))
.andDo(print())
.andExpect(status().isOk())
.andReturn();
Assert.assertNotNull(result);
result = mvc.perform(MockMvcRequestBuilders
.get("/choice")
.get("/choice"+"/test1")
.accept(MediaType.APPLICATION_JSON_UTF8))
.andDo(print())
.andExpect(status().isOk())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment