services/userService.js

import { USER_ACTIVITY, USER_AVERAGE_SESSIONS, USER_MAIN_DATA, USER_PERFORMANCE } from "../datas/data"

/**
 * base of the url to access the user api
 */
const baseUrlApi = `http://localhost:3000/user`

/**
 * urls array used to retrieve user data from the API
 * @function
 * @param {number} userId - identifier of the user whose data is to be recovered
 * @returns {array} api urls array
 */
const getByIdApiRequest = userId => {
    return  [
        `${baseUrlApi}/${userId}`, 
        `${baseUrlApi}/${userId}/activity`, 
        `${baseUrlApi}/${userId}/average-sessions`, 
        `${baseUrlApi}/${userId}/key-data`, 
        `${baseUrlApi}/${userId}/performance`, 
        `${baseUrlApi}/${userId}/today-score` 
    ]
}

/**
 * retrieves user data mocked
 * @function
 * @param {number} userId - user identifier
 */
const getByIdMocked = userId => getDataObject(
    USER_MAIN_DATA.filter(user => user.id === userId)[0].userInfos, 
    USER_ACTIVITY.filter(session => session.userId === userId)[0].sessions,
    USER_AVERAGE_SESSIONS.filter(session => session.userId === userId)[0].sessions,
    USER_MAIN_DATA.filter(user => user.id === userId)[0].keyData,
    USER_PERFORMANCE.filter(perf => perf.userId === userId)[0],
    USER_MAIN_DATA.filter(user => user.id === userId)[0].todayScore
)

/**
 * groups the collected data into an object
 * @function
 * @param {object} userInfos 
 * @param {object} userActivity 
 * @param {pbject} userSessions 
 * @param {object} userKeyData 
 * @param {object} userPerformance 
 * @param {object} userScore 
 * @returns {object} user data object = { mainData, activity, sessions, keyData, performances, score }
 */
const getDataObject = (userInfos, userActivity, userSessions, userKeyData, userPerformance, userScore) => {
    return {
        mainData: userInfos, 
        activity: userActivity,
        sessions: userSessions,
        keyData: userKeyData,
        performances: userPerformance,
        score: userScore
    }
}

/**
 * retrieves user data model
 * @function
 * @param {object} userInfos 
 * @param {object} userActivity 
 * @param {pbject} userSessions 
 * @param {object} userKeyData 
 * @param {object} userPerformance 
 * @param {object} userScore 
 * @returns {object} dataObject - @see getDataObject()
 */
const getDataObjectApi = (userInfos, userActivity, userSessions, userKeyData, userPerformance, userScore) => {
    return getDataObject(
        userInfos.data.data.userInfos, 
        userActivity.data.data.sessions,
        userSessions.data.data.sessions,
        userKeyData.data.data,
        userPerformance.data.data,
        userScore.data.data
    )
}

/**
 * object containing user data collection functions
 */
const userService = {
    getByIdApiRequest,
    getByIdMocked,
    getDataObjectApi,
    getUsersMocked : () => { return USER_MAIN_DATA }
}

export default userService