From d0f3debf2eee1106ca0f9213d6eb112b890cf0f5 Mon Sep 17 00:00:00 2001 From: Sambo Chea Date: Fri, 28 Oct 2022 10:10:46 +0700 Subject: [PATCH] Add models and sdk services example --- ...{sample_dart_dsdk.dart => sample_sdk.dart} | 0 lib/sdk.dart | 1 + lib/sdk/ClientSDK.dart | 20 -- lib/sdk/client_sdk.dart | 27 ++ lib/sdk/models/CategoryModel.dart | 6 - lib/sdk/models/ProductModel.dart | 20 -- lib/sdk/models/base.dart | 31 ++ lib/sdk/models/category.dart | 34 ++ lib/sdk/models/product.dart | 38 +++ lib/sdk/services/CategoryService.dart | 7 - lib/sdk/services/ProductService.dart | 15 - lib/sdk/services/base.dart | 11 + lib/sdk/services/category.dart | 39 +++ lib/sdk/services/product.dart | 64 ++++ lib/test.dart | 13 - pubspec.lock | 317 +++++++++++++++++- pubspec.yaml | 7 +- test/sample_sdk_test.dart | 33 ++ 18 files changed, 598 insertions(+), 85 deletions(-) rename bin/{sample_dart_dsdk.dart => sample_sdk.dart} (100%) create mode 100644 lib/sdk.dart delete mode 100644 lib/sdk/ClientSDK.dart create mode 100644 lib/sdk/client_sdk.dart delete mode 100644 lib/sdk/models/CategoryModel.dart delete mode 100644 lib/sdk/models/ProductModel.dart create mode 100644 lib/sdk/models/base.dart create mode 100644 lib/sdk/models/category.dart create mode 100644 lib/sdk/models/product.dart delete mode 100644 lib/sdk/services/CategoryService.dart delete mode 100644 lib/sdk/services/ProductService.dart create mode 100644 lib/sdk/services/base.dart create mode 100644 lib/sdk/services/category.dart create mode 100644 lib/sdk/services/product.dart delete mode 100644 lib/test.dart create mode 100644 test/sample_sdk_test.dart diff --git a/bin/sample_dart_dsdk.dart b/bin/sample_sdk.dart similarity index 100% rename from bin/sample_dart_dsdk.dart rename to bin/sample_sdk.dart diff --git a/lib/sdk.dart b/lib/sdk.dart new file mode 100644 index 0000000..f1ebbcc --- /dev/null +++ b/lib/sdk.dart @@ -0,0 +1 @@ +export './sdk/client_sdk.dart'; \ No newline at end of file diff --git a/lib/sdk/ClientSDK.dart b/lib/sdk/ClientSDK.dart deleted file mode 100644 index e93a240..0000000 --- a/lib/sdk/ClientSDK.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:sample_dart_dsdk/sdk/services/CategoryService.dart'; -import 'package:sample_dart_dsdk/sdk/services/ProductService.dart'; - -class ClientSDK { - static var _instance; - - static ClientSDK getInstance() { - if (_instance == null) { - ClientSDK(); - } - - return _instance; - } - - ProductService getProductService() { - return ProductService(); - } - - CategoryService getCategoryService() => CategoryService(); -} diff --git a/lib/sdk/client_sdk.dart b/lib/sdk/client_sdk.dart new file mode 100644 index 0000000..8a29def --- /dev/null +++ b/lib/sdk/client_sdk.dart @@ -0,0 +1,27 @@ +import 'package:sample_sdk/sdk/services/category.dart'; +import 'package:sample_sdk/sdk/services/product.dart'; + +class ClientSDK { + static var _instance; + + static ClientSDK getInstance() { + if (_instance == null) { + ClientSDK(); + } + + return _instance; + } + + ProductService productService = ProductService(); + + CategoryService categoryService = CategoryService(); + + ClientSDK() { + _instance = this; + } + + void dispose() { + _instance = null; + } + +} diff --git a/lib/sdk/models/CategoryModel.dart b/lib/sdk/models/CategoryModel.dart deleted file mode 100644 index 9e68eb1..0000000 --- a/lib/sdk/models/CategoryModel.dart +++ /dev/null @@ -1,6 +0,0 @@ -class Category { - int id; - String name; - - Category(this.id, this.name); -} diff --git a/lib/sdk/models/ProductModel.dart b/lib/sdk/models/ProductModel.dart deleted file mode 100644 index d559fea..0000000 --- a/lib/sdk/models/ProductModel.dart +++ /dev/null @@ -1,20 +0,0 @@ -class Product { - int id; - String name; - double price; - - Product(this.id, this.name, this.price); - - static Product fromJson(dynamic json) => Product( - json['id'], - json['name'], - json['price'], - ); -} - -class ProductRequest { - String name; - double price; - - ProductRequest(this.name, this.price); -} diff --git a/lib/sdk/models/base.dart b/lib/sdk/models/base.dart new file mode 100644 index 0000000..d9ae70f --- /dev/null +++ b/lib/sdk/models/base.dart @@ -0,0 +1,31 @@ +import 'dart:convert'; + +abstract class BaseModel { + BaseModel(); + + Map toMap(); + + T fromMap(Map map); + + T fromJson(String json); + + @override + String toString() { + return toMap().toString(); + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is BaseModel && other.toMap() == toMap(); + } + + @override + int get hashCode => toMap().hashCode; + + String toJson() => encode(toMap()); + + dynamic decode(String json) => jsonDecode(json); + String encode(dynamic json) => jsonEncode(json); +} diff --git a/lib/sdk/models/category.dart b/lib/sdk/models/category.dart new file mode 100644 index 0000000..e70399a --- /dev/null +++ b/lib/sdk/models/category.dart @@ -0,0 +1,34 @@ +import 'package:sample_sdk/sdk/models/base.dart'; + +class Category extends BaseModel { + int? id; + String? name; + Category? parent; + + Category({this.id, this.name, this.parent}); + + @override + Category fromMap(Map map) { + id = map['id']; + name = map['name']; + parent = Category().fromJson(map['parent']); + + return this; + } + + @override + Map toMap() { + return { + 'id': id, + 'name': name, + 'parent': parent?.toMap(), + }; + } + + @override + Category fromJson(String json) { + return fromMap(decode(json)); + } + + static Category fromJsonString(dynamic json) => Category().fromJson(json); +} diff --git a/lib/sdk/models/product.dart b/lib/sdk/models/product.dart new file mode 100644 index 0000000..b592e02 --- /dev/null +++ b/lib/sdk/models/product.dart @@ -0,0 +1,38 @@ +import 'package:sample_sdk/sdk/models/base.dart'; +import 'package:sample_sdk/sdk/models/category.dart'; + +class Product extends BaseModel { + int? id; + String? name; + double? price; + Category? category; + + Product({this.id, this.name, this.price, this.category}); + + @override + Product fromMap(Map map) { + id = map['id']; + name = map['name']; + price = map['price']; + category = Category().fromJson(map['category']); + + return this; + } + + @override + Map toMap() { + return { + 'id': id, + 'name': name, + 'price': price, + 'category': category?.toMap(), + }; + } + + @override + Product fromJson(String json) { + return fromMap(decode(json)); + } + + static Product fromJsonString(String json) => Product().fromJson(json); +} diff --git a/lib/sdk/services/CategoryService.dart b/lib/sdk/services/CategoryService.dart deleted file mode 100644 index c9cfacc..0000000 --- a/lib/sdk/services/CategoryService.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:sample_dart_dsdk/sdk/models/CategoryModel.dart'; - -class CategoryService { - List getAll() { - return List.empty(); - } -} diff --git a/lib/sdk/services/ProductService.dart b/lib/sdk/services/ProductService.dart deleted file mode 100644 index 8b39da7..0000000 --- a/lib/sdk/services/ProductService.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:sample_dart_dsdk/sdk/models/ProductModel.dart'; - -class ProductService { - List getAll() { - return List.empty(); - } - - Product getOne() { - return Product.fromJson(null); - } - - Product create() { - return Product.fromJson(null); - } -} diff --git a/lib/sdk/services/base.dart b/lib/sdk/services/base.dart new file mode 100644 index 0000000..d233b80 --- /dev/null +++ b/lib/sdk/services/base.dart @@ -0,0 +1,11 @@ +abstract class BaseService { + Future> findAll(); + + Future findById(ID id); + + Future create(T entity); + + Future update(T entity); + + Future delete(ID id); +} diff --git a/lib/sdk/services/category.dart b/lib/sdk/services/category.dart new file mode 100644 index 0000000..81a618e --- /dev/null +++ b/lib/sdk/services/category.dart @@ -0,0 +1,39 @@ +import 'package:sample_sdk/sdk/models/category.dart'; +import 'package:sample_sdk/sdk/services/base.dart'; + +class CategoryService extends BaseService { + final List _categories = [ + Category(id: 1, name: 'Category 1'), + Category(id: 2, name: 'Category 2'), + Category(id: 3, name: 'Category 3'), + ]; + + @override + Future create(Category entity) { + _categories.add(entity); + return Future.value(entity); + } + + @override + Future delete(int id) { + _categories.removeWhere((element) => element.id == id); + return Future.value(); + } + + @override + Future> findAll() { + return Future.value(_categories); + } + + @override + Future findById(int id) { + return Future.value(_categories.firstWhere((element) => element.id == id)); + } + + @override + Future update(Category entity) { + final index = _categories.indexWhere((element) => element.id == entity.id); + _categories[index] = entity; + return Future.value(entity); + } +} diff --git a/lib/sdk/services/product.dart b/lib/sdk/services/product.dart new file mode 100644 index 0000000..b2e4941 --- /dev/null +++ b/lib/sdk/services/product.dart @@ -0,0 +1,64 @@ +import 'package:sample_sdk/sdk/models/category.dart'; +import 'package:sample_sdk/sdk/models/product.dart'; +import 'package:sample_sdk/sdk/services/base.dart'; + +class ProductService extends BaseService { + final List _products = [ + Product( + id: 1, + name: 'Product 1', + price: 100.0, + category: Category( + id: 1, + name: 'Category 1', + ), + ), + Product( + id: 2, + name: 'Product 2', + price: 200.0, + category: Category( + id: 2, + name: 'Category 2', + ), + ), + Product( + id: 3, + name: 'Product 3', + price: 300.0, + category: Category( + id: 3, + name: 'Category 3', + ), + ), + ]; + + @override + Future create(Product entity) { + _products.add(entity); + return Future.value(entity); + } + + @override + Future delete(int id) { + _products.removeWhere((element) => element.id == id); + return Future.value(); + } + + @override + Future> findAll() { + return Future.value(_products); + } + + @override + Future findById(int id) { + return Future.value(_products.firstWhere((element) => element.id == id)); + } + + @override + Future update(Product entity) { + final index = _products.indexWhere((element) => element.id == entity.id); + _products[index] = entity; + return Future.value(entity); + } +} diff --git a/lib/test.dart b/lib/test.dart deleted file mode 100644 index 638da64..0000000 --- a/lib/test.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:sample_dart_dsdk/sdk/ClientSDK.dart'; - -void main(List args) { - var client = ClientSDK.getInstance(); - var productService = client.getProductService(); - var products = productService.getAll(); - - print(products); - - var categoryService = client.getCategoryService(); - var categories = categoryService.getAll(); - print(categories); -} diff --git a/pubspec.lock b/pubspec.lock index 07e0c32..9ae9351 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,167 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + url: "https://pub.dartlang.org" + source: hosted + version: "50.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + url: "https://pub.dartlang.org" + source: hosted + version: "5.2.0" + args: + dependency: transitive + description: + name: args + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.1" + async: + dependency: transitive + description: + name: async + url: "https://pub.dartlang.org" + source: hosted + version: "2.10.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.dartlang.org" + source: hosted + version: "1.17.0" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" + coverage: + dependency: transitive + description: + name: coverage + url: "https://pub.dartlang.org" + source: hosted + version: "1.6.1" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.2" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.4" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + glob: + dependency: transitive + description: + name: glob + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.2" + io: + dependency: transitive + description: + name: io + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.3" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.5" + logging: + dependency: transitive + description: + name: logging + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.13" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.0" + mime: + dependency: transitive + description: + name: mime + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + node_preamble: + dependency: transitive + description: + name: node_preamble + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + package_config: + dependency: transitive + description: + name: package_config + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + path: + dependency: transitive + description: + name: path + url: "https://pub.dartlang.org" + source: hosted + version: "1.8.2" pedantic: dependency: "direct dev" description: @@ -8,5 +169,159 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.11.1" + pool: + dependency: transitive + description: + name: pool + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.1" + pub_semver: + dependency: transitive + description: + name: pub_semver + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" + shelf: + dependency: transitive + description: + name: shelf + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.0" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + shelf_static: + dependency: transitive + description: + name: shelf_static + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + source_maps: + dependency: transitive + description: + name: source_maps + url: "https://pub.dartlang.org" + source: hosted + version: "0.10.11" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.dartlang.org" + source: hosted + version: "1.9.1" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.dartlang.org" + source: hosted + version: "1.11.0" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.1" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.1" + test: + dependency: "direct dev" + description: + name: test + url: "https://pub.dartlang.org" + source: hosted + version: "1.21.7" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.15" + test_core: + dependency: transitive + description: + name: test_core + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.19" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.dartlang.org" + source: hosted + version: "1.3.1" + vm_service: + dependency: transitive + description: + name: vm_service + url: "https://pub.dartlang.org" + source: hosted + version: "9.4.0" + watcher: + dependency: transitive + description: + name: watcher + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" + yaml: + dependency: transitive + description: + name: yaml + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.1" sdks: - dart: ">=2.12.0 <3.0.0" + dart: ">=2.18.0 <3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index b0eb8f0..83ff3e6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ -name: sample_dart_dsdk -description: A simple command-line application. +name: sample_sdk +description: A simple command-line application and sdk. version: 1.0.0 -# homepage: https://www.example.com +homepage: https://www.cubetiqs.com environment: sdk: '>=2.12.0 <3.0.0' @@ -11,3 +11,4 @@ environment: dev_dependencies: pedantic: ^1.10.0 + test: ^1.16.4 diff --git a/test/sample_sdk_test.dart b/test/sample_sdk_test.dart new file mode 100644 index 0000000..eb7683e --- /dev/null +++ b/test/sample_sdk_test.dart @@ -0,0 +1,33 @@ +import 'package:sample_sdk/sdk.dart'; +import 'package:sample_sdk/sdk/models/category.dart'; +import 'package:sample_sdk/sdk/models/product.dart'; + +void main() async { + final sdk = ClientSDK(); + + final category = Category( + id: 4, + name: 'Category 4', + parent: Category( + id: 1, + name: 'Category 1', + ), + ); + + await sdk.categoryService.create(category); + final categories = await sdk.categoryService.findAll(); + print(categories); + + final product = Product( + id: 4, + name: 'Product 4', + price: 100.0, + category: category, + ); + + await sdk.productService.create(product); + final products = await sdk.productService.findAll(); + print(products); + + sdk.dispose(); +}