mirror of
https://github.com/i701/sarlink-portal.git
synced 2025-02-22 23:42:00 +00:00
- Updated `next.config.ts` to include remote image patterns for user verification. - Introduced `VerifyUserDetails` function in `lib/person.ts` to validate user data against national records. - Added `usePerson` hook for fetching national data based on ID card. - Enhanced `signup` and `signin` functions in `auth-actions.ts` to handle user verification status and send notifications for pending verifications. - Refactored `VerifyUser` function in `user-actions.ts` to incorporate national data validation. - Improved UI components in the user verification page to display both database and national information. - Updated `InputReadOnly` component to support customizable label classes for better styling. These changes improve the user verification process, ensuring data integrity and enhancing the overall user experience.
126 lines
2.6 KiB
TypeScript
126 lines
2.6 KiB
TypeScript
"use server";
|
|
|
|
import usePerson from "@/hooks/use-person";
|
|
import prisma from "@/lib/db";
|
|
import VerifyUserDetails from "@/lib/person";
|
|
import { revalidatePath } from "next/cache";
|
|
import { redirect } from "next/navigation";
|
|
import { CreateClient } from "./ninja/client";
|
|
|
|
export async function VerifyUser(userId: string) {
|
|
const user = await prisma.user.findUnique({
|
|
where: {
|
|
id: userId,
|
|
},
|
|
include: {
|
|
atoll: true,
|
|
island: true,
|
|
},
|
|
});
|
|
if (!user) {
|
|
throw new Error("User not found");
|
|
}
|
|
const isValidPerson = await VerifyUserDetails({ user });
|
|
|
|
if (!isValidPerson)
|
|
throw new Error("The user details does not match national data.");
|
|
|
|
if (isValidPerson) {
|
|
await prisma.user.update({
|
|
where: {
|
|
id: userId,
|
|
},
|
|
data: {
|
|
verified: true,
|
|
},
|
|
});
|
|
|
|
const ninjaClient = await CreateClient({
|
|
group_settings_id: "",
|
|
address1: "",
|
|
city: user.atoll?.name || "",
|
|
state: user.island?.name || "",
|
|
postal_code: "",
|
|
country_id: "462",
|
|
address2: user.address || "",
|
|
contacts: {
|
|
first_name: user.name?.split(" ")[0] || "",
|
|
last_name: user.name?.split(" ")[1] || "",
|
|
email: user.email || "",
|
|
phone: user.phoneNumber || "",
|
|
send_email: false,
|
|
custom_value1: user.dob?.toISOString().split("T")[0] || "",
|
|
custom_value2: user.id_card || "",
|
|
custom_value3: "",
|
|
},
|
|
});
|
|
}
|
|
|
|
revalidatePath("/users");
|
|
}
|
|
|
|
export async function Rejectuser({
|
|
userId,
|
|
reason,
|
|
}: { userId: string; reason: string }) {
|
|
const user = await prisma.user.findUnique({
|
|
where: {
|
|
id: userId,
|
|
},
|
|
});
|
|
if (!user) {
|
|
throw new Error("User not found");
|
|
}
|
|
await prisma.user.delete({
|
|
where: {
|
|
id: userId,
|
|
},
|
|
});
|
|
await SendUserRejectionDetailSMS({
|
|
details: reason,
|
|
phoneNumber: user.phoneNumber,
|
|
});
|
|
revalidatePath("/users");
|
|
redirect("/users");
|
|
}
|
|
|
|
export const SendUserRejectionDetailSMS = async ({
|
|
details,
|
|
phoneNumber,
|
|
}: {
|
|
details: string;
|
|
phoneNumber: string;
|
|
}) => {
|
|
const respose = await fetch(`${process.env.SMS_API_BASE_URL}/api/sms`, {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
Authorization: `Bearer ${process.env.SMS_API_KEY}`,
|
|
},
|
|
body: JSON.stringify({
|
|
check_delivery: false,
|
|
number: phoneNumber,
|
|
message: details,
|
|
}),
|
|
});
|
|
const data = await respose.json();
|
|
console.log(data);
|
|
return data;
|
|
};
|
|
|
|
export async function AddDevice({
|
|
name,
|
|
mac_address,
|
|
user_id,
|
|
}: { name: string; mac_address: string; user_id: string }) {
|
|
const newDevice = await prisma.device.create({
|
|
data: {
|
|
name: name,
|
|
mac: mac_address,
|
|
userId: user_id,
|
|
},
|
|
});
|
|
revalidatePath("/devices");
|
|
return newDevice;
|
|
}
|