Add endpoints

This commit is contained in:
Inex Code 2022-12-27 08:13:07 +03:00
parent 8e44718def
commit acd1c379b1
7 changed files with 380 additions and 6 deletions

217
lib/logic/server_api.dart Normal file
View file

@ -0,0 +1,217 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:dio/adapter.dart';
import 'package:dio/dio.dart';
import 'package:selfprivacy/models/courier.dart';
import 'package:selfprivacy/models/order.dart';
import 'package:selfprivacy/models/item.dart';
class ApiResponse<D> {
ApiResponse({
required this.statusCode,
required this.data,
this.errorMessage,
});
final int statusCode;
final String? errorMessage;
final D data;
bool get isSuccess => statusCode >= 200 && statusCode < 300;
}
class ServerApi {
Future<Dio> getClient() async {
final Dio dio = Dio(await options);
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
(final HttpClient client) {
client.badCertificateCallback =
(final X509Certificate cert, final String host, final int port) =>
true;
return client;
};
dio.interceptors.add(
InterceptorsWrapper(
onError: (final DioError e, final ErrorInterceptorHandler handler) {
print(e.requestOptions.path);
print(e.requestOptions.data);
print(e.message);
print(e.response);
return handler.next(e);
},
),
);
return dio;
}
BaseOptions get options =>
BaseOptions(
baseUrl: 'http://10.100.0.6:8888/api/v1',
connectTimeout: 10000,
receiveTimeout: 10000,
);
ValidateStatus? validateStatus;
void close(final Dio client) {
client.close();
validateStatus = null;
}
Future<ApiResponse<List<Item>>> getItems() async {
final Dio client = await getClient();
final Response response = await client.get('/items');
final List<Item> items = (response.data as List)
.map((final dynamic e) => Item.fromJson(e as Map<String, dynamic>))
.toList();
return ApiResponse<List<Item>>(
statusCode: response.statusCode ?? 0,
data: items,
);
}
// Create an item
Future<ApiResponse<Item>> createItem(final Item item) async {
final Dio client = await getClient();
final Response response = await client.post('/items', data: item.toJson(),);
final Item createdItem = Item.fromJson(response.data as Map<String, dynamic>);
return ApiResponse<Item>(
statusCode: response.statusCode ?? 0,
data: createdItem,
);
}
// Update an item
Future<ApiResponse<Item>> updateItem(final Item item) async {
final Dio client = await getClient();
final Response response = await client.put('/items/${item.id}', data: {
'title': item.title,
'description': item.description,
'price': item.price,
},);
final Item updatedItem = Item.fromJson(response.data as Map<String, dynamic>);
return ApiResponse<Item>(
statusCode: response.statusCode ?? 0,
data: updatedItem,
);
}
// Delete an item
Future<ApiResponse<Item>> deleteItem(final Item item) async {
final Dio client = await getClient();
final Response response = await client.delete('/items/${item.id}');
final Item deletedItem = Item.fromJson(response.data as Map<String, dynamic>);
return ApiResponse<Item>(
statusCode: response.statusCode ?? 0,
data: deletedItem,
);
}
// Get a single item
Future<ApiResponse<Item>> getItem(final int id) async {
final Dio client = await getClient();
final Response response = await client.get('/items/$id');
final Item item = Item.fromJson(response.data as Map<String, dynamic>);
return ApiResponse<Item>(
statusCode: response.statusCode ?? 0,
data: item,
);
}
// Get all couriers
Future<ApiResponse<List<Courier>>> getCouriers() async {
final Dio client = await getClient();
final Response response = await client.get('/couriers');
final List<Courier> couriers = (response.data as List)
.map((final dynamic e) => Courier.fromJson(e as Map<String, dynamic>))
.toList();
return ApiResponse<List<Courier>>(
statusCode: response.statusCode ?? 0,
data: couriers,
);
}
// Add a courier
Future<ApiResponse<Courier>> addCourier(final Courier courier) async {
final Dio client = await getClient();
final Response response = await client.post('/couriers', data: courier.toJson(),);
final Courier createdCourier = Courier.fromJson(response.data as Map<String, dynamic>);
return ApiResponse<Courier>(
statusCode: response.statusCode ?? 0,
data: createdCourier,
);
}
// Update a courier
Future<ApiResponse<Courier>> updateCourier(final Courier courier) async {
final Dio client = await getClient();
final Response response = await client.put('/couriers/${courier.id}', data: courier.toJson(),);
final Courier updatedCourier = Courier.fromJson(response.data as Map<String, dynamic>);
return ApiResponse<Courier>(
statusCode: response.statusCode ?? 0,
data: updatedCourier,
);
}
// Get a single courier
Future<ApiResponse<Courier>> getCourier(final int id) async {
final Dio client = await getClient();
final Response response = await client.get('/couriers/$id');
final Courier courier = Courier.fromJson(response.data as Map<String, dynamic>);
return ApiResponse<Courier>(
statusCode: response.statusCode ?? 0,
data: courier,
);
}
// Get all orders
Future<ApiResponse<List<Order>>> getOrders() async {
final Dio client = await getClient();
final Response response = await client.get('/orders');
final List<Order> orders = (response.data as List)
.map((final dynamic e) => Order.fromJson(e as Map<String, dynamic>))
.toList();
return ApiResponse<List<Order>>(
statusCode: response.statusCode ?? 0,
data: orders,
);
}
// Get a single order
Future<ApiResponse<Order>> getOrder(final int id) async {
final Dio client = await getClient();
final Response response = await client.get('/orders/$id');
final Order order = Order.fromJson(response.data as Map<String, dynamic>);
return ApiResponse<Order>(
statusCode: response.statusCode ?? 0,
data: order,
);
}
// Create an order
Future<ApiResponse<Order>> createOrder(final Order order) async {
final Dio client = await getClient();
final Response response = await client.post('/orders', data: order.toJsonAsNew());
final Order createdOrder = Order.fromJson(response.data as Map<String, dynamic>);
return ApiResponse<Order>(
statusCode: response.statusCode ?? 0,
data: createdOrder,
);
}
// Update an order
Future<ApiResponse<Order>> updateOrder(final Order order) async {
final Dio client = await getClient();
final Response response = await client.put('/orders/${order.id}', data: order.toJson());
final Order updatedOrder = Order.fromJson(response.data as Map<String, dynamic>);
return ApiResponse<Order>(
statusCode: response.statusCode ?? 0,
data: updatedOrder,
);
}
}

View file

@ -1,4 +1,13 @@
class Courier { import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
part 'courier.g.dart';
@JsonSerializable()
class Courier extends Equatable {
factory Courier.fromJson(final Map<String, dynamic> json) =>
_$CourierFromJson(json);
Courier({ Courier({
required this.name, required this.name,
required this.surname, required this.surname,
@ -10,4 +19,15 @@ class Courier {
final String surname; final String surname;
final String phone; final String phone;
final int id; final int id;
// tojson
Map<String, dynamic> toJson() => _$CourierToJson(this);
@override
List<Object?> get props => [
name,
surname,
phone,
id,
];
} }

21
lib/models/courier.g.dart Normal file
View file

@ -0,0 +1,21 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'courier.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Courier _$CourierFromJson(Map<String, dynamic> json) => Courier(
name: json['name'] as String,
surname: json['surname'] as String,
id: json['id'] as int,
phone: json['phone'] as String,
);
Map<String, dynamic> _$CourierToJson(Courier instance) => <String, dynamic>{
'name': instance.name,
'surname': instance.surname,
'phone': instance.phone,
'id': instance.id,
};

View file

@ -1,13 +1,35 @@
class Item { import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
part 'item.g.dart';
@JsonSerializable()
class Item extends Equatable {
factory Item.fromJson(final Map<String, dynamic> json) =>
_$ItemFromJson(json);
Item({ Item({
required this.title, required this.title,
required this.description,
required this.id, required this.id,
required this.price, this.description,
this.price,
this.quantity,
}); });
final String title; final String title;
final String description; final String? description;
final int price; final int? price;
final int id; final int id;
final int? quantity;
// tojson
Map<String, dynamic> toJson() => _$ItemToJson(this);
@override
List<Object?> get props => [
title,
description,
price,
id,
quantity,
];
} }

23
lib/models/item.g.dart Normal file
View file

@ -0,0 +1,23 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'item.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Item _$ItemFromJson(Map<String, dynamic> json) => Item(
title: json['title'] as String,
id: json['id'] as int,
description: json['description'] as String?,
price: json['price'] as int?,
quantity: json['quantity'] as int?,
);
Map<String, dynamic> _$ItemToJson(Item instance) => <String, dynamic>{
'title': instance.title,
'description': instance.description,
'price': instance.price,
'id': instance.id,
'quantity': instance.quantity,
};

View file

@ -1,6 +1,13 @@
import 'package:equatable/equatable.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:selfprivacy/models/item.dart'; import 'package:selfprivacy/models/item.dart';
part 'order.g.dart';
@JsonSerializable()
class Order { class Order {
factory Order.fromJson(final Map<String, dynamic> json) =>
_$OrderFromJson(json);
Order({ Order({
required this.title, required this.title,
required this.description, required this.description,
@ -17,9 +24,13 @@ class Order {
final String title; final String title;
final String description; final String description;
@JsonKey(name: 'customer_name')
final String customerName; final String customerName;
@JsonKey(name: 'customer_phone')
final String customerPhone; final String customerPhone;
@JsonKey(name: 'order_date')
final String orderDate; final String orderDate;
@JsonKey(name: 'delivery_date')
final String deliveryDate; final String deliveryDate;
final String address; final String address;
final String status; final String status;
@ -27,4 +38,27 @@ class Order {
final int courierId; final int courierId;
final List<Item> items; final List<Item> items;
// tojson
Map<String, dynamic> toJson() => _$OrderToJson(this);
Map<String, dynamic> toJsonAsNew() {
final Map<String, dynamic> data = _$OrderToJson(this);
// To "order_in" goes everything except items
data['order_in'] = {
'title': data['title'],
'description': data['description'],
'customer_name': data['customer_name'],
'customer_phone': data['customer_phone'],
'order_date': data['order_date'],
'delivery_date': data['delivery_date'],
'address': data['address'],
'status': data['status'],
'courier_id': data['courier_id'],
};
// To "order_items" goes only items
data['order_items'] = data['items'];
// Remove items from data
data.remove('items');
return data;
}
} }

37
lib/models/order.g.dart Normal file
View file

@ -0,0 +1,37 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'order.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Order _$OrderFromJson(Map<String, dynamic> json) => Order(
title: json['title'] as String,
description: json['description'] as String,
id: json['id'] as int,
customerName: json['customer_name'] as String,
customerPhone: json['customer_phone'] as String,
orderDate: json['order_date'] as String,
deliveryDate: json['delivery_date'] as String,
address: json['address'] as String,
status: json['status'] as String,
courierId: json['courierId'] as int,
items: (json['items'] as List<dynamic>)
.map((e) => Item.fromJson(e as Map<String, dynamic>))
.toList(),
);
Map<String, dynamic> _$OrderToJson(Order instance) => <String, dynamic>{
'title': instance.title,
'description': instance.description,
'customer_name': instance.customerName,
'customer_phone': instance.customerPhone,
'order_date': instance.orderDate,
'delivery_date': instance.deliveryDate,
'address': instance.address,
'status': instance.status,
'id': instance.id,
'courierId': instance.courierId,
'items': instance.items,
};