inserimento accesso come ospite
This commit is contained in:
parent
751b7f24d7
commit
e6559dd95a
7 changed files with 554 additions and 442 deletions
|
|
@ -1,5 +1,9 @@
|
||||||
<!-- BEGIN:nextjs-agent-rules -->
|
<!-- BEGIN:nextjs-agent-rules -->
|
||||||
# This is NOT the Next.js you know
|
|
||||||
|
|
||||||
This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices.
|
## This is NOT the Next.js you know
|
||||||
|
|
||||||
|
This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
|
||||||
|
|
||||||
|
This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
|
||||||
|
|
||||||
<!-- END:nextjs-agent-rules -->
|
<!-- END:nextjs-agent-rules -->
|
||||||
|
|
|
||||||
1
next-env.d.ts
vendored
1
next-env.d.ts
vendored
|
|
@ -1,6 +1,7 @@
|
||||||
/// <reference types="next" />
|
/// <reference types="next" />
|
||||||
/// <reference types="next/image-types/global" />
|
/// <reference types="next/image-types/global" />
|
||||||
import "./.next/dev/types/routes.d.ts";
|
import "./.next/dev/types/routes.d.ts";
|
||||||
|
import "./.next/dev/types/root-params.d.ts";
|
||||||
|
|
||||||
// NOTE: This file should not be edited
|
// NOTE: This file should not be edited
|
||||||
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,11 @@
|
||||||
|
import path from "node:path";
|
||||||
|
import { fileURLToPath } from "node:url";
|
||||||
|
|
||||||
/** @type {import('next').NextConfig} */
|
/** @type {import('next').NextConfig} */
|
||||||
const nextConfig = {
|
const nextConfig = {
|
||||||
output: "standalone",
|
output: "standalone",
|
||||||
|
turbopack: {
|
||||||
|
root: path.dirname(fileURLToPath(import.meta.url)),
|
||||||
|
},
|
||||||
};
|
};
|
||||||
export default nextConfig;
|
export default nextConfig;
|
||||||
|
|
|
||||||
915
package-lock.json
generated
915
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -11,7 +11,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bcrypt": "^6.0.0",
|
"bcrypt": "^6.0.0",
|
||||||
"mysql2": "^3.22.3",
|
"mysql2": "^3.22.3",
|
||||||
"next": "16.2.6",
|
"next": "^16.4.0",
|
||||||
"next-auth": "^5.0.0-beta.31",
|
"next-auth": "^5.0.0-beta.31",
|
||||||
"react": "19.2.6",
|
"react": "19.2.6",
|
||||||
"react-dom": "19.2.6"
|
"react-dom": "19.2.6"
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
"@types/react": "19.2.15",
|
"@types/react": "19.2.15",
|
||||||
"@types/react-dom": "19.2.3",
|
"@types/react-dom": "19.2.3",
|
||||||
"eslint": "^9.0.0",
|
"eslint": "^9.0.0",
|
||||||
"eslint-config-next": "16.2.6",
|
"eslint-config-next": "^16.4.0",
|
||||||
"tailwindcss": "^4",
|
"tailwindcss": "^4",
|
||||||
"typescript": "^5"
|
"typescript": "^5"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,31 @@ async function login(formData: FormData) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function loginAsGuest(formData: FormData) {
|
||||||
|
"use server";
|
||||||
|
|
||||||
|
console.log("[login-page] Submit accesso ospite ricevuto");
|
||||||
|
|
||||||
|
try {
|
||||||
|
await signIn("credentials", {
|
||||||
|
guest: "1",
|
||||||
|
redirect: false,
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof AuthError) {
|
||||||
|
console.log("[login-page] AuthError durante accesso ospite", {
|
||||||
|
type: error.type,
|
||||||
|
cause: error.cause,
|
||||||
|
});
|
||||||
|
redirect("/login?error=CredentialsSignin");
|
||||||
|
}
|
||||||
|
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
|
redirect(getSafeRedirectTo(formData.get("callbackUrl")));
|
||||||
|
}
|
||||||
|
|
||||||
export default async function LoginPage({ searchParams }: LoginPageProps) {
|
export default async function LoginPage({ searchParams }: LoginPageProps) {
|
||||||
const session = await auth();
|
const session = await auth();
|
||||||
|
|
||||||
|
|
@ -98,6 +123,7 @@ export default async function LoginPage({ searchParams }: LoginPageProps) {
|
||||||
) : null}
|
) : null}
|
||||||
|
|
||||||
<form action={login} className="space-y-4">
|
<form action={login} className="space-y-4">
|
||||||
|
<input type="hidden" name="callbackUrl" value={params?.callbackUrl ?? "/"} />
|
||||||
<label className="block">
|
<label className="block">
|
||||||
<span className="text-sm font-medium text-zinc-700">Utente o email</span>
|
<span className="text-sm font-medium text-zinc-700">Utente o email</span>
|
||||||
<input
|
<input
|
||||||
|
|
@ -127,6 +153,22 @@ export default async function LoginPage({ searchParams }: LoginPageProps) {
|
||||||
Accedi
|
Accedi
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
<div className="my-4 flex items-center gap-3 text-xs text-zinc-400">
|
||||||
|
<span className="h-px flex-1 bg-zinc-200" />
|
||||||
|
oppure
|
||||||
|
<span className="h-px flex-1 bg-zinc-200" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form action={loginAsGuest}>
|
||||||
|
<input type="hidden" name="callbackUrl" value={params?.callbackUrl ?? "/"} />
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
className="w-full rounded-md border border-zinc-300 bg-white px-4 py-2 font-medium text-zinc-800 transition-colors hover:bg-zinc-100"
|
||||||
|
>
|
||||||
|
Entra come ospite
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</main>
|
</main>
|
||||||
|
|
|
||||||
18
src/auth.ts
18
src/auth.ts
|
|
@ -9,6 +9,14 @@ import type { DbUser } from "@/src/types/user";
|
||||||
|
|
||||||
type DbUserRow = DbUser & RowDataPacket;
|
type DbUserRow = DbUser & RowDataPacket;
|
||||||
|
|
||||||
|
const GUEST_USER = {
|
||||||
|
id: "guest",
|
||||||
|
name: "Ospite",
|
||||||
|
email: null as string | null,
|
||||||
|
ruolo: "operatore" as const,
|
||||||
|
utente: "Ospite",
|
||||||
|
};
|
||||||
|
|
||||||
function maskIdentifier(identifier: string): string {
|
function maskIdentifier(identifier: string): string {
|
||||||
if (identifier.includes("@")) {
|
if (identifier.includes("@")) {
|
||||||
const [name = "", domain = ""] = identifier.split("@");
|
const [name = "", domain = ""] = identifier.split("@");
|
||||||
|
|
@ -107,9 +115,19 @@ export const { handlers, auth, signIn, signOut } = NextAuth({
|
||||||
credentials: {
|
credentials: {
|
||||||
identifier: { label: "Utente o email", type: "text" },
|
identifier: { label: "Utente o email", type: "text" },
|
||||||
password: { label: "Password", type: "password" },
|
password: { label: "Password", type: "password" },
|
||||||
|
guest: { label: "Ospite", type: "text" },
|
||||||
},
|
},
|
||||||
async authorize(credentials) {
|
async authorize(credentials) {
|
||||||
const startedAt = Date.now();
|
const startedAt = Date.now();
|
||||||
|
const isGuest = String(credentials?.guest ?? "") === "1";
|
||||||
|
|
||||||
|
if (isGuest) {
|
||||||
|
authLog("Login ospite riuscito", {
|
||||||
|
durationMs: Date.now() - startedAt,
|
||||||
|
});
|
||||||
|
return GUEST_USER;
|
||||||
|
}
|
||||||
|
|
||||||
const identifier = String(credentials?.identifier ?? "").trim();
|
const identifier = String(credentials?.identifier ?? "").trim();
|
||||||
const password = String(credentials?.password ?? "");
|
const password = String(credentials?.password ?? "");
|
||||||
const maskedIdentifier = maskIdentifier(identifier);
|
const maskedIdentifier = maskIdentifier(identifier);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue