\section{Repository}

\begin{frame}{Repository minta lényege}
  \begin{block}{Mire jó?}
    \begin{itemize}
      \item Elválasztja az adat-hozzáférést az üzleti logikától
      \item Egységes API az adatok kezelésére
      \item Könnyebben tesztelhető kód
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}{IRepository és konkret repository}
  \begin{block}{IRepository}
    \begin{itemize}
      \item Absztrakt interfész CRUD műveletekkel
      \item Pl. \texttt{findAll}, \texttt{findById}, \texttt{create}, \texttt{update}, \texttt{delete}
    \end{itemize}
  \end{block}

  \begin{exampleblock}{Konkret repository}
    Az interfész implementációja (pl. \texttt{UserRepository}).
  \end{exampleblock}
\end{frame}

\begin{frame}[fragile]{IRepository példa (TypeScript)}
  \begin{lstlisting}[language=JavaScript]
interface IRepository<T> {
  findAll(): Promise<T[]>;
  findById(id: number): Promise<T | null>;
  create(data: T): Promise<T>;
  update(id: number, data: Partial<T>): Promise<T>;
  delete(id: number): Promise<void>;
}
  \end{lstlisting}
\end{frame}

\begin{frame}[fragile]{Prisma repository példa}
  \begin{block}{Prisma Client}
    A Prisma Client kezeli a kapcsolatot és az SQL generálást.
  \end{block}
  \begin{lstlisting}[language=JavaScript]
class UserRepository implements IRepository<User> {
  constructor(private prisma: PrismaClient) {}
  findAll() {
    return this.prisma.user.findMany();
  }
  findById(id: number) {
    return this.prisma.user.findUnique({ where: { id } });
  }

  
  \end{lstlisting}
\end{frame}

\begin{frame}[fragile]{Prisma repository példa folytatás}
  \begin{lstlisting}[language=JavaScript]
create(data: User) {
    return this.prisma.user.create({ data });
  }

  update(id: number, data: Partial<User>) {
    return this.prisma.user.update({ where: { id }, data });
  }

  async delete(id: number) {
    await this.prisma.user.delete({ where: { id } });
  }
}
  \end{lstlisting}
\end{frame}

\begin{frame}{Mikor hasznos?}
  \begin{itemize}
    \item Ha több adatforrás van (SQL, API, cache)
    \item Ha szeretnél változtatható adat-hozzáférést
    \item Ha szükség van mock-olható IRepositories-re tesztekhez
  \end{itemize}
\end{frame}
