mirror of
https://github.com/docmost/docmost.git
synced 2025-11-13 03:42:36 +10:00
- fixes
- allow mail from address override - queue cloud emails
This commit is contained in:
@ -2,6 +2,7 @@ import {
|
|||||||
BadRequestException,
|
BadRequestException,
|
||||||
ForbiddenException,
|
ForbiddenException,
|
||||||
Injectable,
|
Injectable,
|
||||||
|
Logger,
|
||||||
NotFoundException,
|
NotFoundException,
|
||||||
} from '@nestjs/common';
|
} from '@nestjs/common';
|
||||||
import { CreateWorkspaceDto } from '../dto/create-workspace.dto';
|
import { CreateWorkspaceDto } from '../dto/create-workspace.dto';
|
||||||
@ -32,6 +33,8 @@ import { Queue } from 'bullmq';
|
|||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class WorkspaceService {
|
export class WorkspaceService {
|
||||||
|
private readonly logger = new Logger(WorkspaceService.name);
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private workspaceRepo: WorkspaceRepo,
|
private workspaceRepo: WorkspaceRepo,
|
||||||
private spaceService: SpaceService,
|
private spaceService: SpaceService,
|
||||||
@ -205,13 +208,23 @@ export class WorkspaceService {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (this.environmentService.isCloud() && trialEndAt) {
|
if (this.environmentService.isCloud() && trialEndAt) {
|
||||||
const delay = trialEndAt.getTime() - Date.now();
|
try {
|
||||||
|
const delay = trialEndAt.getTime() - Date.now();
|
||||||
|
|
||||||
await this.billingQueue.add(
|
await this.billingQueue.add(
|
||||||
QueueJob.TRIAL_ENDED,
|
QueueJob.TRIAL_ENDED,
|
||||||
{ workspaceId: createdWorkspace.id },
|
{ workspaceId: createdWorkspace.id },
|
||||||
{ delay },
|
{ delay },
|
||||||
);
|
);
|
||||||
|
|
||||||
|
await this.billingQueue.add(
|
||||||
|
QueueJob.WELCOME_EMAIL,
|
||||||
|
{ userId: user.id },
|
||||||
|
{ delay: 60 * 1000 }, // 1m
|
||||||
|
);
|
||||||
|
} catch (err) {
|
||||||
|
this.logger.error(err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return createdWorkspace;
|
return createdWorkspace;
|
||||||
|
|||||||
Submodule apps/server/src/ee updated: 2d9bc2b394...a04fcc224e
@ -19,18 +19,27 @@ export class MailService {
|
|||||||
async sendEmail(message: MailMessage): Promise<void> {
|
async sendEmail(message: MailMessage): Promise<void> {
|
||||||
if (message.template) {
|
if (message.template) {
|
||||||
// in case this method is used directly. we do not send the tsx template from queue
|
// in case this method is used directly. we do not send the tsx template from queue
|
||||||
message.html = await render(message.template, { pretty: true });
|
message.html = await render(message.template, {
|
||||||
|
pretty: true,
|
||||||
|
});
|
||||||
message.text = await render(message.template, { plainText: true });
|
message.text = await render(message.template, { plainText: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
const sender = `${this.environmentService.getMailFromName()} <${this.environmentService.getMailFromAddress()}> `;
|
let from = this.environmentService.getMailFromAddress();
|
||||||
|
if (message.from) {
|
||||||
|
from = message.from;
|
||||||
|
}
|
||||||
|
|
||||||
|
const sender = `${this.environmentService.getMailFromName()} <${from}> `;
|
||||||
await this.mailDriver.sendMail({ from: sender, ...message });
|
await this.mailDriver.sendMail({ from: sender, ...message });
|
||||||
}
|
}
|
||||||
|
|
||||||
async sendToQueue(message: MailMessage): Promise<void> {
|
async sendToQueue(message: MailMessage): Promise<void> {
|
||||||
if (message.template) {
|
if (message.template) {
|
||||||
// transform the React object because it gets lost when sent via the queue
|
// transform the React object because it gets lost when sent via the queue
|
||||||
message.html = await render(message.template, { pretty: true });
|
message.html = await render(message.template, {
|
||||||
|
pretty: true,
|
||||||
|
});
|
||||||
message.text = await render(message.template, {
|
message.text = await render(message.template, {
|
||||||
plainText: true,
|
plainText: true,
|
||||||
});
|
});
|
||||||
|
|||||||
@ -14,6 +14,7 @@ export enum QueueJob {
|
|||||||
PAGE_BACKLINKS = 'page-backlinks',
|
PAGE_BACKLINKS = 'page-backlinks',
|
||||||
|
|
||||||
STRIPE_SEATS_SYNC = 'sync-stripe-seats',
|
STRIPE_SEATS_SYNC = 'sync-stripe-seats',
|
||||||
|
|
||||||
TRIAL_ENDED = 'trial-ended',
|
TRIAL_ENDED = 'trial-ended',
|
||||||
|
WELCOME_EMAIL = 'welcome-email',
|
||||||
|
FIRST_PAYMENT_EMAIL = 'first-payment-email',
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,46 +0,0 @@
|
|||||||
import { Section, Text, Button } from '@react-email/components';
|
|
||||||
import * as React from 'react';
|
|
||||||
import { button, content, paragraph } from '@docmost/transactional/css/styles';
|
|
||||||
import { MailBody } from '@docmost/transactional/partials/partials';
|
|
||||||
|
|
||||||
interface Props {
|
|
||||||
billingLink: string;
|
|
||||||
workspaceName: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const TrialEndedEmail = ({ billingLink, workspaceName }: Props) => {
|
|
||||||
return (
|
|
||||||
<MailBody>
|
|
||||||
<Section style={content}>
|
|
||||||
<Text style={paragraph}>Hi there,</Text>
|
|
||||||
<Text style={paragraph}>
|
|
||||||
Your Docmost 7-day free trial for {workspaceName} has come to an end.
|
|
||||||
</Text>
|
|
||||||
<Text style={paragraph}>
|
|
||||||
To continue using Docmost for your wiki and documentation, please
|
|
||||||
upgrade to a premium plan.
|
|
||||||
</Text>
|
|
||||||
</Section>
|
|
||||||
<Section
|
|
||||||
style={{
|
|
||||||
display: 'flex',
|
|
||||||
justifyContent: 'center',
|
|
||||||
alignItems: 'center',
|
|
||||||
paddingLeft: '15px',
|
|
||||||
paddingBottom: '15px',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Button href={billingLink} style={button}>
|
|
||||||
Upgrade now
|
|
||||||
</Button>
|
|
||||||
</Section>
|
|
||||||
<Section style={content}>
|
|
||||||
<Text style={paragraph}>
|
|
||||||
PS: If you would like to extend your trial, please reply this email.
|
|
||||||
</Text>
|
|
||||||
</Section>
|
|
||||||
</MailBody>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default TrialEndedEmail;
|
|
||||||
@ -14,7 +14,7 @@
|
|||||||
"client:dev": "nx run client:dev",
|
"client:dev": "nx run client:dev",
|
||||||
"server:dev": "nx run server:start:dev",
|
"server:dev": "nx run server:start:dev",
|
||||||
"server:start": "nx run server:start:prod",
|
"server:start": "nx run server:start:prod",
|
||||||
"email:dev": "nx run @docmost/transactional:dev",
|
"email:dev": "nx run server:email:dev",
|
||||||
"dev": "pnpm concurrently -n \"frontend,backend\" -c \"cyan,green\" \"pnpm run client:dev\" \"pnpm run server:dev\""
|
"dev": "pnpm concurrently -n \"frontend,backend\" -c \"cyan,green\" \"pnpm run client:dev\" \"pnpm run server:dev\""
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
Reference in New Issue
Block a user