uebung2017-9/README.md
2017-06-29 17:08:27 +02:00

89 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Übungszettel 9
==============
Pushen Sie nach der Bearbeitung jeder Aufgabe Ihre Ergebnisse.
Issue 1
-------
a) Führen Sie in Ihrem Übungsverzeichnis die folgenden Befehle aus.
Yesod-Grundgerüst initialisieren:
- $ stack new NAMEIHRESWEBPROJEKTS --bare yesod-sqlite
Kompilieren mit yesod:
- $ stack build yesod-bin
Starten des Servers:
- $ stack exec -- yesod devel
Öffnen Sie einen Browser mit der Domain `http://localhost:3000/`. Wenn alles geklappt hat, sollten Sie hier bereits die Möglichkeit haben, sich mit einem Dummy-Account einzuloggen und eine Profilseite zu öffnen.
b) In `config/models` werden alle Entitäten definiert, die Ihre Datenbank kennen soll. Diese soll nun im Hinblick auf Issue 2-4 angepasst werden. Die dafür nötigen Entitäten sind in einem [Entity-relationship model](https://de.wikipedia.org/wiki/Entity-Relationship-Modell) festgehalten, welches Sie in der Datei [ERModel.pdf](/ERModel.pdf) finden.
- Verschieben Sie das mitgegebene Modul `MyTypes.hs` in den `src/`-Ordner und importieren Sie es in der `Model.hs`
- Pflegen Sie die Entitäten aus [ERModel.pdf](/ERModel.pdf) sinnvoll in `config/models` ein.
Hinweise:
- Ganz ähnlich wie Sie es von der `record syntax` her kennen, hat hier jede Entität beliebig viele Felder,
für die Sie Name und Typ festlegen müssen.
- Für textuelle Felder, nutzen Sie den Typ `Text`. Falls ein Feld auch leer sein darf, fügen Sie ein `Maybe` hinzu.
- Für jede Entität werden automatisch Id-Typen definiert (z.B. `UserId` für die Entität `User`), die Sie benutzen können, um bestimmte Kardinalitäten
zu erzwingen.
- Wenn Sie selber definierte Typen verwenden wollen, um die Ausprägungen eines Entity-Feldes festzulegen, definieren Sie diese in der mitgegebenen Datei `MyTypes.hs`.
Issue 2
-------
Neues Feature: Timeline für alle Nutzer. Auf der Seite `All Users` sollen alle jemals eingelogten Nutzer angezeigt werden. Mit einem Klick auf einen Nutzernamen wird man auf die zugehörige `Timeline` weitergeleitet. Auf der Timeline muss erst einmal nichts weiter stehen außer der Titel: "USERNAME's Timeline".
- `config/routes`: Erstellen Sie die folgenden Routen:
```
/timeline/#UserId UserTimelineR GET
/userList UserListR GET
```
- `Foundation.hs`:
- Ergänzen Sie die Funktionen, in denen auf Routen-Konstruktoren pattern-gematcht wird.
- Die Routen `UserListR` und `UserTimelineR` sollen nur für autorisierte (d.h. eingeloggte) Nutzer sichtbar sein.
- Sorgen Sie dafür, dass `UserListR` über den Menüpunkt "All Users" erreichbar ist (siehe MenuItem in defaultLayout).
- `src/Handler/`:
- Kopieren Sie die vorgegebenen Handler-Module `UserTimeline.hs` und `UserList.hs` hier hin.
- `templates/`: Man kann hamlet-Code für Widgets etc. auch in template-Files auslagern. Diese werden hier gespeichert.
- Kopieren Sie die vorgegebenen Template-Dateien `UserTimeline.hamlet` und `UserList.hamlet` hier hin.
- `.cabal`: Fügen Sie die Handler als `exposed-module` hinzu.
- `src/Application.hs`: Importieren Sie die neuen Handler.
- `src/Handler/UserList.hs`/`src/Handler/UserTimeline.hs` bzw. `templates/UserTimeline.hamlet`/`templates/UserList.hamlet`:
- Bearbeiten Sie die TODOs zu Issue 2.
- Inhaltlich können Sie sich stark an der Vorlesung orientieren!
Issue 3
-------
Neues Feature: Posten auf der eigenen Timeline. Jeder Nutzer soll nun auf seiner eigenen `Timeline`-Seite Nachrichten mit anderen teilen können.
- Legen Sie hierfür in `config/routes` die neue Route an:
´´´
/timeline TimelineR GET POST
´´´
- Kopieren Sie `Timeline.hs` und `timeline.hamlet` ins Handler- bzw. Templates-Verzeichnis.
- Die Route `TimelineR` soll für autorisierte Nutzer über einen extra Menüpunkt "Your Timeline" erreichbar sein. Führen Sie die nötigen Änderungen in `.cabal`, `Foundation.hs` und `Application.hs` durch.
- Bearbeiten Sie die Aufgaben in `Timeline.hs` und `timeline.hamlet`.
Issue 4
-------
Never gonna give U up, never gonna let ya down Friendship :D
Die Seite `All Users` soll nun auch erlauben, Freundschaftsanfragen abzuschicken, abzulehnen. Auf dieser soll man einem Nutzer eine Freundschaftsanfrage stellen können. Es soll erkenntlich sein, mit wem man bereits befreundet ist. Man soll nur die Timelines befreundeter Nutzer besuchen können.