6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit f3e8a3e0

AuthorMikkel Thygesen<mikkelet@gmail.com>
Date2026-03-10 11:45:28 +0100
Concierge payment: added subscription key

Changed files

common/pubspec.lock                                  | 20 ++++++++++----------
 .../booking_details/components/concierge_button.dart |  3 +++
 concierge/example/pubspec.lock                       | 20 ++++++++++----------
 .../lib/_generated/data/remote/models/order.g.dart   |  4 ++--
 .../hotel_overview_page_route.g.dart                 |  2 ++
 concierge/lib/concierge_app.dart                     | 18 ++++++++++++++----
 concierge/lib/concierge_route.dart                   | 15 +++++++++++++--
 .../secure_storage/concierge_secure_storage.dart     |  9 +++++++++
 .../lib/data/remote/api/concierge_interceptor.dart   |  2 +-
 .../lib/data/remote/api/payment_interceptor.dart     | 19 +++++++++++++++++++
 concierge/lib/data/remote/models/order.dart          |  4 ++--
 .../hotel_overview_page_route.dart                   |  8 +++++++-
 .../lib/presentation/components/add_card.dart        |  1 -
 .../lib/presentation/screens/payment_cards_page.dart |  1 -
 payment_plugin/pubspec.yaml                          |  1 +
 15 files changed, 93 insertions(+), 34 deletions(-)

Diff

diff --git a/common/pubspec.lock b/common/pubspec.lock
index b7997b32..b4f4869e 100644
--- a/common/pubspec.lock
+++ b/common/pubspec.lock
@@ -101,10 +101,10 @@ packages:
dependency: transitive
description:
name: characters
- sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
+ sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b
url: "https://pub.dev"
source: hosted
- version: "1.4.0"
+ version: "1.4.1"
checked_yaml:
dependency: transitive
description:
@@ -380,26 +380,26 @@ packages:
dependency: transitive
description:
name: matcher
- sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
+ sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6"
url: "https://pub.dev"
source: hosted
- version: "0.12.17"
+ version: "0.12.18"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
- sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
+ sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b"
url: "https://pub.dev"
source: hosted
- version: "0.11.1"
+ version: "0.13.0"
meta:
dependency: transitive
description:
name: meta
- sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
+ sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.dev"
source: hosted
- version: "1.16.0"
+ version: "1.17.0"
mime:
dependency: transitive
description:
@@ -545,10 +545,10 @@ packages:
dependency: transitive
description:
name: test_api
- sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00"
+ sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636"
url: "https://pub.dev"
source: hosted
- version: "0.7.6"
+ version: "0.7.9"
time:
dependency: transitive
description:
diff --git a/comwell_key_app/lib/presentation/screens/booking_details/components/concierge_button.dart b/comwell_key_app/lib/presentation/screens/booking_details/components/concierge_button.dart
index b1c6c872..a5073a15 100644
--- a/comwell_key_app/lib/presentation/screens/booking_details/components/concierge_button.dart
+++ b/comwell_key_app/lib/presentation/screens/booking_details/components/concierge_button.dart
@@ -1,10 +1,12 @@
import 'package:comwell_key_app/data/remote/msal_service.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
+import 'package:comwell_key_app/utils/env_utils.dart';
import 'package:comwell_key_app/utils/l10n_utils.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:concierge/flavors.dart';
import 'package:concierge/presentation/screens/hotel_overview_page/hotel_overview_page_route.dart';
import 'package:flutter/material.dart';
+import 'package:flutter_dotenv/flutter_dotenv.dart';
class ConciergeButton extends StatelessWidget {
final String hotelCode;
@@ -24,6 +26,7 @@ class ConciergeButton extends StatelessWidget {
hotelCode: hotelCode,
authToken: token,
flavor: F.appFlavor.name,
+ subKey: dotenv.OCP_APIM_SUBSCRIPTION_KEY
).push(context);
}
},
diff --git a/concierge/example/pubspec.lock b/concierge/example/pubspec.lock
index 7575931f..a73324fb 100644
--- a/concierge/example/pubspec.lock
+++ b/concierge/example/pubspec.lock
@@ -85,10 +85,10 @@ packages:
dependency: transitive
description:
name: characters
- sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
+ sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b
url: "https://pub.dev"
source: hosted
- version: "1.4.0"
+ version: "1.4.1"
checked_yaml:
dependency: transitive
description:
@@ -518,26 +518,26 @@ packages:
dependency: transitive
description:
name: matcher
- sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
+ sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6"
url: "https://pub.dev"
source: hosted
- version: "0.12.17"
+ version: "0.12.18"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
- sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
+ sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b"
url: "https://pub.dev"
source: hosted
- version: "0.11.1"
+ version: "0.13.0"
meta:
dependency: transitive
description:
name: meta
- sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
+ sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
url: "https://pub.dev"
source: hosted
- version: "1.16.0"
+ version: "1.17.0"
mime:
dependency: transitive
description:
@@ -890,10 +890,10 @@ packages:
dependency: transitive
description:
name: test_api
- sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00"
+ sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636"
url: "https://pub.dev"
source: hosted
- version: "0.7.6"
+ version: "0.7.9"
typed_data:
dependency: transitive
description:
diff --git a/concierge/lib/_generated/data/remote/models/order.g.dart b/concierge/lib/_generated/data/remote/models/order.g.dart
index 0d4a8c2f..740a2b05 100644
--- a/concierge/lib/_generated/data/remote/models/order.g.dart
+++ b/concierge/lib/_generated/data/remote/models/order.g.dart
@@ -71,11 +71,11 @@ Map<String, dynamic> _$OrderToJson(Order instance) => <String, dynamic>{
};
Customer _$CustomerFromJson(Map json) => Customer(
- id: (json['id'] as num).toInt(),
+ id: json['id'] as String,
firstName: json['first_name'] as String,
lastName: json['last_name'],
email: json['email'],
- isComwellClub: (json['is_comwell_club'] as num).toInt(),
+ isComwellClub: json['is_comwell_club'] as bool,
phone: json['phone'] as String,
phonePrefix: json['phone_prefix'] as String,
);
diff --git a/concierge/lib/_generated/presentation/screens/hotel_overview_page/hotel_overview_page_route.g.dart b/concierge/lib/_generated/presentation/screens/hotel_overview_page/hotel_overview_page_route.g.dart
index 6d278ff1..6f8f2418 100644
--- a/concierge/lib/_generated/presentation/screens/hotel_overview_page/hotel_overview_page_route.g.dart
+++ b/concierge/lib/_generated/presentation/screens/hotel_overview_page/hotel_overview_page_route.g.dart
@@ -19,6 +19,7 @@ mixin $HotelOverviewPageRoute on GoRouteData {
hotelCode: state.uri.queryParameters['hotel-code']!,
authToken: state.uri.queryParameters['auth-token']!,
flavor: state.uri.queryParameters['flavor']!,
+ subKey: state.uri.queryParameters['sub-key']!,
);
HotelOverviewPageRoute get _self => this as HotelOverviewPageRoute;
@@ -30,6 +31,7 @@ mixin $HotelOverviewPageRoute on GoRouteData {
'hotel-code': _self.hotelCode,
'auth-token': _self.authToken,
'flavor': _self.flavor,
+ 'sub-key': _self.subKey,
},
);
diff --git a/concierge/lib/concierge_app.dart b/concierge/lib/concierge_app.dart
index d8f207be..3c75e96e 100644
--- a/concierge/lib/concierge_app.dart
+++ b/concierge/lib/concierge_app.dart
@@ -31,14 +31,24 @@ class ConciergeApp extends StatelessWidget {
return flavor.name == this.flavor.toLowerCase();
});
final storage = ConciergeSecureStorage(FlutterSecureStorage());
- final dio = Dio(BaseOptions(baseUrl: F.baseUrl));
- dio.interceptors.addAll([
+ final conciergeDio = Dio(BaseOptions(baseUrl: F.baseUrl));
+ conciergeDio.interceptors.addAll([
ConciergeInterceptor(storage),
if (kDebugMode) PrettyDioLogger(requestBody: true, requestHeader: true),
]);
- await PaymentPlugin.initialize(config: PaymentConfig(dio: dio));
+ final apimDio = Dio(
+ BaseOptions(
+ baseUrl: "https://apim-comwell-net-services-stage.azure-api.net/api",
+ headers: {"Ocp-Apim-Subscription-Key": ""},
+ ),
+ );
+ apimDio.interceptors.addAll([
+ ConciergeInterceptor(storage),
+ if (kDebugMode) PrettyDioLogger(requestBody: true, requestHeader: true),
+ ]);
+ await PaymentPlugin.initialize(config: PaymentConfig(dio: apimDio));
await storage.setUserToken(authToken);
- return (ConciergeService(dio), storage);
+ return (ConciergeService(conciergeDio), storage);
}
@override
diff --git a/concierge/lib/concierge_route.dart b/concierge/lib/concierge_route.dart
index 0012ea7b..565345aa 100644
--- a/concierge/lib/concierge_route.dart
+++ b/concierge/lib/concierge_route.dart
@@ -1,3 +1,4 @@
+import 'package:concierge/data/remote/api/payment_interceptor.dart';
import 'package:concierge/presentation/app/cart_cubit.dart';
import 'package:concierge/presentation/app/concierge_cubit.dart';
import 'package:concierge/presentation/screens/confirm_order/confirm_order_route.dart';
@@ -23,7 +24,6 @@ import 'flavors.dart';
final conciergeShellRoute = StatefulShellRoute.indexedStack(
redirect: (context, state) {
- if (state.matchedLocation == "/exit") context.pop();
return null;
},
branches: [
@@ -43,9 +43,11 @@ final conciergeShellRoute = StatefulShellRoute.indexedStack(
Future<(ConciergeService, ConciergeSecureStorage)> getDependencies() async {
final flavorName = state.uri.queryParameters["flavor"].toString();
final authToken = state.uri.queryParameters["auth-token"].toString();
+ final subscriptionKey = state.uri.queryParameters["sub-key"].toString();
final storage = ConciergeSecureStorage(FlutterSecureStorage());
if (state.uri.queryParameters.isNotEmpty) {
await storage.setUserToken(authToken);
+ await storage.setSubscriptionKey(subscriptionKey);
F.appFlavor = Flavor.values.firstWhere((flavor) => flavor.name == flavorName);
}
final dio = Dio(BaseOptions(baseUrl: F.baseUrl));
@@ -53,7 +55,16 @@ final conciergeShellRoute = StatefulShellRoute.indexedStack(
ConciergeInterceptor(storage),
if (kDebugMode) PrettyDioLogger(requestBody: true, requestHeader: true),
]);
- await PaymentPlugin.initialize(config: PaymentConfig(dio: dio));
+ final apimDio = Dio(
+ BaseOptions(
+ baseUrl: "https://apim-comwell-net-services-stage.azure-api.net/api",
+ ),
+ );
+ apimDio.interceptors.addAll([
+ PaymentInterceptor(storage),
+ if (kDebugMode) PrettyDioLogger(requestBody: true, requestHeader: true),
+ ]);
+ await PaymentPlugin.initialize(config: PaymentConfig(dio: apimDio));
return (ConciergeService(dio), storage);
}
diff --git a/concierge/lib/data/local/secure_storage/concierge_secure_storage.dart b/concierge/lib/data/local/secure_storage/concierge_secure_storage.dart
index 47b6e80d..893cccf0 100644
--- a/concierge/lib/data/local/secure_storage/concierge_secure_storage.dart
+++ b/concierge/lib/data/local/secure_storage/concierge_secure_storage.dart
@@ -2,6 +2,7 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart';
class ConciergeSecureStorage {
static const _tokenKey = 'concierge_user_token';
+ static const _subscriptionKey = 'subscription_key';
final FlutterSecureStorage _storage;
@@ -15,6 +16,14 @@ class ConciergeSecureStorage {
return _storage.read(key: _tokenKey);
}
+ Future<void> setSubscriptionKey(String value) async {
+ await _storage.write(key: _subscriptionKey, value: value);
+ }
+
+ Future<String> getSubscriptionKey() async {
+ return await _storage.read(key: _subscriptionKey) ?? "";
+ }
+
Future<void> clearUserToken() async {
await _storage.delete(key: _tokenKey);
}
diff --git a/concierge/lib/data/remote/api/concierge_interceptor.dart b/concierge/lib/data/remote/api/concierge_interceptor.dart
index c41c84b8..a88847d8 100644
--- a/concierge/lib/data/remote/api/concierge_interceptor.dart
+++ b/concierge/lib/data/remote/api/concierge_interceptor.dart
@@ -10,7 +10,7 @@ class ConciergeInterceptor extends Interceptor {
void onRequest(RequestOptions options, RequestInterceptorHandler handler) async {
final token = await _conciergeSecureStorage.getUserToken();
if (token != null) {
- options.headers["Authorization"] = "Bearer $token";
+ options.headers["X-Authorization"] = token;
}
super.onRequest(options, handler);
}
diff --git a/concierge/lib/data/remote/api/payment_interceptor.dart b/concierge/lib/data/remote/api/payment_interceptor.dart
new file mode 100644
index 00000000..0708957f
--- /dev/null
+++ b/concierge/lib/data/remote/api/payment_interceptor.dart
@@ -0,0 +1,19 @@
+import 'package:concierge/data/local/secure_storage/concierge_secure_storage.dart';
+import 'package:dio/dio.dart';
+
+class PaymentInterceptor extends Interceptor {
+ final ConciergeSecureStorage _conciergeSecureStorage;
+
+ const PaymentInterceptor(this._conciergeSecureStorage);
+
+ @override
+ void onRequest(RequestOptions options, RequestInterceptorHandler handler) async {
+ final token = await _conciergeSecureStorage.getUserToken();
+ if (token != null) {
+ options.headers["Authorization"] = token;
+ }
+ options.headers["Ocp-Apim-Subscription-Key"] = await _conciergeSecureStorage
+ .getSubscriptionKey();
+ super.onRequest(options, handler);
+ }
+}
diff --git a/concierge/lib/data/remote/models/order.dart b/concierge/lib/data/remote/models/order.dart
index f7806701..248ead5a 100644
--- a/concierge/lib/data/remote/models/order.dart
+++ b/concierge/lib/data/remote/models/order.dart
@@ -73,11 +73,11 @@ class Order {
@JsonSerializable(fieldRename: FieldRename.snake)
class Customer {
- final int id;
+ final String id;
final String firstName;
final dynamic lastName;
final dynamic email;
- final int isComwellClub;
+ final bool isComwellClub;
final String phone;
final String phonePrefix;
diff --git a/concierge/lib/presentation/screens/hotel_overview_page/hotel_overview_page_route.dart b/concierge/lib/presentation/screens/hotel_overview_page/hotel_overview_page_route.dart
index 5673df61..d4a8148d 100644
--- a/concierge/lib/presentation/screens/hotel_overview_page/hotel_overview_page_route.dart
+++ b/concierge/lib/presentation/screens/hotel_overview_page/hotel_overview_page_route.dart
@@ -13,8 +13,14 @@ class HotelOverviewPageRoute extends GoRouteData with $HotelOverviewPageRoute {
final String hotelCode;
final String authToken;
final String flavor;
+ final String subKey;
- HotelOverviewPageRoute({required this.hotelCode, required this.authToken, required this.flavor});
+ HotelOverviewPageRoute({
+ required this.hotelCode,
+ required this.authToken,
+ required this.flavor,
+ required this.subKey,
+ });
@override
Page<void> buildPage(BuildContext context, GoRouterState state) {
diff --git a/payment_plugin/lib/presentation/components/add_card.dart b/payment_plugin/lib/presentation/components/add_card.dart
index 6683d00a..d1869f1d 100644
--- a/payment_plugin/lib/presentation/components/add_card.dart
+++ b/payment_plugin/lib/presentation/components/add_card.dart
@@ -1,6 +1,5 @@
import 'package:adyen_checkout/adyen_checkout.dart';
import 'package:common/localization/l10n_utils.dart';
-import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
diff --git a/payment_plugin/lib/presentation/screens/payment_cards_page.dart b/payment_plugin/lib/presentation/screens/payment_cards_page.dart
index 9d045d9e..fd62ad92 100644
--- a/payment_plugin/lib/presentation/screens/payment_cards_page.dart
+++ b/payment_plugin/lib/presentation/screens/payment_cards_page.dart
@@ -1,5 +1,4 @@
import 'package:common/localization/l10n_utils.dart';
-import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:payment_plugin/domain/models/stored_payment_method.dart';
diff --git a/payment_plugin/pubspec.yaml b/payment_plugin/pubspec.yaml
index 37f59e56..c28c8025 100644
--- a/payment_plugin/pubspec.yaml
+++ b/payment_plugin/pubspec.yaml
@@ -1,6 +1,7 @@
name: payment_plugin
description: "A new Flutter plugin project."
version: 0.0.1
+publish_to: none
environment:
sdk: ^3.8.1