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:
@@ -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 {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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 }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user