# Első Gyakorlat - MINTA Megoldás

Ez a mappa tartalmazza az első gyakorlat **teljes, működő megoldását**.

## Amit implementáltunk:

### 1. **Layered Architecture** (Rétegezett Architektúra)
- **API Layer**: Controllers, Routers - HTTP kérések kezelése
- **Application Layer**: Commands, Queries, Handlers - Üzleti logika
- **Domain Layer**: Interfaces (Repository pattern)
- **Infrastructure Layer**: Repositories - Adatkezelés (JSON file-ok)

### 2. **CQRS Pattern** (Command Query Responsibility Segregation)
- **Commands**: Írási műveletek (Create, Update, Delete)
- **Queries**: Olvasási műveletek (GetAll, GetById)
- **Handlers**: Command és Query végrehajtók

### 3. **Repository Pattern**
- `IUserRepository` és `IPostRepository` interfészek
- `UserRepository` és `PostRepository` implementációk
- Adatok tárolása JSON file-okban

## Struktúra

```
src/
├── API/
│   ├── server.js                    # Express szerver
│   ├── controllers/
│   │   ├── userController.js        # User endpoint logika
│   │   └── postController.js        # Post endpoint logika
│   └── routers/
│       ├── userRouter.js            # User route-ok
│       └── postRouter.js            # Post route-ok
├── Application/
│   ├── users/
│   │   ├── command/                 # User írási műveletek
│   │   │   ├── createUserCommand.js
│   │   │   ├── createUserCommandHandler.js
│   │   │   ├── updateUserCommand.js
│   │   │   ├── updateUserCommandHandler.js
│   │   │   ├── deleteUserCommand.js
│   │   │   └── deleteUserCommandHandler.js
│   │   └── query/                   # User olvasási műveletek
│   │       ├── getAllUsersQuery.js
│   │       ├── getAllUsersQueryHandler.js
│   │       ├── getUserByIdQuery.js
│   │       └── getUserByIdQueryHandler.js
│   └── blogs/
│       ├── command/                 # Post írási műveletek
│       └── query/                   # Post olvasási műveletek
├── Domain/
│   ├── IUserRepository.js           # User repository interface
│   └── IPostRepository.js           # Post repository interface
└── Infrastructure/
    ├── userRepository.js            # User repository implementáció
    ├── postRepository.js            # Post repository implementáció
    ├── user.json                    # User adatok
    └── post.json                    # Post adatok
```

## API Endpoints

### Users
- `GET /api/users` - Összes user lekérése
- `GET /api/users/:id` - Egy user lekérése
- `POST /api/users` - Új user létrehozása
- `PUT /api/users/:id` - User módosítása
- `DELETE /api/users/:id` - User törlése

### Posts
- `GET /api/posts` - Összes post lekérése
- `GET /api/posts/:id` - Egy post lekérése
- `GET /api/posts/user/:userId` - User összes postja
- `POST /api/posts` - Új post létrehozása
- `PUT /api/posts/:id` - Post módosítása
- `DELETE /api/posts/:id` - Post törlése

## Indítás

```bash
npm install
npm start
```

A szerver elindul a `http://localhost:3000` címen.

## Példa Használat

### User létrehozása
```bash
curl -X POST http://localhost:3000/api/users \
  -H "Content-Type: application/json" \
  -d '{
    "name": "John Doe",
    "email": "john@example.com",
    "age": 25
  }'
```

### Post létrehozása
```bash
curl -X POST http://localhost:3000/api/posts \
  -H "Content-Type: application/json" \
  -d '{
    "title": "My First Post",
    "content": "Hello World!",
    "author": "John Doe"
  }'
```

## Tanulási Pontok

1. **Separation of Concerns**: Minden réteg saját felelősséggel rendelkezik
2. **CQRS**: Írási és olvasási műveletek szétválasztása
3. **Repository Pattern**: Adatkezelés absztrakciója
4. **Dependency Injection**: Handler-ek megkapják a repository-t
5. **Express.js**: RESTful API építése
6. **File-based Storage**: JSON file-ok használata adatbázis helyett
