summaryrefslogtreecommitdiff
path: root/school/node_modules/pronote-api/src/fetch/pronote/user.js
blob: 54f62be0b999d94d97e53c7d5dae97cb06f8ba6a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
const request = require('../../request');

const parse = require('../../data/types');
const { getFileURL } = require('../../data/files');
const { fromPronote } = require('../../data/objects');

async function getUser(session)
{
    const { donnees: user } = await request(session, 'ParametresUtilisateur');
    const { data, authorizations } = getSpecificData(session, user);

    const res = user.ressource;
    const aut = user.autorisations;

    return {
        ...fromPronote(res),
        ...data,
        establishmentsInfo: parse(user.listeInformationsEtablissements, ({ Logo, Coordonnees }) => ({
            logoID: parse(Logo),
            address: [Coordonnees.Adresse1, Coordonnees.Adresse2],
            postalCode: Coordonnees.CodePostal,
            postalLabel: Coordonnees.LibellePostal,
            city: Coordonnees.LibelleVille,
            province: Coordonnees.Province,
            country: Coordonnees.Pays,
            website: Coordonnees.SiteInternet
        })),
        userSettings: (({ version, EDT, theme, Communication }) => ({
            version,
            timetable: {
                displayCanceledLessons: EDT.afficherCoursAnnules,
                invertAxis: EDT.axeInverseEDT,
                invertWeeklyPlanAxis: EDT.axeInversePlanningHebdo,
                invertDayPlanAxis: EDT.axeInversePlanningJour,
                invertDay2PlanAxis: EDT.axeInversePlanningJour2,
                dayCount: EDT.nbJours,
                resourceCount: EDT.nbRessources,
                daysInTimetable: EDT.nbJoursEDT,
                sequenceCount: EDT.nbSequences
            },
            theme: theme.theme,
            unreadDiscussions: Communication.DiscussionNonLues
        }))(user.parametresUtilisateur),
        sessionAuthorizations: {
            twitterManagement: user.autorisationsSession.fonctionnalites.gestionTwitter,
            expandedAttestation: user.autorisationsSession.fonctionnalites.attestationEtendue
        },
        authorizations: {
            discussions: aut.AvecDiscussion,
            teachersDiscussions: aut.AvecDiscussionProfesseurs,
            timetableVisibleWeeks: parse(aut.cours.domaineConsultationEDT),
            canEditLessons: parse(aut.cours.domaineModificationCours),
            hideClassParts: aut.cours.masquerPartiesDeClasse,
            maxEstablishmentFileSize: aut.tailleMaxDocJointEtablissement,
            editPassword: aut.compte.avecSaisieMotDePasse,
            editPersonalInfo: aut.compte.avecInformationsPersonnelles,
            canPrint: aut.autoriserImpression,
            ...authorizations
        },
        minPasswordSize: user.reglesSaisieMDP.min,
        maxPasswordSize: user.reglesSaisieMDP.max,
        passwordRules: parse(user.reglesSaisieMDP.regles),
        kioskAccess: user.autorisationKiosque,
        tabs: user.listeOnglets.map(parseTab),
        hiddenTabs: user.listeOngletsInvisibles,
        notifiedTabs: user.listeOngletsNotification
    };
}

function parseTab({ G: id, Onglet: subs })
{
    return { id, subs: (subs || []).map(parseTab) };
}

function getSpecificData(session, data)
{
    switch (session.type.name)
    {
    case 'student':
        return getStudentData(session, data);
    case 'parent':
        return getParentData(session, data);
    case 'teacher':

        break;
    case 'administration':

        break;
    default:
        return {};
    }
}

function getStudentData(session, data)
{
    return {
        data: getStudent(session, data.ressource),
        authorizations: {
            maxUserWorkFileSize: data.autorisations.tailleMaxRenduTafEleve
        }
    };
}

function getStudent(session, res)
{
    const avatar = {};
    if (res.avecPhoto) {
        avatar.avatar = getFileURL(session, {
            id: res.N,
            name: 'photo.jpg'
        });
    }

    return {
        ...fromPronote(res),
        establishment: parse(res.Etablissement),
        ...avatar,
        studentClass: fromPronote(res.classeDEleve),
        classHistory: parse(res.listeClassesHistoriques, ({ AvecNote, AvecFiliere }) => ({
            hadMarks: AvecNote,
            hadOptions: AvecFiliere
        })),
        groups: parse(res.listeGroupes),
        tabsPillars: parse(res.listeOngletsPourPiliers, ({ listePaliers }) => ({
            levels: parse(listePaliers, ({ listePiliers }) => ({
                pillars: parse(listePiliers, ({ estPilierLVE, estSocleCommun, Service }) => ({
                    isForeignLanguage: estPilierLVE,
                    isCoreSkill: estSocleCommun,
                    subject: Service && parse(Service)
                }))
            }))
        }), 'tab'),
        tabsPeriods: parse(res.listeOngletsPourPeriodes, ({ listePeriodes, periodeParDefaut }) => ({
            periods: parse(listePeriodes, ({ GenreNotation }) => ({
                isCorePeriod: GenreNotation === 1
            })),
            defaultPeriod: parse(periodeParDefaut)
        }), 'tab')
    };
}

function getParentData(session, data)
{
    const res = data.ressource;
    const aut = data.autorisations;

    return {
        data: {
            isDelegate: res.estDelegue,
            isBDMember: res.estMembreCA,
            canDiscussWithManagers: res.avecDiscussionResponsables,
            absencesReasons: parse(data.listeMotifsAbsences),
            delaysReasons: parse(data.listeMotifsRetards),
            classDelegates: parse(res.listeClassesDelegue),
            students: res.listeRessources.map(r => fromPronote(r, ({ listeSessions }) => ({
                ...getStudent(session, r),
                sessions: parse(listeSessions, ({ date, strHeureDebut, strHeureFin }) => ({
                    from: getDateWithHours(parse(date), strHeureDebut),
                    to: getDateWithHours(parse(date), strHeureFin)
                }))
            })))
        },
        authorizations: {
            staffDiscussion: aut.AvecDiscussionPersonnels,
            parentsDiscussion: aut.AvecDiscussionParents,
            editStudentPassword: aut.compte.avecSaisieMotDePasseEleve,
            editCoordinates: aut.compte.avecSaisieInfosPersoCoordonnees,
            editAuthorizations: aut.compte.avecSaisieInfosPersoAutorisations
        }
    };
}

function getDateWithHours(date, hours)
{
    const h = hours.indexOf('h');

    date.setHours(date.getHours() + ~~hours.substring(0, h));
    date.setMinutes(date.getMinutes() + ~~hours.substring(h));

    return date;
}

module.exports = getUser;