Compare commits

..

6 Commits

Author SHA1 Message Date
niklas.ortmann 3c14df129d Create data_sources_history.xml 2026-06-08 12:04:56 +02:00
niklas.ortmann 198fefbdf5 Update LocalUserManager.php 2026-06-05 10:35:33 +02:00
niklas.ortmann 135bd7b9cd Update updateArticle.php 2026-06-05 10:33:21 +02:00
niklas.ortmann 4cd0383322 deleteArticle -> Autorisierungsprüfung 2026-06-05 10:31:09 +02:00
niklas.ortmann 793d9632b2 refactoring 2026-06-04 19:02:15 +02:00
niklas.ortmann 5892a875c8 refactoring 2026-06-04 18:32:01 +02:00
14 changed files with 101 additions and 36 deletions
+42
View File
@@ -0,0 +1,42 @@
<DataSourcesHistory>
<DataSourceFromHistory isRemovedFromProject="true">
<data-source source="LOCAL" name="articles" uuid="a0abcd0a-1d6f-40e4-88be-f442bcb431ba">
<database-info product="SQLite" version="3.51.1" jdbc-version="4.2" driver-name="SQLite JDBC" driver-version="3.51.1.0" dbms="SQLITE" exact-version="3.51.1" exact-driver-version="3.51">
<identifier-quote-string>&quot;</identifier-quote-string>
</database-info>
<case-sensitivity plain-identifiers="mixed" quoted-identifiers="mixed" />
<driver-ref>sqlite.xerial</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/db/articles</jdbc-url>
<secret-storage>master_key</secret-storage>
<auth-provider>no-auth</auth-provider>
<schema-mapping>
<introspection-scope>
<node kind="schema" qname="@" />
</introspection-scope>
</schema-mapping>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</DataSourceFromHistory>
<DataSourceFromHistory isRemovedFromProject="false">
<data-source source="LOCAL" name="articles" uuid="315cb5c9-2b0f-435b-b602-59823b160908">
<database-info product="SQLite" version="3.51.1" jdbc-version="4.2" driver-name="SQLite JDBC" driver-version="3.51.1.0" dbms="SQLITE" exact-version="3.51.1" exact-driver-version="3.51">
<identifier-quote-string>&quot;</identifier-quote-string>
</database-info>
<case-sensitivity plain-identifiers="mixed" quoted-identifiers="mixed" />
<driver-ref>sqlite.xerial</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/db/articles</jdbc-url>
<secret-storage>master_key</secret-storage>
<auth-provider>no-auth</auth-provider>
<schema-mapping>
<introspection-scope>
<node kind="schema" qname="@" />
</introspection-scope>
</schema-mapping>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</DataSourceFromHistory>
</DataSourcesHistory>
+8 -4
View File
@@ -19,13 +19,17 @@ Jeweils im Format `Anmeldename, Passwort, Mailadresse`:
- Bitte auf die gesetzten TODO's achten. Wenn Inhalte fehlen, sind sie i.d.R. als TODO kommentiert. - Bitte auf die gesetzten TODO's achten. Wenn Inhalte fehlen, sind sie i.d.R. als TODO kommentiert.
- Die Navbar hat noch keine onHover-Effekte und erschwert etwas die Bedienung. - Die Navbar hat noch keine onHover-Effekte und erschwert etwas die Bedienung.
- Suchleiste in der Nav ist in der mobilen Ansicht etwas schmal. Ggf. ein alternatives (kleineres) Logo implementieren. - Suchleiste in der Nav ist in der mobilen Ansicht etwas schmal. Ggf. ein alternatives (kleineres) Logo implementieren.
- Die Suchseite und Kategorieseite packen momentan alle passenden Beiträge untereinander. Später sollen zunächst 10
Ergebnisse auf einer Seite angezeigt werden.
## Besonderheiten des Projektes ## Besonderheiten des Projektes
- Es wurde ein einfacher Beitrags-Editor erstellt. Mit diesem können Beiträge erstellt oder bearbeitet werden. - Es wurde ein einfacher Beitrags-Editor erstellt. Mit diesem können Beiträge erstellt oder bearbeitet werden.
Es handelt es sich um eine einfache Version. Später sollen z.B. Bilder und die Positionierung der Elemente folgen. Es handelt es sich um eine einfache Version. Später sollen z.B. Bilder und die Positionierung der Elemente folgen.
- Es sind drei Dummy-Beiträge für den Nutzer max.mustermann hinterlegt. - Es sind drei Dummy-Beiträge für den Nutzer max.mustermann hinterlegt.
- Beim Verwenden der Navbar-Links bitte Folgendes beachten: nur die Kategorien Physik, Mathe, Informatik führen exemplarisch auf eine Beispiel-Seite. - Beim Verwenden der Navbar-Links bitte Folgendes beachten: nur die Kategorien Physik, Mathe, Informatik führen
exemplarisch auf eine Beispiel-Seite.
Die anderen Links sind erstmal Platzhalter und führen auf eine 404-Seite. Die anderen Links sind erstmal Platzhalter und führen auf eine 404-Seite.
- Die Such-Seite umfasst eine Suchfunktion (aber noch nicht nach Tags) und Sortierfunktion. Jedoch fehlt noch eine Filterfunktion (z.B. nur Mathe anzeigen). - Die Such-Seite umfasst eine Suchfunktion (aber noch nicht nach Tags) und Sortierfunktion. Jedoch fehlt noch eine
Wenn die Filterfunktion implementiert ist, dann können die statischen Seiten "Informatik", "Mathe", "Physik" entfernt und dynamisch auf der Suchseite Filterfunktion (z.B. nur Mathe anzeigen).
nach gefiltertem Fach angezeigt werden. (Vorläufige showCategory.php implementiert) Wenn die Filterfunktion implementiert ist, dann können die statischen Seiten "Informatik", "Mathe", "Physik" entfernt
und dynamisch auf der Suchseite nach gefiltertem Fach angezeigt werden. (Vorläufige showCategory.php implementiert).
+2 -2
View File
@@ -1,7 +1,7 @@
<?php <?php
require_once "php/model/LocalUserDAO.php"; require_once "php/model/LocalUserManager.php";
$dao = new LocalUserDAO(); $dao = new LocalUserManager();
/* /*
Deregistrierung Deregistrierung
+5
View File
@@ -58,6 +58,11 @@ include_once 'php/controller/showArticle-controller.php';
Sie sind nicht berechtigt, diesen Beitrag zu bearbeiten. Sie sind nicht berechtigt, diesen Beitrag zu bearbeiten.
</p> </p>
<?php endif; ?> <?php endif; ?>
<?php if (isset($_SESSION["message"]) && $_SESSION["message"] == "not_found_article"): ?>
<p class="alert-message is-error">
Der zu bearbeitende Artikel wurde nicht gefunden. Bitte versuche es erneut.
</p>
<?php endif; ?>
<?php <?php
unset($_SESSION["message"]); unset($_SESSION["message"]);
?> ?>
+1 -1
View File
@@ -3,7 +3,7 @@ SESSION_START();
require_once '../model/LocalArticleManager.php'; require_once '../model/LocalArticleManager.php';
require_once '../model/ArticleManager.php'; require_once '../model/ArticleManager.php';
require_once '../validator/article-validator.php'; require_once '../validator/article-validator.php';
require_once "../model/LocalUserDAO.php"; require_once "../model/LocalUserManager.php";
if ($_SERVER["REQUEST_METHOD"] === "POST") { if ($_SERVER["REQUEST_METHOD"] === "POST") {
$_SESSION["old_title"] = $_POST["title"] ?? ''; $_SESSION["old_title"] = $_POST["title"] ?? '';
+2 -2
View File
@@ -1,8 +1,8 @@
<?php <?php
require_once "php/model/LocalUserDAO.php"; require_once "php/model/LocalUserManager.php";
$dao = new LocalUserDAO(); $dao = new LocalUserManager();
$error = null; $error = null;
/* /*
+2 -2
View File
@@ -1,6 +1,6 @@
<?php <?php
require_once "php/model/LocalUserDAO.php"; require_once "php/model/LocalUserManager.php";
require_once "php/model/Article.php"; require_once "php/model/Article.php";
require_once "php/model/ArticleManager.php"; require_once "php/model/ArticleManager.php";
require_once "php/validator/user-validator.php"; require_once "php/validator/user-validator.php";
@@ -13,7 +13,7 @@ if (!isset($_SESSION["user"])) {
} }
try { try {
$dao = new LocalUserDAO(); $dao = new LocalUserManager();
$user = $dao->findUser($_SESSION["user_email"] ?? ""); $user = $dao->findUser($_SESSION["user_email"] ?? "");
@@ -5,10 +5,10 @@
require_once 'php/model/Article.php'; require_once 'php/model/Article.php';
require_once 'php/model/ArticleManager.php'; require_once 'php/model/ArticleManager.php';
require_once "../model/LocalUserDAO.php"; require_once "../model/LocalUserManager.php";
try { try {
$dao = new LocalUserDAO(); $dao = new LocalUserManager();
$user = $dao->findUser($_SESSION["user_email"] ?? ""); $user = $dao->findUser($_SESSION["user_email"] ?? "");
$author = $user["email"]; $author = $user["email"];
+2 -2
View File
@@ -1,6 +1,6 @@
<?php <?php
require_once "php/model/LocalUserDAO.php"; require_once "php/model/LocalUserManager.php";
require_once "php/validator/user-validator.php"; require_once "php/validator/user-validator.php";
$error = null; $error = null;
@@ -22,7 +22,7 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") {
$error = "Das Passwort muss 8 bis 72 Zeichen lang sein."; $error = "Das Passwort muss 8 bis 72 Zeichen lang sein.";
} else { } else {
try { try {
$dao = new LocalUserDAO(); $dao = new LocalUserManager();
$password = password_hash($plainPassword, PASSWORD_DEFAULT); $password = password_hash($plainPassword, PASSWORD_DEFAULT);
+11 -12
View File
@@ -20,8 +20,7 @@ interface ArticleManagerDAO
* @param $category string Kategorie des Beitrages * @param $category string Kategorie des Beitrages
* @param $tags string optionale Schlagworte für eine bessere Suche * @param $tags string optionale Schlagworte für eine bessere Suche
* *
* Mögliche Exceptions: * @throws InternalServerErrorException
* TODO: Exceptions implementieren.
*/ */
public function addArticle($title, $content, $author, $category, $tags); public function addArticle($title, $content, $author, $category, $tags);
@@ -38,33 +37,32 @@ interface ArticleManagerDAO
* @throws NotFoundException * @throws NotFoundException
* @throws UnauthorizedAccessException * @throws UnauthorizedAccessException
*/ */
*/
public function updateArticle($id, $article, $author); public function updateArticle($id, $article, $author);
/** /**
* Löscht einen Beitrag aus übergebener ID. * Löscht einen Beitrag aus übergebener ID und dem Nutzer, der die Löschung ausführt.
* @param $id * @param $id
* @param $author
* @return void * @return void
* * @throws InternalServerErrorException
* TODO: Exceptions implementieren. * @throws NotFoundException
* @throws UnauthorizedAccessException
*/ */
public function deleteArticle($id); public function deleteArticle($id, $author);
/** /**
* Beitrag aufrufen. * Beitrag aufrufen.
* $id ID des Beitrags * $id ID des Beitrags
* *
* @return Article * @return Article
* Mögliche Exceptions: * @throws InternalServerErrorException
* TODO: Exceptions implementieren.
*/ */
public function getArticle($id); public function getArticle($id);
/** /**
* Alle Beiträge aufrufen. * Alle Beiträge aufrufen.
* *
* Mögliche Exceptions: * @throws InternalServerErrorException
* TODO: Exceptions implementieren.
*/ */
public function getAllArticles(); public function getAllArticles();
@@ -72,7 +70,7 @@ interface ArticleManagerDAO
* Gibt alle Beiträge eines Nutzer mit einer gegebenen ID aus. * Gibt alle Beiträge eines Nutzer mit einer gegebenen ID aus.
* @param $author * @param $author
* @return Article[] * @return Article[]
* TODO: Exceptions implementieren. * @throws InternalServerErrorException
*/ */
public function getArticlesByAuthor($author); public function getArticlesByAuthor($author);
@@ -89,6 +87,7 @@ interface ArticleManagerDAO
* Gibt alle Beiträge einer gegebenen Kategorie aus. * Gibt alle Beiträge einer gegebenen Kategorie aus.
* @param $category * @param $category
* @return mixed * @return mixed
* @throws InternalServerErrorException
*/ */
public function getArticlesByCategory($category); public function getArticlesByCategory($category);
+12 -2
View File
@@ -66,7 +66,7 @@ class LocalArticleManager implements ArticleManagerDAO {
public function updateArticle($id, $article, $author) public function updateArticle($id, $article, $author)
{ {
if (empty($article)) { if (empty($article)) {
throw new InternalServerErrorException("internal_error"); throw new NotFoundException("not_found_article");
} }
// Berechtigungsprüfung: // Berechtigungsprüfung:
@@ -102,8 +102,18 @@ class LocalArticleManager implements ArticleManagerDAO {
} }
} }
public function deleteArticle($id) public function deleteArticle($id, $author)
{ {
$article = getArticle($id);
if (empty($article)) {
throw new NotFoundException("not_found_article");
}
// Berechtigungsprüfung:
if ($article->getAuthor() !== $author) {
throw new UnauthorizedAccessException("unauthorized_access");
}
$articles = $this->getAllArticles(); $articles = $this->getAllArticles();
$articleFound = false; $articleFound = false;
@@ -1,8 +1,8 @@
<?php <?php
require_once "UserDAOInterface.php"; require_once "UserManagerDAO.php";
class LocalUserDAO implements UserDAOInterface { class LocalUserManager implements UserManagerDAO {
private string $file = "data/users.json"; private string $file = "data/users.json";
@@ -158,6 +158,8 @@ class LocalUserDAO implements UserDAOInterface {
/** /**
* Löscht einen Benutzer anhand seiner E-Mail-Adresse. * Löscht einen Benutzer anhand seiner E-Mail-Adresse.
* *
* TODO: wenn ein Benutzer gelöscht wird, sollten dann auch seine Beiträge gelöscht werden?
*
* @param string $email E-Mail-Adresse des zu löschenden Benutzers * @param string $email E-Mail-Adresse des zu löschenden Benutzers
* @return bool true, wenn der Benutzer gelöscht wurde, sonst false * @return bool true, wenn der Benutzer gelöscht wurde, sonst false
* @throws RuntimeException wenn die Benutzerdaten nicht gelesen oder gespeichert werden können * @throws RuntimeException wenn die Benutzerdaten nicht gelesen oder gespeichert werden können
+3
View File
@@ -0,0 +1,3 @@
<?php
// TODO: implement this.
// dummy-user anlegen: - `max.mustermann, test123, mustermann@web.de`
@@ -6,7 +6,7 @@
* Definiert die Methoden, die jede UserDAO-Implementierung * Definiert die Methoden, die jede UserDAO-Implementierung
* bereitstellen muss. * bereitstellen muss.
*/ */
interface UserDAOInterface { interface UserManagerDAO {
/** /**
* Sucht einen Benutzer anhand seiner E-Mail-Adresse. * Sucht einen Benutzer anhand seiner E-Mail-Adresse.