import 'package:halkyon_base_server/base.dart'; import 'package:serverpod/serverpod.dart'; /// Keeps every code and notice mailed, in place of a mail service. final class Mailbox implements CodeMailer { final codes = <({String to, String code, EmailCodePurpose purpose, String language})>[]; final notices = < ({ String to, AccountResetKind kind, DateTime takesEffectAt, String language, }) >[]; /// The notices that codes wait (ADR 0017). final codesWait = <({String to, DateTime until, String language})>[]; /// The invitations to shared spaces (ADR 0044, D37). final invitations = <({String to, String inviter, String app, Uri link, String language})>[]; /// Whether it takes no mail, as a mail service down. bool refusing = false; @override Future send( Session session, { required String to, required String code, required EmailCodePurpose purpose, required String language, }) async { if (refusing) { throw Exception('Connection refused'); } codes.add((to: to, code: code, purpose: purpose, language: language)); } @override Future sendResetNotice( Session session, { required String to, required AccountResetKind kind, required DateTime takesEffectAt, required String language, }) async { if (refusing) { throw Exception('Connection refused'); } notices.add(( to: to, kind: kind, takesEffectAt: takesEffectAt, language: language, )); } @override Future sendCodesWaitNotice( Session session, { required String to, required DateTime until, required String language, }) async { if (refusing) { throw Exception('Connection refused'); } codesWait.add((to: to, until: until, language: language)); } @override Future sendInvitation( Session session, { required String to, required String inviter, required String app, required Uri link, required DateTime lapsesAt, required String language, }) async { if (refusing) { throw Exception('Connection refused'); } invitations.add(( to: to, inviter: inviter, app: app, link: link, language: language, )); } /// The last code mailed to [address]. String codeFor(String address) => codes.lastWhere((mail) => mail.to == address).code; }