ZADANIE DLA STUDENTÓW - REST API Menadżera Zadań

Czas wykonania: 30-45 minut Poziom: Podstawowy Technologie: Dowolny język i framework (Node.js, Python, C#, Go)


📝 OPIS ZADANIA

Twoim zadaniem jest stworzenie prostego REST API dla menadżera zadań (TODO list). API powinno pozwalać na:

WAŻNE: Dane muszą być zapisywane w pliku JSON na serwerze (nie w pamięci RAM!).


🎯 WYMAGANIA FUNKCJONALNE

1. GET /health

Opis: Endpoint sprawdzający czy API działa Odpowiedź:

{
  "status": "OK",
  "timestamp": "2024-11-15T10:30:00Z"
}

2. GET /tasks

Opis: Pobiera wszystkie zadania z pliku JSON Odpowiedź:

[
  {
    "id": 1,
    "title": "Zrobić zakupy",
    "description": "Mleko, chleb, masło",
    "completed": false,
    "createdAt": "2024-11-15T10:00:00Z"
  },
  {
    "id": 2,
    "title": "Odrobić zadanie z backendu",
    "description": "REST API dla TODO",
    "completed": true,
    "createdAt": "2024-11-15T11:00:00Z"
  }
]

Jeśli plik jest pusty:

[]

3. POST /tasks

Opis: Dodaje nowe zadanie i zapisuje do pliku JSON

Request Body:

{
  "title": "Nowe zadanie",
  "description": "Opis zadania"
}

Odpowiedź (201 Created):

{
  "id": 3,
  "title": "Nowe zadanie",
  "description": "Opis zadania",
  "completed": false,
  "createdAt": "2024-11-15T12:00:00Z"
}

Zasady:


4. PUT /tasks/:id

Opis: Modyfikuje istniejące zadanie i zapisuje zmiany do pliku

Request Body (przykład):

{
  "title": "Zaktualizowany tytuł",
  "description": "Nowy opis",
  "completed": true
}

Odpowiedź (200 OK):

{
  "id": 1,
  "title": "Zaktualizowany tytuł",
  "description": "Nowy opis",
  "completed": true,
  "createdAt": "2024-11-15T10:00:00Z",
  "updatedAt": "2024-11-15T13:00:00Z"
}

Jeśli zadanie nie istnieje (404 Not Found):

{
  "error": "Task not found",
  "id": 999
}

📁 STRUKTURA PLIKU tasks.json

Plik powinien być zapisany w formacie JSON i zawierać tablicę zadań:

[
  {
    "id": 1,
    "title": "Przykładowe zadanie",
    "description": "To jest opis zadania",
    "completed": false,
    "createdAt": "2024-11-15T10:00:00Z"
  }
]

Wymagania techniczne:


✅ CHECKLIST WYKONANIA


📋 CO POWINNO BYĆ W README.md

Twój plik README.md powinien zawierać:

# TODO API - Menadżer Zadań

**Autor:** [Twoje Imię]
**Grupa:** [Numer grupy]
**Data:** [Data]

## Opis projektu
REST API dla menadżera zadań z zapisem do pliku JSON.

## Technologie
- [Język programowania, np. Node.js]
- [Framework, np. Express.js]
- JSON (do przechowywania danych)

## Instalacja i uruchomienie

### Wymagania
- [np. Node.js 18+]
- [inne wymagania]

### Krok po kroku
```bash
# 1. Sklonuj repozytorium
git clone [URL_TWOJEGO_REPO]

# 2. Przejdź do katalogu
cd [nazwa-projektu]

# 3. Zainstaluj zależności (jeśli używasz)
npm install  # lub pip install -r requirements.txt

# 4. Uruchom serwer
npm start  # lub python main.py, dotnet run, go run main.go

Serwer powinien być dostępny pod adresem: http://localhost:3000

Endpointy API

1. GET /health

Opis: Sprawdza status API Przykład:

curl http://localhost:3000/health

2. GET /tasks

Opis: Pobiera wszystkie zadania Przykład:

curl http://localhost:3000/tasks

3. POST /tasks

Opis: Dodaje nowe zadanie Przykład:

curl -X POST http://localhost:3000/tasks \
  -H "Content-Type: application/json" \
  -d '{"title":"Nowe zadanie","description":"Opis"}'

4. PUT /tasks/:id

Opis: Modyfikuje istniejące zadanie Przykład:

curl -X PUT http://localhost:3000/tasks/1 \
  -H "Content-Type: application/json" \
  -d '{"title":"Zaktualizowany","completed":true}'

Testowanie

[Opisz jak testowałeś API - Postman, Thunder Client, curl, itp.]

Struktura projektu

projekt/
├── server.js (lub main.py, Program.cs)
├── tasks.json (plik z danymi)
├── package.json (jeśli Node.js)
├── README.md
└── .gitignore

Napotkane problemy i rozwiązania

[Opcjonalnie - co sprawiło Ci problem i jak to rozwiązałeś]


---

## 🛠 WSKAZÓWKI TECHNICZNE

### Podstawowa struktura rozwiązania

Niezależnie od wybranego języka i frameworka, Twoje rozwiązanie powinno zawierać:

1. **Funkcje pomocnicze do operacji na pliku JSON:**
   - Funkcja do odczytu zadań z pliku
   - Funkcja do zapisu zadań do pliku
   - Obsługa sytuacji gdy plik nie istnieje

2. **Endpointy REST API:**
   - GET /health - zwraca status API
   - GET /tasks - odczytuje i zwraca wszystkie zadania
   - POST /tasks - tworzy nowe zadanie i zapisuje do pliku
   - PUT /tasks/:id - aktualizuje zadanie i zapisuje do pliku

3. **Obsługa błędów:**
   - Sprawdzanie czy zadanie istnieje (404)
   - Walidacja danych wejściowych (400)
   - Obsługa błędów serwera (500)

### Przykłady szkieletowe

**Node.js + Express:**
```javascript
const express = require('express');
const fs = require('fs').promises;

// TODO: Zaimplementuj funkcje readTasks() i writeTasks()
// TODO: Zaimplementuj endpointy zgodnie z wymaganiami

Python + FastAPI:

from fastapi import FastAPI
import json

# TODO: Zaimplementuj funkcje read_tasks() i write_tasks()
# TODO: Zaimplementuj endpointy zgodnie z wymaganiami

Pełne przykładowe rozwiązania dostępne są w oddzielnych plikach (dla prowadzących).


🎓 KRYTERIA OCENY

Kryterium Punkty
Działający endpoint GET /health 10%
Działający endpoint GET /tasks (odczyt z pliku) 25%
Działający endpoint POST /tasks (zapis do pliku) 30%
Działający endpoint PUT /tasks/:id (modyfikacja w pliku) 25%
README.md z instrukcjami 5%
Historia commitów w Git 5%

Bonus (+10%):


💡 POMOC AI - PRZYKŁADOWE PROMPTY

"Stwórz funkcję w [język] która odczytuje dane z pliku JSON
i zwraca je jako tablicę obiektów"

"Jak zapisać tablicę obiektów do pliku JSON w [język/framework]?"

"Napisz endpoint POST w [framework] który dodaje element do tablicy
i zapisuje całą tablicę do pliku JSON"

"Jak znaleźć maksymalne ID w tablicy obiektów w [język]?"

"Wyjaśnij mi ten kod linia po linii: [wklej kod]"

❌ CZĘSTE BŁĘDY I ROZWIĄZANIA

Błąd: "Cannot read file"

Rozwiązanie: Sprawdź czy plik tasks.json istnieje. Jeśli nie, stwórz go z pustą tablicą []

Błąd: "JSON.parse error"

Rozwiązanie: Sprawdź czy plik ma poprawny format JSON. Użyj https://jsonformatter.org/ do walidacji

Błąd: "Port already in use"

Rozwiązanie: Zmień port w kodzie lub zamknij poprzednią instancję serwera

Dane nie zapisują się

Rozwiązanie: Sprawdź czy wywołujesz funkcję zapisu (writeTasks / write_tasks) po modyfikacji danych


📤 ODDANIE ZADANIA

  1. Upewnij się że kod działa lokalnie
  2. Stwórz repo na GitHub/GitLab (publiczne)
  3. Wypchnij kod (git push)
  4. Sprawdź czy repo jest dostępne online
  5. Wklej link do repo w [miejsce wskazane przez prowadzącego]

Deadline: [Do uzupełnienia przez prowadzącego]


📚 PRZYDATNE LINKI

Narzędzia do testowania API:


🚀 DODATKOWE WYZWANIA (opcjonalnie)

Jeśli skończysz wcześniej, spróbuj dodać:

  1. DELETE /tasks/:id - usuwanie zadania
  2. GET /tasks/:id - pobieranie pojedynczego zadania
  3. Filtrowanie - GET /tasks?completed=true
  4. Sortowanie - GET /tasks?sort=createdAt
  5. Paginacja - GET /tasks?page=1&limit=10
  6. Walidacja - sprawdzanie czy title nie jest pusty
  7. Logi - logowanie każdego requestu do pliku api.log

Powodzenia! 🎯