Phase A: generierter Dart-Client + DI-Foundation für Rust-Backend

OpenAPI-Generator-Setup:
- tool/generate_api_client.sh: Direkter Aufruf der openapi-generator-cli.jar
  (Java-CLI statt Dart-build_runner-Integration — vermeidet die
  analyzer-/source_gen-Version-Hölle mit json_serializable)
- tool/fetch_openapi_generator.sh: lädt die JAR (29 MB) nach (gitignored)
- openapi/holzleitner.json: Snapshot der Backend-Spec für reproduzierbare
  Generation
- packages/holzleitner_api/: generiertes Dart-Sub-Package (built_value +
  dio), per path-dep im Haupt-pubspec eingehängt

Netzwerk-Layer (lib/data/network/):
- BackendConfig: API- und Keycloak-Endpoints für Local-Dev (localhost
  wegen Keycloak-iss-Claim).
- AuthTokenProvider-Schnittstelle.
- DevPasswordGrantTokenProvider: Phase-A-Provider via Keycloak
  password-grant, Token-Caching mit Expiry-Check (Phase B ersetzt das
  durch flutter_appauth PKCE).
- HolzleitnerAuthInterceptor: dynamischer Bearer-Inject pro Request.
- HolzleitnerApiFactory: baut die generierte HolzleitnerApi-Klasse
  mit unserem Interceptor statt der vier Default-Auth-Interceptors.
- network_locator.registerNetworking(): get_it-Setup, in main() vor
  runApp() aufgerufen.

Clean-Arch-Scaffolding (lib/data/, lib/domain/):
- Verzeichnisstruktur für Phase C+D angelegt (mapper/, repository/,
  entity/, repository/) — befüllt sich in den Folge-Phasen.

Smoke-Test:
- tool/smoke_test_api.dart ruft /health (ungeschützt) und /me/cars
  (mit Bearer) via generiertem Client — grün gegen lokales Backend.
This commit is contained in:
Dennis Nemec
2026-05-14 22:44:51 +02:00
parent 456fb59668
commit 8cf4045e44
222 changed files with 19350 additions and 0 deletions

View File

@ -0,0 +1,232 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'sync_delivery.dart';
// **************************************************************************
// BuiltValueGenerator
// **************************************************************************
class _$SyncDelivery extends SyncDelivery {
@override
final int belegartId;
@override
final String belegnummer;
@override
final Address customerAddress;
@override
final String customerName;
@override
final Address deliveryAddress;
@override
final String? desiredTime;
@override
final int erpCustomerId;
@override
final BuiltList<SyncDeliveryItem> items;
@override
final int sortOrder;
@override
final String? specialAgreements;
factory _$SyncDelivery([void Function(SyncDeliveryBuilder)? updates]) =>
(SyncDeliveryBuilder()..update(updates))._build();
_$SyncDelivery._(
{required this.belegartId,
required this.belegnummer,
required this.customerAddress,
required this.customerName,
required this.deliveryAddress,
this.desiredTime,
required this.erpCustomerId,
required this.items,
required this.sortOrder,
this.specialAgreements})
: super._();
@override
SyncDelivery rebuild(void Function(SyncDeliveryBuilder) updates) =>
(toBuilder()..update(updates)).build();
@override
SyncDeliveryBuilder toBuilder() => SyncDeliveryBuilder()..replace(this);
@override
bool operator ==(Object other) {
if (identical(other, this)) return true;
return other is SyncDelivery &&
belegartId == other.belegartId &&
belegnummer == other.belegnummer &&
customerAddress == other.customerAddress &&
customerName == other.customerName &&
deliveryAddress == other.deliveryAddress &&
desiredTime == other.desiredTime &&
erpCustomerId == other.erpCustomerId &&
items == other.items &&
sortOrder == other.sortOrder &&
specialAgreements == other.specialAgreements;
}
@override
int get hashCode {
var _$hash = 0;
_$hash = $jc(_$hash, belegartId.hashCode);
_$hash = $jc(_$hash, belegnummer.hashCode);
_$hash = $jc(_$hash, customerAddress.hashCode);
_$hash = $jc(_$hash, customerName.hashCode);
_$hash = $jc(_$hash, deliveryAddress.hashCode);
_$hash = $jc(_$hash, desiredTime.hashCode);
_$hash = $jc(_$hash, erpCustomerId.hashCode);
_$hash = $jc(_$hash, items.hashCode);
_$hash = $jc(_$hash, sortOrder.hashCode);
_$hash = $jc(_$hash, specialAgreements.hashCode);
_$hash = $jf(_$hash);
return _$hash;
}
@override
String toString() {
return (newBuiltValueToStringHelper(r'SyncDelivery')
..add('belegartId', belegartId)
..add('belegnummer', belegnummer)
..add('customerAddress', customerAddress)
..add('customerName', customerName)
..add('deliveryAddress', deliveryAddress)
..add('desiredTime', desiredTime)
..add('erpCustomerId', erpCustomerId)
..add('items', items)
..add('sortOrder', sortOrder)
..add('specialAgreements', specialAgreements))
.toString();
}
}
class SyncDeliveryBuilder
implements Builder<SyncDelivery, SyncDeliveryBuilder> {
_$SyncDelivery? _$v;
int? _belegartId;
int? get belegartId => _$this._belegartId;
set belegartId(int? belegartId) => _$this._belegartId = belegartId;
String? _belegnummer;
String? get belegnummer => _$this._belegnummer;
set belegnummer(String? belegnummer) => _$this._belegnummer = belegnummer;
AddressBuilder? _customerAddress;
AddressBuilder get customerAddress =>
_$this._customerAddress ??= AddressBuilder();
set customerAddress(AddressBuilder? customerAddress) =>
_$this._customerAddress = customerAddress;
String? _customerName;
String? get customerName => _$this._customerName;
set customerName(String? customerName) => _$this._customerName = customerName;
AddressBuilder? _deliveryAddress;
AddressBuilder get deliveryAddress =>
_$this._deliveryAddress ??= AddressBuilder();
set deliveryAddress(AddressBuilder? deliveryAddress) =>
_$this._deliveryAddress = deliveryAddress;
String? _desiredTime;
String? get desiredTime => _$this._desiredTime;
set desiredTime(String? desiredTime) => _$this._desiredTime = desiredTime;
int? _erpCustomerId;
int? get erpCustomerId => _$this._erpCustomerId;
set erpCustomerId(int? erpCustomerId) =>
_$this._erpCustomerId = erpCustomerId;
ListBuilder<SyncDeliveryItem>? _items;
ListBuilder<SyncDeliveryItem> get items =>
_$this._items ??= ListBuilder<SyncDeliveryItem>();
set items(ListBuilder<SyncDeliveryItem>? items) => _$this._items = items;
int? _sortOrder;
int? get sortOrder => _$this._sortOrder;
set sortOrder(int? sortOrder) => _$this._sortOrder = sortOrder;
String? _specialAgreements;
String? get specialAgreements => _$this._specialAgreements;
set specialAgreements(String? specialAgreements) =>
_$this._specialAgreements = specialAgreements;
SyncDeliveryBuilder() {
SyncDelivery._defaults(this);
}
SyncDeliveryBuilder get _$this {
final $v = _$v;
if ($v != null) {
_belegartId = $v.belegartId;
_belegnummer = $v.belegnummer;
_customerAddress = $v.customerAddress.toBuilder();
_customerName = $v.customerName;
_deliveryAddress = $v.deliveryAddress.toBuilder();
_desiredTime = $v.desiredTime;
_erpCustomerId = $v.erpCustomerId;
_items = $v.items.toBuilder();
_sortOrder = $v.sortOrder;
_specialAgreements = $v.specialAgreements;
_$v = null;
}
return this;
}
@override
void replace(SyncDelivery other) {
_$v = other as _$SyncDelivery;
}
@override
void update(void Function(SyncDeliveryBuilder)? updates) {
if (updates != null) updates(this);
}
@override
SyncDelivery build() => _build();
_$SyncDelivery _build() {
_$SyncDelivery _$result;
try {
_$result = _$v ??
_$SyncDelivery._(
belegartId: BuiltValueNullFieldError.checkNotNull(
belegartId, r'SyncDelivery', 'belegartId'),
belegnummer: BuiltValueNullFieldError.checkNotNull(
belegnummer, r'SyncDelivery', 'belegnummer'),
customerAddress: customerAddress.build(),
customerName: BuiltValueNullFieldError.checkNotNull(
customerName, r'SyncDelivery', 'customerName'),
deliveryAddress: deliveryAddress.build(),
desiredTime: desiredTime,
erpCustomerId: BuiltValueNullFieldError.checkNotNull(
erpCustomerId, r'SyncDelivery', 'erpCustomerId'),
items: items.build(),
sortOrder: BuiltValueNullFieldError.checkNotNull(
sortOrder, r'SyncDelivery', 'sortOrder'),
specialAgreements: specialAgreements,
);
} catch (_) {
late String _$failedField;
try {
_$failedField = 'customerAddress';
customerAddress.build();
_$failedField = 'deliveryAddress';
deliveryAddress.build();
_$failedField = 'items';
items.build();
} catch (e) {
throw BuiltValueNestedFieldError(
r'SyncDelivery', _$failedField, e.toString());
}
rethrow;
}
replace(_$result);
return _$result;
}
}
// ignore_for_file: deprecated_member_use_from_same_package,type=lint