Skip to content

Commit

Permalink
release: v2.1.0-beta
Browse files Browse the repository at this point in the history
Merge pull request #34 from LBF38/development
  • Loading branch information
LBF38 authored Jan 29, 2023
2 parents 063eeee + d16108d commit 11b600a
Show file tree
Hide file tree
Showing 9 changed files with 463 additions and 322 deletions.
88 changes: 70 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,37 @@
<p align="center">
<a href="https://aurion-synchronizer.onrender.com">
<img src="./src/static/img/orion.png" width=50%>
<h3 align="center">Aurion Synchronizer</h3>
</a>
</p>

<p align="center">
<a href="./docs/README.md"><strong>Documentation</strong></a> .
<a href="./docs/synchronisation.md"><strong>Guide synchronisation</strong></a> .
<a href="https://github.com/lbf38/planningAurion/issues"><strong>Issues</strong></a>
</p>

***
![Release info](https://img.shields.io/github/v/release/lbf38/planningAurion?style=plastic) ![GitHub issues](https://img.shields.io/github/issues-raw/lbf38/planningAurion?style=plastic) ![GitHub pull requests](https://img.shields.io/github/issues-pr-raw/lbf38/planningAurion?style=plastic)

# Introduction

Ce projet consiste à automatiser la récupération du calendrier AURION des cours de l'ENSTA Bretagne. \
Il permet ainsi de transformer les données récupérées en fichier ics, qui est plus facile à importer dans les applications de calendrier classiques. \
De plus, ce projet a pour ambition de synchroniser les données à chaque mise à jour de celle-ci par la source (l'école). \
Ainsi, le calendrier dans notre application de calendrier (sur téléphone ou autre) sera toujours synchronisée avec le planning en cours de l'école.
Ce projet consiste à automatiser la récupération du calendrier AURION des cours de l'[ENSTA Bretagne](https://ensta-bretagne.fr).

Il permet ainsi de transformer les données récupérées en fichier ics, qui est plus facile à importer dans les applications de calendrier classiques.

De plus, ce projet a pour ambition de synchroniser les données à chaque mise à jour de celle-ci par la source (l'école).

Ainsi, le calendrier dans notre application de calendrier (sur téléphone ou autre) sera toujours synchronisée avec le planning en cours de l'école (sous 24h).

## Table des matières

- [Introduction](#introduction)
- [Table des matières](#table-des-matières)
- [Installation](#installation)
- [Utilisation](#utilisation)
- [Roadmap](#roadmap)
- [Auteurs](#auteurs)

## Installation

Expand Down Expand Up @@ -35,32 +63,56 @@ pnpm run dev
> **Note**
> Passage à `pnpm` plutôt que `npm` pour gérer les dépendances.
*Plus d'explications viendront plus tard dans le projet.*
## Utilisation

Rendez-vous sur le site <https://aurion-synchronizer.onrender.com>.

Actions possibles :

- S'authentifier avec ses identifiants ENSTA Bretagne
- Récupérer et télécharger son calendrier sur une période choisie
- Mettre à jour manuellement son calendrier
- Utiliser le lien comme source de synchronisation pour son calendrier
- Supprimer son compte

## Roadmap

- [ ] Backend
> **Warning**
> Ce projet sera maintenu jusqu'à la fin de l'année scolaire 2022-2023.
- [x] Backend
- [x] Connexion de l'utilisateur pour récup user token
- [x] Récupération des données à partir de l'api ENSTA Bretagne (AURION)
- [ ] Traitement et conversion au format ics
- [x] Traitement et conversion au format ics
- [x] Génération d'un fichier ics
- [ ] Gérer les différences, les majs de calendrier, etc...
- [ ] Génération d'un lien automatique pour synchronisation avec calendrier
- [x] ~~Gérer les différences, les majs de calendrier, etc...~~ => pas besoin, on récupère tout le calendrier (mis à jour) à chaque fois
- [x] Génération d'un lien automatique pour synchronisation avec calendrier
- [x] Gérer les erreurs ou alerter si problème.
- [ ] Frontend
- [x] Frontend
- [x] Site internet simple et facile d'utilisation
- [x] Interface de login de base (pour connexion ENSTA B)
- [x] username
- [x] password
- [ ] Passage à interface pour récup calendrier
- [x] Passage à interface pour récup calendrier
- [x] V1
- [x] paramétrage des dates de la période à prendre
- [x] Interface pour visualisation des changements
- [x] Lien de téléchargement du fichier ics
- [ ] V2
- [ ] Lien de synchronisation directement
- [ ] la synchro se fait automatiquement en backend avec le calendrier de l'utilisateur (que le calendrier soit : google calendar, outlook, apple calendar, ...)
- [ ] Vérification avant déploiement
- [ ] Vérif sécurité
- [ ] ne pas pouvoir accéder à la page après login si ne fonctionne pas.
- [ ] Documentation du code et du projet
- [x] V2
- [x] Lien de synchronisation directement
- [x] la synchro se fait automatiquement en backend avec le calendrier de l'utilisateur (que le calendrier soit : google calendar, outlook, apple calendar, ...)
- [x] Vérification avant déploiement
- [x] Vérif sécurité
- [x] ~~ne pas pouvoir accéder à la page après login si ne fonctionne pas.~~ => non implémenté car pas de risque dans ce projet.
- [x] Documentation du code et du projet

## Auteurs

- [@LBF38](https://github.com/LBF38) : développeur principal du projet (backend et frontend)
- [@thomas40510](https://github.com/thomas40510) : développeur sur la partie frontend

> **Note**
> Le code que vous trouverez ici fut la possibilité pour moi d'apprendre TypeScript, NodeJS et d'autres technologies auxquelles je n'étais pas particulièrement familier. Il est donc possible que le code soit peu optimisé ou mal écrit. N'hésitez pas à me faire des retours sur le code ou sur le projet en général.
> La structure du code et les fonctions mises en place pourraient être nettement améliorées. Cependant, ce projet consistait en un court side project afin d'automatiser la synchronisation de mon calendrier avec celui de l'école. Il n'a pas pour but d'être un projet à long terme.
>
> *- LBF38*
2 changes: 2 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,5 @@ Parcours de l'utilisateur :
- `POST /planning/pull` : Récupère le planning de l'utilisateur.
- `GET /planning/download` : Télécharge le fichier `ics` du planning de l'utilisateur.
- `POST /login` : Connexion de l'utilisateur.

:warning: Ces routes ne sont pas à jour. Il faut les mettre à jour. :warning:
35 changes: 35 additions & 0 deletions docs/synchronisation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Comment synchroniser son calendrier à partir d'un lien ?

Bienvenue dans ce court guide pour synchroniser votre calendrier Aurion avec votre application de calendrier préférée.

- [Comment synchroniser son calendrier à partir d'un lien ?](#comment-synchroniser-son-calendrier-à-partir-dun-lien-)
- [Google Calendar](#google-calendar)
- [Microsoft Outlook](#microsoft-outlook)
- [Apple Calendar](#apple-calendar)

> **Note**
> Vous aurez besoin du lien de votre calendrier créé par Aurion Synchronizer. Pour cela, rendez vous sur la page de téléchargement de votre calendrier sur le synchroniseur Aurion ([Aurion Synchronizer](https://aurion-synchronizer.onrender.com)).
## Google Calendar

Pour synchroniser votre calendrier avec Google Calendar, il vous suffit de cliquer sur le lien suivant : [Google Calendar - Ajout par lien](https://calendar.google.com/calendar/r/settings/addbyurl). Vous serez alors redirigé vers une page où vous pourrez entrer le lien vers le fichier `ics` de votre calendrier. Vous pouvez trouver ce lien en vous rendant sur la page de téléchargement de votre calendrier sur le synchroniseur Aurion ([Aurion Synchronizer](https://aurion-synchronizer.onrender.com)).

> **Note**
> Lien vers l'ajout par lien : [Google Calendar - Ajout par lien](https://calendar.google.com/calendar/r/settings/addbyurl)
> Support : [Support Google Calendar](https://support.google.com/calendar/answer/37100?hl=fr)
## Microsoft Outlook

Pour synchroniser votre calendrier avec Microsoft Outlook, il vous suffit de cliquer sur le lien suivant : [Microsoft Outlook - Ajout par lien](https://outlook.live.com/calendar/0/addcalendar). Vous serez alors redirigé vers une page où vous pourrez entrer le lien vers le fichier `ics` de votre calendrier. Vous pouvez trouver ce lien en vous rendant sur la page de téléchargement de votre calendrier sur le synchroniseur Aurion ([Aurion Synchronizer](https://aurion-synchronizer.onrender.com)).

> **Note**
> Lien vers l'ajout par lien : [Microsoft Outlook - Ajout par lien](https://outlook.live.com/calendar/0/addcalendar)
> Support : [Support Microsoft Outlook](https://support.microsoft.com/fr-fr/office/importer-un-calendrier-ou-s-y-abonner-dans-outlook-sur-le-web-503ffaf6-7b86-44fe-8dd6-8099d95f38df)
## Apple Calendar

Pour synchroniser votre calendrier avec Apple Calendar, il vous suffit de cliquer sur le lien suivant : [Apple Calendar - Ajout par lien](https://support.apple.com/fr-fr/guide/calendar/icl1022/11.0/mac/13.0). Vous serez alors redirigé vers le support officiel pour import ou s'abonner à un calendrier. Vous pouvez trouver ce lien en vous rendant sur la page de téléchargement de votre calendrier sur le synchroniseur Aurion ([Aurion Synchronizer](https://aurion-synchronizer.onrender.com)).

> **Note**
> Lien vers l'ajout par lien : [Apple Calendar - Ajout par lien](https://support.apple.com/fr-fr/guide/calendar/icl1022/11.0/mac/13.0)
> Support : [Support Apple Calendar](https://support.apple.com/fr-fr/guide/calendar/icl1022/11.0/mac/13.0)
7 changes: 4 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "projet-planning-ensta-b",
"version": "2.0.0-beta",
"name": "aurion-synchronizer",
"version": "2.1.0-beta",
"description": "Aurion Synchronizer",
"main": "server.ts",
"scripts": {
Expand All @@ -12,7 +12,7 @@
"clean": "rm -rf ./build"
},
"keywords": [],
"author": "Mathis URIEN",
"author": "Mathis URIEN (LBF38)",
"license": "ISC",
"dependencies": {
"axios": "^1.2.3",
Expand All @@ -24,6 +24,7 @@
"express": "^4.18.2",
"fs": "0.0.1-security",
"helmet": "^6.0.1",
"ical-generator": "^3.6.1",
"moment": "^2.29.4",
"mongoose": "^6.8.4",
"mongoose-unique-validator": "^3.1.0",
Expand Down
44 changes: 44 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion src/controllers/main.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { Request, Response, NextFunction } from "express";

function index(req: Request, res: Response, next: NextFunction) {
res.render("index");
const deleteSuccess = req.cookies.delSuccess;
res.clearCookie("delSuccess");
res.render("index", { delSuccess: deleteSuccess });
}

export default { index };
78 changes: 34 additions & 44 deletions src/controllers/planning.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
require("dotenv/config");
import axios from "axios";
import path from "path";
import moment from "moment";
import fs from "fs";
import { randomUUID } from "crypto";
import { NextFunction, Request, Response } from "express";
import fs from "fs";
import moment from "moment";
import path from "path";
const debug = require("debug")("controllers:planning");

import UserCalendar from "../models/calendar";
import ical from "ical-generator";
import mongoose from "mongoose";
import UserCalendar from "../models/calendar";
import UserController from "./user";

const apiURL: string = "https://formation.ensta-bretagne.fr/mobile";
Expand Down Expand Up @@ -94,7 +94,6 @@ async function _getPlanning(
date_fin: moment(endDate).format("YYYY-MM-DD"),
},
};

const response = await axios(config);
var calendar = response.data;
var ics = [];
Expand All @@ -109,8 +108,6 @@ async function _getPlanning(
if (!event.description) {
event.description = "";
}
event.date_debut = event.date_debut.replace(/[-:]|[.].*/g, "");
event.date_fin = event.date_fin.replace(/[-:]|[.].*/g, "");
ics.push(event);
}
return ics;
Expand All @@ -120,37 +117,30 @@ async function _getPlanning(
}
}

function convertToICS(calendar: any[]) {
function convertToICS(calendar: any[]): string {
debug("Convert to ics ...");
// Création du fichier ICS à partir des données récupérées
let icsMSG = `BEGIN:VCALENDAR
CALSCALE:GREGORIAN
METHOD:PUBLISH
PRODID:-//Aurion//FR
VERSION:2.0
`;

const icalendar = ical({
name: "Aurion Synchronizer",
timezone: "Europe/Paris",
prodId: "//aurion-synchronizer.onrender.com//Aurion-Synchronizer//FR",
});
for (let event of calendar) {
icsMSG += `BEGIN:VEVENT
UID:${randomUUID()}
DTSTAMP:${moment().format("YYYYMMDDThhmmss")}
DTSTART;TZID=Europe/Paris:${event.date_debut}
DTEND;TZID=Europe/Paris:${event.date_fin}
SUMMARY:${event.favori.f3}
LOCATION:${event.favori.f2}
DESCRIPTION:${event.type_activite}\\nIntervenants: ${event.intervenants}\\n${
event.description
}
END:VEVENT
`;
icalendar.createEvent({
start: event.date_debut,
end: event.date_fin,
summary: event.favori.f3,
location: event.favori.f2,
description: `${event.type_activite}\nIntervenants: ${
event.intervenants
}\n${String(event.description).replace(/\\n/g, "\n")}`,
});
}
icsMSG += "END:VCALENDAR";
debug("ICS converted");
return icsMSG;
debug("Converted to ics");
return icalendar.toString();
}

function saveToDatabase(icsCalendar: string, username: string) {
console.log("Save to database...");
debug("Save to database...");
UserCalendar.findOneAndUpdate({ username: username })
.then((userCalendar) => {
if (!userCalendar) {
Expand All @@ -159,7 +149,7 @@ function saveToDatabase(icsCalendar: string, username: string) {
userCalendar.calendarContent = icsCalendar;
})
.catch((error) => {
console.log("[INFO] Error saving to database :" + error.message)
debug("Error saving to database :" + error.message);
return Error(`Error saving to database : ${error.message}`);
});
}
Expand Down Expand Up @@ -192,7 +182,7 @@ async function updatePlannings() {
writeICS(icsCalendar, user.calendarLink);
})
.catch((error) => {
console.error(error);
debug(error);
});
}
}
Expand All @@ -204,15 +194,15 @@ async function updateMyPlanning(
) {
try {
const user = await UserController.getUser(request.cookies.username);
_getPlanning(user.aurionToken, moment().format(), moment().add(1, "year"))
.then((calendar) => {
const icsCalendar = convertToICS(calendar);
saveToDatabase(icsCalendar, user.username);
writeICS(icsCalendar, user.calendarLink);
})
.catch((error) => {
console.error(error);
});
_getPlanning(
user.aurionToken,
moment().format(),
moment().add(1, "year")
).then((calendar) => {
const icsCalendar = convertToICS(calendar);
saveToDatabase(icsCalendar, user.username);
writeICS(icsCalendar, user.calendarLink);
});
response.redirect("/planning/link");
} catch (error: any) {
response.status(400).render("planning", {
Expand Down
Loading

0 comments on commit 11b600a

Please sign in to comment.