Skip to content

Instantly share code, notes, and snippets.

@pchab
pchab / validation-code.saga.spec.ts
Created June 30, 2021 17:12
validation code saga marble test part 2
it("throttle events for multiple users in 5 second frames", () => {
const payload = generatePayload();
const secondPayload = generatePayload();
testScheduler.run(({ hot, expectObservable }) => {
const events$ = hot("-uvu-vu- 5s --vuuv-|", {
u: new ValidationCodeGeneratedEvent(payload),
v: new ValidationCodeGeneratedEvent(secondPayload),
});
@pchab
pchab / validation-code.saga.ts
Created June 30, 2021 17:11
validation code saga with user grouping and throttling
const VALIDATION_CODE_THROTTLE_TIME_IN_MS = 5000;
const getUserId = ({ payload: { user } }: ValidationCodeGeneratedEvent): User["id"] => user.id;
@Injectable()
export class ValidationCodeSagas {
@Saga()
ValidationCodeRequested = (event$: Observable<IEvent>): Observable<SendValidationCodeCommand> => {
return event$.pipe(
ofType(ValidationCodeGeneratedEvent),
groupBy(getUserId),
@pchab
pchab / validation-code.saga.spec.ts
Created June 30, 2021 17:10
validation code saga marble test part 1
const generatePayload = (): SendValidationCodeCommandPayload => {
const user = {
id: faker.random.uuid() as User["id"],
} as UserInContext;
return {
user,
code: faker.random.word(),
channel: VALIDATION_CODE_CHANNEL.TEXT,
reason: GenerateValidationCodeReason.PHONE_NUMBER_VERIFICATION,
@pchab
pchab / validation-code.saga.ts
Created June 30, 2021 17:06
validation code saga with throttling
const VALIDATION_CODE_THROTTLE_TIME_IN_MS = 5000;
@Injectable()
export class ValidationCodeSagas {
@Saga()
ValidationCodeRequested = (event$: Observable<IEvent>): Observable<SendValidationCodeCommand> => {
return event$.pipe(
ofType(ValidationCodeGeneratedEvent),
throttleTime(VALIDATION_CODE_THROTTLE_TIME_IN_MS),
map(({ payload }) => new SendValidationCodeCommand(payload)),
@pchab
pchab / validation-code.saga.ts
Created June 30, 2021 17:05
validation code without throttling
@Injectable()
export class ValidationCodeSagas {
@Saga()
ValidationCodeRequested = (event$: Observable<IEvent>): Observable<SendValidationCodeCommand> => {
return event$.pipe(
ofType(ValidationCodeGeneratedEvent),
map(({ payload }) => new SendValidationCodeCommand(payload)),
);
};
}