<commit_before>package sotechat.service;

import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
import org.springframework.stereotype.Service;
import sotechat.data.ChatLogger;
import sotechat.wrappers.MsgToClient;
import sotechat.wrappers.MsgToServer;
import sotechat.data.Mapper;

/**
 * Logiikka chat-viestien kasittelyyn.
 */
@Service
public class ChatMessageService {

    /** Mapperilta voi esim. kysya "mika username on ID:lla x?". */
    private final Mapper mapper;

    /** ChatLogger. */
    private final ChatLogger chatLogger;

    private final DatabaseService databaseService;

    /**
     * Constructor autowires mapper.
     * @param pMapper mapper
     * @param pChatLogger chatLogger
     */
    @Autowired
    public ChatMessageService(
            final Mapper pMapper,
            final ChatLogger pChatLogger,
            final DatabaseService pDatabaseService
    ) {
        this.mapper = pMapper;
        this.chatLogger = pChatLogger;
        this.databaseService = pDatabaseService;
    }


    /** Logiikka saapuvien chat-viestien kasittelyyn.
     * Tallentaa viestin tietokantaan ja palauttaa viestin muodossa,
     * joka voidaan lahettaa kanavalla olijoille.
     * @param msgToServer saapuva viesti
     * @param accessor accessor
     * @return msgToClient eli lahteva viesti
     */
    public final synchronized MsgToClient processMessage(
            final MsgToServer msgToServer,
            final SimpMessageHeaderAccessor accessor
    ) throws Exception {

        /** Selvitetaan kayttajanimi annetun userId:n perusteella. */
        String userId = msgToServer.getUserId();

        String channelId = msgToServer.getChannelId();

        String content = msgToServer.getContent();

        String username = mapper.getUsernameFromId(userId);

        //TODO: tarkista, etta user on subscribannut kanavalle.

        if (validUserId(userId, accessor)) {
            return prepareMessage(username, channelId, content);
        }
        else return null;
    }

    /**
     * Muokataan viestistä clientille sopivan muotoinen ja lisätään siihen
     * aikaleima. Talletetaan viesti lokeihin sekä tietokanataan. Palautetaan
     * clientille sopivan muotoinen viesti.
     * @param username viestin lähettäjän käyttäjänimi
     * @param channelId viestin kanavan id
     * @param content viestin sisältö
     * @return MsgToClient muotoinen viesti -olio
     * @throws Exception
     */
    private MsgToClient prepareMessage(String username,
                                        String channelId, String content)
                                        throws Exception {
<commit_msg>Uusi travis yritys<commit_after>package sotechat.service;

import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
import org.springframework.stereotype.Service;
import sotechat.data.ChatLogger;
import sotechat.wrappers.MsgToClient;
import sotechat.wrappers.MsgToServer;
import sotechat.data.Mapper;

/**
 * Logiikka chat-viestien kasittelyyn.
 */
@Service
public class ChatMessageService {

    /** Mapperilta voi esim. kysya "mika username on ID:lla x?". */
    private final Mapper mapper;

    /** ChatLogger. */
    private final ChatLogger chatLogger;

    private final DatabaseService databaseService;

    /**
     * Constructor autowires mapper.
     * @param pMapper mapper
     * @param pChatLogger chatLogger
     */
    @Autowired
    public ChatMessageService(
            final Mapper pMapper,
            final ChatLogger pChatLogger,
            final DatabaseService pDatabaseService
    ) {
        this.mapper = pMapper;
        this.chatLogger = pChatLogger;
        this.databaseService = pDatabaseService;
    }


    /** Logiikka saapuvien chat-viestien kasittelyyn.
     * Tallentaa viestin tietokantaan ja palauttaa viestin muodossa,
     * joka voidaan lahettaa kanavalla olijoille.
     * @param msgToServer saapuva viesti
     * @param accessor accessor
     * @return msgToClient eli lahteva viesti
     */
    public final synchronized MsgToClient processMessage(
            final MsgToServer msgToServer,
            final SimpMessageHeaderAccessor accessor
    ) throws Exception {

        /** Selvitetaan kayttajanimi annetun userId:n perusteella. */
        String userId = msgToServer.getUserId();

        String channelId = msgToServer.getChannelId();

        String content = msgToServer.getContent();

        String username = mapper.getUsernameFromId(userId);

        //TODO: tarkista, etta user on subscribannut kanavalle.

        if (validUserId(userId, accessor)) {
            return prepareMessage(username, channelId, content);
        }
        else return null;
    }

    /**
     * Muokataan viestistä clientille sopivan muotoinen ja lisätään siihen
     * aikaleima. Talletetaan viesti lokeihin sekä tietokanataan. Palautetaan
     * clientille sopivan muotoinen viesti.
     * @param username viestin lähettäjän käyttäjänimi
     * @param channelId viestin kanavan id
     * @param content viestin sisältö
     * @return MsgToClient muotoinen viesti -olio
     * @throws Exception
     */
    private MsgToClient prepareMessage(
            String username,
            String channelId,
            String content
        ) throws Exception {

{'fraction_non_alphanumeric': 0.06861126398825904, 'fraction_numerical': 0.0, 'mean_word_length': 2.799303135888502, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6739541', 'n_tokens_mistral': 1631, 'n_tokens_neox': 1582, 'n_words': 401}