feat: use Odoo public API for email subscription
This update removes the newsletter subscription endpoint as the functionality has been integrated into Odoo as a custom module
This commit is contained in:
parent
3d60b443ee
commit
ba376c1b41
7
.env
7
.env
|
@ -5,8 +5,5 @@ REVALIDATE_WEBHOOK_TOKEN=
|
|||
DISCORD_LOGS_WEBHOOK_URL=
|
||||
NEXT_PUBLIC_SITE_URL=
|
||||
FATHOM_SITE_ID=
|
||||
ODOO_DB=
|
||||
ODOO_USERNAME=
|
||||
ODOO_BASE_URL=
|
||||
ODOO_API_KEY=
|
||||
ODOO_MAILING_LIST_ID=
|
||||
NEXT_PUBLIC_ODOO_BASE_URL=https://odoo.logos.co
|
||||
NEXT_PUBLIC_ODOO_MAILING_LIST_ID=2
|
|
@ -56,14 +56,7 @@ export default function NewsletterSubscriptionForm({
|
|||
<StyledTextField
|
||||
id="firstName"
|
||||
inputProps={{ name: 'firstName', disabled }}
|
||||
placeholder="First Name"
|
||||
disabled={disabled}
|
||||
/>
|
||||
|
||||
<StyledTextField
|
||||
id="lastName"
|
||||
inputProps={{ name: 'lastName', disabled }}
|
||||
placeholder="Last Name"
|
||||
placeholder="First name or pseudonym"
|
||||
disabled={disabled}
|
||||
/>
|
||||
|
||||
|
|
|
@ -53,7 +53,6 @@ export default function NewsletterSubscriptionDialog({
|
|||
|
||||
try {
|
||||
const firstName = e.currentTarget.firstName.value || ''
|
||||
const lastName = e.currentTarget.lastName.value || ''
|
||||
const email = e.currentTarget.email.value
|
||||
|
||||
if (email === 'successtest@successtest.com') {
|
||||
|
@ -63,11 +62,10 @@ export default function NewsletterSubscriptionDialog({
|
|||
} else {
|
||||
const apiResponse = await api.subscribeToMailingList({
|
||||
email,
|
||||
firstName,
|
||||
lastName,
|
||||
name: firstName,
|
||||
})
|
||||
|
||||
setSuccessMessage(apiResponse.message)
|
||||
setSuccessMessage(apiResponse.result.message)
|
||||
}
|
||||
} catch (error) {
|
||||
setErrorMessage(defaultErrorMessage)
|
||||
|
|
|
@ -1,122 +0,0 @@
|
|||
import type { NextApiRequest, NextApiResponse } from 'next'
|
||||
import Odoo from 'odoo-await'
|
||||
import * as yup from 'yup'
|
||||
import { settle } from '../../../utils/promise.utils'
|
||||
|
||||
const formSchema = yup.object().shape({
|
||||
firstName: yup.string().optional(),
|
||||
lastName: yup.string().optional(),
|
||||
email: yup.string().email().required(),
|
||||
})
|
||||
|
||||
const {
|
||||
ODOO_DB = '',
|
||||
ODOO_USERNAME = '',
|
||||
ODOO_BASE_URL = '',
|
||||
ODOO_API_KEY = '',
|
||||
} = process.env
|
||||
|
||||
const ODOO_MAILING_LIST_ID = parseInt(
|
||||
process.env.ODOO_MAILING_LIST_ID || '0',
|
||||
10,
|
||||
)
|
||||
|
||||
const client = new Odoo({
|
||||
db: ODOO_DB,
|
||||
username: ODOO_USERNAME,
|
||||
baseUrl: ODOO_BASE_URL,
|
||||
password: ODOO_API_KEY,
|
||||
})
|
||||
|
||||
const isSubscribed = async (
|
||||
client: Odoo,
|
||||
mailingListId: number,
|
||||
email: string,
|
||||
) => {
|
||||
const [subscription] = await client.search('mailing.contact.subscription', [
|
||||
['list_id', '=', mailingListId],
|
||||
['contact_id.email', '=', email],
|
||||
])
|
||||
|
||||
return [!!subscription, subscription]
|
||||
}
|
||||
|
||||
const createContact = async (
|
||||
client: Odoo,
|
||||
payload: {
|
||||
firstName?: string
|
||||
lastName?: string
|
||||
email: string
|
||||
},
|
||||
) => {
|
||||
const name =
|
||||
[payload.firstName, payload.lastName].join(' ').trim() || payload.email
|
||||
|
||||
let [contact] = await client.search('mailing.contact', [
|
||||
'email',
|
||||
'=',
|
||||
payload.email,
|
||||
])
|
||||
|
||||
if (!contact) {
|
||||
contact = await client.create('mailing.contact', {
|
||||
name: name,
|
||||
email: payload.email,
|
||||
x_first_name: payload.firstName,
|
||||
x_last_name: payload.lastName,
|
||||
})
|
||||
}
|
||||
|
||||
return contact
|
||||
}
|
||||
|
||||
const subscribe = async (
|
||||
client: Odoo,
|
||||
contactId: number,
|
||||
mailingListId: number,
|
||||
) => {
|
||||
const subscription = await client.create('mailing.contact.subscription', {
|
||||
contact_id: contactId,
|
||||
list_id: mailingListId,
|
||||
})
|
||||
|
||||
return subscription
|
||||
}
|
||||
|
||||
export default async function handler(
|
||||
req: NextApiRequest,
|
||||
res: NextApiResponse<any>,
|
||||
) {
|
||||
if (req.method !== 'POST')
|
||||
return res.status(405).json({ message: 'Method not allowed' })
|
||||
|
||||
const [payload, err] = await settle(() => formSchema.validate(req.body))
|
||||
|
||||
if (err)
|
||||
return res.status(400).json({
|
||||
message: err.message,
|
||||
data: {},
|
||||
})
|
||||
|
||||
await client.connect()
|
||||
|
||||
const [subscribed] = await isSubscribed(
|
||||
client,
|
||||
ODOO_MAILING_LIST_ID,
|
||||
payload.email,
|
||||
)
|
||||
|
||||
if (subscribed) {
|
||||
return res.status(200).json({
|
||||
message: 'Already subscribed',
|
||||
data: {},
|
||||
})
|
||||
}
|
||||
|
||||
const contact = await createContact(client, payload)
|
||||
await subscribe(client, contact, ODOO_MAILING_LIST_ID)
|
||||
|
||||
res.status(200).json({
|
||||
message: 'Subscribed successfully!',
|
||||
})
|
||||
}
|
|
@ -82,23 +82,31 @@ export class ApiService {
|
|||
|
||||
subscribeToMailingList = async (payload: {
|
||||
email: string
|
||||
firstName?: string
|
||||
lastName?: string
|
||||
}) => {
|
||||
const res = await fetch('/api/newsletter/subscribe', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify(payload),
|
||||
})
|
||||
|
||||
if (res.status >= 400) {
|
||||
// Handle errors for status codes 400 and 500
|
||||
const errorMessage = `Error: ${res.status} - ${res.statusText}`
|
||||
console.error(errorMessage)
|
||||
throw new Error(errorMessage)
|
||||
name?: string
|
||||
}): Promise<{
|
||||
result: {
|
||||
message: string
|
||||
}
|
||||
}> => {
|
||||
const res = await fetch(
|
||||
`${process.env.NEXT_PUBLIC_ODOO_BASE_URL}/website_mass_mailing/subscribe2`,
|
||||
{
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
jsonrpc: '2.0',
|
||||
method: 'call',
|
||||
params: {
|
||||
value: payload.email,
|
||||
name: payload.name || '',
|
||||
list_id: process.env.NEXT_PUBLIC_ODOO_MAILING_LIST_ID,
|
||||
subscription_type: 'email',
|
||||
},
|
||||
}),
|
||||
},
|
||||
)
|
||||
|
||||
return res.json()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue