diff --git a/apps/services/auth/ids-api/infra/ids-api.ts b/apps/services/auth/ids-api/infra/ids-api.ts index 14ac4f6c60bf..fc484bcfdeda 100644 --- a/apps/services/auth/ids-api/infra/ids-api.ts +++ b/apps/services/auth/ids-api/infra/ids-api.ts @@ -2,6 +2,7 @@ import { json, service, ServiceBuilder } from '../../../../../infra/src/dsl/dsl' import { Base, Client, + DistrictCommissionersWorkSystem, NationalRegistryAuthB2C, RskProcuring, } from '../../../../../infra/src/dsl/xroad' @@ -83,11 +84,6 @@ export const serviceSetup = (): ServiceBuilder<'services-auth-ids-api'> => { // Origin for Android prod app 'android:apk-key-hash:EsLTUu5kaY7XPmMl2f7nbq4amu-PNzdYu3FecNf90wU', ]), - SYSLUMENN_HOST: { - dev: 'https://api.syslumenn.is/staging', - staging: 'https://api.syslumenn.is/staging', - prod: 'https://api.syslumenn.is/api', - }, SYSLUMENN_TIMEOUT: '3000', }) .secrets({ @@ -101,7 +97,13 @@ export const serviceSetup = (): ServiceBuilder<'services-auth-ids-api'> => { SYSLUMENN_USERNAME: '/k8s/services-auth/SYSLUMENN_USERNAME', SYSLUMENN_PASSWORD: '/k8s/services-auth/SYSLUMENN_PASSWORD', }) - .xroad(Base, Client, RskProcuring, NationalRegistryAuthB2C) + .xroad( + Base, + Client, + RskProcuring, + NationalRegistryAuthB2C, + DistrictCommissionersWorkSystem, + ) .readiness('/health/check') .liveness('/liveness') .db({ name: 'servicesauth', extensions: ['uuid-ossp'] }) diff --git a/charts/identity-server/values.dev.yaml b/charts/identity-server/values.dev.yaml index 5f76287c7ee4..4b9e12d97f60 100644 --- a/charts/identity-server/values.dev.yaml +++ b/charts/identity-server/values.dev.yaml @@ -415,13 +415,13 @@ services-auth-ids-api: PUBLIC_URL: 'https://identity-server.dev01.devland.is/api' REDIS_NODES: '["clustercfg.general-redis-cluster-group.5fzau3.euw1.cache.amazonaws.com:6379"]' SERVERSIDE_FEATURES_ON: '' - SYSLUMENN_HOST: 'https://api.syslumenn.is/staging' SYSLUMENN_TIMEOUT: '3000' USER_PROFILE_CLIENT_SCOPE: '["@island.is/user-profile:read"]' USER_PROFILE_CLIENT_URL: 'http://web-service-portal-api.service-portal.svc.cluster.local' XROAD_BASE_PATH: 'http://securityserver.dev01.devland.is' XROAD_BASE_PATH_WITH_ENV: 'http://securityserver.dev01.devland.is/r1/IS-DEV' XROAD_CLIENT_ID: 'IS-DEV/GOV/10000/island-is-client' + XROAD_DISTRICT_COMMISSIONERS_LICENSES_PATH: 'IS-DEV/GOV/10016/Syslumenn-Protected/StarfsKerfi' XROAD_NATIONAL_REGISTRY_REDIS_NODES: '["clustercfg.general-redis-cluster-group.5fzau3.euw1.cache.amazonaws.com:6379"]' XROAD_NATIONAL_REGISTRY_SERVICE_PATH: 'IS-DEV/GOV/10001/SKRA-Protected/Einstaklingar-v1' XROAD_RSK_PROCURING_PATH: 'IS-DEV/GOV/10006/Skatturinn/relationships-v1' diff --git a/charts/identity-server/values.prod.yaml b/charts/identity-server/values.prod.yaml index 077392613786..c6d5f962f233 100644 --- a/charts/identity-server/values.prod.yaml +++ b/charts/identity-server/values.prod.yaml @@ -412,13 +412,13 @@ services-auth-ids-api: PUBLIC_URL: 'https://innskra.island.is/api' REDIS_NODES: '["clustercfg.general-redis-cluster-group.dnugi2.euw1.cache.amazonaws.com:6379"]' SERVERSIDE_FEATURES_ON: 'driving-license-use-v1-endpoint-for-v2-comms' - SYSLUMENN_HOST: 'https://api.syslumenn.is/api' SYSLUMENN_TIMEOUT: '3000' USER_PROFILE_CLIENT_SCOPE: '["@island.is/user-profile:read"]' USER_PROFILE_CLIENT_URL: 'https://service-portal-api.internal.island.is' XROAD_BASE_PATH: 'http://securityserver.island.is' XROAD_BASE_PATH_WITH_ENV: 'http://securityserver.island.is/r1/IS' XROAD_CLIENT_ID: 'IS/GOV/5501692829/island-is-client' + XROAD_DISTRICT_COMMISSIONERS_LICENSES_PATH: 'IS/GOV/5512201410/Syslumenn-Protected/StarfsKerfi' XROAD_NATIONAL_REGISTRY_REDIS_NODES: '["clustercfg.general-redis-cluster-group.dnugi2.euw1.cache.amazonaws.com:6379"]' XROAD_NATIONAL_REGISTRY_SERVICE_PATH: 'IS/GOV/6503760649/SKRA-Protected/Einstaklingar-v1' XROAD_RSK_PROCURING_PATH: 'IS/GOV/5402696029/Skatturinn/relationships-v1' diff --git a/charts/identity-server/values.staging.yaml b/charts/identity-server/values.staging.yaml index bee228ee9292..36af5535a503 100644 --- a/charts/identity-server/values.staging.yaml +++ b/charts/identity-server/values.staging.yaml @@ -415,13 +415,13 @@ services-auth-ids-api: PUBLIC_URL: 'https://identity-server.staging01.devland.is/api' REDIS_NODES: '["clustercfg.general-redis-cluster-group.ab9ckb.euw1.cache.amazonaws.com:6379"]' SERVERSIDE_FEATURES_ON: '' - SYSLUMENN_HOST: 'https://api.syslumenn.is/staging' SYSLUMENN_TIMEOUT: '3000' USER_PROFILE_CLIENT_SCOPE: '["@island.is/user-profile:read"]' USER_PROFILE_CLIENT_URL: 'http://web-service-portal-api.service-portal.svc.cluster.local' XROAD_BASE_PATH: 'http://securityserver.staging01.devland.is' XROAD_BASE_PATH_WITH_ENV: 'http://securityserver.staging01.devland.is/r1/IS-TEST' XROAD_CLIENT_ID: 'IS-TEST/GOV/5501692829/island-is-client' + XROAD_DISTRICT_COMMISSIONERS_LICENSES_PATH: 'IS-TEST/GOV/10016/Syslumenn-Protected/StarfsKerfi' XROAD_NATIONAL_REGISTRY_REDIS_NODES: '["clustercfg.general-redis-cluster-group.ab9ckb.euw1.cache.amazonaws.com:6379"]' XROAD_NATIONAL_REGISTRY_SERVICE_PATH: 'IS-TEST/GOV/6503760649/SKRA-Protected/Einstaklingar-v1' XROAD_RSK_PROCURING_PATH: 'IS-TEST/GOV/5402696029/Skatturinn/relationships-v1' diff --git a/infra/src/dsl/xroad.ts b/infra/src/dsl/xroad.ts index 1f9a79557692..0d8abd145c11 100644 --- a/infra/src/dsl/xroad.ts +++ b/infra/src/dsl/xroad.ts @@ -293,6 +293,15 @@ export const DistrictCommissionersLicenses = new XroadConf({ }, }, }) +export const DistrictCommissionersWorkSystem = new XroadConf({ + env: { + XROAD_DISTRICT_COMMISSIONERS_LICENSES_PATH: { + dev: 'IS-DEV/GOV/10016/Syslumenn-Protected/StarfsKerfi', + staging: 'IS-TEST/GOV/10016/Syslumenn-Protected/StarfsKerfi', + prod: 'IS/GOV/5512201410/Syslumenn-Protected/StarfsKerfi', + }, + }, +}) export const Firearm = new XroadConf({ env: { diff --git a/libs/api/domains/mortgage-certificate/src/lib/mortgageCertificate.spec.ts b/libs/api/domains/mortgage-certificate/src/lib/mortgageCertificate.spec.ts index 3fcfad53dd5d..c30e6ae153cc 100644 --- a/libs/api/domains/mortgage-certificate/src/lib/mortgageCertificate.spec.ts +++ b/libs/api/domains/mortgage-certificate/src/lib/mortgageCertificate.spec.ts @@ -1,18 +1,21 @@ import { Test } from '@nestjs/testing' -import { MortgageCertificateService } from './mortgageCertificate.service' + import { - SyslumennService, + SyslumennApiProvider, SyslumennClientModule, + SyslumennService, } from '@island.is/clients/syslumenn' +import { logger, LOGGER_PROVIDER } from '@island.is/logging' +import { ConfigModule, defineConfig } from '@island.is/nest/config' +import { startMocking } from '@island.is/shared/mocking' + import { MOCK_PROPERTY_NUMBER_OK, MockIdentityData, MockUserProfileData, requestHandlers, } from './__mock-data__/requestHandlers' -import { startMocking } from '@island.is/shared/mocking' -import { defineConfig, ConfigModule } from '@island.is/nest/config' -import { LOGGER_PROVIDER, logger } from '@island.is/logging' +import { MortgageCertificateService } from './mortgageCertificate.service' const config = defineConfig({ name: 'SyslumennApi', @@ -35,7 +38,10 @@ describe('MortgageCertificateService', () => { const module = await Test.createTestingModule({ imports: [ SyslumennClientModule, - ConfigModule.forRoot({ isGlobal: true, load: [config] }), + ConfigModule.forRoot({ + isGlobal: true, + load: [config], + }), ], providers: [ { @@ -44,6 +50,7 @@ describe('MortgageCertificateService', () => { }, MortgageCertificateService, SyslumennService, + SyslumennApiProvider, ], }).compile() diff --git a/libs/application/template-api-modules/src/lib/modules/templates/criminal-record-submission/criminal-record-submission.spec.ts b/libs/application/template-api-modules/src/lib/modules/templates/criminal-record-submission/criminal-record-submission.spec.ts index 3d7f66b7d21e..01b3e7ca3dfb 100644 --- a/libs/application/template-api-modules/src/lib/modules/templates/criminal-record-submission/criminal-record-submission.spec.ts +++ b/libs/application/template-api-modules/src/lib/modules/templates/criminal-record-submission/criminal-record-submission.spec.ts @@ -1,21 +1,24 @@ +import { ConfigService } from '@nestjs/config' import { Test } from '@nestjs/testing' -import { logger, LOGGER_PROVIDER } from '@island.is/logging' -import { createCurrentUser } from '@island.is/testing/fixtures' + +import { CriminalRecordService } from '@island.is/api/domains/criminal-record' +import { createApplication } from '@island.is/application/testing' import { ApplicationStatus, ApplicationTypes, } from '@island.is/application/types' -import { SharedTemplateApiService } from '../../shared' -import { CriminalRecordSubmissionService } from './criminal-record-submission.service' -import { AdapterService } from '@island.is/email-service' import { - SyslumennService, + SyslumennApiProvider, SyslumennClientModule, + SyslumennService, } from '@island.is/clients/syslumenn' -import { CriminalRecordService } from '@island.is/api/domains/criminal-record' -import { ConfigService } from '@nestjs/config' -import { defineConfig, ConfigModule } from '@island.is/nest/config' -import { createApplication } from '@island.is/application/testing' +import { AdapterService } from '@island.is/email-service' +import { logger, LOGGER_PROVIDER } from '@island.is/logging' +import { ConfigModule, defineConfig } from '@island.is/nest/config' +import { createCurrentUser } from '@island.is/testing/fixtures' + +import { SharedTemplateApiService } from '../../shared' +import { CriminalRecordSubmissionService } from './criminal-record-submission.service' const config = defineConfig({ name: 'SyslumennApi', @@ -48,6 +51,7 @@ describe('CriminalRecordSubmissionService', () => { })), }, SyslumennService, + SyslumennApiProvider, AdapterService, { provide: CriminalRecordService, diff --git a/libs/application/template-api-modules/src/lib/modules/templates/mortgage-certificate-submission/mortgage-certificate-submission.spec.ts b/libs/application/template-api-modules/src/lib/modules/templates/mortgage-certificate-submission/mortgage-certificate-submission.spec.ts index 4874858a3c2b..df298961a341 100644 --- a/libs/application/template-api-modules/src/lib/modules/templates/mortgage-certificate-submission/mortgage-certificate-submission.spec.ts +++ b/libs/application/template-api-modules/src/lib/modules/templates/mortgage-certificate-submission/mortgage-certificate-submission.spec.ts @@ -1,25 +1,28 @@ +import { ConfigService } from '@nestjs/config' import { Test } from '@nestjs/testing' -import { logger, LOGGER_PROVIDER } from '@island.is/logging' -import { createCurrentUser } from '@island.is/testing/fixtures' + +import { MortgageCertificateService } from '@island.is/api/domains/mortgage-certificate' +import { createApplication } from '@island.is/application/testing' import { ApplicationStatus, ApplicationTypes, } from '@island.is/application/types' -import { SharedTemplateApiService } from '../../shared' -import { MortgageCertificateSubmissionService } from './mortgage-certificate-submission.service' +import { + SyslumennApiProvider, + SyslumennClientModule, + SyslumennService, +} from '@island.is/clients/syslumenn' import { AdapterService, - EmailService, emailModuleConfig, + EmailService, } from '@island.is/email-service' -import { - SyslumennService, - SyslumennClientModule, -} from '@island.is/clients/syslumenn' -import { MortgageCertificateService } from '@island.is/api/domains/mortgage-certificate' -import { ConfigService } from '@nestjs/config' -import { defineConfig, ConfigModule } from '@island.is/nest/config' -import { createApplication } from '@island.is/application/testing' +import { logger, LOGGER_PROVIDER } from '@island.is/logging' +import { ConfigModule, defineConfig } from '@island.is/nest/config' +import { createCurrentUser } from '@island.is/testing/fixtures' + +import { SharedTemplateApiService } from '../../shared' +import { MortgageCertificateSubmissionService } from './mortgage-certificate-submission.service' const config = defineConfig({ name: 'SyslumennApi', @@ -48,6 +51,7 @@ describe('MortgageCertificateSubmissionService', () => { providers: [ MortgageCertificateSubmissionService, SyslumennService, + SyslumennApiProvider, EmailService, AdapterService, { diff --git a/libs/clients/syslumenn/src/index.ts b/libs/clients/syslumenn/src/index.ts index 1d6aeb9fb764..527e67f8ec85 100644 --- a/libs/clients/syslumenn/src/index.ts +++ b/libs/clients/syslumenn/src/index.ts @@ -1,4 +1,5 @@ export { SyslumennClientModule } from './lib/syslumennClient.module' export { SyslumennClientConfig } from './lib/syslumennClient.config' export { SyslumennService } from './lib/syslumennClient.service' +export { SyslumennApiProvider } from './lib/syslumennClient.provider' export * from './lib/syslumennClient.types' diff --git a/libs/clients/syslumenn/src/lib/syslumenn.spec.ts b/libs/clients/syslumenn/src/lib/syslumenn.spec.ts index f8224a623b10..bdd8c30d1e07 100644 --- a/libs/clients/syslumenn/src/lib/syslumenn.spec.ts +++ b/libs/clients/syslumenn/src/lib/syslumenn.spec.ts @@ -1,49 +1,49 @@ import { Test } from '@nestjs/testing' -import { SyslumennService } from './syslumennClient.service' + +import { ConfigModule, defineConfig } from '@island.is/nest/config' import { startMocking } from '@island.is/shared/mocking' + +import { SyslumennClientModule } from '../lib/syslumennClient.module' import { - requestHandlers, - MOCK_PROPERTY_NUMBER_OK, MOCK_PROPERTY_NUMBER_NO_KMARKING, MOCK_PROPERTY_NUMBER_NOT_EXISTS, + MOCK_PROPERTY_NUMBER_OK, + requestHandlers, } from './__mock-data__/requestHandlers' import { - VHSUCCESS, - OPERATING_LICENSE, - OPERATING_LICENSE_PAGINATION_INFO_SERVICE_RES, + ALCOHOL_LICENCES, + BROKERS, DATA_UPLOAD, - REAL_ESTATE_ADDRESS, - MORTGAGE_CERTIFICATE_CONTENT_NO_KMARKING, + DEPARTED_REGISTRY_PERSON_RESPONSE, ESTATE_REGISTRANT_RESPONSE, + LAWYERS, + MORTGAGE_CERTIFICATE_CONTENT_NO_KMARKING, + OPERATING_LICENSE, + OPERATING_LICENSE_PAGINATION_INFO_SERVICE_RES, OPERATING_LICENSES_CSV, + REAL_ESTATE_ADDRESS, + REAL_ESTATE_AGENTS, + SYSLUMENN_AUCTION, TEMPORARY_EVENT_LICENCES, - DEPARTED_REGISTRY_PERSON_RESPONSE, + VHSUCCESS, } from './__mock-data__/responses' +import { SyslumennApiProvider } from './syslumennClient.provider' +import { SyslumennService } from './syslumennClient.service' +import { PersonType } from './syslumennClient.types' import { - mapHomestay, - mapSyslumennAuction, + mapAlcoholLicence, + mapBroker, mapDataUploadResponse, - mapPaginatedOperatingLicenses, - mapOperatingLicensesCSV, + mapDepartedToRegistryPerson, mapEstateRegistrant, - mapRealEstateAgent, + mapHomestay, mapLawyer, - mapBroker, - mapAlcoholLicence, + mapOperatingLicensesCSV, + mapPaginatedOperatingLicenses, + mapRealEstateAgent, + mapSyslumennAuction, mapTemporaryEventLicence, - mapDepartedToRegistryPerson, } from './syslumennClient.utils' -import { - SYSLUMENN_AUCTION, - REAL_ESTATE_AGENTS, - LAWYERS, - BROKERS, - ALCOHOL_LICENCES, -} from './__mock-data__/responses' -import { PersonType } from './syslumennClient.types' -import { SyslumennClientModule } from '../lib/syslumennClient.module' - -import { defineConfig, ConfigModule } from '@island.is/nest/config' const YEAR = 2021 const PERSON = [ @@ -93,7 +93,7 @@ describe('SyslumennService', () => { SyslumennClientModule, ConfigModule.forRoot({ isGlobal: true, load: [config] }), ], - providers: [SyslumennService], + providers: [SyslumennService, SyslumennApiProvider], }).compile() service = module.get(SyslumennService) diff --git a/libs/clients/syslumenn/src/lib/syslumennClient.config.ts b/libs/clients/syslumenn/src/lib/syslumennClient.config.ts index d588ad0ec5ec..2a39520fa006 100644 --- a/libs/clients/syslumenn/src/lib/syslumennClient.config.ts +++ b/libs/clients/syslumenn/src/lib/syslumennClient.config.ts @@ -1,13 +1,15 @@ -import { defineConfig } from '@island.is/nest/config' import { z } from 'zod' +import { defineConfig } from '@island.is/nest/config' + const schema = z.object({ - url: z.string(), + url: z.optional(z.string()), fetch: z.object({ timeout: z.number().int(), }), username: z.string(), password: z.string(), + xRoadServicePath: z.optional(z.string()), }) export const SyslumennClientConfig = defineConfig({ @@ -15,12 +17,16 @@ export const SyslumennClientConfig = defineConfig({ schema, load(env) { return { - url: env.required('SYSLUMENN_HOST', 'https://api.syslumenn.is/staging'), + url: env.optional('SYSLUMENN_HOST', 'https://api.syslumenn.is/staging'), fetch: { timeout: env.optionalJSON('SYSLUMENN_TIMEOUT') ?? 40000, }, - username: env.required('SYSLUMENN_USERNAME'), - password: env.required('SYSLUMENN_PASSWORD'), + username: env.required('SYSLUMENN_USERNAME', ''), + password: env.required('SYSLUMENN_PASSWORD', ''), + xRoadServicePath: env.optional( + 'XROAD_DISTRICT_COMMISSIONERS_WORK_SYSTEM_PATH', + 'r1/IS-DEV/GOV/10016/Syslumenn-Protected/StarfsKerfi', + ), } }, }) diff --git a/libs/clients/syslumenn/src/lib/syslumennClient.module.ts b/libs/clients/syslumenn/src/lib/syslumennClient.module.ts index b5ddadc5b95f..4e43c83e8a6e 100644 --- a/libs/clients/syslumenn/src/lib/syslumennClient.module.ts +++ b/libs/clients/syslumenn/src/lib/syslumennClient.module.ts @@ -1,8 +1,10 @@ import { Module } from '@nestjs/common' + +import { SyslumennApiProvider } from './syslumennClient.provider' import { SyslumennService } from './syslumennClient.service' @Module({ - providers: [SyslumennService], + providers: [SyslumennService, SyslumennApiProvider], exports: [SyslumennService], }) export class SyslumennClientModule {} diff --git a/libs/clients/syslumenn/src/lib/syslumennClient.provider.ts b/libs/clients/syslumenn/src/lib/syslumennClient.provider.ts new file mode 100644 index 000000000000..4e0ba1a91db1 --- /dev/null +++ b/libs/clients/syslumenn/src/lib/syslumennClient.provider.ts @@ -0,0 +1,47 @@ +import { Provider } from '@nestjs/common' + +import { createEnhancedFetch } from '@island.is/clients/middlewares' +import { ConfigType, XRoadConfig } from '@island.is/nest/config' + +import { Configuration, SyslumennApi } from '../../gen/fetch' +import { SyslumennClientConfig } from './syslumennClient.config' + +export const SyslumennApiProvider: Provider = { + provide: SyslumennApi, + useFactory: ( + config: ConfigType, + xRoadConfig?: ConfigType, + ) => { + if (config.xRoadServicePath && !xRoadConfig) { + throw new Error( + 'Misconfiguration in SyslumennClient. xRoadServicePath provided without xRoadConfig.', + ) + } + + return new SyslumennApi( + new Configuration({ + fetchApi: createEnhancedFetch({ + name: 'clients-syslumenn', + organizationSlug: 'syslumenn', + ...config.fetch, + }), + basePath: + xRoadConfig && config.xRoadServicePath + ? `${xRoadConfig.xRoadBasePath}/${config.xRoadServicePath}` + : config.url, + headers: { + ...(xRoadConfig && + config.xRoadServicePath && { + 'X-Road-Client': xRoadConfig.xRoadClient, + }), + 'Content-Type': 'application/json', + Accept: 'application/json', + }, + }), + ) + }, + inject: [ + SyslumennClientConfig.KEY, + { token: XRoadConfig.KEY, optional: true }, + ], +} diff --git a/libs/clients/syslumenn/src/lib/syslumennClient.service.ts b/libs/clients/syslumenn/src/lib/syslumennClient.service.ts index d606178c5ff7..eae6b8b8ce6c 100644 --- a/libs/clients/syslumenn/src/lib/syslumennClient.service.ts +++ b/libs/clients/syslumenn/src/lib/syslumennClient.service.ts @@ -2,10 +2,8 @@ import { Inject, Injectable } from '@nestjs/common' import startOfDay from 'date-fns/startOfDay' import { AuthHeaderMiddleware } from '@island.is/auth-nest-tools' -import { createEnhancedFetch } from '@island.is/clients/middlewares' import { - Configuration, InnsigludSkjol, LogradamadurSvar, Skilabod, @@ -78,41 +76,28 @@ import { import type { ConfigType } from '@island.is/nest/config' const UPLOAD_DATA_SUCCESS = 'Gögn móttekin' + @Injectable() export class SyslumennService { constructor( + private readonly api: SyslumennApi, @Inject(SyslumennClientConfig.KEY) private clientConfig: ConfigType, ) {} private async createApi() { - const api = new SyslumennApi( - new Configuration({ - fetchApi: createEnhancedFetch({ - name: 'clients-syslumenn', - organizationSlug: 'syslumenn', - ...this.clientConfig.fetch, - }), - basePath: this.clientConfig.url, - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - }, - }), - ) - const config = { notandi: this.clientConfig.username, lykilord: this.clientConfig.password, } - const { audkenni, accessToken } = await api.innskraningPost({ + const { audkenni, accessToken } = await this.api.innskraningPost({ notandi: config, }) if (audkenni && accessToken) { return { id: audkenni, - api: api.withMiddleware( + api: this.api.withMiddleware( new AuthHeaderMiddleware(`Bearer ${accessToken}`), ), }