summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/operations/tip.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-wallet-core/src/operations/tip.ts')
-rw-r--r--packages/taler-wallet-core/src/operations/tip.ts97
1 files changed, 83 insertions, 14 deletions
diff --git a/packages/taler-wallet-core/src/operations/tip.ts b/packages/taler-wallet-core/src/operations/tip.ts
index 70b595c2f..0bee2b406 100644
--- a/packages/taler-wallet-core/src/operations/tip.ts
+++ b/packages/taler-wallet-core/src/operations/tip.ts
@@ -87,21 +87,28 @@ const logger = new Logger("operations/tip.ts");
export function computeTipTransactionStatus(
tipRecord: TipRecord,
): TransactionState {
- if (tipRecord.pickedUpTimestamp) {
- return {
- major: TransactionMajorState.Done,
- };
- }
- if (tipRecord.acceptedTimestamp) {
- return {
- major: TransactionMajorState.Pending,
- minor: TransactionMinorState.Pickup,
- };
+ switch (tipRecord.status) {
+ case TipRecordStatus.Done:
+ return {
+ major: TransactionMajorState.Done,
+ };
+ case TipRecordStatus.Aborted:
+ return {
+ major: TransactionMajorState.Aborted,
+ };
+ case TipRecordStatus.PendingPickup:
+ return {
+ major: TransactionMajorState.Pending,
+ minor: TransactionMinorState.Pickup,
+ };
+ case TipRecordStatus.SuspendidPickup:
+ return {
+ major: TransactionMajorState.Pending,
+ minor: TransactionMinorState.User,
+ };
+ default:
+ assertUnreachable(tipRecord.status);
}
- return {
- major: TransactionMajorState.Pending,
- minor: TransactionMinorState.User,
- };
}
export async function prepareTip(
@@ -445,6 +452,7 @@ export async function suspendTipTransaction(
switch (tipRec.status) {
case TipRecordStatus.Done:
case TipRecordStatus.SuspendidPickup:
+ case TipRecordStatus.Aborted:
break;
case TipRecordStatus.PendingPickup:
newStatus = TipRecordStatus.SuspendidPickup;
@@ -492,11 +500,72 @@ export async function resumeTipTransaction(
let newStatus: TipRecordStatus | undefined = undefined;
switch (tipRec.status) {
case TipRecordStatus.Done:
+ break;
case TipRecordStatus.SuspendidPickup:
newStatus = TipRecordStatus.PendingPickup;
break;
case TipRecordStatus.PendingPickup:
break;
+ case TipRecordStatus.Aborted:
+ break;
+ default:
+ assertUnreachable(tipRec.status);
+ }
+ if (newStatus != null) {
+ const oldTxState = computeTipTransactionStatus(tipRec);
+ tipRec.status = newStatus;
+ const newTxState = computeTipTransactionStatus(tipRec);
+ await tx.tips.put(tipRec);
+ return {
+ oldTxState,
+ newTxState,
+ };
+ }
+ return undefined;
+ });
+ notifyTransition(ws, transactionId, transitionInfo);
+}
+
+export async function cancelAbortingTipTransaction(
+ ws: InternalWalletState,
+ walletTipId: string,
+): Promise<void> {
+ // We don't have an "aborting" state, so this should never happen!
+ throw Error("can't run cance-aborting on tip transaction");
+}
+
+export async function abortTipTransaction(
+ ws: InternalWalletState,
+ walletTipId: string,
+): Promise<void> {
+ const taskId = constructTaskIdentifier({
+ tag: PendingTaskType.TipPickup,
+ walletTipId,
+ });
+ const transactionId = constructTransactionIdentifier({
+ tag: TransactionType.Tip,
+ walletTipId,
+ });
+ stopLongpolling(ws, taskId);
+ const transitionInfo = await ws.db
+ .mktx((x) => [x.tips])
+ .runReadWrite(async (tx) => {
+ const tipRec = await tx.tips.get(walletTipId);
+ if (!tipRec) {
+ logger.warn(`transaction tip ${walletTipId} not found`);
+ return;
+ }
+ let newStatus: TipRecordStatus | undefined = undefined;
+ switch (tipRec.status) {
+ case TipRecordStatus.Done:
+ break;
+ case TipRecordStatus.SuspendidPickup:
+ newStatus = TipRecordStatus.Aborted;
+ break;
+ case TipRecordStatus.PendingPickup:
+ break;
+ case TipRecordStatus.Aborted:
+ break;
default:
assertUnreachable(tipRec.status);
}