Add apikey ref + needed to test if ok get apikey after pin code

This commit is contained in:
Thomas Fransolet 2026-03-13 17:41:42 +01:00
parent 30d88df7b6
commit da6ff5177e
4 changed files with 37 additions and 9 deletions

View File

@ -17,6 +17,7 @@ class DatabaseHelper {
static final columnConfiguration = 'configuration'; static final columnConfiguration = 'configuration';
static final columnLanguage = 'language'; static final columnLanguage = 'language';
static final columnInstanceId = 'instanceId'; static final columnInstanceId = 'instanceId';
static final columnApiKey = 'apiKey';
DatabaseHelper._privateConstructor(); DatabaseHelper._privateConstructor();
static final DatabaseHelper instance = DatabaseHelper._privateConstructor(); static final DatabaseHelper instance = DatabaseHelper._privateConstructor();
@ -85,6 +86,13 @@ class DatabaseHelper {
Future<TabletAppContext?> getData() async { Future<TabletAppContext?> getData() async {
TabletAppContext? tabletAppContext; TabletAppContext? tabletAppContext;
final db = await instance.database;
// Migrate: add apiKey column if missing
final columns = await db.rawQuery("PRAGMA table_info($table)");
if (columns.where((c) => c['name'] == columnApiKey).isEmpty) {
await db.rawQuery("ALTER TABLE $table ADD $columnApiKey TEXT");
}
await DatabaseHelper.instance.queryAllRows().then((value) { await DatabaseHelper.instance.queryAllRows().then((value) {
value.forEach((element) { value.forEach((element) {
@ -99,7 +107,8 @@ class DatabaseHelper {
deviceId: element["deviceId"], deviceId: element["deviceId"],
host: element["host"], host: element["host"],
configuration: configuration, configuration: configuration,
language: element["language"] language: element["language"],
apiKey: element["apiKey"] as String?,
); );
}); });
}).catchError((error) { }).catchError((error) {

View File

@ -17,12 +17,13 @@ class TabletAppContext with ChangeNotifier{
String? language; String? language;
String? deviceId; String? deviceId;
String? instanceId; String? instanceId;
String? apiKey;
Size? puzzleSize; Size? puzzleSize;
String? localPath; String? localPath;
ApplicationInstanceDTO? applicationInstanceDTO; ApplicationInstanceDTO? applicationInstanceDTO;
StatisticsService? statisticsService; StatisticsService? statisticsService;
TabletAppContext({this.id, this.deviceId, this.host, this.configuration, this.language, this.instanceId, this.clientAPI}); TabletAppContext({this.id, this.deviceId, this.host, this.configuration, this.language, this.instanceId, this.apiKey, this.clientAPI});
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
return { return {
@ -31,7 +32,8 @@ class TabletAppContext with ChangeNotifier{
'host': host, 'host': host,
'configuration': configuration == null ? null : jsonEncode(configuration!.toJson()), 'configuration': configuration == null ? null : jsonEncode(configuration!.toJson()),
'language': language, 'language': language,
'instanceId': instanceId 'instanceId': instanceId,
'apiKey': apiKey,
}; };
} }
@ -42,7 +44,8 @@ class TabletAppContext with ChangeNotifier{
host: json['host'] as String, host: json['host'] as String,
configuration: json['configuration'] == null ? null : ConfigurationDTO.fromJson(json['configuration']), configuration: json['configuration'] == null ? null : ConfigurationDTO.fromJson(json['configuration']),
language: json['language'] as String, language: json['language'] as String,
instanceId: json['instanceId'] as String instanceId: json['instanceId'] as String,
apiKey: json['apiKey'] as String?,
); );
} }

View File

@ -23,7 +23,9 @@ import 'package:tablet_app/Screens/MainView/main_view.dart';
import 'package:tablet_app/app_context.dart'; import 'package:tablet_app/app_context.dart';
import 'package:tablet_app/client.dart'; import 'package:tablet_app/client.dart';
import 'package:tablet_app/constants.dart'; import 'package:tablet_app/constants.dart';
import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:http/http.dart' as http;
class ConfigViewWidget extends StatefulWidget { class ConfigViewWidget extends StatefulWidget {
@ -219,12 +221,16 @@ class _ConfigViewWidget extends State<ConfigViewWidget> {
fontSize: 16.0 fontSize: 16.0
); );
final apiKey = await _fetchAppKey(url, pinCode!);
final authenticatedClient = Client(url, apiKey: apiKey);
TabletAppContext? tabletAppContext = appContext.getContext(); TabletAppContext? tabletAppContext = appContext.getContext();
if(tabletAppContext == null) { if(tabletAppContext == null) {
tabletAppContext = new TabletAppContext(host: url, instanceId: instance.id); tabletAppContext = new TabletAppContext(host: url, instanceId: instance.id);
} }
tabletAppContext.instanceId = instance.id; tabletAppContext.instanceId = instance.id;
tabletAppContext.clientAPI = client; tabletAppContext.apiKey = apiKey;
tabletAppContext.clientAPI = authenticatedClient;
var identifier = kIsWeb ? "WEB TEST" : await DeviceInfoHelper.getDeviceDetails(); var identifier = kIsWeb ? "WEB TEST" : await DeviceInfoHelper.getDeviceDetails();
if(kIsWeb) { if(kIsWeb) {
@ -329,6 +335,17 @@ class _ConfigViewWidget extends State<ConfigViewWidget> {
} }
} }
Future<String?> _fetchAppKey(String baseUrl, String pinCode) async {
try {
final resp = await http.get(Uri.parse(
'$baseUrl/api/instance/app-key?pinCode=$pinCode&appType=TabletApp'));
if (resp.statusCode == 200) return jsonDecode(resp.body)['key'] as String?;
} catch (ex) {
print(ex);
}
return null;
}
Future<InstanceDTO?> getInstanceIdByPinCode(Client client, String pinCode) async { Future<InstanceDTO?> getInstanceIdByPinCode(Client client, String pinCode) async {
try { try {
var instance = await client.instanceApi!.instanceGetInstanceByPinCode(pinCode: pinCode); var instance = await client.instanceApi!.instanceGetInstanceByPinCode(pinCode: pinCode);

View File

@ -32,10 +32,9 @@ class Client {
StatsApi? _statsApi; StatsApi? _statsApi;
StatsApi? get statsApi => _statsApi; StatsApi? get statsApi => _statsApi;
Client(String path) { Client(String path, {String? apiKey}) {
_apiClient = ApiClient( _apiClient = ApiClient(basePath: path);
basePath: path); // "http://192.168.31.96" if (apiKey != null) _apiClient!.addDefaultHeader('X-Api-Key', apiKey);
//basePath: "https://localhost:44339");
_authenticationApi = AuthenticationApi(_apiClient); _authenticationApi = AuthenticationApi(_apiClient);
_instanceApi = InstanceApi(_apiClient); _instanceApi = InstanceApi(_apiClient);
_userApi = UserApi(_apiClient); _userApi = UserApi(_apiClient);