diff --git a/apps/hub/app/(app)/resources/_components/Card.tsx b/apps/hub/app/(app)/resources/_components/Card.tsx new file mode 100644 index 00000000..481ea283 --- /dev/null +++ b/apps/hub/app/(app)/resources/_components/Card.tsx @@ -0,0 +1,43 @@ +import { Download } from "lucide-react"; +import Image, { StaticImageData } from "next/image"; +import { ReactNode } from "react"; + +type ResourceCardProps = { + title?: string; + description?: string; + btnLabel?: string; + imageAlt?: string; + image?: StaticImageData; + btnHref?: string; + BtnIcon: ReactNode; +}; + +export default function ResourceCard({ + title, + BtnIcon, + description, + btnLabel: downloadLabel, + imageAlt, + image, + btnHref: downloadHref, +}: ResourceCardProps) { + return ( +
+
+ {image && ( +
+ {imageAlt +
+ )} +
+

{title}

+

{description}

+ + {BtnIcon} + {downloadLabel} + +
+
+
+ ); +} diff --git a/apps/hub/app/(app)/resources/_components/desktop-client.png b/apps/hub/app/(app)/resources/_components/desktop-client.png new file mode 100644 index 00000000..7bc1e7db Binary files /dev/null and b/apps/hub/app/(app)/resources/_components/desktop-client.png differ diff --git a/apps/hub/app/(app)/resources/page.tsx b/apps/hub/app/(app)/resources/page.tsx new file mode 100644 index 00000000..e06d4855 --- /dev/null +++ b/apps/hub/app/(app)/resources/page.tsx @@ -0,0 +1,18 @@ +import ResourceCard from "(app)/resources/_components/Card"; +import { Download } from "lucide-react"; +import Desktop from "./_components/desktop-client.png"; + +export default function () { + return ( +
+ } + btnHref="https://cdn.virtualairrescue.com/desktop/setup.exe" + btnLabel="Herunterladen" + description="Verwende diesen Client, um dich mit dem VAR-Netzwerk zu verbinden. Wenn du verbindest kannst du einen Push-To-Talk key setzen um den Funk zu bedienen. Wenn du als Pilot fliegen möchtest wird deine Position aus dem Simulator an unser Tracker-System übertragen." + /> +
+ ); +} diff --git a/apps/hub/app/(auth)/passwort-reset/action.ts b/apps/hub/app/(auth)/passwort-reset/action.ts index 83308f74..2ed3775d 100644 --- a/apps/hub/app/(auth)/passwort-reset/action.ts +++ b/apps/hub/app/(auth)/passwort-reset/action.ts @@ -2,25 +2,32 @@ import { prisma } from "@repo/db"; import { sendMailByTemplate } from "../../../helper/mail"; +import OLD_USER from "../../api/auth/[...nextauth]/var.User.json"; import bcrypt from "bcryptjs"; +import { createNewUserFromOld, OldUser } from "../../../types/oldUser"; export const resetPassword = async (email: string) => { try { - const user = await prisma.user.findFirst({ + let user = await prisma.user.findFirst({ where: { email, }, }); - + const oldUser = (OLD_USER as OldUser[]).find((u) => u.email === email); if (!user) { - return { error: "Nutzer nicht gefunden" }; + if (oldUser) { + user = await createNewUserFromOld(oldUser); + // If the user is not found in the new database, check the old user data + } else { + return { error: "Nutzer nicht gefunden" }; + } } const array = new Uint8Array(8); crypto.getRandomValues(array); - const password = Array.from(array, (byte) => - ("0" + (byte % 36).toString(36)).slice(-1), - ).join(""); + const password = Array.from(array, (byte) => ("0" + (byte % 36).toString(36)).slice(-1)).join( + "", + ); const hashedPassword = await bcrypt.hash(password, 12); await prisma.user.update({ where: { diff --git a/apps/hub/app/_components/Nav.tsx b/apps/hub/app/_components/Nav.tsx index 1fb91c40..4148664a 100644 --- a/apps/hub/app/_components/Nav.tsx +++ b/apps/hub/app/_components/Nav.tsx @@ -5,6 +5,7 @@ import { LockClosedIcon, RocketIcon, ReaderIcon, + DownloadIcon, } from "@radix-ui/react-icons"; import Link from "next/link"; import { WarningAlert } from "./ui/PageAlert"; @@ -42,6 +43,12 @@ export const VerticalNav = async () => { Einstellungen +
  • + + + Downloads + +
  • {viewAdminMenu && (
  • diff --git a/apps/hub/app/api/auth/[...nextauth]/auth.ts b/apps/hub/app/api/auth/[...nextauth]/auth.ts index c9af7830..390faa8f 100644 --- a/apps/hub/app/api/auth/[...nextauth]/auth.ts +++ b/apps/hub/app/api/auth/[...nextauth]/auth.ts @@ -4,7 +4,7 @@ import Credentials from "next-auth/providers/credentials"; import { DiscordAccount, prisma, User } from "@repo/db"; import bcrypt from "bcryptjs"; import oldUser from "./var.User.json"; -import { OldUser } from "../../../../types/oldUser"; +import { createNewUserFromOld, OldUser } from "../../../../types/oldUser"; import { sendVerificationLink } from "(app)/admin/user/action"; export const options: AuthOptions = { @@ -28,48 +28,7 @@ export const options: AuthOptions = { "v1 User Passwords match:", bcrypt.compareSync(credentials.password, v1User.password), ); - const newUser = await prisma.user.create({ - data: { - email: v1User.email, - password: v1User.password, - migratedFromV1: true, - firstname: v1User.firstname, - lastname: v1User.lastname, - publicId: v1User.publicId, - badges: [ - ...v1User.badges - .map((badge) => { - switch (badge) { - case "day-1-member": - return "DAY1"; - case "d-1": - return "D1"; - case "p-1": - return "P1"; - default: - return null; - } - }) - .filter((badge) => badge !== null), - "V1Veteran", - ], - }, - }); - if (v1User.discord) { - await prisma.discordAccount.create({ - data: { - tokenType: "Bearer", - refreshToken: v1User.discord.tokens.refresh_token, - discordId: v1User.discord.profile.id, - userId: newUser.id, - username: v1User.discord.profile.username, - globalName: v1User.discord.profile.global_name, - avatar: v1User.discord.profile.avatar, - email: v1User.discord.profile.email, - verified: v1User.discord.profile.verified, - }, - }); - } + const newUser = await createNewUserFromOld(v1User); await sendVerificationLink(newUser.id); return newUser; } diff --git a/apps/hub/types/oldUser.ts b/apps/hub/types/oldUser.ts index 8c019843..1031edc0 100644 --- a/apps/hub/types/oldUser.ts +++ b/apps/hub/types/oldUser.ts @@ -1,3 +1,5 @@ +import { prisma } from "@repo/db"; + export interface OldUser { firstname: string; publicId: string; @@ -24,3 +26,49 @@ export interface OldUser { }; }; } + +export const createNewUserFromOld = async (oldUser: OldUser) => { + const newUser = await prisma.user.create({ + data: { + email: oldUser.email, + password: oldUser.password, + migratedFromV1: true, + firstname: oldUser.firstname, + lastname: oldUser.lastname, + publicId: oldUser.publicId, + badges: [ + ...oldUser.badges + .map((badge) => { + switch (badge) { + case "day-1-member": + return "DAY1"; + case "d-1": + return "D1"; + case "p-1": + return "P1"; + default: + return null; + } + }) + .filter((badge) => badge !== null), + "V1Veteran", + ], + }, + }); + if (oldUser.discord) { + await prisma.discordAccount.create({ + data: { + tokenType: "Bearer", + refreshToken: oldUser.discord.tokens.refresh_token, + discordId: oldUser.discord.profile.id, + userId: newUser.id, + username: oldUser.discord.profile.username, + globalName: oldUser.discord.profile.global_name, + avatar: oldUser.discord.profile.avatar, + email: oldUser.discord.profile.email, + verified: oldUser.discord.profile.verified, + }, + }); + } + return newUser; +};