From 0da15443cbb45cacc12235309fc0752d55bfde41 Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Tue, 29 Jun 2021 06:37:04 +1000 Subject: [PATCH 1/5] Add email integration to be able to broadcast emails to all users. Resolves #388 --- .vscode/settings.json | 3 +- app/.env.defaults | 11 ++++ app/api/package.json | 6 +- app/api/src/functions/identity-signup.js | 2 +- app/api/src/graphql/email.sdl.ts | 22 ++++++++ app/api/src/lib/{auth.js => auth.ts} | 3 +- app/api/src/lib/sendmail.ts | 56 +++++++++++++++++++ app/api/src/services/email/email.ts | 18 ++++++ .../src/services/users/{users.js => users.ts} | 0 app/redwood.toml | 3 +- app/web/src/Routes.js | 1 + .../pages/AdminEmailPage/AdminEmailPage.tsx | 41 ++++++++++++++ app/yarn.lock | 12 ++++ 13 files changed, 173 insertions(+), 5 deletions(-) create mode 100644 app/api/src/graphql/email.sdl.ts rename app/api/src/lib/{auth.js => auth.ts} (97%) create mode 100644 app/api/src/lib/sendmail.ts create mode 100644 app/api/src/services/email/email.ts rename app/api/src/services/users/{users.js => users.ts} (100%) create mode 100644 app/web/src/pages/AdminEmailPage/AdminEmailPage.tsx diff --git a/.vscode/settings.json b/.vscode/settings.json index 2532d6e..34de47f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "cSpell.words": [ - "Hutten" + "Hutten", + "sendmail" ] } diff --git a/app/.env.defaults b/app/.env.defaults index 2568da0..b8293a4 100644 --- a/app/.env.defaults +++ b/app/.env.defaults @@ -17,3 +17,14 @@ CLOUDINARY_API_KEY=476712943135152 # See: https://redwoodjs.com/docs/logger for level options: # trace | info | debug | warn | error | silent # LOG_LEVEL=debug + + +# EMAIL_PASSWORD=abc123 + + +CAD_LAMBDA_BASE_URL="http://localhost:8080" + +# sentry +GITHUB_ASSIST_APP_ID=23342 +GITHUB_ASSIST_SECRET=abc +GITHUB_ASSIST_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nabcdefg\n-----END RSA PRIVATE KEY-----" diff --git a/app/api/package.json b/app/api/package.json index 726461b..83c4250 100644 --- a/app/api/package.json +++ b/app/api/package.json @@ -5,6 +5,10 @@ "dependencies": { "@redwoodjs/api": "^0.34.1", "@sentry/node": "^6.5.1", - "cloudinary": "^1.23.0" + "cloudinary": "^1.23.0", + "nodemailer": "^6.6.2" + }, + "devDependencies": { + "@types/nodemailer": "^6.4.2" } } diff --git a/app/api/src/functions/identity-signup.js b/app/api/src/functions/identity-signup.js index 4d128cc..61426fe 100644 --- a/app/api/src/functions/identity-signup.js +++ b/app/api/src/functions/identity-signup.js @@ -1,4 +1,4 @@ -import { createUserInsecure } from 'src/services/users/users.js' +import { createUserInsecure } from 'src/services/users/users' import { db } from 'src/lib/db' import { sentryWrapper } from 'src/lib/sentry' import { enforceAlphaNumeric, generateUniqueString } from 'src/services/helpers' diff --git a/app/api/src/graphql/email.sdl.ts b/app/api/src/graphql/email.sdl.ts new file mode 100644 index 0000000..81ae8fa --- /dev/null +++ b/app/api/src/graphql/email.sdl.ts @@ -0,0 +1,22 @@ +export const schema = gql` + type Envelope { + from: String + to: [String!]! + } + + type EmailResponse { + accepted: [String!]! + rejected: [String!]! + messageId: String! + envelope: Envelope + } + + input Email { + subject: String! + body: String! + } + + type Mutation { + sendAllUsersEmail(input: Email!): EmailResponse! + } +` diff --git a/app/api/src/lib/auth.js b/app/api/src/lib/auth.ts similarity index 97% rename from app/api/src/lib/auth.js rename to app/api/src/lib/auth.ts index bab25b9..539b0e9 100644 --- a/app/api/src/lib/auth.js +++ b/app/api/src/lib/auth.ts @@ -121,7 +121,8 @@ export const getCurrentUser = async (decoded, { _token, _type }) => { * requireAuth({ role: ['editor', 'author'] }) * requireAuth({ role: ['publisher'] }) */ -export const requireAuth = ({ role } = {}) => { +export const requireAuth = ({ role }: {role?: string | string[]} = {}) => { + console.log(context.currentUser) if (!context.currentUser) { throw new AuthenticationError("You don't have permission to do that.") } diff --git a/app/api/src/lib/sendmail.ts b/app/api/src/lib/sendmail.ts new file mode 100644 index 0000000..c4d216e --- /dev/null +++ b/app/api/src/lib/sendmail.ts @@ -0,0 +1,56 @@ +import nodemailer, {SendMailOptions} from 'nodemailer' + +interface Args { + to: SendMailOptions['to'] + from: SendMailOptions['from'] + subject: string + text: string +} + +interface SuccessResult { + accepted: string[] + rejected: string[] + envelopeTime: number + messageTime: number + messageSize: number + response: string + envelope: { + from: string | false, + to: string[] + }, + messageId: string +} + +export function sendMail({to, from, subject, text}: Args): Promise { + let transporter = nodemailer.createTransport({ + host: 'smtp.mailgun.org', + port: 587, + secure: false, + tls: { + ciphers:'SSLv3' + }, + auth: { + user: 'postmaster@mail.cadhub.xyz', + pass: process.env.EMAIL_PASSWORD + } + }); + + console.log({to, from, subject, text}); + + const emailPromise = new Promise((resolve, reject) => { + transporter.sendMail({ + from, + to, + subject, + text, + }, (error, info) => { + if (error) { + reject(error); + } else { + resolve(info); + } + }); + }) as any as Promise + return emailPromise +} + diff --git a/app/api/src/services/email/email.ts b/app/api/src/services/email/email.ts new file mode 100644 index 0000000..a45a178 --- /dev/null +++ b/app/api/src/services/email/email.ts @@ -0,0 +1,18 @@ +import { requireAuth } from 'src/lib/auth' +import {sendMail} from 'src/lib/sendmail' +import {users} from 'src/services/users/users' + +export const sendAllUsersEmail = async ({input: {body, subject}}) => { + requireAuth({ role: 'admin' }) + const recipients = (await users()).map(({email}) => email) + const from = { + address:'news@mail.cadhub.xyz', + name: 'CadHub', + } + return sendMail({ + to: recipients, + from, + subject, + text: body, + }) +} diff --git a/app/api/src/services/users/users.js b/app/api/src/services/users/users.ts similarity index 100% rename from app/api/src/services/users/users.js rename to app/api/src/services/users/users.ts diff --git a/app/redwood.toml b/app/redwood.toml index f5c2b01..762f83b 100644 --- a/app/redwood.toml +++ b/app/redwood.toml @@ -16,7 +16,8 @@ 'SENTRY_DSN', 'SENTRY_AUTH_TOKEN', 'SENTRY_ORG', - 'SENTRY_PROJECT' + 'SENTRY_PROJECT', + 'EMAIL_PASSWORD' ] # experimentalFastRefresh = true # this seems to break cascadeStudio [api] diff --git a/app/web/src/Routes.js b/app/web/src/Routes.js index e7ec58d..5d4dfc8 100644 --- a/app/web/src/Routes.js +++ b/app/web/src/Routes.js @@ -62,6 +62,7 @@ const Routes = () => { + ) diff --git a/app/web/src/pages/AdminEmailPage/AdminEmailPage.tsx b/app/web/src/pages/AdminEmailPage/AdminEmailPage.tsx new file mode 100644 index 0000000..c36d18e --- /dev/null +++ b/app/web/src/pages/AdminEmailPage/AdminEmailPage.tsx @@ -0,0 +1,41 @@ +import {useState} from 'react' +import { useMutation } from '@redwoodjs/web' +import { toast, Toaster } from '@redwoodjs/web/toast' + +const SEND_EMAIL_MUTATION = gql` + mutation sendEmailMutation($email: Email!) { + sendAllUsersEmail(input: $email) { + accepted + } +} +` + +const AdminEmailPage = () => { + const [subject, setSubject] = useState('') + const [body, setBody] = useState('') + const [sendEmailMutation] = useMutation(SEND_EMAIL_MUTATION, { + onCompleted: ({sendAllUsersEmail}) => { + toast.success(`Emails sent, ${sendAllUsersEmail?.accepted.join(', ')}`) + setSubject('') + setBody('') + }, + }) + + const sendEmail = () => sendEmailMutation({ variables: { email: { subject, body } } }) + + return ( +
+
+

Email all users

+ + setSubject(target.value)}/> + + + +
+ +
+ ) +} + +export default AdminEmailPage diff --git a/app/yarn.lock b/app/yarn.lock index c4b5ddd..d66da50 100644 --- a/app/yarn.lock +++ b/app/yarn.lock @@ -3963,6 +3963,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== +"@types/nodemailer@^6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@types/nodemailer/-/nodemailer-6.4.2.tgz#d8ee254c969e6ad83fb9a0a0df3a817406a3fa3b" + integrity sha512-yhsqg5Xbr8aWdwjFS3QjkniW5/tLpWXtOYQcJdo9qE3DolBxsKzgRCQrteaMY0hos8MklJNSEsMqDpZynGzMNg== + dependencies: + "@types/node" "*" + "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -13070,6 +13077,11 @@ node-releases@^1.1.29, node-releases@^1.1.61, node-releases@^1.1.71: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== +nodemailer@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.6.2.tgz#e184c9ed5bee245a3e0bcabc7255866385757114" + integrity sha512-YSzu7TLbI+bsjCis/TZlAXBoM4y93HhlIgo0P5oiA2ua9Z4k+E2Fod//ybIzdJxOlXGRcHIh/WaeCBehvxZb/Q== + normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" From 98d1b0643db4d0072b5776efbd94e5886fa1b361 Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Tue, 29 Jun 2021 16:21:28 +1000 Subject: [PATCH 2/5] Add admin email notifications --- .../{identity-signup.js => identity-signup.ts} | 10 ++++++++++ app/api/src/services/email/email.ts | 10 +++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) rename app/api/src/functions/{identity-signup.js => identity-signup.ts} (92%) diff --git a/app/api/src/functions/identity-signup.js b/app/api/src/functions/identity-signup.ts similarity index 92% rename from app/api/src/functions/identity-signup.js rename to app/api/src/functions/identity-signup.ts index 61426fe..23cccd6 100644 --- a/app/api/src/functions/identity-signup.js +++ b/app/api/src/functions/identity-signup.ts @@ -3,6 +3,7 @@ import { db } from 'src/lib/db' import { sentryWrapper } from 'src/lib/sentry' import { enforceAlphaNumeric, generateUniqueString } from 'src/services/helpers' import 'graphql-tag' +import {sendMail} from 'src/lib/sendmail' const unWrappedHandler = async (req, _context) => { const body = JSON.parse(req.body) @@ -73,6 +74,15 @@ const unWrappedHandler = async (req, _context) => { id: user.id, } await createUserInsecure({ input }) + await sendMail({ + to: 'k.hutten@protonmail.ch', + from: { + address:'news@mail.cadhub.xyz', + name: 'CadHub', + }, + subject: `New Cadhub User`, + text: JSON.stringify(input, null, 2), + }) return { statusCode: 200, diff --git a/app/api/src/services/email/email.ts b/app/api/src/services/email/email.ts index a45a178..278296f 100644 --- a/app/api/src/services/email/email.ts +++ b/app/api/src/services/email/email.ts @@ -9,10 +9,18 @@ export const sendAllUsersEmail = async ({input: {body, subject}}) => { address:'news@mail.cadhub.xyz', name: 'CadHub', } - return sendMail({ + const result = await sendMail({ to: recipients, from, subject, text: body, }) + await sendMail({ + to: 'k.hutten@protonmail.ch', + from, + subject: `All users email report`, + text: JSON.stringify(result, null, 2), + }) + + return result } From 7417499d4bd67561d16c90612cf62e01c766a7b8 Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Tue, 29 Jun 2021 17:17:21 +1000 Subject: [PATCH 3/5] Formatting --- app/api/src/docker/aws-emulator.js | 29 ++++++----- app/api/src/docker/cadquery/runCQ.js | 7 +-- app/api/src/functions/identity-signup.ts | 6 +-- app/api/src/lib/auth.ts | 2 +- app/api/src/lib/sendmail.ts | 51 +++++++++++-------- app/api/src/services/email/email.ts | 10 ++-- app/web/src/components/Footer/Footer.js | 5 +- app/web/src/components/IdeViewer/IdeViewer.js | 6 +-- .../helpers/cadPackages/cadQueryController.js | 2 +- .../pages/AdminEmailPage/AdminEmailPage.tsx | 38 ++++++++++---- .../SubjectAccessRequestsPage.js | 2 +- 11 files changed, 92 insertions(+), 66 deletions(-) diff --git a/app/api/src/docker/aws-emulator.js b/app/api/src/docker/aws-emulator.js index 375eed1..eddaae4 100644 --- a/app/api/src/docker/aws-emulator.js +++ b/app/api/src/docker/aws-emulator.js @@ -10,19 +10,22 @@ app.use(cors()) const invocationURL = (port) => `http://localhost:${port}/2015-03-31/functions/function/invocations` -const makeRequest = (route, port) => [route, async (req, res) => { - console.log(`making post request to ${port}, ${route}`) - try { - const { data } = await axios.post(invocationURL(port), { - body: JSON.stringify(req.body), - }) - res.status(data.statusCode) - res.send(data.body) - } catch (e) { - res.status(500) - res.send() - } -}] +const makeRequest = (route, port) => [ + route, + async (req, res) => { + console.log(`making post request to ${port}, ${route}`) + try { + const { data } = await axios.post(invocationURL(port), { + body: JSON.stringify(req.body), + }) + res.status(data.statusCode) + res.send(data.body) + } catch (e) { + res.status(500) + res.send() + } + }, +] app.post(...makeRequest('/openscad/preview', 5052)) app.post(...makeRequest('/openscad/stl', 5053)) diff --git a/app/api/src/docker/cadquery/runCQ.js b/app/api/src/docker/cadquery/runCQ.js index 3f1fda2..98b6b1b 100644 --- a/app/api/src/docker/cadquery/runCQ.js +++ b/app/api/src/docker/cadquery/runCQ.js @@ -1,9 +1,10 @@ const { makeFile, runCommand } = require('../common/utils') const { nanoid } = require('nanoid') -module.exports.runCQ = async ({ file, settings: { - deflection = 0.3 -} = {} } = {}) => { +module.exports.runCQ = async ({ + file, + settings: { deflection = 0.3 } = {}, +} = {}) => { const tempFile = await makeFile(file, '.py', nanoid) const fullPath = `/tmp/${tempFile}/output.stl` const command = `cq-cli/cq-cli --codec stl --infile /tmp/${tempFile}/main.py --outfile ${fullPath} --outputopts "deflection:${deflection};angularDeflection:${deflection};"` diff --git a/app/api/src/functions/identity-signup.ts b/app/api/src/functions/identity-signup.ts index 23cccd6..057a76f 100644 --- a/app/api/src/functions/identity-signup.ts +++ b/app/api/src/functions/identity-signup.ts @@ -3,7 +3,7 @@ import { db } from 'src/lib/db' import { sentryWrapper } from 'src/lib/sentry' import { enforceAlphaNumeric, generateUniqueString } from 'src/services/helpers' import 'graphql-tag' -import {sendMail} from 'src/lib/sendmail' +import { sendMail } from 'src/lib/sendmail' const unWrappedHandler = async (req, _context) => { const body = JSON.parse(req.body) @@ -57,7 +57,7 @@ const unWrappedHandler = async (req, _context) => { const user = body.user const email = user.email - let roles = [] + const roles = [] if (eventType === 'signup') { roles.push('user') @@ -77,7 +77,7 @@ const unWrappedHandler = async (req, _context) => { await sendMail({ to: 'k.hutten@protonmail.ch', from: { - address:'news@mail.cadhub.xyz', + address: 'news@mail.cadhub.xyz', name: 'CadHub', }, subject: `New Cadhub User`, diff --git a/app/api/src/lib/auth.ts b/app/api/src/lib/auth.ts index 539b0e9..e778583 100644 --- a/app/api/src/lib/auth.ts +++ b/app/api/src/lib/auth.ts @@ -121,7 +121,7 @@ export const getCurrentUser = async (decoded, { _token, _type }) => { * requireAuth({ role: ['editor', 'author'] }) * requireAuth({ role: ['publisher'] }) */ -export const requireAuth = ({ role }: {role?: string | string[]} = {}) => { +export const requireAuth = ({ role }: { role?: string | string[] } = {}) => { console.log(context.currentUser) if (!context.currentUser) { throw new AuthenticationError("You don't have permission to do that.") diff --git a/app/api/src/lib/sendmail.ts b/app/api/src/lib/sendmail.ts index c4d216e..a524fdb 100644 --- a/app/api/src/lib/sendmail.ts +++ b/app/api/src/lib/sendmail.ts @@ -1,4 +1,4 @@ -import nodemailer, {SendMailOptions} from 'nodemailer' +import nodemailer, { SendMailOptions } from 'nodemailer' interface Args { to: SendMailOptions['to'] @@ -15,42 +15,49 @@ interface SuccessResult { messageSize: number response: string envelope: { - from: string | false, + from: string | false to: string[] - }, + } messageId: string } -export function sendMail({to, from, subject, text}: Args): Promise { - let transporter = nodemailer.createTransport({ +export function sendMail({ + to, + from, + subject, + text, +}: Args): Promise { + const transporter = nodemailer.createTransport({ host: 'smtp.mailgun.org', port: 587, secure: false, tls: { - ciphers:'SSLv3' + ciphers: 'SSLv3', }, auth: { user: 'postmaster@mail.cadhub.xyz', - pass: process.env.EMAIL_PASSWORD - } - }); + pass: process.env.EMAIL_PASSWORD, + }, + }) - console.log({to, from, subject, text}); + console.log({ to, from, subject, text }) const emailPromise = new Promise((resolve, reject) => { - transporter.sendMail({ - from, - to, - subject, - text, - }, (error, info) => { - if (error) { - reject(error); - } else { - resolve(info); + transporter.sendMail( + { + from, + to, + subject, + text, + }, + (error, info) => { + if (error) { + reject(error) + } else { + resolve(info) + } } - }); + ) }) as any as Promise return emailPromise } - diff --git a/app/api/src/services/email/email.ts b/app/api/src/services/email/email.ts index 278296f..0d237fb 100644 --- a/app/api/src/services/email/email.ts +++ b/app/api/src/services/email/email.ts @@ -1,12 +1,12 @@ import { requireAuth } from 'src/lib/auth' -import {sendMail} from 'src/lib/sendmail' -import {users} from 'src/services/users/users' +import { sendMail } from 'src/lib/sendmail' +import { users } from 'src/services/users/users' -export const sendAllUsersEmail = async ({input: {body, subject}}) => { +export const sendAllUsersEmail = async ({ input: { body, subject } }) => { requireAuth({ role: 'admin' }) - const recipients = (await users()).map(({email}) => email) + const recipients = (await users()).map(({ email }) => email) const from = { - address:'news@mail.cadhub.xyz', + address: 'news@mail.cadhub.xyz', name: 'CadHub', } const result = await sendMail({ diff --git a/app/web/src/components/Footer/Footer.js b/app/web/src/components/Footer/Footer.js index 58e96b6..6fa8697 100644 --- a/app/web/src/components/Footer/Footer.js +++ b/app/web/src/components/Footer/Footer.js @@ -14,10 +14,7 @@ const Footer = () => { > Road Map - + Blog diff --git a/app/web/src/components/IdeViewer/IdeViewer.js b/app/web/src/components/IdeViewer/IdeViewer.js index 8ce86b4..a22317d 100644 --- a/app/web/src/components/IdeViewer/IdeViewer.js +++ b/app/web/src/components/IdeViewer/IdeViewer.js @@ -13,7 +13,7 @@ import { requestRender } from 'src/helpers/hooks/useIdeState' import texture from './dullFrontLitMetal.png' import { TextureLoader } from 'three/src/loaders/TextureLoader' -const loader = new TextureLoader +const loader = new TextureLoader() const colorMap = loader.load(texture) extend({ OrbitControls }) @@ -200,8 +200,8 @@ const IdeViewer = ({ Loading }) => { /> - - + + {state.objectData?.type === 'png' && ( <> diff --git a/app/web/src/helpers/cadPackages/cadQueryController.js b/app/web/src/helpers/cadPackages/cadQueryController.js index c5a16e0..17fd868 100644 --- a/app/web/src/helpers/cadPackages/cadQueryController.js +++ b/app/web/src/helpers/cadPackages/cadQueryController.js @@ -9,7 +9,7 @@ import { export const render = async ({ code }) => { const body = JSON.stringify({ settings: { - deflection: 0.2 + deflection: 0.2, }, file: code, }) diff --git a/app/web/src/pages/AdminEmailPage/AdminEmailPage.tsx b/app/web/src/pages/AdminEmailPage/AdminEmailPage.tsx index c36d18e..112b3bc 100644 --- a/app/web/src/pages/AdminEmailPage/AdminEmailPage.tsx +++ b/app/web/src/pages/AdminEmailPage/AdminEmailPage.tsx @@ -1,37 +1,55 @@ -import {useState} from 'react' +import { useState } from 'react' import { useMutation } from '@redwoodjs/web' import { toast, Toaster } from '@redwoodjs/web/toast' const SEND_EMAIL_MUTATION = gql` mutation sendEmailMutation($email: Email!) { - sendAllUsersEmail(input: $email) { - accepted + sendAllUsersEmail(input: $email) { + accepted + } } -} ` const AdminEmailPage = () => { const [subject, setSubject] = useState('') const [body, setBody] = useState('') const [sendEmailMutation] = useMutation(SEND_EMAIL_MUTATION, { - onCompleted: ({sendAllUsersEmail}) => { + onCompleted: ({ sendAllUsersEmail }) => { toast.success(`Emails sent, ${sendAllUsersEmail?.accepted.join(', ')}`) setSubject('') setBody('') }, }) - const sendEmail = () => sendEmailMutation({ variables: { email: { subject, body } } }) + const sendEmail = () => + sendEmailMutation({ variables: { email: { subject, body } } }) return (
-

Email all users

+

+ Email all users +

- setSubject(target.value)}/> + setSubject(target.value)} + /> - - + +
diff --git a/app/web/src/pages/SubjectAccessRequestsPage/SubjectAccessRequestsPage.js b/app/web/src/pages/SubjectAccessRequestsPage/SubjectAccessRequestsPage.js index 78e4c8c..deefbf1 100644 --- a/app/web/src/pages/SubjectAccessRequestsPage/SubjectAccessRequestsPage.js +++ b/app/web/src/pages/SubjectAccessRequestsPage/SubjectAccessRequestsPage.js @@ -1,6 +1,6 @@ import { useState, useEffect } from 'react' import SubjectAccessRequestsCell from 'src/components/SubjectAccessRequestsCell' -import { Flash, useQuery, useMutation, useFlash } from '@redwoodjs/web' +import { useQuery, useMutation } from '@redwoodjs/web' import { Form, Submit } from '@redwoodjs/forms' import MainLayout from 'src/layouts/MainLayout' From 8fec470e9fb99264e8f11d9a50833dd0ae928e60 Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Tue, 29 Jun 2021 17:34:03 +1000 Subject: [PATCH 4/5] Improve aws/docker docs a little. --- app/api/src/docker/README.md | 2 ++ app/api/src/docker/docker-compose.yml | 17 ++--------------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/app/api/src/docker/README.md b/app/api/src/docker/README.md index f8f5e38..8ff4390 100644 --- a/app/api/src/docker/README.md +++ b/app/api/src/docker/README.md @@ -16,6 +16,8 @@ Because of the way the docker containers to be deployed as lambdas on aws are so The docker build relies on a git ignored file, the aws-lambda-rie. [Download it](https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/download/v1.0/aws-lambda-rie), then put it into `app/api/src/docker/common/`. alternatively you can put this download into the DockerFiles by reading the instructions at around line 29 of the DockerFiles (`app/api/src/docker/openscad/Dockerfile` & `app/api/src/docker/cadquery/Dockerfile`). However this will mean slower build times as it will need download this 14mb file every build. +you will also need to create a .env in `app/api/src/docker/.env` for the following env-vars `DEV_AWS_SECRET_ACCESS_KEY, DEV_AWS_ACCESS_KEY_ID and DEV_BUCKET`. Ask @irev-dev for credentials and he can sort you out. + Then cd into this folder `cd api/src/docker` and: ```bash diff --git a/app/api/src/docker/docker-compose.yml b/app/api/src/docker/docker-compose.yml index 1758d40..ea178c2 100644 --- a/app/api/src/docker/docker-compose.yml +++ b/app/api/src/docker/docker-compose.yml @@ -1,15 +1,9 @@ services: - # aws-emulator: - # build: . - # networks: - # - awsland - # ports: - # - "5050:8080" openscad-health: build: context: ./ - dockerfile: ./openscad/. + dockerfile: ./openscad/Dockerfile image: openscad command: openscad.health ports: @@ -17,10 +11,7 @@ services: openscad-preview: image: openscad - # build: ./openscad/. command: openscad.preview - # networks: - # - awsland ports: - "5052:8080" environment: @@ -30,7 +21,6 @@ services: openscad-stl: image: openscad - # build: ./openscad/. command: openscad.stl ports: - "5053:8080" @@ -42,7 +32,7 @@ services: cadquery-stl: build: context: ./ - dockerfile: ./cadquery/. + dockerfile: ./cadquery/Dockerfile command: cadquery.stl ports: - 5060:8080 @@ -51,6 +41,3 @@ services: AWS_ACCESS_KEY_ID: "${DEV_AWS_ACCESS_KEY_ID}" BUCKET: "${DEV_BUCKET}" -# networks: -# awsland: -# name: awsland From 8f8dae70c2471ba8cb90dbecf861698f7ed554f1 Mon Sep 17 00:00:00 2001 From: Kurt Hutten Date: Tue, 29 Jun 2021 18:43:43 +1000 Subject: [PATCH 5/5] Deploy optimized CadQuery stls --- app/web/src/components/EditorMenu/helpers.ts | 21 +++++++++----------- app/web/src/helpers/cadPackages/common.js | 2 +- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/app/web/src/components/EditorMenu/helpers.ts b/app/web/src/components/EditorMenu/helpers.ts index 41bc93c..e5443aa 100644 --- a/app/web/src/components/EditorMenu/helpers.ts +++ b/app/web/src/components/EditorMenu/helpers.ts @@ -42,18 +42,15 @@ export const makeStlDownloadHandler = thunkDispatch((dispatch, getState) => { const state = getState() if (state.ideType === 'openScad') { - thunkDispatch((dispatch, getState) => { - const state = getState() - dispatch({ type: 'setLoading' }) - requestRender({ - state, - dispatch, - code: state.code, - viewerSize: state.viewerSize, - camera: state.camera, - specialCadProcess: 'stl', - }).then((result) => result && saveFile(result.data)) - }) + dispatch({ type: 'setLoading' }) + requestRender({ + state, + dispatch, + code: state.code, + viewerSize: state.viewerSize, + camera: state.camera, + specialCadProcess: 'stl', + }).then((result) => result && saveFile(result.data)) } }) } diff --git a/app/web/src/helpers/cadPackages/common.js b/app/web/src/helpers/cadPackages/common.js index 293725b..5bafe6a 100644 --- a/app/web/src/helpers/cadPackages/common.js +++ b/app/web/src/helpers/cadPackages/common.js @@ -2,7 +2,7 @@ import { STLLoader } from 'three/examples/jsm/loaders/STLLoader' export const lambdaBaseURL = process.env.CAD_LAMBDA_BASE_URL || - 'https://2inlbple1b.execute-api.us-east-1.amazonaws.com/prod2' + 'https://oxt2p7ddgj.execute-api.us-east-1.amazonaws.com/prod' export const stlToGeometry = (url) => new Promise((resolve, reject) => {