Skip to content

Instantly share code, notes, and snippets.

@timjonesdev
timjonesdev / TeamRouter_1.java
Created August 21, 2019 00:01
The first router function
@Bean
public RouterFunction<ServerResponse> route(TeamHandler teamHandler) {
return RouterFunctions
.route(RequestPredicates.GET("/teams"), teamHandler::getTeams);
}
@timjonesdev
timjonesdev / TeamHandler_1.java
Created August 21, 2019 00:02
The first team handler
/**
* Return all teams from the fantasy_db.teams collection
*
* @param request - the request (unused in this operation)
* @return a list of all teams
*/
public Mono<ServerResponse> getTeams(ServerRequest request) {
return ServerResponse.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromPublisher(this.teamRepository.findAll(), Team.class));
@Bean
public RouterFunction<ServerResponse> route(TeamHandler teamHandler) {
return RouterFunctions
.route(RequestPredicates.GET("/teams"), teamHandler::getTeams)
.andRoute(RequestPredicates.GET("/teams/watch"), teamHandler::watchTeams)
.andRoute(RequestPredicates.GET("/team/{name}"), teamHandler::watchTeam);
}
/**
* Subscribe to watch updates to a particular team
*
* @param request - must be of the form /{name}
* @return a subscription to a Server Sent Event which
* fires every time the requested team is updated in the fantasy_db.teams collection.
* The subscription is watching a change stream in MongoDB
*/
public Mono<ServerResponse> watchTeam(ServerRequest request) {
String teamName = request.pathVariable("name");
@timjonesdev
timjonesdev / RandomizeScore.java
Created August 21, 2019 16:45
The zip function, in action.
public Mono<ServerResponse> randomizeScore(ServerRequest request) {
String countString = request.pathVariable("count");
int count = Integer.parseInt(countString);
if (count < 0 || count > 40) {
return ServerResponse.badRequest().body(BodyInserters.fromObject("Count must be between 0 and 40"));
}
Flux<String> playerNames = this.teamRepository.findAll()
.map(Team::getPlayers)
@timjonesdev
timjonesdev / StaticWebFilter.java
Created August 21, 2019 17:17
A static web filter
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
@Component
public class StaticWebFilter implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
@timjonesdev
timjonesdev / CorsWebFilter.java
Created August 21, 2019 17:21
A simple CORS filter
@Bean
CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
// Possibly...
// config.applyPermitDefaultValues()
config.setAllowCredentials(true);
// allow access to my dev Angular instance
@timjonesdev
timjonesdev / deserializable.ts
Last active August 21, 2019 20:58
Typescript Model Classes for Reactive Mongo Example
/**
* Enforces a deserialize method to ensure a model class
* can construct itself from a JSON string
*/
export interface Deserializable {
deserialize(input: any): this;
}
@timjonesdev
timjonesdev / getTeams.ts
Last active August 21, 2019 21:52
Subscribe to a Server Sent Event
import {Injectable, NgZone} from '@angular/core';
import {environment} from '../../environments/environment';
import {BehaviorSubject, Observable} from "rxjs";
import {TeamModel} from "../models/team.model";
@Injectable({
providedIn: 'root'
})
export class TeamService {
private teamsWatchUrl = environment.backendUrl + environment.watchTeamsPath;
@timjonesdev
timjonesdev / teamObservable.ts
Last active August 22, 2019 04:29
BehaviorSubject and Observable
private teamWatchSource = new BehaviorSubject(new TeamModel());
_teamWatchSource: Observable<TeamModel> = this.teamWatchSource.asObservable();