commit c4a416fc79a9b1d1824e8bd2ff93393d4f5f8bd4
parent bd44affc75befed89360b6df1f1e6c751b2c9969
Author: Martin Schanzenbach <schanzen@gnunet.org>
Date: Tue, 27 Oct 2026 14:08:05 +0100
taldir: improve type handling and fix database txs
Diffstat:
4 files changed, 24 insertions(+), 13 deletions(-)
diff --git a/packages/taler-util/src/http-client/taldir.ts b/packages/taler-util/src/http-client/taldir.ts
@@ -23,12 +23,12 @@ import {
OperationOk,
RelativeTime,
TaldirAlreadyPaidResponse,
- TaldirMailboxDetailResponse,
+ TaldirDirectoryEntryResponse,
TalerDirectoryApi,
carefullyParseConfig,
codecForAny,
- codecForEmptyObject,
codecForTaldirAlreadyPaidResponse,
+ codecForTaldirDirectoryEntryResponse,
codecForTalerDirectoryConfigResponse,
opFixedSuccess,
opKnownHttpFailure,
@@ -106,8 +106,8 @@ export class TalerDirectoryInstanceHttpClient {
async lookupAlias(args: {
hAlias: string;
}): Promise<
- | OperationOk<TaldirMailboxDetailResponse>
- | OperationFail<HttpStatusCode.NotFound>
+ | OperationOk<TaldirDirectoryEntryResponse>
+ | OperationFail<HttpStatusCode.NotFound>
> {
const { hAlias: hAlias } = args;
const url = new URL(`${pathSegment(hAlias.toUpperCase())}`, this.baseUrl);
@@ -119,7 +119,7 @@ export class TalerDirectoryInstanceHttpClient {
switch (resp.status) {
case HttpStatusCode.Ok: {
- return opSuccessFromHttp(resp, codecForAny());
+ return opSuccessFromHttp(resp, codecForTaldirDirectoryEntryResponse());
}
case HttpStatusCode.NotFound: {
return opFixedSuccess(resp, {target_uri: ''});
diff --git a/packages/taler-util/src/types-taler-directory.ts b/packages/taler-util/src/types-taler-directory.ts
@@ -17,7 +17,7 @@
*/
import { codecForAmountString } from "./amounts.js";
-import { Codec, buildCodecForObject, codecForList } from "./codec.js";
+import { Codec, buildCodecForObject, codecForList, codecOptional } from "./codec.js";
import { codecForConstString, codecForString } from "./codec.js";
import { codecForDuration } from "./time.js";
import { AmountString, RelativeTime } from "./types-taler-common.js";
@@ -65,7 +65,7 @@ export interface TalerDirectoryConfigResponse {
monthly_fee: AmountString;
}
-export interface TaldirMailboxDetailResponse {
+export interface TaldirDirectoryEntryResponse {
// Target URI to associate with this alias.
target_uri: string;
@@ -73,6 +73,13 @@ export interface TaldirMailboxDetailResponse {
valid_for?: RelativeTime;
}
+export const codecForTaldirDirectoryEntryResponse =
+ (): Codec<TaldirDirectoryEntryResponse> =>
+ buildCodecForObject<TaldirDirectoryEntryResponse>()
+ .property("target_uri", codecForString())
+ .property("valid_for", codecOptional(codecForDuration))
+ .build("TalerDirectoryApi.TaldirDirectoryEntryResponse");
+
export interface TaldirAlreadyPaidResponse {
// The remaining duration for which this registration is still paid for
valid_for: RelativeTime;
@@ -81,5 +88,5 @@ export interface TaldirAlreadyPaidResponse {
export const codecForTaldirAlreadyPaidResponse =
(): Codec<TaldirAlreadyPaidResponse> =>
buildCodecForObject<TaldirAlreadyPaidResponse>()
- .property("valid_for", codecForDuration)
+ .property("valid_for", codecForDuration)
.build("TalerDirectoryApi.TaldirAlreadyPaidResponse");
diff --git a/packages/taler-util/src/types-taler-wallet.ts b/packages/taler-util/src/types-taler-wallet.ts
@@ -1818,7 +1818,7 @@ export const codecForContactEntry = (): Codec<ContactEntry> =>
.property("isSelf", codecOptional(codecForBoolean()))
.property("source", codecForString())
.property("petname", codecForString())
- .property("expiration", codecOptional(codecForAbsoluteTime))
+ .property("expiration", codecOptional(codecForTimestamp))
.build("ContactListItem");
export const codecForAddContactRequest = (): Codec<AddContactRequest> =>
@@ -2271,7 +2271,7 @@ export interface ContactEntry {
/**
* The soft expiration of this entry
*/
- expiration?: AbsoluteTime;
+ expiration?: Timestamp;
}
/**
diff --git a/packages/taler-wallet-core/src/db/sqlite/transaction.ts b/packages/taler-wallet-core/src/db/sqlite/transaction.ts
@@ -45,6 +45,7 @@ import {
MailboxConfiguration,
MailboxMessageRecord,
ScopeInfo,
+ TalerProtocolTimestamp,
} from "@gnu-taler/taler-util";
import {
checkExchangeInScopeGeneric,
@@ -4702,14 +4703,15 @@ export class SqliteWalletTransaction implements WalletDbTransaction {
async addContact(contact: ContactEntry): Promise<void> {
await this.run(
`INSERT INTO contacts (
- alias, alias_type, mailbox_base_uri, mailbox_address, source, petname, self
- ) VALUES ($alias, $type, $uri, $addr, $src, $pet, $self)
+ alias, alias_type, mailbox_base_uri, mailbox_address, source, petname, self, expiration
+ ) VALUES ($alias, $type, $uri, $addr, $src, $pet, $self, $exp)
ON CONFLICT(alias, alias_type) DO UPDATE SET
mailbox_base_uri = excluded.mailbox_base_uri,
mailbox_address = excluded.mailbox_address,
source = excluded.source,
petname = excluded.petname,
- self = excluded.self`,
+ self = excluded.self,
+ expiration = excluded.expiration`,
{
alias: contact.alias,
type: contact.aliasType,
@@ -4718,6 +4720,7 @@ export class SqliteWalletTransaction implements WalletDbTransaction {
src: contact.source,
pet: contact.petname,
self: boolToDb(contact.isSelf ?? false),
+ exp: timestampProtocolToDb(contact.expiration ?? TalerProtocolTimestamp.zero()),
},
);
}
@@ -4739,6 +4742,7 @@ export class SqliteWalletTransaction implements WalletDbTransaction {
source: str(row.source),
petname: str(row.petname),
self: dbToOptBool(row.self),
+ expiration: timestampProtocolFromDb(dbTimestamp(row.expiration)),
}));
}