Fix hacktoberfest applications (#15613)

As title, make them syncable with twenty-cli:0.2.0
<img width="1025" height="693" alt="image"
src="https://github.com/user-attachments/assets/a18f8ba3-b6fc-40e9-84dd-446ff8deeb04"
/>
This commit is contained in:
martmull
2025-11-04 18:40:06 +01:00
committed by GitHub
parent b5064e88f6
commit 86a6e04d78
86 changed files with 2329 additions and 981 deletions
@@ -1,12 +0,0 @@
{
"$schema": "https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-cli/src/constants/schemas/serverlessFunction.schema.json",
"universalIdentifier": "c5b0e3f7-cbbd-4bd6-b01c-150d52cf2ce9",
"name": "summarise-and-send",
"triggers": [
{
"universalIdentifier": "36e1c4c7-8664-4d6d-a88f-ac56f1bd0651",
"type": "cron",
"schedule": "0 9 * * *"
}
]
}
@@ -1,15 +1,16 @@
import { summariseOpportunityCreation } from "./opportunity-creation-summariser";
import { summarisePeopleCreation } from "./people-creation-summariser";
import { sendToDiscord, sendToSlack, sendToWhatsApp } from "./senders";
import { summariseTaskCreation } from "./task-creation-summariser";
import { summariseOpportunityCreation } from './opportunity-creation-summariser';
import { summarisePeopleCreation } from './people-creation-summariser';
import { sendToDiscord, sendToSlack, sendToWhatsApp } from './senders';
import { summariseTaskCreation } from './task-creation-summariser';
import { type ServerlessFunctionConfig } from 'twenty-sdk/application';
export const main = async (): Promise<object> => {
let date: string | Date = new Date()
date.setDate(new Date().getDate() - Number(process.env.DAYS_AGO))
date = date.toISOString().substring(0, 10)
const peopleCreationSummary = await summarisePeopleCreation(date)
const opportunityCreationSummary = await summariseOpportunityCreation(date)
const taskCreationSummary = await summariseTaskCreation(date)
let date: string | Date = new Date();
date.setDate(new Date().getDate() - Number(process.env.DAYS_AGO));
date = date.toISOString().substring(0, 10);
const peopleCreationSummary = await summarisePeopleCreation(date);
const opportunityCreationSummary = await summariseOpportunityCreation(date);
const taskCreationSummary = await summariseTaskCreation(date);
let body = {
daysAgo: Number(process.env.DAYS_AGO),
@@ -19,19 +20,19 @@ export const main = async (): Promise<object> => {
discord: {},
whatsapp: {},
slack: {},
}
};
if (process.env.SLACK_HOOK_URL) {
const slackBody = await sendToSlack({
peopleCreationSummary,
opportunityCreationSummary,
taskCreationSummary,
})
});
body = {
...body,
slack: slackBody,
}
};
}
if (process.env.DISCORD_WEBHOOK_URL) {
@@ -39,26 +40,41 @@ export const main = async (): Promise<object> => {
peopleCreationSummary,
opportunityCreationSummary,
taskCreationSummary,
})
});
body = {
...body,
discord: discordBody,
}
};
}
if (process.env.FB_GRAPH_TOKEN && process.env.WHATSAPP_RECIPIENT_PHONE_NUMBER) {
if (
process.env.FB_GRAPH_TOKEN &&
process.env.WHATSAPP_RECIPIENT_PHONE_NUMBER
) {
const whatsappBody = await sendToWhatsApp({
peopleCreationSummary,
opportunityCreationSummary,
taskCreationSummary,
})
});
body = {
...body,
whatsapp: whatsappBody,
}
};
}
return body
}
return body;
};
export const config: ServerlessFunctionConfig = {
universalIdentifier: 'c5b0e3f7-cbbd-4bd6-b01c-150d52cf2ce9',
name: 'summarise-and-send',
triggers: [
{
universalIdentifier: '36e1c4c7-8664-4d6d-a88f-ac56f1bd0651',
type: 'cron',
pattern: '0 9 * * *',
},
],
};
@@ -1,93 +1,97 @@
export const sendToSlack = async (params: {
peopleCreationSummary: string
opportunityCreationSummary: string
taskCreationSummary: string
}) => {
const { peopleCreationSummary, opportunityCreationSummary, taskCreationSummary } = params
const slackMessage = {
"blocks": [
{
"type": "header",
"text": {
"type": "plain_text",
"text": `Bonjour! 🥖 Je m'appelle Kylian Mbaguette. Over the last ${process.env.DAYS_AGO} days`,
"emoji": true
}
},
{
"type": "header",
"text": {
"type": "plain_text",
"text": "🧑‍💻 People & Companies",
"emoji": true
}
},
{
"type": "section",
"text": {
"type": "plain_text",
"text": peopleCreationSummary,
"emoji": true
}
},
{
"type": "header",
"text": {
"type": "plain_text",
"text": "🎯 Opportunities",
"emoji": true
}
},
{
"type": "section",
"text": {
"type": "plain_text",
"text": opportunityCreationSummary,
"emoji": true
}
},
{
"type": "header",
"text": {
"type": "plain_text",
"text": "📋 Tasks",
"emoji": true
}
},
{
"type": "section",
"text": {
"type": "plain_text",
"text": taskCreationSummary,
"emoji": true
}
},
]
}
const response = await fetch(process.env.SLACK_HOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(slackMessage),
})
return {
formattedMesage: slackMessage,
webhookStatus: response.status,
}
}
export const sendToDiscord = async (params: {
peopleCreationSummary: string
opportunityCreationSummary: string
taskCreationSummary: string
peopleCreationSummary: string;
opportunityCreationSummary: string;
taskCreationSummary: string;
}) => {
const {
peopleCreationSummary,
opportunityCreationSummary,
taskCreationSummary,
} = params
} = params;
const slackMessage = {
blocks: [
{
type: 'header',
text: {
type: 'plain_text',
text: `Bonjour! 🥖 Je m'appelle Kylian Mbaguette. Over the last ${process.env.DAYS_AGO} days`,
emoji: true,
},
},
{
type: 'header',
text: {
type: 'plain_text',
text: '🧑‍💻 People & Companies',
emoji: true,
},
},
{
type: 'section',
text: {
type: 'plain_text',
text: peopleCreationSummary,
emoji: true,
},
},
{
type: 'header',
text: {
type: 'plain_text',
text: '🎯 Opportunities',
emoji: true,
},
},
{
type: 'section',
text: {
type: 'plain_text',
text: opportunityCreationSummary,
emoji: true,
},
},
{
type: 'header',
text: {
type: 'plain_text',
text: '📋 Tasks',
emoji: true,
},
},
{
type: 'section',
text: {
type: 'plain_text',
text: taskCreationSummary,
emoji: true,
},
},
],
};
const response = await fetch(process.env.SLACK_HOOK_URL ?? '', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(slackMessage),
});
return {
formattedMesage: slackMessage,
webhookStatus: response.status,
};
};
export const sendToDiscord = async (params: {
peopleCreationSummary: string;
opportunityCreationSummary: string;
taskCreationSummary: string;
}) => {
const {
peopleCreationSummary,
opportunityCreationSummary,
taskCreationSummary,
} = params;
const formattedMesage = `Bonjour! 🥖 Je m'appelle Kylian Mbaguette. Over the last ${process.env.DAYS_AGO} days:
**🧑‍💻 People & Companies**
@@ -97,36 +101,35 @@ ${peopleCreationSummary}
${opportunityCreationSummary}
**📋 Tasks**
${taskCreationSummary}`
${taskCreationSummary}`;
const body = {
username: "Twenty Bot",
username: 'Twenty Bot',
content: formattedMesage,
}
};
const response = await fetch(process.env.DISCORD_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
const response = await fetch(process.env.DISCORD_WEBHOOK_URL ?? '', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body),
})
});
return {
formattedMesage,
webhookStatus: response.status,
}
}
};
};
export const sendToWhatsApp = async (params: {
peopleCreationSummary: string
opportunityCreationSummary: string
taskCreationSummary: string
peopleCreationSummary: string;
opportunityCreationSummary: string;
taskCreationSummary: string;
}): Promise<object> => {
const {
peopleCreationSummary,
opportunityCreationSummary,
taskCreationSummary,
} = params
} = params;
const formattedMesage = `Bonjour! 🥖 Je m'appelle Kylian Mbaguette. Over the last ${process.env.DAYS_AGO} days:
*🧑‍💻 People & Companies*
@@ -136,31 +139,34 @@ ${peopleCreationSummary}
${opportunityCreationSummary}
*📋 Tasks*
${taskCreationSummary}`
${taskCreationSummary}`;
const response = await fetch('https://graph.facebook.com/v22.0/828771160324576/messages', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.FB_GRAPH_TOKEN}`
const response = await fetch(
'https://graph.facebook.com/v22.0/828771160324576/messages',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.FB_GRAPH_TOKEN}`,
},
body: JSON.stringify({
messaging_product: 'whatsapp',
recipient_type: 'individual',
to: process.env.WHATSAPP_RECIPIENT_PHONE_NUMBER,
type: 'text',
text: {
preview_url: true,
body: formattedMesage,
},
}),
},
body: JSON.stringify({
"messaging_product": "whatsapp",
"recipient_type": "individual",
"to": process.env.WHATSAPP_RECIPIENT_PHONE_NUMBER,
"type": "text",
"text": {
"preview_url": true,
"body": formattedMesage,
}
})
})
);
const responseBody = await response.json()
const responseBody = await response.json();
return {
formattedMesage,
webhookStatus: response.status,
webhookResponse: responseBody,
}
}
};
};