Battle-Cattle/BCUK-Bot-3

View on GitHub
src/main/java/com/expiredminotaur/bcukbot/web/view/login/ProcessLoginView.java

Summary

Maintainability
A
0 mins
Test Coverage
package com.expiredminotaur.bcukbot.web.view.login;

import com.expiredminotaur.bcukbot.discord.DiscordBot;
import com.expiredminotaur.bcukbot.sql.user.User;
import com.expiredminotaur.bcukbot.sql.user.UserRepository;
import com.expiredminotaur.bcukbot.web.security.UserTools;
import com.vaadin.flow.component.UI;
import com.vaadin.flow.component.html.Div;
import com.vaadin.flow.router.AfterNavigationEvent;
import com.vaadin.flow.router.AfterNavigationObserver;
import com.vaadin.flow.router.Route;
import discord4j.common.util.Snowflake;
import discord4j.core.object.entity.Guild;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;

import java.util.List;
import java.util.Optional;

@Route("login/process")
public class ProcessLoginView extends Div implements AfterNavigationObserver
{
    @Autowired
    private UserRepository users;

    @Autowired
    private UserTools userTools;

    @Autowired
    private DiscordBot discordBot;

    @Override
    public void afterNavigation(AfterNavigationEvent event)
    {
        long userID = userTools.getCurrentUsersID();

        Optional<User> oUser = users.findById(userID);
        String username = userTools.getCurrentUsersName();
        if (oUser.isPresent())
        {
            User user = oUser.get();
            user.setDiscordName(username);
            users.save(user);
            UI.getCurrent().getPage().setLocation("/");
        } else if (inBotServer(userID))
        {
            User user = new User();
            user.setDiscordId(userID);
            user.setDiscordName(username);
            users.save(user);
            UI.getCurrent().getPage().setLocation("/");
        } else
        {
            OAuth2AuthenticationToken auth = userTools.getAuthentication();
            if (auth != null)
                auth.setAuthenticated(false);
            UI.getCurrent().navigate(UnauthorisedView.class);
        }
    }

    private boolean inBotServer(long userId)
    {
        List<Guild> servers = discordBot.getGateway().getGuilds()
                .filterWhen(guild -> guild.getMembers().any(member -> member.getId().equals(Snowflake.of(userId))))
                .collectList().block();
        return servers != null && !servers.isEmpty();
    }
}