negyedik gyakorlat + megoldasok

This commit is contained in:
magdo
2026-03-04 20:02:39 +01:00
parent afc3777ac9
commit 388aa908de
217 changed files with 19791 additions and 0 deletions
@@ -0,0 +1,98 @@
# Negyedik Gyakorlat - MINTA Megoldás
Ez a mappa tartalmazza a negyedik gyakorlat **teljes, működő megoldását**.
## Amit implementáltunk:
### 1. **Dependency Injection Container**
- Singleton lifecycle - egy példány az egész alkalmazásban
- Transient lifecycle - minden híváskor új példány
- Scoped lifecycle - request szintű scope
- Service regisztráció és feloldás
- Circular dependency kezelés
### 2. **CORS Konfigurás**
- Whitelist-based origin ellenőrzés
- Credentials support (cookie-k)
- Preflight request kezelés
- Custom CORS middleware
### 3. **Email Service (Nodemailer + Handlebars)**
- Ethereal test SMTP
- HTML email templatek (Handlebars)
- Welcome email új usereknek
- Password reset email
- Template rendering
### 4. **Cookie-based JWT Auth**
- Tokenek csak cookie-ban (nem response body-ban!)
- HttpOnly, Secure, SameSite cookie-k
- Automatikus token ellenőrzés middleware-ből
## Indítás
```bash
npm install
npm run docker:up
npx prisma generate
npx prisma migrate dev
npm run dev
```
## Környezeti Változók
```env
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/cors_di_app?schema=public"
JWT_SECRET="your-secret-key"
JWT_EXPIRES_IN="7d"
PORT=3000
NODE_ENV=development
# Ethereal Email
ETHEREAL_USER=your-ethereal-user@ethereal.email
ETHEREAL_PASS=your-ethereal-password
# CORS
ALLOWED_ORIGINS=http://localhost:3000,http://localhost:5173
```
## DI Container Példa
```javascript
// Service regisztráció
container.register('database', () => new DatabaseConnection(), 'singleton');
container.register('userRepo', () => new UserRepository(), 'singleton');
container.register('emailService', () => new EmailService(), 'singleton');
container.register('requestId', () => crypto.randomUUID(), 'transient');
container.register('jwtService', () => new JwtService(), 'scoped');
// Service feloldás
const userRepo = container.resolve('userRepo');
const emailService = container.resolve('emailService');
// Scoped resolution (request szintű)
const scope = container.createScope();
const jwtService = scope.resolve('jwtService');
```
## Email Service Példa
```javascript
// Welcome email küldése
await emailService.sendWelcomeEmail(user.email, user.name);
// Password reset email
await emailService.sendPasswordResetEmail(user.email, resetToken);
```
## CORS Engedélyezett Eredethelyekről
Csak az `ALLOWED_ORIGINS` környezeti változóban megadott origin-ek férhetnek hozzá az API-hoz.
## Tanulási Pontok
1. **Dependency Injection**: Service lifecycle management
2. **CORS**: Biztonságos cross-origin konfigurás
3. **Email Templates**: Handlebars template rendering
4. **Nodemailer**: Email küldés SMTP-vel
5. **Cookie-based Auth**: Token kezelés csak cookie-kban