Skip to content

Commit dd90d3c

Browse files
committed
Added repo example
1 parent 1723780 commit dd90d3c

20 files changed

+1111
-64
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 1.0.17
2+
3+
14
## 1.0.16
25
Bug fixes
36
Fixed object delete

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ Want to get involved? Join our Slack channel and help out! (http://flutter-parse
1313
To install, either add to your pubspec.yaml
1414
```yml
1515
dependencies:
16-
parse_server_sdk: ^1.0.16
16+
parse_server_sdk: ^1.0.17
1717
```
1818
or clone this repository and add to your project. As this is an early development with multiple contributors, it is probably best to download/clone and keep updating as an when a new feature is added.
1919

example/lib/application_constants.dart

Lines changed: 0 additions & 6 deletions
This file was deleted.

example/lib/data/base/api_error.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class ApiError {
2+
ApiError(this.code, this.message, this.isTypeOfException, this.type);
3+
4+
final int code;
5+
final String message;
6+
final bool isTypeOfException;
7+
final String type;
8+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import 'package:parse_server_sdk/parse_server_sdk.dart';
2+
3+
import 'api_error.dart';
4+
5+
class ApiResponse {
6+
ApiResponse(this.success, this.statusCode, this.result, this.error);
7+
8+
final bool success;
9+
final int statusCode;
10+
final dynamic result;
11+
final ApiError error;
12+
13+
dynamic getResult<T extends ParseObject>() {
14+
return result;
15+
}
16+
}
17+
18+
ApiResponse getApiResponse<T extends ParseObject>(ParseResponse response) {
19+
return ApiResponse(response.success, response.statusCode, response.result,
20+
getApiError(response.error));
21+
}
22+
23+
ApiError getApiError(ParseError response) {
24+
if (response == null) {
25+
return null;
26+
}
27+
return ApiError(response.code, response.message, response.isTypeOfException,
28+
response.type);
29+
}

example/lib/data/model/diet_plan.dart

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import 'dart:core';
2+
3+
import 'package:parse_server_sdk/parse_server_sdk.dart';
4+
5+
const String keyDietPlan = 'Diet_Plans';
6+
const String keyName = 'Name';
7+
const String keyDescription = 'Description';
8+
const String keyProtein = 'Protein';
9+
const String keyCarbs = 'Carbs';
10+
const String keyFat = 'Fat';
11+
const String keyStatus = 'Status';
12+
13+
class DietPlan extends ParseObject implements ParseCloneable {
14+
DietPlan() : super(keyDietPlan);
15+
DietPlan.clone() : this();
16+
17+
@override
18+
DietPlan clone(Map<String, dynamic> map) => DietPlan.clone()..fromJson(map);
19+
20+
String get name => get<String>(keyName);
21+
set name(String name) => set<String>(keyName, name);
22+
23+
String get description => get<String>(keyDescription);
24+
set description(String description) => set<String>(keyDescription, name);
25+
26+
num get protein => get<num>(keyProtein);
27+
set protein(num protein) => super.set<num>(keyProtein, protein);
28+
29+
num get carbs => get<num>(keyCarbs);
30+
set carbs(num carbs) => set<num>(keyCarbs, carbs);
31+
32+
num get fat => get<num>(keyFat);
33+
set fat(num fat) => set<num>(keyFat, fat);
34+
35+
int get status => get<int>(keyStatus);
36+
set status(int status) => set<int>(keyStatus, status);
37+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import 'package:flutter_plugin_example/data/base/api_response.dart';
2+
import 'package:flutter_plugin_example/data/model/diet_plan.dart';
3+
4+
abstract class DietPlanProviderContract {
5+
Future<ApiResponse> add(DietPlan item);
6+
7+
Future<ApiResponse> addAll(List<DietPlan> items);
8+
9+
Future<ApiResponse> update(DietPlan item);
10+
11+
Future<ApiResponse> updateAll(List<DietPlan> items);
12+
13+
Future<ApiResponse> remove(DietPlan item);
14+
15+
Future<ApiResponse> getById(String id);
16+
17+
Future<ApiResponse> getAll();
18+
19+
Future<ApiResponse> getNewerThan(DateTime date);
20+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import 'package:flutter_plugin_example/data/base/api_response.dart';
2+
import 'package:flutter_plugin_example/data/model/diet_plan.dart';
3+
import 'package:flutter_plugin_example/data/repositories/diet_plan/contract_provider_diet_plan.dart';
4+
import 'package:parse_server_sdk/parse_server_sdk.dart';
5+
6+
class DietPlanProviderApi implements DietPlanProviderContract {
7+
DietPlanProviderApi();
8+
9+
@override
10+
Future<ApiResponse> add(DietPlan item) async {
11+
return getApiResponse<DietPlan>(await item.save());
12+
}
13+
14+
@override
15+
Future<ApiResponse> addAll(List<DietPlan> items) async {
16+
final List<DietPlan> responses = List<DietPlan>();
17+
18+
for (final DietPlan item in items) {
19+
final ApiResponse response = await add(item);
20+
21+
if (!response.success) {
22+
return response;
23+
}
24+
25+
responses.add(response.result);
26+
}
27+
28+
return ApiResponse(true, 200, responses, null);
29+
}
30+
31+
@override
32+
Future<ApiResponse> getAll() async {
33+
return getApiResponse<DietPlan>(await DietPlan().getAll());
34+
}
35+
36+
@override
37+
Future<ApiResponse> getById(String id) async {
38+
return getApiResponse<DietPlan>(await DietPlan().getObject(id));
39+
}
40+
41+
@override
42+
Future<ApiResponse> getNewerThan(DateTime date) async {
43+
final QueryBuilder<DietPlan> query = QueryBuilder<DietPlan>(DietPlan())
44+
..whereGreaterThan(keyVarCreatedAt, date);
45+
return getApiResponse<DietPlan>(await query.query());
46+
}
47+
48+
@override
49+
Future<ApiResponse> remove(DietPlan item) async {
50+
return getApiResponse<DietPlan>(await item.delete());
51+
}
52+
53+
@override
54+
Future<ApiResponse> update(DietPlan item) async {
55+
return getApiResponse<DietPlan>(await item.save());
56+
}
57+
58+
@override
59+
Future<ApiResponse> updateAll(List<DietPlan> items) async {
60+
final List<DietPlan> responses = List<DietPlan>();
61+
62+
for (final DietPlan item in items) {
63+
final ApiResponse response = await update(item);
64+
65+
if (!response.success) {
66+
return response;
67+
}
68+
69+
responses.add(response.result);
70+
}
71+
72+
return ApiResponse(true, 200, responses, null);
73+
}
74+
}
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
import 'dart:convert' as json;
2+
3+
import 'package:flutter_plugin_example/data/base/api_error.dart';
4+
import 'package:flutter_plugin_example/data/base/api_response.dart';
5+
import 'package:flutter_plugin_example/data/model/diet_plan.dart';
6+
import 'package:flutter_plugin_example/data/repositories/diet_plan/contract_provider_diet_plan.dart';
7+
import 'package:sembast/sembast.dart';
8+
9+
class DietPlanProviderDB implements DietPlanProviderContract {
10+
DietPlanProviderDB(this._db, this._store);
11+
12+
final Store _store;
13+
final Database _db;
14+
15+
@override
16+
Future<ApiResponse> add(DietPlan item) async {
17+
final Map<String, dynamic> values = convertItemToStorageMap(item);
18+
final Record recordToAdd = Record(_store, values, item.objectId);
19+
final Record recordFromDB = await _db.putRecord(recordToAdd);
20+
return ApiResponse(
21+
true, 200, convertRecordToItem(record: recordFromDB), null);
22+
}
23+
24+
@override
25+
Future<ApiResponse> addAll(List<DietPlan> items) async {
26+
final List<DietPlan> itemsInDb = List<DietPlan>();
27+
28+
for (final DietPlan item in items) {
29+
final ApiResponse response = await add(item);
30+
if (response.success) {
31+
final DietPlan itemInDB = response.result;
32+
itemsInDb.add(itemInDB);
33+
}
34+
}
35+
36+
if (itemsInDb.isEmpty) {
37+
return errorResponse;
38+
} else {
39+
return ApiResponse(true, 200, itemsInDb, null);
40+
}
41+
}
42+
43+
@override
44+
Future<ApiResponse> getAll() async {
45+
final List<DietPlan> foodItems = List<DietPlan>();
46+
47+
final List<SortOrder> sortOrders = List<SortOrder>();
48+
sortOrders.add(SortOrder(keyName));
49+
final Finder finder = Finder(sortOrders: sortOrders);
50+
final List<Record> records = await _store.findRecords(finder);
51+
52+
if (records.isNotEmpty) {
53+
for (final Record record in records) {
54+
final DietPlan userFood = convertRecordToItem(record: record);
55+
foodItems.add(userFood);
56+
}
57+
} else {
58+
return errorResponse;
59+
}
60+
61+
return ApiResponse(true, 200, foodItems, null);
62+
}
63+
64+
@override
65+
Future<ApiResponse> getById(String id) async {
66+
final Record record = await _store.getRecord(id);
67+
if (record != null) {
68+
final DietPlan userFood = convertRecordToItem(record: record);
69+
return ApiResponse(true, 200, userFood, null);
70+
} else {
71+
return errorResponse;
72+
}
73+
}
74+
75+
@override
76+
Future<ApiResponse> getNewerThan(DateTime date) async {
77+
final List<DietPlan> foodItems = List<DietPlan>();
78+
79+
final Finder finder = Finder(
80+
filter:
81+
Filter.greaterThan('keyUpdatedAt', date.millisecondsSinceEpoch));
82+
83+
final List<Record> records = await _store.findRecords(finder);
84+
85+
for (final Record record in records) {
86+
final DietPlan convertedDietPlan = convertRecordToItem(record: record);
87+
foodItems.add(convertedDietPlan);
88+
}
89+
90+
if (records == null) {
91+
return errorResponse;
92+
}
93+
94+
return ApiResponse(true, 200, foodItems, null);
95+
}
96+
97+
@override
98+
Future<ApiResponse> remove(DietPlan item) async {
99+
await _store.delete(item.objectId);
100+
return ApiResponse(true, 200, null, null);
101+
}
102+
103+
@override
104+
Future<ApiResponse> updateAll(List<DietPlan> items) async {
105+
final List<DietPlan> updatedItems = List<DietPlan>();
106+
107+
for (final DietPlan item in items) {
108+
final ApiResponse response = await update(item);
109+
if (response.success) {
110+
final DietPlan responseItem = response.result;
111+
updatedItems.add(responseItem);
112+
}
113+
}
114+
115+
if (updatedItems == null) {
116+
return errorResponse;
117+
}
118+
119+
return ApiResponse(true, 200, updatedItems, null);
120+
}
121+
122+
@override
123+
Future<ApiResponse> update(DietPlan item) async {
124+
final Map<String, dynamic> values = convertItemToStorageMap(item);
125+
final dynamic returnedItems = await _store.update(values, item.objectId);
126+
127+
if (returnedItems == null) {
128+
return add(item);
129+
}
130+
131+
return ApiResponse(
132+
true, 200, convertRecordToItem(values: returnedItems), null);
133+
}
134+
135+
Map<String, dynamic> convertItemToStorageMap(DietPlan item) {
136+
final Map<String, dynamic> values = Map<String, dynamic>();
137+
// ignore: invalid_use_of_protected_member
138+
values['value'] = json.jsonEncode(item.toJson(full: true));
139+
values['objectId'] = item.objectId;
140+
if (item.updatedAt != null) {
141+
values['updatedAt'] = item.updatedAt.millisecondsSinceEpoch;
142+
}
143+
144+
return values;
145+
}
146+
147+
DietPlan convertRecordToItem({Record record, Map<String, dynamic> values}) {
148+
try {
149+
values ??= record.value;
150+
final DietPlan item =
151+
DietPlan.clone().fromJson(json.jsonDecode(values['value']));
152+
return item;
153+
} catch (e) {
154+
return null;
155+
}
156+
}
157+
158+
static ApiError error = ApiError(1, 'No records found', false, '');
159+
ApiResponse errorResponse = ApiResponse(false, 1, null, error);
160+
}

0 commit comments

Comments
 (0)