This refactor was born out of the inter-dependency cycles developing between the "background" module and just about every other module which was caused by the background module becoming a dependency of every module that needed to background work and the fact that the background module was also supposedly responsible for the logic for processing those tasks. Instead the "background" module is now very, very shallow and relies entirely on the Postgres NOTIFY logic for triggering jobs. There's a new table, `job` which holds just a type and single row ID. All told, this means that jobs can be added to the queue as part of the API-level or platform-level transaction, ensuring atomicity, and processing coordination is handled by the platform module, which can depend on anything.
124 lines
2.7 KiB
HTML
124 lines
2.7 KiB
HTML
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>Welcome</title>
|
|
<style type="text/css">
|
|
body {
|
|
margin: 0;
|
|
padding: 0;
|
|
font-family: Arial, sans-serif;
|
|
font-size: 16px;
|
|
line-height: 1.5;
|
|
color: #333333;
|
|
}
|
|
.container {
|
|
max-width: 600px;
|
|
margin: 0 auto;
|
|
padding: 20px;
|
|
}
|
|
.view-browser {
|
|
text-align: center;
|
|
font-size: 12px;
|
|
color: #777777;
|
|
padding-bottom: 15px;
|
|
}
|
|
.view-browser a {
|
|
color: #555555;
|
|
text-decoration: underline;
|
|
}
|
|
.header {
|
|
text-align: center;
|
|
padding: 20px 0;
|
|
}
|
|
.logo {
|
|
max-width: 150px;
|
|
height: auto;
|
|
}
|
|
.content {
|
|
background-color: #f9f9f9;
|
|
padding: 30px;
|
|
border-radius: 5px;
|
|
}
|
|
.button {
|
|
display: inline-block;
|
|
background-color: #0066cc;
|
|
color: #ffffff;
|
|
text-decoration: none;
|
|
padding: 12px 25px;
|
|
border-radius: 4px;
|
|
margin: 20px 0;
|
|
font-weight: bold;
|
|
}
|
|
.footer {
|
|
text-align: center;
|
|
font-size: 14px;
|
|
color: #777777;
|
|
padding: 20px 0;
|
|
}
|
|
.footer a {
|
|
color: #777777;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
{{ if not .IsBrowser }}
|
|
<div class="view-browser">
|
|
Email not displaying correctly?
|
|
<a href="{{ .C.URLViewInBrowser }}">View it in your browser</a>
|
|
</div>
|
|
{{ end }}
|
|
|
|
|
|
<div class="header">
|
|
<!-- Logo Placeholder -->
|
|
<img
|
|
src="{{ .C.URLLogo }}"
|
|
alt="Report Mosquitoes Online Logo"
|
|
class="logo"
|
|
/>
|
|
</div>
|
|
|
|
<div class="content">
|
|
<h1>Welcome</h1>
|
|
|
|
<p>
|
|
We're sending you this email because it's the first time we've gotten
|
|
this email address ({{ .C.Destination }}).
|
|
</p>
|
|
|
|
<p>
|
|
If you'd rather not receive emails from us you can reply with
|
|
"Unsubscribe" in the subject or body of the email. You can also use
|
|
the "Unsubscribe" feature of your mail client, if it supports list
|
|
unsubscribes.
|
|
</p>
|
|
|
|
<p>
|
|
If instead you'd like to confirm that you're willing to receive emails
|
|
at this address, you can do so by clicking below:
|
|
</p>
|
|
|
|
<div style="text-align: center;">
|
|
<a href="{{ .C.URLSubscribe }}" class="button"
|
|
>I want emails from Report Mosquitoes Online</a
|
|
>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="footer">
|
|
<p>
|
|
This email was sent to you because you or someone else gave your email
|
|
address to Report Mosquitoes Online.
|
|
</p>
|
|
<p>
|
|
If you no longer wish to receive these updates,
|
|
<a href="{{ .C.URLUnsubscribe }}">click here to unsubscribe</a>.
|
|
</p>
|
|
<p>© 2026 Gleipnir LLC. All rights reserved.</p>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|