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:
Hossein Mehrabi 2023-12-01 16:09:16 +03:30
parent 3d60b443ee
commit ba376c1b41
No known key found for this signature in database
GPG Key ID: 45C04964191AFAA1
5 changed files with 29 additions and 155 deletions

7
.env
View File

@ -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

View File

@ -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}
/>

View File

@ -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)

View File

@ -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!',
})
}

View File

@ -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()
}