diff --git a/Images/already_has_been_added.png b/Images/already_has_been_added.png new file mode 100644 index 0000000..98c99fd Binary files /dev/null and b/Images/already_has_been_added.png differ diff --git a/Images/brand_os_version.png b/Images/brand_os_version.png new file mode 100644 index 0000000..618fd60 Binary files /dev/null and b/Images/brand_os_version.png differ diff --git a/Images/device_brand.png b/Images/device_brand.png new file mode 100644 index 0000000..f5c6ff9 Binary files /dev/null and b/Images/device_brand.png differ diff --git a/Images/getAll.png b/Images/getAll.png new file mode 100644 index 0000000..c96862a Binary files /dev/null and b/Images/getAll.png differ diff --git a/Images/mobile_device_table.png b/Images/mobile_device_table.png new file mode 100644 index 0000000..5c545a7 Binary files /dev/null and b/Images/mobile_device_table.png differ diff --git a/Images/os_type_not_defined.png b/Images/os_type_not_defined.png new file mode 100644 index 0000000..3e98922 Binary files /dev/null and b/Images/os_type_not_defined.png differ diff --git a/Images/post_error.png b/Images/post_error.png new file mode 100644 index 0000000..96e25e8 Binary files /dev/null and b/Images/post_error.png differ diff --git a/Images/post_success.png b/Images/post_success.png new file mode 100644 index 0000000..9b74404 Binary files /dev/null and b/Images/post_success.png differ diff --git a/Images/saveAll_post.png b/Images/saveAll_post.png new file mode 100644 index 0000000..a2656b0 Binary files /dev/null and b/Images/saveAll_post.png differ diff --git a/Images/save_post.png b/Images/save_post.png new file mode 100644 index 0000000..58316b4 Binary files /dev/null and b/Images/save_post.png differ diff --git a/README.md b/README.md deleted file mode 100644 index cb5c8fa..0000000 --- a/README.md +++ /dev/null @@ -1 +0,0 @@ -# CodeChallenge \ No newline at end of file diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..5f7e0f6 --- /dev/null +++ b/Readme.md @@ -0,0 +1,36 @@ +# CodeChallenge +Tüm veriler veri tabanına eklendi ve başarı mesajı döndürüldü + +![Success Message From Post Method](https://github.com/fehimecapar/CodeChallenge/blob/development/Images/saveAll_post.png) + +Tek veri veritabanına eklendi ve başarı mesajı döndürüldü + +![error Message From Post Method](https://github.com/fehimecapar/CodeChallenge/blob/development/Images/save_post.png) + +Tüm veriler ekranda gösterildi + +![Message From get Method](https://github.com/fehimecapar/CodeChallenge/blob/development/Images/getAll.png) + +İşletim sisteminin IOS ya da Android olması şartı eklendi. Yanlış veri ekleme durumunda hata mesajı gönderildi + +![Message From get Method](https://github.com/fehimecapar/CodeChallenge/blob/development/Images/post_error.png) + +Eklemeye çalışılan verinin daha önce veri tabanına kaydedilip kaydedilmediği kontrolü yapıldı. Eğer veri varsa ve eklemeye çalışıyorsak hata değerini ve eklemeye çalıştığımız data değerini döndürdü + +![Message From brand Method](https://github.com/fehimecapar/CodeChallenge/blob/development/Images/already_has_been_added.png) + +url: .../device?brand=apple + +![Message From brand Method](https://github.com/fehimecapar/CodeChallenge/blob/development/Images/device_brand.png) + + +url: http://localhost:8080/md/devices?brand=Apple&osVersion=12.4.1&page=1&size=5 + +![Message From brand Method](https://github.com/fehimecapar/CodeChallenge/blob/development/Images/brand_os_version.png) + +Mobile Device Tablosu + +![Message From brand Method](https://github.com/fehimecapar/CodeChallenge/blob/development/Images/mobile_device_table.png) + + + diff --git a/pom.xml b/pom.xml index 6dc534f..c276144 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,12 @@ spring-boot-starter-test test - + + commons-beanutils + commons-beanutils + 1.7.0 + + diff --git a/src/main/java/com/example/demo/controller/mobileDeviceController.java b/src/main/java/com/example/demo/controller/mobileDeviceController.java index ae9c5e7..fa019a2 100644 --- a/src/main/java/com/example/demo/controller/mobileDeviceController.java +++ b/src/main/java/com/example/demo/controller/mobileDeviceController.java @@ -1,27 +1,46 @@ package com.example.demo.controller; -import com.example.demo.model.MobileDeviceModel; -import com.example.demo.service.MobileDeviceServiceImp; +import com.example.demo.results.DataResult; +import com.example.demo.service.MobileDeviceService; +import com.example.demo.web.dto.MobileDeviceDto; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; -import java.util.HashSet; +import java.util.List; +@RequestMapping("/md") @RestController public class MobileDeviceController { @Autowired - MobileDeviceServiceImp mobileDeviceServiceImp; + MobileDeviceService mobileDeviceService; - @PostMapping("/") - public void addMobileDevice(@RequestBody MobileDeviceModel model){ - mobileDeviceServiceImp.addMobileDevice(model); + public MobileDeviceController(MobileDeviceService mobileDeviceService) { + this.mobileDeviceService = mobileDeviceService; } - @GetMapping("/getall") - public HashSet getAllMobileDevice(){ - return mobileDeviceServiceImp.getAllMobileDevice(); + + @GetMapping("/getAll") // get all data + public DataResult> getAllMobileDevice(){ + return mobileDeviceService.getAllMobileDevice(); + } + + @GetMapping("/device") // fetch data by brand + public DataResult> brandFilter(@RequestParam("brand") String brand){ + return mobileDeviceService.brandFilter(brand); + } + @GetMapping("/devices") // fetch data by brand and osVersion + public DataResult> brandAndOsVersionFilter(@RequestParam("brand") String brand, @RequestParam("osVersion")String osVersion, + @RequestParam("page") int page, @RequestParam("size") int size){ + return mobileDeviceService.brandAndOsVersionFilter(brand, osVersion, page, size); } + + @PostMapping("/post")// save all data and multiple data + public DataResult addMobileDevices(@RequestBody List modelDeviceDto) throws Exception { + return mobileDeviceService.addMobileDevices(modelDeviceDto); + } + @PostMapping("/save")//save just one data + public DataResult addMobileDevice(@RequestBody MobileDeviceDto modelDeviceDto) throws Exception { + return mobileDeviceService.addMobileDevice(modelDeviceDto); + } + } diff --git a/src/main/java/com/example/demo/model/MobileDeviceModel.java b/src/main/java/com/example/demo/model/MobileDeviceModel.java index c43334e..e20ef64 100644 --- a/src/main/java/com/example/demo/model/MobileDeviceModel.java +++ b/src/main/java/com/example/demo/model/MobileDeviceModel.java @@ -7,25 +7,32 @@ import javax.persistence.*; import javax.validation.constraints.NotEmpty; -import java.util.Objects; -//@Entity +@Entity @Getter @Setter @NoArgsConstructor @Table(name = "MobileDeviceTable")//table name public class MobileDeviceModel { - /* + @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - public Long id; - * */ - @NotNull @NotEmpty - private String brand; + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name="id") + public int id; + + @Column(name="model") @NotNull @NotEmpty private String model; + + @Column(name="brand") + @NotNull @NotEmpty + private String brand; + + @Column(name="os") @NotNull @NotEmpty private String os; + + @Column(name="osVersion") @NotNull @NotEmpty private String osVersion; diff --git a/src/main/java/com/example/demo/repository/MobileDeviceRepository.java b/src/main/java/com/example/demo/repository/MobileDeviceRepository.java new file mode 100644 index 0000000..9a1350b --- /dev/null +++ b/src/main/java/com/example/demo/repository/MobileDeviceRepository.java @@ -0,0 +1,15 @@ +package com.example.demo.repository; + +import com.example.demo.model.MobileDeviceModel; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface MobileDeviceRepository extends JpaRepository { + + List findMobileDeviceModelsByBrand(String brand); // fetch data by brand name + List findMobileDeviceModelsByBrandAndOsVersion(String brand, String osVersion, Pageable page); // fetch data by brand osVersion and page number + + +} diff --git a/src/main/java/com/example/demo/results/DataResult.java b/src/main/java/com/example/demo/results/DataResult.java new file mode 100644 index 0000000..b77a407 --- /dev/null +++ b/src/main/java/com/example/demo/results/DataResult.java @@ -0,0 +1,17 @@ +package com.example.demo.results; + +public class DataResult extends Result{ + private T data; + + public DataResult(T data, boolean success, String message) { + super(success,message); + this.data = data; + } + public DataResult(T data, boolean success) { + super(success); + this.data = data; + } + public T getData() { + return this.data; + } +} diff --git a/src/main/java/com/example/demo/results/ErrorDataResult.java b/src/main/java/com/example/demo/results/ErrorDataResult.java new file mode 100644 index 0000000..65dee80 --- /dev/null +++ b/src/main/java/com/example/demo/results/ErrorDataResult.java @@ -0,0 +1,19 @@ +package com.example.demo.results; + +public class ErrorDataResult extends DataResult{ + public ErrorDataResult(T data, String message) { + super(data,false,message); + } + + public ErrorDataResult(T data) { + super(data,false); + } + + public ErrorDataResult(String message) { + super(null,false,message); + } + + public ErrorDataResult() { + super(null,false); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/results/ErrorResult.java b/src/main/java/com/example/demo/results/ErrorResult.java new file mode 100644 index 0000000..510dea3 --- /dev/null +++ b/src/main/java/com/example/demo/results/ErrorResult.java @@ -0,0 +1,12 @@ +package com.example.demo.results; + +public class ErrorResult extends Result{ + + public ErrorResult() { + super(false); + } + + public ErrorResult(String message) { + super(false,message); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/results/Result.java b/src/main/java/com/example/demo/results/Result.java new file mode 100644 index 0000000..6a9b16f --- /dev/null +++ b/src/main/java/com/example/demo/results/Result.java @@ -0,0 +1,23 @@ +package com.example.demo.results; + +public class Result { + private boolean success; + private String message; + + public Result(boolean success) { + this.success = success; + } + + public Result(boolean success, String message) { + this(success); + this.message = message; + } + + public boolean isSuccess() { + return this.success; + } + + public String getMessage() { + return this.message; + } +} diff --git a/src/main/java/com/example/demo/results/SuccessDataResult.java b/src/main/java/com/example/demo/results/SuccessDataResult.java new file mode 100644 index 0000000..2b1d636 --- /dev/null +++ b/src/main/java/com/example/demo/results/SuccessDataResult.java @@ -0,0 +1,19 @@ +package com.example.demo.results; + +public class SuccessDataResult extends DataResult{ + public SuccessDataResult(T data, String message) { + super(data,true,message); + } + + public SuccessDataResult(T data) { + super(data,true); + } + + public SuccessDataResult(String message) { + super(null,true,message); + } + + public SuccessDataResult() { + super(null,true); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/results/SuccessResult.java b/src/main/java/com/example/demo/results/SuccessResult.java new file mode 100644 index 0000000..da681d4 --- /dev/null +++ b/src/main/java/com/example/demo/results/SuccessResult.java @@ -0,0 +1,12 @@ +package com.example.demo.results; + +public class SuccessResult extends Result{ + + public SuccessResult() { + super(true); + } + + public SuccessResult(String message) { + super(true,message); + } +} diff --git a/src/main/java/com/example/demo/service/MobileDeviceService.java b/src/main/java/com/example/demo/service/MobileDeviceService.java index ed20b6a..149622c 100644 --- a/src/main/java/com/example/demo/service/MobileDeviceService.java +++ b/src/main/java/com/example/demo/service/MobileDeviceService.java @@ -1,12 +1,16 @@ package com.example.demo.service; -import com.example.demo.model.MobileDeviceModel; +import com.example.demo.results.DataResult; +import com.example.demo.web.dto.MobileDeviceDto; -import java.util.HashSet; +import java.util.List; public interface MobileDeviceService { + DataResult> getAllMobileDevice(); //get all data from MobileDevice table + DataResult> addMobileDevices(List mdlist) throws Exception; //add all datas or multiple data to MobileDevice table from devices.json file + DataResult addMobileDevice(MobileDeviceDto md) throws Exception; //save one data to MobileDevice table - void addMobileDevice(MobileDeviceModel md); //add data to MobileDevice table - HashSet getAllMobileDevice(); //get data from MobileDevice table + DataResult> brandFilter(String brand); // for device?brand=any type url + DataResult> brandAndOsVersionFilter(String brand, String osVersion, int page, int size); //for devices?brand=Apple&osVersion=12.4.1&page=1&size=5 } diff --git a/src/main/java/com/example/demo/service/MobileDeviceServiceImp.java b/src/main/java/com/example/demo/service/MobileDeviceServiceImp.java index 4d60898..27daebc 100644 --- a/src/main/java/com/example/demo/service/MobileDeviceServiceImp.java +++ b/src/main/java/com/example/demo/service/MobileDeviceServiceImp.java @@ -1,27 +1,148 @@ package com.example.demo.service; import com.example.demo.model.MobileDeviceModel; +import com.example.demo.repository.MobileDeviceRepository; +import com.example.demo.results.DataResult; +import com.example.demo.results.ErrorDataResult; +import com.example.demo.results.SuccessDataResult; +import com.example.demo.web.dto.MobileDeviceDto; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; -import java.util.HashSet; +import java.util.*; @Service public class MobileDeviceServiceImp implements MobileDeviceService{ - HashSet mobileDeviceList = new HashSet(); + private MobileDeviceRepository mobileDeviceRepository; + List mobileDeviceDtos; + public MobileDeviceServiceImp(HashSet mobileDeviceList, MobileDeviceRepository mobileDeviceRepository) { + this.mobileDeviceList = mobileDeviceList; + this.mobileDeviceRepository = mobileDeviceRepository; + } + + @Override + public DataResult> addMobileDevices(List modelDeviceDto) { + + // I defined List method due to i want to save multiple data + List list = new ArrayList<>(); + try { + for (MobileDeviceDto mobileDeviceDto : modelDeviceDto) { + MobileDeviceModel md = new MobileDeviceModel(); + osControle(mobileDeviceDto.getOs()); + md.setId(new Random().nextInt()); + md.setModel(mobileDeviceDto.getModel()); + md.setBrand(mobileDeviceDto.getBrand()); + md.setOs(mobileDeviceDto.getOs()); + md.setOsVersion(mobileDeviceDto.getOsVersion()); + + list.add(md); + } + mobileDeviceRepository.saveAll(list); + return new SuccessDataResult<>(modelDeviceDto,"Datas saved to database"); + }catch (Exception e){ + return new ErrorDataResult<>(modelDeviceDto, e.getMessage()); + } + + } @Override - public void addMobileDevice(MobileDeviceModel md) { - mobileDeviceList.add(md); + public DataResult addMobileDevice(MobileDeviceDto modelDeviceDto) { + MobileDeviceModel md = new MobileDeviceModel(); + try { + osControle(modelDeviceDto.getOs()); + modelBrandOsVersionControle(modelDeviceDto.getModel(), modelDeviceDto.getBrand(), modelDeviceDto.getOsVersion()); + md.setId(new Random().nextInt()); + md.setModel(modelDeviceDto.getModel()); + md.setBrand(modelDeviceDto.getBrand()); + md.setOs(modelDeviceDto.getOs()); + md.setOsVersion(modelDeviceDto.getOsVersion()); + //mobileDeviceRepository.save(md); + mobileDeviceRepository.saveAndFlush(md); + return new SuccessDataResult<>("Data Saved"); + }catch (Exception e){ + return new ErrorDataResult<>(modelDeviceDto, e.getMessage()); + } + + } + @Override + public DataResult> brandFilter(String brand) { + + List mobileDeviceModelsByBrand = mobileDeviceRepository.findMobileDeviceModelsByBrand(brand); + mobileDeviceDtos = new ArrayList<>(); + for (MobileDeviceModel mobileDeviceModel : mobileDeviceModelsByBrand) { + + MobileDeviceDto mdd = new MobileDeviceDto(); + mdd.setModel(mobileDeviceModel.getModel()); + mdd.setBrand(mobileDeviceModel.getBrand()); + mdd.setOs(mobileDeviceModel.getOs()); + mdd.setOsVersion(mobileDeviceModel.getOsVersion()); + + mobileDeviceDtos.add(mdd); + } + return new SuccessDataResult<>(mobileDeviceDtos,"Data Listed by brand"); } @Override - public HashSet getAllMobileDevice() { - if(mobileDeviceList.isEmpty()){ - return null; + public DataResult> brandAndOsVersionFilter(String brand, String osVersion, int page, int size) { + Pageable paging = PageRequest.of(page, size); // pagination process with page and size value. We get page and size from controller page + List mobileDeviceModelsByBrandAndModelsByOsVersion = mobileDeviceRepository.findMobileDeviceModelsByBrandAndOsVersion(brand, osVersion, paging); + mobileDeviceDtos = new ArrayList<>(); + for (MobileDeviceModel mobileDeviceModel : mobileDeviceModelsByBrandAndModelsByOsVersion) { + + MobileDeviceDto mdd = new MobileDeviceDto(); + mdd.setModel(mobileDeviceModel.getModel()); + mdd.setBrand(mobileDeviceModel.getBrand()); + mdd.setOs(mobileDeviceModel.getOs()); + mdd.setOsVersion(mobileDeviceModel.getOsVersion()); + + mobileDeviceDtos.add(mdd); + } + return new SuccessDataResult<>(mobileDeviceDtos,"Data listed by brand and osVersion"); + } + + // os version controle. Os must be Android or ios + private void osControle(String os) throws Exception { + + if(!os.equalsIgnoreCase("Android") && !os.equalsIgnoreCase("IOS")) { + throw new Exception("Os type is not defined"); + } + } + + // Checking the status of not adding the data in the table to the table again + private void modelBrandOsVersionControle(String model, String brand, String osVersion) throws Exception{ + List mobileDeviceModels = mobileDeviceRepository.findAll(); + mobileDeviceDtos = new ArrayList<>(); + for (MobileDeviceModel mobileDeviceModel : mobileDeviceModels) { + + String tempModel = mobileDeviceModel.getModel(); + String tempBrand = mobileDeviceModel.getBrand(); + String tempOsVersion = mobileDeviceModel.getOsVersion(); + + if(tempModel.equals(model) && tempBrand.equals(brand) && tempOsVersion.equals(osVersion)){ + throw new Exception("this mobile device has already been added to database"); + } } - else{ - return mobileDeviceList; + } + + @Override + public DataResult> getAllMobileDevice() { + List mobileDeviceModels = mobileDeviceRepository.findAll(); + mobileDeviceDtos = new ArrayList<>(); + for (MobileDeviceModel mobileDeviceModel : mobileDeviceModels) { + + MobileDeviceDto mdd = new MobileDeviceDto(); + mdd.setModel(mobileDeviceModel.getModel()); + mdd.setBrand(mobileDeviceModel.getBrand()); + mdd.setOs(mobileDeviceModel.getOs()); + mdd.setOsVersion(mobileDeviceModel.getOsVersion()); + + mobileDeviceDtos.add(mdd); + } + return new SuccessDataResult<>(mobileDeviceDtos,"Data Listed"); + } + } diff --git a/src/main/java/com/example/demo/web/dto/MobileDeviceDto.java b/src/main/java/com/example/demo/web/dto/MobileDeviceDto.java new file mode 100644 index 0000000..d10527e --- /dev/null +++ b/src/main/java/com/example/demo/web/dto/MobileDeviceDto.java @@ -0,0 +1,29 @@ +package com.example.demo.web.dto; + +import com.sun.istack.NotNull; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.validation.constraints.NotEmpty; + +@Getter +@Setter +@NoArgsConstructor +public class MobileDeviceDto { + + @NotNull + @NotEmpty + private String model; + + @NotNull @NotEmpty + private String brand; + + + @NotNull @NotEmpty + private String os; + + @NotNull @NotEmpty + private String osVersion; + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 1aa72c3..f26fa68 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,4 +1,9 @@ +# for connection postgresql db +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect +spring.jpa.hibernate.ddl-auto=none +spring.jpa.hibernate.show-sql=true spring.datasource.url=jdbc:postgresql://localhost:5432/postgres spring.datasource.username=postgres spring.datasource.password=1 -spring.jpa.hibernate.ddl-auto=update \ No newline at end of file + diff --git a/src/main/resources/devices.json b/src/main/resources/devices.json new file mode 100644 index 0000000..37933fb --- /dev/null +++ b/src/main/resources/devices.json @@ -0,0 +1,422 @@ +[ + { + "model":"Galaxy J7", + "brand":"Samsung", + "os":"Android", + "osVersion":"8.1.0" + }, + { + "model":"Galaxy J8", + "brand":"Samsung", + "os":"Android", + "osVersion":"9" + }, + { + "model":"Y6", + "brand":"Huawei", + "os":"Android", + "osVersion":"8.0.0" + }, + { + "model":"Galaxy A5", + "brand":"Samsung", + "os":"Android", + "osVersion":"6.0.1" + }, + { + "model":"Mate 10 Pro", + "brand":"Huawei", + "os":"Android", + "osVersion":"8.0.0" + }, + { + "model":"Galaxy J6", + "brand":"Samsung", + "os":"Android", + "osVersion":"8.1.0" + }, + { + "model":"Galaxy J7 Prime 2", + "brand":"Samsung", + "os":"Android", + "osVersion":"7.1.1" + }, + { + "model":"Galaxy A50", + "brand":"Samsung", + "os":"Android", + "osVersion":"9" + }, + { + "model":"Galaxy J7 Prime 2", + "brand":"Samsung", + "os":"Android", + "osVersion":"8.0.0" + }, + { + "model":"Galaxy A7", + "brand":"Samsung", + "os":"Android", + "osVersion":"6.0.1" + }, + { + "model":"P10 Plus", + "brand":"Huawei", + "os":"Android", + "osVersion":"7.0" + }, + { + "model":"Galaxy s10e", + "brand":"Samsung", + "os":"Android", + "osVersion":"9" + }, + { + "model":"Galaxy A8+", + "brand":"Samsung", + "os":"Android", + "osVersion":"9" + }, + { + "model":"8X", + "brand":"Honor", + "os":"Android", + "osVersion":"9" + }, + { + "model":"GM 9 Pro d", + "brand":"GM", + "os":"Android", + "osVersion":"9" + }, + { + "model":"MI 8 Lite", + "brand":"Xiaomi", + "os":"Android", + "osVersion":"8.1.0" + }, + { + "model":"Redmi S2", + "brand":"Xiaomi", + "os":"Android", + "osVersion":"8.1.0" + }, + { + "model":"Xperia X", + "brand":"Sony", + "os":"Android", + "osVersion":"6.0.1" + }, + { + "model":"P20", + "brand":"Huawei", + "os":"Android", + "osVersion":"8.1.0" + }, + { + "model":"GM 8", + "brand":"GM", + "os":"Android", + "osVersion":"8.1.0" + }, + { + "model":"Galaxy A10s", + "brand":"Samsung", + "os":"Android", + "osVersion":"9" + }, + { + "model":"P Smart", + "brand":"Huawei", + "os":"Android", + "osVersion":"8.0.0" + }, + { + "model":"Galaxy Note 5", + "brand":"Samsung", + "os":"Android", + "osVersion":"7.0" + }, + { + "model":"Galaxy S8+", + "brand":"Samsung", + "os":"Android", + "osVersion":"9" + }, + { + "model":"Galaxy A10", + "brand":"Samsung", + "os":"Android", + "osVersion":"9" + }, + { + "model":"Galaxy A2", + "brand":"Samsung", + "os":"Android", + "osVersion":"8.1.0" + }, + { + "model":"Galaxy A6+", + "brand":"Samsung", + "os":"Android", + "osVersion":"9" + }, + { + "model":"Xperia X Compact", + "brand":"Sony", + "os":"Android", + "osVersion":"6.0.1" + }, + { + "model":"Q6", + "brand":"LG", + "os":"Android", + "osVersion":"7.1.1" + }, + { + "model":"Redmi 5 Plus", + "brand":"Xiaomi", + "os":"Android", + "osVersion":"8.1.0" + }, + { + "model":"Galaxy J7", + "brand":"Samsung", + "os":"Android", + "osVersion":"6.0.1" + }, + { + "model":"A5s", + "brand":"OPPO", + "os":"Android", + "osVersion":"8.1.0" + }, + { + "model":"Moto Z", + "brand":"Motorola", + "os":"Android", + "osVersion":"7.1.1" + }, + { + "model":"G3", + "brand":"LG", + "os":"Android", + "osVersion":"6.0" + }, + { + "model":"Galaxy S8", + "brand":"Samsung", + "os":"Android", + "osVersion":"9" + }, + { + "model":"POCOPHONE F1", + "brand":"Xiaomi", + "os":"Android", + "osVersion":"8.1.0" + }, + { + "model":"Galaxy A9", + "brand":"Samsung", + "os":"Android", + "osVersion":"9" + }, + { + "model":"Redmi Note 7", + "brand":"Xiaomi", + "os":"Android", + "osVersion":"9" + }, + { + "model":"Galaxy A30", + "brand":"Samsung", + "os":"Android", + "osVersion":"9" + }, + { + "model":"K12", + "brand":"LG", + "os":"Android", + "osVersion":"9" + }, + { + "model":"Galaxy A8", + "brand":"Samsung", + "os":"Android", + "osVersion":"9" + }, + { + "model":"Galaxy S9+", + "brand":"Samsung", + "os":"Android", + "osVersion":"8.0.0" + }, + { + "model":"Xperia X", + "brand":"Sony", + "os":"Android", + "osVersion":"8.0.0" + }, + { + "model":"Desire 10", + "brand":"HTC", + "os":"Android", + "osVersion":"6.0.1" + }, + { + "model":"One M8", + "brand":"HTC", + "os":"Android", + "osVersion":"6.0" + }, + { + "model":"Galaxy On7", + "brand":"Samsung", + "os":"Android", + "osVersion":"6.0.1" + }, + { + "model":"P2", + "brand":"Lenovo", + "os":"Android", + "osVersion":"7.0" + }, + { + "model":"Galaxy J2", + "brand":"Samsung", + "os":"Android", + "osVersion":"8.1.0" + }, + { + "model":"Galaxy A7", + "brand":"Samsung", + "os":"Android", + "osVersion":"9" + }, + { + "model":"Redmi 6A", + "brand":"Xiaomi", + "os":"Android", + "osVersion":"8.1.0" + }, + { + "model":"Galaxy S8", + "brand":"Samsung", + "os":"Android", + "osVersion":"7.0" + }, + { + "model":"Galaxy Note 10+", + "brand":"Samsung", + "os":"Android", + "osVersion":"9" + }, + { + "model":"Galaxy A20s", + "brand":"Samsung", + "os":"Android", + "osVersion":"9" + }, + { + "model":"Galaxy Note 10", + "brand":"Samsung", + "os":"Android", + "osVersion":"9" + }, + { + "model":"Xperia XZ Premium", + "brand":"Sony", + "os":"Android", + "osVersion":"7.1.1" + }, + { + "model":"Xperia Z5", + "brand":"Sony", + "os":"Android", + "osVersion":"5.1.1" + }, + { + "model":"Xperia M4", + "brand":"Sony", + "os":"Android", + "osVersion":"5.0" + }, + { + "model":"iPhone 6s", + "brand":"Apple", + "os":"iOS", + "osVersion":"12.4.1" + }, + { + "model":"iPhone 7 Plus", + "brand":"Apple", + "os":"iOS", + "osVersion":"12.4.1" + }, + { + "model":"iPhone X", + "brand":"Apple", + "os":"iOS", + "osVersion":"12.4.1" + }, + { + "model":"iPhone 5s", + "brand":"Apple", + "os":"iOS", + "osVersion":"12.4.1" + }, + { + "model":"iPhone 8", + "brand":"Apple", + "os":"iOS", + "osVersion":"12.4" + }, + { + "model":"iPhone XR", + "brand":"Apple", + "os":"iOS", + "osVersion":"12.4.1" + }, + { + "model":"iPhone 5s", + "brand":"Apple", + "os":"iOS", + "osVersion":"12.4.3" + }, + { + "model":"iPhone 7", + "brand":"Apple", + "os":"iOS", + "osVersion":"12.4.1" + }, + { + "model":"iPhone 8 Plus", + "brand":"Apple", + "os":"iOS", + "osVersion":"12.2" + }, + { + "model":"iPhone 7 Plus", + "brand":"Apple", + "os":"iOS", + "osVersion":"11.4" + }, + { + "model":"iPhone 6s Plus", + "brand":"Apple", + "os":"iOS", + "osVersion":"12.4.1" + }, + { + "model":"iPhone SE", + "brand":"Apple", + "os":"iOS", + "osVersion":"12.4.1" + }, + { + "model":"iPhone 6", + "brand":"Apple", + "os":"iOS", + "osVersion":"11.4" + } +] \ No newline at end of file