Skip to content

Commit 3b4d2dc

Browse files
committed
Feat: Move sent items into sent folder to prevent resend
1 parent 33e61cb commit 3b4d2dc

File tree

8 files changed

+36
-7
lines changed

8 files changed

+36
-7
lines changed

email/libmailmerge/src/previews/sidecarData.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,14 +180,17 @@ export async function writeSidecarFile(
180180
*/
181181
export async function* loadSidecars(
182182
previewsRoot: string,
183-
): AsyncIterableIterator<SidecarData & { $originalfilename: string }> {
183+
): AsyncIterableIterator<SidecarData & { $originalFilepath: string }> {
184184
logger.info(`Loading sidecar metadata from ${previewsRoot}`);
185185
const files = await fs.readdir(previewsRoot);
186186
const metadataFiles = files.filter((file) => file.endsWith(METADATA_FILE_SUFFIX));
187187

188188
for (const metadataFile of metadataFiles) {
189189
logger.debug(`Loading metadata from ${metadataFile}`);
190190
const metadata = await fs.readFile(join(previewsRoot, metadataFile), "utf-8");
191-
yield { ...(JSON.parse(metadata) as SidecarData), $originalfilename: metadataFile };
191+
yield {
192+
...(JSON.parse(metadata) as SidecarData),
193+
$originalFilepath: join(previewsRoot, metadataFile),
194+
};
192195
}
193196
}

email/mailmerge-cli/src/common/rerender.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,16 @@ export async function rerenderPreviews(directory: string) {
4646
renderedPreviews.map(async (preview, idx) => {
4747
const file = files[idx];
4848
logger.debug(`Writing rerendered preview ${file.filename}...`);
49-
await stopIfCriticalFsError(fs.writeFile(join(directory, file.filename), preview.content));
49+
await stopIfCriticalFsError(
50+
fs.writeFile(join(directory, file.filename), preview.content),
51+
);
5052
logger.debug("Overwriting sidecar metadata with new metadata...");
5153
sidecar.files[idx].engineData = { ...preview, content: undefined };
5254
}),
5355
);
5456

55-
logger.info(`Updating sidecar metadata for ${name} at ${sidecar.$originalfilename}...`);
56-
await writeSidecarFile(directory, sidecar.$originalfilename, sidecar);
57+
logger.info(`Updating sidecar metadata for ${name} at ${sidecar.$originalFilepath}...`);
58+
await writeSidecarFile(directory, sidecar.$originalFilepath, sidecar);
5759

5860
logger.info(`Finished rerendering ${name}`);
5961
}

email/mailmerge-cli/src/common/send.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,17 @@ import { createLogger } from "@docsoc/util";
1010
import chalk from "chalk";
1111
// Load dotenv
1212
import "dotenv/config";
13+
import { promises as fs } from "fs";
14+
import { mkdirp } from "mkdirp";
15+
import { basename, join } from "path";
1316
import readlineSync from "readline-sync";
1417

1518
const logger = createLogger("docsoc");
1619

20+
const move = (file: string, directory: string) => {
21+
return fs.rename(file, join(directory, basename(file)));
22+
};
23+
1724
export async function sendEmails(directory: string) {
1825
logger.info(`Sending previews at ${directory}...`);
1926

@@ -26,6 +33,8 @@ export async function sendEmails(directory: string) {
2633
subject: string;
2734
html: string;
2835
attachments: string[];
36+
/** These files will be moved to the sent folder on the file system so they are not resent (include sidecar data) */
37+
filesToMove: string[];
2938
}[] = [];
3039
for await (const sidecar of sidecars) {
3140
const { name, engine: engineName, engineOptions, files } = sidecar;
@@ -52,6 +61,9 @@ export async function sendEmails(directory: string) {
5261
subject: sidecar.email.subject,
5362
html,
5463
attachments: sidecar.attachments,
64+
filesToMove: files
65+
.map((file) => join(directory, file.filename))
66+
.concat([sidecar.$originalFilepath]),
5567
});
5668
}
5769

@@ -88,7 +100,9 @@ If you are happy to proceed, please type "Yes, send emails" below.`),
88100
const mailer = getDefaultMailer();
89101
const total = pendingEmails.length;
90102
let sent = 0;
91-
for (const { to, subject, html, attachments } of pendingEmails) {
103+
const sentDir = join(directory, "sent");
104+
await mkdirp(sentDir);
105+
for (const { to, subject, html, attachments, filesToMove } of pendingEmails) {
92106
logger.info(`(${++sent} / ${total}) Sending email to ${to} with subject ${subject}...`);
93107
await defaultMailer(
94108
[to],
@@ -99,5 +113,13 @@ If you are happy to proceed, please type "Yes, send emails" below.`),
99113
path: file,
100114
})),
101115
);
116+
117+
// Then move
118+
await Promise.all(
119+
filesToMove.map(async (file) => {
120+
await move(file, sentDir);
121+
logger.info(`Moved ${file} to ${sentDir}`);
122+
}),
123+
);
102124
}
103125
}

package-lock.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,10 @@
4242
],
4343
"dependencies": {
4444
"axios": "^1.6.0",
45+
"mkdirp": "^3.0.1",
4546
"tslib": "^2.3.0"
4647
},
4748
"nx": {
4849
"includedScripts": []
4950
}
50-
}
51+
}

0 commit comments

Comments
 (0)