Skip to content

Commit 007891e

Browse files
authored
feat(frontend): tenant settings fields for tenant create (#3572)
* feat(frontend): tenant settings fields for tenant create * fix: tests * fix: surface form errors for tenant settings * fix: typings & generated files causing build errors
1 parent 083660b commit 007891e

File tree

15 files changed

+368
-55
lines changed

15 files changed

+368
-55
lines changed

localenv/mock-account-servicing-entity/generated/graphql.ts

Lines changed: 13 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/backend/src/graphql/generated/graphql.schema.json

Lines changed: 52 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/backend/src/graphql/generated/graphql.ts

Lines changed: 13 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/backend/src/graphql/resolvers/tenant_settings.test.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import { truncateTables } from '../../tests/tableManager'
77
import { createTenant } from '../../tests/tenant'
88
import {
99
CreateTenantSettingsInput,
10-
CreateTenantSettingsMutationResponse
10+
CreateTenantSettingsMutationResponse,
11+
TenantSettingKey as SchemaTenantSettingKey
1112
} from '../generated/graphql'
1213
import {
1314
ApolloClient,
@@ -101,7 +102,7 @@ describe('Tenant Settings Resolvers', (): void => {
101102
const input: CreateTenantSettingsInput = {
102103
settings: [
103104
{
104-
key: TenantSettingKeys.EXCHANGE_RATES_URL.name,
105+
key: SchemaTenantSettingKey.ExchangeRatesUrl,
105106
value: faker.internet.url()
106107
}
107108
]
@@ -137,7 +138,7 @@ describe('Tenant Settings Resolvers', (): void => {
137138
const input: CreateTenantSettingsInput = {
138139
settings: [
139140
{
140-
key: TenantSettingKeys.WEBHOOK_MAX_RETRY.name,
141+
key: SchemaTenantSettingKey.WebhookMaxRetry,
141142
value: '-1'
142143
}
143144
]

packages/backend/src/graphql/resolvers/tenant_settings.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ import {
55
errorToCode,
66
errorToMessage
77
} from '../../tenants/settings/errors'
8-
import { TenantSetting } from '../../tenants/settings/model'
8+
import { TenantSetting, TenantSettingKeys } from '../../tenants/settings/model'
99
import {
1010
ResolversTypes,
1111
TenantResolvers,
1212
TenantSetting as SchemaTenantSetting,
13-
MutationResolvers
13+
MutationResolvers,
14+
TenantSettingKey as SchemaTenantSettingKey
1415
} from '../generated/graphql'
1516

1617
export const getTenantSettings: TenantResolvers<TenantedApolloContext>['settings'] =
@@ -56,10 +57,23 @@ export const createTenantSettings: MutationResolvers<TenantedApolloContext>['cre
5657
}
5758
}
5859

60+
const tenantSettingNameToGraphQl: { [key: string]: SchemaTenantSettingKey } = {
61+
[TenantSettingKeys.EXCHANGE_RATES_URL.name]:
62+
SchemaTenantSettingKey.ExchangeRatesUrl,
63+
[TenantSettingKeys.WEBHOOK_URL.name]: SchemaTenantSettingKey.WebhookUrl,
64+
[TenantSettingKeys.WEBHOOK_TIMEOUT.name]:
65+
SchemaTenantSettingKey.WebhookTimeout,
66+
[TenantSettingKeys.WEBHOOK_MAX_RETRY.name]:
67+
SchemaTenantSettingKey.WebhookMaxRetry,
68+
[TenantSettingKeys.WALLET_ADDRESS_URL.name]:
69+
SchemaTenantSettingKey.WalletAddressUrl,
70+
[TenantSettingKeys.ILP_ADDRESS.name]: SchemaTenantSettingKey.IlpAddress
71+
}
72+
5973
const tenantSettingToGraphql = (
6074
tenantSetting: TenantSetting
6175
): SchemaTenantSetting => ({
62-
key: tenantSetting.key,
76+
key: tenantSettingNameToGraphQl[tenantSetting.key],
6377
value: tenantSetting.value
6478
})
6579

packages/backend/src/graphql/schema.graphql

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,7 @@ input CreateTenantSettingsInput {
653653

654654
input TenantSettingInput {
655655
"Key for this setting."
656-
key: String!
656+
key: TenantSettingKey!
657657
"Value of a setting for this key."
658658
value: String!
659659
}
@@ -1611,9 +1611,18 @@ type TenantEdge {
16111611
cursor: String!
16121612
}
16131613

1614+
enum TenantSettingKey {
1615+
EXCHANGE_RATES_URL
1616+
WEBHOOK_URL
1617+
WEBHOOK_TIMEOUT
1618+
WEBHOOK_MAX_RETRY
1619+
WALLET_ADDRESS_URL
1620+
ILP_ADDRESS
1621+
}
1622+
16141623
type TenantSetting {
16151624
"Key for this setting."
1616-
key: String!
1625+
key: TenantSettingKey!
16171626
"Value of a setting for this key."
16181627
value: String!
16191628
}

packages/backend/src/tenants/service.test.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@ import { createTenant } from '../tests/tenant'
1515
import { CacheDataStore } from '../middleware/cache/data-stores'
1616
import { AuthServiceClient } from '../auth-service-client/client'
1717
import { withConfigOverride } from '../tests/helpers'
18-
import { TenantSetting, TenantSettingKeys } from './settings/model'
18+
import { TenantSetting } from './settings/model'
1919
import { TenantSettingService } from './settings/service'
2020
import { isTenantError, TenantError } from './errors'
2121
import { v4 } from 'uuid'
22+
import { TenantSettingKey as SchemaTenantSettingKey } from '../graphql/generated/graphql'
2223

2324
describe('Tenant Service', (): void => {
2425
let deps: IocContract<AppServices>
@@ -157,7 +158,7 @@ describe('Tenant Service', (): void => {
157158
idpSecret: 'test-idp-secret',
158159
settings: [
159160
{
160-
key: TenantSettingKeys.WALLET_ADDRESS_URL.name,
161+
key: SchemaTenantSettingKey.WalletAddressUrl,
161162
value: walletAddressUrl
162163
}
163164
]
@@ -171,7 +172,7 @@ describe('Tenant Service', (): void => {
171172
assert(!isTenantError(tenant))
172173
const tenantSetting = await TenantSetting.query()
173174
.where('tenantId', tenant.id)
174-
.andWhere('key', TenantSettingKeys.WALLET_ADDRESS_URL.name)
175+
.andWhere('key', SchemaTenantSettingKey.WalletAddressUrl)
175176

176177
expect(tenantSetting.length).toBe(1)
177178
expect(tenantSetting[0].value).toEqual(walletAddressUrl)

packages/backend/src/tenants/service.ts

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,10 @@ async function createTenant(
118118
idpConsentUrl
119119
})
120120

121-
const createInitialTenantSettingsOptions = {
121+
const createInitialTenantSettingsOptions: {
122+
tenantId: string
123+
setting: ReturnType<typeof TenantSetting.default>
124+
} = {
122125
tenantId: tenant.id,
123126
setting: TenantSetting.default()
124127
}
@@ -130,11 +133,25 @@ async function createTenant(
130133

131134
createInitialTenantSettingsOptions.setting.push(defaultIlpAddressSetting)
132135

133-
if (settings) {
136+
if (
137+
settings &&
138+
!settings.find(
139+
(setting) => setting.key === TenantSettingKeys.ILP_ADDRESS.name
140+
)
141+
) {
134142
createInitialTenantSettingsOptions.setting =
135143
createInitialTenantSettingsOptions.setting.concat(settings)
144+
} else if (settings) {
145+
createInitialTenantSettingsOptions.setting = settings
136146
}
137147

148+
deps.logger.info(
149+
{
150+
createInitialTenantSettingsOptions
151+
},
152+
'initial options'
153+
)
154+
138155
await deps.tenantSettingService.create(createInitialTenantSettingsOptions, {
139156
trx
140157
})

packages/backend/src/tenants/settings/service.test.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ import { truncateTables } from '../../tests/tableManager'
99
import { Tenant } from '../model'
1010
import { TenantService } from '../service'
1111
import { faker } from '@faker-js/faker'
12-
import { exchangeRatesSetting, randomSetting } from '../../tests/tenantSettings'
12+
import {
13+
exchangeRatesSetting,
14+
randomSetting,
15+
createTenantSettings
16+
} from '../../tests/tenantSettings'
1317
import { TenantSetting, TenantSettingKeys } from './model'
1418
import {
1519
CreateOptions,
@@ -290,7 +294,7 @@ describe('TenantSetting Service', (): void => {
290294
async function createTenantSetting(): Promise<TenantSetting[]> {
291295
const options: CreateOptions = {
292296
tenantId: tenant.id,
293-
setting: [randomSetting()]
297+
setting: [exchangeRatesSetting()]
294298
}
295299

296300
const createdTenantSetting = await tenantSettingService.create(options)
@@ -321,7 +325,15 @@ describe('TenantSetting Service', (): void => {
321325
})
322326

323327
test('should get all tenant settings', async () => {
324-
const newTenantSetting = await createTenantSetting()
328+
const newTenantSetting = await createTenantSettings(deps, {
329+
tenantId: tenant.id,
330+
setting: [
331+
{
332+
key: TenantSettingKeys.WEBHOOK_URL.name,
333+
value: faker.internet.url()
334+
}
335+
]
336+
})
325337
const dbTenantSettings = await tenantSettingService.get({
326338
tenantId: tenant.id
327339
})

0 commit comments

Comments
 (0)