server logic frontend

This commit is contained in:
Mikkel Troels Kongsted 2025-03-10 14:57:24 +01:00
parent 71e6c48cd5
commit f1321871c9
5 changed files with 108 additions and 10 deletions

View File

@ -16,6 +16,7 @@ void main() {
}
class MyApp extends StatelessWidget {
final apiUrl = "10.135.51.114:8080/api";
const MyApp({super.key});
@override

View File

@ -1,10 +1,9 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:mobile/models/coordinate.dart';
import 'package:mobile/models/product.dart';
import 'package:mobile/results.dart';
import 'package:mobile/server/client.dart';
import 'package:mobile/server/server.dart';
class ProductRepo extends ChangeNotifier {
int _nextId = 0;
@ -141,7 +140,7 @@ class ProductRepo extends ChangeNotifier {
}
class ProductRepoByServer extends ChangeNotifier {
String apiUrl = "http://127.0.0.1:8080/products.json";
final client = BackendServer();
List<Product> products = [];
String query = "";
ProductRepoByServer() {
@ -149,12 +148,11 @@ class ProductRepoByServer extends ChangeNotifier {
}
Future<void> fetchProductsFromServer() async {
final res = await http.get(
Uri.parse(apiUrl),
);
final productsJson = List<Map<String, dynamic>>.from(jsonDecode(res.body));
products =
productsJson.map(((product) => Product.fromJson(product))).toList();
final res = client.allProducts();
if (res is Error) {
return;
}
products = (res as Success<List<Product>>).data;
notifyListeners();
}

View File

View File

@ -0,0 +1,70 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:mobile/models/product.dart';
import 'package:mobile/server/server.dart';
class BackendServer implements Server {
final _apiUrl = "10.135.51.114:8080/api";
Future<http.Response> _post(
{required String endpoint, required Map<String, dynamic> body}) async {
final encoded = json.encode(body);
return await http.post(
Uri.parse("$_apiUrl/$endpoint"),
body: encoded,
headers: {"Content-Type": "application/json"},
);
}
@override
Future<Response<List<Product>>> allProducts() async {
final res = await http
.get(
Uri.parse("$_apiUrl/products/all"),
)
.then((res) => json.decode(res.body));
if (res["ok"]) {
return Error(message: res["message"]);
} else {
return Success(
data: res.map(((product) => Product.fromJson(product))).toList());
}
}
@override
Future<Response<Null>> register(
String name,
String email,
String password,
) async {
final res = await _post(
endpoint: "users/register",
body: {"name": name, "email": email, "password": password},
).then((res) => json.decode(res.body));
if (res["ok"]) {
return Success(data: null);
} else {
return Error(message: res["message"]);
}
}
@override
Future<Response<Null>> login(
String name,
String email,
String password,
) async {
final res = await _post(
endpoint: "auth/login",
body: {"email": email, "password": password},
).then((res) => json.decode(res.body));
if (res["ok"]) {
return Success(data: null);
} else {
return Error(message: res["message"]);
}
}
}

View File

@ -0,0 +1,29 @@
import 'package:mobile/models/product.dart';
abstract class Server {
Future<Response<List<Product>>> allProducts();
Future<Response<Null>> register(
String name,
String email,
String password,
);
Future<Response<Null>> login(
String name,
String email,
String password,
);
}
sealed class Response<Data> {}
class Success<Data> extends Response<Data> {
Data data;
Success({required this.data});
}
class Error<Data> extends Response<Data> {
String message;
Error({required this.message});
}