Base model refactor (#810)
* Big upgrades * WIP: Stash * Stash, 30 flow errors left * Downgrade mobx * WIP * When I understand the difference between class and instance methods * 💚 * Fixes: File import Model saving edge cases pinning and starring docs Collection editing Upgrade mobx devtools * Notification settings saving works * Disabled settings * Document mailer * Working notifications * Colletion created notification Ensure not notified for own actions * Tidy up * Document updated event only for document creation Add indexes Notification setting on user creation * Commentary * Fixed: Notification setting on signup * Fix document move / duplicate stale data Add BaseModel.refresh method * Fixes: Title in sidebar not updated after editing document * 💚 * Improve / restore error handling Better handle offline errors * 👕
This commit is contained in:
57
server/emails/CollectionNotificationEmail.js
Normal file
57
server/emails/CollectionNotificationEmail.js
Normal file
@@ -0,0 +1,57 @@
|
||||
// @flow
|
||||
import * as React from 'react';
|
||||
import { User, Collection } from '../models';
|
||||
import EmailTemplate from './components/EmailLayout';
|
||||
import Body from './components/Body';
|
||||
import Button from './components/Button';
|
||||
import Heading from './components/Heading';
|
||||
import Header from './components/Header';
|
||||
import Footer from './components/Footer';
|
||||
import EmptySpace from './components/EmptySpace';
|
||||
|
||||
export type Props = {
|
||||
actor: User,
|
||||
collection: Collection,
|
||||
eventName: string,
|
||||
};
|
||||
|
||||
export const collectionNotificationEmailText = ({
|
||||
actor,
|
||||
collection,
|
||||
eventName = 'created',
|
||||
}: Props) => `
|
||||
"${document.title}" ${eventName}
|
||||
|
||||
${actor.name} ${eventName} the collection "${collection.name}"
|
||||
|
||||
Open Collection: ${process.env.URL}${collection.url}
|
||||
`;
|
||||
|
||||
export const CollectionNotificationEmail = ({
|
||||
actor,
|
||||
collection,
|
||||
eventName = 'created',
|
||||
}: Props) => {
|
||||
return (
|
||||
<EmailTemplate>
|
||||
<Header />
|
||||
|
||||
<Body>
|
||||
<Heading>
|
||||
"{collection.name}" {eventName}
|
||||
</Heading>
|
||||
<p>
|
||||
{actor.name} {eventName} the collection "{collection.title}".
|
||||
</p>
|
||||
<EmptySpace height={10} />
|
||||
<p>
|
||||
<Button href={`${process.env.URL}${collection.url}`}>
|
||||
Open Collection
|
||||
</Button>
|
||||
</p>
|
||||
</Body>
|
||||
|
||||
<Footer />
|
||||
</EmailTemplate>
|
||||
);
|
||||
};
|
||||
66
server/emails/DocumentNotificationEmail.js
Normal file
66
server/emails/DocumentNotificationEmail.js
Normal file
@@ -0,0 +1,66 @@
|
||||
// @flow
|
||||
import * as React from 'react';
|
||||
import { User, Document, Collection } from '../models';
|
||||
import EmailTemplate from './components/EmailLayout';
|
||||
import Body from './components/Body';
|
||||
import Button from './components/Button';
|
||||
import Heading from './components/Heading';
|
||||
import Header from './components/Header';
|
||||
import Footer from './components/Footer';
|
||||
import EmptySpace from './components/EmptySpace';
|
||||
|
||||
export type Props = {
|
||||
actor: User,
|
||||
document: Document,
|
||||
collection: Collection,
|
||||
eventName: string,
|
||||
};
|
||||
|
||||
export const documentNotificationEmailText = ({
|
||||
actor,
|
||||
document,
|
||||
collection,
|
||||
eventName = 'published',
|
||||
}: Props) => `
|
||||
"${document.title}" ${eventName}
|
||||
|
||||
${actor.name} ${eventName} the document "${document.title}", in the ${
|
||||
collection.name
|
||||
} collection.
|
||||
|
||||
Open Document: ${process.env.URL}${document.url}
|
||||
`;
|
||||
|
||||
export const DocumentNotificationEmail = ({
|
||||
actor,
|
||||
document,
|
||||
collection,
|
||||
eventName = 'published',
|
||||
}: Props) => {
|
||||
return (
|
||||
<EmailTemplate>
|
||||
<Header />
|
||||
|
||||
<Body>
|
||||
<Heading>
|
||||
"{document.title}" {eventName}
|
||||
</Heading>
|
||||
<p>
|
||||
{actor.name} {eventName} the document "{document.title}", in the{' '}
|
||||
{collection.name} collection.
|
||||
</p>
|
||||
<hr />
|
||||
<EmptySpace height={10} />
|
||||
<p>{document.getSummary()}</p>
|
||||
<EmptySpace height={10} />
|
||||
<p>
|
||||
<Button href={`${process.env.URL}${document.url}`}>
|
||||
Open Document
|
||||
</Button>
|
||||
</p>
|
||||
</Body>
|
||||
|
||||
<Footer />
|
||||
</EmailTemplate>
|
||||
);
|
||||
};
|
||||
@@ -2,26 +2,26 @@
|
||||
import Koa from 'koa';
|
||||
import Router from 'koa-router';
|
||||
import { NotFoundError } from '../errors';
|
||||
import Mailer from '../mailer';
|
||||
import { Mailer } from '../mailer';
|
||||
|
||||
const emailPreviews = new Koa();
|
||||
const router = new Router();
|
||||
|
||||
router.get('/:type/:format', async ctx => {
|
||||
const previewMailer = new Mailer();
|
||||
let mailerOutput;
|
||||
previewMailer.transporter = {
|
||||
let mailer = new Mailer();
|
||||
mailer.transporter = {
|
||||
sendMail: data => (mailerOutput = data),
|
||||
};
|
||||
|
||||
switch (ctx.params.type) {
|
||||
// case 'emailWithProperties':
|
||||
// previewMailer.emailWithProperties('user@example.com', {...properties});
|
||||
// mailer.emailWithProperties('user@example.com', {...properties});
|
||||
// break;
|
||||
default:
|
||||
if (Object.getOwnPropertyNames(previewMailer).includes(ctx.params.type)) {
|
||||
if (Object.getOwnPropertyNames(mailer).includes(ctx.params.type)) {
|
||||
// $FlowIssue flow doesn't like this but we're ok with it
|
||||
previewMailer[ctx.params.type]('user@example.com');
|
||||
mailer[ctx.params.type]('user@example.com');
|
||||
} else throw new NotFoundError('Email template could not be found');
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user