com.example.message.MessageEndpoint.java Source code

Java tutorial

Introduction

Here is the source code for com.example.message.MessageEndpoint.java

Source

/*
 * Copyright 2018 Shinya Mochida
 *
 * Licensed under the Apache License,Version2.0(the"License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,software
 * Distributed under the License is distributed on an"AS IS"BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.example.message;

import com.example.auth.AuthenticatedUser;
import com.example.db.Message;
import com.example.db.User;
import com.example.util.PageResult;
import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.MediaType;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;

import static org.springframework.web.reactive.function.server.RequestPredicates.*;
import static org.springframework.web.reactive.function.server.RouterFunctions.nest;
import static org.springframework.web.reactive.function.server.RouterFunctions.route;

@Configuration
public class MessageEndpoint {

    private final MessageRepository messageRepository;

    public MessageEndpoint(final MessageRepository messageRepository) {
        this.messageRepository = messageRepository;
    }

    @Bean
    RouterFunction<ServerResponse> messageEndpointRouterFunction() {
        return nest(path("/messages"), route(POST("/"), this::createMessage).andRoute(GET("/"), this::getMessages));
    }

    private Mono<ServerResponse> getMessages(final ServerRequest request) {
        final GetMessageRequest getMessageRequest = GetMessageRequest.create(request);
        final Mono<PageResult<Message>> result = messageRepository.findAll().as(getMessageRequest::filterPages)
                .collectList().map(getMessageRequest::toResult);
        return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(result,
                new ParameterizedTypeReference<PageResult<Message>>() {
                });
    }

    private Mono<ServerResponse> createMessage(final ServerRequest request) {
        final Mono<Message> messageMono = request.principal().cast(UsernamePasswordAuthenticationToken.class)
                .map(UsernamePasswordAuthenticationToken::getPrincipal).cast(AuthenticatedUser.class)
                .map(AuthenticatedUser::getUser)
                .flatMap(user -> request.bodyToMono(TextMessage.class).map(message -> message.toMessage(user)))
                .flatMap(messageRepository::save);
        return messageMono
                .map(message -> request.uriBuilder().path("/messages/{message_id}").build(message.getId()))
                .map(ServerResponse::created).flatMap(res -> res.body(messageMono, Message.class));
    }

    @Data
    public static class TextMessage {
        private String text;

        private Message toMessage(final User user) {
            return Message.createNew(user, text);
        }
    }
}