summaryrefslogtreecommitdiff
path: root/lib/model.ts
diff options
context:
space:
mode:
authorElizabeth Hunt <me@liz.coffee>2025-08-17 23:50:24 -0700
committerElizabeth Hunt <me@liz.coffee>2025-08-17 23:53:38 -0700
commit1a4fc9535a89b58e8b67c8996ade0b833116af3a (patch)
treed16f3129d7bb69f204bba8422e909354195a0042 /lib/model.ts
parent157dc327e8fe63541b517cfbeeaf202a3e8553a5 (diff)
downloaduptime-1a4fc9535a89b58e8b67c8996ade0b833116af3a.tar.gz
uptime-1a4fc9535a89b58e8b67c8996ade0b833116af3a.zip
Move to pengueno.
Diffstat (limited to 'lib/model.ts')
-rw-r--r--lib/model.ts87
1 files changed, 87 insertions, 0 deletions
diff --git a/lib/model.ts b/lib/model.ts
new file mode 100644
index 0000000..7896d70
--- /dev/null
+++ b/lib/model.ts
@@ -0,0 +1,87 @@
+import { isObject } from '@emprespresso/pengueno';
+
+export interface Email {
+ from: string;
+ to: string;
+ subject: string;
+ text: string;
+}
+
+export interface EmailCredentials {
+ email: string;
+ username: string;
+ password: string;
+}
+
+export const isCreds = (u: unknown): u is EmailCredentials =>
+ !!(
+ isObject(u) &&
+ ['email', 'username', 'password'].every((key) => key in u && typeof u[key as keyof typeof u] === 'string')
+ );
+
+export interface EmailSendInstruction extends EmailCredentials {
+ send_host: string;
+ send_port: number;
+}
+
+export const isSend = (u: unknown): u is EmailSendInstruction =>
+ !!(
+ isCreds(u) &&
+ 'send_host' in u &&
+ typeof u.send_host === 'string' &&
+ 'send_port' in u &&
+ typeof u.send_port === 'number'
+ );
+
+export interface EmailRecvInstruction extends EmailCredentials {
+ read_host: string;
+ read_port: number;
+}
+
+export const isRecv = (u: unknown): u is EmailSendInstruction =>
+ !!(
+ isCreds(u) &&
+ 'read_host' in u &&
+ typeof u.read_host === 'string' &&
+ 'read_port' in u &&
+ typeof u.read_port === 'number'
+ );
+
+export interface EmailJob {
+ from: EmailSendInstruction;
+ to: EmailRecvInstruction;
+ readRetry: Retry;
+}
+
+export const isEmailJob = (u: unknown): u is EmailJob =>
+ !!(
+ isObject(u) &&
+ 'from' in u &&
+ isSend(u.from) &&
+ 'to' in u &&
+ isRecv(u.to) &&
+ 'readRetry' in u &&
+ isRetry(u.readRetry)
+ );
+
+export interface Retry {
+ attempts: number;
+ interval: number;
+}
+
+export const isRetry = (u: unknown): u is Retry =>
+ !!(
+ isObject(u) && ['attempts', 'interval'].every((key) => key in u && typeof u[key as keyof typeof u] === 'number')
+ );
+
+export const redact = <T extends EmailCredentials>(instruction: T): T => ({
+ ...instruction,
+ password: 'REDACTED',
+ username: 'REDACTED',
+});
+
+export const redactJob = (job: EmailJob): EmailJob => ({
+ ...job,
+ from: redact(job.from),
+ to: redact(job.to),
+});