Skip to content

Commit

Permalink
Uprava před lekcí 003
Browse files Browse the repository at this point in the history
  • Loading branch information
martin-cernil committed Oct 9, 2024
1 parent 8578689 commit c98cc15
Show file tree
Hide file tree
Showing 7 changed files with 312 additions and 0 deletions.
39 changes: 39 additions & 0 deletions assignments/01 Intro/Assignment 01.1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Assignment 01.1

Cíl: Sladit se ve způsobu práce, přichystat sí vývojářské prostředí na další hodinu.

Zadání:
Začíná nám nový kurz C#3. Abychom byli všichni na stejné vlně pro další lekci, připrav a ověř si následující:

Příprava vývojového prostředí

- Založený vlastní GitHub účet
- Nainstalovaný Visual Studio Code (dle dodané prezentace)
- Vytvořený vlastní repozitář vytvořený z dodané šablony (dle dodané prezentace a videí)
- Nakonfigurovaný Visual Studio Code (dle dodané prezentace a videí)
- Zklonovaný vlastní repozitář přes Visual Studio Code (dle dodané prezentace a videí)

Orientace ve vývojovém prostředí

- Otevři si Visual Studio Code a otevři si tvůj repozitář se zklonovanou šablonou
- Otevři si soubor Program.cs (v projektu FizzBuzz)
- Kód z první lekce lze přeložit a spustit
- Otevři si FizzBuzz solution v `Solution Explorer`, klikni pravým na jméno solution, poté klikni na `Build`
- Otevři si terminál pravým poklikem na jméno projektu `FizzBuzz` -> `Open In Integrated Terminal`
- Kód z první lekce lze debuggovat
- Do kódu si přidej `Breakpoint` (poklikem vlevo od čísla řádku, objeví se červený puntík), vyzkoušej si kliknout v `Solution Explorer` na projekt pravým tlačítkem, a pak Debug->Start New Instance. Ověř si, že se kód zastaví na tvém breakpointu, zaexperimentuj v posouvání se kódem s běžícím debuggingem.
- Zkus si pustit debugging pomocí `Run`->`Start Debugging` (vyber projekt FizzBuzz, pokud bude třeba). Můžeš také použít klávesu F5.


- Vyzkoušej si, že kód z první lekce lze doručit na GitHub pomocí Visual Studio Code source control.
- Doruč svůj kód přes `Source Control` -> `stage all changes` -> `commit` -> `push`

Nevývojové věci ;)

- Přidej se na Discord!
- Jako řešení tohoto úkolu v MojeCzechitas pošli odkaz na svůj GitHub repozitář
- Pozdrav na Discordu nebo aspoň přidej reakci smajlíkem. Pozdrav svého kouče a svou skupinku.

Pokud se u tebe objeví nějaké problémy, napiš do společného kanálu, jistě nebudeš jediná, která má ten stejný problém! Taky se neváhej se obrátit na své kouče.

Díky moc, že máte na lekcích zapnuté kamery, jste skvělé!
24 changes: 24 additions & 0 deletions assignments/01 Intro/Assignment 01.2 OPT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Assignment 01.2 (nepovinný)

Cíl: Procvičit si psaní kódu, vědět jak pracovat s Katas.

Zadání:
Ahoj, v rámci nepovinných úkolů jsme si pro tebe připravili různá procvičování a vylepšování tvého kódu.

Jako první se pro procvičení naprogramujeme hru Farkle (u nás známé hlavně jako Kostky).
Mrkni do svého repozitáře, je v něm složka `sandbox` -> `katas`.

Založ si zde prosím novou složku Greed.01, kterou si otevři v integrovaném terminálu, podobně jak jsme dělali v lekci u FizzBuzz.01.

Vytvoř si novou solution a projekt pomocí těchto příkazů v terminálu

dotnet new sln --name Greed
dotnet new console --name Greed
dotnet sln add Greed

Poté si otevři tuto novou solution.
Nezapomeň, že Katas jsou pouze procvičovací úkoly. Vyhraď si specifický čas, který ti vyhovuje (abstraktně (např. o víkendu) nebo exaktně (např. 1 hodinu)). Procvičujeme, cílem není úkol za každou cenu dokončit, vyhrazený čas pak věnuj implementaci zadání. Začni zlehka, doporučuji nad tímto úkolem strávit maximálně dvě hodiny tvého času.

Zadání najdeš mezi Katas jako `02 Greed.md` soubor. Zkopíruj si jej do Greed.01 složky a pak již pracuj pouze v této složce ;)

Hodně štěstí, pokud narazíš na nějaký problém, neboj se ozvat.
18 changes: 18 additions & 0 deletions assignments/02 Webové Technologie/Assignment 02.1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Assignment 02.1 (povinný)

Cíl: Rozběhnout svůj první webový projekt a vyzkoušet si, jak fungují webové stránky.

Zadání: Ahoj, na hodině byl zmatek ohledně vytvoření nového webového projektu, raději tedy zasílám nový návod :) Template repozitář obsahuje aktualizované instrukce, které získáme buď:

- stáhnutím změn do svého repozitáře (ukážeme si příště)
- čerstvým naklonování nového repozitáře
- nahlédnutím přímo do [souboru v Githubu](https://github.com/czechitas/csharp3-template/blob/main/ToDoList/01%20SettingUpProject.md).

Z instrukcí následujte první dvě sekce příkazů (`Creating ToDoList solution`, `Creating ToDoList.WebApi project`) a vytvořte si nový webový projekt. Přesunte se do složky projektu (e.g. `CSharp3/ToDoList/src/ToDoList.WebApi`) a spusťte jej pomocí příkazu `dotnet run`. V konzoli za odměnu dostanete adresu své první stránky.

V prohlížeči si vyzkoušejte, jak vaše stránka funguje pomocí developer tools (Ctrl + Shift + I nebo F12). Můžeme otestovat:

- Network tab, kde uvidíme requesty, jejich status a response. Co se stane, pokud zkusím jít na cestu, která neexistuje (e.g. `/cesta`)?
- Elements tab, kde se podíváme na HTML dokument a jeho reprezentaci v DOMu. Zkuste zde něco změnit, například text nebo styl.

Nakonec přidejte novou cestu `/nazdarSvete`, která vás pozdraví v češtině a otestujte si ji v prohlížeči.
10 changes: 10 additions & 0 deletions assignments/02 Webové Technologie/Assignment 02.2 OPT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Assignment 02.2 (nepovinný)

Cíl: Zábavnou formou procvičit statusové kódy, URLs, query strings a interakci s WebAPI.

- Zkuste Googlit s otevřenými developer tools, jak Google reprezentuje váš vyhledávací výraz?
- Podívejte se na [dokumentaci kočičího API](https://developers.thecatapi.com/) a najděte API, které vám umožní requestnout X náhodných obrázků kočky.
- Zavolejte API pro 9 obrázků koček, jak vypadá odpověď?
- Zavolejte API pro [fakta o kočkách](https://catfact.ninja/fact).
- Všechny requesty zkontrolujte pomocí developer tools.
- Procvičte si HTTP status kódy pomocí [HTTP Cats](https://http.cat/) :)
215 changes: 215 additions & 0 deletions assignments/03 Interakce s REST API/Assignment 03.1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,215 @@
# Assignment 03.1

## Naimplementuj základní ToDoItemsController REST API

### Cíl

Tvůj cíl je naimplementovat CRUD operace pro náš ToDoList úkolový systém. Metody již máme vydefinované, ale jsou aktuálně prázdné či nedostačující. Je na tobě doplnit kód tohoto ToDoItems REST API tak, aby odpovídal zadání a dokázal tak obsloužit HTTP requesty, které mu budou klienti posílat.

### Instrukce

#### Předpoklady na tvůj projekt

- Předpokládá se, že tvůj projekt již má správně vytvořené projekty, složky a soubory.
- Třída `ToDoItemsController` je již vytvořená, přidaná do aplikace a obsahuje všechny metody (**Create**, **Read**, **ReadById**, **UpdateById**, **DeleteById**)
- Předpokládá se, že tvůj projekt obsahuje třídu `ToDoItem` v projektu `ToDoList.Domain`
- Třída `ToDoItemsController` obsahuje field `private static readonly List<ToDoItem> items = [];`, pokud ne, vytvoř si jej.

#### Doimplementuj metody

Doplň kód do metod v třídě `ToDoItemsController`. Specifikace je níže.

## Specifikace Metod

### 1. Create a ToDo Item

- **Method:** `Create`
- **HTTP Method:** `POST`
- **Route:** `/api/ToDoItems`
- **Request Body:** `ToDoItemCreateRequestDto`
- **Response:**
- `201 Created`
- `500 Internal Server Error`, pokud nastane jakákoliv výjimka.
- **Extra (nepovinné):** Použij `CreatedAtAction`, abys vrátila vytvořený předmět společně s cestou kde se dá najít a s jeho ID.
- **TIP:**
- Přelož si nejdříve DTO na model pomocí metody `ToDoItemCreateRequestDto.ToDomain()` (vytvoř si tuto metodu)
- Pro přidání instance třídy ToDoItem do listu úkolů použij metodu `.Add()` (vyhledej jak se používá)
- Pokud si nevíš rady, mrkni na konec tohoto souboru, je tam ukázána vzorová implementace.

### 2. Retrieve All ToDo Items

- **Method:** `Read`
- **HTTP Method:** `GET`
- **Route:** `/api/ToDoItems`
- **Response:**
- `200 OK` s listem všech úkolů ve formě DTO `List<ToDoItemGetResponseDto>`
- `404 Not Found`, pokud je list úkolů `null`
- `500 Internal Server Error`, pokud nastane jakákoliv výjimka.
- **TIP:**
- Pro přidání instance třídy ToDoItem do listu úkolů použij metodu `.Add()` (vyhledej jak se používá)

### 3. Retrieve a ToDo Item by ID

- **Method:** `ReadById`
- **HTTP Method:** `GET`
- **Route:** `/api/ToDoItems/{toDoItemId}`
- **Path Parameter:** `toDoItemId` (int)
- **Response:**
- `200 OK` s takovým úkolem, jehož id odpovídá parametru cesty `toDoItemId` (žádané id odpovídá id daného úkolu)
- Úkol je navrácen ve formátu `ToDoItemGetResponseDto`!
- `404 Not Found`, pokud daný úkol neexistuje.
- `500 Internal Server Error`, pokud nastane jakákoliv výjimka.
- **TIP:**
- Pro prohledání listu úkolů použij LINQ metodu `.Find()` (vyhledej jak se používá)

### 4. Update a ToDo Item

- **Method:** `UpdateById`
- **HTTP Method:** `PUT`
- **Route:** `/api/ToDoItems/{toDoItemId}`
- **Path Parameter:** `toDoItemId` (int)
- **Request Body:** `ToDoItemUpdateRequestDto`
- **Response:**
- `204 No Content`, pokud se povede daný úkol aktualizovat.
- `404 Not Found`, pokud daný úkol neexistuje.
- `500 Internal Server Error`, pokud nastane jakákoliv výjimka.
- **TIP:**
- Jak updatovat úkol
- Vytvoř si novou "updatovanou" instanci pomocí metody `ToDoItemUpdateRequestDto.ToDomain()` (vytvoř si tuto metodu)
- Najdi, jestli se "aktuální" instance nachází v listu úkolů
- Najdi na kterém indexu v listu se nachází "aktuální" instance pomocí LINQ `.FindIndex()` (vyhledej jak se používá)
- Poté proveď update přepisem instance na nalezeném indexu (items[indexOfOldInstance] = updatedItem)

### 5. Delete a ToDo Item by ID

- **Method:** `DeleteById`
- **HTTP Method:** `DELETE`
- **Route:** `/api/ToDoItems/{toDoItemId}`
- **Path Parameter:** `toDoItemId` (int)
- **Response:**
- `204 No Content`, pokud se povede daný úkol smazat.
- `404 Not Found`, pokud daný úkol neexistuje.
- `500 Internal Server Error`, pokud nastane jakákoliv výjimka.
- **TIP:**
- Pro prohledání listu úkolů použij LINQ metodu `.Find()` (vyhledej jak se používá)

## Ukázka DTOs and Modelu

### ToDoItem.Model ToDoItemCreateRequestDto

```csharp
public class ToDoItemCreateRequestDto
{
public string Name { get; set; }
public string Description { get; set; }
public bool IsCompleted { get; set; }

public ToDoItem ToDomain()
{
return new ToDoItem
{
Name = this.Name,
Description = this.Description,
IsCompleted = this.IsCompleted,
};
}
}
```

### ToDoItem.Model ToDoItemGetResponseDto

```csharp
public class ToDoItemGetResponseDto
{
public int ToDoItemId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public bool IsCompleted { get; set; }

public static ToDoItemGetResponseDto FromDomain(ToDoItem item)
{
return new ToDoItemGetResponseDto
{
ToDoItemId = item.ToDoItemId,
Name = item.Name,
Description = item.Description,
IsCompleted = item.IsCompleted,
};
}
}
```

### ToDoItem.Model ToDoItem

```csharp
public class ToDoItem
{
public int ToDoItemId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public bool IsCompleted { get; set; }
}
```

## Ukázka implementace Create metody v MVC Controlleru

```csharp
namespace ToDoList.WebApi.Controllers;
using Microsoft.AspNetCore.Mvc;
using ToDoList.Domain.DTOs;
using ToDoList.Domain.Models;

[ApiController]
[Route("api/[controller]")]
public class ToDoItemsController : ControllerBase
{
private static readonly List<ToDoItem> items = [];

[HttpPost]
public IActionResult Create(ToDoItemCreateRequestDto request)
{
//map to Domain object as soon as possible
var item = request.ToDomain();

//try to create an item
try
{
item.ToDoItemId = items.Count == 0 ? 1 : items.Max(o => o.ToDoItemId) + 1;
items.Add(item);
}
catch (Exception ex)
{
return Problem(ex.Message, null, StatusCodes.Status500InternalServerError); //500
}

//respond to client
return Created(); //201
}

[HttpGet]
public IActionResult Read()
{

}

[HttpGet("{toDoItemId:int}")]
public IActionResult ReadById(int toDoItemId)
{

}

[HttpPut("{toDoItemId:int}")]
public IActionResult UpdateById(int toDoItemId, [FromBody] ToDoItemUpdateRequestDto request)
{

}

[HttpDelete("{toDoItemId:int}")]
public IActionResult DeleteById(int toDoItemId)
{

}
}
```

Good luck and happy coding!
6 changes: 6 additions & 0 deletions assignments/03 Interakce s REST API/Assignment 03.2 OPT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Assignment 03.2 (nepovinný)

- Cíl: Další procvičování
- Úkol: Hangman kata

Ahoj, je tady další nepovinný procvičovací úkol. Mrkni do svých katas a vrhni se na vytvoření hry Oběšenec. Hra tě potrápí s prací se Stringy ;).
File renamed without changes.

0 comments on commit c98cc15

Please sign in to comment.