Skip to content

Commit

Permalink
Merge branch 'main' into feat/new-primary-school-data-implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
kodiakhq[bot] authored Oct 4, 2024
2 parents 03526d5 + 1482e07 commit b7e2476
Show file tree
Hide file tree
Showing 17 changed files with 220 additions and 30 deletions.
2 changes: 2 additions & 0 deletions apps/api/infra/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,8 @@ export const serviceSetup = (services: {
ULTRAVIOLET_RADIATION_API_KEY: '/k8s/api/ULTRAVIOLET_RADIATION_API_KEY',
UMBODSMADUR_SKULDARA_COST_OF_LIVING_CALCULATOR_API_URL:
'/k8s/api/UMBODSMADUR_SKULDARA_COST_OF_LIVING_CALCULATOR_API_URL',
VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY:
'/k8s/api/VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY',
})
.xroad(
AdrAndMachine,
Expand Down
2 changes: 2 additions & 0 deletions apps/api/src/app/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import { ElectronicRegistrationsModule } from '@island.is/api/domains/electronic
import {
EmailSignupModule,
ZenterSignupConfig,
CampaignMonitorSignupConfig,
} from '@island.is/api/domains/email-signup'
import { EndorsementSystemModule } from '@island.is/api/domains/endorsement-system'
import { EnergyFundsServiceModule } from '@island.is/api/domains/energy-funds'
Expand Down Expand Up @@ -390,6 +391,7 @@ const environment = getConfig
DocumentClientConfig,
DocumentsClientV2Config,
ZenterSignupConfig,
CampaignMonitorSignupConfig,
PaymentScheduleClientConfig,
JudicialAdministrationClientConfig,
CommunicationsConfig,
Expand Down
46 changes: 35 additions & 11 deletions apps/web/components/Organization/Slice/EmailSignup/EmailSignup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,19 @@ import {
Text,
} from '@island.is/island-ui/core'
import { FormField } from '@island.is/web/components'
import { FormFieldType } from '../../../Form/Form'
import {
EmailSignup as EmailSignupSchema,
EmailSignupInputField,
EmailSignupSubscriptionMutation,
EmailSignupSubscriptionMutationVariables,
} from '@island.is/web/graphql/schema'
import { EMAIL_SIGNUP_MUTATION } from '@island.is/web/screens/queries'
import { useNamespace } from '@island.is/web/hooks'
import { useI18n } from '@island.is/web/i18n'
import { EMAIL_SIGNUP_MUTATION } from '@island.is/web/screens/queries'
import { isValidEmail } from '@island.is/web/utils/isValidEmail'
import { isValidNationalId } from '@island.is/web/utils/isValidNationalId'

import { FormFieldType } from '../../../Form/Form'
import * as styles from './EmailSignup.css'

type SubmitResponse = {
Expand All @@ -50,6 +51,7 @@ interface EmailSignupProps {

const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => {
const n = useNamespace(slice.translations ?? {})
const { activeLocale } = useI18n()
const formFields = useMemo(
() =>
slice.formFields?.filter(
Expand Down Expand Up @@ -79,15 +81,19 @@ const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => {
if (field?.required && !value) {
newErrors[fieldName] = n(
'fieldIsRequired',
'Þennan reit þarf að fylla út',
activeLocale === 'is'
? 'Þennan reit þarf að fylla út'
: 'This field is required',
)
} else if (
field?.type === FormFieldType.EMAIL &&
!isValidEmail.test(value as string)
) {
newErrors[fieldName] = n(
'invalidEmail',
'Vinsamlegast sláðu inn gilt netfang',
activeLocale === 'is'
? 'Vinsamlegast sláðu inn gilt netfang'
: 'Please enter a valid email address',
)
} else if (
field?.type === FormFieldType.CHECKBOXES &&
Expand All @@ -97,7 +103,9 @@ const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => {
) {
newErrors[fieldName] = n(
'fieldIsRequired',
'Þennan reit þarf að fylla út',
activeLocale === 'is'
? 'Þennan reit þarf að fylla út'
: 'This field is required',
)
} else if (
field?.type === FormFieldType.NATIONAL_ID &&
Expand All @@ -106,7 +114,9 @@ const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => {
) {
newErrors[fieldName] = n(
'formInvalidNationalId',
'Þetta er ekki gild kennitala.',
activeLocale === 'is'
? 'Þetta er ekki gild kennitala.'
: 'This is not valid national id.',
)
}
}
Expand Down Expand Up @@ -143,10 +153,17 @@ const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => {
if (result?.data?.emailSignupSubscription?.subscribed) {
setSubmitResponse({
type: 'success',
title: n('submitSuccessTitle', 'Skráning tókst') as string,
title: n(
'submitSuccessTitle',
activeLocale === 'is'
? 'Skráning tókst'
: 'Registration was successful',
) as string,
message: n(
'submitSuccessMessage',
'Þú þarft að fara í pósthólfið þitt og samþykkja umsóknina. Takk fyrir',
activeLocale === 'is'
? 'Þú þarft að fara í tölvupóstinn þinn og samþykkja umsóknina. Takk fyrir'
: 'You need to go to your email and confirm the subscription. Thank you',
) as string,
})
} else {
Expand All @@ -155,7 +172,9 @@ const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => {
title: '',
message: n(
'submitFailureMessage',
'Ekki tókst að skrá þig á póstlistann, reynið aftur síðar',
activeLocale === 'is'
? 'Ekki tókst að skrá þig á póstlistann, reynið aftur síðar'
: 'Unable to subscribe to the mailing list, please try again later',
) as string,
})
}
Expand All @@ -166,7 +185,9 @@ const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => {
title: '',
message: n(
'submitError',
'Villa kom upp við skráningu á póstlista',
activeLocale === 'is'
? 'Villa kom upp við skráningu á póstlista'
: 'An error occurred while registering to the mailing list',
) as string,
})
})
Expand Down Expand Up @@ -279,7 +300,10 @@ const EmailSignup = ({ slice, marginLeft }: EmailSignupProps) => {
<GridColumn span="1/1">
<Box width="full" display="flex" justifyContent="flexEnd">
<Button disabled={loading} type="submit">
{n('submitButtonText', 'Skrá')}
{n(
'submitButtonText',
activeLocale === 'is' ? 'Skrá' : 'Submit',
)}
</Button>
</Box>
</GridColumn>
Expand Down
1 change: 1 addition & 0 deletions charts/islandis/values.dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -547,6 +547,7 @@ api:
UST_PKPASS_API_KEY: '/k8s/api/UST_PKPASS_API_KEY'
VEHICLES_ALLOW_CO_OWNERS: '/k8s/api/VEHICLES_ALLOW_CO_OWNERS'
VE_PKPASS_API_KEY: '/k8s/api/VE_PKPASS_API_KEY'
VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY: '/k8s/api/VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY'
WATSON_ASSISTANT_CHAT_FEEDBACK_API_KEY: '/k8s/api/WATSON_ASSISTANT_CHAT_FEEDBACK_API_KEY'
WATSON_ASSISTANT_CHAT_FEEDBACK_URL: '/k8s/api/WATSON_ASSISTANT_CHAT_FEEDBACK_URL'
XROAD_DRIVING_LICENSE_SECRET: '/k8s/api/DRIVING_LICENSE_SECRET'
Expand Down
1 change: 1 addition & 0 deletions charts/islandis/values.prod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -537,6 +537,7 @@ api:
UST_PKPASS_API_KEY: '/k8s/api/UST_PKPASS_API_KEY'
VEHICLES_ALLOW_CO_OWNERS: '/k8s/api/VEHICLES_ALLOW_CO_OWNERS'
VE_PKPASS_API_KEY: '/k8s/api/VE_PKPASS_API_KEY'
VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY: '/k8s/api/VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY'
WATSON_ASSISTANT_CHAT_FEEDBACK_API_KEY: '/k8s/api/WATSON_ASSISTANT_CHAT_FEEDBACK_API_KEY'
WATSON_ASSISTANT_CHAT_FEEDBACK_URL: '/k8s/api/WATSON_ASSISTANT_CHAT_FEEDBACK_URL'
XROAD_DRIVING_LICENSE_SECRET: '/k8s/api/DRIVING_LICENSE_SECRET'
Expand Down
1 change: 1 addition & 0 deletions charts/islandis/values.staging.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,7 @@ api:
UST_PKPASS_API_KEY: '/k8s/api/UST_PKPASS_API_KEY'
VEHICLES_ALLOW_CO_OWNERS: '/k8s/api/VEHICLES_ALLOW_CO_OWNERS'
VE_PKPASS_API_KEY: '/k8s/api/VE_PKPASS_API_KEY'
VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY: '/k8s/api/VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY'
WATSON_ASSISTANT_CHAT_FEEDBACK_API_KEY: '/k8s/api/WATSON_ASSISTANT_CHAT_FEEDBACK_API_KEY'
WATSON_ASSISTANT_CHAT_FEEDBACK_URL: '/k8s/api/WATSON_ASSISTANT_CHAT_FEEDBACK_URL'
XROAD_DRIVING_LICENSE_SECRET: '/k8s/api/DRIVING_LICENSE_SECRET'
Expand Down
1 change: 1 addition & 0 deletions libs/api/domains/email-signup/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './lib/emailSignup.module'
export * from './lib/emailSignup.resolver'
export * from './lib/services/zenter/zenter.config'
export * from './lib/services/campaignMonitor/campaignMonitor.config'
4 changes: 4 additions & 0 deletions libs/api/domains/email-signup/src/lib/emailSignup.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const schema = z.object({
fiskistofaZenterPassword: z.string(),
fiskistofaZenterClientId: z.string(),
fiskistofaZenterClientPassword: z.string(),
vinnueftirlitidCampaignMonitorApiKey: z.string(),
})

export const EmailSignupConfig = defineConfig({
Expand All @@ -19,6 +20,9 @@ export const EmailSignupConfig = defineConfig({
fiskistofaZenterClientPassword: env.required(
'FISKISTOFA_ZENTER_CLIENT_PASSWORD',
),
vinnueftirlitidCampaignMonitorApiKey: env.required(
'VINNUEFTIRLITID_CAMPAIGN_MONITOR_API_KEY',
),
}
},
})
2 changes: 2 additions & 0 deletions libs/api/domains/email-signup/src/lib/emailSignup.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ import { EmailSignupResolver } from './emailSignup.resolver'
import { EmailSignupService } from './emailSignup.service'
import { ZenterSignupService } from './services/zenter/zenter.service'
import { MailchimpSignupService } from './services/mailchimp/mailchimp.service'
import { CampaignMonitorSignupService } from './services/campaignMonitor/campaignMonitor.service'

@Module({
imports: [CmsModule],
providers: [
ZenterSignupService,
MailchimpSignupService,
CampaignMonitorSignupService,
EmailSignupService,
EmailSignupResolver,
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { emailSignup } from './fixtures/emailSignup'
import { EmailSignupInput } from './dto/emailSignup.input'
import { EmailSignupService } from './emailSignup.service'
import { ZenterSignupService } from './services/zenter/zenter.service'
import { CampaignMonitorSignupService } from './services/campaignMonitor/campaignMonitor.service'
import { MailchimpSignupService } from './services/mailchimp/mailchimp.service'
import { ZENTER_IMPORT_ENDPOINT_URL } from './constants'

Expand All @@ -29,6 +30,15 @@ describe('emailSignupResolver', () => {
})
},
},
{
provide: CampaignMonitorSignupService,
useFactory() {
return new CampaignMonitorSignupService({
vinnueftirlitidCampaignMonitorApiKey: '',
isConfigured: true,
})
},
},
MailchimpSignupService,
EmailSignupService,
EmailSignupResolver,
Expand Down Expand Up @@ -154,7 +164,6 @@ describe('emailSignupResolver', () => {
)

jest.spyOn(axios, 'post').mockImplementation((url) => {
console.log('yee', url, url === ZENTER_IMPORT_ENDPOINT_URL)
return Promise.resolve({
data: url === ZENTER_IMPORT_ENDPOINT_URL ? 1 : 0,
})
Expand All @@ -170,4 +179,79 @@ describe('emailSignupResolver', () => {
expect(result?.subscribed).toBe(true)
})
})

describe('subscribeToCampaignMonitor', () => {
const testEmailSlice: EmailSignup = {
id: '345',
title: '',
description: '',
configuration: {
signupUrl: 'test.is',
},
formFields: [
{
id: '1',
options: [],
placeholder: '',
required: true,
title: '',
type: 'email',
name: 'EmailAddress',
emailConfig: {},
},
],
signupType: 'campaign monitor',
translations: {},
}
const testInput: EmailSignupInput = {
signupID: '345',
inputFields: [
{
name: 'EmailAddress',
type: 'email',
value: 'test@example.com',
id: '1',
},
],
}

it('should handle errors from the subscription API', async () => {
jest
.spyOn(cmsContentfulService, 'getEmailSignup')
.mockImplementation(({ id }) =>
Promise.resolve(id === '345' ? testEmailSlice : null),
)
jest.spyOn(axios, 'post').mockImplementation(() => {
return Promise.reject(new Error('Network error'))
})

const result = await emailSignupResolver.emailSignupSubscription(
testInput,
)

expect(result?.subscribed).toBe(false)
})

it('should get a successful response if input is valid', async () => {
jest
.spyOn(cmsContentfulService, 'getEmailSignup')
.mockImplementation(({ id }) =>
Promise.resolve(id === '345' ? testEmailSlice : null),
)

jest.spyOn(axios, 'post').mockImplementation((_url, data) => {
const EmailAddress = (data as { EmailAddress: string }).EmailAddress

return Promise.resolve({
data: EmailAddress === testInput.inputFields[0].value ? 1 : 0,
})
})

const result = await emailSignupResolver.emailSignupSubscription(
testInput,
)

expect(result?.subscribed).toBe(true)
})
})
})
19 changes: 17 additions & 2 deletions libs/api/domains/email-signup/src/lib/emailSignup.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,21 @@ import { CmsContentfulService } from '@island.is/cms'

import { MailchimpSignupService } from './services/mailchimp/mailchimp.service'
import { ZenterSignupService } from './services/zenter/zenter.service'
import { CampaignMonitorSignupService } from './services/campaignMonitor/campaignMonitor.service'
import { EmailSignupInput } from './dto/emailSignup.input'

enum SignupType {
Mailchimp = 'mailchimp',
Zenter = 'zenter',
CampaignMonitor = 'campaign monitor',
}

@Injectable()
export class EmailSignupService {
constructor(
private readonly zenterSignupService: ZenterSignupService,
private readonly mailchimpSignupService: MailchimpSignupService,
private readonly campaignMonitorSignupService: CampaignMonitorSignupService,
private readonly cmsContentfulService: CmsContentfulService,
) {}

Expand All @@ -28,20 +36,27 @@ export class EmailSignupService {
formFieldNames.includes(field.name),
)

if (emailSignupModel.signupType === 'mailchimp') {
if (emailSignupModel.signupType === SignupType.Mailchimp) {
return this.mailchimpSignupService.subscribeToMailingList(
emailSignupModel,
inputFields,
)
}

if (emailSignupModel.signupType === 'zenter') {
if (emailSignupModel.signupType === SignupType.Zenter) {
return this.zenterSignupService.subscribeToMailingList(
emailSignupModel,
inputFields,
)
}

if (emailSignupModel.signupType === SignupType.CampaignMonitor) {
return this.campaignMonitorSignupService.subscribeToMailingList(
emailSignupModel,
inputFields,
)
}

return { subscribed: false }
}
}
13 changes: 0 additions & 13 deletions libs/api/domains/email-signup/src/lib/serviceProvider.ts

This file was deleted.

Loading

0 comments on commit b7e2476

Please sign in to comment.