From bf84395efea2bde46fd05405892a0e35558d9224 Mon Sep 17 00:00:00 2001 From: vergiLgood1 Date: Wed, 12 Mar 2025 16:13:57 +0700 Subject: [PATCH] change project structure --- sigap-website/.env.example | 31 +++++- .../(auth-pages)/_actions/forgot-password.ts | 40 ------- .../(auth-pages)/_actions/reset-password.ts | 43 -------- .../_actions/send-contact-form.ts | 100 ------------------ .../app/(auth-pages)/_actions/session.ts | 37 ------- .../app/(auth-pages)/_actions/sign-in.ts | 56 ---------- .../app/(auth-pages)/_actions/sign-out.ts | 10 -- .../app/(auth-pages)/_actions/sign-up.ts | 39 ------- .../app/(auth-pages)/_actions/verify-otp.ts | 30 ------ .../(admin)/_components}/app-sidebar.tsx | 12 +-- .../(admin)/_components}/map/mapbox-view.tsx | 0 .../_components}/navigations/nav-main.tsx | 2 +- .../_components}/navigations/nav-pre-main.tsx | 0 .../_components}/navigations/nav-report.tsx | 0 .../_components}/navigations/nav-user.tsx | 4 +- .../_components}/settings/import-data.tsx | 2 +- .../settings/notification-settings.tsx | 2 +- .../settings/preference-settings.tsx | 6 +- .../settings/profile-settings.tsx | 4 +- .../settings/security-setting.tsx | 2 +- .../_components}/settings/setting-dialog.tsx | 6 +- .../(admin)/dashboard/page.tsx | 2 +- .../_components/add-user-dialog.tsx | 2 +- .../user-management/_components/column.tsx | 0 .../_components/data-table.tsx | 0 .../_components/invite-user.tsx | 2 +- .../_components/profile-form.tsx | 4 +- .../user-management/_components/sheet.tsx | 2 +- .../_components/update-user.tsx | 94 +++++++--------- .../user-management/_components/user-form.tsx | 0 .../_components/user-management.tsx | 6 +- .../_components/user-stats.tsx | 4 +- .../dashboard/user-management/action.ts | 26 ++--- .../dashboard/user-management/page.tsx | 4 +- .../(admin)/layout.tsx | 4 +- .../(auth)/_components}/signin-form.tsx | 8 +- .../(auth)/_components}/verify-otp-form.tsx | 2 +- .../(auth)}/action.ts | 12 +-- .../(auth)}/layout.tsx | 2 +- .../(auth)}/sign-in/page.tsx | 2 +- .../(auth)}/smtp-message.tsx | 0 .../(auth)}/verify-otp/page.tsx | 2 +- sigap-website/app/{ => (pages)}/layout.tsx | 10 +- sigap-website/app/{ => (pages)}/page.tsx | 2 +- sigap-website/app/(protected)/page.tsx | 48 --------- .../_components/custom-dropdown-switcher.tsx | 2 +- .../app/_components/date-time-picker.tsx | 2 +- .../app/_components/form-wrapper.tsx | 2 +- sigap-website/app/_components/header-auth.tsx | 6 +- .../app/_components/ui/alert-dialog.tsx | 2 +- sigap-website/app/_components/ui/avatar.tsx | 2 +- sigap-website/app/_components/ui/badge.tsx | 2 +- .../app/_components/ui/breadcrumb.tsx | 2 +- sigap-website/app/_components/ui/button.tsx | 2 +- sigap-website/app/_components/ui/calendar.tsx | 2 +- sigap-website/app/_components/ui/card.tsx | 2 +- sigap-website/app/_components/ui/checkbox.tsx | 2 +- .../app/_components/ui/date-picker.tsx | 2 +- sigap-website/app/_components/ui/dialog.tsx | 2 +- sigap-website/app/_components/ui/drawer.tsx | 2 +- .../app/_components/ui/dropdown-menu.tsx | 2 +- sigap-website/app/_components/ui/form.tsx | 2 +- .../app/_components/ui/input-otp.tsx | 2 +- sigap-website/app/_components/ui/input.tsx | 2 +- sigap-website/app/_components/ui/label.tsx | 2 +- sigap-website/app/_components/ui/popover.tsx | 2 +- .../app/_components/ui/scroll-area.tsx | 2 +- sigap-website/app/_components/ui/select.tsx | 2 +- .../app/_components/ui/separator.tsx | 2 +- sigap-website/app/_components/ui/sheet.tsx | 2 +- sigap-website/app/_components/ui/sidebar.tsx | 2 +- sigap-website/app/_components/ui/skeleton.tsx | 2 +- sigap-website/app/_components/ui/switch.tsx | 2 +- sigap-website/app/_components/ui/table.tsx | 2 +- sigap-website/app/_components/ui/tabs.tsx | 2 +- sigap-website/app/_components/ui/textarea.tsx | 2 +- sigap-website/app/_components/ui/tooltip.tsx | 2 +- .../_lib}/react-query-provider.tsx | 0 sigap-website/{lib => app/_lib}/utils.ts | 0 sigap-website/app/{ => _styles}/globals.css | 0 .../_utils/cookies}/cookies-manager.ts | 0 .../cookies}/notification-cookies-manager.ts | 0 .../{utils => app/_utils}/supabase/admin.ts | 0 .../_utils}/supabase/check-env-vars.ts | 0 .../{utils => app/_utils}/supabase/client.ts | 0 .../_utils}/supabase/middleware.ts | 0 .../{utils => app/_utils}/supabase/server.ts | 0 sigap-website/{utils => app/_utils}/utils.ts | 0 .../app/{ => api}/auth/callback/route.ts | 2 +- .../images}/opengraph-image.png | Bin .../{app => assets/images}/twitter-image.png | Bin sigap-website/middleware.ts | 2 +- sigap-website/{lib => prisma}/db.ts | 0 .../controller/auth/sign-in-controller.tsx | 4 +- .../controller/auth/verify-otp.controller.tsx | 4 +- sigap-website/src/entities/errors/auth.ts | 17 +++ sigap-website/src/entities/errors/common.ts | 18 ++++ .../models/auth/sign-in.model.ts | 0 .../models/auth/verify-otp.model.ts | 0 .../models/users/users.model.ts | 8 +- .../repositories/authentication.repository.ts | 8 +- .../src/repositories/users.repository.ts | 0 102 files changed, 213 insertions(+), 582 deletions(-) delete mode 100644 sigap-website/app/(auth-pages)/_actions/forgot-password.ts delete mode 100644 sigap-website/app/(auth-pages)/_actions/reset-password.ts delete mode 100644 sigap-website/app/(auth-pages)/_actions/send-contact-form.ts delete mode 100644 sigap-website/app/(auth-pages)/_actions/session.ts delete mode 100644 sigap-website/app/(auth-pages)/_actions/sign-in.ts delete mode 100644 sigap-website/app/(auth-pages)/_actions/sign-out.ts delete mode 100644 sigap-website/app/(auth-pages)/_actions/sign-up.ts delete mode 100644 sigap-website/app/(auth-pages)/_actions/verify-otp.ts rename sigap-website/app/{(protected)/(admin)/_components/admin => (pages)/(admin)/_components}/app-sidebar.tsx (71%) rename sigap-website/app/{(protected)/(admin)/_components/admin => (pages)/(admin)/_components}/map/mapbox-view.tsx (100%) rename sigap-website/app/{(protected)/(admin)/_components/admin => (pages)/(admin)/_components}/navigations/nav-main.tsx (99%) rename sigap-website/app/{(protected)/(admin)/_components/admin => (pages)/(admin)/_components}/navigations/nav-pre-main.tsx (100%) rename sigap-website/app/{(protected)/(admin)/_components/admin => (pages)/(admin)/_components}/navigations/nav-report.tsx (100%) rename sigap-website/app/{(protected)/(admin)/_components/admin => (pages)/(admin)/_components}/navigations/nav-user.tsx (97%) rename sigap-website/app/{(protected)/(admin)/_components/admin => (pages)/(admin)/_components}/settings/import-data.tsx (98%) rename sigap-website/app/{(protected)/(admin)/_components/admin => (pages)/(admin)/_components}/settings/notification-settings.tsx (98%) rename sigap-website/app/{(protected)/(admin)/_components/admin => (pages)/(admin)/_components}/settings/preference-settings.tsx (98%) rename sigap-website/app/{(protected)/(admin)/_components/admin => (pages)/(admin)/_components}/settings/profile-settings.tsx (98%) rename sigap-website/app/{(protected)/(admin)/_components/admin => (pages)/(admin)/_components}/settings/security-setting.tsx (96%) rename sigap-website/app/{(protected)/(admin)/_components/admin => (pages)/(admin)/_components}/settings/setting-dialog.tsx (97%) rename sigap-website/app/{(protected) => (pages)}/(admin)/dashboard/page.tsx (94%) rename sigap-website/app/{(protected) => (pages)}/(admin)/dashboard/user-management/_components/add-user-dialog.tsx (98%) rename sigap-website/app/{(protected) => (pages)}/(admin)/dashboard/user-management/_components/column.tsx (100%) rename sigap-website/app/{(protected) => (pages)}/(admin)/dashboard/user-management/_components/data-table.tsx (100%) rename sigap-website/app/{(protected) => (pages)}/(admin)/dashboard/user-management/_components/invite-user.tsx (97%) rename sigap-website/app/{(protected) => (pages)}/(admin)/dashboard/user-management/_components/profile-form.tsx (98%) rename sigap-website/app/{(protected) => (pages)}/(admin)/dashboard/user-management/_components/sheet.tsx (99%) rename sigap-website/app/{(protected) => (pages)}/(admin)/dashboard/user-management/_components/update-user.tsx (79%) rename sigap-website/app/{(protected) => (pages)}/(admin)/dashboard/user-management/_components/user-form.tsx (100%) rename sigap-website/app/{(protected) => (pages)}/(admin)/dashboard/user-management/_components/user-management.tsx (99%) rename sigap-website/app/{(protected) => (pages)}/(admin)/dashboard/user-management/_components/user-stats.tsx (94%) rename sigap-website/app/{(protected) => (pages)}/(admin)/dashboard/user-management/action.ts (91%) rename sigap-website/app/{(protected) => (pages)}/(admin)/dashboard/user-management/page.tsx (78%) rename sigap-website/app/{(protected) => (pages)}/(admin)/layout.tsx (95%) rename sigap-website/app/{_components/auth => (pages)/(auth)/_components}/signin-form.tsx (93%) rename sigap-website/app/{_components/auth => (pages)/(auth)/_components}/verify-otp-form.tsx (98%) rename sigap-website/app/{(auth-pages) => (pages)/(auth)}/action.ts (83%) rename sigap-website/app/{(auth-pages) => (pages)/(auth)}/layout.tsx (88%) rename sigap-website/app/{(auth-pages) => (pages)/(auth)}/sign-in/page.tsx (96%) rename sigap-website/app/{(auth-pages) => (pages)/(auth)}/smtp-message.tsx (100%) rename sigap-website/app/{(auth-pages) => (pages)/(auth)}/verify-otp/page.tsx (90%) rename sigap-website/app/{ => (pages)}/layout.tsx (86%) rename sigap-website/app/{ => (pages)}/page.tsx (88%) delete mode 100644 sigap-website/app/(protected)/page.tsx rename sigap-website/{providers => app/_lib}/react-query-provider.tsx (100%) rename sigap-website/{lib => app/_lib}/utils.ts (100%) rename sigap-website/app/{ => _styles}/globals.css (100%) rename sigap-website/{utils => app/_utils/cookies}/cookies-manager.ts (100%) rename sigap-website/{utils => app/_utils/cookies}/notification-cookies-manager.ts (100%) rename sigap-website/{utils => app/_utils}/supabase/admin.ts (100%) rename sigap-website/{utils => app/_utils}/supabase/check-env-vars.ts (100%) rename sigap-website/{utils => app/_utils}/supabase/client.ts (100%) rename sigap-website/{utils => app/_utils}/supabase/middleware.ts (100%) rename sigap-website/{utils => app/_utils}/supabase/server.ts (100%) rename sigap-website/{utils => app/_utils}/utils.ts (100%) rename sigap-website/app/{ => api}/auth/callback/route.ts (93%) rename sigap-website/{app => assets/images}/opengraph-image.png (100%) rename sigap-website/{app => assets/images}/twitter-image.png (100%) rename sigap-website/{lib => prisma}/db.ts (100%) create mode 100644 sigap-website/src/entities/errors/auth.ts create mode 100644 sigap-website/src/entities/errors/common.ts rename sigap-website/src/{ => entities}/models/auth/sign-in.model.ts (100%) rename sigap-website/src/{ => entities}/models/auth/verify-otp.model.ts (100%) rename sigap-website/src/{ => entities}/models/users/users.model.ts (95%) create mode 100644 sigap-website/src/repositories/users.repository.ts diff --git a/sigap-website/.env.example b/sigap-website/.env.example index 6937031..0863ce9 100644 --- a/sigap-website/.env.example +++ b/sigap-website/.env.example @@ -1,4 +1,31 @@ # Update these with your Supabase details from your project settings > API # https://app.supabase.com/project/_/settings/api -NEXT_PUBLIC_SUPABASE_URL=your-project-url -NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key + +# Supabase Production URL +NEXT_PUBLIC_SUPABASE_URL= +NEXT_PUBLIC_SUPABASE_ANON_KEY= +SUPABASE_SERVICE_ROLE_SECRET= +NEXT_PUBLIC_SUPABASE_STORAGE_URL= +# Supabase Local URL +NEXT_PUBLIC_SUPABASE_URL= +NEXT_PUBLIC_SUPABASE_ANON_KEY= + +# Supabase Service Role Secret Key +SERVICE_ROLE_SECRET= + +# RESEND_API_KEY_TES= +RESEND_API_KEY= +SEND_EMAIL_HOOK_SECRET= + +# db connection string +# Connect to Supabase via connection pooling with Supavisor. +DATABASE_URL= + + + +# Direct connection to the database. Used for migrations. +DIRECT_URL= + +DENO_ENV= + +SIGAP_MAPBOX_ACCESS_TOKEN= diff --git a/sigap-website/app/(auth-pages)/_actions/forgot-password.ts b/sigap-website/app/(auth-pages)/_actions/forgot-password.ts deleted file mode 100644 index b38936b..0000000 --- a/sigap-website/app/(auth-pages)/_actions/forgot-password.ts +++ /dev/null @@ -1,40 +0,0 @@ -"use server"; - -import { createClient } from "@/utils/supabase/server"; -import { encodedRedirect } from "@/utils/utils"; -import { headers } from "next/headers"; -import { redirect } from "next/navigation"; - -export const forgotPasswordAction = async (formData: FormData) => { - const email = formData.get("email")?.toString(); - const supabase = await createClient(); - const origin = (await headers()).get("origin"); - const callbackUrl = formData.get("callbackUrl")?.toString(); - - if (!email) { - return encodedRedirect("error", "/forgot-password", "Email is required"); - } - - const { error } = await supabase.auth.resetPasswordForEmail(email, { - redirectTo: `${origin}/auth/callback?redirect_to=/protected/reset-password`, - }); - - if (error) { - console.error(error.message); - return encodedRedirect( - "error", - "/forgot-password", - "Could not reset password", - ); - } - - if (callbackUrl) { - return redirect(callbackUrl); - } - - return encodedRedirect( - "success", - "/forgot-password", - "Check your email for a link to reset your password.", - ); -}; \ No newline at end of file diff --git a/sigap-website/app/(auth-pages)/_actions/reset-password.ts b/sigap-website/app/(auth-pages)/_actions/reset-password.ts deleted file mode 100644 index 3b58b68..0000000 --- a/sigap-website/app/(auth-pages)/_actions/reset-password.ts +++ /dev/null @@ -1,43 +0,0 @@ -"use server"; - -import { encodedRedirect } from "@/utils/utils"; -import { createClient } from "@/utils/supabase/server"; -import { headers } from "next/headers"; -import { redirect } from "next/navigation"; - -export const resetPasswordAction = async (formData: FormData) => { - const supabase = await createClient(); - - const password = formData.get("password") as string; - const confirmPassword = formData.get("confirmPassword") as string; - - if (!password || !confirmPassword) { - encodedRedirect( - "error", - "/protected/reset-password", - "Password and confirm password are required" - ); - } - - if (password !== confirmPassword) { - encodedRedirect( - "error", - "/protected/reset-password", - "Passwords do not match" - ); - } - - const { error } = await supabase.auth.updateUser({ - password: password, - }); - - if (error) { - encodedRedirect( - "error", - "/protected/reset-password", - "Password update failed" - ); - } - - encodedRedirect("success", "/protected/reset-password", "Password updated"); -}; diff --git a/sigap-website/app/(auth-pages)/_actions/send-contact-form.ts b/sigap-website/app/(auth-pages)/_actions/send-contact-form.ts deleted file mode 100644 index 17c5a51..0000000 --- a/sigap-website/app/(auth-pages)/_actions/send-contact-form.ts +++ /dev/null @@ -1,100 +0,0 @@ -// import { createClient } from "@/utils/supabase/server"; - -// export async function sendContactEmail(formData: { -// name: string; -// email: string; -// phone: string; -// typeMessage: string; -// message: string; -// }) { -// try { -// // Initialize Supabase -// const supabase = await createClient(); -// const { resend } = useResend(); - -// // Get message type label -// const messageTypeLabel = -// typeMessageMap.get(formData.typeMessage) || "Unknown"; - -// // Save to Supabase -// const { data: contactData, error: contactError } = await supabase -// .from("contact_messages") -// .insert([ -// { -// name: formData.name, -// email: formData.email, -// phone: formData.phone, -// message_type: formData.typeMessage, -// message_type_label: messageTypeLabel, -// message: formData.message, -// status: "new", -// }, -// ]) -// .select(); - -// if (contactError) { -// console.error("Error saving contact message to Supabase:", contactError); -// return { -// success: false, -// error: "Failed to save your message. Please try again later.", -// }; -// } - -// // Render admin email template -// const adminEmailHtml = await render( -// AdminNotification({ -// name: formData.name, -// email: formData.email, -// phone: formData.phone, -// messageType: messageTypeLabel, -// message: formData.message, -// }) -// ); - -// // Send email to admin -// const { data: emailData, error: emailError } = await resend.emails.send({ -// from: "Contact Form ", -// to: ["xdamazon17@gmail.com"], -// subject: `New Contact Form Submission: ${messageTypeLabel}`, -// html: adminEmailHtml, -// }); - -// if (emailError) { -// console.error("Error sending email via Resend:", emailError); -// // Note: We don't return error here since the data is already saved to Supabase -// } - -// const userEmailHtml = await render( -// UserConfirmation({ -// name: formData.name, -// messageType: messageTypeLabel, -// message: formData.message, -// }) -// ); - -// // Send confirmation email to user -// const { data: confirmationData, error: confirmationError } = -// await resend.emails.send({ -// from: "Your Company ", -// to: [formData.email], -// subject: "Thank you for contacting us", -// html: userEmailHtml, -// }); - -// if (confirmationError) { -// console.error("Error sending confirmation email:", confirmationError); -// // Note: We don't return error here either -// } - -// return { -// success: true, -// message: "Your message has been sent successfully!", -// }; -// } catch (error) { -// console.error("Unexpected error in sendContactEmail:", error); -// return { -// success: false, -// error: "An unexpected error occurred. Please try again later.", -// }; -// } -// } \ No newline at end of file diff --git a/sigap-website/app/(auth-pages)/_actions/session.ts b/sigap-website/app/(auth-pages)/_actions/session.ts deleted file mode 100644 index 5e2026e..0000000 --- a/sigap-website/app/(auth-pages)/_actions/session.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { createClient } from "@/utils/supabase/server"; - -export const checkSession = async () => { - const supabase = await createClient(); - - try { - const { - data: { session }, - error, - } = await supabase.auth.getSession(); - - if (error) { - return { - success: false, - error: error.message, - }; - } - - if (session) { - return { - success: true, - session, - redirectTo: "/dashboard", - }; - } - - return { - success: false, - message: "No active session", - }; - } catch (error) { - return { - success: false, - error: "An unexpected error occurred", - }; - } -}; diff --git a/sigap-website/app/(auth-pages)/_actions/sign-in.ts b/sigap-website/app/(auth-pages)/_actions/sign-in.ts deleted file mode 100644 index dbdf00e..0000000 --- a/sigap-website/app/(auth-pages)/_actions/sign-in.ts +++ /dev/null @@ -1,56 +0,0 @@ -"use server"; - -import { createClient } from "@/utils/supabase/server"; -import { encodedRedirect } from "@/utils/utils"; -import { redirect } from "next/navigation"; -import { checkSession } from "./session"; - -export const signInAction = async (formData: FormData) => { - const supabase = await createClient(); - const email = formData.get("email") as string; - const encodeEmail = encodeURIComponent(email); - - try { - // First, check for existing session - const { - data: { session }, - } = await supabase.auth.getSession(); - - // If there's an active session and the email matches - if (session?.user?.email === email) { - return { - success: true, - message: "You are already signed in", - redirectTo: "/dashboard", - }; - } - - // If no active session or different email, proceed with OTP - const { data, error } = await supabase.auth.signInWithOtp({ - email, - options: { - shouldCreateUser: false, - }, - }); - - if (error) { - return { - success: false, - error: error.message, - redirectTo: `/verify-otp?email=${encodeEmail}`, - }; - } - - return { - success: true, - message: "OTP has been sent to your email", - redirectTo: `/verify-otp?email=${encodeEmail}`, - }; - } catch (error) { - return { - success: false, - error: "An unexpected error occurred", - redirectTo: "/sign-in", - }; - } -}; diff --git a/sigap-website/app/(auth-pages)/_actions/sign-out.ts b/sigap-website/app/(auth-pages)/_actions/sign-out.ts deleted file mode 100644 index 0137a93..0000000 --- a/sigap-website/app/(auth-pages)/_actions/sign-out.ts +++ /dev/null @@ -1,10 +0,0 @@ -"use server"; - -import { createClient } from "@/utils/supabase/server"; -import { redirect } from "next/navigation"; - -export const signOutAction = async () => { - const supabase = await createClient(); - await supabase.auth.signOut(); - return redirect("/sign-in"); -}; diff --git a/sigap-website/app/(auth-pages)/_actions/sign-up.ts b/sigap-website/app/(auth-pages)/_actions/sign-up.ts deleted file mode 100644 index a4b2ef3..0000000 --- a/sigap-website/app/(auth-pages)/_actions/sign-up.ts +++ /dev/null @@ -1,39 +0,0 @@ -"use server"; - -import { createClient } from "@/utils/supabase/server"; -import { encodedRedirect } from "@/utils/utils"; -import { headers } from "next/headers"; - -export const signUpAction = async (formData: FormData) => { - const email = formData.get("email")?.toString(); - const password = formData.get("password")?.toString(); - const supabase = await createClient(); - const origin = (await headers()).get("origin"); - - if (!email || !password) { - return encodedRedirect( - "error", - "/sign-up", - "Email and password are required" - ); - } - - const { error } = await supabase.auth.signUp({ - email, - password, - options: { - emailRedirectTo: `${origin}/auth/callback`, - }, - }); - - if (error) { - console.error(error.code + " " + error.message); - return encodedRedirect("error", "/sign-up", error.message); - } else { - return encodedRedirect( - "success", - "/sign-up", - "Thanks for signing up! Please check your email for a verification link." - ); - } -}; diff --git a/sigap-website/app/(auth-pages)/_actions/verify-otp.ts b/sigap-website/app/(auth-pages)/_actions/verify-otp.ts deleted file mode 100644 index c512e33..0000000 --- a/sigap-website/app/(auth-pages)/_actions/verify-otp.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { createClient } from "@/utils/supabase/server"; -import { redirect } from "next/navigation"; - -export const verifyOtpAction = async (formData: FormData) => { - const email = formData.get("email") as string; - const token = formData.get("token") as string; - const supabase = await createClient(); - - console.log("email", email); - console.log("token", token); - - if (!email || !token) { - redirect("/error?message=Email and OTP are required"); - } - - const { - data: { session }, - error, - } = await supabase.auth.verifyOtp({ - email, - token, - type: "email", - }); - - if (error) { - return redirect(`/verify-otp?error=${encodeURIComponent(error.message)}`); - } - - return redirect("/dashboard?message=OTP verified successfully"); -}; diff --git a/sigap-website/app/(protected)/(admin)/_components/admin/app-sidebar.tsx b/sigap-website/app/(pages)/(admin)/_components/app-sidebar.tsx similarity index 71% rename from sigap-website/app/(protected)/(admin)/_components/admin/app-sidebar.tsx rename to sigap-website/app/(pages)/(admin)/_components/app-sidebar.tsx index cce0201..0cbbf5e 100644 --- a/sigap-website/app/(protected)/(admin)/_components/admin/app-sidebar.tsx +++ b/sigap-website/app/(pages)/(admin)/_components/app-sidebar.tsx @@ -2,9 +2,9 @@ import * as React from "react"; -import { NavMain } from "@/app/(protected)/(admin)/_components/admin/navigations/nav-main"; -import { NavReports } from "@/app/(protected)/(admin)/_components/admin/navigations/nav-report"; -import { NavUser } from "@/app/(protected)/(admin)/_components/admin/navigations/nav-user"; +import { NavMain } from "@/app/(pages)/(admin)/_components/navigations/nav-main"; +import { NavReports } from "@/app/(pages)/(admin)/_components/navigations/nav-report"; +import { NavUser } from "@/app/(pages)/(admin)/_components/navigations/nav-user"; import { Sidebar, @@ -15,10 +15,10 @@ import { } from "@/app/_components/ui/sidebar"; import { NavPreMain } from "./navigations/nav-pre-main"; import { navData } from "@/prisma/data/nav"; -import { TeamSwitcher } from "../../../../_components/team-switcher"; +import { TeamSwitcher } from "../../../_components/team-switcher"; -import { Profile, User } from "@/src/models/users/users.model"; -import { getCurrentUser } from "@/app/(protected)/(admin)/dashboard/user-management/action"; +import { Profile, User } from "@/src/entities/models/users/users.model"; +import { getCurrentUser } from "@/app/(pages)/(admin)/dashboard/user-management/action"; export function AppSidebar({ ...props }: React.ComponentProps) { const [user, setUser] = React.useState(null); diff --git a/sigap-website/app/(protected)/(admin)/_components/admin/map/mapbox-view.tsx b/sigap-website/app/(pages)/(admin)/_components/map/mapbox-view.tsx similarity index 100% rename from sigap-website/app/(protected)/(admin)/_components/admin/map/mapbox-view.tsx rename to sigap-website/app/(pages)/(admin)/_components/map/mapbox-view.tsx diff --git a/sigap-website/app/(protected)/(admin)/_components/admin/navigations/nav-main.tsx b/sigap-website/app/(pages)/(admin)/_components/navigations/nav-main.tsx similarity index 99% rename from sigap-website/app/(protected)/(admin)/_components/admin/navigations/nav-main.tsx rename to sigap-website/app/(pages)/(admin)/_components/navigations/nav-main.tsx index af4652d..b02d90f 100644 --- a/sigap-website/app/(protected)/(admin)/_components/admin/navigations/nav-main.tsx +++ b/sigap-website/app/(pages)/(admin)/_components/navigations/nav-main.tsx @@ -19,7 +19,7 @@ import { import type * as TablerIcons from "@tabler/icons-react"; import { useNavigations } from "@/app/_hooks/use-navigations"; -import { formatUrl } from "@/utils/utils"; +import { formatUrl } from "@/app/_utils/utils"; interface SubSubItem { title: string; diff --git a/sigap-website/app/(protected)/(admin)/_components/admin/navigations/nav-pre-main.tsx b/sigap-website/app/(pages)/(admin)/_components/navigations/nav-pre-main.tsx similarity index 100% rename from sigap-website/app/(protected)/(admin)/_components/admin/navigations/nav-pre-main.tsx rename to sigap-website/app/(pages)/(admin)/_components/navigations/nav-pre-main.tsx diff --git a/sigap-website/app/(protected)/(admin)/_components/admin/navigations/nav-report.tsx b/sigap-website/app/(pages)/(admin)/_components/navigations/nav-report.tsx similarity index 100% rename from sigap-website/app/(protected)/(admin)/_components/admin/navigations/nav-report.tsx rename to sigap-website/app/(pages)/(admin)/_components/navigations/nav-report.tsx diff --git a/sigap-website/app/(protected)/(admin)/_components/admin/navigations/nav-user.tsx b/sigap-website/app/(pages)/(admin)/_components/navigations/nav-user.tsx similarity index 97% rename from sigap-website/app/(protected)/(admin)/_components/admin/navigations/nav-user.tsx rename to sigap-website/app/(pages)/(admin)/_components/navigations/nav-user.tsx index 583bd22..8a7590c 100644 --- a/sigap-website/app/(protected)/(admin)/_components/admin/navigations/nav-user.tsx +++ b/sigap-website/app/(pages)/(admin)/_components/navigations/nav-user.tsx @@ -24,8 +24,8 @@ import { useSidebar, } from "@/app/_components/ui/sidebar"; import { IconLogout, IconSettings, IconSparkles } from "@tabler/icons-react"; -import type { User } from "@/src/models/users/users.model"; -import { signOut } from "@/app/(auth-pages)/action"; +import type { User } from "@/src/entities/models/users/users.model"; +import { signOut } from "@/app/(pages)/(auth)/action"; import { SettingsDialog } from "../settings/setting-dialog"; export function NavUser({ user }: { user: User | null }) { diff --git a/sigap-website/app/(protected)/(admin)/_components/admin/settings/import-data.tsx b/sigap-website/app/(pages)/(admin)/_components/settings/import-data.tsx similarity index 98% rename from sigap-website/app/(protected)/(admin)/_components/admin/settings/import-data.tsx rename to sigap-website/app/(pages)/(admin)/_components/settings/import-data.tsx index 11361ea..24ea9cb 100644 --- a/sigap-website/app/(protected)/(admin)/_components/admin/settings/import-data.tsx +++ b/sigap-website/app/(pages)/(admin)/_components/settings/import-data.tsx @@ -4,7 +4,7 @@ import { Card, CardContent } from "@/app/_components/ui/card"; import { ScrollArea } from "@/app/_components/ui/scroll-area"; import { Separator } from "@/app/_components/ui/separator"; import { Upload } from "lucide-react"; -import { Badge } from "../../../../../_components/ui/badge"; +import { Badge } from "../../../../_components/ui/badge"; import { IconBrandGoogleAnalytics, IconCsv, diff --git a/sigap-website/app/(protected)/(admin)/_components/admin/settings/notification-settings.tsx b/sigap-website/app/(pages)/(admin)/_components/settings/notification-settings.tsx similarity index 98% rename from sigap-website/app/(protected)/(admin)/_components/admin/settings/notification-settings.tsx rename to sigap-website/app/(pages)/(admin)/_components/settings/notification-settings.tsx index dd6f8f7..ff611a7 100644 --- a/sigap-website/app/(protected)/(admin)/_components/admin/settings/notification-settings.tsx +++ b/sigap-website/app/(pages)/(admin)/_components/settings/notification-settings.tsx @@ -10,7 +10,7 @@ import { getNotificationPreferences, saveNotificationPreferences, applyNotificationPreferences, -} from "@/utils/notification-cookies-manager"; +} from "@/app/_utils/cookies/notification-cookies-manager"; import { toast } from "sonner"; export default function NotificationsSetting() { diff --git a/sigap-website/app/(protected)/(admin)/_components/admin/settings/preference-settings.tsx b/sigap-website/app/(pages)/(admin)/_components/settings/preference-settings.tsx similarity index 98% rename from sigap-website/app/(protected)/(admin)/_components/admin/settings/preference-settings.tsx rename to sigap-website/app/(pages)/(admin)/_components/settings/preference-settings.tsx index a55271c..7060802 100644 --- a/sigap-website/app/(protected)/(admin)/_components/admin/settings/preference-settings.tsx +++ b/sigap-website/app/(pages)/(admin)/_components/settings/preference-settings.tsx @@ -5,8 +5,8 @@ import { ChevronDown } from "lucide-react"; import { Switch } from "@/app/_components/ui/switch"; import { Separator } from "@/app/_components/ui/separator"; import { ScrollArea } from "@/app/_components/ui/scroll-area"; -import { ThemeSwitcher } from "../../../../../_components/theme-switcher"; -import DropdownSwitcher from "../../../../../_components/custom-dropdown-switcher"; +import { ThemeSwitcher } from "../../../../_components/theme-switcher"; +import DropdownSwitcher from "../../../../_components/custom-dropdown-switcher"; import { type CookiePreferences, defaultCookiePreferences, @@ -21,7 +21,7 @@ import { getAutoTimezonePreference, saveAutoTimezonePreference, applyCookiePreferences, -} from "@/utils/cookies-manager"; +} from "@/app/_utils/cookies/cookies-manager"; import { toast } from "sonner"; import { initialTimezones, TimezoneType } from "@/prisma/data/timezones"; import { languages, LanguageType } from "@/prisma/data/languages"; diff --git a/sigap-website/app/(protected)/(admin)/_components/admin/settings/profile-settings.tsx b/sigap-website/app/(pages)/(admin)/_components/settings/profile-settings.tsx similarity index 98% rename from sigap-website/app/(protected)/(admin)/_components/admin/settings/profile-settings.tsx rename to sigap-website/app/(pages)/(admin)/_components/settings/profile-settings.tsx index b4430e1..5123e3b 100644 --- a/sigap-website/app/(protected)/(admin)/_components/admin/settings/profile-settings.tsx +++ b/sigap-website/app/(pages)/(admin)/_components/settings/profile-settings.tsx @@ -2,7 +2,7 @@ import type React from "react"; -import type { User } from "@/src/models/users/users.model"; +import type { User } from "@/src/entities/models/users/users.model"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; @@ -31,7 +31,7 @@ import { ScrollArea } from "@/app/_components/ui/scroll-area"; import { updateUser, uploadAvatar, -} from "@/app/(protected)/(admin)/dashboard/user-management/action"; +} from "@/app/(pages)/(admin)/dashboard/user-management/action"; const profileFormSchema = z.object({ username: z.string().nullable().optional(), diff --git a/sigap-website/app/(protected)/(admin)/_components/admin/settings/security-setting.tsx b/sigap-website/app/(pages)/(admin)/_components/settings/security-setting.tsx similarity index 96% rename from sigap-website/app/(protected)/(admin)/_components/admin/settings/security-setting.tsx rename to sigap-website/app/(pages)/(admin)/_components/settings/security-setting.tsx index b86bc98..25efc73 100644 --- a/sigap-website/app/(protected)/(admin)/_components/admin/settings/security-setting.tsx +++ b/sigap-website/app/(pages)/(admin)/_components/settings/security-setting.tsx @@ -1,6 +1,6 @@ "use client"; -import type { User } from "@/src/models/users/users.model"; +import type { User } from "@/src/entities/models/users/users.model"; import { Button } from "@/app/_components/ui/button"; import { Separator } from "@/app/_components/ui/separator"; diff --git a/sigap-website/app/(protected)/(admin)/_components/admin/settings/setting-dialog.tsx b/sigap-website/app/(pages)/(admin)/_components/settings/setting-dialog.tsx similarity index 97% rename from sigap-website/app/(protected)/(admin)/_components/admin/settings/setting-dialog.tsx rename to sigap-website/app/(pages)/(admin)/_components/settings/setting-dialog.tsx index 0571673..fcee4b3 100644 --- a/sigap-website/app/(protected)/(admin)/_components/admin/settings/setting-dialog.tsx +++ b/sigap-website/app/(pages)/(admin)/_components/settings/setting-dialog.tsx @@ -1,7 +1,7 @@ "use client"; - -import { cn } from "@/lib/utils"; + +import { cn } from "@/app/_lib/utils"; import { Dialog, DialogContent, @@ -28,7 +28,7 @@ import { IconUsers, IconWorld, } from "@tabler/icons-react"; -import type { User } from "@/src/models/users/users.model"; +import type { User } from "@/src/entities/models/users/users.model"; import { ProfileSettings } from "./profile-settings"; import { DialogTitle } from "@radix-ui/react-dialog"; import { useState } from "react"; diff --git a/sigap-website/app/(protected)/(admin)/dashboard/page.tsx b/sigap-website/app/(pages)/(admin)/dashboard/page.tsx similarity index 94% rename from sigap-website/app/(protected)/(admin)/dashboard/page.tsx rename to sigap-website/app/(pages)/(admin)/dashboard/page.tsx index 118a272..73f05a1 100644 --- a/sigap-website/app/(protected)/(admin)/dashboard/page.tsx +++ b/sigap-website/app/(pages)/(admin)/dashboard/page.tsx @@ -1,5 +1,5 @@ import { DateTimePicker2 } from "@/app/_components/ui/date-picker"; -import { createClient } from "@/utils/supabase/server"; +import { createClient } from "@/app/_utils/supabase/server"; import { redirect } from "next/navigation"; export default async function DashboardPage() { diff --git a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/add-user-dialog.tsx b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/add-user-dialog.tsx similarity index 98% rename from sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/add-user-dialog.tsx rename to sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/add-user-dialog.tsx index f4188a9..8b6082a 100644 --- a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/add-user-dialog.tsx +++ b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/add-user-dialog.tsx @@ -10,7 +10,7 @@ import { import { Button } from "@/app/_components/ui/button"; import { Input } from "@/app/_components/ui/input"; import { Checkbox } from "@/app/_components/ui/checkbox"; -import { createUser } from "@/app/(protected)/(admin)/dashboard/user-management/action"; +import { createUser } from "@/app/(pages)/(admin)/dashboard/user-management/action"; import { toast } from "sonner"; import { Mail, Lock, Loader2, X } from "lucide-react"; import { useMutation } from "@tanstack/react-query"; diff --git a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/column.tsx b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/column.tsx similarity index 100% rename from sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/column.tsx rename to sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/column.tsx diff --git a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/data-table.tsx b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/data-table.tsx similarity index 100% rename from sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/data-table.tsx rename to sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/data-table.tsx diff --git a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/invite-user.tsx b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/invite-user.tsx similarity index 97% rename from sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/invite-user.tsx rename to sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/invite-user.tsx index 3767b51..5f1158e 100644 --- a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/invite-user.tsx +++ b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/invite-user.tsx @@ -14,7 +14,7 @@ import { Label } from "@/app/_components/ui/label"; import { Input } from "@/app/_components/ui/input"; import { Textarea } from "@/app/_components/ui/textarea"; import { useMutation } from "@tanstack/react-query"; -import { inviteUser } from "@/app/(protected)/(admin)/dashboard/user-management/action"; +import { inviteUser } from "@/app/(pages)/(admin)/dashboard/user-management/action"; import { toast } from "sonner"; interface InviteUserDialogProps { diff --git a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/profile-form.tsx b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/profile-form.tsx similarity index 98% rename from sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/profile-form.tsx rename to sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/profile-form.tsx index 609e231..06c1824 100644 --- a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/profile-form.tsx +++ b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/profile-form.tsx @@ -6,7 +6,7 @@ import { useState, useRef } from "react"; import { z } from "zod"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; -import type { User } from "@/src/models/users/users.model"; +import type { User } from "@/src/entities/models/users/users.model"; import { Form, @@ -27,7 +27,7 @@ import { Textarea } from "@/app/_components/ui/textarea"; import { Button } from "@/app/_components/ui/button"; import { Label } from "@/app/_components/ui/label"; import { ImageIcon, Loader2 } from "lucide-react"; -import { createClient } from "@/utils/supabase/client"; +import { createClient } from "@/app/_utils/supabase/client"; // Profile update form schema const profileFormSchema = z.object({ diff --git a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/sheet.tsx b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/sheet.tsx similarity index 99% rename from sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/sheet.tsx rename to sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/sheet.tsx index 21dbb32..08ee9a8 100644 --- a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/sheet.tsx +++ b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/sheet.tsx @@ -38,7 +38,7 @@ import { sendMagicLink, sendPasswordRecovery, unbanUser, -} from "@/app/(protected)/(admin)/dashboard/user-management/action"; +} from "@/app/(pages)/(admin)/dashboard/user-management/action"; import { format } from "date-fns"; interface UserDetailSheetProps { diff --git a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/update-user.tsx b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/update-user.tsx similarity index 79% rename from sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/update-user.tsx rename to sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/update-user.tsx index a775e47..712a164 100644 --- a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/update-user.tsx +++ b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/update-user.tsx @@ -1,20 +1,15 @@ -import type React from "react" - -import { useState } from "react" import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" import type * as z from "zod" import { Loader2 } from "lucide-react" -import { UpdateUserParamsSchema, type User, UserSchema } from "@/src/models/users/users.model" +import { UpdateUserParamsSchema, type User } from "@/src/entities/models/users/users.model" // UI Components import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from "@/app/_components/ui/sheet" -import { - Form, -} from "@/app/_components/ui/form" +import { Form } from "@/app/_components/ui/form" import { Button } from "@/app/_components/ui/button" import { FormSection } from "@/app/_components/form-section" @@ -22,8 +17,6 @@ import { FormFieldWrapper } from "@/app/_components/form-wrapper" import { useMutation } from "@tanstack/react-query" import { updateUser } from "../action" import { toast } from "sonner" -import { DateTimePicker2 } from "@/app/_components/ui/date-picker" - type UserProfileFormValues = z.infer @@ -31,33 +24,33 @@ interface UserProfileSheetProps { open: boolean onOpenChange: (open: boolean) => void userData?: User + onUserUpdated: () => void } -export function UserProfileSheet({ open, onOpenChange, userData }: UserProfileSheetProps) { - const [isSaving, setIsSaving] = useState(false) +export function UserProfileSheet({ open, onOpenChange, userData, onUserUpdated }: UserProfileSheetProps) { // Initialize form with user data const form = useForm({ resolver: zodResolver(UpdateUserParamsSchema), defaultValues: { - email: userData?.email || "", - password_hash: userData?.password_hash || "", + email: userData?.email || undefined, + encrypted_password: userData?.encrypted_password || undefined, role: (userData?.role as "user" | "staff" | "admin") || "user", - phone: userData?.phone || "", + phone: userData?.phone || undefined, invited_at: userData?.invited_at || undefined, confirmed_at: userData?.confirmed_at || undefined, - recovery_sent_at: userData?.recovery_sent_at || undefined, + // recovery_sent_at: userData?.recovery_sent_at || undefined, last_sign_in_at: userData?.last_sign_in_at || undefined, created_at: userData?.created_at || undefined, updated_at: userData?.updated_at || undefined, is_anonymous: userData?.is_anonymous || false, profile: { - id: userData?.profile?.id || "", - user_id: userData?.profile?.user_id || "", - avatar: userData?.profile?.avatar || "", - username: userData?.profile?.username || "", - first_name: userData?.profile?.first_name || "", - last_name: userData?.profile?.last_name || "", - bio: userData?.profile?.bio || "", + id: userData?.profile?.id || undefined, + user_id: userData?.profile?.user_id || undefined, + avatar: userData?.profile?.avatar || undefined, + username: userData?.profile?.username || undefined, + first_name: userData?.profile?.first_name || undefined, + last_name: userData?.profile?.last_name || undefined, + bio: userData?.profile?.bio || undefined, address: userData?.profile?.address || { street: "", city: "", @@ -74,27 +67,26 @@ export function UserProfileSheet({ open, onOpenChange, userData }: UserProfileSh mutationKey: ["updateUser"], mutationFn: (data: UserProfileFormValues) => { if (!userData?.id) { - throw new Error("User ID is required"); + throw new Error("User ID is required") } - return updateUser(userData.id, data); + return updateUser(userData.id, data) }, onError: (error) => { - toast("Failed to update user"); + toast("Failed to update user") + onOpenChange(false) }, onSuccess: () => { - toast("User updated"); + toast("User updated") + onUserUpdated() + onOpenChange(false) }, }) async function onSubmit(data: UserProfileFormValues) { try { - setIsSaving(true) await updateUserMutation(data) - onOpenChange(false) } catch (error) { console.error("Error saving user profile:", error) - } finally { - setIsSaving(false) } } @@ -113,7 +105,6 @@ export function UserProfileSheet({ open, onOpenChange, userData }: UserProfileSh title="User Information" description="Update the user information below. Fields marked with an asterisk (*) are required." > - - + - - - + + {/* Profile Information Section */} @@ -288,11 +260,17 @@ export function UserProfileSheet({ open, onOpenChange, userData }: UserProfileSh {/* Action Buttons */}
-
diff --git a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/user-form.tsx b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/user-form.tsx similarity index 100% rename from sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/user-form.tsx rename to sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/user-form.tsx diff --git a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/user-management.tsx b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/user-management.tsx similarity index 99% rename from sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/user-management.tsx rename to sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/user-management.tsx index df179ca..5f5fce3 100644 --- a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/user-management.tsx +++ b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/user-management.tsx @@ -26,8 +26,8 @@ import { DropdownMenuCheckboxItem, } from "@/app/_components/ui/dropdown-menu"; import { keepPreviousData, useQuery } from "@tanstack/react-query"; -import { fetchUsers } from "@/app/(protected)/(admin)/dashboard/user-management/action"; -import type { User } from "@/src/models/users/users.model"; +import { fetchUsers } from "@/app/(pages)/(admin)/dashboard/user-management/action"; +import type { User } from "@/src/entities/models/users/users.model"; import { DataTable } from "./data-table"; import { InviteUserDialog } from "./invite-user"; import { AddUserDialog } from "./add-user-dialog"; @@ -668,7 +668,7 @@ export default function UserManagement() { open={isUpdateOpen} onOpenChange={setIsUpdateOpen} userData={updateUser} - + onUserUpdated={() => refetch()} /> )} diff --git a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/user-stats.tsx b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/user-stats.tsx similarity index 94% rename from sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/user-stats.tsx rename to sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/user-stats.tsx index 80b8881..b5a20d0 100644 --- a/sigap-website/app/(protected)/(admin)/dashboard/user-management/_components/user-stats.tsx +++ b/sigap-website/app/(pages)/(admin)/dashboard/user-management/_components/user-stats.tsx @@ -3,8 +3,8 @@ import { useQuery } from "@tanstack/react-query"; import { Card, CardContent } from "@/app/_components/ui/card"; import { Users, UserCheck, UserX } from "lucide-react"; -import { fetchUsers } from "@/app/(protected)/(admin)/dashboard/user-management/action"; -import { User } from "@/src/models/users/users.model"; +import { fetchUsers } from "@/app/(pages)/(admin)/dashboard/user-management/action"; +import { User } from "@/src/entities/models/users/users.model"; import { useNavigations } from "@/app/_hooks/use-navigations"; import { useEffect, useState } from "react"; import { toast } from "sonner"; diff --git a/sigap-website/app/(protected)/(admin)/dashboard/user-management/action.ts b/sigap-website/app/(pages)/(admin)/dashboard/user-management/action.ts similarity index 91% rename from sigap-website/app/(protected)/(admin)/dashboard/user-management/action.ts rename to sigap-website/app/(pages)/(admin)/dashboard/user-management/action.ts index e26d50d..1272c10 100644 --- a/sigap-website/app/(protected)/(admin)/dashboard/user-management/action.ts +++ b/sigap-website/app/(pages)/(admin)/dashboard/user-management/action.ts @@ -1,15 +1,15 @@ "use server"; -import db from "@/lib/db"; +import db from "@/prisma/db"; import { CreateUserParams, InviteUserParams, UpdateUserParams, User, UserResponse, -} from "@/src/models/users/users.model"; -import { createClient } from "@/utils/supabase/server"; -import { createAdminClient } from "@/utils/supabase/admin"; +} from "@/src/entities/models/users/users.model"; +import { createClient } from "@/app/_utils/supabase/server"; +import { createAdminClient } from "@/app/_utils/supabase/admin"; // Initialize Supabase client with admin key @@ -84,7 +84,7 @@ export async function createUser( const { data, error } = await supabase.auth.admin.createUser({ email: params.email, - password: params.password, + password: params.encrypted_password, phone: params.phone, email_confirm: params.email_confirm, }); @@ -163,8 +163,8 @@ export async function updateUser( const { data, error } = await supabase.auth.admin.updateUserById(userId, { email: params.email, email_confirm: params.email_confirmed_at, - password: params.password_hash ?? undefined, - password_hash: params.password_hash ?? undefined, + password: params.encrypted_password ?? undefined, + password_hash: params.encrypted_password ?? undefined, phone: params.phone, phone_confirm: params.phone_confirmed_at, role: params.role, @@ -196,13 +196,13 @@ export async function updateUser( }, data: { role: params.role || user.role, - invited_at: params.invited_at || user.role, - confirmed_at: params.confirmed_at || user.role, - recovery_sent_at: params.recovery_sent_at || user.role, - last_sign_in_at: params.last_sign_in_at || user.role, + invited_at: params.invited_at || user.invited_at, + confirmed_at: params.confirmed_at || user.confirmed_at, + // recovery_sent_at: params.recovery_sent_at || user.recovery_sent_at, + last_sign_in_at: params.last_sign_in_at || user.last_sign_in_at, is_anonymous: params.is_anonymous || user.is_anonymous, - created_at: params.created_at || user.role, - updated_at: params.updated_at || user.role, + created_at: params.created_at || user.created_at, + updated_at: params.updated_at || user.updated_at, profile: { update: { avatar: params.profile?.avatar || user.profile?.avatar, diff --git a/sigap-website/app/(protected)/(admin)/dashboard/user-management/page.tsx b/sigap-website/app/(pages)/(admin)/dashboard/user-management/page.tsx similarity index 78% rename from sigap-website/app/(protected)/(admin)/dashboard/user-management/page.tsx rename to sigap-website/app/(pages)/(admin)/dashboard/user-management/page.tsx index babdeb3..9665f25 100644 --- a/sigap-website/app/(protected)/(admin)/dashboard/user-management/page.tsx +++ b/sigap-website/app/(pages)/(admin)/dashboard/user-management/page.tsx @@ -1,5 +1,5 @@ -import UserManagement from "@/app/(protected)/(admin)/dashboard/user-management/_components/user-management"; -import { UserStats } from "@/app/(protected)/(admin)/dashboard/user-management/_components/user-stats"; +import UserManagement from "@/app/(pages)/(admin)/dashboard/user-management/_components/user-management"; +import { UserStats } from "@/app/(pages)/(admin)/dashboard/user-management/_components/user-stats"; export default function UsersPage() { return ( diff --git a/sigap-website/app/(protected)/(admin)/layout.tsx b/sigap-website/app/(pages)/(admin)/layout.tsx similarity index 95% rename from sigap-website/app/(protected)/(admin)/layout.tsx rename to sigap-website/app/(pages)/(admin)/layout.tsx index 1a2809b..f433106 100644 --- a/sigap-website/app/(protected)/(admin)/layout.tsx +++ b/sigap-website/app/(pages)/(admin)/layout.tsx @@ -26,8 +26,8 @@ import { ThemeSwitcher } from "@/app/_components/theme-switcher"; import { Separator } from "@/app/_components/ui/separator"; import { InboxDrawer } from "@/app/_components/inbox-drawer"; import FloatingActionSearchBar from "@/app/_components/floating-action-search-bar"; -import { AppSidebar } from "@/app/(protected)/(admin)/_components/admin/app-sidebar"; -import { createClient } from "@/utils/supabase/server"; +import { AppSidebar } from "@/app/(pages)/(admin)/_components/app-sidebar"; +import { createClient } from "@/app/_utils/supabase/server"; import { redirect } from "next/navigation"; export default async function Layout({ diff --git a/sigap-website/app/_components/auth/signin-form.tsx b/sigap-website/app/(pages)/(auth)/_components/signin-form.tsx similarity index 93% rename from sigap-website/app/_components/auth/signin-form.tsx rename to sigap-website/app/(pages)/(auth)/_components/signin-form.tsx index 13de2c7..5a67c14 100644 --- a/sigap-website/app/_components/auth/signin-form.tsx +++ b/sigap-website/app/(pages)/(auth)/_components/signin-form.tsx @@ -3,11 +3,11 @@ import type React from "react"; import { Lock } from "lucide-react"; -import { Button } from "../ui/button"; -import { Input } from "../ui/input"; -import { SubmitButton } from "../submit-button"; +import { Button } from "../../../_components/ui/button"; +import { Input } from "../../../_components/ui/input"; +import { SubmitButton } from "../../../_components/submit-button"; import Link from "next/link"; -import { FormField } from "../form-field"; +import { FormField } from "../../../_components/form-field"; import { useSignInForm } from "@/src/controller/auth/sign-in-controller"; export function SignInForm({ diff --git a/sigap-website/app/_components/auth/verify-otp-form.tsx b/sigap-website/app/(pages)/(auth)/_components/verify-otp-form.tsx similarity index 98% rename from sigap-website/app/_components/auth/verify-otp-form.tsx rename to sigap-website/app/(pages)/(auth)/_components/verify-otp-form.tsx index 5e46100..5a08624 100644 --- a/sigap-website/app/_components/auth/verify-otp-form.tsx +++ b/sigap-website/app/(pages)/(auth)/_components/verify-otp-form.tsx @@ -23,7 +23,7 @@ import { CardHeader, CardTitle, } from "@/app/_components/ui/card"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/_lib/utils"; import { useVerifyOtpForm } from "@/src/controller/auth/verify-otp.controller"; interface VerifyOtpFormProps extends React.HTMLAttributes {} diff --git a/sigap-website/app/(auth-pages)/action.ts b/sigap-website/app/(pages)/(auth)/action.ts similarity index 83% rename from sigap-website/app/(auth-pages)/action.ts rename to sigap-website/app/(pages)/(auth)/action.ts index f90cfc1..78e12b8 100644 --- a/sigap-website/app/(auth-pages)/action.ts +++ b/sigap-website/app/(pages)/(auth)/action.ts @@ -1,12 +1,12 @@ -// src/app/(auth-pages)/actions.ts +// src/app/(auth)/actions.ts "use server"; -import db from "@/lib/db"; -import { SignInFormData } from "@/src/models/auth/sign-in.model"; -import { VerifyOtpFormData } from "@/src/models/auth/verify-otp.model"; -import { User } from "@/src/models/users/users.model"; +import db from "@/prisma/db"; +import { SignInFormData } from "@/src/entities/models/auth/sign-in.model"; +import { VerifyOtpFormData } from "@/src/entities/models/auth/verify-otp.model"; +import { User } from "@/src/entities/models/users/users.model"; import { authRepository } from "@/src/repositories/authentication.repository"; -import { createClient } from "@/utils/supabase/server"; +import { createClient } from "@/app/_utils/supabase/server"; import { redirect } from "next/navigation"; export async function signIn( diff --git a/sigap-website/app/(auth-pages)/layout.tsx b/sigap-website/app/(pages)/(auth)/layout.tsx similarity index 88% rename from sigap-website/app/(auth-pages)/layout.tsx rename to sigap-website/app/(pages)/(auth)/layout.tsx index 61b4de1..7da4018 100644 --- a/sigap-website/app/(auth-pages)/layout.tsx +++ b/sigap-website/app/(pages)/(auth)/layout.tsx @@ -1,6 +1,6 @@ import { redirect } from "next/navigation"; import { checkSession } from "./_actions/session"; -import { createClient } from "@/utils/supabase/client"; +import { createClient } from "@/app/_utils/supabase/client"; export default async function Layout({ children, diff --git a/sigap-website/app/(auth-pages)/sign-in/page.tsx b/sigap-website/app/(pages)/(auth)/sign-in/page.tsx similarity index 96% rename from sigap-website/app/(auth-pages)/sign-in/page.tsx rename to sigap-website/app/(pages)/(auth)/sign-in/page.tsx index 7eac1f3..4bea82a 100644 --- a/sigap-website/app/(auth-pages)/sign-in/page.tsx +++ b/sigap-website/app/(pages)/(auth)/sign-in/page.tsx @@ -1,4 +1,4 @@ -import { SignInForm } from "@/app/_components/auth/signin-form"; +import { SignInForm } from "@/app/(pages)/(auth)/_components/signin-form"; import { Message } from "@/app/_components/form-message"; import { Button } from "@/app/_components/ui/button"; import { GalleryVerticalEnd, Globe } from "lucide-react"; diff --git a/sigap-website/app/(auth-pages)/smtp-message.tsx b/sigap-website/app/(pages)/(auth)/smtp-message.tsx similarity index 100% rename from sigap-website/app/(auth-pages)/smtp-message.tsx rename to sigap-website/app/(pages)/(auth)/smtp-message.tsx diff --git a/sigap-website/app/(auth-pages)/verify-otp/page.tsx b/sigap-website/app/(pages)/(auth)/verify-otp/page.tsx similarity index 90% rename from sigap-website/app/(auth-pages)/verify-otp/page.tsx rename to sigap-website/app/(pages)/(auth)/verify-otp/page.tsx index f04dd62..1d5679a 100644 --- a/sigap-website/app/(auth-pages)/verify-otp/page.tsx +++ b/sigap-website/app/(pages)/(auth)/verify-otp/page.tsx @@ -1,4 +1,4 @@ -import { VerifyOtpForm } from "@/app/_components/auth/verify-otp-form"; +import { VerifyOtpForm } from "@/app/(pages)/(auth)/_components/verify-otp-form"; import { GalleryVerticalEnd } from "lucide-react"; export default async function VerifyOtpPage() { diff --git a/sigap-website/app/layout.tsx b/sigap-website/app/(pages)/layout.tsx similarity index 86% rename from sigap-website/app/layout.tsx rename to sigap-website/app/(pages)/layout.tsx index 21e4d5e..acecc6d 100644 --- a/sigap-website/app/layout.tsx +++ b/sigap-website/app/(pages)/layout.tsx @@ -1,13 +1,7 @@ -import DeployButton from "@/app/_components/deploy-button"; -import { EnvVarWarning } from "@/app/_components/env-var-warning"; -import HeaderAuth from "@/app/_components/header-auth"; -import { ThemeSwitcher } from "@/app/_components/theme-switcher"; -import { hasEnvVars } from "@/utils/supabase/check-env-vars"; import { Geist } from "next/font/google"; import { ThemeProvider } from "next-themes"; -import Link from "next/link"; -import "./globals.css"; -import ReactQueryProvider from "@/providers/react-query-provider"; +import "@/app/_styles/globals.css"; +import ReactQueryProvider from "@/app/_lib/react-query-provider"; import { Toaster } from "@/app/_components/ui/sonner"; const defaultUrl = process.env.VERCEL_URL diff --git a/sigap-website/app/page.tsx b/sigap-website/app/(pages)/page.tsx similarity index 88% rename from sigap-website/app/page.tsx rename to sigap-website/app/(pages)/page.tsx index 0a65542..18ef7fc 100644 --- a/sigap-website/app/page.tsx +++ b/sigap-website/app/(pages)/page.tsx @@ -1,7 +1,7 @@ import Hero from "@/app/_components/hero"; import ConnectSupabaseSteps from "@/app/_components/tutorial/connect-supabase-steps"; import SignUpUserSteps from "@/app/_components/tutorial/sign-up-user-steps"; -import { hasEnvVars } from "@/utils/supabase/check-env-vars"; +import { hasEnvVars } from "@/app/_utils/supabase/check-env-vars"; export default async function Home() { return ( diff --git a/sigap-website/app/(protected)/page.tsx b/sigap-website/app/(protected)/page.tsx deleted file mode 100644 index e77fe00..0000000 --- a/sigap-website/app/(protected)/page.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import FetchDataSteps from "@/app/_components/tutorial/fetch-data-steps"; -import db from "@/lib/db"; -import { createClient } from "@/utils/supabase/server"; -import { InfoIcon } from "lucide-react"; -import { redirect } from "next/navigation"; - -export default async function ProtectedPage() { - const supabase = await createClient(); - - const { - data: { user }, - } = await supabase.auth.getUser(); - - if (!user) { - return redirect("/sign-in"); - } - - const userDetail = await db.users.findUnique({ - where: { - id: user.id, - }, - }); - - return ( -
-
-
- - This is a protected page that you can only see as an authenticated - user -
-
-
-

Your user details

-
-          {JSON.stringify(userDetail, null, 2)}
-        
-
-          {JSON.stringify(user, null, 2)}
-        
-
-
-

Next steps

- -
-
- ); -} diff --git a/sigap-website/app/_components/custom-dropdown-switcher.tsx b/sigap-website/app/_components/custom-dropdown-switcher.tsx index 2e4e67b..3f82025 100644 --- a/sigap-website/app/_components/custom-dropdown-switcher.tsx +++ b/sigap-website/app/_components/custom-dropdown-switcher.tsx @@ -18,7 +18,7 @@ import { } from "@/app/_components/ui/dropdown-menu"; import { Badge } from "@/app/_components/ui/badge"; import { Input } from "@/app/_components/ui/input"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/_lib/utils"; type Option = { value: T; diff --git a/sigap-website/app/_components/date-time-picker.tsx b/sigap-website/app/_components/date-time-picker.tsx index 2fdfed9..c6c268d 100644 --- a/sigap-website/app/_components/date-time-picker.tsx +++ b/sigap-website/app/_components/date-time-picker.tsx @@ -5,7 +5,7 @@ import { ChevronLeft, ChevronRight, Clock } from "lucide-react" import { DayPicker } from "react-day-picker" import { useVirtualizer } from "@tanstack/react-virtual" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/app/_components/ui/select" import { Input } from "@/app/_components/ui/input" import { Button } from "@/app/_components/ui/button" diff --git a/sigap-website/app/_components/form-wrapper.tsx b/sigap-website/app/_components/form-wrapper.tsx index cc941bf..b7259e4 100644 --- a/sigap-website/app/_components/form-wrapper.tsx +++ b/sigap-website/app/_components/form-wrapper.tsx @@ -1,7 +1,7 @@ "use client" import { format } from "date-fns" import { CalendarIcon, ChevronLeft, ChevronRight } from "lucide-react" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" // UI Components import { FormControl, FormField, FormItem, FormLabel, FormMessage, FormDescription } from "@/app/_components/ui/form" diff --git a/sigap-website/app/_components/header-auth.tsx b/sigap-website/app/_components/header-auth.tsx index 2571060..8d1006d 100644 --- a/sigap-website/app/_components/header-auth.tsx +++ b/sigap-website/app/_components/header-auth.tsx @@ -1,10 +1,10 @@ -import { hasEnvVars } from "@/utils/supabase/check-env-vars"; +import { hasEnvVars } from "@/app/_utils/supabase/check-env-vars"; import Link from "next/link"; import { Badge } from "./ui/badge"; import { Button } from "./ui/button"; -import { createClient } from "@/utils/supabase/server"; -import { signOutAction } from "@/app/(auth-pages)/_actions/sign-out"; +import { createClient } from "@/app/_utils/supabase/server"; +import { signOutAction } from "@/app/(pages)/(auth)/_actions/sign-out"; export default async function AuthButton() { const supabase = await createClient(); diff --git a/sigap-website/app/_components/ui/alert-dialog.tsx b/sigap-website/app/_components/ui/alert-dialog.tsx index 837a31e..d8e85fb 100644 --- a/sigap-website/app/_components/ui/alert-dialog.tsx +++ b/sigap-website/app/_components/ui/alert-dialog.tsx @@ -3,7 +3,7 @@ import * as React from "react"; import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/_lib/utils"; import { buttonVariants } from "@/app/_components/ui/button"; const AlertDialog = AlertDialogPrimitive.Root; diff --git a/sigap-website/app/_components/ui/avatar.tsx b/sigap-website/app/_components/ui/avatar.tsx index 51e507b..87ea84c 100644 --- a/sigap-website/app/_components/ui/avatar.tsx +++ b/sigap-website/app/_components/ui/avatar.tsx @@ -3,7 +3,7 @@ import * as React from "react" import * as AvatarPrimitive from "@radix-ui/react-avatar" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const Avatar = React.forwardRef< React.ElementRef, diff --git a/sigap-website/app/_components/ui/badge.tsx b/sigap-website/app/_components/ui/badge.tsx index d3d5d60..3a9de94 100644 --- a/sigap-website/app/_components/ui/badge.tsx +++ b/sigap-website/app/_components/ui/badge.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/_lib/utils"; const badgeVariants = cva( "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", diff --git a/sigap-website/app/_components/ui/breadcrumb.tsx b/sigap-website/app/_components/ui/breadcrumb.tsx index 60e6c96..6727885 100644 --- a/sigap-website/app/_components/ui/breadcrumb.tsx +++ b/sigap-website/app/_components/ui/breadcrumb.tsx @@ -2,7 +2,7 @@ import * as React from "react" import { Slot } from "@radix-ui/react-slot" import { ChevronRight, MoreHorizontal } from "lucide-react" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const Breadcrumb = React.forwardRef< HTMLElement, diff --git a/sigap-website/app/_components/ui/button.tsx b/sigap-website/app/_components/ui/button.tsx index cd5e648..5578f04 100644 --- a/sigap-website/app/_components/ui/button.tsx +++ b/sigap-website/app/_components/ui/button.tsx @@ -2,7 +2,7 @@ import * as React from "react" import { Slot } from "@radix-ui/react-slot" import { cva, type VariantProps } from "class-variance-authority" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const buttonVariants = cva( "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", diff --git a/sigap-website/app/_components/ui/calendar.tsx b/sigap-website/app/_components/ui/calendar.tsx index e37994c..dfbf538 100644 --- a/sigap-website/app/_components/ui/calendar.tsx +++ b/sigap-website/app/_components/ui/calendar.tsx @@ -4,7 +4,7 @@ import * as React from "react"; import { ChevronLeft, ChevronRight } from "lucide-react"; import { DayPicker } from "react-day-picker"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/_lib/utils"; import { buttonVariants } from "@/app/_components/ui/button"; export type CalendarProps = React.ComponentProps; diff --git a/sigap-website/app/_components/ui/card.tsx b/sigap-website/app/_components/ui/card.tsx index f62edea..45414d2 100644 --- a/sigap-website/app/_components/ui/card.tsx +++ b/sigap-website/app/_components/ui/card.tsx @@ -1,6 +1,6 @@ import * as React from "react" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const Card = React.forwardRef< HTMLDivElement, diff --git a/sigap-website/app/_components/ui/checkbox.tsx b/sigap-website/app/_components/ui/checkbox.tsx index 5985e3c..55c0fbf 100644 --- a/sigap-website/app/_components/ui/checkbox.tsx +++ b/sigap-website/app/_components/ui/checkbox.tsx @@ -4,7 +4,7 @@ import * as React from "react"; import * as CheckboxPrimitive from "@radix-ui/react-checkbox"; import { Check } from "lucide-react"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/_lib/utils"; const Checkbox = React.forwardRef< React.ElementRef, diff --git a/sigap-website/app/_components/ui/date-picker.tsx b/sigap-website/app/_components/ui/date-picker.tsx index 3cdbace..868e72a 100644 --- a/sigap-website/app/_components/ui/date-picker.tsx +++ b/sigap-website/app/_components/ui/date-picker.tsx @@ -4,7 +4,7 @@ import * as React from "react" import { format, getMonth, getYear, setMonth, setYear, setHours, setMinutes, setSeconds } from "date-fns" import { Calendar as CalendarIcon, Clock } from "lucide-react" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" import { Button } from "@/app/_components/ui/button" import { Calendar } from "@/app/_components/ui/calendar" import { diff --git a/sigap-website/app/_components/ui/dialog.tsx b/sigap-website/app/_components/ui/dialog.tsx index 42b363d..e9ca648 100644 --- a/sigap-website/app/_components/ui/dialog.tsx +++ b/sigap-website/app/_components/ui/dialog.tsx @@ -4,7 +4,7 @@ import * as React from "react"; import * as DialogPrimitive from "@radix-ui/react-dialog"; import { X } from "lucide-react"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/_lib/utils"; const Dialog = DialogPrimitive.Root; diff --git a/sigap-website/app/_components/ui/drawer.tsx b/sigap-website/app/_components/ui/drawer.tsx index 6a0ef53..a7ccc55 100644 --- a/sigap-website/app/_components/ui/drawer.tsx +++ b/sigap-website/app/_components/ui/drawer.tsx @@ -3,7 +3,7 @@ import * as React from "react" import { Drawer as DrawerPrimitive } from "vaul" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const Drawer = ({ shouldScaleBackground = true, diff --git a/sigap-website/app/_components/ui/dropdown-menu.tsx b/sigap-website/app/_components/ui/dropdown-menu.tsx index 3a0c7fe..410c3e4 100644 --- a/sigap-website/app/_components/ui/dropdown-menu.tsx +++ b/sigap-website/app/_components/ui/dropdown-menu.tsx @@ -4,7 +4,7 @@ import * as React from "react"; import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; import { Check, ChevronRight, Circle } from "lucide-react"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/_lib/utils"; const DropdownMenu = DropdownMenuPrimitive.Root; diff --git a/sigap-website/app/_components/ui/form.tsx b/sigap-website/app/_components/ui/form.tsx index 6b1d3ca..8127efc 100644 --- a/sigap-website/app/_components/ui/form.tsx +++ b/sigap-website/app/_components/ui/form.tsx @@ -12,7 +12,7 @@ import { useFormContext, } from "react-hook-form"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/_lib/utils"; import { Label } from "@/app/_components/ui/label"; const Form = FormProvider; diff --git a/sigap-website/app/_components/ui/input-otp.tsx b/sigap-website/app/_components/ui/input-otp.tsx index f66fcfa..dd4bcc9 100644 --- a/sigap-website/app/_components/ui/input-otp.tsx +++ b/sigap-website/app/_components/ui/input-otp.tsx @@ -4,7 +4,7 @@ import * as React from "react" import { OTPInput, OTPInputContext } from "input-otp" import { Dot } from "lucide-react" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const InputOTP = React.forwardRef< React.ElementRef, diff --git a/sigap-website/app/_components/ui/input.tsx b/sigap-website/app/_components/ui/input.tsx index 68551b9..30f87d4 100644 --- a/sigap-website/app/_components/ui/input.tsx +++ b/sigap-website/app/_components/ui/input.tsx @@ -1,6 +1,6 @@ import * as React from "react" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const Input = React.forwardRef>( ({ className, type, ...props }, ref) => { diff --git a/sigap-website/app/_components/ui/label.tsx b/sigap-website/app/_components/ui/label.tsx index 5341821..4417d56 100644 --- a/sigap-website/app/_components/ui/label.tsx +++ b/sigap-website/app/_components/ui/label.tsx @@ -4,7 +4,7 @@ import * as React from "react" import * as LabelPrimitive from "@radix-ui/react-label" import { cva, type VariantProps } from "class-variance-authority" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const labelVariants = cva( "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" diff --git a/sigap-website/app/_components/ui/popover.tsx b/sigap-website/app/_components/ui/popover.tsx index a0ec48b..f9e6555 100644 --- a/sigap-website/app/_components/ui/popover.tsx +++ b/sigap-website/app/_components/ui/popover.tsx @@ -3,7 +3,7 @@ import * as React from "react" import * as PopoverPrimitive from "@radix-ui/react-popover" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const Popover = PopoverPrimitive.Root diff --git a/sigap-website/app/_components/ui/scroll-area.tsx b/sigap-website/app/_components/ui/scroll-area.tsx index e3d4e8c..2a0ebdf 100644 --- a/sigap-website/app/_components/ui/scroll-area.tsx +++ b/sigap-website/app/_components/ui/scroll-area.tsx @@ -3,7 +3,7 @@ import * as React from "react"; import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/_lib/utils"; const ScrollArea = React.forwardRef< React.ElementRef, diff --git a/sigap-website/app/_components/ui/select.tsx b/sigap-website/app/_components/ui/select.tsx index c104533..9b15b75 100644 --- a/sigap-website/app/_components/ui/select.tsx +++ b/sigap-website/app/_components/ui/select.tsx @@ -4,7 +4,7 @@ import * as React from "react" import * as SelectPrimitive from "@radix-ui/react-select" import { Check, ChevronDown, ChevronUp } from "lucide-react" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const Select = SelectPrimitive.Root diff --git a/sigap-website/app/_components/ui/separator.tsx b/sigap-website/app/_components/ui/separator.tsx index 12d81c4..5ba3422 100644 --- a/sigap-website/app/_components/ui/separator.tsx +++ b/sigap-website/app/_components/ui/separator.tsx @@ -3,7 +3,7 @@ import * as React from "react" import * as SeparatorPrimitive from "@radix-ui/react-separator" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const Separator = React.forwardRef< React.ElementRef, diff --git a/sigap-website/app/_components/ui/sheet.tsx b/sigap-website/app/_components/ui/sheet.tsx index 272cb72..df15869 100644 --- a/sigap-website/app/_components/ui/sheet.tsx +++ b/sigap-website/app/_components/ui/sheet.tsx @@ -5,7 +5,7 @@ import * as SheetPrimitive from "@radix-ui/react-dialog" import { cva, type VariantProps } from "class-variance-authority" import { X } from "lucide-react" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const Sheet = SheetPrimitive.Root diff --git a/sigap-website/app/_components/ui/sidebar.tsx b/sigap-website/app/_components/ui/sidebar.tsx index 5bd92a5..72e84a4 100644 --- a/sigap-website/app/_components/ui/sidebar.tsx +++ b/sigap-website/app/_components/ui/sidebar.tsx @@ -6,7 +6,7 @@ import { VariantProps, cva } from "class-variance-authority"; import { PanelLeft } from "lucide-react"; import { useIsMobile } from "@/app/_hooks/use-mobile"; -import { cn } from "@/lib/utils"; +import { cn } from "@/app/_lib/utils"; import { Button } from "@/app/_components/ui/button"; import { Input } from "@/app/_components/ui/input"; import { Separator } from "@/app/_components/ui/separator"; diff --git a/sigap-website/app/_components/ui/skeleton.tsx b/sigap-website/app/_components/ui/skeleton.tsx index d7e45f7..2efd075 100644 --- a/sigap-website/app/_components/ui/skeleton.tsx +++ b/sigap-website/app/_components/ui/skeleton.tsx @@ -1,4 +1,4 @@ -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" function Skeleton({ className, diff --git a/sigap-website/app/_components/ui/switch.tsx b/sigap-website/app/_components/ui/switch.tsx index bc69cf2..d9f4284 100644 --- a/sigap-website/app/_components/ui/switch.tsx +++ b/sigap-website/app/_components/ui/switch.tsx @@ -3,7 +3,7 @@ import * as React from "react" import * as SwitchPrimitives from "@radix-ui/react-switch" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const Switch = React.forwardRef< React.ElementRef, diff --git a/sigap-website/app/_components/ui/table.tsx b/sigap-website/app/_components/ui/table.tsx index 7f3502f..752f053 100644 --- a/sigap-website/app/_components/ui/table.tsx +++ b/sigap-website/app/_components/ui/table.tsx @@ -1,6 +1,6 @@ import * as React from "react" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const Table = React.forwardRef< HTMLTableElement, diff --git a/sigap-website/app/_components/ui/tabs.tsx b/sigap-website/app/_components/ui/tabs.tsx index 26eb109..92c13f9 100644 --- a/sigap-website/app/_components/ui/tabs.tsx +++ b/sigap-website/app/_components/ui/tabs.tsx @@ -3,7 +3,7 @@ import * as React from "react" import * as TabsPrimitive from "@radix-ui/react-tabs" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const Tabs = TabsPrimitive.Root diff --git a/sigap-website/app/_components/ui/textarea.tsx b/sigap-website/app/_components/ui/textarea.tsx index e56b0af..c7d5390 100644 --- a/sigap-website/app/_components/ui/textarea.tsx +++ b/sigap-website/app/_components/ui/textarea.tsx @@ -1,6 +1,6 @@ import * as React from "react" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const Textarea = React.forwardRef< HTMLTextAreaElement, diff --git a/sigap-website/app/_components/ui/tooltip.tsx b/sigap-website/app/_components/ui/tooltip.tsx index 30fc44d..b22ce05 100644 --- a/sigap-website/app/_components/ui/tooltip.tsx +++ b/sigap-website/app/_components/ui/tooltip.tsx @@ -3,7 +3,7 @@ import * as React from "react" import * as TooltipPrimitive from "@radix-ui/react-tooltip" -import { cn } from "@/lib/utils" +import { cn } from "@/app/_lib/utils" const TooltipProvider = TooltipPrimitive.Provider diff --git a/sigap-website/providers/react-query-provider.tsx b/sigap-website/app/_lib/react-query-provider.tsx similarity index 100% rename from sigap-website/providers/react-query-provider.tsx rename to sigap-website/app/_lib/react-query-provider.tsx diff --git a/sigap-website/lib/utils.ts b/sigap-website/app/_lib/utils.ts similarity index 100% rename from sigap-website/lib/utils.ts rename to sigap-website/app/_lib/utils.ts diff --git a/sigap-website/app/globals.css b/sigap-website/app/_styles/globals.css similarity index 100% rename from sigap-website/app/globals.css rename to sigap-website/app/_styles/globals.css diff --git a/sigap-website/utils/cookies-manager.ts b/sigap-website/app/_utils/cookies/cookies-manager.ts similarity index 100% rename from sigap-website/utils/cookies-manager.ts rename to sigap-website/app/_utils/cookies/cookies-manager.ts diff --git a/sigap-website/utils/notification-cookies-manager.ts b/sigap-website/app/_utils/cookies/notification-cookies-manager.ts similarity index 100% rename from sigap-website/utils/notification-cookies-manager.ts rename to sigap-website/app/_utils/cookies/notification-cookies-manager.ts diff --git a/sigap-website/utils/supabase/admin.ts b/sigap-website/app/_utils/supabase/admin.ts similarity index 100% rename from sigap-website/utils/supabase/admin.ts rename to sigap-website/app/_utils/supabase/admin.ts diff --git a/sigap-website/utils/supabase/check-env-vars.ts b/sigap-website/app/_utils/supabase/check-env-vars.ts similarity index 100% rename from sigap-website/utils/supabase/check-env-vars.ts rename to sigap-website/app/_utils/supabase/check-env-vars.ts diff --git a/sigap-website/utils/supabase/client.ts b/sigap-website/app/_utils/supabase/client.ts similarity index 100% rename from sigap-website/utils/supabase/client.ts rename to sigap-website/app/_utils/supabase/client.ts diff --git a/sigap-website/utils/supabase/middleware.ts b/sigap-website/app/_utils/supabase/middleware.ts similarity index 100% rename from sigap-website/utils/supabase/middleware.ts rename to sigap-website/app/_utils/supabase/middleware.ts diff --git a/sigap-website/utils/supabase/server.ts b/sigap-website/app/_utils/supabase/server.ts similarity index 100% rename from sigap-website/utils/supabase/server.ts rename to sigap-website/app/_utils/supabase/server.ts diff --git a/sigap-website/utils/utils.ts b/sigap-website/app/_utils/utils.ts similarity index 100% rename from sigap-website/utils/utils.ts rename to sigap-website/app/_utils/utils.ts diff --git a/sigap-website/app/auth/callback/route.ts b/sigap-website/app/api/auth/callback/route.ts similarity index 93% rename from sigap-website/app/auth/callback/route.ts rename to sigap-website/app/api/auth/callback/route.ts index dd415a4..e6b7bc5 100644 --- a/sigap-website/app/auth/callback/route.ts +++ b/sigap-website/app/api/auth/callback/route.ts @@ -1,4 +1,4 @@ -import { createClient } from "@/utils/supabase/server"; +import { createClient } from "@/app/_utils/supabase/server"; import { NextResponse } from "next/server"; export async function GET(request: Request) { diff --git a/sigap-website/app/opengraph-image.png b/sigap-website/assets/images/opengraph-image.png similarity index 100% rename from sigap-website/app/opengraph-image.png rename to sigap-website/assets/images/opengraph-image.png diff --git a/sigap-website/app/twitter-image.png b/sigap-website/assets/images/twitter-image.png similarity index 100% rename from sigap-website/app/twitter-image.png rename to sigap-website/assets/images/twitter-image.png diff --git a/sigap-website/middleware.ts b/sigap-website/middleware.ts index 53428f8..d5a96d4 100644 --- a/sigap-website/middleware.ts +++ b/sigap-website/middleware.ts @@ -1,5 +1,5 @@ import { type NextRequest } from "next/server"; -import { updateSession } from "@/utils/supabase/middleware"; +import { updateSession } from "@/app/_utils/supabase/middleware"; export async function middleware(request: NextRequest) { return await updateSession(request); diff --git a/sigap-website/lib/db.ts b/sigap-website/prisma/db.ts similarity index 100% rename from sigap-website/lib/db.ts rename to sigap-website/prisma/db.ts diff --git a/sigap-website/src/controller/auth/sign-in-controller.tsx b/sigap-website/src/controller/auth/sign-in-controller.tsx index af6a482..85fb85e 100644 --- a/sigap-website/src/controller/auth/sign-in-controller.tsx +++ b/sigap-website/src/controller/auth/sign-in-controller.tsx @@ -7,11 +7,11 @@ import { defaultSignInValues, SignInFormData, signInSchema, -} from "@/src/models/auth/sign-in.model"; +} from "@/src/entities/models/auth/sign-in.model"; import { useState, type FormEvent, type ChangeEvent } from "react"; import { toast } from "sonner"; import { z } from "zod"; -import { signIn } from "@/app/(auth-pages)/action"; +import { signIn } from "@/app/(pages)/(auth)/action"; type SignInFormErrors = Partial>; diff --git a/sigap-website/src/controller/auth/verify-otp.controller.tsx b/sigap-website/src/controller/auth/verify-otp.controller.tsx index 85136b8..68fab3f 100644 --- a/sigap-website/src/controller/auth/verify-otp.controller.tsx +++ b/sigap-website/src/controller/auth/verify-otp.controller.tsx @@ -5,12 +5,12 @@ import { useState } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; -import { verifyOtp } from "@/app/(auth-pages)/action"; +import { verifyOtp } from "@/app/(pages)/(auth)/action"; import { defaultVerifyOtpValues, VerifyOtpFormData, verifyOtpSchema, -} from "@/src/models/auth/verify-otp.model"; +} from "@/src/entities/models/auth/verify-otp.model"; import { useNavigations } from "@/app/_hooks/use-navigations"; import { toast } from "sonner"; diff --git a/sigap-website/src/entities/errors/auth.ts b/sigap-website/src/entities/errors/auth.ts new file mode 100644 index 0000000..49b9613 --- /dev/null +++ b/sigap-website/src/entities/errors/auth.ts @@ -0,0 +1,17 @@ +export class AuthenticationError extends Error { + constructor(message: string, options?: ErrorOptions) { + super(message, options); + } + } + + export class UnauthenticatedError extends Error { + constructor(message: string, options?: ErrorOptions) { + super(message, options); + } + } + + export class UnauthorizedError extends Error { + constructor(message: string, options?: ErrorOptions) { + super(message, options); + } + } \ No newline at end of file diff --git a/sigap-website/src/entities/errors/common.ts b/sigap-website/src/entities/errors/common.ts new file mode 100644 index 0000000..96b9405 --- /dev/null +++ b/sigap-website/src/entities/errors/common.ts @@ -0,0 +1,18 @@ +export class DatabaseOperationError extends Error { + constructor(message: string, options?: ErrorOptions) { + super(message, options); + } + } + + export class NotFoundError extends Error { + constructor(message: string, options?: ErrorOptions) { + super(message, options); + } + } + + export class InputParseError extends Error { + constructor(message: string, options?: ErrorOptions) { + super(message, options); + } + } + \ No newline at end of file diff --git a/sigap-website/src/models/auth/sign-in.model.ts b/sigap-website/src/entities/models/auth/sign-in.model.ts similarity index 100% rename from sigap-website/src/models/auth/sign-in.model.ts rename to sigap-website/src/entities/models/auth/sign-in.model.ts diff --git a/sigap-website/src/models/auth/verify-otp.model.ts b/sigap-website/src/entities/models/auth/verify-otp.model.ts similarity index 100% rename from sigap-website/src/models/auth/verify-otp.model.ts rename to sigap-website/src/entities/models/auth/verify-otp.model.ts diff --git a/sigap-website/src/models/users/users.model.ts b/sigap-website/src/entities/models/users/users.model.ts similarity index 95% rename from sigap-website/src/models/users/users.model.ts rename to sigap-website/src/entities/models/users/users.model.ts index fbc39f3..ea1d19a 100644 --- a/sigap-website/src/models/users/users.model.ts +++ b/sigap-website/src/entities/models/users/users.model.ts @@ -40,7 +40,7 @@ export const UserSchema = z.object({ role: z.string().optional(), email: z.string().email().optional(), email_confirmed_at: z.union([z.string(), z.date()]).nullable().optional(), - password_hash: z.string().nullable().optional(), + encrypted_password: z.string().nullable().optional(), invited_at: z.union([z.string(), z.date()]).nullable().optional(), phone: z.string().nullable().optional(), confirmed_at: z.union([z.string(), z.date()]).nullable().optional(), @@ -84,7 +84,7 @@ export type Profile = z.infer; export const CreateUserParamsSchema = z.object({ email: z.string().email(), - password: z.string(), + encrypted_password: z.string(), phone: z.string().optional(), user_metadata: z.record(z.any()).optional(), email_confirm: z.boolean().optional(), @@ -95,13 +95,13 @@ export type CreateUserParams = z.infer; export const UpdateUserParamsSchema = z.object({ email: z.string().email().optional(), email_confirmed_at: z.boolean().optional(), - password_hash: z.string().optional(), + encrypted_password: z.string().optional(), role: z.enum(["user", "staff", "admin"]).optional(), phone: z.string().optional(), phone_confirmed_at: z.boolean().optional(), invited_at: z.union([z.string(), z.date()]).optional(), confirmed_at: z.union([z.string(), z.date()]).optional(), - recovery_sent_at: z.union([z.string(), z.date()]).optional(), + // recovery_sent_at: z.union([z.string(), z.date()]).optional(), last_sign_in_at: z.union([z.string(), z.date()]).optional(), created_at: z.union([z.string(), z.date()]).optional(), updated_at: z.union([z.string(), z.date()]).optional(), diff --git a/sigap-website/src/repositories/authentication.repository.ts b/sigap-website/src/repositories/authentication.repository.ts index e8b7b3e..3068ed6 100644 --- a/sigap-website/src/repositories/authentication.repository.ts +++ b/sigap-website/src/repositories/authentication.repository.ts @@ -1,7 +1,7 @@ // src/repositories/auth.repository.ts -import { createClient } from "@/utils/supabase/server"; -import { SignInFormData } from "../models/auth/sign-in.model"; -import { VerifyOtpFormData } from "../models/auth/verify-otp.model"; +import { createClient } from "@/app/_utils/supabase/server"; +import { SignInFormData } from "../entities/models/auth/sign-in.model"; +import { VerifyOtpFormData } from "../entities/models/auth/verify-otp.model"; export class AuthRepository { async signIn({ email }: SignInFormData) { @@ -9,7 +9,7 @@ export class AuthRepository { const { data, error } = await supabase.auth.signInWithOtp({ email, options: { - shouldCreateUser: false, + shouldCreateUser: false, }, }); diff --git a/sigap-website/src/repositories/users.repository.ts b/sigap-website/src/repositories/users.repository.ts new file mode 100644 index 0000000..e69de29