Skip to content

Commit

Permalink
chore(backend): format
Browse files Browse the repository at this point in the history
  • Loading branch information
golobitch committed Mar 1, 2025
1 parent eeb1f4c commit 6f72bf7
Show file tree
Hide file tree
Showing 9 changed files with 79 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@
* @returns { Promise<void> }
*/
exports.up = function (knex) {
return knex.schema.alterTable('walletAddresses', (table) => {
table.renameColumn('url', 'address')
})
return knex.schema.alterTable('walletAddresses', (table) => {
table.renameColumn('url', 'address')
})
}

/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.down = function (knex) {
return knex.schema.alterTable('walletAddresses', (table) => {
table.renameColumn('address', 'url')
})
return knex.schema.alterTable('walletAddresses', (table) => {
table.renameColumn('address', 'url')
})
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@
* @returns { Promise<void> }
*/
exports.up = function (knex) {
return knex.schema.alterTable('tenantSettings', function(table) {
table.unique(['tenantId', 'key']);
});
return knex.schema.alterTable('tenantSettings', function (table) {
table.unique(['tenantId', 'key'])
})
}

/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.down = function (knex) {
return knex.schema.alterTable('tenantSettings', function(table) {
table.dropUnique(['tenantId', 'key']);
});
return knex.schema.alterTable('tenantSettings', function (table) {
table.dropUnique(['tenantId', 'key'])
})
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export enum WalletAddressError {
UnknownAsset = 'UnknownAsset',
UnknownWalletAddress = 'UnknownWalletAddress',
DuplicateWalletAddress = 'DuplicateWalletAddress',
WalletAddressSettingNotFound = 'WalletAddressSettingNotFound',
WalletAddressSettingNotFound = 'WalletAddressSettingNotFound'
}

// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
Expand Down
50 changes: 28 additions & 22 deletions packages/backend/src/open_payments/wallet_address/service.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ describe('Open Payments Wallet Address Service', (): void => {
})

describe('Create or Get Wallet Address3', (): void => {
let tenantId: string;
let tenantId: string
let options: CreateOptions

beforeEach(async (): Promise<void> => {
Expand All @@ -70,7 +70,10 @@ describe('Open Payments Wallet Address Service', (): void => {
await createTenantSettings(deps, {
tenantId: tenantId,
setting: [
{ key: TenantSettingKeys.WALLET_ADDRESS_URL.name, value: 'https://alice.me' }
{
key: TenantSettingKeys.WALLET_ADDRESS_URL.name,
value: 'https://alice.me'
}
]
})

Expand Down Expand Up @@ -101,28 +104,31 @@ describe('Open Payments Wallet Address Service', (): void => {
)

test.each`
setting | address | generated
${'https://alice.me/ilp'} | ${'https://alice.me/ilp/test'} | ${'https://alice.me/ilp/test'}
${'https://alice.me/ilp'} | ${'test'} | ${'https://alice.me/ilp/test'}
${'https://alice.me/ilp'} | ${'/test'} | ${'https://alice.me/ilp/test'}
${'https://alice.me/ilp/'} | ${'test'} | ${'https://alice.me/ilp/test'}
${'https://alice.me/ilp/'} | ${'/test'} | ${'https://alice.me/ilp/test'}
`('should create address $generated with address $address and setting $setting', async ({ setting, address, generated }): Promise<void> => {
await createTenantSettings(deps, {
tenantId: tenantId,
setting: [
{ key: TenantSettingKeys.WALLET_ADDRESS_URL.name, value: setting }
]
})
setting | address | generated
${'https://alice.me/ilp'} | ${'https://alice.me/ilp/test'} | ${'https://alice.me/ilp/test'}
${'https://alice.me/ilp'} | ${'test'} | ${'https://alice.me/ilp/test'}
${'https://alice.me/ilp'} | ${'/test'} | ${'https://alice.me/ilp/test'}
${'https://alice.me/ilp/'} | ${'test'} | ${'https://alice.me/ilp/test'}
${'https://alice.me/ilp/'} | ${'/test'} | ${'https://alice.me/ilp/test'}
`(
'should create address $generated with address $address and setting $setting',
async ({ setting, address, generated }): Promise<void> => {
await createTenantSettings(deps, {
tenantId: tenantId,
setting: [
{ key: TenantSettingKeys.WALLET_ADDRESS_URL.name, value: setting }
]
})

const walletAddress = await walletAddressService.create({
...options,
address
})
const walletAddress = await walletAddressService.create({
...options,
address
})

assert.ok(!isWalletAddressError(walletAddress))
expect(walletAddress.address).toEqual(generated)
})
assert.ok(!isWalletAddressError(walletAddress))
expect(walletAddress.address).toEqual(generated)
}
)

test('Cannot create wallet address with unknown asset', async (): Promise<void> => {
await expect(
Expand Down
33 changes: 17 additions & 16 deletions packages/backend/src/open_payments/wallet_address/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -170,37 +170,38 @@ async function createWalletAddress(
deps: ServiceDependencies,
options: CreateOptions
): Promise<WalletAddress | WalletAddressError> {
const found = await deps.tenantSettingService.get({
const found = (await deps.tenantSettingService.get({
tenantId: options.tenantId,
key: TenantSettingKeys.WALLET_ADDRESS_URL.name
}) as TenantSetting[];
})) as TenantSetting[]

if (!found || found.length === 0) {
return WalletAddressError.WalletAddressSettingNotFound;
return WalletAddressError.WalletAddressSettingNotFound
}

const tenantWalletAddressUrl = new URL(found[0].value);
let tenantBaseUrl = tenantWalletAddressUrl.toString();
const tenantWalletAddressUrl = new URL(found[0].value)

let tenantBaseUrl = tenantWalletAddressUrl.toString()
if (!tenantWalletAddressUrl.pathname.endsWith('/')) {
tenantBaseUrl = tenantWalletAddressUrl.origin + tenantWalletAddressUrl.pathname + '/'
tenantBaseUrl =
tenantWalletAddressUrl.origin + tenantWalletAddressUrl.pathname + '/'
}

const isValidUrl = (str: string): boolean => {
try {
new URL(str);
return true;
new URL(str)
return true
} catch {
return false;
return false
}
};
}

let finalWalletAddressUrl: string;
let finalWalletAddressUrl: string
if (isValidUrl(options.address)) {
// in case that client provided full url, verify that it starts with the tenant's URL
const walletAddressUrl = new URL(options.address);
const walletAddressUrl = new URL(options.address)
if (!walletAddressUrl.href.startsWith(tenantWalletAddressUrl.href)) {
return WalletAddressError.InvalidUrl;
return WalletAddressError.InvalidUrl
}
finalWalletAddressUrl = walletAddressUrl.toString()
} else {
Expand All @@ -212,10 +213,10 @@ async function createWalletAddress(
}
finalWalletAddressUrl = tenantBaseUrl + relativePath
} catch (err) {
return WalletAddressError.InvalidUrl;
return WalletAddressError.InvalidUrl
}
}

if (!isValidWalletAddressUrl(finalWalletAddressUrl)) {
return WalletAddressError.InvalidUrl
}
Expand Down
5 changes: 4 additions & 1 deletion packages/backend/src/tenants/service.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,10 @@ describe('Tenant Service', (): void => {
idpConsentUrl: faker.internet.url(),
idpSecret: 'test-idp-secret',
settings: [
{ key: TenantSettingKeys.WALLET_ADDRESS_URL.name, value: walletAddressUrl }
{
key: TenantSettingKeys.WALLET_ADDRESS_URL.name,
value: walletAddressUrl
}
]
}

Expand Down
18 changes: 12 additions & 6 deletions packages/backend/src/tenants/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@ async function createTenant(
): Promise<Tenant> {
const trx = await deps.knex.transaction()
try {
const { email, apiSecret, publicName, idpSecret, idpConsentUrl, settings } = options
const { email, apiSecret, publicName, idpSecret, idpConsentUrl, settings } =
options
const tenant = await Tenant.query(trx).insertAndFetch({
email,
publicName,
Expand All @@ -99,13 +100,18 @@ async function createTenant(
idpConsentUrl
})

const createInitialTenantSettingsOptions = { tenantId: tenant.id, setting: TenantSetting.default() } ;
const createInitialTenantSettingsOptions = {
tenantId: tenant.id,
setting: TenantSetting.default()
}
if (settings) {
createInitialTenantSettingsOptions.setting = createInitialTenantSettingsOptions.setting.concat(settings)
createInitialTenantSettingsOptions.setting =
createInitialTenantSettingsOptions.setting.concat(settings)
}

await deps.tenantSettingService.create(createInitialTenantSettingsOptions, { trx }
)

await deps.tenantSettingService.create(createInitialTenantSettingsOptions, {
trx
})

await trx.commit()

Expand Down
5 changes: 2 additions & 3 deletions packages/backend/src/tenants/settings/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,12 +129,11 @@ async function createTenantSetting(
return []
}

return TenantSetting
.query(extra?.trx ?? deps.knex)
return TenantSetting.query(extra?.trx ?? deps.knex)
.insert(dataToUpsert)
.onConflict(['tenantId', 'key'])
.merge()
.returning('*');
.returning('*')
}

async function getTenantSettingPageForTenant(
Expand Down
4 changes: 3 additions & 1 deletion packages/backend/src/tests/walletAddress.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ export async function createWalletAddress(
assetId:
options.assetId || (await createAsset(deps, undefined, tenantIdToUse)).id,
tenantId: tenantIdToUse,
address: options.address || `https://${faker.internet.domainName()}/.well-known/pay`
address:
options.address ||
`https://${faker.internet.domainName()}/.well-known/pay`
})) as MockWalletAddress
if (isWalletAddressError(walletAddressOrError)) {
throw new Error(walletAddressOrError)
Expand Down

0 comments on commit 6f72bf7

Please sign in to comment.