PronounsPage/server/subscriptions.js
Adaline Simonian 23a3862ca0
test: introduce snapshot-based smoke tests
- Adds a new test suite with Docker-based smoke tests for all locales.
  Can be run using the ./smoketest.sh script.
- Replaces all calls to Math.random() with a new helper that returns 0.5
  in snapshot testing mode, ensuring deterministic snapshots.
- Similarly replaces all calls to new Date() and Date.now() with new
  helpers that return a fixed date in snapshot testing mode.
- Replaces checks against NODE_ENV with APP_ENV, to ensure that the
  bundles can be built with Nuxt for testing without losing code that
  would otherwise be stripped out by production optimizations.
- Adds a database init script that can be used to initialize the
  database with a single admin user and a long-lived JWT token for use
  in automation tests.
- Adds a JWT decoding/encoding CLI tool for debugging JWTs.

Note: Snapshots are not checked in, and must be generated manually. See
test/__snapshots__/.gitignore for more information.
2025-02-02 23:11:19 -08:00

179 lines
12 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import './setup.ts';
import SQL from 'sql-template-strings';
import { ulid, decodeTime } from 'ulid';
import { newDate } from '../src/helpers.ts';
import dbConnection from './db.ts';
import mailer from './mailer.ts';
const CAMPAIGNS = [
{
name: 'spis-2023',
sendAt: new Date(2023, 1, 1, 9, 0, 0),
type: 'census',
locales: ['pl'],
subject: 'Ruszyła trzecia edycja Niebinarnego Spisu Powszechnego!',
text: `Jak co roku, luty jest miesiącem, w którym zbieramy dane na temat języka używanego przez polskojęzyczne osoby niebinarne.
Serdecznie zapraszamy do udziału w Niebinarnym Spisie Powszechnym! By wesprzeć naszą społeczność, wystarczy wejść na https://zaimki.pl/spis i wypełnić formularz 😉
(Ta wiadomość wysyłana jest do osób, które zapisały się na przypominajkę. Jeśli chcesz z niej zrezygnować, wejdź na https://zaimki.pl/api/subscription/unsubscribe?email={{emailEncoded}}&type=census)
`,
html: `
<p>Jak co roku, luty jest miesiącem, w którym zbieramy dane na temat języka używanego przez polskojęzyczne osoby niebinarne.</p>
<p>Serdecznie zapraszamy do udziału w Niebinarnym Spisie Powszechnym! By wesprzeć naszą społeczność, wystarczy wejść na <a href="https://zaimki.pl/spis">zaimki.pl/spis</a> i wypełnić formularz 😉</p>
<p style="text-align: center; padding-top: 16px; padding-bottom: 16px;">
<a href="https://zaimki.pl/spis" target="_blank" rel="noopener" style="background-color: #C71585; color: #fff; padding: 8px 16px; border: none; border-radius: 6px;text-decoration: none">
zaimki.pl/spis
</a>
</p>
<p style="color: #999; font-size: 10px;">Ta wiadomość wysyłana jest do osób, które zapisały się na przypominajkę. Jeśli chcesz z niej zrezygnować, <a href="https://zaimki.pl/api/subscription/unsubscribe?email={{emailEncoded}}&type=census">kliknij tutaj</a>.</p>
`,
},
{
name: 'spis-2023-raport',
sendAt: new Date(2023, 3, 12, 12, 0, 0),
type: 'census',
locales: ['pl'],
subject: 'Przedstawiamy raport z trzeciej edycji Niebinarnego Spisu Powszechnego!',
text: `Już po raz trzeci przeprowadziłośmy Niebinarny Spis Powszechny największe badanie języka, jakim posługują się polskojęzyczne osoby niebinarne.
W tym roku udało nam się zebrać rekordową liczbę odpowiedzi, aż 3022! Rozszerzyłośmy też ankietę o kilka dodatkowych pytań i porównałośmy wyniki z dwiema poprzednimi edycjami. Zaowocowało to najbardziej rozbudowanym raportem o niebinarszczyźnie!
Report dostępny jest pod adresem https://zaimki.pl/blog/spis-2023 serdecznie zapraszamy do lektury 😉
(Ta wiadomość wysyłana jest do osób, które zapisały się na przypominajkę. Jeśli chcesz z niej zrezygnować, wejdź na https://zaimki.pl/api/subscription/unsubscribe?email={{emailEncoded}}&type=census)
`,
html: `
<p>Już po raz trzeci przeprowadziłośmy Niebinarny Spis Powszechny największe badanie języka, jakim posługują się polskojęzyczne osoby niebinarne.</p>
<p>W tym roku udało nam się zebrać rekordową liczbę odpowiedzi, aż 3022! Rozszerzyłośmy też ankietę o kilka dodatkowych pytań i porównałośmy wyniki z dwiema poprzednimi edycjami. Zaowocowało to najbardziej rozbudowanym raportem o niebinarszczyźnie!</p>
<p>Report dostępny jest pod adresem <a href="https://zaimki.pl/blog/spis-2023" target="_blank" rel="noopener">zaimki.pl/blog/spis-2023</a> serdecznie zapraszamy do lektury 😉</p>
<p style="text-align: center; padding-top: 16px; padding-bottom: 16px;">
<a href="https://zaimki.pl/blog/spis-2023" target="_blank" rel="noopener" style="background-color: #C71585; color: #fff; padding: 8px 16px; border: none; border-radius: 6px;text-decoration: none">
zaimki.pl/blog/spis-2023
</a>
</p>
<p style="color: #999; font-size: 10px;">Ta wiadomość wysyłana jest do osób, które zapisały się na przypominajkę. Jeśli chcesz z niej zrezygnować, <a href="https://zaimki.pl/api/subscription/unsubscribe?email={{emailEncoded}}&type=census">kliknij tutaj</a>.</p>
`,
},
{
name: 'spis-2024',
sendAt: new Date(2024, 1, 1, 9, 0, 0),
type: 'census',
locales: ['pl'],
subject: 'Ruszyła czwarta edycja Niebinarnego Spisu Powszechnego!',
text: `Jak co roku, luty jest miesiącem, w którym zbieramy dane na temat języka używanego przez polskojęzyczne osoby niebinarne.
Serdecznie zapraszamy do udziału w Niebinarnym Spisie Powszechnym! By wesprzeć naszą społeczność, wystarczy wejść na https://zaimki.pl/spis i wypełnić formularz 😉
(Ta wiadomość wysyłana jest do osób, które zapisały się na przypominajkę. Jeśli chcesz z niej zrezygnować, wejdź na https://zaimki.pl/api/subscription/unsubscribe?email={{emailEncoded}}&type=census)
`,
html: `
<p>Jak co roku, luty jest miesiącem, w którym zbieramy dane na temat języka używanego przez polskojęzyczne osoby niebinarne.</p>
<p>Serdecznie zapraszamy do udziału w Niebinarnym Spisie Powszechnym! By wesprzeć naszą społeczność, wystarczy wejść na <a href="https://zaimki.pl/spis">zaimki.pl/spis</a> i wypełnić formularz 😉</p>
<p style="text-align: center; padding-top: 16px; padding-bottom: 16px;">
<a href="https://zaimki.pl/spis" target="_blank" rel="noopener" style="background-color: #C71585; color: #fff; padding: 8px 16px; border: none; border-radius: 6px;text-decoration: none">
zaimki.pl/spis
</a>
</p>
<p style="color: #999; font-size: 10px;">Ta wiadomość wysyłana jest do osób, które zapisały się na przypominajkę. Jeśli chcesz z niej zrezygnować, <a href="https://zaimki.pl/api/subscription/unsubscribe?email={{emailEncoded}}&type=census">kliknij tutaj</a>.</p>
`,
},
{
name: 'spis-2024-raport',
sendAt: new Date(2024, 3, 15, 0, 0, 0),
type: 'census',
locales: ['pl'],
subject: 'Przedstawiamy raport z czwartej edycji Niebinarnego Spisu Powszechnego!',
text: `Już po raz czwarty przeprowadziłośmy Niebinarny Spis Powszechny największe badanie języka, jakim posługują się polskojęzyczne osoby niebinarne.
W tym roku ponownie udało nam się zebrać rekordową liczbę odpowiedzi, aż 3091! Rozszerzyłośmy ankietę o pytania o orientację romantyczną i proces tranzycji, dodałośmy też wykresy porównujące dane z poprzednimi latami, a także przygotowałośmy skróconą wersję raportu!
Report dostępny jest pod adresem https://zaimki.pl/blog/spis-2024, a wersja skrócona pod https://zaimki.pl/blog/spis-2024-skrocony serdecznie zapraszamy do lektury 😉
(Ta wiadomość wysyłana jest do osób, które zapisały się na przypominajkę. Jeśli chcesz z niej zrezygnować, wejdź na https://zaimki.pl/api/subscription/unsubscribe?email={{emailEncoded}}&type=census)
`,
html: `
<p>Już po raz czwarty przeprowadziłośmy Niebinarny Spis Powszechny największe badanie języka, jakim posługują się polskojęzyczne osoby niebinarne.</p>
<p>W tym roku ponownie udało nam się zebrać rekordową liczbę odpowiedzi, aż 3091! Rozszerzyłośmy ankietę o pytania o orientację romantyczną i proces tranzycji, dodałośmy też wykresy porównujące dane z poprzednimi latami, a także przygotowałośmy skróconą wersję raportu!</p>
<p>Report dostępny jest pod adresem <a href="https://zaimki.pl/blog/spis-2024" target="_blank" rel="noopener">zaimki.pl/blog/spis-2024</a>, a wersja skrócona pod <a href="https://zaimki.pl/blog/spis-2024-skrocony" target="_blank" rel="noopener">zaimki.pl/blog/spis-2024-skrocony</a> serdecznie zapraszamy do lektury 😉</p>
<p style="text-align: center; padding-top: 16px; padding-bottom: 16px;">
<a href="https://zaimki.pl/blog/spis-2024" target="_blank" rel="noopener" style="background-color: #C71585; color: #fff; padding: 8px 16px; border: none; border-radius: 6px;text-decoration: none">
zaimki.pl/blog/spis-2024
</a>
</p>
<p style="color: #999; font-size: 10px;">Ta wiadomość wysyłana jest do osób, które zapisały się na przypominajkę. Jeśli chcesz z niej zrezygnować, <a href="https://zaimki.pl/api/subscription/unsubscribe?email={{emailEncoded}}&type=census">kliknij tutaj</a>.</p>
`,
},
{
name: 'spis-2025',
sendAt: new Date(2025, 1, 1, 9, 0, 0),
type: 'census',
locales: ['pl'],
subject: 'Ruszyła piąta edycja Niebinarnego Spisu Powszechnego! 💛🤍💜🖤',
text: `Jak co roku, luty jest miesiącem, w którym zbieramy dane na temat języka używanego przez polskojęzyczne osoby niebinarne.
Serdecznie zapraszamy do udziału w Niebinarnym Spisie Powszechnym! By wesprzeć naszą społeczność, wystarczy wejść na https://zaimki.pl/spis i wypełnić formularz 😉
W tym roku rozszerzyłośmy ankietę o pytania o używane imiona i ich odmianę.
(Ta wiadomość wysyłana jest do osób, które zapisały się na przypominajkę. Jeśli chcesz z niej zrezygnować, wejdź na https://zaimki.pl/api/subscription/unsubscribe?email={{emailEncoded}}&type=census)
`,
html: `
<p>Jak co roku, luty jest miesiącem, w którym zbieramy dane na temat języka używanego przez polskojęzyczne osoby niebinarne.</p>
<p>Serdecznie zapraszamy do udziału w Niebinarnym Spisie Powszechnym! By wesprzeć naszą społeczność, wystarczy wejść na <a href="https://zaimki.pl/spis">zaimki.pl/spis</a> i wypełnić formularz 😉</p>
<p>W tym roku rozszerzyłośmy ankietę o pytania o używane imiona i ich odmianę.</p>
<p style="text-align: center; padding-top: 16px; padding-bottom: 16px;">
<a href="https://zaimki.pl/spis" target="_blank" rel="noopener" style="background-color: #C71585; color: #fff; padding: 8px 16px; border: none; border-radius: 6px;text-decoration: none">
zaimki.pl/spis
</a>
</p>
<p style="color: #999; font-size: 10px;">Ta wiadomość wysyłana jest do osób, które zapisały się na przypominajkę. Jeśli chcesz z niej zrezygnować, <a href="https://zaimki.pl/api/subscription/unsubscribe?email={{emailEncoded}}&type=census">kliknij tutaj</a>.</p>
`,
},
];
async function calculate() {
const db = await dbConnection();
const sent = {};
for (const { subscription_id, campaign } of await db.all(SQL`SELECT * FROM subscription_messages`)) {
if (sent[subscription_id] === undefined) {
sent[subscription_id] = [];
}
sent[subscription_id].push(campaign);
}
const now = newDate();
for (const { id, locale, type, email } of await db.all(SQL`SELECT * FROM subscriptions`)) {
const campaign = CAMPAIGNS.filter((n) => {
return n.type === type &&
now >= n.sendAt &&
decodeTime(id) <= n.sendAt && // don't send to people who signed up after send date
(n.locales === undefined || n.locales.includes(locale)) &&
!(sent[id] || []).includes(n.name)
;
})?.[0];
if (!campaign) {
continue;
}
console.log(`Sending to ${email}`);
await mailer(email, campaign, {
emailEncoded: encodeURIComponent(email),
});
await db.get(SQL`INSERT INTO subscription_messages (id, subscription_id, campaign)
VALUES (${ulid()}, ${id}, ${campaign.name})`);
}
await db.close();
}
calculate();