\section{Mapper}

\begin{frame}{Mapper minta szerepe}
  \begin{block}{Mi a mapper?}
    \begin{itemize}
      \item Átalakítás domain objektumok és DTO-k között
      \item Elválasztja az adatformátumot az üzleti modelltől
      \item Központi helyen tartja az átalakítás logikáját
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}{Miért hasznos?}
  \begin{itemize}
    \item Csökkenti a duplikált átalakításokat
    \item Stabil API-szerződések (DTO-k) a változó domain mellett
    \item Tesztelhető, moduláris és újrafelhasználható kód
  \end{itemize}
\end{frame}

\begin{frame}[fragile]{Egyszerű mapper példa}
  \begin{lstlisting}[language=JavaScript]
// Domain objektum
const user = {
  id: 1, name: "John Doe",
  email: "john@example.com", passwordHash: "..."
};

// Mapper függvény
const toUserDto = (u) => ({
  id: u.id, name: u.name, email: u.email
});
  \end{lstlisting}
\end{frame}

\begin{frame}[fragile]{Kétirányú mapper}
  \begin{lstlisting}[language=JavaScript]
const toUserEntity = (dto) => ({
  id: dto.id ?? undefined,
  name: dto.name,
  email: dto.email
});
  \end{lstlisting}

  \begin{block}{Megjegyzés}
    Írhatsz külön mappert bejövő és kimenő adatokra.
  \end{block}
\end{frame}

\begin{frame}{Mapper és repository}
  \begin{itemize}
    \item Repository a tárolást kezeli
    \item Mapper az objektumok formátumát kezeli
    \item Két külön felelősségi kör
  \end{itemize}
\end{frame}

\begin{frame}{Jó gyakorlatok}
  \begin{itemize}
    \item Ne másolj át érzékeny mezőket (pl. jelszó)
    \item Tartsd egy helyen az átalakításokat
    \item Használj tiszta függvényeket és kis helper-eket
  \end{itemize}
\end{frame}
