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ü
+
+
+
+Tek veri veritabanına eklendi ve başarı mesajı döndürüldü
+
+
+
+Tüm veriler ekranda gösterildi
+
+
+
+İşletim sisteminin IOS ya da Android olması şartı eklendi. Yanlış veri ekleme durumunda hata mesajı gönderildi
+
+
+
+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ü
+
+
+
+url: .../device?brand=apple
+
+
+
+
+url: http://localhost:8080/md/devices?brand=Apple&osVersion=12.4.1&page=1&size=5
+
+
+
+Mobile Device Tablosu
+
+
+
+
+
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