diff --git a/src/app/api/mobile/auth/login/route.ts b/src/app/api/mobile/auth/login/route.ts new file mode 100644 index 00000000..958da9e6 --- /dev/null +++ b/src/app/api/mobile/auth/login/route.ts @@ -0,0 +1,82 @@ +import { prisma } from "@/lib"; +import { randomOTP } from "@/app_modules/auth/fun/rondom_otp"; +import { NextResponse } from "next/server"; + +export async function POST(req: Request) { + if (req.method !== "POST") { + return NextResponse.json( + { success: false, message: "Method Not Allowed" }, + { status: 405 } + ); + } + + try { + const codeOtp = randomOTP(); + const body = await req.json(); + const { nomor } = body; + + const user = await prisma.user.findUnique({ + where: { + nomor: nomor, + }, + }); + + console.log(["cek user", user]); + console.log(["cek nomor", nomor]); + + if (!user) + return NextResponse.json({ + success: false, + message: "User tidak ditemukan", + status: 404, + }); + + const createOtpId = await prisma.kodeOtp.create({ + data: { + nomor: nomor, + otp: codeOtp, + }, + }); + + if (!createOtpId) + return NextResponse.json( + { success: false, message: "Gagal mengirim kode OTP" }, + { status: 400 } + ); + + // const msg = `HIPMI - Kode ini bersifat RAHASIA dan JANGAN DI BAGIKAN KEPAADA SIAPAPUN, termasuk anggota ataupun pengurus HIPMI lainnya.\n\n\n> Kode OTP anda: ${codeOtp}.`; + const msg = `HIPMI%20-%20Kode%20ini%20bersifat%20RAHASIA%20dan%20JANGAN%20DI%20BAGIKAN%20KEPADA%20SIAPAPUN%2C%20termasuk%20anggota%20ataupun%20pengurus%20HIPMI%20lainnya.%20Kode%20OTP%20anda%3A%20${codeOtp}.`; + // // const encodedMsg = encodeURIComponent(msg); + + const res = await fetch( + `https://wa.wibudev.com/code?nom=${nomor}&text=${msg}`, + { cache: "no-cache" } + ); + + const sendWa = await res.json(); + + if (sendWa.status !== "success") + return NextResponse.json( + { success: false, message: "Nomor Whatsapp Tidak Aktif" }, + { status: 400 } + ); + + return NextResponse.json( + { + success: true, + message: "Kode verifikasi terkirim", + kodeId: createOtpId.id, + }, + { status: 200 } + ); + } catch (error) { + return NextResponse.json( + { + success: false, + message: "Terjadi masalah saat login", + reason: error as Error, + }, + { status: 500 } + ); + } +} diff --git a/src/app/api/mobile/auth/register/route.ts b/src/app/api/mobile/auth/register/route.ts new file mode 100644 index 00000000..332518f8 --- /dev/null +++ b/src/app/api/mobile/auth/register/route.ts @@ -0,0 +1,108 @@ +import { sessionCreate } from "@/app/(auth)/_lib/session_create"; +import { randomOTP } from "@/app_modules/auth/fun/rondom_otp"; +import prisma from "@/lib/prisma"; +import { NextResponse } from "next/server"; + +export async function POST(req: Request) { + if (req.method !== "POST") { + return NextResponse.json( + { success: false, message: "Method Not Allowed" }, + { status: 405 } + ); + } + + const { data } = await req.json(); + console.log("data >>", data); + const codeOtp = randomOTP(); + try { + const cekUsername = await prisma.user.findUnique({ + where: { + username: data.username, + }, + }); + + if (cekUsername) + return NextResponse.json({ + success: false, + message: "Username sudah digunakan", + }); + + // ✅ Validasi wajib setuju Terms + if (data.termsOfServiceAccepted !== true) { + return NextResponse.json({ + success: false, + message: "You must agree to the Terms of Service", + }); + } + + const createUser = await prisma.user.create({ + data: { + username: data.username, + nomor: data.nomor, + active: false, + termsOfServiceAccepted: data.termsOfServiceAccepted, + }, + }); + + if (!createUser) + return NextResponse.json( + { success: false, message: "Gagal Registrasi" }, + { status: 500 } + ); + + // const token = await sessionCreate({ + // sessionKey: process.env.NEXT_PUBLIC_BASE_SESSION_KEY!, + // encodedKey: process.env.NEXT_PUBLIC_BASE_TOKEN_KEY!, + // user: createUser as any, + // }); + + const createOtpId = await prisma.kodeOtp.create({ + data: { + nomor: data.nomor, + otp: codeOtp, + }, + }); + + if (!createOtpId) + return NextResponse.json( + { success: false, message: "Gagal mengirim kode OTP" }, + { status: 400 } + ); + + // const msg = `HIPMI - Kode ini bersifat RAHASIA dan JANGAN DI BAGIKAN KEPAADA SIAPAPUN, termasuk anggota ataupun pengurus HIPMI lainnya.\n\n\n> Kode OTP anda: ${codeOtp}.`; + const msg = `HIPMI%20-%20Kode%20ini%20bersifat%20RAHASIA%20dan%20JANGAN%20DI%20BAGIKAN%20KEPADA%20SIAPAPUN%2C%20termasuk%20anggota%20ataupun%20pengurus%20HIPMI%20lainnya.%20Kode%20OTP%20anda%3A%20${codeOtp}.`; + // // const encodedMsg = encodeURIComponent(msg); + + const res = await fetch( + `https://wa.wibudev.com/code?nom=${data.nomor}&text=${msg}`, + { cache: "no-cache" } + ); + + const sendWa = await res.json(); + + if (sendWa.status !== "success") + return NextResponse.json( + { success: false, message: "Nomor Whatsapp Tidak Aktif" }, + { status: 400 } + ); + + return NextResponse.json( + { + success: true, + message: "Registrasi Berhasil", + // token: token, + kodeId: createOtpId.id, + }, + { status: 201 } + ); + } catch (error) { + return NextResponse.json( + { + success: false, + message: "Maaf, Terjadi Keselahan", + reason: (error as Error).message, + }, + { status: 500 } + ); + } +} diff --git a/src/app/api/mobile/auth/validasi/route.ts b/src/app/api/mobile/auth/validasi/route.ts new file mode 100644 index 00000000..f0d94e08 --- /dev/null +++ b/src/app/api/mobile/auth/validasi/route.ts @@ -0,0 +1,82 @@ +import { sessionCreate } from "@/app/(auth)/_lib/session_create"; +import prisma from "@/lib/prisma"; +import backendLogger from "@/util/backendLogger"; +import { NextResponse } from "next/server"; + +export async function POST(req: Request) { + if (req.method !== "POST") { + return NextResponse.json( + { success: false, message: "Method Not Allowed" }, + { status: 405 } + ); + } + + try { + const { nomor } = await req.json(); + + const dataUser = await prisma.user.findUnique({ + where: { + nomor: nomor, + }, + select: { + id: true, + nomor: true, + username: true, + active: true, + masterUserRoleId: true, + termsOfServiceAccepted: true, + }, + }); + + if (dataUser == null) + return NextResponse.json( + { success: false, message: "Nomor Belum Terdaftar" }, + { status: 200 } + ); + + const token = await sessionCreate({ + sessionKey: process.env.NEXT_PUBLIC_BASE_SESSION_KEY!, + encodedKey: process.env.NEXT_PUBLIC_BASE_TOKEN_KEY!, + user: dataUser as any, + }); + + if (!token) { + return NextResponse.json( + { success: false, message: "Gagal membuat session" }, + { status: 500 } + ); + } + // Buat response dengan token dalam cookie + const response = NextResponse.json( + { + success: true, + message: "Berhasil Login", + roleId: dataUser.masterUserRoleId, + active: dataUser.active, + termsOfServiceAccepted: dataUser.termsOfServiceAccepted, + token: token, + }, + { status: 200 } + ); + + // Set cookie dengan token yang sudah dipastikan tidak null + response.cookies.set(process.env.NEXT_PUBLIC_BASE_SESSION_KEY!, token, { + path: "/", + sameSite: "lax", + secure: process.env.NODE_ENV === "production", + maxAge: 30 * 24 * 60 * 60, // 30 hari dalam detik (1 bulan) + }); + + return response; + } catch (error) { + backendLogger.log("API Error or Server Error", error); + return NextResponse.json( + { + success: false, + message: "Maaf, Terjadi Keselahan", + reason: (error as Error).message, + }, + { status: 500 } + ); + } +}