# Restaurant Reiskorn

## Installation

1. Herunterladen des aktuellen [Release](https://gogs.sebse.de/Caesar2011/html5-restaurant/releases).
2. Starten der `main.js` im Hauptprojekt-Ordner.
	- `node path/to/main.js`
	- Relative und absolute Pfade erlaubt
3. Aufrufen [der lokalen Node-Anwendung](http://localhost:3000) oder [dem gehosteten Service](http://restaurant.sebse.de)

## Login

Anmeldedaten finden sich in der `data/users.json`, die, falls Änderungen vorgenommen werden sollen, manuell vor dem Start der nodejs-Anwendung durchgeführt werden müssen.

Standard-Login-Daten

```js
{
	"Richard Reis": {
		"pwd": "secret",
		"rights": [
			null,
			true,
			true,
			true
		]
	},
	"Ursula Ulstein": {
		"pwd": "ultimativ",
		"rights": [
			null,
			true,
			true,
			false
		]
	}
}
```

## Funktionen

 - Unterschiedliche CRUD-Routinen für Reservierung und Speisekarte
 - Verwendung von Bootstrap mit minimalistischem, eigenen CSS
 - Einbindung einer eigenen Schriftart
 - Implementierung einer eigenen, komplexen Angular-Direktive zur Anzeige einer Google Map
 - Responsive Design für alle Bildschirmgrößen und nicht JS-Benutzer
 - Serverseitige Implementierung mit Node.js
 - Persistierung des Speiseplans und der Reservierungen nach Serverneustart
 - Login/Speicherung der Nutzer in externer Datei
 - Eigenen AngularJS-Service und Controller implementiert
 - Verwendung des AngularJS-Service $http
    - Name der Tagesreisempfehlung per Agular nachgeladen
- Persönliche Formulierungen
    - Realitätsnahe Sprache

## Dateistruktur

### data

- Daten zur Speicherung der
	- Reservierungen
	- Speisekarte
	- Benutzerliste
- Mit jeweiligen Beispielwerten zum manuellen Einladen

### modules

- eigene nodejs-Module
- entspricht im MVC-Modell einem Model
- CRUD-Routinen
	- Reservierungen
	- Speisekarte
	- Benutzerliste

### node_modules

- von npm installierte Pakete

### public

- Client-Assets
	- CSS
	- Client-JS
	- Bilder
	- Bootstrap/AngularJS
- werden über HTML nachgeladen

### views

- JADE-Views
- HTML-Template-Engine

## Requests

| Min. Vers. | Methode | URI | Parameter | Beschreibung | Benötige Rechte |
|--------|--------|--------|--------|--------|--------|
| 0.1 | GET | / | keine | Zeigt die Startseite an | keine |
| 0.1 | GET | /login | keine | Zeigt die Loginseite an | keine |
| 0.1 | POST | /login | username:<br> `[Benutzername]`<br>password:<br> `[Passwort des Benutzers]` | Loginversuch | keine |
| 0.1 | POST | /login | targetLogout:<br> `logout` | Logout | keine |
| 0.1 | GET | /speisekarte | keine | Zeigt die Speisekarte an | keine (Bearbeitungsfunktionen mit MENU) |
| 0.1 | POST | /speisekarte | nametag:<br> `[f\|d]-[Index in der Liste "food"/"drinks"]-new`<br>name:<br> `[Name des Gerichts]`<br>desc:<br> `[Beschreibung des Menüeintrags]` | Hinzufügen eines Menüeintrags | MENU |
| 0.1 | POST | /speisekarte | nametag:<br> `[f\|d]-[Index in der Liste "food"/"drinks"]-[Index in der Liste "items"]`<br>name:<br> `[Name des Gerichts]`<br>desc:<br> `[Beschreibung des Menüeintrags]` | Aktualisieren der Informationen eines Eintrages | MENU |
| 0.1 | POST | /speisekarte | nametag:<br> `[f\|d]-[Index in der Liste "food"/"drinks"]-[Index in der Liste "items"]-del` | Löschen eines Eintages aus der Speisekarte | MENU |
| 0.1 | GET | /kontakt | keine | Zeigt die Kontaktseite an | keine:<br> Reservierungsformular<br>RESERVATION:<br>Liste aller eingegangenen Reservierungen |
| 1.0 | GET | /kontakt | nametag:<br> `[Index der Reservierung]` | Öffnet das Fenster zum Bearbeiten eines Eintages | RESERVATION |
| 1.0 | POST | /kontakt | nametag:<br> `new`<br>name:<br> `[Name des Reservierenden]`<br>desc:<br> `[Kommentarfeld]`<br>email:<br> `[gülige E-Mail-Adresse]`<br>person:<br> `[positive, natürliche Zahl]`<br>time:<br> `^(([01][0-9]\|2[0-4]):[0-5][0-9])$`<br>date:<br> `^(([0-2][0-9]\|3[01]).(0[0-9]\|1[012]).[0-9]{4})$` | Hinzufügen einer Reservierung | keine |
| 1.0 | POST | /kontakt | nametag:<br> `[Index der Reservierung]`<br>name:<br> `[Name des Reservierenden]`<br>desc:<br> `[Kommentarfeld]`<br>email:<br> `[gülige E-Mail-Adresse]`<br>person:<br> `[positive, natürliche Zahl]`<br>time:<br> `^(([01][0-9]\|2[0-4]):[0-5][0-9])$`<br>date:<br> `^(([0-2][0-9]\|3[01]).(0[0-9]\|1[012]).[0-9]{4})$` | Aktualisieren der Informationen einer Reservierung | RESERVATION |
| 1.0 | POST | /kontakt | nametag:<br> `[Index der Reservierung]-del` | Löschen einer Reservierung aus der Liste | RESERVATION |
| 1.1.1 | GET | /api/specialOffer.json | keine | JSON, der aktuell gültigen Angebote | keine |