diff --git a/next-env.d.ts b/next-env.d.ts
index c4b7818..9edff1c 100644
--- a/next-env.d.ts
+++ b/next-env.d.ts
@@ -1,6 +1,6 @@
///
///
-import "./.next/dev/types/routes.d.ts";
+import "./.next/types/routes.d.ts";
// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/src/app/[locale]/(site)/admin/page.tsx b/src/app/[locale]/(site)/admin/page.tsx
index 6d216d0..081c69d 100644
--- a/src/app/[locale]/(site)/admin/page.tsx
+++ b/src/app/[locale]/(site)/admin/page.tsx
@@ -1,6 +1,6 @@
import { getTranslations } from "next-intl/server";
import AdminContent from "@/components/admin/admin-content";
-import { authOptions } from "@/app/api/auth/[...nextauth]/route";
+import { authOptions } from "@/lib/auth/auth-options";
import { isAdminRole } from "@/lib/auth/roles";
import { getServerSession } from "next-auth";
import { notFound } from "next/navigation";
diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts
index f18d75a..19cbedc 100644
--- a/src/app/api/auth/[...nextauth]/route.ts
+++ b/src/app/api/auth/[...nextauth]/route.ts
@@ -1,124 +1,5 @@
-import { authService } from "@/lib/api/auth/service";
-import { normalizeRoles } from "@/lib/auth/roles";
+import { authOptions } from "@/lib/auth/auth-options";
import NextAuth from "next-auth";
-import type { NextAuthOptions } from "next-auth";
-import type { JWT } from "next-auth/jwt";
-import type { Session, User } from "next-auth";
-import Credentials from "next-auth/providers/credentials";
-
-function randomToken() {
- return Math.random().toString(36).substring(2) + Date.now().toString(36);
-}
-
-const isMockMode = process.env.NEXT_PUBLIC_ENABLE_MOCK_MODE === "true";
-
-export const authOptions: NextAuthOptions = {
- providers: [
- Credentials({
- name: "Credentials",
- credentials: {
- email: { label: "Email", type: "text" },
- password: { label: "Password", type: "password" },
- },
- async authorize(credentials) {
- try {
- console.log("Starting authorization with:", {
- email: credentials?.email,
- });
-
- if (!credentials?.email || !credentials?.password) {
- throw new Error("Email ve şifre gereklidir.");
- }
-
- // Eğer mock mod aktifse backend'e gitme
- if (isMockMode) {
- console.log("Mock mode active, bypassing backend");
- return {
- id: credentials.email,
- name: credentials.email.split("@")[0],
- email: credentials.email,
- accessToken: randomToken(),
- refreshToken: randomToken(),
- };
- }
-
- // Normal mod: backend'e istek at
- console.log("Sending login request to backend...");
- const res = await authService.login({
- email: credentials.email,
- password: credentials.password,
- });
-
- console.log(
- "Backend response received:",
- JSON.stringify(res, null, 2),
- );
-
- const response = res;
-
- // Backend returns ApiResponse
- // Structure: { data: { accessToken, refreshToken, expiresIn, user }, message, statusCode }
- if (!res.success || !response?.data?.accessToken) {
- console.error("Login failed or no access token in response");
- throw new Error(response?.message || "Giriş başarısız");
- }
-
- const { accessToken, refreshToken, user } = response.data;
- const normalizedRoles = normalizeRoles(user.roles);
-
- console.log("Login successful, creating user session object");
-
- return {
- id: user.id,
- name: user.firstName
- ? `${user.firstName} ${user.lastName || ""}`.trim()
- : user.email.split("@")[0],
- email: user.email,
- accessToken,
- refreshToken,
- roles: normalizedRoles,
- };
- } catch (error: unknown) {
- console.error("Authorize error detailed:", error);
- const err = error as Error & {
- response?: { data: unknown; status: number };
- };
- if (err.response) {
- console.error("Error response data:", err.response.data);
- console.error("Error response status:", err.response.status);
- }
- throw new Error(
- err.message || "An error occurred during authentication",
- );
- }
- },
- }),
- ],
- callbacks: {
- async jwt({ token, user }: { token: JWT; user?: User }) {
- if (user) {
- token.accessToken = user.accessToken;
- token.refreshToken = user.refreshToken;
- token.id = user.id;
- token.roles = normalizeRoles(user.roles);
- }
- return token;
- },
- async session({ session, token }: { session: Session; token: JWT }) {
- session.user.id = token.id;
- session.user.roles = normalizeRoles(token.roles);
- session.accessToken = token.accessToken;
- session.refreshToken = token.refreshToken;
- return session;
- },
- },
- pages: {
- signIn: "/signin",
- error: "/signin",
- },
- session: { strategy: "jwt" },
- secret: process.env.NEXTAUTH_SECRET,
-};
const handler = NextAuth(authOptions);
diff --git a/src/lib/auth/auth-options.ts b/src/lib/auth/auth-options.ts
new file mode 100644
index 0000000..5c512b6
--- /dev/null
+++ b/src/lib/auth/auth-options.ts
@@ -0,0 +1,120 @@
+import { authService } from "@/lib/api/auth/service";
+import { normalizeRoles } from "@/lib/auth/roles";
+import type { NextAuthOptions } from "next-auth";
+import type { JWT } from "next-auth/jwt";
+import type { Session, User } from "next-auth";
+import Credentials from "next-auth/providers/credentials";
+
+function randomToken() {
+ return Math.random().toString(36).substring(2) + Date.now().toString(36);
+}
+
+const isMockMode = process.env.NEXT_PUBLIC_ENABLE_MOCK_MODE === "true";
+
+export const authOptions: NextAuthOptions = {
+ providers: [
+ Credentials({
+ name: "Credentials",
+ credentials: {
+ email: { label: "Email", type: "text" },
+ password: { label: "Password", type: "password" },
+ },
+ async authorize(credentials) {
+ try {
+ console.log("Starting authorization with:", {
+ email: credentials?.email,
+ });
+
+ if (!credentials?.email || !credentials?.password) {
+ throw new Error("Email ve şifre gereklidir.");
+ }
+
+ // Eğer mock mod aktifse backend'e gitme
+ if (isMockMode) {
+ console.log("Mock mode active, bypassing backend");
+ return {
+ id: credentials.email,
+ name: credentials.email.split("@")[0],
+ email: credentials.email,
+ accessToken: randomToken(),
+ refreshToken: randomToken(),
+ };
+ }
+
+ // Normal mod: backend'e istek at
+ console.log("Sending login request to backend...");
+ const res = await authService.login({
+ email: credentials.email,
+ password: credentials.password,
+ });
+
+ console.log(
+ "Backend response received:",
+ JSON.stringify(res, null, 2),
+ );
+
+ const response = res;
+
+ // Backend returns ApiResponse
+ // Structure: { data: { accessToken, refreshToken, expiresIn, user }, message, statusCode }
+ if (!res.success || !response?.data?.accessToken) {
+ console.error("Login failed or no access token in response");
+ throw new Error(response?.message || "Giriş başarısız");
+ }
+
+ const { accessToken, refreshToken, user } = response.data;
+ const normalizedRoles = normalizeRoles(user.roles);
+
+ console.log("Login successful, creating user session object");
+
+ return {
+ id: user.id,
+ name: user.firstName
+ ? `${user.firstName} ${user.lastName || ""}`.trim()
+ : user.email.split("@")[0],
+ email: user.email,
+ accessToken,
+ refreshToken,
+ roles: normalizedRoles,
+ };
+ } catch (error: unknown) {
+ console.error("Authorize error detailed:", error);
+ const err = error as Error & {
+ response?: { data: unknown; status: number };
+ };
+ if (err.response) {
+ console.error("Error response data:", err.response.data);
+ console.error("Error response status:", err.response.status);
+ }
+ throw new Error(
+ err.message || "An error occurred during authentication",
+ );
+ }
+ },
+ }),
+ ],
+ callbacks: {
+ async jwt({ token, user }: { token: JWT; user?: User }) {
+ if (user) {
+ token.accessToken = user.accessToken;
+ token.refreshToken = user.refreshToken;
+ token.id = user.id;
+ token.roles = normalizeRoles(user.roles);
+ }
+ return token;
+ },
+ async session({ session, token }: { session: Session; token: JWT }) {
+ session.user.id = token.id;
+ session.user.roles = normalizeRoles(token.roles);
+ session.accessToken = token.accessToken;
+ session.refreshToken = token.refreshToken;
+ return session;
+ },
+ },
+ pages: {
+ signIn: "/signin",
+ error: "/signin",
+ },
+ session: { strategy: "jwt" },
+ secret: process.env.NEXTAUTH_SECRET,
+};