nikolai пре 3 година
родитељ
комит
a2ba3fb2e4

+ 9 - 5
README.md

@@ -1,11 +1,15 @@
 # InternshipPlayground
 
-In diesem Dokument sind die Anweisungen um die API zu nutzen.
+Willkommen beim Schnuppertag zum Praktikum bei Hofmänner New Media.
 
-Die benutzten Coding-Standards findest du hier: https://dev.n2n.rocks/de/n2n/docs/coding-standards
-
-Nutze PostMan um die API zu testen. 
-Den Pfad dazu findest du hier:
+In diesem Dokument wird dir die Aufgabe gestellt API Methodn zu implementieren. 
 
+Unsere Coding-Standards findest du hier: https://dev.n2n.rocks/de/n2n/docs/coding-standards
+Bitte versuche dich immer daran zu halten.
 
+Viel Spass!
 
+Aufgaben
+1. Implementiere die Methoden im internship\controller\ArticleController so wie in den Methodenkommentaren  beschrieben.
+2. Implementiere die Methoden im internship\model\ArticleDao so wie in den Methodenkommentaren  beschrieben.
+3. Frage nach wie du automatisierte Tests machst falls du so weit bist..

+ 81 - 13
src-php/app/internship/controller/ArticleController.php

@@ -4,38 +4,106 @@ namespace internship\controller;
 use n2n\web\http\controller\ControllerAdapter;
 use internship\model\ArticleDao;
 use n2n\context\attribute\Inject;
+use n2n\web\http\controller\ParamBody;
+use internship\bo\Article;
 
+/**
+ * REST Controller
+ * https://dev.n2n.rocks/de/n2n/docs/rest
+ */
 class ArticleController extends ControllerAdapter {
-	#[Inject()]
+	#[Inject]
 	private ArticleDao $articleDao;
 
 	/**
+	 * Diese Methode kannst du im Postman testen. Pfad: localhost/[ordner name vom projekt]/src-php/public/api/articles
+	 *
+	 * <ul>
+	 * 	<li>
+	 * 		Gib "irgendöpis" mit dem {@code echo} command aus.
+	 * 	</li>
+	 *	<li>
+	 * 		Ändere die Antwort nun zu einem gültigen json objekt {"hello" => "world"}. Nutze dafür {@see $this->sendJson()}.
+	 * 	</li>
+	 * 	<li>
+ 	 *		Nutze die Methode {{@see ArticleDao::getArticles()} um Artikel aus der Datenbank zu lesen
+	 * 		und gebe diese anschliessend im JSON Format zurück.
+	 * 	</li>
+	 * </ul>
 	 *
 	 * @param string|null $categoryName
 	 * @return void
 	 */
-	function getDoArticles(string $categoryName = null) {
-
-		echo 'irgendöpis';
-
-        $this->sendJson(['hello' => 'world']);
-
+	function getDoArticles(string $categoryName = null): void {
 
 	}
 
-	function getDoArticle(int $articleId) {
-		$this->sendJson($article);
-	}
+	/**
+	 * Gibt den {@see Article} mit der entsprechenden id im JSON Format zurück.
+	 *
+	 * @param int $articleId
+	 * @return void
+	 */
+	function getDoArticle(int $articleId): void {
 
-	function postDoArticle() {
+	}
 
+	/**
+	 * Speichere einen Artikel.
+	 *
+	 * <ul>
+	 * 	<li>
+	 * 		Der Kategoriename darf nur 'international','national' oder 'sport' sein.
+	 * 		Validiere dies und schmeisse im Fehlerfall eine: {@see BadRequestException}
+	 * 	</li>
+	 * 	<li>
+	 *		Mache eine neue Entity {@see Article} und befülle sie mit den übergebenen Daten.
+	 * 	</li>
+	 *  <li>
+	 *		Implementiere eine neue Methode im {@see ArticleDao} und bennene sie "saveArticle".
+	 * 	 </li>
+	 * </ul>
+	 *
+	 * Nenne die Methode {@see saveArticle(Article $article)}
+	 *
+	 * @return void
+	 */
+	function postDoArticle(ParamBody $body): void {
+		$body->toArray();
 	}
 
-	function putDoArticle() {
+	/**
+	 * Editiere einen Artikel.
+	 *
+	 * <ul>
+	 * 	<li>
+	 * 		Der Kategoriename darf nur 'international','national' oder 'sport' sein.
+	 * 		Validiere dies und schmeisse im Fehlerfall eine: {@see BadRequestException}
+	 * 	</li>
+	 * 	<li>
+	 *		Finde den dazugehörigen {@see Article} und passe die Daten mit denjenigen Daten von gestern ab.
+	 * 	</li>
+	 *  <li>
+	 *		Implementiere eine neue Methode im {@see ArticleDao} und nenne die Methode {@see saveArticle(Article $article)}.
+	 * 	 </li>
+	 * </ul>
+	 *
+	 * @return void
+	 */
+	function putDoArticle(ParamBody $body): void {
 
 	}
 
-	function deleteDoArticle() {
+	/**
+	 * Löscht den {@see Article} mit der dazugehörigen Id.
+	 *
+	 * <ul>
+	 * 	<li>Mache eine neue Methode im {@see ArticleDao} und bennene sie "removeArticle(int articleId) </li>
+	 * <ul>
+	 *
+	 * @return void
+	 */
+	function deleteDoArticle(int $articleId): void {
 
 	}
 }

+ 25 - 4
src-php/app/internship/model/ArticleDao.php

@@ -3,7 +3,13 @@ namespace internship\model;
 
 use n2n\persistence\orm\EntityManager;
 use internship\bo\Article;
+use n2n\context\attribute\RequestScoped;
 
+/**
+ * Benutze diese Klasse um Datenbankabfragen auszuführen.
+ * Du findest alle Informationen zu Datenbankabfragen in der Doku: https://dev.n2n.rocks/de/n2n/docs/persistence-orm
+ */
+#[RequestScoped]
 class ArticleDao {
 	private EntityManager $em;
 
@@ -11,16 +17,31 @@ class ArticleDao {
 		$this->em = $em;
 	}
 
+	/**
+	 * Gebe alle {@see Article} zurück
+	 *
+	 * @return array
+	 */
 	function getArticles(): array {
-		return $this->em->createSimpleCriteria(Article::class)->toQuery()->fetchArray();
+
 	}
 
+	/**
+	 * Gebe alle {@see Article} zurück, welche dem übergebenen Kategorienamen entsprechen.
+	 *
+	 * @return array
+	 */
 	function getArticlesByCategoryName(string $categoryName): array {
-		return $this->em->createSimpleCriteria(Article::class, array('categoryName' => $categoryName))->toQuery()
-				->fetchArray();
+
 	}
 
+	/**
+	 * Gebe den {@see Article} mit der enstprechenden ID zurück.
+	 *
+	 * @param int $id
+	 * @return Article|null
+	 */
 	function getArticleById(int $id): ?Article {
-		return $this->em->find(Article::class, $id);
+
 	}
 }

+ 2 - 0
src-php/var/bak/backup.sql

@@ -10,3 +10,5 @@ CREATE TABLE `article` (
         `text` VARCHAR(10000) NULL DEFAULT NULL,
         PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci ;
+INSERT INTO article VALUES (1, 'sport', 'Formula 1 Rennen endet im Drama', 'Das gestrige Rennen endete im Gerängel, Fans zofften sich weil Lewis Hamilton eine Bananenschale auf der Rennstrecke so positionierte, dass Max Verstappen darauf ausgerutscht und aus dem Rennen ausgeschieden ist.');
+INSERT INTO article VALUES (2, 'international', 'Kein Regen mehr in den Regenwäldern', 'Aus unbekannten und mysteriösen Gründen regnet es schon seit mehreren Monaten in keinem Regenwald auf dieser Erde mehr. Darum mussten leider die Regenwaldmeisterschaften in diesem Jahr ausfallen.');