feat(shopinbit): add pending payment persistence fields to schema
What changed, and why it matters
This commit adds three new data fields to the app's internal database and in-memory model for tracking pending car-research payments in a shopping feature. It is purely a schema and state-management change; no security-sensitive logic is introduced, and no vulnerability is visible in the diff.
No security action required. Treat as a normal feature/schema migration. If payment links are later displayed or opened, review that flow for URL validation and secure handling.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch extends the Isar collection schema for ShopInBitTicket and the corresponding ChangeNotifier model with: isPendingPayment (bool), carResearchExpiresAt (DateTime?), and carResearchPaymentLinks (String?). It updates generated serialization/deserialization code and bidirectional mapping between the model and the persisted ticket object. There is no input handling, authentication, authorization, cryptographic, or network code in the diff.
Changed components
lib/models/isar/models/shopinbit_ticket.dartlib/models/isar/models/shopinbit_ticket.g.dartlib/models/shopinbit/shopinbit_order_model.dartInspect captured patch +71 / −0
diff --git a/lib/models/isar/models/shopinbit_ticket.dart b/lib/models/isar/models/shopinbit_ticket.dart
index 4b571ec..0a2ac53 100644
--- a/lib/models/isar/models/shopinbit_ticket.dart
+++ b/lib/models/isar/models/shopinbit_ticket.dart
@@ -34,6 +34,11 @@ class ShopInBitTicket {
String? carResearchInvoiceId;
String? feeTicketNumber;
late bool needsCreateRequest;
+
+ // Car research resumable payment state
+ late bool isPendingPayment;
+ DateTime? carResearchExpiresAt;
+ String? carResearchPaymentLinks;
}
@embedded
diff --git a/lib/models/isar/models/shopinbit_ticket.g.dart b/lib/models/isar/models/shopinbit_ticket.g.dart
index bfc8bc9..ec4a963 100644
--- a/lib/models/isar/models/shopinbit_ticket.g.dart
+++ b/lib/models/isar/models/shopinbit_ticket.g.dart
@@ -121,6 +121,21 @@ const ShopInBitTicketSchema = CollectionSchema(
name: r'needsCreateRequest',
type: IsarType.bool,
),
+ r'isPendingPayment': PropertySchema(
+ id: 20,
+ name: r'isPendingPayment',
+ type: IsarType.bool,
+ ),
+ r'carResearchExpiresAt': PropertySchema(
+ id: 21,
+ name: r'carResearchExpiresAt',
+ type: IsarType.dateTime,
+ ),
+ r'carResearchPaymentLinks': PropertySchema(
+ id: 22,
+ name: r'carResearchPaymentLinks',
+ type: IsarType.string,
+ ),
},
estimateSize: _shopInBitTicketEstimateSize,
@@ -209,6 +224,12 @@ int _shopInBitTicketEstimateSize(
bytesCount += 3 + value.length * 3;
}
}
+ {
+ final value = object.carResearchPaymentLinks;
+ if (value != null) {
+ bytesCount += 3 + value.length * 3;
+ }
+ }
return bytesCount;
}
@@ -243,6 +264,9 @@ void _shopInBitTicketSerialize(
writer.writeString(offsets[17], object.carResearchInvoiceId);
writer.writeString(offsets[18], object.feeTicketNumber);
writer.writeBool(offsets[19], object.needsCreateRequest);
+ writer.writeBool(offsets[20], object.isPendingPayment);
+ writer.writeDateTime(offsets[21], object.carResearchExpiresAt);
+ writer.writeString(offsets[22], object.carResearchPaymentLinks);
}
ShopInBitTicket _shopInBitTicketDeserialize(
@@ -284,6 +308,9 @@ ShopInBitTicket _shopInBitTicketDeserialize(
object.carResearchInvoiceId = reader.readStringOrNull(offsets[17]);
object.feeTicketNumber = reader.readStringOrNull(offsets[18]);
object.needsCreateRequest = reader.readBool(offsets[19]);
+ object.isPendingPayment = reader.readBool(offsets[20]);
+ object.carResearchExpiresAt = reader.readDateTimeOrNull(offsets[21]);
+ object.carResearchPaymentLinks = reader.readStringOrNull(offsets[22]);
return object;
}
@@ -349,6 +376,12 @@ P _shopInBitTicketDeserializeProp<P>(
return (reader.readStringOrNull(offset)) as P;
case 19:
return (reader.readBool(offset)) as P;
+ case 20:
+ return (reader.readBool(offset)) as P;
+ case 21:
+ return (reader.readDateTimeOrNull(offset)) as P;
+ case 22:
+ return (reader.readStringOrNull(offset)) as P;
default:
throw IsarError('Unknown property with id $propertyId');
}
diff --git a/lib/models/shopinbit/shopinbit_order_model.dart b/lib/models/shopinbit/shopinbit_order_model.dart
index 1fe8c41..f41aa49 100644
--- a/lib/models/shopinbit/shopinbit_order_model.dart
+++ b/lib/models/shopinbit/shopinbit_order_model.dart
@@ -192,6 +192,33 @@ class ShopInBitOrderModel extends ChangeNotifier {
}
}
+ bool _isPendingPayment = false;
+ bool get isPendingPayment => _isPendingPayment;
+ set isPendingPayment(bool value) {
+ if (_isPendingPayment != value) {
+ _isPendingPayment = value;
+ notifyListeners();
+ }
+ }
+
+ DateTime? _carResearchExpiresAt;
+ DateTime? get carResearchExpiresAt => _carResearchExpiresAt;
+ set carResearchExpiresAt(DateTime? value) {
+ if (_carResearchExpiresAt != value) {
+ _carResearchExpiresAt = value;
+ notifyListeners();
+ }
+ }
+
+ String? _carResearchPaymentLinks;
+ String? get carResearchPaymentLinks => _carResearchPaymentLinks;
+ set carResearchPaymentLinks(String? value) {
+ if (_carResearchPaymentLinks != value) {
+ _carResearchPaymentLinks = value;
+ notifyListeners();
+ }
+ }
+
List<ShopInBitMessage> _messages = [];
List<ShopInBitMessage> get messages => List.unmodifiable(_messages);
void addMessage(ShopInBitMessage message) {
@@ -223,6 +250,9 @@ class ShopInBitOrderModel extends ChangeNotifier {
..carResearchInvoiceId = _carResearchInvoiceId
..feeTicketNumber = _feeTicketNumber
..needsCreateRequest = _needsCreateRequest
+ ..isPendingPayment = _isPendingPayment
+ ..carResearchExpiresAt = _carResearchExpiresAt
+ ..carResearchPaymentLinks = _carResearchPaymentLinks
..messages = _messages
.map(
(m) => ShopInBitTicketMessage()
@@ -254,6 +284,9 @@ class ShopInBitOrderModel extends ChangeNotifier {
.._carResearchInvoiceId = ticket.carResearchInvoiceId
.._feeTicketNumber = ticket.feeTicketNumber
.._needsCreateRequest = ticket.needsCreateRequest
+ .._isPendingPayment = ticket.isPendingPayment
+ .._carResearchExpiresAt = ticket.carResearchExpiresAt
+ .._carResearchPaymentLinks = ticket.carResearchPaymentLinks
.._messages = ticket.messages
.map(
(m) => ShopInBitMessage(
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.