# ElSa Stundenplan

Willkommen zum ElSa Stundenplan!

## Einführung

Unsere Webapplikation soll das planen vom Stundenplan vereinfachen.
Aus eigener Erfahrung wissen wir, dass das Adunis beim Stundenplan zusammenstellen nur immer ein Modul anzeigt, was das erstellen erschwert.
Mit Projekt ElSa hat man nun die Möglichkeit seinen eigenen Stundenplan zu erstellen und diesen mit seinen Freunden zu vergleichen.
Verabschiede dich von mühsamen Excel Tabellen und verwende unsere userfreundliche Webapplikation.

Verfolge die Staus Seite und bleib immer auf dem neusten Stand, was Änderungen angeht.

## Projekt Übersicht

### Architektur

![Infrastruktur Diagramm](Infrastruktur.png)

- **Docker Umgebung**: 
  - Das Projekt wird in einer Docker-Umgebung bereitgestellt, was Skalierbarkeit, Portabilität und einfache Bereitstellung ermöglicht.
- **Web Server**:
  - Zwei Node-Instanzen: Der Webserver besteht aus zwei Node.js-Instanzen, welche Redundanz und hohe Verfügbarkeit bieten.
  - Load Balancing: Caddy wird als Loadbalancer zwischen den beiden Node.js-Instanzen verwendet, für eine optimale Lastenverteilung.
- **Datenbank**:
  - PostgreSQL: Die PostgreSQL-Datenbank wird verwendet, um Daten für die Anwendung zu speichern und zu verwalten. Sie bietet Zuverlässigkeit, Leistung und robuste Datenintegritätsfunktionen.
  - Redis: Wird verwendet, um die Sitzungen zwischen den Serverinstanzen zu verwalten.
- **Frontend**:
  - HTML & CSS: Das Frontend der Anwendung wird mit HTML und CSS dargestellt und bietet eine benutzerfreundliche Schnittstelle für die Interaktion mit den Funktionen zur Erstellung und Zusammenarbeit bei der Zeitplanung.
  - HBS: Als Baugerüst für die verschiedenen Seiten verwenden wir Handlebars.

Diese Architektur gewährleistet ein skalierbares, belastbares und effizientes System zur Verwaltung von Stundenplänen und zur Zusammenarbeit mit Freunden.

#### Design Entscheidungen
- **Docker Umgebung**: 
  - Hierbei haben wir Docker compose verwendet, damit alle Container zentral verwaltet werden können.
- **Web Server**:
  - Node: Wir haben uns für Node entschieden, weil wir am meisten Erfahrung mit dieser JavaScript Laufzeitumgebung haben.
  - Caddy: Zuerst haben wir es mit Nginx versucht, jedoch war Nginx nicht so einsteigerfreundlich. Deswegen haben wir uns für Caddy entschieden.
- **Datenbanken**:
  - PostgreSQL: Mit PostgerSQL haben wir am meisten Erfahrung, weswegen wir uns schnell auf den Elefanten geeinigt haben. PostgreSQL bietet umfangreiche Funktionen für Datenintegrität, Transaktionssicherheit und Leistung, was für die Anforderungen der Anwendung essenziell ist.
  - Redis: Diese Datenbank ist verantwortlich für die Sessions. Redis ist für seine hohe Geschwindigkeit und Effizienz bei der Sitzungsverwaltung bekannt und unterstützt die Skalierbarkeit und Leistung der Anwendung.
- **Frontend**:
  - HTML und CSS bieten eine solide Basis für eine benutzerfreundliche Oberfläche. Handlebars ermöglicht eine einfache und effiziente Erstellung dynamischer Inhalte und wiederverwendbarer Komponenten.

### Features

- **Stundenplan Erstellung**: Erstelle Stundenpläne für das kommende Semester.
- **Übersicht**: Füge in der Übersicht den Stundenplan deiner Freunde dazu damit du immer den Überblick behälst, was deine Freunde gerade machen.
- **Scheduled Task**: Der Scheduled Task überprüft minütlich ob es neue Änderungen gibt.
- **Status Seite**: Die Status Page listet die durchgeführten Änderungen auf.

## Installation

Als Voraussetzung, damit unsere Applikation funktioniert wird Docker Desktop und Make benötigt.

Über folgende Schritte kann unsere Applikation eingerichtet werden: 

1. Öffne im Projektverzeichnis ein Terminal.
2. Verwende ``make setup`` für die erstmalige Installation.
3. Verwende ``make start`` für die normale Ausführung.
Fertig!

## Code Übersicht
- **controller**: 
  Für das Anzeigen der verschiedenen Seiten(Handelbar Vorlagen) zuständig.
  - index-controller.js
  - module-controller.js
  - timetable-controller.js
- **public**:
  Beinhaltet CSS für das Design und Javascript für die interaktiven Events.
  - main.js
  - style.css
- **routes**:
 Gibt an welcher controller bei welcher Methode aufgerufen wird.
 - index-routes.js
- **services**:
  Für die Datenbankabfragen zuständig.
  - timetable-db.js
- **utils**:
  Beihaltet Helferfunktionen, sowie Schedule Task und Logging implementation.
  - logfile-utils.js
  - schedule-task.js
  - timetable-dashboard-utils.js
- **views**:
  Hierdrin befinden sich die HTML Vorlagen.
  - create.hbs
  - dashboard.hbs
  - displaytimetable.hbs
  - main.hbs
  - status.hbs
  - timetable.hbs
  - default.hbs
- **db.js**:
  Für die Datenbankverbindung zuständig.
- **server.js**:
  Webserver Basis.

## Autoren

- Sabrina Forster
- Elena Gerber


