Skip to content

Instantly share code, notes, and snippets.

View richartkeil's full-sized avatar

Richard Keil richartkeil

View GitHub Profile
const processUser = functions.firestore
.document("accounts/{accountId}/users/{userId}")
.onCreate(async (snapshot, context) => {
await processTheUser(snapshot);
const event = new UserProcessed(snapshot);
await new Account(context.params.accountId).addEvent(event);
})
const processUser = functions.firestore
.document("accounts/{accountId}/users/{userId}")
.onCreate(async (snapshot, context) => {
try {
await processTheUser(snapshot);
const event = new UserProcessed(snapshot);
await new Account(context.params.accountId).addEvent(event);
} catch (error) {
const event = new UserProcessingFailed(snapshot, error);
await new Account(context.params.accountId).addEvent(event);
class Account {
constructor(protected accountId: string) {}
public async addEvent(event: Event) {
return firestore()
.collection("accounts")
.doc(this.accountId)
.collection("events")
.add({
name: event.getName(),
interface Event {
public isCritical(): boolean;
public getName(): string;
public getPayload(): object;
}
class UserProcessed implements Event {
constructor(protected user: firestore.DocumentSnapshot) {}
public isCritical() {
interface Broadcaster {
send(event: Event, user: User)
}
class EmailBroadcaster implements Broadcaster {
send(event: Event, user: User) {
const description = `New event ${event.name} occured at ${event.getTimestamp()}`
emailService.send({ to: user.email, subject: event.name, body: description })
}
}
class EmailBroadcaster {
send(event: Event, user: User) {
const description = `New event ${event.name} occured at ${event.getTimestamp()}`
emailService.send({ to: user.email, subject: event.name, body: description })
}
}
class NotificationHandler {
private mailer: EmailBroadcaster
interface CanBroadcast {
send(event: Event, user: User)
}
interface CanTrackReads {
trackReads(track: boolean);
}
class EmailBroadcaster implements CanBroadcast, CanTrackReads {
send(event: Event, user: User) {
interface CanBroadcast {
send(event: Event, user: User)
trackReads(track: boolean)
}
class EmailBroadcaster implements CanBroadcast {
send(event: Event, user: User) {
emailService.send({ to: user.email, subject: event.name })
}
trackReads(track: boolean) {
@richartkeil
richartkeil / Illuminate\Support\Facades\Storage.php
Last active May 31, 2020 19:54
Laravel Storage and Parallel Testing - Storage Facade
<?php
// ...
public static function fake($disk = null, array $config = []) {
$disk = $disk ?: static::$app['config']->get('filesystems.default');
(new Filesystem)->cleanDirectory(
$root = storage_path('framework/testing/disks/'.$disk)
);
@richartkeil
richartkeil / Tests\CreatesFakeStorage.php
Created November 20, 2018 00:00
Laravel Storage and Parallel Testing - CreatesFakeStorage
<?php
namespace Tests;
use Storage;
use Illuminate\Filesystem\Filesystem;
trait CreatesFakeStorage
{
/**