From 5893a2e66564eab94176b0f9791e87050b566272 Mon Sep 17 00:00:00 2001 From: Eric van der Vlist Date: Sun, 5 Mar 2023 17:19:03 +0100 Subject: [PATCH] Implementing a send invitation action --- src/components/user/User.tsx | 19 ++++++++++- src/mail-template/email.handlebars | 29 ++++++++++------- src/mail-template/invitation.handlebars | 34 +++++++++++++++++++ src/routes/user/[id].tsx | 43 +++++++++++++++++++++++++ 4 files changed, 112 insertions(+), 13 deletions(-) create mode 100644 src/mail-template/invitation.handlebars diff --git a/src/components/user/User.tsx b/src/components/user/User.tsx index fb5b80d..bb60e92 100644 --- a/src/components/user/User.tsx +++ b/src/components/user/User.tsx @@ -22,6 +22,7 @@ import { update } from '~/lib/update'; import { replicationDocument } from '~/lib/replication-document'; import { get } from '~/lib/get'; import { v4 as uuid } from 'uuid'; +import { sendInvitation } from '~/routes/user/[id]'; interface Props { values?: () => any; @@ -301,6 +302,15 @@ const User: Component = (props) => { }; } + const sendInvitationHandler = () => { + sendInvitation({ + id: userId(data('username'), data('database')), + mail: data('mail'), + webInvitation: invitationLink(), + appInvitation: invitationLink('geo'), + }); + }; + console.log({ caller: 'User ', props, @@ -339,7 +349,8 @@ const User: Component = (props) => { Invitations : https - , + + , geo @@ -427,6 +438,12 @@ const User: Component = (props) => { Save + + Send invitation + Delete diff --git a/src/mail-template/email.handlebars b/src/mail-template/email.handlebars index f7101f5..2ec5afd 100644 --- a/src/mail-template/email.handlebars +++ b/src/mail-template/email.handlebars @@ -1,14 +1,19 @@ - - - - - Validation - - -

Bienvenue {{id}}!

-

Le code de validation de votre configuration pour l'application Dyomedea est {{code}}.

-

Ce code est valable pendant quinze minutes.

-

Eric

- + + + + Validation + + +

Bienvenue {{id}}!

+

Le code de validation de votre configuration pour l'application Dyomedea + est + {{code}}.

+

Ce code est valable pendant quinze minutes.

+

Eric

+

PS: vérifiez dans vos spams, notamment si vous utilisez gmail qui a + tendance à trouver que ce mail ressemble à du hameçonnage bien qu'il ne + contienne aucun lien. +

+ \ No newline at end of file diff --git a/src/mail-template/invitation.handlebars b/src/mail-template/invitation.handlebars new file mode 100644 index 0000000..e880f5b --- /dev/null +++ b/src/mail-template/invitation.handlebars @@ -0,0 +1,34 @@ + + + + + Invitation + + +

Bienvenue {{id}}!

+

Ce message est une invitation à + configurer + l'application + Dyomedea.

+

L'application peut être exécutée dans un navigateur sur n’importe quelle + plateforme (ordinateur, tablette, téléphone, …) ou sous la forme d’une + application Android. +

+

Pour configurer Dyomedea dans un navigateur, cliquez sur + ce lien.

+

Pour configurer l'application Android, commencez par télécharger et + installer l'application sur + son site web. A plusieurs reprises + Android essayera de vous dissuader mais je peux vous assurer que cette + application est moins dangereuse pour votre sécurité et votre vie privée + que les application Google !

+

Lorsque l'application sera installée, vous pourrez la configurer en + suivant + ce lien + sur votre téléphone. +

+

Eric

+ + \ No newline at end of file diff --git a/src/routes/user/[id].tsx b/src/routes/user/[id].tsx index 13430ec..2c397af 100644 --- a/src/routes/user/[id].tsx +++ b/src/routes/user/[id].tsx @@ -3,6 +3,49 @@ import User from '~/components/user'; import { createEffect, createSignal, Show } from 'solid-js'; import { adminCredentials, CheckCredentials } from '~/components/credentials'; import { get } from '~/lib/get'; +import { createServerAction$ } from 'solid-start/server'; +import { readConfig } from '~/server-only-lib/read-config'; +import { createTransport } from 'nodemailer'; +import { resolve } from 'path'; +import hbs from 'nodemailer-express-handlebars'; + +export const [sendingInvitation, sendInvitation] = createServerAction$( + async (args: { + id: string; + mail: string; + webInvitation: string; + appInvitation: string; + }) => { + const { id, mail, webInvitation, appInvitation } = args; + const { credentials, mailer } = readConfig(); + const transporter = createTransport(mailer); + + const handlebarOptions = { + viewEngine: { + partialsDir: resolve('src/mail-template/'), + defaultLayout: false, + }, + viewPath: resolve('src/mail-template/'), + }; + transporter.use('compile', hbs(handlebarOptions)); + + const code = [...Array(6)].map((_) => (Math.random() * 10) | 0).join(''); + + const mailOptions = { + from: '"Dyomedea app" ', // sender address + to: mail, // list of receivers + subject: "Invitation à configurer l'application Dyomedea.", + template: 'invitation', // the name of the template file i.e email.handlebars + context: { + id, + webInvitation, + appInvitation, + }, + }; + + await transporter.sendMail(mailOptions); + } +); export default () => { const { id } = useParams();