228 lines
5.4 KiB
Dart
228 lines
5.4 KiB
Dart
import 'dart:convert';
|
|
import 'package:http/http.dart' as http;
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
class API {
|
|
late SharedPreferences pref;
|
|
static final API _instance = API._internal();
|
|
|
|
factory API() {
|
|
return _instance;
|
|
}
|
|
|
|
API._internal();
|
|
|
|
Future<void> init() async {
|
|
pref = await SharedPreferences.getInstance();
|
|
instance = pref.getString("instance") ?? "";
|
|
}
|
|
|
|
bool isInit() {
|
|
return pref.containsKey("token") && pref.containsKey("instance");
|
|
}
|
|
|
|
void save(String instance, String token) {
|
|
pref.setString("instance", instance);
|
|
pref.setString("token", token);
|
|
this.instance = instance;
|
|
}
|
|
|
|
// todo : rework with auth
|
|
String instance = "";
|
|
|
|
Future<String> getRequest(String url) async {
|
|
var resp = await http.get(Uri.parse(url), headers: <String, String>{
|
|
'Access-Control-Allow-Origin': '*',
|
|
'Token': pref.getString("token")!
|
|
});
|
|
|
|
return resp.body;
|
|
}
|
|
|
|
Future<String> postRequest(String url, Map<String, dynamic> data) async {
|
|
var resp = await http.post(Uri.parse(url),
|
|
headers: <String, String>{
|
|
'Access-Control-Allow-Origin': '*',
|
|
'Content-Type': 'application/json',
|
|
'Token': pref.getString("token")!
|
|
},
|
|
body: jsonEncode(data));
|
|
|
|
return resp.body;
|
|
}
|
|
|
|
Future<List<dynamic>> getItems() async {
|
|
var resp = jsonDecode(await getRequest("$instance/items"));
|
|
var lst = resp["items"];
|
|
return lst as List<dynamic>;
|
|
}
|
|
|
|
Future<List<String>> getUniqueField(
|
|
String item, String variant, String field) async {
|
|
var resp = jsonDecode(
|
|
await getRequest("$instance/item/$item/$variant/unique?field=$field"));
|
|
List<String> ret = [];
|
|
|
|
for (var e in resp as List<dynamic>) {
|
|
ret.add(e);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
Future<List<dynamic>> getLocations() async {
|
|
var resp = jsonDecode(await getRequest("$instance/locations"));
|
|
return resp as List<dynamic>;
|
|
}
|
|
|
|
Future<Item> getItem(String item) async {
|
|
return Item(jsonDecode(await getRequest("$instance/item/$item")));
|
|
}
|
|
|
|
Future<Transaction> getTransaction(String id) async {
|
|
return Transaction(
|
|
jsonDecode(await getRequest("$instance/transaction/$id")));
|
|
}
|
|
|
|
Future<List<Transaction>> getInventory(String item) async {
|
|
var resp = jsonDecode(await getRequest("$instance/item/$item/inventory"))
|
|
as List<dynamic>;
|
|
|
|
return resp.map((x) => Transaction(x)).toList();
|
|
}
|
|
|
|
Future<List<Transaction>> getInventoryOfVariant(
|
|
String item, String variant) async {
|
|
var resp =
|
|
jsonDecode(await getRequest("$instance/item/$item/$variant/inventory"))
|
|
as List<dynamic>;
|
|
|
|
return resp.map((x) => Transaction(x)).toList();
|
|
}
|
|
|
|
Future<String> supplyItem(String item, String variant, String price,
|
|
String? origin, String? location) async {
|
|
if (origin!.isEmpty) {
|
|
origin = null;
|
|
}
|
|
|
|
if (location!.isEmpty) {
|
|
location = null;
|
|
}
|
|
|
|
var req = await postRequest("$instance/supply", {
|
|
"item": item,
|
|
"variant": variant,
|
|
"price": price,
|
|
"origin": origin,
|
|
"location": location
|
|
});
|
|
var resp = jsonDecode(req);
|
|
print(resp);
|
|
|
|
return resp["uuid"];
|
|
}
|
|
|
|
Future<void> consumeItem(
|
|
String transaction, String destination, String price) async {
|
|
await postRequest("$instance/demand",
|
|
{"uuid": transaction, "destination": destination, "price": price});
|
|
}
|
|
|
|
Future<ItemVariantStat> getStat(String item, String variant) async {
|
|
return ItemVariantStat(
|
|
jsonDecode(await getRequest("$instance/item/$item/$variant/stat")));
|
|
}
|
|
|
|
String getImageURL(String item) {
|
|
return "$instance/$item/image";
|
|
}
|
|
}
|
|
|
|
class Item {
|
|
late String id;
|
|
late String name;
|
|
late String category;
|
|
late Map<String, ItemVariant> variants;
|
|
|
|
Item(Map<String, dynamic> json) {
|
|
id = json["uuid"];
|
|
name = json["name"];
|
|
category = json["category"];
|
|
variants = <String, ItemVariant>{};
|
|
|
|
json["variants"].forEach((key, value) {
|
|
variants[key] = ItemVariant(value);
|
|
});
|
|
}
|
|
}
|
|
|
|
class ItemVariant {
|
|
late String item;
|
|
late String variant;
|
|
late String name;
|
|
int? min;
|
|
int? expiry;
|
|
|
|
ItemVariant(Map<String, dynamic> json) {
|
|
item = json["item"];
|
|
variant = json["variant"];
|
|
name = json["name"];
|
|
min = json["min"];
|
|
expiry = json["expiry"];
|
|
}
|
|
}
|
|
|
|
class Price {
|
|
late double value;
|
|
late String currency;
|
|
|
|
Price(Map<String, dynamic> json) {
|
|
value = json["value"];
|
|
currency = json["currency"];
|
|
}
|
|
}
|
|
|
|
class Transaction {
|
|
late String uuid;
|
|
late String item;
|
|
late String variant;
|
|
late Price price;
|
|
late String? origin;
|
|
late int timestamp;
|
|
late ConsumeInfo? consumed;
|
|
late bool expired;
|
|
|
|
Transaction(Map<String, dynamic> json) {
|
|
uuid = json["uuid"];
|
|
item = json["item"];
|
|
variant = json["variant"];
|
|
price = Price(json["price"]);
|
|
origin = json["origin"];
|
|
timestamp = json["timestamp"];
|
|
expired = json["expired"];
|
|
consumed = json["consumed"] != null ? ConsumeInfo(json["consumed"]) : null;
|
|
}
|
|
}
|
|
|
|
class ConsumeInfo {
|
|
late String destination;
|
|
late Price price;
|
|
late int timestamp;
|
|
|
|
ConsumeInfo(Map<String, dynamic> json) {
|
|
destination = json["destination"];
|
|
price = Price(json["price"]);
|
|
timestamp = json["timestamp"];
|
|
}
|
|
}
|
|
|
|
class ItemVariantStat {
|
|
late int amount;
|
|
late double total_price;
|
|
|
|
ItemVariantStat(Map<String, dynamic> json) {
|
|
amount = json["amount"];
|
|
total_price = json["total_price"];
|
|
}
|
|
}
|