fix: FIFO queue for waitlisting; send email for application form; EU logo in contact page in light mode
This commit is contained in:
@@ -13,7 +13,7 @@
|
||||
"attributes": {
|
||||
"opportunity": {
|
||||
"type": "relation",
|
||||
"relation": "oneToOne",
|
||||
"relation": "manyToOne",
|
||||
"target": "api::opportunity.opportunity"
|
||||
},
|
||||
"applicantName": {
|
||||
|
||||
@@ -1,7 +1,68 @@
|
||||
/**
|
||||
* application service
|
||||
*
|
||||
* `create` is overridden to fire the acknowledgement e-mail *after* the row is
|
||||
* written, mirroring the event-registration service. The send is deliberately
|
||||
* not awaited: a slow or failing SMTP call must never turn the application
|
||||
* POST into a 502. The mail helper stamps `acknowledgementSentAt` only when
|
||||
* the provider accepted the mail, and swallows and logs its own errors.
|
||||
*/
|
||||
|
||||
import { factories } from '@strapi/strapi';
|
||||
|
||||
export default factories.createCoreService('api::application.application');
|
||||
import { sendApplicationAcknowledgement } from '../../../lib/application-mail';
|
||||
|
||||
const APPLICATIONS_UID = 'api::application.application';
|
||||
const LOG_PREFIX = '[application]';
|
||||
|
||||
/**
|
||||
* The `opportunity` value a client may have sent is a documentId (what the
|
||||
* REST API uses for relations), or a legacy numeric id. The Get Involved form
|
||||
* sends none at all - an application is not always filed against a call.
|
||||
*/
|
||||
const readOpportunityReference = (value: unknown): { documentId?: string; id?: number } | undefined => {
|
||||
if (typeof value === 'string' && value.length > 0) {
|
||||
return { documentId: value };
|
||||
}
|
||||
|
||||
if (typeof value === 'number' && Number.isInteger(value)) {
|
||||
return { id: value };
|
||||
}
|
||||
|
||||
return undefined;
|
||||
};
|
||||
|
||||
const readCreatedResult = (result: unknown): { documentId?: unknown; email?: unknown } =>
|
||||
(typeof result === 'object' && result !== null ? result : {}) as {
|
||||
documentId?: unknown;
|
||||
email?: unknown;
|
||||
};
|
||||
|
||||
export default factories.createCoreService(APPLICATIONS_UID, ({ strapi }) => ({
|
||||
async create(params: { data?: { opportunity?: unknown } } & Record<string, unknown>) {
|
||||
const result = await super.create(params);
|
||||
|
||||
const { documentId, email } = readCreatedResult(result);
|
||||
|
||||
if (typeof documentId === 'string' && documentId.length > 0) {
|
||||
if (typeof email === 'string' && email.length > 0) {
|
||||
void sendApplicationAcknowledgement({
|
||||
strapi,
|
||||
to: email,
|
||||
applicationDocumentId: documentId,
|
||||
opportunityReference: readOpportunityReference(params.data?.opportunity),
|
||||
});
|
||||
} else {
|
||||
strapi.log.warn(
|
||||
`${LOG_PREFIX} no email on the created application; acknowledgement skipped.`,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
strapi.log.warn(
|
||||
`${LOG_PREFIX} no document id on the created application; acknowledgement skipped.`,
|
||||
);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user