From c48f5ef215ab9b24fc22178439248e6ebcafcdf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Mon, 6 Jul 2026 22:36:11 +0200 Subject: [PATCH] migrated feedback submission from the legacy `mhsl.eu` endpoint to the MarianumConnect API --- .../submit_feedback/submit_feedback.dart | 63 +++++++++++++++++++ .../mhsl/server/feedback/add_feedback.dart | 19 ------ .../server/feedback/add_feedback_params.dart | 22 ------- .../feedback/add_feedback_params.g.dart | 23 ------- .../pages/more/feedback/feedback_dialog.dart | 19 ++---- 5 files changed, 68 insertions(+), 78 deletions(-) create mode 100644 lib/api/marianumconnect/queries/submit_feedback/submit_feedback.dart delete mode 100644 lib/api/mhsl/server/feedback/add_feedback.dart delete mode 100644 lib/api/mhsl/server/feedback/add_feedback_params.dart delete mode 100644 lib/api/mhsl/server/feedback/add_feedback_params.g.dart diff --git a/lib/api/marianumconnect/queries/submit_feedback/submit_feedback.dart b/lib/api/marianumconnect/queries/submit_feedback/submit_feedback.dart new file mode 100644 index 0000000..e433a21 --- /dev/null +++ b/lib/api/marianumconnect/queries/submit_feedback/submit_feedback.dart @@ -0,0 +1,63 @@ +import 'dart:convert'; +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:dio/dio.dart'; +import 'package:package_info_plus/package_info_plus.dart'; + +import '../../errors/marianumconnect_error.dart'; +import '../../marianumconnect_api.dart'; +import '../../marianumconnect_endpoint.dart'; + +/// Submits user feedback to MarianumConnect (`POST me/feedback`, bearer-auth). +/// The optional screenshot is sent base64-encoded. Replaces the legacy mhsl.eu +/// `server/feedback` endpoint — the user no longer needs to be sent explicitly, +/// the bearer token identifies them. +class SubmitFeedback { + final Dio _dio; + + SubmitFeedback({Dio? dio}) : _dio = dio ?? MarianumConnectApi.dio(); + + Future run({ + required String message, + Uint8List? screenshot, + String screenshotContentType = 'image/png', + }) async { + try { + final package = await PackageInfo.fromPlatform(); + final screenshotBase64 = screenshot != null ? base64Encode(screenshot) : null; + await _dio.post( + MarianumConnectEndpoint.resolve('me/feedback'), + data: { + 'message': message, + 'screenshot': ?screenshotBase64, + 'screenshotContentType': screenshot != null ? screenshotContentType : null, + 'platform': _platform(), + 'appVersion': package.version, + 'appBuild': int.tryParse(package.buildNumber), + 'deviceModel': await _deviceModel(), + }, + ); + } on DioException catch (e) { + throw mapMarianumConnectError(e); + } + } + + static String? _platform() { + if (Platform.isAndroid) return 'android'; + if (Platform.isIOS) return 'ios'; + return null; + } + + static Future _deviceModel() async { + try { + final info = DeviceInfoPlugin(); + if (Platform.isAndroid) return (await info.androidInfo).model; + if (Platform.isIOS) return (await info.iosInfo).utsname.machine; + } catch (_) { + // Device-Plugin nicht verfügbar (z.B. Tests). + } + return null; + } +} diff --git a/lib/api/mhsl/server/feedback/add_feedback.dart b/lib/api/mhsl/server/feedback/add_feedback.dart deleted file mode 100644 index 7b8e0ff..0000000 --- a/lib/api/mhsl/server/feedback/add_feedback.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'dart:convert'; - -import 'package:http/http.dart'; -import 'package:http/http.dart' as http; - -import '../../mhsl_api.dart'; -import 'add_feedback_params.dart'; - -class AddFeedback extends MhslApi { - AddFeedbackParams params; - AddFeedback(this.params) : super('server/feedback'); - - @override - void assemble(String raw) {} - - @override - Future? request(Uri uri) => - http.post(uri, body: jsonEncode(params.toJson())); -} diff --git a/lib/api/mhsl/server/feedback/add_feedback_params.dart b/lib/api/mhsl/server/feedback/add_feedback_params.dart deleted file mode 100644 index 6e7df0e..0000000 --- a/lib/api/mhsl/server/feedback/add_feedback_params.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:json_annotation/json_annotation.dart'; - -part 'add_feedback_params.g.dart'; - -@JsonSerializable() -class AddFeedbackParams { - String user; - String feedback; - String? screenshot; - int appVersion; - - AddFeedbackParams({ - required this.user, - required this.feedback, - this.screenshot, - required this.appVersion, - }); - - factory AddFeedbackParams.fromJson(Map json) => - _$AddFeedbackParamsFromJson(json); - Map toJson() => _$AddFeedbackParamsToJson(this); -} diff --git a/lib/api/mhsl/server/feedback/add_feedback_params.g.dart b/lib/api/mhsl/server/feedback/add_feedback_params.g.dart deleted file mode 100644 index 747d43b..0000000 --- a/lib/api/mhsl/server/feedback/add_feedback_params.g.dart +++ /dev/null @@ -1,23 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'add_feedback_params.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -AddFeedbackParams _$AddFeedbackParamsFromJson(Map json) => - AddFeedbackParams( - user: json['user'] as String, - feedback: json['feedback'] as String, - screenshot: json['screenshot'] as String?, - appVersion: (json['appVersion'] as num).toInt(), - ); - -Map _$AddFeedbackParamsToJson(AddFeedbackParams instance) => - { - 'user': instance.user, - 'feedback': instance.feedback, - 'screenshot': instance.screenshot, - 'appVersion': instance.appVersion, - }; diff --git a/lib/view/pages/more/feedback/feedback_dialog.dart b/lib/view/pages/more/feedback/feedback_dialog.dart index a504ec1..b3d10f8 100644 --- a/lib/view/pages/more/feedback/feedback_dialog.dart +++ b/lib/view/pages/more/feedback/feedback_dialog.dart @@ -1,12 +1,8 @@ -import 'dart:convert'; import 'dart:typed_data'; import 'package:flutter/material.dart'; -import 'package:package_info_plus/package_info_plus.dart'; -import '../../../../api/mhsl/server/feedback/add_feedback.dart'; -import '../../../../api/mhsl/server/feedback/add_feedback_params.dart'; -import '../../../../model/account_data.dart'; +import '../../../../api/marianumconnect/queries/submit_feedback/submit_feedback.dart'; import '../../../../widget/async_action_button.dart'; import '../../../../widget/file_pick.dart'; import '../../../../widget/focus_behaviour.dart'; @@ -58,15 +54,10 @@ class _FeedbackDialogState extends State { setState(() => _textFieldEmpty = true); return; } - final info = await PackageInfo.fromPlatform(); - await AddFeedback( - AddFeedbackParams( - user: AccountData().getUserSecret(), - feedback: _feedbackInput.text, - screenshot: _image != null ? base64Encode(_image!) : null, - appVersion: int.parse(info.buildNumber), - ), - ).run(); + await SubmitFeedback().run( + message: _feedbackInput.text, + screenshot: _image, + ); if (!mounted) return; Navigator.of(context).pop(); InfoDialog.show(context, 'Danke für dein Feedback!');