Update email code to send an email per EditUserCell

using multiple recipients is break of privacy since user will be able
to see each other's emails.
This commit is contained in:
Kurt Hutten
2021-07-01 20:12:17 +10:00
parent 43376b8214
commit 084c4afdc3
7 changed files with 31 additions and 14 deletions

View File

@@ -7,8 +7,6 @@ export const schema = gql`
type EmailResponse { type EmailResponse {
accepted: [String!]! accepted: [String!]!
rejected: [String!]! rejected: [String!]!
messageId: String!
envelope: Envelope
} }
input Email { input Email {

View File

@@ -1,7 +1,7 @@
import nodemailer, { SendMailOptions } from 'nodemailer' import nodemailer, { SendMailOptions } from 'nodemailer'
interface Args { export interface SendMailArgs {
to: SendMailOptions['to'] to: string
from: SendMailOptions['from'] from: SendMailOptions['from']
subject: string subject: string
text: string text: string
@@ -26,7 +26,7 @@ export function sendMail({
from, from,
subject, subject,
text, text,
}: Args): Promise<SuccessResult> { }: SendMailArgs): Promise<SuccessResult> {
const transporter = nodemailer.createTransport({ const transporter = nodemailer.createTransport({
host: 'smtp.mailgun.org', host: 'smtp.mailgun.org',
port: 587, port: 587,

View File

@@ -1,26 +1,45 @@
import { requireAuth } from 'src/lib/auth' import { requireAuth } from 'src/lib/auth'
import { sendMail } from 'src/lib/sendmail' import { sendMail } from 'src/lib/sendmail'
import type { SendMailArgs } from 'src/lib/sendmail'
import { users } from 'src/services/users/users' import { users } from 'src/services/users/users'
export const sendAllUsersEmail = async ({ input: { body, subject } }) => { export const sendAllUsersEmail = async ({ input: { body, subject } }) => {
requireAuth({ role: 'admin' }) requireAuth({ role: 'admin' })
const recipients = (await users()).map(({ email }) => email)
const from = { const from = {
address: 'news@mail.cadhub.xyz', address: 'news@mail.cadhub.xyz',
name: 'CadHub', name: 'CadHub',
} }
const result = await sendMail({ const emails: SendMailArgs[] = (await users()).map(({ email }) => ({
to: recipients, to: email,
from, from,
subject, subject,
text: body, text: body,
}))
const emailPromises = emails.map((email) => sendMail(email))
const accepted = []
const rejected = []
const result = await Promise.allSettled(emailPromises)
result.forEach((result) => {
if (result.status === 'fulfilled') {
accepted.push(result.value.accepted[0])
} else {
rejected.push(result.reason)
}
}) })
await sendMail({ await sendMail({
to: 'k.hutten@protonmail.ch', to: 'k.hutten@protonmail.ch',
from, from,
subject: `All users email report`, subject: `All users email report`,
text: JSON.stringify(result, null, 2), text: JSON.stringify(
{
accepted,
rejected,
originalEmailList: emails,
},
null,
2
),
}) })
return result return { accepted, rejected }
} }

View File

@@ -5,7 +5,7 @@ import { Link, routes } from '@redwoodjs/router'
import { QUERY } from 'src/components/AdminPartsCell' import { QUERY } from 'src/components/AdminPartsCell'
const DELETE_PART_MUTATION = gql` const DELETE_PART_MUTATION = gql`
mutation DeletePartMutation($id: String!) { mutation DeletePartMutationAdmin($id: String!) {
deletePart(id: $id) { deletePart(id: $id) {
id id
} }

View File

@@ -3,7 +3,7 @@ import { Link, routes } from '@redwoodjs/router'
import AdminParts from 'src/components/AdminParts' import AdminParts from 'src/components/AdminParts'
export const QUERY = gql` export const QUERY = gql`
query PARTS { query PARTS_ADMIN {
parts { parts {
id id
title title

View File

@@ -5,7 +5,7 @@ import { navigate, routes } from '@redwoodjs/router'
import UserProfile from 'src/components/UserProfile' import UserProfile from 'src/components/UserProfile'
export const QUERY = gql` export const QUERY = gql`
query FIND_USER_BY_ID($userName: String!) { query FIND_USER_BY_USERNAME($userName: String!) {
user: userName(userName: $userName) { user: userName(userName: $userName) {
id id
userName userName

View File

@@ -24,7 +24,7 @@ export const QUERY = gql`
` `
const UPDATE_PART_MUTATION = gql` const UPDATE_PART_MUTATION = gql`
mutation UpdatePartMutation($id: String!, $input: UpdatePartInput!) { mutation UpdatePartMutationIde($id: String!, $input: UpdatePartInput!) {
updatePart(id: $id, input: $input) { updatePart(id: $id, input: $input) {
id id
} }