All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.mstream.trader.simulation.handlers.api.simulation.continuation.ContinueRequestValidator Maven / Gradle / Ivy

package io.mstream.trader.simulation.handlers.api.simulation.continuation;


import com.google.common.collect.Sets;
import io.mstream.trader.commons.utils.exception.ValidationException;
import io.mstream.trader.simulation.handlers.api.simulation.continuation.data
        .ContinueRequestPayload;
import io.mstream.trader.simulation.security.SimulationTokenCipher;
import io.mstream.trader.simulation.simulation.SimulationToken;
import rx.Observable;
import rx.functions.Func1;

import javax.inject.Inject;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Optional;
import java.util.Set;

import static java.lang.String.format;


class ContinueRequestValidator
        implements Func1> {
    
    private final SimulationTokenCipher simulationTokenCipher;
    
    private final DateTimeFormatter dateTimeFormatter;
    
    private final Set validActions;
    
    @Inject
    public ContinueRequestValidator(
            SimulationTokenCipher simulationTokenCipher,
            DateTimeFormatter dateTimeFormatter
    ) {
        
        this.simulationTokenCipher = simulationTokenCipher;
        this.dateTimeFormatter = dateTimeFormatter;
        this.validActions = Sets.newHashSet("HOLD", "BUY", "SELL");
    }
    
    @Override
    public Observable call(ContinueRequestPayload payload) {
        
        String encryptedToken = payload.getToken();
        
        Optional simulationTokenOpt =
                simulationTokenCipher
                        .decrypt(encryptedToken);
        
        if (!simulationTokenOpt.isPresent()) {
            return Observable.error(
                    new ValidationException(
                            format(
                                    "can't parse the token: %s",
                                    encryptedToken
                            )
                    )
            );
        }
        
        SimulationToken token = simulationTokenOpt.get();
        
        try {
            LocalDate.from(dateTimeFormatter.parse(token.getStartDate()));
        } catch (Exception e) {
            return Observable.error(
                    new ValidationException(
                            format(
                                    "can't parse the token: %s",
                                    encryptedToken
                            )
                    )
            );
        }
        
        String action = payload.getAction();
        
        if (!validActions.contains(action)) {
            return Observable.error(
                    new ValidationException(
                            format(
                                    "not supported action: %s\n supported " +
                                            "actions: %s",
                                    encryptedToken,
                                    validActions
                            )
                    )
            );
        }
        
        return Observable.just(payload);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy