models/user.js

import PropTypes from "prop-types"

//EcmaScript 6 : POO (getter, setter)
// user object class
class user {

    activity
    averageSessions
    id
    keyData
    mainData
    performances
    todayScore

    /**
     * class representing an user 
     * @class
     * @classdesc retrieve and store user informations
     * 
     * @constructor
     * @param {number} id - user id
     * @param {object} data - contain user data 
     * @param {array} data.activity - array of objects containing user activity records
     * @param {object} data.keyData - contain counting indicators
     * @param {object} data.mainData - contain user main informations
     * @param {object} data.performances - contain attributes userId <number>, kind <object> and data <object>
     * @param {number} data.score - user activity score
     * @param {array} data.sessions - array of objects containing user sessions records 
     */
    constructor(id, data){
        if(!isNaN(id)){
            this.setId(id)
            this.setData(data)
        }
    }

    /**
     * provides user activity
     * @method
     * @memberof user
     * @returns {object} data in JSON format
     * @example return { day: '2020-07-01', kilogram: 80, calories: 240 }
     */
    getActivity(){ return this.activity }

    /**
     * provides user average sessions
     * @method
     * @memberof user
     * @returns {object} session - data in JSON format
     * @example return { day: 1, sessionLength: 30 }
     */
    getAverageSessions() { return this.averageSessions }

    /**
     * provides user calorie count
     * @method
     * @memberof user
     * @returns {number} calorie count
     */
    getCalorieCount(){ return this.keyData.calorieCount }

    /**
     * provides user carbohydrate count
     * @method
     * @memberof user
     * @returns {number} carbohydrate count
     */
    getCarbohydrateCount(){ return this.keyData.carbohydrateCount }

    /**
     * provides user performances
     * @method
     * @memberof user
     * @returns {object} performances - data in JSON format
     * @returns {number} performances.id - user id
     * @returns {object} performances.kind - { 1: 'cardio, 2: 'energy', 3: 'endurance', 4: 'strength', 5: 'speed', 6: 'intensity'}
     * @returns {array} performances.data - [ {value: 80, kind: 1}, ... ] 
     */
    getPerformances() { return this.performances }

    /**
     * provides user score
     * @method
     * @memberof user
     * @returns {number} - score
     * @example return 0.25
     */
    getScore() { return this.todayScore }

    /**
     * provides user first name
     * @method
     * @memberof user
     * @returns {string} user first name
     */
    getFirstName(){ return this.mainData.firstName }

    /**
     * provides user lipid count
     * @method
     * @memberof user
     * @returns {number} lipid count
     */
    getLipidCount(){ return this.keyData.lipidCount }

    /**
     * provides user protein count
     * @method
     * @memberof user
     * @returns {number} protein count
     */
    getProteinCount(){ return this.keyData.proteinCount }

    /**
     * modify the value of attributes activity, averageSessions, keyData, mainData, performances, todayScore
     * @method
     * @memberof user
     * @param {object} data - contain user data 
     */
    setData(data){
        this.activity = data.activity
        this.averageSessions = data.sessions 
        this.keyData = data.keyData
        this.mainData = data.mainData
        this.performances = data.performances 
        this.todayScore = data.score
    }

    /**
     * modify the value of the id attribute
     * @method
     * @memberof user
     * @param {number} id - user id 
     */
    setId(id){ if(!isNaN(id)){ this.id = parseInt(id) } }

}

user.PropTypes = {
    id : PropTypes.number.isRequired,
    data : PropTypes.object.isRequired
}

export default user