integrate app with backend for auth, users, and products

This commit is contained in:
Mikkel Troels Kongsted 2025-03-13 13:22:56 +01:00
parent 7da92bb9a8
commit 70b8244e62
8 changed files with 45 additions and 38 deletions

View File

@ -38,18 +38,16 @@ class SessionController extends ChangeNotifier {
}
}
get sessionToken {
String? get sessionToken {
return _sessionToken;
}
Future<void> logout() async {
final token = _sessionToken;
if (token != null) {
server.logout(token);
await server.logout(token);
_sessionToken = null;
}
print(_sessionToken);
print("notifying listeners");
notifyListeners();
}

View File

@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:mobile/controllers/session.dart';
import 'package:mobile/models/user.dart';
import 'package:mobile/pages/dashboard.dart';
import 'package:mobile/pages/log_in_page.dart';
import 'package:mobile/controllers/add_to_cart_state.dart';
@ -11,7 +10,7 @@ import 'package:mobile/controllers/paying_state.dart';
import 'package:mobile/controllers/product.dart';
import 'package:mobile/controllers/receipt.dart';
import 'package:mobile/controllers/user.dart';
import 'package:mobile/server/mock_server.dart';
import 'package:mobile/server/backend_server.dart';
import 'package:provider/provider.dart';
import 'package:mobile/controllers/routing.dart';
@ -24,7 +23,7 @@ class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final server = MockServer();
final server = BackendServer();
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => RoutingController()),
@ -51,7 +50,9 @@ class MyApp extends StatelessWidget {
),
home: Consumer<SessionController>(
builder: (_, sessionController, __) {
if (sessionController.sessionToken is String) return Dashboard();
if (sessionController.sessionToken is String) {
return Dashboard();
}
return const LogInPage();
},
)),

View File

@ -21,7 +21,7 @@ class Product {
: id = json["id"],
name = json["name"],
description = json["description"],
priceInDkkCents = json["priceInDkkCents"],
priceInDkkCents = json["price_dkk_cent"],
location = null,
barcode = null;
barcode = json["barcode"];
}

View File

@ -16,10 +16,10 @@ class User {
});
User.fromJson(Map<String, dynamic> json)
: id = json["id"],
email = json["email"],
: email = json["email"],
id = json["id"],
name = json["name"],
balanceInDkkCents = json["balanceInDkkCents"];
balanceInDkkCents = json["balance_dkk_cent"];
void addBalanceFounds(int amount) {
balanceInDkkCents += amount;

View File

@ -27,6 +27,7 @@ class RegisterForm extends StatefulWidget {
class RegisterFormState extends State<RegisterForm> {
bool registerError = false;
String errorText = "Ingen fejlbesked jeg skal ikke vises";
@override
Widget build(BuildContext context) {
@ -43,7 +44,7 @@ class RegisterFormState extends State<RegisterForm> {
),
ErrorBox(
visible: registerError,
errorText: "Bruger med mailen ${mailController.text}",
errorText: errorText,
onClosePressed: () {
setState(() {
registerError = false;
@ -70,14 +71,18 @@ class RegisterFormState extends State<RegisterForm> {
placeholderText: "*********",
obscure: true),
PrimaryButton(
onPressed: () {
onPressed: () async {
final sessionsRepo = context.read<UsersController>();
if (sessionsRepo.register(nameController.text,
mailController.text, passwordController.text) is Ok) {
final res = await sessionsRepo.register(nameController.text,
mailController.text, passwordController.text);
if (res is Ok<Null, String>) {
setState(() => registerError = false);
Navigator.of(context).pop();
if (context.mounted) Navigator.of(context).pop();
} else {
setState(() => registerError = true);
setState(() {
registerError = true;
errorText = (res as Err<Null, String>).value;
});
}
},
child: const Text("Opret bruger")),

View File

@ -29,10 +29,10 @@ class SettingsPage extends StatelessWidget {
_Page(
icon: Icons.door_back_door,
title: "Log ud",
action: (context) {
action: (context) async {
final sessionsController = context.read<SessionController>();
Navigator.popUntil(context, (_) => false);
sessionsController.logout();
Navigator.pop(context);
await sessionsController.logout();
}),
];

View File

@ -6,7 +6,8 @@ import 'package:mobile/models/user.dart';
import 'package:mobile/server/server.dart';
class BackendServer implements Server {
final _apiUrl = "10.135.51.114:8080/api";
final _apiUrl = "http://192.168.1.128:8080/api";
// final _apiUrl = "http://127.0.0.1:8080/api";
Future<http.Response> _post(
{required String endpoint, required Map<String, dynamic> body}) async {
@ -26,10 +27,12 @@ class BackendServer implements Server {
)
.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());
data: (res["products"] as List<dynamic>)
.map(((product) => Product.fromJson(product)))
.toList());
} else {
return Error(message: res["msg"]);
}
}
@ -47,7 +50,7 @@ class BackendServer implements Server {
if (res["ok"]) {
return Success(data: null);
} else {
return Error(message: res["message"]);
return Error(message: res["msg"]);
}
}
@ -64,7 +67,7 @@ class BackendServer implements Server {
if (res["ok"]) {
return Success(data: res["token"]);
} else {
return Error(message: res["message"]);
return Error(message: res["msg"]);
}
}
@ -80,21 +83,21 @@ class BackendServer implements Server {
if (res["ok"]) {
return Success(data: null);
} else {
return Error(message: res["message"]);
return Error(message: res["msg"]);
}
}
@override
Future<Response<User>> sessionUser(String token) async {
final res = await http
.get(
Uri.parse("$_apiUrl/sessions/user/$token"),
)
.then((res) => json.decode(res.body));
("sending request fr with token $token");
final res = await http.get(
Uri.parse("$_apiUrl/sessions/user"),
headers: {"Session-Token": token},
).then((res) => json.decode(res.body));
if (res["ok"]) {
return Error(message: res["message"]);
return Success(data: User.fromJson(res["user"]));
} else {
return Success(data: User.fromJson(res));
return Error(message: res["msg"]);
}
}
@ -110,7 +113,7 @@ class BackendServer implements Server {
if (res["ok"]) {
return Success(data: null);
} else {
return Error(message: res["message"]);
return Error(message: res["msg"]);
}
}
}

View File

@ -24,7 +24,7 @@ class ErrorBox extends StatelessWidget {
),
child: Row(
children: [
const Text("Ugyldigt mail eller password"),
Text(errorText),
IconButton(onPressed: onClosePressed, icon: const Icon(Icons.close))
],
),