From 8940fafac04a8423a1006210c41d07270cfa4b94 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Thu, 12 Sep 2024 15:28:46 +0200 Subject: [PATCH 01/42] fix: restructure logos --- README.md | 8 ++- messages/en.json | 3 +- messages/no.json | 3 +- .../[locale]/(default)/news/(header)/page.tsx | 11 ++-- src/components/assets/logos/FeideLogo.tsx | 60 +++++++++++++++++++ .../{Logo.tsx => logos/HackerspaceLogo.tsx} | 4 +- .../assets/{sponsors => logos}/IDILogo.tsx | 0 .../assets/{sponsors => logos}/NexusLogo.tsx | 0 .../assets/{sponsors => logos}/index.tsx | 1 + src/components/layout/Footer.tsx | 4 +- src/components/layout/Header.tsx | 1 + src/components/layout/LogoLink.tsx | 4 +- src/components/news/CardGrid.tsx | 4 +- src/components/news/ItemGrid.tsx | 4 +- src/components/settings/ProfileMenu.tsx | 1 - 15 files changed, 88 insertions(+), 20 deletions(-) create mode 100644 src/components/assets/logos/FeideLogo.tsx rename src/components/assets/{Logo.tsx => logos/HackerspaceLogo.tsx} (97%) rename src/components/assets/{sponsors => logos}/IDILogo.tsx (100%) rename src/components/assets/{sponsors => logos}/NexusLogo.tsx (100%) rename src/components/assets/{sponsors => logos}/index.tsx (61%) diff --git a/README.md b/README.md index 11fbb20..682d61f 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,7 @@ Here is a list of documentation to help you get started: - [Next-intl](https://next-intl-docs.vercel.app/) - Internationalization library - [nuqs](https://nuqs.47ng.com/docs/installation) - Easy to use query params - [BlockNote](https://www.blocknotejs.org/docs) - Tool for markdown textboxes -- [Tanstack Form](https://tanstack.com/form/latest/docs/overview) - When we need to handle form validation (shadcn/ui uses react-hook-form. but I think this is better, we will figure it out) -- [Tanstack Query](https://tanstack.com/query/latest/docs/framework/react/overview) - TRPC wraps Tanstack Query which is how we fetch data from the backend +- [React Hook Form](https://react-hook-form.com/get-started) - When we need to handle form validation #### Styling @@ -24,7 +23,8 @@ Here is a list of documentation to help you get started: ### Backend -- [TRPC](https://trpc.io/docs) - Tool for creating API endpoints as functions +- [TRPC](https://trpc.io/docs/client/react/server-components) - Tool for creating API endpoints as functions + - [Tanstack Query](https://tanstack.com/query/latest/docs/framework/react/guides/advanced-ssr#streaming-with-server-components) - TRPC wraps Tanstack Query which is how we fetch data from the backend on the client - [Lucia](https://lucia-auth.com) - Authentication library - [Drizzle](https://orm.drizzle.team/docs/overview) - ORM for interacting with the database (Postgres under the hood) - [s3-client](https://github.com/aws/aws-sdk-js-v3/tree/main/clients/client-s3) - AWS S3 client for uploading files @@ -116,3 +116,5 @@ We are using [Conventional Commits](https://www.conventionalcommits.org/en/v1.0. - All layout components should end with Layout. For example: `DefaultLayout`. - All page components should end with Page to make it clear it is a whole page. For example: `AboutPage`. +- All icons should end with Icon. For example: `HomeIcon`. +- React components should be named with PascalCase. For example: `Button`. The filename should match the component name. diff --git a/messages/en.json b/messages/en.json index 316e4ba..9acbcb2 100644 --- a/messages/en.json +++ b/messages/en.json @@ -39,7 +39,8 @@ "visitInstagram": "Visit our Instagram", "NTNUIDI": "NTNU Department of Computer Science", "NTNUIDIURL": "https://www.ntnu.edu/idi", - "NTNUKiD": "The working life network KID", + "NTNUNexus": "The working life network Nexus", + "feideInlogin": "Login with Feide", "copyright": "Copyright", "allRightsReserved": "All rights reserved" }, diff --git a/messages/no.json b/messages/no.json index 79286cb..5c18342 100644 --- a/messages/no.json +++ b/messages/no.json @@ -39,7 +39,8 @@ "visitInstagram": "Besøk Instagram", "NTNUIDI": "NTNU Institutt for datateknologi og informatikk", "NTNUIDIURL": "https://www.ntnu.no/idi", - "NTNUKiD": "Arbeidslivsnettverket KID", + "NTNUNexus": "Arbeidslivsnettverket Nexus", + "feideLogin": "Logg in med Feide", "copyright": "Opphavsrett", "allRightsReserved": "Alle rettigheter reservert" }, diff --git a/src/app/[locale]/(default)/news/(header)/page.tsx b/src/app/[locale]/(default)/news/(header)/page.tsx index 30444ab..26bdf53 100644 --- a/src/app/[locale]/(default)/news/(header)/page.tsx +++ b/src/app/[locale]/(default)/news/(header)/page.tsx @@ -1,14 +1,13 @@ -import { articleMockData as articleData } from '@/mock-data/article'; -import { useTranslations } from 'next-intl'; -import { getTranslations, unstable_setRequestLocale } from 'next-intl/server'; -import { createSearchParamsCache, parseAsInteger } from 'nuqs/server'; -import { Suspense } from 'react'; - import { PaginationCarousel } from '@/components/layout/PaginationCarousel'; import { CardGrid } from '@/components/news/CardGrid'; import { ItemGrid } from '@/components/news/ItemGrid'; import { ItemGridSkeleton } from '@/components/news/ItemGridSkeleton'; import { Separator } from '@/components/ui/Separator'; +import { articleMockData as articleData } from '@/mock-data/article'; +import { useTranslations } from 'next-intl'; +import { getTranslations, unstable_setRequestLocale } from 'next-intl/server'; +import { createSearchParamsCache, parseAsInteger } from 'nuqs/server'; +import { Suspense } from 'react'; export async function generateMetadata({ params: { locale }, diff --git a/src/components/assets/logos/FeideLogo.tsx b/src/components/assets/logos/FeideLogo.tsx new file mode 100644 index 0000000..0baa22a --- /dev/null +++ b/src/components/assets/logos/FeideLogo.tsx @@ -0,0 +1,60 @@ +import { cx } from '@/lib/utils'; + +function FeideLogo({ + className, + title, + ...rest +}: { + className?: string; + title: string; +}) { + return ( + + + + + + + + + + + + + + ); +} + +export { FeideLogo }; diff --git a/src/components/assets/Logo.tsx b/src/components/assets/logos/HackerspaceLogo.tsx similarity index 97% rename from src/components/assets/Logo.tsx rename to src/components/assets/logos/HackerspaceLogo.tsx index a8a9f09..665bcb4 100644 --- a/src/components/assets/Logo.tsx +++ b/src/components/assets/logos/HackerspaceLogo.tsx @@ -1,4 +1,4 @@ -function Logo({ className, ...rest }: { className?: string }) { +function HackerspaceLogo({ className, ...rest }: { className?: string }) { return ( - + diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index c81eba8..d54c66a 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -48,6 +48,7 @@ function Header() { t={{ profile: t('profile'), signIn: t('signIn'), + feideLogin: t('feideLogin'), }} /> diff --git a/src/components/layout/LogoLink.tsx b/src/components/layout/LogoLink.tsx index 23018e8..2610952 100644 --- a/src/components/layout/LogoLink.tsx +++ b/src/components/layout/LogoLink.tsx @@ -1,4 +1,4 @@ -import { Logo } from '@/components/assets/Logo'; +import { HackerspaceLogo } from '@/components/assets/logos'; import { Button } from '@/components/ui/Button'; import { Link } from '@/lib/locale/navigation'; import { cx } from '@/lib/utils'; @@ -20,7 +20,7 @@ function LogoLink({ size='none' > - + HACKERSPACE diff --git a/src/components/news/CardGrid.tsx b/src/components/news/CardGrid.tsx index 46156cd..c56adf3 100644 --- a/src/components/news/CardGrid.tsx +++ b/src/components/news/CardGrid.tsx @@ -1,4 +1,5 @@ import { ArticleCard } from '@/components/news/ArticleCard'; +import { api } from '@/lib/api/server'; import { cx } from '@/lib/utils'; type CardGridProps = { topArticles: { @@ -10,7 +11,8 @@ type CardGridProps = { }[]; }; -function CardGrid({ topArticles }: CardGridProps) { +async function CardGrid({ topArticles }: CardGridProps) { + const hello = await api.test.helloWorld(); return (
{topArticles.map((data, index) => ( diff --git a/src/components/news/ItemGrid.tsx b/src/components/news/ItemGrid.tsx index 6a610f6..25430db 100644 --- a/src/components/news/ItemGrid.tsx +++ b/src/components/news/ItemGrid.tsx @@ -1,13 +1,15 @@ import { ArticleItem } from '@/components/news/ArticleItem'; +import { api } from '@/lib/api/server'; import { articleMockData as articleData } from '@/mock-data/article'; type ItemGridProps = { page: number; }; -function ItemGrid({ page }: ItemGridProps) { +async function ItemGrid({ page }: ItemGridProps) { const itemsDisplayedAsCards = 4; const itemsPerPage = 6; + const hello = await api.test.helloWorld(); const start = (page - 1) * itemsPerPage + itemsDisplayedAsCards; const end = start + itemsPerPage; diff --git a/src/components/settings/ProfileMenu.tsx b/src/components/settings/ProfileMenu.tsx index 446f65e..13c9b86 100644 --- a/src/components/settings/ProfileMenu.tsx +++ b/src/components/settings/ProfileMenu.tsx @@ -11,7 +11,6 @@ import { UserIcon } from 'lucide-react'; import * as React from 'react'; function ProfileMenu({ t }: { t: { profile: string; signIn: string } }) { - // TODO: User Icon Color should only have the primary color when logged in return ( From f01754d84b85ddc467612e50f4ca1ce9313dcbd9 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Thu, 26 Sep 2024 17:05:48 +0200 Subject: [PATCH 02/42] fix news skeleton text skeleton --- src/components/news/ArticleItemSkeleton.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/news/ArticleItemSkeleton.tsx b/src/components/news/ArticleItemSkeleton.tsx index 5037918..f356851 100644 --- a/src/components/news/ArticleItemSkeleton.tsx +++ b/src/components/news/ArticleItemSkeleton.tsx @@ -7,8 +7,10 @@ function ArticleItemSkeleton() {
- - + +
+ +
); From c47a4f4f01542395da6c4bb80759cbbe981c5de2 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Thu, 26 Sep 2024 18:07:24 +0200 Subject: [PATCH 03/42] feat: initial auth page --- messages/en.json | 5 ++++ messages/no.json | 5 ++++ src/app/[locale]/login/layout.tsx | 20 +++++++++++++++ src/app/[locale]/login/page.tsx | 40 ++++++++++++++++++++++++++++++ src/components/layout/LogoLink.tsx | 13 ++++++++-- src/components/layout/Main.tsx | 15 +++++------ src/lib/locale/index.ts | 4 +++ 7 files changed, 91 insertions(+), 11 deletions(-) create mode 100644 src/app/[locale]/login/layout.tsx create mode 100644 src/app/[locale]/login/page.tsx diff --git a/messages/en.json b/messages/en.json index 316e4ba..69eba9e 100644 --- a/messages/en.json +++ b/messages/en.json @@ -14,6 +14,7 @@ "layout": { "hackerspaceHome": "Hackerspace homepage", "navigationMenu": "Navigation menu", + "login": "Login", "news": "News", "events": "Events", "storage": "Storage", @@ -43,6 +44,10 @@ "copyright": "Copyright", "allRightsReserved": "All rights reserved" }, + "login": { + "welcome": "Welcome!", + "description": "Is it your first time here? Login with Feide" + }, "news": { "title": "News", "internalArticle": "This is an internal article", diff --git a/messages/no.json b/messages/no.json index 79286cb..031c983 100644 --- a/messages/no.json +++ b/messages/no.json @@ -14,6 +14,7 @@ "layout": { "hackerspaceHome": "Hackerspace hjemmeside", "navigationMenu": "Navigasjonsmeny", + "login": "Logg inn", "news": "Nyheter", "events": "Hendelser", "storage": "Lager", @@ -43,6 +44,10 @@ "copyright": "Opphavsrett", "allRightsReserved": "Alle rettigheter reservert" }, + "login": { + "welcome": "Velkommen!", + "description": "Er du her for første gang? Logg inn med Feide" + }, "news": { "title": "Nyheter", "internalArticle": "Dette er en intern artikkel", diff --git a/src/app/[locale]/login/layout.tsx b/src/app/[locale]/login/layout.tsx new file mode 100644 index 0000000..361abaa --- /dev/null +++ b/src/app/[locale]/login/layout.tsx @@ -0,0 +1,20 @@ +import { Main } from '@/components/layout/Main'; +import { Card } from '@/components/ui/Card'; +import { unstable_setRequestLocale } from 'next-intl/server'; + +type DefaultLayoutProps = { + children: React.ReactNode; + params: { locale: string }; +}; + +export default function LoginLayout({ + children, + params: { locale }, +}: DefaultLayoutProps) { + unstable_setRequestLocale(locale); + return ( +
+ {children} +
+ ); +} diff --git a/src/app/[locale]/login/page.tsx b/src/app/[locale]/login/page.tsx new file mode 100644 index 0000000..c0944de --- /dev/null +++ b/src/app/[locale]/login/page.tsx @@ -0,0 +1,40 @@ +import { LogoLink } from '@/components/layout/LogoLink'; +import { CardDescription, CardHeader, CardTitle } from '@/components/ui/Card'; +import { Separator } from '@radix-ui/react-dropdown-menu'; +import { useTranslations } from 'next-intl'; +import { getTranslations, unstable_setRequestLocale } from 'next-intl/server'; + +export async function generateMetadata({ + params: { locale }, +}: { + params: { locale: string }; +}) { + const t = await getTranslations({ locale, namespace: 'layout' }); + + return { + title: t('login'), + }; +} + +export default function AboutPage({ + params: { locale }, +}: { + params: { locale: string }; +}) { + unstable_setRequestLocale(locale); + const t = useTranslations('login'); + return ( + <> + + + {t('welcome')} + {t('description')} + + + + ); +} diff --git a/src/components/layout/LogoLink.tsx b/src/components/layout/LogoLink.tsx index dfddc11..f85e99e 100644 --- a/src/components/layout/LogoLink.tsx +++ b/src/components/layout/LogoLink.tsx @@ -6,9 +6,13 @@ import { useTranslations } from 'next-intl'; function LogoLink({ className, + logoClassName, + titleClassName, onClick, }: { className?: string; + logoClassName?: string; + titleClassName?: string; onClick?: () => void; }) { const t = useTranslations('layout'); @@ -20,8 +24,13 @@ function LogoLink({ size='none' > - - + + HACKERSPACE diff --git a/src/components/layout/Main.tsx b/src/components/layout/Main.tsx index c148e02..30bc84e 100644 --- a/src/components/layout/Main.tsx +++ b/src/components/layout/Main.tsx @@ -1,20 +1,17 @@ import { cx } from '@/lib/utils'; -type MainProps = { - children: React.ReactNode; - className?: string; -}; - -function Main({ children, className }: MainProps) { +function Main({ + className, + ...props +}: { className?: string } & React.HTMLAttributes) { return (
- {children} -
+ {...props} + /> ); } diff --git a/src/lib/locale/index.ts b/src/lib/locale/index.ts index 20bda14..3e341d8 100644 --- a/src/lib/locale/index.ts +++ b/src/lib/locale/index.ts @@ -9,6 +9,10 @@ export const routing = defineRouting({ localePrefix: 'as-needed', pathnames: { '/': '/', + '/login': { + en: '/login', + no: '/logg-inn', + }, '/events': { en: '/events', no: '/arrangementer', From f4d6990401a5b6f746211d1a6963b018e4beeb41 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Thu, 26 Sep 2024 18:21:59 +0200 Subject: [PATCH 04/42] chore: merge with old auth branch --- src/app/[locale]/login/page.tsx | 8 ++++---- src/components/layout/LogoLink.tsx | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/app/[locale]/login/page.tsx b/src/app/[locale]/login/page.tsx index c0944de..713f6f1 100644 --- a/src/app/[locale]/login/page.tsx +++ b/src/app/[locale]/login/page.tsx @@ -1,6 +1,6 @@ import { LogoLink } from '@/components/layout/LogoLink'; import { CardDescription, CardHeader, CardTitle } from '@/components/ui/Card'; -import { Separator } from '@radix-ui/react-dropdown-menu'; +import { Separator } from '@/components/ui/Separator'; import { useTranslations } from 'next-intl'; import { getTranslations, unstable_setRequestLocale } from 'next-intl/server'; @@ -28,13 +28,13 @@ export default function AboutPage({ {t('welcome')} {t('description')} - + ); } diff --git a/src/components/layout/LogoLink.tsx b/src/components/layout/LogoLink.tsx index a85c497..fd83091 100644 --- a/src/components/layout/LogoLink.tsx +++ b/src/components/layout/LogoLink.tsx @@ -24,10 +24,12 @@ function LogoLink({ size='none' > - + From c1bac6775b10e1eab51cb9318a837905a42a2bde Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Thu, 26 Sep 2024 19:46:55 +0200 Subject: [PATCH 05/42] feat: add login page frontend --- messages/en.json | 5 ++-- messages/no.json | 5 ++-- src/app/[locale]/login/layout.tsx | 2 +- src/app/[locale]/login/page.tsx | 30 ++++++++++++++++++++--- src/components/assets/logos/FeideLogo.tsx | 2 +- src/components/layout/Footer.tsx | 2 +- 6 files changed, 35 insertions(+), 11 deletions(-) diff --git a/messages/en.json b/messages/en.json index 8ec2ccf..0c783ab 100644 --- a/messages/en.json +++ b/messages/en.json @@ -49,13 +49,14 @@ "NTNUIDI": "NTNU Department of Computer Science", "NTNUIDIURL": "https://www.ntnu.edu/idi", "NTNUNexus": "The working life network Nexus", - "feideInlogin": "Login with Feide", "copyright": "Copyright", "allRightsReserved": "All rights reserved" }, "login": { "welcome": "Welcome!", - "description": "Is it your first time here? Login with Feide" + "description": "Is it your first time here? Use Feide", + "loginWith": "Login with", + "hackerspaceAccount": "Hackerspace Account" }, "news": { "title": "News", diff --git a/messages/no.json b/messages/no.json index d285f98..338a0ad 100644 --- a/messages/no.json +++ b/messages/no.json @@ -49,13 +49,14 @@ "NTNUIDI": "NTNU Institutt for datateknologi og informatikk", "NTNUIDIURL": "https://www.ntnu.no/idi", "NTNUNexus": "Arbeidslivsnettverket Nexus", - "feideLogin": "Logg in med Feide", "copyright": "Opphavsrett", "allRightsReserved": "Alle rettigheter reservert" }, "login": { "welcome": "Velkommen!", - "description": "Er du her for første gang? Logg inn med Feide" + "description": "Er du her for første gang? Bruk Feide", + "loginWith": "Logg inn med", + "hackerspaceAccount": "Hackerspace-konto" }, "news": { "title": "Nyheter", diff --git a/src/app/[locale]/login/layout.tsx b/src/app/[locale]/login/layout.tsx index 361abaa..da75514 100644 --- a/src/app/[locale]/login/layout.tsx +++ b/src/app/[locale]/login/layout.tsx @@ -14,7 +14,7 @@ export default function LoginLayout({ unstable_setRequestLocale(locale); return (
- {children} + {children}
); } diff --git a/src/app/[locale]/login/page.tsx b/src/app/[locale]/login/page.tsx index 713f6f1..3990dd0 100644 --- a/src/app/[locale]/login/page.tsx +++ b/src/app/[locale]/login/page.tsx @@ -1,6 +1,14 @@ +import { FeideLogo } from '@/components/assets/logos/FeideLogo'; import { LogoLink } from '@/components/layout/LogoLink'; -import { CardDescription, CardHeader, CardTitle } from '@/components/ui/Card'; +import { Button } from '@/components/ui/Button'; +import { + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from '@/components/ui/Card'; import { Separator } from '@/components/ui/Separator'; +import { FingerprintIcon } from 'lucide-react'; import { useTranslations } from 'next-intl'; import { getTranslations, unstable_setRequestLocale } from 'next-intl/server'; @@ -27,14 +35,28 @@ export default function AboutPage({ <> {t('welcome')} - {t('description')} + + {t('description')} + - + +
+ +

{t('loginWith')}

+
+ + +
); } diff --git a/src/components/assets/logos/FeideLogo.tsx b/src/components/assets/logos/FeideLogo.tsx index 0baa22a..998b8dc 100644 --- a/src/components/assets/logos/FeideLogo.tsx +++ b/src/components/assets/logos/FeideLogo.tsx @@ -15,7 +15,7 @@ function FeideLogo({ height='100%' viewBox='0 0 114 39' xmlns='http://www.w3.org/2000/svg' - aria-describedby='feielogo' + aria-describedby='feidelogo' {...rest} > diff --git a/src/components/layout/Footer.tsx b/src/components/layout/Footer.tsx index 644612c..ff8b363 100644 --- a/src/components/layout/Footer.tsx +++ b/src/components/layout/Footer.tsx @@ -192,7 +192,7 @@ function Footer() {
  • - + ); } diff --git a/src/app/[locale]/not-found.tsx b/src/app/[locale]/not-found.tsx index e97706f..7ad002a 100644 --- a/src/app/[locale]/not-found.tsx +++ b/src/app/[locale]/not-found.tsx @@ -1,3 +1,4 @@ +import { Main } from '@/components/layout/Main'; import { Button } from '@/components/ui/Button'; import { Link } from '@/lib/locale/navigation'; import { HardDriveIcon } from 'lucide-react'; @@ -6,7 +7,7 @@ import { useTranslations } from 'next-intl'; export default function NotFoundPage() { const t = useTranslations('error'); return ( -
    +

    {t('notFound')} @@ -17,6 +18,6 @@ export default function NotFoundPage() { -

    + ); } From c3e83f786f747e503f6da9c44980910d333ab2d1 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Sun, 13 Oct 2024 14:03:18 +0200 Subject: [PATCH 12/42] feat: tailwindcss plugins --- bun.lockb | Bin 222872 -> 224012 bytes docker-compose.yml => compose.yml | 0 package.json | 12 +++++++----- postcss.config.cjs => postcss.config.js | 3 ++- src/components/layout/Main.tsx | 2 +- src/components/ui/Command.tsx | 2 +- src/components/ui/Dialog.tsx | 6 +++--- src/components/ui/DropdownMenu.tsx | 12 ++++++------ src/components/ui/Popover.tsx | 2 +- src/components/ui/Select.tsx | 6 +++--- src/components/ui/Sheet.tsx | 14 +++++++------- src/components/ui/Tooltip.tsx | 2 +- tailwind.config.ts | 4 ++++ tsconfig.json | 4 ++-- 14 files changed, 38 insertions(+), 31 deletions(-) rename docker-compose.yml => compose.yml (100%) rename postcss.config.cjs => postcss.config.js (52%) diff --git a/bun.lockb b/bun.lockb index c4e9ff5eb6be3c0c986e277d897b23d3a6297df5..dc6a104041a5e9ce704be630781bf34394fab66e 100755 GIT binary patch delta 46100 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 S7{x`Ui{rq{C1S(mcm4z;UlT3> delta 45493 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 diff --git a/docker-compose.yml b/compose.yml similarity index 100% rename from docker-compose.yml rename to compose.yml diff --git a/package.json b/package.json index 4640edb..b6d6c10 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,6 @@ "@trpc/client": "^11.0.0-rc.490", "@trpc/react-query": "^11.0.0-rc.490", "@trpc/server": "^11.0.0-rc.490", - "autoprefixer": "^10.4.19", - "client-only": "^0.0.1", "cmdk": "1.0.0", "country-flag-icons": "^1.5.12", "cva": "^1.0.0-beta.1", @@ -47,7 +45,6 @@ "lucide-react": "^0.396.0", "next": "^14.2.10", "next-intl": "^3.18.1", - "next-sitemap": "^4.2.3", "next-themes": "^0.3.0", "nuqs": "^1.17.4", "postgres": "^3.4.4", @@ -56,25 +53,30 @@ "react-dom": "^18.3.1", "react-hook-form": "^7.53.0", "reading-time": "^1.5.0", - "server-only": "^0.0.1", "sharp": "^0.33.4", "superjson": "^2.2.1", - "tailwind-merge": "^2.5.2", "zod": "^3.23.8" }, "devDependencies": { "@biomejs/biome": "1.8.3", "@fluid-tailwind/tailwind-merge": "^0.0.2", + "@tailwindcss/container-queries": "^0.1.1", "@types/node": "^20.14.8", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", + "autoprefixer": "^10.4.20", + "client-only": "^0.0.1", "drizzle-kit": "^0.24.1", "fluid-tailwind": "^1.0.3", "lefthook": "^1.7.14", + "next-sitemap": "^4.2.3", "postcss": "^8.4.38", + "server-only": "^0.0.1", + "tailwind-merge": "^2.5.3", "tailwind-scrollbar": "^3.1.0", "tailwindcss": "^3.4.4", "tailwindcss-animate": "^1.0.7", + "tailwindcss-radix": "^3.0.5", "typescript": "^5.5.0" }, "packageManager": "bun@1.1.12" diff --git a/postcss.config.cjs b/postcss.config.js similarity index 52% rename from postcss.config.cjs rename to postcss.config.js index e305dd9..2ef30fc 100644 --- a/postcss.config.cjs +++ b/postcss.config.js @@ -1,3 +1,4 @@ +/** @type {import('postcss-load-config').Config} */ const config = { plugins: { tailwindcss: {}, @@ -5,4 +6,4 @@ const config = { }, }; -module.exports = config; +export default config; diff --git a/src/components/layout/Main.tsx b/src/components/layout/Main.tsx index b034664..3a9e635 100644 --- a/src/components/layout/Main.tsx +++ b/src/components/layout/Main.tsx @@ -7,7 +7,7 @@ function Main({ return (
    {children} - + Close diff --git a/src/components/ui/DropdownMenu.tsx b/src/components/ui/DropdownMenu.tsx index c7daf18..a87c29a 100644 --- a/src/components/ui/DropdownMenu.tsx +++ b/src/components/ui/DropdownMenu.tsx @@ -27,7 +27,7 @@ const DropdownMenuSubTrigger = React.forwardRef< (({ className, ...props }, ref) => ( {children} - + {close} diff --git a/src/components/ui/Tooltip.tsx b/src/components/ui/Tooltip.tsx index 87520f8..5b747fb 100644 --- a/src/components/ui/Tooltip.tsx +++ b/src/components/ui/Tooltip.tsx @@ -18,7 +18,7 @@ const TooltipContent = React.forwardRef< ref={ref} sideOffset={sideOffset} className={cx( - 'fade-in-0 zoom-in-95 data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 animate-in overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-popover-foreground text-sm shadow-md data-[state=closed]:animate-out', + 'fade-in-0 zoom-in-95 rdx-state-closed:fade-out-0 rdx-state-closed:zoom-out-95 rdx-side-bottom:slide-in-from-top-2 rdx-side-left:slide-in-from-right-2 rdx-side-right:slide-in-from-left-2 rdx-side-top:slide-in-from-bottom-2 z-50 animate-in rdx-state-closed:animate-out overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-popover-foreground text-sm shadow-md', className, )} {...props} diff --git a/tailwind.config.ts b/tailwind.config.ts index 73a4ee5..823e5d2 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -1,7 +1,9 @@ +import tailwindContainerQueries from '@tailwindcss/container-queries'; import tailwindFluid, { extract, screens, fontSize } from 'fluid-tailwind'; import tailwindScrollbar from 'tailwind-scrollbar'; import type { Config } from 'tailwindcss'; import tailwindAnimate from 'tailwindcss-animate'; +import tailwindRadix from 'tailwindcss-radix'; import { fontFamily } from 'tailwindcss/defaultTheme'; const config = { @@ -78,9 +80,11 @@ const config = { }, }, plugins: [ + tailwindContainerQueries, tailwindFluid, tailwindAnimate, tailwindScrollbar({ nocompatible: true }), + tailwindRadix({ variantPrefix: 'rdx' }), ], } satisfies Config; diff --git a/tsconfig.json b/tsconfig.json index 6cb01c3..f92227f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -30,11 +30,11 @@ } }, "include": [ - ".eslintrc.js", + ".eslintrc.cjs", + "postcss.config.js", "next-env.d.ts", "**/*.ts", "**/*.tsx", - "**/*.cjs", "**/*.js", ".next/types/**/*.ts" ], From 31973c3462ac910c42d5d4742b41144901e29b77 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Sun, 13 Oct 2024 14:12:46 +0200 Subject: [PATCH 13/42] fix: formatting errors --- src/app/[locale]/(default)/news/(main)/page.tsx | 6 ------ src/components/ui/Combobox.tsx | 3 ++- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/app/[locale]/(default)/news/(main)/page.tsx b/src/app/[locale]/(default)/news/(main)/page.tsx index dfb6b16..0b20ecc 100644 --- a/src/app/[locale]/(default)/news/(main)/page.tsx +++ b/src/app/[locale]/(default)/news/(main)/page.tsx @@ -1,9 +1,3 @@ -import { articleMockData as articleData } from '@/mock-data/article'; -import { useTranslations } from 'next-intl'; -import { getTranslations, unstable_setRequestLocale } from 'next-intl/server'; -import { createSearchParamsCache, parseAsInteger } from 'nuqs/server'; -import { Suspense } from 'react'; - import { PaginationCarousel } from '@/components/composites/PaginationCarousel'; import { CardGrid } from '@/components/news/CardGrid'; import { ItemGrid } from '@/components/news/ItemGrid'; diff --git a/src/components/ui/Combobox.tsx b/src/components/ui/Combobox.tsx index fff8634..dd3fadf 100644 --- a/src/components/ui/Combobox.tsx +++ b/src/components/ui/Combobox.tsx @@ -50,7 +50,8 @@ function Combobox({ + + + + ); +} diff --git a/src/app/[locale]/auth/sign-in/layout.tsx b/src/app/[locale]/auth/sign-in/layout.tsx deleted file mode 100644 index fb41c57..0000000 --- a/src/app/[locale]/auth/sign-in/layout.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { Main } from '@/components/layout/Main'; -import { Card } from '@/components/ui/Card'; -import { setRequestLocale } from 'next-intl/server'; - -type SignInLayoutProps = { - children: React.ReactNode; - params: Promise<{ locale: string }>; -}; - -export default async function SignInLayout({ - children, - params, -}: SignInLayoutProps) { - const { locale } = await params; - setRequestLocale(locale); - return ( -
    - {children} -
    - ); -} diff --git a/src/app/[locale]/auth/sign-in/page.tsx b/src/app/[locale]/auth/sign-in/page.tsx deleted file mode 100644 index bf4c495..0000000 --- a/src/app/[locale]/auth/sign-in/page.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import { FeideLogo } from '@/components/assets/logos/FeideLogo'; -import { LogoLink } from '@/components/layout/LogoLink'; -import { Button } from '@/components/ui/Button'; -import { - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from '@/components/ui/Card'; -import { Separator } from '@/components/ui/Separator'; -import { FingerprintIcon } from 'lucide-react'; -import { useTranslations } from 'next-intl'; -import { getTranslations, unstable_setRequestLocale } from 'next-intl/server'; - -export async function generateMetadata({ - params: { locale }, -}: { - params: { locale: string }; -}) { - const t = await getTranslations({ locale, namespace: 'layout' }); - - return { - title: t('signIn'), - }; -} - -export default function SignInPage({ - params: { locale }, -}: { - params: { locale: string }; -}) { - unstable_setRequestLocale(locale); - const t = useTranslations('signIn'); - return ( - <> - - - {t('welcome')} - - {t('description')} - - - -
    - -

    {t('signInWith')}

    -
    - - -
    - - ); -} diff --git a/src/app/[locale]/auth/success/page.tsx b/src/app/[locale]/auth/success/page.tsx new file mode 100644 index 0000000..09e20f2 --- /dev/null +++ b/src/app/[locale]/auth/success/page.tsx @@ -0,0 +1,34 @@ +import { SuccessParticles } from '@/components/auth/SuccessParticles'; +import { Button } from '@/components/ui/Button'; +import { Separator } from '@/components/ui/Separator'; +import { Link } from '@/lib/locale/navigation'; +import { getTranslations, setRequestLocale } from 'next-intl/server'; + +export default async function SuccessPage({ + params, +}: { + params: Promise<{ locale: string }>; +}) { + const { locale } = await params; + setRequestLocale(locale); + const t = await getTranslations('auth'); + return ( +
    +
    +

    {t('success')}

    +

    + { + 'you are now a member of Hackerspace. Now you can finally start praying to our one true leader' + } +

    +
    + +
    + +
    + +
    + ); +} diff --git a/src/app/[locale]/auth/template.tsx b/src/app/[locale]/auth/template.tsx new file mode 100644 index 0000000..216ea70 --- /dev/null +++ b/src/app/[locale]/auth/template.tsx @@ -0,0 +1,21 @@ +'use client'; + +import { type HTMLMotionProps, m } from 'framer-motion'; + +export default function AuthTemplate({ + children, +}: { + children: React.ReactNode; +}) { + return ( + )} + > + {children} + + ); +} diff --git a/src/components/auth/PendingBar.tsx b/src/components/auth/PendingBar.tsx new file mode 100644 index 0000000..6150615 --- /dev/null +++ b/src/components/auth/PendingBar.tsx @@ -0,0 +1,71 @@ +'use client'; + +import { type HTMLMotionProps, m } from 'framer-motion'; +import { createContext, useContext, useEffect, useState } from 'react'; + +type PendingContextType = { + isPending: boolean; + setPending: (pending: boolean) => void; +}; + +const PendingContext = createContext(undefined); + +type PendingProviderProps = { + children: React.ReactNode; +}; + +function PendingProvider({ children }: PendingProviderProps) { + const [isPending, setPending] = useState(false); + + return ( + + {children} + + ); +} + +const usePending = () => { + const context = useContext(PendingContext); + if (!context) { + throw new Error('usePending must be used within a PendingProvider'); + } + return context; +}; + +function PendingBar() { + const { isPending } = usePending(); + const [visible, setVisible] = useState(false); + + useEffect(() => { + if (isPending) { + setVisible(true); + } else { + const timeout = setTimeout(() => setVisible(false), 300); + return () => clearTimeout(timeout); + } + }, [isPending]); + + if (!visible) return null; + + return ( +
    + )} + /> +
    + ); +} + +export { PendingBar, PendingProvider, usePending }; diff --git a/src/components/auth/SuccessParticles.tsx b/src/components/auth/SuccessParticles.tsx new file mode 100644 index 0000000..0f07aa4 --- /dev/null +++ b/src/components/auth/SuccessParticles.tsx @@ -0,0 +1,196 @@ +'use client'; + +import type { ISourceOptions } from '@tsparticles/engine'; +import Particles, { initParticlesEngine } from '@tsparticles/react'; +import { useEffect, useMemo, useState } from 'react'; +import { createPortal } from 'react-dom'; +import { loadFull } from 'tsparticles'; + +function SuccessParticles() { + const [init, setInit] = useState(false); + const [mainElement, setMainElement] = useState(null); + + useEffect(() => { + initParticlesEngine(async (engine) => { + await loadFull(engine); + }) + .then(() => { + setInit(true); + }) + .catch((error) => { + console.error('Error initializing particles engine:', error); + }); + + const main = document.querySelector('main'); + setMainElement(main); + }, []); + + const options: ISourceOptions = useMemo( + () => ({ + detectRetina: true, + emitters: { + direction: 'top', + life: { + count: 0, + duration: 0.1, + delay: 0.1, + }, + rate: { + delay: 0.15, + quantity: 1, + }, + size: { + width: 100, + height: 0, + }, + position: { + y: 100, + x: 50, + }, + }, + particles: { + number: { + value: 0, + }, + destroy: { + bounds: { + top: 30, + }, + mode: 'split', + split: { + count: 1, + factor: { + value: 0.333333, + }, + rate: { + value: 100, + }, + particles: { + stroke: { + width: 0, + }, + color: { + value: ['#ff595e', '#ffca3a', '#8ac926', '#1982c4', '#6a4c93'], + }, + number: { + value: 0, + }, + collisions: { + enable: false, + }, + destroy: { + bounds: { + top: 0, + }, + }, + opacity: { + value: { + min: 0.1, + max: 1, + }, + animation: { + enable: true, + speed: 0.7, + sync: false, + startValue: 'max', + destroy: 'min', + }, + }, + shape: { + type: 'circle', + }, + size: { + value: 2, + animation: { + enable: false, + }, + }, + life: { + count: 1, + duration: { + value: { + min: 1, + max: 2, + }, + }, + }, + move: { + enable: true, + gravity: { + enable: true, + acceleration: 9.81, + inverse: false, + }, + decay: 0.1, + speed: { + min: 10, + max: 25, + }, + direction: 'outside', + outModes: 'destroy', + }, + }, + }, + }, + life: { + count: 1, + }, + shape: { + type: 'line', + }, + size: { + value: { + min: 0.1, + max: 50, + }, + animation: { + enable: true, + sync: true, + speed: 90, + startValue: 'max', + destroy: 'min', + }, + }, + stroke: { + color: { + value: '#ffffff', + }, + width: 1, + }, + rotate: { + enable: true, + path: true, + }, + move: { + enable: true, + gravity: { + acceleration: 15, + enable: true, + inverse: true, + maxSpeed: 100, + }, + speed: { + min: 10, + max: 20, + }, + outModes: { + default: 'destroy', + top: 'none', + }, + trail: { + fill: { color: '#000000' }, + enable: true, + length: 10, + }, + }, + }, + }), + [], + ); + + const particles = init ? : null; + + return mainElement && createPortal(particles, mainElement); +} + +export { SuccessParticles }; diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx index 0ae6abe..76afd32 100644 --- a/src/components/layout/Header.tsx +++ b/src/components/layout/Header.tsx @@ -18,7 +18,6 @@ function Header() { news: t('news'), events: t('events'), about: t('about'), - close: useTranslations('ui')('close'), }} /> diff --git a/src/components/layout/header/MobileSheet.tsx b/src/components/layout/header/MobileSheet.tsx index 9bcd6da..bc4c2e6 100644 --- a/src/components/layout/header/MobileSheet.tsx +++ b/src/components/layout/header/MobileSheet.tsx @@ -20,7 +20,6 @@ type MobileSheetProps = { news: string; events: string; about: string; - close: string; }; }; @@ -38,7 +37,7 @@ function MobileSheet({ className, t }: MobileSheetProps) { - + setOpen(false)} /> diff --git a/src/components/ui/Sheet.tsx b/src/components/ui/Sheet.tsx index 42742f3..18431ec 100644 --- a/src/components/ui/Sheet.tsx +++ b/src/components/ui/Sheet.tsx @@ -3,6 +3,7 @@ import { type VariantProps, cva, cx } from '@/lib/utils'; import * as SheetPrimitive from '@radix-ui/react-dialog'; import { XIcon } from 'lucide-react'; +import { useTranslations } from 'next-intl'; import { forwardRef } from 'react'; const Sheet = SheetPrimitive.Root; @@ -45,31 +46,30 @@ const sheetVariants = cva({ }, }); -interface SheetContentProps - extends React.ComponentPropsWithoutRef, - VariantProps { - close: string; -} - const SheetContent = forwardRef< React.ComponentRef, - SheetContentProps ->(({ side = 'right', className, children, close, ...props }, ref) => ( - - - - {children} - - - {close} - - - -)); + React.ComponentPropsWithoutRef & + VariantProps +>(({ side = 'right', className, children, ...props }, ref) => { + const t = useTranslations('ui'); + return ( + + + + {children} + + + {t('close')} + + + + ); +}); + SheetContent.displayName = SheetPrimitive.Content.displayName; const SheetHeader = ({ diff --git a/src/lib/locale/index.ts b/src/lib/locale/index.ts index 7c46cdf..17bc19a 100644 --- a/src/lib/locale/index.ts +++ b/src/lib/locale/index.ts @@ -18,9 +18,9 @@ const routing = defineRouting({ }, pathnames: { '/': '/', - '/auth/sign-in': { - en: '/auth/sign-in', - no: '/autentisering/logg-inn', + '/auth': { + en: '/auth', + no: '/autentisering', }, '/auth/create-account': { en: '/auth/create-account', @@ -30,6 +30,10 @@ const routing = defineRouting({ en: '/auth/forgot-password', no: '/autentisering/glemt-passord', }, + '/auth/success': { + en: '/auth/success', + no: '/autentisering/success', + }, '/events': { en: '/events', no: '/arrangementer', diff --git a/tailwind.config.ts b/tailwind.config.ts index 712a019..f472067 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -1,4 +1,3 @@ -import tailwindContainerQueries from '@tailwindcss/container-queries'; import tailwindFluid, { extract, screens, fontSize } from 'fluid-tailwind'; import tailwindScrollbar from 'tailwind-scrollbar'; import type { Config } from 'tailwindcss'; From 5561c9104efa592b052330a325577a0a06e90010 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:38:07 +0100 Subject: [PATCH 22/42] fix: badge not being hoverable --- src/components/storage/ShoppingCartLink.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/storage/ShoppingCartLink.tsx b/src/components/storage/ShoppingCartLink.tsx index 6bd6efd..8d5feb7 100644 --- a/src/components/storage/ShoppingCartLink.tsx +++ b/src/components/storage/ShoppingCartLink.tsx @@ -36,7 +36,7 @@ function ShoppingCartLink({ t }: ShoppingCartLinkProps) { {!isLoading && cart && cart.length > 0 && ( {cart.length} From a34397cc9e42ec2cc55ff5398a8b2d0f2460843b Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Thu, 7 Nov 2024 18:41:17 +0100 Subject: [PATCH 23/42] feat: add account signin form --- bun.lockb | Bin 266716 -> 266716 bytes messages/en.json | 30 ++++- messages/no.json | 30 ++++- src/app/[locale]/auth/account/page.tsx | 12 ++ src/app/[locale]/auth/create-account/page.tsx | 32 +++++ src/app/[locale]/auth/page.tsx | 14 ++- src/components/auth/AccountSignInForm.tsx | 111 ++++++++++++++++++ src/components/composites/PasswordInput.tsx | 48 ++++++++ src/components/layout/header/ProfileMenu.tsx | 5 +- src/lib/locale/index.ts | 4 + src/validations/auth/accountSignInSchema.ts | 25 ++++ 11 files changed, 302 insertions(+), 9 deletions(-) create mode 100644 src/app/[locale]/auth/account/page.tsx create mode 100644 src/app/[locale]/auth/create-account/page.tsx create mode 100644 src/components/auth/AccountSignInForm.tsx create mode 100644 src/components/composites/PasswordInput.tsx create mode 100644 src/validations/auth/accountSignInSchema.ts diff --git a/bun.lockb b/bun.lockb index 598e05a5acbb82de0a61c1e3616e2e66a699f0b5..03621b425c3cd2492d6780599655e89e12c37838 100755 GIT binary patch delta 31 ncmcb!Sm4fLfrb{wEldmh*cs!D^-T2)+E?^3ZC}yHY|;z>$A}Bb delta 31 jcmcb!Sm4fLfrb{wEldmh*qIo>pnXLj)Akj8%qGnMwNDCo diff --git a/messages/en.json b/messages/en.json index ba8261a..003813a 100644 --- a/messages/en.json +++ b/messages/en.json @@ -21,7 +21,9 @@ "selectMonth": "Select month", "selectYear": "Select year", "pickDate": "Pick a date", - "dateFormat": "dd/MM/yyyy" + "dateFormat": "dd/MM/yyyy", + "hidePassword": "Hide password", + "showPassword": "Show password" }, "error": { "notFound": "404 - Page not found", @@ -37,7 +39,31 @@ "signInWith": "Sign in with", "hackerspaceAccount": "Hackerspace Account", "success": "Success!", - "home": "Home" + "home": "Home", + "signIn": "Sign in", + "useYourAccount": "Use your account", + "forgotPassword": "Forgot password?", + "submit": "Submit", + "form": { + "username": { + "label": "Username", + "required": "Username is required", + "minLength": "Username must be at least 5 characters", + "maxLength": "Username must be less than 8 characters", + "invalid": "Username must contain only letters" + }, + "password": { + "label": "Password", + "required": "Password is required", + "minLength": "Password must be at least 8 characters", + "maxLength": "Password must be less than 50 characters", + "uppercase": "Password must contain at least one uppercase letter", + "specialChar": "Password must contain at least one special character", + "confirmLabel": "Confirm password", + "mismatch": "Passwords do not match", + "weak": "Password is too weak" + } + } }, "layout": { "hackerspaceHome": "Hackerspace homepage", diff --git a/messages/no.json b/messages/no.json index f52f7ba..b3592f5 100644 --- a/messages/no.json +++ b/messages/no.json @@ -21,7 +21,9 @@ "selectMonth": "Velg måned", "selectYear": "Velg år", "pickDate": "Velg en dato", - "dateFormat": "dd.MM.yyyy" + "dateFormat": "dd.MM.yyyy", + "hidePassword": "Gjem passord", + "showPassword": "Vis passord" }, "error": { "notFound": "404 - Siden ble ikke funnet", @@ -37,7 +39,31 @@ "signInWith": "Logg inn med", "hackerspaceAccount": "Hackerspace-konto", "success": "Suksess!", - "home": "Hjem" + "home": "Hjem", + "signIn": "Logg inn", + "useYourAccount": "Bruk din konto", + "forgotPassword": "Glemt passord?", + "submit": "Send", + "form": { + "username": { + "label": "Brukernavn", + "required": "Brukernavn er påkrevd", + "minLength": "Brukernavn må være minst 5 tegn", + "maxLength": "Brukernavn må være mindre enn 8 tegn", + "invalid": "Brukernavn må kun inneholde bokstaver" + }, + "password": { + "label": "Passord", + "required": "Passord er påkrevd", + "minLength": "Passord må være minst 8 tegn", + "maxLength": "Passord må være mindre enn 50 tegn", + "uppercase": "Passord må inneholde minst én stor bokstav", + "specialChar": "Passord må inneholde minst ett spesialtegn", + "confirmLabel": "Bekreft passord", + "mismatch": "Passordene stemmer ikke overens", + "weak": "Passordet er for svakt" + } + } }, "layout": { "hackerspaceHome": "Hackerspace hjemmeside", diff --git a/src/app/[locale]/auth/account/page.tsx b/src/app/[locale]/auth/account/page.tsx new file mode 100644 index 0000000..30725ec --- /dev/null +++ b/src/app/[locale]/auth/account/page.tsx @@ -0,0 +1,12 @@ +import { AccountSignInForm } from '@/components/auth/AccountSignInForm'; +import { setRequestLocale } from 'next-intl/server'; + +export default async function AccountPage({ + params, +}: { + params: Promise<{ locale: string }>; +}) { + const { locale } = await params; + setRequestLocale(locale); + return ; +} diff --git a/src/app/[locale]/auth/create-account/page.tsx b/src/app/[locale]/auth/create-account/page.tsx new file mode 100644 index 0000000..dbe8e68 --- /dev/null +++ b/src/app/[locale]/auth/create-account/page.tsx @@ -0,0 +1,32 @@ +import { Button } from '@/components/ui/Button'; +import { Separator } from '@/components/ui/Separator'; +import { Link } from '@/lib/locale/navigation'; +import { getTranslations, setRequestLocale } from 'next-intl/server'; + +export default async function CreateAccountPage({ + params, +}: { + params: Promise<{ locale: string }>; +}) { + const { locale } = await params; + setRequestLocale(locale); + const t = await getTranslations('auth'); + return ( +
    +
    +

    {t('success')}

    +

    + { + 'you are now a member of Hackerspace. Now you can finally start praying to our one true leader' + } +

    +
    + +
    + +
    +
    + ); +} diff --git a/src/app/[locale]/auth/page.tsx b/src/app/[locale]/auth/page.tsx index 948b62e..e64c7e3 100644 --- a/src/app/[locale]/auth/page.tsx +++ b/src/app/[locale]/auth/page.tsx @@ -1,6 +1,7 @@ import { FeideLogo } from '@/components/assets/logos/FeideLogo'; import { Button } from '@/components/ui/Button'; import { Separator } from '@/components/ui/Separator'; +import { Link } from '@/lib/locale/navigation'; import { FingerprintIcon } from 'lucide-react'; import { getTranslations, setRequestLocale } from 'next-intl/server'; @@ -21,12 +22,17 @@ export default async function SignInPage({

    {t('signInWith')}

    - -
    diff --git a/src/components/auth/AccountSignInForm.tsx b/src/components/auth/AccountSignInForm.tsx new file mode 100644 index 0000000..085df6e --- /dev/null +++ b/src/components/auth/AccountSignInForm.tsx @@ -0,0 +1,111 @@ +'use client'; + +import { accountSignInSchema } from '@/validations/auth/accountSignInSchema'; +import { useTranslations } from 'next-intl'; +import { useState } from 'react'; + +import { api } from '@/lib/api/client'; +import { Link } from '@/lib/locale/navigation'; +import { useRouter } from '@/lib/locale/navigation'; + +import { usePending } from '@/components/auth/PendingBar'; +import { PasswordInput } from '@/components/composites/PasswordInput'; +import { Button } from '@/components/ui/Button'; +import { + Form, + FormControl, + FormItem, + FormLabel, + FormMessage, + useForm, +} from '@/components/ui/Form'; +import { Input } from '@/components/ui/Input'; + +function AccountSignInForm() { + const router = useRouter(); + const t = useTranslations('auth'); + const [accountCreated, setAccountCreated] = useState(false); + const formSchema = accountSignInSchema(t as (key: string) => string, false); + const { isPending, setPending } = usePending(); + + const form = useForm(formSchema, { + defaultValues: { + username: '', + password: '', + }, + onSubmit: () => { + if (!accountCreated) { + router.push('/auth/create-account'); + } + router.push('/'); + }, + }); + + return ( +
    +
    +

    {t('signIn')}

    +

    {t('useYourAccount')}

    +
    +
    + + {(field) => ( + + {t('form.username.label')} + + field.handleChange(e.target.value)} + onBlur={field.handleBlur} + /> + + + + )} + + + {(field) => ( + +
    + {t('form.password.label')} + +
    + + field.handleChange(e.target.value)} + onBlur={field.handleBlur} + /> + + +
    + )} +
    +
    + [state.canSubmit]}> + {([canSubmit]) => ( + + )} + +
    +
    +
    + ); +} + +export { AccountSignInForm }; diff --git a/src/components/composites/PasswordInput.tsx b/src/components/composites/PasswordInput.tsx new file mode 100644 index 0000000..432a3ba --- /dev/null +++ b/src/components/composites/PasswordInput.tsx @@ -0,0 +1,48 @@ +'use client'; + +import { EyeIcon, EyeOffIcon } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import * as React from 'react'; + +import { cx } from '@/lib/utils'; + +import { Button } from '@/components/ui/Button'; +import { Input, type InputProps } from '@/components/ui/Input'; + +const PasswordInput = React.forwardRef( + ({ className, ...props }, ref) => { + const t = useTranslations('ui'); + const [showPassword, setShowPassword] = React.useState(false); + const disabled = + props.value === '' || props.value === undefined || props.disabled; + + return ( +
    + + +
    + ); + }, +); +PasswordInput.displayName = 'PasswordInput'; + +export { PasswordInput }; diff --git a/src/components/layout/header/ProfileMenu.tsx b/src/components/layout/header/ProfileMenu.tsx index 13c9b86..9504a66 100644 --- a/src/components/layout/header/ProfileMenu.tsx +++ b/src/components/layout/header/ProfileMenu.tsx @@ -7,6 +7,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/DropdownMenu'; +import { Link } from '@/lib/locale/navigation'; import { UserIcon } from 'lucide-react'; import * as React from 'react'; @@ -20,7 +21,9 @@ function ProfileMenu({ t }: { t: { profile: string; signIn: string } }) { - {t.signIn} + + {t.signIn} + ); diff --git a/src/lib/locale/index.ts b/src/lib/locale/index.ts index 17bc19a..ce6b211 100644 --- a/src/lib/locale/index.ts +++ b/src/lib/locale/index.ts @@ -22,6 +22,10 @@ const routing = defineRouting({ en: '/auth', no: '/autentisering', }, + '/auth/account': { + en: '/auth/account', + no: '/autentisering/konto', + }, '/auth/create-account': { en: '/auth/create-account', no: '/autentisering/opprett-konto', diff --git a/src/validations/auth/accountSignInSchema.ts b/src/validations/auth/accountSignInSchema.ts new file mode 100644 index 0000000..d55ac68 --- /dev/null +++ b/src/validations/auth/accountSignInSchema.ts @@ -0,0 +1,25 @@ +import { z } from 'zod'; + +function accountSignInSchema(t: (key: string) => string, isStrict = true) { + let passwordSchema = z.string().min(1, t('form.password.required')); + + if (isStrict) { + passwordSchema = passwordSchema + .min(8, t('form.password.minLength')) + .max(50, t('form.password.maxLength')) + .regex(/[A-Z]/, t('form.password.uppercase')) + .regex(/[^a-zA-Z0-9]/, t('form.password.specialChar')); + } + + return z.object({ + username: z + .string() + .min(1, t('form.username.required')) + .min(5, t('form.username.minLength')) + .max(8, t('form.username.maxLength')) + .regex(/^[a-z]+$/, t('form.username.invalid')), + password: passwordSchema, + }); +} + +export { accountSignInSchema }; From 1343259b2ced9ff3c4813f53052b337223cf9a56 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Thu, 7 Nov 2024 19:13:44 +0100 Subject: [PATCH 24/42] feat: seperate out tables and add seeding --- bun.lockb | Bin 266716 -> 267084 bytes package.json | 2 + src/app/[locale]/auth/create-account/page.tsx | 21 +------ .../[locale]/auth/forgot-password/page.tsx | 15 +++++ src/server/db/seed.ts | 42 +++++++++++++ src/server/db/tables/index.ts | 4 +- src/server/db/tables/locales.ts | 20 ++++++ src/server/db/tables/office.ts | 6 +- src/server/db/tables/skills.ts | 57 ++++++++++++++++++ src/server/db/tables/users.ts | 51 ++-------------- 10 files changed, 152 insertions(+), 66 deletions(-) create mode 100644 src/app/[locale]/auth/forgot-password/page.tsx create mode 100644 src/server/db/seed.ts create mode 100644 src/server/db/tables/locales.ts create mode 100644 src/server/db/tables/skills.ts diff --git a/bun.lockb b/bun.lockb index 03621b425c3cd2492d6780599655e89e12c37838..f0406701e4759e4b624af25190babe3ab1bf7f7e 100755 GIT binary patch delta 38914 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

    {{HGHBOued(veey-lw_zq#cu!n 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 -

    -

    {t('success')}

    -

    - { - 'you are now a member of Hackerspace. Now you can finally start praying to our one true leader' - } -

    -
    - -
    - -
    + This page is for adding info to account after first login ); } diff --git a/src/app/[locale]/auth/forgot-password/page.tsx b/src/app/[locale]/auth/forgot-password/page.tsx new file mode 100644 index 0000000..66ffbd3 --- /dev/null +++ b/src/app/[locale]/auth/forgot-password/page.tsx @@ -0,0 +1,15 @@ +import { setRequestLocale } from 'next-intl/server'; + +export default async function CreateAccountPage({ + params, +}: { + params: Promise<{ locale: string }>; +}) { + const { locale } = await params; + setRequestLocale(locale); + return ( +
    + forgot password page +
    + ); +} diff --git a/src/server/db/seed.ts b/src/server/db/seed.ts new file mode 100644 index 0000000..8ce7728 --- /dev/null +++ b/src/server/db/seed.ts @@ -0,0 +1,42 @@ +import { locales, users } from '@/server/db/tables'; +import { fakerEN, fakerNB_NO, fakerSV } from '@faker-js/faker'; + +import { routing } from '@/lib/locale'; + +import { hashPassword } from '@/server/auth/password'; +import { db } from '@/server/db'; + +const fakerMap = { + en: fakerEN, + no: fakerNB_NO, + sv: fakerSV, +}; + +console.log('Deleting existing data...'); +await db.delete(users); +// eslint-disable-next-line drizzle/enforce-delete-with-where +await db.delete(locales); +console.log('Existing data deleted.'); + +console.log('Inserting locales...'); +const insertedLocales = await db + .insert(locales) + .values(routing.locales.map((locale) => ({ locale }))) + .returning(); +console.log('Locales inserted'); + +const user = { + firstName: 'Frank', + lastName: 'Sinatra', + birthDate: new Date('1915-12-12'), + phone: '+1234567890', + email: 'm@example.com', + emailVerifiedAt: new Date(), + passwordHash: await hashPassword('Password1!'), +}; + +console.log('Inserting user...'); +await db.insert(users).values(user); +console.log('User inserted'); + +process.exit(); diff --git a/src/server/db/tables/index.ts b/src/server/db/tables/index.ts index ea1dcf2..06e02ad 100644 --- a/src/server/db/tables/index.ts +++ b/src/server/db/tables/index.ts @@ -1,2 +1,4 @@ -export * from './users'; export * from './office'; +export * from './users'; +export * from './locales'; +export * from './skills'; diff --git a/src/server/db/tables/locales.ts b/src/server/db/tables/locales.ts new file mode 100644 index 0000000..315f6e9 --- /dev/null +++ b/src/server/db/tables/locales.ts @@ -0,0 +1,20 @@ +import type { InferInsertModel, InferSelectModel } from 'drizzle-orm'; +import { index, pgTable, serial, varchar } from 'drizzle-orm/pg-core'; + +const locales = pgTable( + 'locales', + { + id: serial('id').primaryKey(), + locale: varchar('locale', { length: 2 }).notNull(), + }, + (table) => { + return { + localeIndex: index('locale_idx').on(table.locale), + }; + }, +); + +type SelectLocale = InferSelectModel; +type InsertLocale = InferInsertModel; + +export { locales, type SelectLocale, type InsertLocale }; diff --git a/src/server/db/tables/office.ts b/src/server/db/tables/office.ts index d1e51fd..7de264d 100644 --- a/src/server/db/tables/office.ts +++ b/src/server/db/tables/office.ts @@ -1,3 +1,4 @@ +import type { InferInsertModel, InferSelectModel } from 'drizzle-orm'; import { pgTable, serial, timestamp } from 'drizzle-orm/pg-core'; const coffee = pgTable('coffee', { @@ -5,4 +6,7 @@ const coffee = pgTable('coffee', { createdAt: timestamp('created_at').defaultNow().notNull(), }); -export { coffee }; +type SelectCoffee = InferSelectModel; +type InsertCoffee = InferInsertModel; + +export { coffee, type SelectCoffee, type InsertCoffee }; diff --git a/src/server/db/tables/skills.ts b/src/server/db/tables/skills.ts new file mode 100644 index 0000000..dcac406 --- /dev/null +++ b/src/server/db/tables/skills.ts @@ -0,0 +1,57 @@ +import { users } from '@/server/db/tables'; +import { relations } from 'drizzle-orm'; +import type { InferInsertModel, InferSelectModel } from 'drizzle-orm'; +import { + integer, + pgTable, + primaryKey, + serial, + varchar, +} from 'drizzle-orm/pg-core'; + +const skills = pgTable('skills', { + id: serial('id').primaryKey(), + identifier: varchar('identifier', { length: 256 }).unique().notNull(), +}); + +const usersSkills = pgTable( + 'users_skills', + { + userId: integer('user_id') + .references(() => users.id) + .notNull(), + skillId: integer('skill_id') + .references(() => skills.id) + .notNull(), + }, + (t) => ({ + pk: primaryKey({ columns: [t.userId, t.skillId] }), + }), +); + +const skillsRelations = relations(skills, ({ many }) => ({ + usersSkills: many(usersSkills), +})); + +const usersSkillsRelations = relations(usersSkills, ({ one }) => ({ + skill: one(skills, { + fields: [usersSkills.skillId], + references: [skills.id], + }), + user: one(users, { + fields: [usersSkills.userId], + references: [users.id], + }), +})); + +type SelectSkill = InferSelectModel; +type InsertSkill = InferInsertModel; + +export { + skills, + skillsRelations, + usersSkills, + usersSkillsRelations, + type SelectSkill, + type InsertSkill, +}; diff --git a/src/server/db/tables/users.ts b/src/server/db/tables/users.ts index 72186a0..e5a0854 100644 --- a/src/server/db/tables/users.ts +++ b/src/server/db/tables/users.ts @@ -1,8 +1,9 @@ +import { usersSkills } from '@/server/db/tables'; import { relations } from 'drizzle-orm'; +import type { InferInsertModel, InferSelectModel } from 'drizzle-orm'; import { integer, pgTable, - primaryKey, serial, text, timestamp, @@ -17,7 +18,7 @@ const users = pgTable('users', { }); const usersRelations = relations(users, ({ many }) => ({ - usersHasSkills: many(usersHasSkills), + usersSkills: many(usersSkills), })); const sessions = pgTable('session', { @@ -31,47 +32,7 @@ const sessions = pgTable('session', { }).notNull(), }); -const skills = pgTable('skills', { - id: serial('id').primaryKey(), - identifier: varchar('identifier', { length: 256 }).unique().notNull(), -}); - -const skillsRelations = relations(skills, ({ many }) => ({ - usersHasSkills: many(usersHasSkills), -})); - -const usersHasSkills = pgTable( - 'users_has_skills', - { - userId: integer('user_id') - .references(() => users.id) - .notNull(), - skillId: integer('skill_id') - .references(() => skills.id) - .notNull(), - }, - (t) => ({ - pk: primaryKey({ columns: [t.userId, t.skillId] }), - }), -); - -const usersHasSkillsRelations = relations(usersHasSkills, ({ one }) => ({ - group: one(skills, { - fields: [usersHasSkills.skillId], - references: [skills.id], - }), - user: one(users, { - fields: [usersHasSkills.userId], - references: [users.id], - }), -})); +type SelectUser = InferSelectModel; +type InsertUser = InferInsertModel; -export { - users, - usersRelations, - sessions, - skills, - skillsRelations, - usersHasSkills, - usersHasSkillsRelations, -}; +export { users, usersRelations, sessions, type SelectUser, type InsertUser }; From 5351dd3ab015c5088f9044a72167acd142a9c623 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Thu, 7 Nov 2024 19:22:49 +0100 Subject: [PATCH 25/42] feat: setup password and session auth methods --- bun.lockb | Bin 267084 -> 268556 bytes package.json | 2 + src/server/auth/password.ts | 53 +++++++++++++++++++++++++++ src/server/auth/session.ts | 67 ++++++++++++++++++++++++++++++++++ src/server/auth/user.ts | 33 ----------------- src/server/db/seed.ts | 16 +++----- src/server/db/tables/users.ts | 12 +++++- 7 files changed, 139 insertions(+), 44 deletions(-) create mode 100644 src/server/auth/password.ts create mode 100644 src/server/auth/session.ts delete mode 100644 src/server/auth/user.ts diff --git a/bun.lockb b/bun.lockb index f0406701e4759e4b624af25190babe3ab1bf7f7e..cdd4f75c66a942f01518667e18ee798c7c6febad 100755 GIT binary patch delta 47384 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 Jy+erQ2mr9%#cluq delta 46540 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 CW+qPn diff --git a/package.json b/package.json index e086ed1..67dc22f 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,8 @@ "dependencies": { "@aws-sdk/client-s3": "^3.679.0", "@lucia-auth/adapter-drizzle": "^1.1.0", + "@oslojs/crypto": "^1.0.1", + "@oslojs/encoding": "^1.1.0", "@radix-ui/react-avatar": "^1.1.1", "@radix-ui/react-dialog": "^1.1.2", "@radix-ui/react-dropdown-menu": "^2.1.2", diff --git a/src/server/auth/password.ts b/src/server/auth/password.ts new file mode 100644 index 0000000..8276862 --- /dev/null +++ b/src/server/auth/password.ts @@ -0,0 +1,53 @@ +import { hash, verify } from '@node-rs/argon2'; +import { sha1 } from '@oslojs/crypto/sha1'; +import { encodeHexLowerCase } from '@oslojs/encoding'; + +async function hashPassword(password: string) { + if (typeof Bun !== 'undefined' && Bun.password) { + return await Bun.password.hash(password, { + algorithm: 'argon2id', + memoryCost: 19456, + timeCost: 2, + }); + } + return await hash(password, { + memoryCost: 19456, + timeCost: 2, + outputLen: 32, + parallelism: 1, + }); +} + +async function verifyPasswordHash( + hash: string, + password: string, +): Promise { + if (typeof Bun !== 'undefined' && Bun.password) { + return await Bun.password.verify(password, hash); + } + return await verify(hash, password); +} + +async function verifyPasswordStrength(password: string) { + const hash = encodeHexLowerCase(sha1(new TextEncoder().encode(password))); + const hashPrefix = hash.slice(0, 5); + try { + const response = await fetch( + `https://api.pwnedpasswords.com/range/${hashPrefix}`, + ); + const data = await response.text(); + const items = data.split('\n'); + for (const item of items) { + const hashSuffix = item.slice(0, 35).toLowerCase(); + if (hash === hashPrefix + hashSuffix) { + return false; + } + } + } catch (error) { + console.error('Error fetching pwned passwords:', error); + return false; + } + return true; +} + +export { hashPassword, verifyPasswordHash, verifyPasswordStrength }; diff --git a/src/server/auth/session.ts b/src/server/auth/session.ts new file mode 100644 index 0000000..0293f26 --- /dev/null +++ b/src/server/auth/session.ts @@ -0,0 +1,67 @@ +import { env } from '@/env'; +import type { TRPCContext } from '@/server/api/context'; +import { sha256 } from '@oslojs/crypto/sha2'; +import { + encodeBase32LowerCaseNoPadding, + encodeHexLowerCase, +} from '@oslojs/encoding'; +import { eq } from 'drizzle-orm'; +import { cookies } from 'next/headers'; + +import { type InsertSession, sessions } from '@/server/db/tables'; + +function generateSessionToken(): string { + const bytes = new Uint8Array(20); + crypto.getRandomValues(bytes); + const token = encodeBase32LowerCaseNoPadding(bytes); + return token; +} + +async function createSession( + token: string, + userId: number, + context: TRPCContext, +) { + const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token))); + const session: InsertSession = { + id: sessionId, + userId, + expiresAt: new Date(Date.now() + 1000 * 60 * 60 * 24 * 30), + }; + await context.db.insert(sessions).values(session); + return session; +} + +async function invalidateSession(sessionId: string, context: TRPCContext) { + await context.db.delete(sessions).where(eq(sessions.id, sessionId)); +} + +async function setSessionTokenCookie(token: string, expiresAt: Date) { + const cookieStore = await cookies(); + cookieStore.set('session', token, { + httpOnly: true, + sameSite: 'lax', + secure: env.NODE_ENV === 'production', + expires: expiresAt, + path: '/', + }); +} + +async function deleteSessionTokenCookie() { + const cookieStore = await cookies(); + cookieStore.set('session', '', { + httpOnly: true, + sameSite: 'lax', + secure: env.NODE_ENV === 'production', + maxAge: 0, + path: '/', + }); +} + +export { + generateSessionToken, + createSession, + invalidateSession, + setSessionTokenCookie, + deleteSessionTokenCookie, +}; diff --git a/src/server/auth/user.ts b/src/server/auth/user.ts deleted file mode 100644 index b7947e3..0000000 --- a/src/server/auth/user.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { auth } from '@/server/auth'; -import { cookies } from 'next/headers'; -import { cache } from 'react'; - -const getUser = cache(async () => { - const sessionId = - (await cookies()).get(auth.sessionCookieName)?.value ?? null; - if (!sessionId) return null; - const { user, session } = await auth.validateSession(sessionId); - try { - if (session?.fresh) { - const sessionCookie = auth.createSessionCookie(session.id); - (await cookies()).set( - sessionCookie.name, - sessionCookie.value, - sessionCookie.attributes, - ); - } - if (!session) { - const sessionCookie = auth.createBlankSessionCookie(); - (await cookies()).set( - sessionCookie.name, - sessionCookie.value, - sessionCookie.attributes, - ); - } - } catch { - // Next.js throws error when attempting to set cookies when rendering page - } - return user; -}); - -export { getUser }; diff --git a/src/server/db/seed.ts b/src/server/db/seed.ts index 8ce7728..b7ad2d6 100644 --- a/src/server/db/seed.ts +++ b/src/server/db/seed.ts @@ -1,4 +1,4 @@ -import { locales, users } from '@/server/db/tables'; +import { type InsertUser, locales, users } from '@/server/db/tables'; import { fakerEN, fakerNB_NO, fakerSV } from '@faker-js/faker'; import { routing } from '@/lib/locale'; @@ -23,15 +23,11 @@ const insertedLocales = await db .insert(locales) .values(routing.locales.map((locale) => ({ locale }))) .returning(); -console.log('Locales inserted'); - -const user = { - firstName: 'Frank', - lastName: 'Sinatra', - birthDate: new Date('1915-12-12'), - phone: '+1234567890', - email: 'm@example.com', - emailVerifiedAt: new Date(), +console.log('Locales inserted:', insertedLocales); + +const user: InsertUser = { + name: 'Frank Sinatra', + username: 'fransin', passwordHash: await hashPassword('Password1!'), }; diff --git a/src/server/db/tables/users.ts b/src/server/db/tables/users.ts index e5a0854..714df7c 100644 --- a/src/server/db/tables/users.ts +++ b/src/server/db/tables/users.ts @@ -34,5 +34,15 @@ const sessions = pgTable('session', { type SelectUser = InferSelectModel; type InsertUser = InferInsertModel; +type SelectSession = InferSelectModel; +type InsertSession = InferInsertModel; -export { users, usersRelations, sessions, type SelectUser, type InsertUser }; +export { + users, + usersRelations, + sessions, + type SelectUser, + type InsertUser, + type SelectSession, + type InsertSession, +}; From b2d052594e84629e6eb400dff42b08d8cd13c172 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Thu, 7 Nov 2024 19:24:54 +0100 Subject: [PATCH 26/42] chore: remove eslint comment not applicable in biome --- src/server/db/seed.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/server/db/seed.ts b/src/server/db/seed.ts index b7ad2d6..854a063 100644 --- a/src/server/db/seed.ts +++ b/src/server/db/seed.ts @@ -14,7 +14,6 @@ const fakerMap = { console.log('Deleting existing data...'); await db.delete(users); -// eslint-disable-next-line drizzle/enforce-delete-with-where await db.delete(locales); console.log('Existing data deleted.'); From 15df84369873df864888d027d36d2cc9a6729f26 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Thu, 7 Nov 2024 19:27:33 +0100 Subject: [PATCH 27/42] feat: add auth check to auth index --- src/server/auth/index.ts | 96 ++++++++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 37 deletions(-) diff --git a/src/server/auth/index.ts b/src/server/auth/index.ts index 48702a2..4b455b4 100644 --- a/src/server/auth/index.ts +++ b/src/server/auth/index.ts @@ -1,45 +1,67 @@ -import { env } from '@/env'; +import { sha256 } from '@oslojs/crypto/sha2'; +import { encodeHexLowerCase } from '@oslojs/encoding'; +import { eq } from 'drizzle-orm'; +import { cookies } from 'next/headers'; +import { cache } from 'react'; + import { db } from '@/server/db'; -import { sessions, users } from '@/server/db/tables'; -import { DrizzlePostgreSQLAdapter } from '@lucia-auth/adapter-drizzle'; -import { Lucia } from 'lucia'; +import { + type SelectSession, + type SelectUser, + sessions, + users, +} from '@/server/db/tables'; -const adapter = new DrizzlePostgreSQLAdapter(db, sessions, users); +async function validateSessionToken(token: string) { + const sessionId = encodeHexLowerCase(sha256(new TextEncoder().encode(token))); + const result = await db + .select({ user: users, session: sessions }) + .from(sessions) + .innerJoin(users, eq(sessions.userId, users.id)) + .where(eq(sessions.id, sessionId)); + if (result.length < 1) { + return { session: null, user: null }; + } + const firstResult = result[0]; + if (!firstResult) { + return { session: null, user: null }; + } + const { user, session } = firstResult; + if (Date.now() >= session.expiresAt.getTime()) { + await db.delete(sessions).where(eq(sessions.id, session.id)); + return { session: null, user: null }; + } + if (Date.now() >= session.expiresAt.getTime() - 1000 * 60 * 60 * 24 * 15) { + session.expiresAt = new Date(Date.now() + 1000 * 60 * 60 * 24 * 30); + await db + .update(sessions) + .set({ + expiresAt: session.expiresAt, + }) + .where(eq(sessions.id, session.id)); + } + return { session, user }; +} -const auth = new Lucia(adapter, { - sessionCookie: { - // this sets cookies with super long expiration - // since Next.js doesn't allow Lucia to extend cookie expiration when rendering pages - expires: false, - attributes: { - // set to `true` when using HTTPS - secure: env.NODE_ENV === 'production', - }, - }, - getUserAttributes: (attributes) => { - return { - // attributes has the type of DatabaseUserAttributes - username: attributes.username, - name: attributes.name, - }; - }, +const auth = cache(async () => { + const cookieStore = await cookies(); + const token = cookieStore.get('session')?.value ?? null; + if (token === null) { + return { session: null, user: null }; + } + const result = await validateSessionToken(token); + return result; }); -export * from './user'; +function sanitizeAuth(auth: { + user: SelectUser | null; + session: SelectSession | null; +}) { + const { user, session } = auth; -// IMPORTANT! -declare module 'lucia' { - // Has to be an interface - interface Register { - Lucia: typeof auth; - UserId: number; - DatabaseUserAttributes: DatabaseUserAttributes; - } -} + const sanitizedUser = user ? { ...user, passwordHash: undefined } : null; -type DatabaseUserAttributes = { - username: string; - name: string; -}; + return { user: sanitizedUser, session }; +} -export { auth }; +export { auth, validateSessionToken, sanitizeAuth }; From 9c572abe38b0e228b66245ba9582aa750eadf5f3 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Thu, 7 Nov 2024 19:37:32 +0100 Subject: [PATCH 28/42] feat: add initial schema --- .../db/migrations/0000_mute_wrecker.sql | 55 +++++ .../db/migrations/meta/0000_snapshot.json | 229 ++++++++++++++++++ src/server/db/migrations/meta/_journal.json | 13 + 3 files changed, 297 insertions(+) create mode 100644 src/server/db/migrations/0000_mute_wrecker.sql create mode 100644 src/server/db/migrations/meta/0000_snapshot.json create mode 100644 src/server/db/migrations/meta/_journal.json diff --git a/src/server/db/migrations/0000_mute_wrecker.sql b/src/server/db/migrations/0000_mute_wrecker.sql new file mode 100644 index 0000000..7c770db --- /dev/null +++ b/src/server/db/migrations/0000_mute_wrecker.sql @@ -0,0 +1,55 @@ +CREATE TABLE IF NOT EXISTS "coffee" ( + "id" serial PRIMARY KEY NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "session" ( + "id" text PRIMARY KEY NOT NULL, + "user_id" integer NOT NULL, + "expires_at" timestamp with time zone NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "users" ( + "id" serial PRIMARY KEY NOT NULL, + "username" varchar(8) NOT NULL, + "password_hash" text NOT NULL, + "name" varchar(256) NOT NULL, + CONSTRAINT "users_username_unique" UNIQUE("username") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "locales" ( + "id" serial PRIMARY KEY NOT NULL, + "locale" varchar(2) NOT NULL +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "skills" ( + "id" serial PRIMARY KEY NOT NULL, + "identifier" varchar(256) NOT NULL, + CONSTRAINT "skills_identifier_unique" UNIQUE("identifier") +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS "users_skills" ( + "user_id" integer NOT NULL, + "skill_id" integer NOT NULL, + CONSTRAINT "users_skills_user_id_skill_id_pk" PRIMARY KEY("user_id","skill_id") +); +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "session" ADD CONSTRAINT "session_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "users_skills" ADD CONSTRAINT "users_skills_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "users_skills" ADD CONSTRAINT "users_skills_skill_id_skills_id_fk" FOREIGN KEY ("skill_id") REFERENCES "public"."skills"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +CREATE INDEX IF NOT EXISTS "locale_idx" ON "locales" USING btree ("locale"); \ No newline at end of file diff --git a/src/server/db/migrations/meta/0000_snapshot.json b/src/server/db/migrations/meta/0000_snapshot.json new file mode 100644 index 0000000..c13352e --- /dev/null +++ b/src/server/db/migrations/meta/0000_snapshot.json @@ -0,0 +1,229 @@ +{ + "id": "d7625206-2961-408d-9420-6a6f22af1030", + "prevId": "00000000-0000-0000-0000-000000000000", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.coffee": { + "name": "coffee", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "session_user_id_users_id_fk": { + "name": "session_user_id_users_id_fk", + "tableFrom": "session", + "tableTo": "users", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar(8)", + "primaryKey": false, + "notNull": true + }, + "password_hash": { + "name": "password_hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": ["username"] + } + } + }, + "public.locales": { + "name": "locales", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "locale": { + "name": "locale", + "type": "varchar(2)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "locale_idx": { + "name": "locale_idx", + "columns": [ + { + "expression": "locale", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "public.skills": { + "name": "skills", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "varchar(256)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "skills_identifier_unique": { + "name": "skills_identifier_unique", + "nullsNotDistinct": false, + "columns": ["identifier"] + } + } + }, + "public.users_skills": { + "name": "users_skills", + "schema": "", + "columns": { + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "skill_id": { + "name": "skill_id", + "type": "integer", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "users_skills_user_id_users_id_fk": { + "name": "users_skills_user_id_users_id_fk", + "tableFrom": "users_skills", + "tableTo": "users", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "users_skills_skill_id_skills_id_fk": { + "name": "users_skills_skill_id_skills_id_fk", + "tableFrom": "users_skills", + "tableTo": "skills", + "columnsFrom": ["skill_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "users_skills_user_id_skill_id_pk": { + "name": "users_skills_user_id_skill_id_pk", + "columns": ["user_id", "skill_id"] + } + }, + "uniqueConstraints": {} + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} diff --git a/src/server/db/migrations/meta/_journal.json b/src/server/db/migrations/meta/_journal.json new file mode 100644 index 0000000..96eaefb --- /dev/null +++ b/src/server/db/migrations/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "postgresql", + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1731004618013, + "tag": "0000_mute_wrecker", + "breakpoints": true + } + ] +} From 4ac843c4c5f7a87b3d315bf841ee97178ab2c880 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Thu, 7 Nov 2024 19:38:06 +0100 Subject: [PATCH 29/42] chore: remvoe lucia dependency --- bun.lockb | Bin 268556 -> 252900 bytes package.json | 1 - 2 files changed, 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index cdd4f75c66a942f01518667e18ee798c7c6febad..74488d4e523a53abb05642fbaba2fcb4f52ca91f 100755 GIT binary patch delta 43992 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%0ArCd8{ZELlr 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 delta 53969 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 y9N(gu89$qbe`a$NDycC&gf|^;&#rA|`3 Date: Thu, 7 Nov 2024 20:08:13 +0100 Subject: [PATCH 30/42] chore: update lockfile --- bun.lockb | Bin 252900 -> 254412 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bun.lockb b/bun.lockb index 74488d4e523a53abb05642fbaba2fcb4f52ca91f..1bd2d7f17f9358c76086dc4b23e52abd444146ea 100755 GIT binary patch delta 44676 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
  • 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 z
    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 Date: Thu, 7 Nov 2024 20:17:18 +0100 Subject: [PATCH 31/42] feat: add missing oauth dependency --- bun.lockb | Bin 254412 -> 254780 bytes package.json | 1 + 2 files changed, 1 insertion(+) diff --git a/bun.lockb b/bun.lockb index 1bd2d7f17f9358c76086dc4b23e52abd444146ea..b5b57a454f0d826e607670dbcd9a135b57f0e8ab 100755 GIT binary patch delta 42827 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 Lv2gj$>BIjAwE{K< delta 42651 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 kx=ktH>El@kHlBAMcdnWX|11?gK{t$Fc@^ Date: Thu, 7 Nov 2024 20:22:00 +0100 Subject: [PATCH 32/42] fix: oslo dependency --- bun.lockb | Bin 254780 -> 269652 bytes package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index b5b57a454f0d826e607670dbcd9a135b57f0e8ab..da80c8e61a85bce135166705803789ac838deec7 100755 GIT binary patch delta 51439 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 YGydFn2`4$Kb0Py`H9bk%ciN+W2mh)JMgRZ+ delta 41719 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 diff --git a/package.json b/package.json index 797afb0..f04b1ee 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "@aws-sdk/client-s3": "^3.679.0", "@oslojs/crypto": "^1.0.1", "@oslojs/encoding": "^1.1.0", - "@oslojs/oauth2": "^0.5.0", "@radix-ui/react-avatar": "^1.1.1", "@radix-ui/react-checkbox": "^1.1.2", "@radix-ui/react-collapsible": "^1.1.1", @@ -57,6 +56,7 @@ "next-intl": "^3.23.5", "next-themes": "1.0.0-beta.0", "nuqs": "^2.0.4", + "oslo": "^1.2.1", "postgres": "^3.4.5", "react": "^19.0.0-rc-fb9a90fa48-20240614", "react-day-picker": "^9.2.1", From 0999ed17515bf8424502cb8fc430909c7cdee3e0 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Thu, 7 Nov 2024 20:35:31 +0100 Subject: [PATCH 33/42] chore: update lockfile --- bun.lockb | Bin 269652 -> 269284 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bun.lockb b/bun.lockb index da80c8e61a85bce135166705803789ac838deec7..3232640ee72dbdecfa40277eebbe2fdf4edcc6d3 100755 GIT binary patch delta 44335 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 H|M33+OZ~aM delta 44705 zcmeHwcU)9g*Y3=LQI3keA@+{g5D^q)qQ-)XioGi;3Mw}24U8Jai0!D`5_^xmVsEjb zAyE@!i!sI&dt!W(XpHeb&)NGhU`$@W?|Z*{?;n{TYo4{9y>>6>oIQJ(Z<2FU)+1W9cv`jpcm6vD4BUKp$A#d9zfCz^Wf@eYNt9ZUZw#a!^(3 zmh@RQiB}cw2eN>R6^;Y4pxqSK1+t)J6zV`0^pT$|=%)(z0h#fDVS`ydTWriw&URb; zO*c8(2SklDiHKTiEGR4rWZz{1atu7GDe*FpW8fH&(`_@5(=#qQa>yVg+}A1XHb8T} z12NzetQM;X8|lR-EDe=4&JCgv9LB;f3H$@d1iJ%SqdP!mR2Ntjcv0D|`JdvK+{Q$3?{sj~Wthv&{p+`QCG2|A9kL@@oxbpH*!rSFU$}3@;1J z0!&3X`+5ax%)XtfaIC^1K>BHR87~I54x59uXIz}EbYmI65HJh!PZ$t6U|>uyo2|#N zxE=#X*=%K+$b`?LYZ!4@TvVl)0Ym#6P31Hj2V_flhRc?^4lDxu33#^PCd6k8oB^^R zhmj5ox*f=ZFHv3Ib9ki9n4T$H{CE(#5zsTXS3eF4YiWIT$u(Na7MasZu7uV#;nk%& z;}YvyVXY?!$SLu2~e@cJD#Yd!+wh6~U~z^uSN0|!B~+3F)R7A!h4Zs3RkHro3|HcfpX6Bst2S4>Z2@)i1w5sJmi z@D$jb#}{F9ejfy~KtG|jEXXw=3w~UoHMTaxW&s6|{@Vv(4l={+gJlLUuzay;-$w@Q z^LK%C95qBvtL{MZ4S*b6HGquY4}RXj)~aAmATufnECS3rOtxGUkkj)q)(84ujfcXL zeh6enyMft(Yk*8xD0|8X$&UfDWhR5q4SYCGHtn^svdMxJOgQ@#nNbtzknnP}tZ_CZP#od=Cri8o zo*Cy!lo^I0yd>-%14qO~p<61#E&|(Mr88_8*IAqGS5%|~_`AUDya)Wmsu_??wHC;x zO9Haw&!@|TzXE#0wpyYM!i&P5IzwK@bI+9iY~1_6}*|UMMQACvHW-Gu*mA>ImEHXdnwPDl)b| zyP^ebrZ;PsY>~PuUeIpI4`P4fRT_3Y$9y0h*aAMvv6xEW;2xQ9k0FsgF*I!c$ufaa zKo;a2kQwKPKe2Dj&=@9+rxJ5m?B6T>v#RtpOY+M*`69Ta~9L5AC$#vW<=&J;B#k%OtYO` zrqLA0N}6|*K&ur?8!K`ai}yVyr$Ig-S7y7i?;n-+WgwgCn6kG5xd1O#{8S+OA`Zw- zE`i+GM6r>BDh=$>*S7J5Y>NEgS&C^V<)E;iGHVu}5DtaI_?`-git8~frhhNn#WT|J zAdm%Ht8kXW(F&u0%s2wbg4R~(qcERByTXU3rQcN(F%3>CVh4~lS*CEh!chwQ09o@k z3hOEKQ#c$IU;%mqS)n(o2&ch+rY8TrisWOBUaiS<<3jFo@wYF_F?R*Xo;w2MI&$TT z><~=N$o`SNqRzqQ`jZS~{R>=^@rD2y53_jas6kP-2R1npYP67(X7F_xz6Z#3qk)`E zitmwN1$>N%ypmxvz#LjfU~@8H)sV}=m-5Qj2Ivhw1jzNLG_W8ro5G)O$PslD$PtyY z^J<=Ty2snO#v32Mzkl-1gd!eU?9GkDa!&hrBL(jt8+v)Cqo@N5fZx|`ZIXgwIJ<<4bf z@eOsf&1JJSHIk}?7>QM#j+SV&SR<)wu;U1{R;HF4!>Nv`wSpFFcm{{KLy0jdA58i- zrZyg0Dd^F3fOF6rq&)>ZN_phWU~!3sRkH5 z15Ir=G+COGg)MDnn)W-ienx7w5ceWfSm=vsTJ541w;q}-YcAZb^fCQLrfE0Rv4v09~xmH zPJ0z2F~q6&E@!j7WsZ>9RRi_4uo}VAjoH3|`fsp;V7VK!MUatL+i8zBQffQ(<>hU* zsxppmp#6~%7V30-T)}3GGQvZH9sa&HTQ^gilcqgR(^^zy+tF`xnwF)K&DP1}qLdcm z4yA)hc~!QwA<){HTne-{)a>1j#5$Z&DR}?N(Ca$wWsNYrM;eKBosPvQWlbZsPO#%M zXl4wDj~^S4amN~o^_+TVe-vC+W@eB(jBZ9!yXsItrhN$w{f^M!083i{t&@@3 zAjI8NlIn%H*D%Kfyw;^@wm`G*z_o*hSpaQQnr25Mqd)5f>#d=&Wi=z$!XOW2xEZ-B z2HL+fQW`q#L5AK4jg953o#ELi*ik0f(#Aq-V{#XuwKBERA(l1*T7=1+f!5pzZxrHQ zn*$JuV0?r%b~?s8IlaRh2RqI}Yi4Q%F*F*OT32YHMpEry$NSJ)le7P5q%?6lTGhek zsOhs2S|1~|Nw6b#T`R4w(9k~M_Caf5`swx9w&bFrNp5c%SKw_GSMLd}li4*9A%Tv= zu)3JByzAR+k)}2lnk?yAXf2t#?$f|#Lq{cKHZD{M#FCrR+-YBI=q;RR!Z5st8i_5O zdQwBV%-W0yjNx;J9^uq8W9XxhY<)C%n2{Law9hh9@cxmZw{&Wm!;Ho)L-j#nR#dn- zw!jK7oAI`xw{klCaLK4^HdGw65W}-#u>Fvc(#oknhRuT6jfe_?4!H{ov5nLI)JSRLbhK#3s$!wnS3+xx6m7T4|$5_w@z~Ul| zzAhhV-(rOIaO(HKakQ8o_M%2g52xcwcW`V4JzFGdgHUsA(A&e}vTfE^-wq2yEy2NI z?062Vp*hal8ezSh`dV}YhX7(?;J-9dz_sd$3lBKt6&h%N-w2CxYM#A}X;Gp2yS>tl z1N}0rP&ne|qm$3@Y+L=zZqeDosRInoOrxDN`l6`HRD2)K>Z{vEJCtjbdP@N zEPE3pv7ghv%1G(w)Nb}Ord4oy^p{O8OBV%;9f(@^1Y(M$^mp2?8G5YKQ6-kQM4qw1 z`XFfRGR&x!fsV(pI5M&>aAmb^v1 z3=MM}x0$}fSvw30$0%r+&*+X1p~(q{TM@@gSm>tM5RVa(Mo%sYN@rlnx_}^dpxMcq zKGJABEL5|NH>M2>)w_ zbTe;=+9t?*ei^nNmJH(%dt{`HaN0W=`bejKWceFypb%(D5UKag|FP>(t$+%7xpk zq@x!tBXvZuegax^Go^^WfqIoh+2PV_3alt2b#$=(fuWCg>LsSxY*}Wcjs|Z79Kx;`(FOp=lVL?JJ zOl<-z)>J;`T{iRyPTh9~?is8c^o_8vjKCi?aQM!&(wPB`tD3{S)P7-vz2nrqW?91r z?Wwnd#i40>=rdt)_+ZNQ!61ayLRz&0^%ApX*PEAZ$3R#^%(lH{=#!k<+jES@lR_Oy zb9htaIVHp$N^K*25^m%S-raSIQ_Z)&MXXAyeV%y{Brd}L+@{sOI`$<=<}EDU;Z z1~g6~*{+|#VoSn$IivVgE1DeR;G#^2LyR212?$1QM(1JnwdQ>wt3dUGB*M0Lu+8( zB`$!*%;c(d4Hnl-Smgq>-0O|TMyS1`k!U#edFy3RW?mZfR9Lm(sPh(2&%Z(TlzDHg z_l5N~!pyrv#}-(%jBwnRI6jbBp`FGD>J4Er1rOc_=vg;P3&qAV+X5D6R3>xo&R3Sa zWw{6ox5h1k_3E3f)r)ba!QwpiFjF|AEVKz)DAVS&yl^>s3l>w)Y+jtkDof_I7uH({ zbC|Wvv_;m$#<{OIhQ%E4{M#Z>pQ@}(=Hh<}7HebnnP%H+G+r308(ZZS0k;8F1MS}$ zDGQx?lWo>g%x0Vii$fe9=-ls?cM^>&-Bx5=Sej{UGgc++D4#RyyM)Pr}(N@p?) zxC~ZWQ|k|5RYy$OmnC+}FnG4Y1N!?;{e3Xa%tErs@4;e`vEZR3rFU5mm$QR|JYcYe z+|Bl10!yxFTuE=js*kW7X6x16Ej=+h=LdPfsEQ!D^lgE~35za3cKT@9N5Ye*i zH?ph>wRbkcRyiFr_ag)I@#7>kwi23RWRUv-4%zTlAs$dO`fv{2gH_qg z1b2XX!Gl)2a;&w6C8s6VjYY~r!TSVxWC+S~NVbT)@9GAtu`C28!3J0|5oT};7PCX! zp}si|<3`l9&{vKYuyFr{F}K}FT<3KB2s?y#VOqr_Mwa!Vde0+rM3}?Yu?7|%o_d9N zKw%%_MmHkJ{V1|CQriSOoX2>brZy8AZtZVX>oS%RZBr{h2cNIYXA-v+6cmXxM_mZo`s zY(AsHuX~!dCQZASrd9a_&oJh*#}H`pYJ$;a|IpBPIUSzoSzpgx!H&+*P$Os?(zIXF zw0aj98lD{D4h0)VaJvpI%+yL>w6xeXZBLr^GEHmrDgBamhuA+g&hB>NJVCZ4qf6 zXdh>!?04!vf#a+-pWpPLD{_!y5or}@A8sTba5^4=Gxy5%CReRVcEJcT!VY3r1xy5D zV{G9*z3esP?7>jSxN8`$M(V*}{TQ?w2*yo7%Ru|DM&co-R_VHN_E0FcAoase`*9=e zuv2sU!kBhAR15sVID0tMKFH9IIQ8vcAXl?on8KRlhB56(s2+Ah4t89an_xfisMC@3 zCASuFkrugoq7Hv$@Z^=L4Pp&t*9#~Q(P!h8|k zAeeS0HU!!s7)mB$3Yjk=d8|bI#ElQ$HVx7h!dH6C3_A+q4vB&Al@8<0jQWFgKn6pY z@DK=JL`EDAAwL4b0*;0-!?DVaSM~%T(|H$?2{Ii*zZuG&3uJr&VZoN#nn;J`Fm%WU z2pu*-_#!faEf7x#R&>+GQfn6IFpw{zX3YE0sk4|^S!{)j8y_Aqt>0i}HrAY|!c#)F z%zRTw)dO!t)Abc(NwO*b*C9)m9pTx5g_YmmU@f@4k>j8I+>NA@#f)7ibDC8sqq0hm zEP}t{|2L4MAkdCe5qv>OLw0wFvWaXnCon&-jpF|&$aMOtbo$wux^d`K0pp8PEsT)U z9(7>b;#6>YBsCOo#9=BtJ+kXYfY*$1rwbUcC7Lw(qp``(<6&8LGiCc2EC)g ziEN-LK*pN}WJ}Hf;?Fiy@pIU+%y2FU;(X;G=!F-N>H@qmf%k#lz+@o(_c8Dlq~9U% zoQOOaNBcC81vv}EpY0sqOhnJ-f$}8?I(`kL#733*BGPW4Yzr${%HJU)He*C1HKkk_(`x~X*+c*t(28#gS)KN#D+uw7W6f2tQlEoLNySl*rKD$|f=u9*|^Z2dnTQ3gdum_2J4M0pyFwbVe#11!T|| zzA0q*SWS(;@ya1VIlKun(&jdw3n&y_~lTT(RxK} z0OHTK32!Vh&z{rXg*Rrj8^{Ebfeb$g#Gma5-WYxq$nfKeKMCZ-NKyPbg{eTy%y`>p zQn6iE0XKkVQv&g4yQBDf3LgL&{x2Xi{29oC{HE}w;+ZRX2Xj|Q|4guX&Cg--=zl7R zW6P~DACNUDpzK0G{Mm{sED2PCMMWW*3;%K|$oI}*rQGyurU#z-LkY~%1o|A{md zGTlkAIsFzn(EiMjUz+19J+eTn!85`dg=>}H>ySYk@y0&hto(>fXB&{|Y*##y_KtW( z>_~@9V3)GfBO~lq5%;KYBK`L&o5&g;1~TJgK*l?+!inThDm&g%h;%%q98#2hRyh(G zF;&@rhx9wI{D>^zMP;W)_{G~Usetszf_$zbUQyxckqKS{&x~#WF`jIGwU5>EAK=a+dOXWCHi-Xmq(yAQz)OG@~grk}k+A=p&Wr4?sHnOL-9)>t`U-`c>Ia zRXCCSZ;F4e_`gF=1UL4v#CS6UcM#0Tp#q3ZIJ2_TBmF$Ua|RSu;Y7A(31t)MS5nzT z&a8^cb|F`=*9N>f&u*!z5>AigtAl4nY5-ZFK;=gyUy~~sYtmc={NKj-|3rqYNdziT z02r+*@`f1yUybk|_BWP(mfsu${5mdss4tLf>R?rm^vE6^2A)H0qzZo>GM!NfCyrKr zMA~D3Y_D<39-qk^nRsj>Vbs190_t>+xcRyorjlg?)u{l^%O zu6rL0%eOTA#MVPYzsS1o>kCub_Fa*`a)r*hW8ayG)xd81BgY@W0CBgay`5Ol%I+z` zTiKh~1I5BtAR4s>@q$E65!M>SQxcn7g9sMSNUU!IqDvbPwZ(=uAlkPD;n^01Q*>wx z!lNCCLnP`5y&Z_XBx2ivs3-Q3h;9#}NP7_VMNE4T1v`L9CDBlLbpUaO#JCP1!bA#* zksU!)>IkBV7}XI(`A#5ikO&t(oj_b6k<a8^jF~vBIY}h$|$LdV?4!u9BGA z2Sn{YAO?%XJ|KdkK|CZ8Cu&B6xIBp1E{O#(Ai`rnj1UWBKs4$L;suFOBCIcn zrzAG_1u;fEBeA|8h%Ws=j1wFBfoR_!glB&c@uEY25FW804w0B3^jHvkNyNs2m?-v< zh#ml<$N&(NMa%#Y1qXsiB{4;K4Fqw9#JGVV5=9D$k%K@~8U*4!F=`Nq@`FL#Adw_| z27|alB55#)nc^ymsY5{29s**vNE`wpC=SF!5{9T52jUKiC2=6;iMu2g3L9tL8uct&FVa1dRFgIFRq3bND!;UJ`&NRKol7TVvUFy1)|_+5UC{A39r#0&X5>48pH;XLSp0?5S7M& z*eFJg0a1P|h#Mp}3!kwdu8>F?3u3FdN@D6b5VgmF*e(*sfe0E8;vtEhqULxIcStN5 z4`R2tOJYGhi12t2$zowVh(-w@UXa))!V*9{C9ydH!~yY)#QF&!x=a9ZNNkt@qWwD{ zJl_FvM09uugvUe>he#X~`a}?WNyJVB@uAp9B6<>tB9lOz6fu)P6r2nqmBeY`H5tSi z65}R=ND(O{M!pN8(z_teiBa!@C_e?n4HBusX9|cbB$B3p_(WVKF?A}4+EYPX5Q$Sk z1SNuaNa9mbGZDlc5=#<6ToQLlESLr&d>V+$V&OCpjot(Cg2Yu3_8y3*BsRYX;<|W7 zV*PXwU8aM$AvR10(LM=;XA+2;qC*l0j~O5ik+>!F86ftOh@AoAw%A7^dM1b>GeLYS zVrGIUI15B7iSLEiED&c%jGG1Gu1Fyf%mwkYxJzQeJP_gYK>R8e&I8eCK8P12 zo{6ye_ICE)#0tW5@eCl=3j}u&2!0_p2oUWTfbd)Z;-%=Y0EEXv5Qj+Eg}xBPUJ|hj zLAZ&1B%&9AD6$BIL&PisQE)McR1%qm*J5PmAqEq4kwVBKO1uxqDn=2qi3ig$(?10vt$`E$tUiTSg;&K_;L^h#KPqu8m$2F zf`pd{TLI!JiOnlOc#CHw)~^K7WhICrV#7+LT~ydt0g8zZgyLd5p@h&^14@cWLMgG2 zP+H_#11KY62xY}FLOJ2J7EoRcCisXHLIqJ`9l%$NB2*L?2$h7-dO&3{flx(UB~%rD z8vuSH5g>v-K;a&4K;isF%@4p=7qbZg;x0fe*offpjR+1D3pauf5|0TrMc5`lEwO?S zES?cUM8sx5ZLxt6D(qVTPSJtzme@|HBlN9+x+0QLPwXSSEplxG)E6;?2I3f@q43%c zXe0&`!bA$8u_&;VzJ2Shuua1Y)ZC4+cDqJs!a2Jw`{=423^#4{4> z_k!rM7ep7aVK0dG`#^Z^1JO-%*ayO6KZrvlB89#m#9k7y`$6;+`#{)xiChN&Q6h%W zTO1?w5ncxY(PA(mMx+q>iV}wa{lq9je{tcEJ=tOYr{m<=50GH;`Rn%n+N6n|$o7y_Mau6`#pvmrk#yl|J>aWV&Oo zBHfRsWk@%~%yH9ogjB(CW0e?lTrNVswEymCvj#`h1j^y0r|0Rl=I7}N7l1ik#oJ{T z&-#yC*M;BL_7RTTJK)Qxtr(i@e%s#2t~J`5-0T~BU(HeFC=S;!h0L;aXTC>^JUYeD z?<7*bdvL7fwv)mJo#(n5>lDdCTo@&(mAD#?fUY&7ul6)U2&Jn+*~d@T#dee!_WNakUi3(^Nbh%jm)2 z7%vB8za5{=l5D6Pd1~=3II`xA6qgG+Kjh{sOmVrP^I4v+#){*?!trb#yqbW+AOF*n zjc1Bj^Kj*t5BdbfHRFL-){aLeN`T}CxXl&E(+8y#XPq!D2(BJ@e@iZ#^cvQHgYC-;UO>*&t@x~_MtBoRyKu<*|o2{+libDTXaqSdW4BREf z@rWxEEDpJ%xDMd($A2qmyQ;WO%C982!*+a0f&I`~k)@!QgCk$oS=rLib1Kd{FIxs2 zj~B3Ocy^Y-Wg$F;!mjBKjxAbFtcb=KFAp^sjlmwW4#WCD=Se^IhIKHug5uclqg1k- z69MpJBac>GMd+Krv606pt`c;n$GmWm)+|zG==&TP<9v++i9cHv$N}^qUsmr|g?>nJ z32Q9H)8X4rf$9t&~dO5PoBX-@M^BO16lY zSk1TOewbV^_#gI%K;j@nA)C=lTOeBGughWAj{Bu9# z0OTO#5aclADC9U~CnOnyC8eXehOCA$1j2)_J`kR~Ee7$1@IT6Dhwyyzw~#fE)u=ze zeAEpR3F!ghy0Zwaycn_qvPzT~sCnlKfyyfeuMi)h1t*B`fm%DgFI0Y8Vyf6YPz$tI z6W;=KZ!r9#&KXf=kk&2!7Lw(mBOYMl0nTj@?k@6Z8c#2B@BU-RClG$Ju@15xvH`;X zPPYQG60!=yLxnuE$DQq8AUu^Ai)!)AE>FAqKzNWi7I_YUMDfbSQ|de_&sp36!ixwm z8oWsG0?-t~ML!hs7NicOE~FlWU%lWrQHDeK#g_LV(;@zl>W~_c=g8=H$P36Hke3in z?_P+1-qF-%<7v}m2v4Q%glvNFi0pmHGYF424n`avqu&SN62yxOzq~LS35|rzhLp66 zj|Xe{jke5TtB&9 z^19Fw!gZfFD19I?5Ux;M;`wETC`hD+qgwr-41yFxSLB88n!O+L7UTsodJOpz!b>VI zp}b=93dt+ta*VJgi2J1`J{Y1Eis!|O7pKo5mm$0;@gjta4!$%fuOGZ#@Z2{q4m=Oe z1w1`+;pakM8EHF_b|Huz@*Cpch1`SOgq(l`K#D?m0J3H#o2VD3MKo&$!%C3n$tkoc z)VaWa2ss8h4B_H_RM{5qF$_84RdJ^HGEOVmhB}8pPY7DgY+bf8Tb;eT8R6{V{E$2l z4~RP?Gb9s4gRl}yP*{G0s3xRFa`;d!hi7~cbgpic#So5;SrC3jiCaGeI3 z3gJY37cv>b)scO^EwOWfAu*KQ3Y*7|~ao9o(v*OdI4ZDpASQ)XY*`#!A z4YZtJMRu2!FuR3utS(?&id8ViWx5teyCZ~g;w|U&HR!CItq9DBO=i{5>T`y718)_C zHWRnHDSe^SbLqM=-qr^ZdP6K{tBh5&9-metCc-{UgjmhU8e4^90<5uB+w}eWx(r#n^l@2O=CKI45V8Ow z*#C2(Bte)6=QF#)nvRTM6^6W3iy6?Ilk+}%>V*mGm zbcg(>mSU@gtOEXB;o|?cbpMNmV+*1SPc!Yo4+jDD%OwHuE4X_^Vy@ zI&LQX(zis$E<*qR+de`9|65%&n*IN}QnQweARMUz^6v&Io0D;v76%rurfeNfYimk# zD!)3QS53bZk!-k+c?o<5c?$Uz@(}U>au0GBatHD?_^$RWsa&i?~YjzRWAjzSnf?x4aWz{8OBsL^R4BOix+sPGi< zBqSAb4ssUqk-`hW^N>#~z}DG;{LQA?2D}R53Pf!uzPzrSZUS#W*ldjS zCFC2(ZOFHf?;zhp?nBrezd(M3`~Z0bVYiTf0(lJi2|}NLLE?YL+aC}n$Oykf=*)h6 z4*3njj9x&zE;0-oN#<_OmMug0B#89IN+G!_+VNX8>P%a!2!kr z!e-flmY}l(!i;ij;+^SQ*&6v^=Y?=!k*^M&+nao-Edb$DLqUia#2bVIQUietBjqg$Kn_qv}~IAVwP6WyCjmwMq)zk z{I{nU%vU}q9IHu3r^qo|^9tY-BX-&nwm-Q(aqD+?2Dnn~Ns2{R=as z8Vm8R=z^%;@52EbatWD+wx1nd@zPf+Djar;*>J!|v>WO775uOtn6P!;&kdXOIQ=pF zs#f;HpY11c6Atm#4_#H-`ay|^kf}~M1XK>FS=q0KHyQ-{dkN)tRNnP-xg8tLsQ%Rv z)%uaFSq*>PHSSE&p_)AazHBt>XSB{#KT>mEv3FOxLb}5Po6ZRpKiTu;ocNGMDg;k} z3H`;GIhwzHyx2NN^R>?s*XL*@@WK9zIVeBB?d=JlfaPb(Ot_T2rDo^%!m&r3a9H>m znt!FU$}HH+Yl7i+xid=XU%8rp{<}uq8@lf01;t1RSctp*nZgCeGEuIan^v)hd+cSCoq* zrC0OHX}3ajhbTTzD~QiXSIpDAMC%P&ZoR8tP-TAy&!grf?F&I8Vi*v|nEM2?#%xb;J6zm<*tdGP24HqFjK zj`3yl5`*W%uZn2?HK3uG4R@Sfh*%8hE>_$Iyeo=)0hle0T-Le;ti~rHm0w#mD@0f2 zZh3oczqviOw$=FArqH}fweyfu$ofgo6N{^!eEN<@8M7JvE7!ntw74NKc&3S53y|X? z;ky81XpP9VNb}0F25rF!h!3kqFVNn`C(lRVq^;4#@?;I44=>aTC|8RsUX@j}en_f2X~*eja9Zq;4( zg&4g|tN3b=*{I!0S)P9$8diwv&k-WxxRz)B`&v_PE95nCGG?#(&lU9zvP*L=E)o`D z6k3_7VyGmKh+|8%Zf{B3||x;^tEAOdy}t6cK8nDWioTX)mAxf9W$ zSRvTekHv)*812?Csn!@CHmS|LuLE2T-okG=`nI}g0`RteiM92$-}46EtT@}{7cJu9 z5HJagEk006Sbz4%y&uH?a?<6nT!l;<{QjL0r%w5~LJo>lMzwwg_W9%L(F@ymU+;3@ z$2LAlwD5#HpDf+kRIYJm@qL6hijT7+tOY)*W*IE&??@H)@4?&pMb@4>^N$$*A-MeHkAA84o6Euaao7&)7JPE< z=GPrvAw@;)RY=?VHQCGU7CaA5x;EG45FrM`0UyV|M?dT5XurE%_R~U}YNsp18gT>; z0oL!=9=8quw%mN5E3SmBU$_lwG5+y{cgEtvWsQ*B!gDp!wtf=##^>ASY|r!HXO}}a zQ3nq8DWVhote?~k`S^lgnS7k)!X{f-(TL!zOikWA(dPXW5i=P-~?pW58!A0Xz->J zUyrJjLxA-w!`pv)vb$T?hCN*lp7;p27~18#zUw}oSE=$LS4c&X#I&tn zF81F(vDcmc1JAh}`iWz3z**1h^xKGp&_4;IZiGAtk;(PHxov1FWAC9v62y z=#S_>eqHXJj$L^t0ipSr< zrfvPg^0an&j-0=LD#_*GCHyv{3^hd)!vD0ryu?SFwLf*gm4`v7n2cZ3^!@Nz@p?R9f#cHH<^=EvnzMX{}#SDqC( zi^SVk|2aKJA6v3~oMxXZnry}0_hu1`aPMOX$0>q@rR{5du6@|EC~Amaua5 z83*WR{iO5N=f9rH^6>U#mtRrw104cu$=TZIU0dUd>)IPGhX_$>o96G`4-ULfJ-lY; z$wr%ZHOk8y>FRu{8Y2d8LrzKJJwSm!-_NW^%(5caLM@+ty|}Oqg`X#$FiGp@nKvBh zes9$~y@$J__Wpb@uqBH++mYl);^j`wtFZO+&duGui^OI<9?5RRa78P5go;_)amQU+ zY=@(_^?T8Kj;-8LBlov!T#ntv4J7Do{or)>)-4M@XnmlW%VDX=wF5aG7QO&)>j$UD zJm~Rbwuu{7x=MCObb~{H^^4ULKGDjxny8I)Iat4K{X_d3^RhSIUBDGmQEX<~Z#(6! z&R56s{W0lE^fxYtHsTh`&{sSs)Dii1Vri2F`?OGh*^?t-j-86MV*Hjwd~5Q*2G3K;y(iIv67J9?jQbvZBf&t)OVWM{^Xmek?ol z)G}+@4&E7}*;yYxDS3vAL3=QM#)-r|TDbRLJ6;!$_n*GYLGg34b{B_AZ|+4)Sig-o=0Ts-sk!f$%xmY#9lo3*&pr(P#w}zk4~yCIX~X&r zesVdq6OsE+nJ6&^;2j4)KDa;rx#9=!y03Va*B)9s&`fB8*h+_4aL5UV;jJq=%6vR| z1|6za4nqCRiJ3POHw0|U#S1#`f-{a2B_wp~JTvpE^JVCaP`pxv-+tu!rDy^u`~-g7 zLUHtI-0x;q-&^$KvV;fr2$8TKdnctL6jrC5tS;MFR@eIhK5ysF(WLKk7N3_n7j`|Y z)l60ZcQKxakj)ZV+fl7zS|ga% zcD0Eij-5cWVei4JsVprvBG{<-k^+;!Q{M9<|B;+ISJ7$d3t;x)>vCnm3yHUcR`JcN ztcqm z<)r4-@YTJ*oYr1oz^glcIqmH_$a(YXz8*rvp_5p*3W}RZ)B82yD&}t@&neu`WbY_% z8h46@r!;>pYbP=G6c&Iboy-HO313al_x8htz47K{!jF4ho5a>rxJDkc9BLoE7dpT7 zF7sl*b;-69DdLGa;YPWYeo)jO|EU|-2eTqrHJhKoOqYofjs5PrvHsb!4=-!1Shw z`}A7?zg+O!yrN&bb8SMoPf17I7Mkf*FVtODzw)3xgCDl(eFNcWHYPM&#HJvDL^yEu z{ju6Ndxr(qOK~}@5G&w-6XGbBm-im{<%C~Jtz@lPJKPVLe&&_!l=vZqcUY0KBso7V zUo5tCJFFqtJ2oBairQz9&=b+_EQXg;yhlhCM?eN#?I|x3zh+Ju-hKC`_K3wL3Rj&+ z2;s%(gG=o{IQ8DPcg+yib1k=x7k=~bj%MIhKSN}Dy{hq9YUD>x6+Zj1y z8fNO|{S=b&KG#S7s_mu1N55#b>%?jm8MhCwizUXUYK6RSA`UxZW%dR8h9w<%OH~J} zzRFN#k(T|-RJ6J?M&3&w7<@QMCH#E*vD>OPO+nH!)NmSWa~_NxqIpJg8Af!6=t@*M3GOBZ7~t}i8kT2 zmpXIw$xB_@R`EeG;W}ce-DI^DopDoH?I&Io?_Gwc+NPFU%;LxMSSGEF$3M?lD@1N1 zimIQzk+%@nFQ6|s50E1?Tb8KM!qLTk<+V{(L6yiXZ9WGY6qj9d|J&T`WYeo1*i820 zV)jLp`kL5C_(`0+_(mI;X(_z2xB8Qq_vxQEkN<1c+b$MsLrTeM|Cl zgIiZY{ue)q$T);lPpD5KREMY!B+^PkUrc}>zF2*W z$v+p*0a~8X;{643kLW^p zW`mV1w$u7doFm*3bx6Jx5joww0L;AJ;WbTkVw~mky1_^m1Ao=>yQAJI;xQuIzYvj` z!9Nsb?&F!O!FaLlA);Or$6(I?9UCT6)hfh`uO48dEBga*bHvR|ZeC(^X17B0@s2}f z3!xcW_saj%&lRh`gUaH0g#%KE*$C19lX5X znjm*Ho@5$q%<_oj5f*lD5H<|W@>1qYlgeZ!WsX8Kf~yFx)Q98F_X$d}TvV~6`@23t*Jqz1yZ&^g{kINJIJNxseUg@? zE1UG?vWBoq8Ap~-Of@#;D0CId)h=c&tU`%|pD{39ZZc5IlPJ#rj3Jh;$mXbarINmN zy~Lznv}Wm2k%d&lA%mw?RC7Xwn-f(H^RxjYhqcw%s zFYbG*dGuU#dFC1ea^k1WKQ&Lyr9lSCg`+4Ij=z{QSODri$dlNPG>^w7M z${hJ2DL#a=hPn4RIB>HecjWOyFMjpsNUhQiGzO^uDn|D zx${Q5HC0Pz`tjnGwhqccivJIT<;xoVR>s%FcDq}+btzSq;qc6#KI8P&P}g?psuh|q z&a-G4EAXcTGL+mkd(3M``YVQg@0KjuO2Ukc^*ydn#03&!<2uqXra3m45+nOdX)8ElTf*5lb$Y*jtJp>(1vE0 zUN(K}KnvF`n=G>TUtF5dLu#;_7ljN{?v)v){L=T{W^n+wqxg3kZ+3H<@vcHJK*ONvpR+Y$7YKSG>}iSKC3N zQeI@BM(RWnNlVT8zn&=n)?uEA&-dy?u`>Cme_j2XajpLA23LL=)=%yK(JHCNWX7Va z$4>RQrz(Al=Wk8z`V&03V+N062;qUR`>`h$xBouk zoVs(x6OGSGakwa+N&{Dl85J>+%(EE&-gOayPtH{bezI_OfpI)%ixWjmtA%hD!yM=+ za#RAuit7~tV?A$t3-w3ZcV*Qtdbjf_ab_ZY4KipJ_q5c zzcL=g?ugmN5&enS2+(Y+#i`s%_?*N#e&3`B&;b8w*i~$rbyH&TPwDeaI0qD zD{hxS(ccq(CEa{WTiHb5i%LxY#}nfQy?^i_Ha0vJV zCNuZT^7wv*26^4_6$mhS!PMU4TsiS(y zeQ?013~a0E;sPA(yTpA!;oO^KLJxX%Y;z;z=-aA(@GG)O6fcdo`Rk)YuPH@pK;x~d5&lTsQog$90u%}D$!G9x2=PLtMm^qr z<+}5r9D8^QuWlPD2A6RwPz2j%+terIVLh{!Ol-sMP@lt^E?!!Z?P7Wvw}ORzx61~a zxGn0F3N@RvfiNTZ5Eigq94&*#huOljEJ{B{lq-udWzMDi?kGiRF|#Zlr}D29C(6QY zmdI5OGrII{*)wYrmzS#0Y-K3YQ#}&2TXZkymS8_9Zk5Bt@J|-MmvbxVJt|rDzI*#> zty437a1s&tIW96dC#sZ3#`{HBc{hLiNHGpp;i>!NXgX4H@wMPK1sj{?t;TbOSTS~# z#|$mDQhY}Y+b;_FxHSzJsbaj>Ywq@g*HUiEBT`rPAF@B?j33bXI?i=;|!MR0e!5v!*6)T8o~|I#HcA3K-4HJ;}WgUmxj zi^WYi1Z;&vZZzifqyk<$+K%4mayW(%9-|7I;h8=3YQI9RkjtV{WjC)H_mxBElT&=Y zxqtR&mxKM79Bv+U^Tdo;8)+U^mbvCTCdO9A`0`aA;{L_nW8F4=?uxrnY^{ueB^yrs zUfHcW9vA$oV8{&@O#t50PRdD?eceZEa0ajK0iM z7}ez=;&8FE3euK`F$(*gmQ|107qY&3rr7UzE)rj!s#euj@3bgf6{T#WJdS-kdwre) z4S#ic^byUgqV-0>f#*u9)?L&sIa3bJg7hNIC#1cfc?+|tT-STEK z^E)Xnkh&`F0}4MxR4${(ZI2q3y{o-+_S*jcb9G%e%cjxt@wcs z2bDwr?kit@K6_ssm%~L-s+wDUeg7x&TJ~HFu7=6xcUnxZhGwj%n(_PjLw{P~`~@eo z(a`ulVKwZzAAw^)ALUS^=|_83%-J>C6&A)ccWXVNInP(3wet#Rb(CbZYRZse2KNaDoBXhH5o%c6%^Fc-5F)rDIar-L-4t zy9qY=+9QetBJEedmzmQ(UY)i|5fN~}{|W8~DE#vcx&GvMBIXwh{bV_puA1iI@N8d- z<$<^t>(|<(FfL;wdT`c>^ zcYC>I;#iPdG5iPYTYwUC)P?hUn=z}~Z7lA!1U4IMLV-5fU*@g;4tc@mM?SU(pM87wliF21_)qBY%2zmfe@(Y9 z?4AST`VZ_IS7l)2u%Xe_lII1xl^T{y8dWMOwi5maZacTq$=kQNX??S_DC};g(7muY mRLH$Vp+fn} Date: Sun, 10 Nov 2024 14:56:24 +0100 Subject: [PATCH 34/42] feat: add skills to seeding --- src/server/db/seed.ts | 67 ++++++++++++++++++++++++++++++++-- src/server/db/tables/skills.ts | 4 ++ 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/src/server/db/seed.ts b/src/server/db/seed.ts index 854a063..02d1ce1 100644 --- a/src/server/db/seed.ts +++ b/src/server/db/seed.ts @@ -1,4 +1,12 @@ -import { type InsertUser, locales, users } from '@/server/db/tables'; +import { + type InsertSkill, + type InsertUser, + type InsertUserSkill, + locales, + skills, + users, + usersSkills, +} from '@/server/db/tables'; import { fakerEN, fakerNB_NO, fakerSV } from '@faker-js/faker'; import { routing } from '@/lib/locale'; @@ -24,14 +32,67 @@ const insertedLocales = await db .returning(); console.log('Locales inserted:', insertedLocales); +console.log('Inserting user...'); const user: InsertUser = { name: 'Frank Sinatra', username: 'fransin', passwordHash: await hashPassword('Password1!'), }; -console.log('Inserting user...'); -await db.insert(users).values(user); +const insertedUser = await db.insert(users).values(user).returning(); console.log('User inserted'); +console.log('Inserting skills...'); +const skillsdata: InsertSkill[] = [ + { + identifier: 'printing', + }, + { + identifier: 'unix', + }, + { + identifier: 'raspberry', + }, + { + identifier: 'laser', + }, + { + identifier: 'arduino', + }, + { + identifier: 'souldering', + }, + { + identifier: 'workshop', + }, +]; +const insertedSkills = await db.insert(skills).values(skillsdata).returning(); +console.log('Skills inserted'); + +if (insertedUser.length === 0 || insertedSkills.length < 5) { + console.error('Error: Inserted user or skills data is incomplete.'); + process.exit(1); +} + +console.log('Inserting userskills...'); +const usersSkillsData: InsertUserSkill[] = [ + { + userId: insertedUser[0]?.id ?? 0, + skillId: insertedSkills[0]?.id ?? 0, + }, + { + userId: insertedUser[0]?.id ?? 0, + skillId: insertedSkills[1]?.id ?? 0, + }, + { + userId: insertedUser[0]?.id ?? 0, + skillId: insertedSkills[2]?.id ?? 0, + }, + { + userId: insertedUser[0]?.id ?? 0, + skillId: insertedSkills[4]?.id ?? 0, + }, +]; +await db.insert(usersSkills).values(usersSkillsData); + process.exit(); diff --git a/src/server/db/tables/skills.ts b/src/server/db/tables/skills.ts index dcac406..86df66e 100644 --- a/src/server/db/tables/skills.ts +++ b/src/server/db/tables/skills.ts @@ -46,6 +46,8 @@ const usersSkillsRelations = relations(usersSkills, ({ one }) => ({ type SelectSkill = InferSelectModel; type InsertSkill = InferInsertModel; +type SelectUserSkill = InferSelectModel; +type InsertUserSkill = InferInsertModel; export { skills, @@ -54,4 +56,6 @@ export { usersSkillsRelations, type SelectSkill, type InsertSkill, + type SelectUserSkill, + type InsertUserSkill, }; From 998660a8eef8aa6cf01080aba60b4d12dd8bc0ea Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Sun, 10 Nov 2024 15:26:49 +0100 Subject: [PATCH 35/42] chore: fixup docker locally --- compose.local.yml | 2 -- package.json | 8 ++++---- src/server/db/seed.ts | 1 + 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/compose.local.yml b/compose.local.yml index 7025a25..a62c054 100644 --- a/compose.local.yml +++ b/compose.local.yml @@ -10,7 +10,6 @@ services: - ./data/db:/var/lib/postgresql/data ports: - 5432:5432 - user: '501:20' s3: image: bitnami/minio:2024 restart: unless-stopped @@ -23,4 +22,3 @@ services: ports: - 9000:9000 - 9001:9001 - user: '501:20' diff --git a/package.json b/package.json index f04b1ee..6f14c07 100644 --- a/package.json +++ b/package.json @@ -11,15 +11,15 @@ "build": "next build", "postbuild": "mkdir -p .next/standalone/public .next/standalone/.next/static && cp -r public/* .next/standalone/public && cp -r .next/static/* .next/standalone/.next/static", "start": "drizzle-kit migrate && bun run .next/standalone/server.js", - "db:start": "docker-compose -f compose.local.yml up db -d", - "db:stop": "docker-compose -f compose.local.yml down db", + "db:start": "docker compose -f compose.local.yml up db -d", + "db:stop": "docker compose -f compose.local.yml down db", "db:generate": "drizzle-kit generate", "db:migrate": "drizzle-kit migrate", "db:push": "drizzle-kit push", "db:studio": "drizzle-kit studio", "db:seed": "bun run src/server/db/seed.ts", - "s3:start": "docker-compose -f compose.local.yml up s3 -d", - "s3:stop": "docker-compose -f compose.local.yml down s3" + "s3:start": "docker compose -f compose.local.yml up s3 -d", + "s3:stop": "docker compose -f compose.local.yml down s3" }, "dependencies": { "@aws-sdk/client-s3": "^3.679.0", diff --git a/src/server/db/seed.ts b/src/server/db/seed.ts index 02d1ce1..e86217a 100644 --- a/src/server/db/seed.ts +++ b/src/server/db/seed.ts @@ -94,5 +94,6 @@ const usersSkillsData: InsertUserSkill[] = [ }, ]; await db.insert(usersSkills).values(usersSkillsData); +console.log('Userskills inserted'); process.exit(); From b36724fe9171678f37c204fbb35d496da9cc9b61 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Sun, 10 Nov 2024 16:29:37 +0100 Subject: [PATCH 36/42] feat: add default toast on API error --- bun.lockb | Bin 269284 -> 269724 bytes package.json | 1 + src/app/[locale]/layout.tsx | 2 ++ src/components/ui/Toaster.tsx | 49 ++++++++++++++++++++++++++++++++ src/lib/api/error.ts | 27 ++++++++++++++++++ src/lib/api/queryClient.ts | 10 +++++++ src/lib/api/types.ts | 8 ++++++ src/server/api/index.ts | 3 +- src/server/api/routers/auth.ts | 26 +++++++++++++++++ src/server/api/routers/index.ts | 2 ++ 10 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 src/components/ui/Toaster.tsx create mode 100644 src/lib/api/error.ts create mode 100644 src/lib/api/types.ts create mode 100644 src/server/api/routers/auth.ts create mode 100644 src/server/api/routers/index.ts diff --git a/bun.lockb b/bun.lockb index 3232640ee72dbdecfa40277eebbe2fdf4edcc6d3..0f9617aa8a124b9ed35149814756ceca461ca464 100755 GIT binary patch delta 42055 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 B;u-(| delta 41465 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 diff --git a/package.json b/package.json index 6f14c07..57fa882 100644 --- a/package.json +++ b/package.json @@ -62,6 +62,7 @@ "react-day-picker": "^9.2.1", "react-dom": "^19.0.0-rc-fb9a90fa48-20240614", "reading-time": "^1.5.0", + "sonner": "^1.7.0", "superjson": "^2.2.1", "tailwind-merge": "^2.5.4", "tsparticles": "^3.5.0", diff --git a/src/app/[locale]/layout.tsx b/src/app/[locale]/layout.tsx index ac7f8cd..b3310ba 100644 --- a/src/app/[locale]/layout.tsx +++ b/src/app/[locale]/layout.tsx @@ -1,4 +1,5 @@ import { RootProviders } from '@/components/providers/RootProviders'; +import { Toaster } from '@/components/ui/Toaster'; import { routing } from '@/lib/locale'; import { cx } from '@/lib/utils'; import { getTranslations, setRequestLocale } from 'next-intl/server'; @@ -84,6 +85,7 @@ export default async function LocaleLayout(props: LocaleLayoutProps) {
    {children} +
    diff --git a/src/components/ui/Toaster.tsx b/src/components/ui/Toaster.tsx new file mode 100644 index 0000000..c40a780 --- /dev/null +++ b/src/components/ui/Toaster.tsx @@ -0,0 +1,49 @@ +'use client'; + +import { + CircleCheckIcon, + CircleXIcon, + InfoIcon, + LoaderIcon, + TriangleAlertIcon, +} from 'lucide-react'; +import { useTheme } from 'next-themes'; +import { Toaster as Sonner, toast } from 'sonner'; + +import { useMediaQuery } from '@/lib/hooks/useMediaQuery'; + +type ToasterProps = React.ComponentProps; + +const Toaster = ({ ...props }: ToasterProps) => { + const { theme = 'system' } = useTheme(); + const isDesktop = useMediaQuery('(min-width: 768px)'); + + return ( + , + info: , + warning: , + error: , + loading: , + }} + {...props} + /> + ); +}; + +export { Toaster, toast }; diff --git a/src/lib/api/error.ts b/src/lib/api/error.ts new file mode 100644 index 0000000..295df0b --- /dev/null +++ b/src/lib/api/error.ts @@ -0,0 +1,27 @@ +import { toast } from '@/components/ui/Toaster'; +import type { TRPCClientError } from '@/lib/api/types'; + +function handleGlobalError(error: Error) { + const TRPCError = error as TRPCClientError; + + if (TRPCError.toast) { + switch (TRPCError.toast) { + case 'success': + toast.success(TRPCError.message, { richColors: true }); + break; + case 'info': + toast.info(TRPCError.message, { richColors: true }); + break; + case 'warning': + toast.warning(TRPCError.message, { richColors: true }); + break; + default: + toast.error(TRPCError.message, { richColors: true }); + break; + } + } else { + throw error; + } +} + +export { handleGlobalError }; diff --git a/src/lib/api/queryClient.ts b/src/lib/api/queryClient.ts index b121db5..7c4b265 100644 --- a/src/lib/api/queryClient.ts +++ b/src/lib/api/queryClient.ts @@ -1,11 +1,21 @@ import { + MutationCache, + QueryCache, QueryClient, defaultShouldDehydrateQuery, } from '@tanstack/react-query'; import SuperJSON from 'superjson'; +import { handleGlobalError } from '@/lib/api/error'; + function createQueryClient() { return new QueryClient({ + queryCache: new QueryCache({ + onError: handleGlobalError, + }), + mutationCache: new MutationCache({ + onError: handleGlobalError, + }), defaultOptions: { queries: { // With SSR, we usually want to set some default staleTime diff --git a/src/lib/api/types.ts b/src/lib/api/types.ts new file mode 100644 index 0000000..887c177 --- /dev/null +++ b/src/lib/api/types.ts @@ -0,0 +1,8 @@ +import type { router } from '@/server/api'; +import type { TRPCClientError as BaseTRPCClientError } from '@trpc/client'; + +type TRPCClientError = BaseTRPCClientError & { + toast?: 'success' | 'info' | 'warning' | 'error'; +}; + +export type { TRPCClientError }; diff --git a/src/server/api/index.ts b/src/server/api/index.ts index 3e770ca..7f50e5e 100644 --- a/src/server/api/index.ts +++ b/src/server/api/index.ts @@ -1,8 +1,9 @@ -import { testRouter } from '@/server/api/routers/test'; +import { authRouter, testRouter } from '@/server/api/routers'; import { createCallerFactory, createRouter } from '@/server/api/trpc'; const router = createRouter({ test: testRouter, + auth: authRouter, }); const createCaller = createCallerFactory(router); diff --git a/src/server/api/routers/auth.ts b/src/server/api/routers/auth.ts new file mode 100644 index 0000000..b9305db --- /dev/null +++ b/src/server/api/routers/auth.ts @@ -0,0 +1,26 @@ +import { publicProcedure } from '@/server/api/procedures'; +import { RefillingTokenBucket } from '@/server/api/rate-limit/refillingTokenBucket'; +import { createRouter } from '@/server/api/trpc'; +import { getFeideAuthorizationURL } from '@/server/auth/feide'; + +import { TRPCError } from '@trpc/server'; +import { headers } from 'next/headers'; + +const ipBucket = new RefillingTokenBucket(5, 60); + +const authRouter = createRouter({ + getFeideAuthorizationURL: publicProcedure.query(async () => { + const headerStore = await headers(); + const clientIP = headerStore.get('X-Forwarded-For'); + + if (clientIP !== null && !ipBucket.check(clientIP, 1)) { + throw new TRPCError({ + code: 'TOO_MANY_REQUESTS', + message: 'Rate limit exceeded. Please try again later.', + }); + } + return getFeideAuthorizationURL(); + }), +}); + +export { authRouter }; diff --git a/src/server/api/routers/index.ts b/src/server/api/routers/index.ts new file mode 100644 index 0000000..10c2590 --- /dev/null +++ b/src/server/api/routers/index.ts @@ -0,0 +1,2 @@ +export * from './test'; +export * from './auth'; From 4b962e3da77351f4d967d366542fe8909af47cdf Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Sun, 10 Nov 2024 17:00:15 +0100 Subject: [PATCH 37/42] feat: create rpc toast error type --- messages/en.json | 3 ++- messages/no.json | 3 ++- src/server/api/locale.ts | 20 ++++++++++++++++++++ src/server/api/routers/auth.ts | 3 +++ src/server/api/trpc.ts | 7 ++++++- src/server/api/types.ts | 7 +++++++ 6 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 src/server/api/locale.ts create mode 100644 src/server/api/types.ts diff --git a/messages/en.json b/messages/en.json index 3c0eb10..a1bd925 100644 --- a/messages/en.json +++ b/messages/en.json @@ -31,7 +31,8 @@ "error": "Oops! Something went wrong", "errorDescription": "Don't worry, our best hackers are on it!", "goToHomepage": "Return to homepage", - "tryAgain": "Try again" + "tryAgain": "Try again", + "invalidLocale": "Invalid locale: {locale}" }, "auth": { "welcome": "Welcome!", diff --git a/messages/no.json b/messages/no.json index 57fa791..dffe67f 100644 --- a/messages/no.json +++ b/messages/no.json @@ -31,7 +31,8 @@ "error": "Oops! Noe gikk galt", "errorDescription": "Ikke bekymre deg, våre beste hackere jobber med saken!", "goToHomepage": "Gå tilbake til hjemmesiden", - "tryAgain": "Prøv igjen" + "tryAgain": "Prøv igjen", + "invalidLocale": "Ugyldig språk: {locale}" }, "auth": { "welcome": "Velkommen!", diff --git a/src/server/api/locale.ts b/src/server/api/locale.ts new file mode 100644 index 0000000..8c61252 --- /dev/null +++ b/src/server/api/locale.ts @@ -0,0 +1,20 @@ +import { TRPCError } from '@trpc/server'; +import { getTranslations } from 'next-intl/server'; +import { cookies } from 'next/headers'; + +import { routing } from '@/lib/locale'; + +async function getLocaleFromCookie() { + const cookieStore = await cookies(); + const locale = cookieStore.get('locale')?.value ?? routing.defaultLocale; + if (!routing.locales.includes(locale as 'en')) { + const t = await getTranslations('error'); + throw new TRPCError({ + code: 'BAD_REQUEST', + message: t('invalidLocale', { locale }), + }); + } + return locale; +} + +export { getLocaleFromCookie }; diff --git a/src/server/api/routers/auth.ts b/src/server/api/routers/auth.ts index b9305db..9d3f736 100644 --- a/src/server/api/routers/auth.ts +++ b/src/server/api/routers/auth.ts @@ -17,6 +17,9 @@ const authRouter = createRouter({ throw new TRPCError({ code: 'TOO_MANY_REQUESTS', message: 'Rate limit exceeded. Please try again later.', + data: { + toast: 'error', + }, }); } return getFeideAuthorizationURL(); diff --git a/src/server/api/trpc.ts b/src/server/api/trpc.ts index 9149adc..a1b62d5 100644 --- a/src/server/api/trpc.ts +++ b/src/server/api/trpc.ts @@ -1,4 +1,5 @@ import type { createContext } from '@/server/api/context'; +import type { TRPCError } from '@/server/api/types'; import { initTRPC } from '@trpc/server'; import superjson from 'superjson'; import { ZodError } from 'zod'; @@ -6,12 +7,16 @@ import { ZodError } from 'zod'; const trpc = initTRPC.context().create({ transformer: superjson, errorFormatter({ shape, error }) { + const TRPCError = error as TRPCError; return { ...shape, data: { ...shape.data, zodError: - error.cause instanceof ZodError ? error.cause.flatten() : null, + TRPCError.cause instanceof ZodError + ? TRPCError.cause.flatten() + : null, + toast: TRPCError.toast, }, }; }, diff --git a/src/server/api/types.ts b/src/server/api/types.ts new file mode 100644 index 0000000..758a680 --- /dev/null +++ b/src/server/api/types.ts @@ -0,0 +1,7 @@ +import type { TRPCError as BaseTRPCError } from '@trpc/server'; + +type TRPCError = BaseTRPCError & { + toast?: 'success' | 'info' | 'warning' | 'error'; +}; + +export type { TRPCError }; From 029fa38162d4af7fea8ac1989b5a72c4c436199e Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Tue, 12 Nov 2024 16:35:11 +0100 Subject: [PATCH 38/42] chore: work on getting locale onthe backend through headers --- bun.lockb | Bin 269724 -> 269724 bytes messages/en.json | 3 +- messages/no.json | 3 +- src/app/[locale]/auth/page.tsx | 16 +++++++--- src/app/api/auth/feide/route.ts | 1 + src/app/api/data/[trpc]/route.ts | 6 ++-- .../assets/logos/HackerspaceLogo.tsx | 2 +- src/components/providers/TRPCProvider.tsx | 3 ++ src/lib/api/server.ts | 3 +- src/server/api/context.ts | 11 ++++++- src/server/api/locale.ts | 29 +++++++++--------- src/server/api/routers/auth.ts | 7 +++-- src/server/api/trpc.ts | 4 +-- src/server/api/types.ts | 7 ----- src/server/auth/feide.ts | 4 +-- 15 files changed, 56 insertions(+), 43 deletions(-) delete mode 100644 src/server/api/types.ts diff --git a/bun.lockb b/bun.lockb index 0f9617aa8a124b9ed35149814756ceca461ca464..30addd66e0b32bee4c7a154c64526a77374aecd1 100755 GIT binary patch delta 31 ncmbQUTVT#^frb{wEllN8*%{*u_007Q+Uuq=ZLgckEY|@5xjG8} delta 31 jcmbQUTVT#^frb{wEllN8*_jx?puKJ?)AqWl%yJz7rv(YF diff --git a/messages/en.json b/messages/en.json index a1bd925..3c0eb10 100644 --- a/messages/en.json +++ b/messages/en.json @@ -31,8 +31,7 @@ "error": "Oops! Something went wrong", "errorDescription": "Don't worry, our best hackers are on it!", "goToHomepage": "Return to homepage", - "tryAgain": "Try again", - "invalidLocale": "Invalid locale: {locale}" + "tryAgain": "Try again" }, "auth": { "welcome": "Welcome!", diff --git a/messages/no.json b/messages/no.json index dffe67f..57fa791 100644 --- a/messages/no.json +++ b/messages/no.json @@ -31,8 +31,7 @@ "error": "Oops! Noe gikk galt", "errorDescription": "Ikke bekymre deg, våre beste hackere jobber med saken!", "goToHomepage": "Gå tilbake til hjemmesiden", - "tryAgain": "Prøv igjen", - "invalidLocale": "Ugyldig språk: {locale}" + "tryAgain": "Prøv igjen" }, "auth": { "welcome": "Velkommen!", diff --git a/src/app/[locale]/auth/page.tsx b/src/app/[locale]/auth/page.tsx index e64c7e3..dd2b79a 100644 --- a/src/app/[locale]/auth/page.tsx +++ b/src/app/[locale]/auth/page.tsx @@ -1,9 +1,11 @@ import { FeideLogo } from '@/components/assets/logos/FeideLogo'; import { Button } from '@/components/ui/Button'; import { Separator } from '@/components/ui/Separator'; +import { api } from '@/lib/api/server'; import { Link } from '@/lib/locale/navigation'; import { FingerprintIcon } from 'lucide-react'; import { getTranslations, setRequestLocale } from 'next-intl/server'; +import ExternalLink from 'next/link'; export default async function SignInPage({ params, @@ -13,17 +15,23 @@ export default async function SignInPage({ const { locale } = await params; setRequestLocale(locale); const t = await getTranslations('auth'); + const feideUrlHref = await api.auth.getFeideUrlHref(); return ( -
    +

    {t('welcome')}

    {t('description')}

    -
    +

    {t('signInWith')}

    - + + ); +} + +export { FeideButton }; diff --git a/src/components/providers/TRPCProvider.tsx b/src/components/providers/TRPCProvider.tsx index f7761f1..4011ee4 100644 --- a/src/components/providers/TRPCProvider.tsx +++ b/src/components/providers/TRPCProvider.tsx @@ -4,7 +4,7 @@ import { env } from '@/env'; import { api } from '@/lib/api/client'; import { createQueryClient } from '@/lib/api/queryClient'; import { type QueryClient, QueryClientProvider } from '@tanstack/react-query'; -import { loggerLink, unstable_httpBatchStreamLink } from '@trpc/client'; +import { httpBatchLink, loggerLink } from '@trpc/client'; import { useState } from 'react'; import SuperJSON from 'superjson'; @@ -32,14 +32,9 @@ function TRPCProvider(props: { children: React.ReactNode }) { process.env.NODE_ENV === 'development' || (op.direction === 'down' && op.result instanceof Error), }), - unstable_httpBatchStreamLink({ + httpBatchLink({ transformer: SuperJSON, url: `${env.NEXT_PUBLIC_SITE_URL}/api/data`, - headers: () => { - const headers = new Headers(); - headers.set('x-trpc-source', 'nextjs-react'); - return headers; - }, }), ], }), diff --git a/src/server/api/routers/auth.ts b/src/server/api/routers/auth.ts index f326d5a..a6a0f10 100644 --- a/src/server/api/routers/auth.ts +++ b/src/server/api/routers/auth.ts @@ -1,15 +1,16 @@ +import { env } from '@/env'; import { publicProcedure } from '@/server/api/procedures'; import { RefillingTokenBucket } from '@/server/api/rate-limit/refillingTokenBucket'; import { createRouter } from '@/server/api/trpc'; -import { getFeideAuthorizationUrl } from '@/server/auth/feide'; +import { createFeideAuthorization } from '@/server/auth/feide'; import { TRPCError } from '@trpc/server'; -import { headers } from 'next/headers'; +import { cookies, headers } from 'next/headers'; const ipBucket = new RefillingTokenBucket(5, 60); const authRouter = createRouter({ - getFeideUrlHref: publicProcedure.query(async () => { + signInFeide: publicProcedure.mutation(async () => { const headerStore = await headers(); const clientIP = headerStore.get('X-Forwarded-For'); @@ -19,8 +20,27 @@ const authRouter = createRouter({ message: 'Rate limit exceeded. Please try again later.', }); } - const feideUrl = await getFeideAuthorizationUrl(); - return feideUrl.href; + + const cookieStore = await cookies(); + const { state, codeVerifier, url } = await createFeideAuthorization(); + cookieStore.set('feide-state', state, { + path: '/', + httpOnly: true, + sameSite: 'lax', + maxAge: 60 * 10, + secure: env.NODE_ENV === 'production', + }); + cookieStore.set('feide-code-verifier', codeVerifier, { + path: '/', + httpOnly: true, + sameSite: 'lax', + maxAge: 60 * 10, + secure: env.NODE_ENV === 'production', + }); + + console.log(cookieStore.getAll()); + + return url.href; }), }); diff --git a/src/server/auth/feide.ts b/src/server/auth/feide.ts index a7d76d7..b4fa2cc 100644 --- a/src/server/auth/feide.ts +++ b/src/server/auth/feide.ts @@ -15,21 +15,22 @@ const feideOAuthClient = new OAuth2Client( }, ); -function getFeideAuthorizationUrl() { +async function createFeideAuthorization() { const state = generateState(); - const codeVerifier = generateCodeVerifier(); // Optional for PKCE flow - - return feideOAuthClient.createAuthorizationURL({ + const codeVerifier = generateCodeVerifier(); + const url = await feideOAuthClient.createAuthorizationURL({ state, scopes: ['openid', 'profile', 'email'], codeVerifier, }); + return { + state, + codeVerifier, + url, + }; } -async function validateFeideAuthorizationCode( - code: string, - codeVerifier: string, -) { +async function validateFeideAuthorization(code: string, codeVerifier: string) { try { const tokens = await feideOAuthClient.validateAuthorizationCode(code, { codeVerifier, @@ -43,9 +44,10 @@ async function validateFeideAuthorizationCode( } catch (error) { if (error instanceof OAuth2RequestError) { // probably invalid credentials etc + // will be handled by returning null } console.error(error); } } -export { getFeideAuthorizationUrl, validateFeideAuthorizationCode }; +export { createFeideAuthorization, validateFeideAuthorization }; From 095df5bb6bb1ee198b223291f5dc36b41922e474 Mon Sep 17 00:00:00 2001 From: Michael Brusegard <56915010+michaelbrusegard@users.noreply.github.com> Date: Sun, 17 Nov 2024 16:50:37 +0100 Subject: [PATCH 42/42] fix: feide route --- src/app/api/auth/feide/route.ts | 12 +++--------- src/components/auth/FeideButton.tsx | 3 ++- src/server/api/routers/auth.ts | 2 -- src/server/auth/feide.ts | 11 ++++++++++- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/app/api/auth/feide/route.ts b/src/app/api/auth/feide/route.ts index bcf74a1..d1fe004 100644 --- a/src/app/api/auth/feide/route.ts +++ b/src/app/api/auth/feide/route.ts @@ -11,33 +11,27 @@ export async function GET(request: NextRequest) { const cookieStore = await cookies(); const storedState = cookieStore.get('feide-state')?.value; const codeVerifier = cookieStore.get('feide-code-verifier')?.value; - console.log('step 1'); - console.log(code, state, storedState, codeVerifier); if (!code || !state || !storedState || !codeVerifier) { return NextResponse.json(null, { status: 400 }); } - console.log('step 2'); if (state !== storedState) { return NextResponse.json(null, { status: 403 }); } - console.log('step 3'); const tokens = await validateFeideAuthorization(code, codeVerifier); if (!tokens) { return NextResponse.json(null, { status: 500 }); } - console.log('step 4'); const userInfoResponse = await fetch(env.FEIDE_USERINFO_ENDPOINT, { headers: { Authorization: `Bearer ${tokens.accessToken}`, }, }); - console.log('step 5'); const userInfo = await userInfoResponse.json(); console.log(userInfo); - return new Response(null, { - status: 500, - }); + + cookieStore.delete('feide-state'); + cookieStore.delete('feide-code-verifier'); } diff --git a/src/components/auth/FeideButton.tsx b/src/components/auth/FeideButton.tsx index de5d9c1..937d5c5 100644 --- a/src/components/auth/FeideButton.tsx +++ b/src/components/auth/FeideButton.tsx @@ -1,6 +1,7 @@ 'use client'; import { FeideLogo } from '@/components/assets/logos/FeideLogo'; import { Button } from '@/components/ui/Button'; +import { Spinner } from '@/components/ui/Spinner'; import { api } from '@/lib/api/client'; import { useRouter } from 'next/navigation'; @@ -17,7 +18,7 @@ function FeideButton() { className='w-full bg-[#3FACC2]/90 hover:bg-[#3FACC2] dark:bg-[#222832] hover:dark:bg-[#222832]/40' onClick={() => signInMutation.mutate()} > - + {signInMutation.isPending ? : } ); } diff --git a/src/server/api/routers/auth.ts b/src/server/api/routers/auth.ts index a6a0f10..3816f51 100644 --- a/src/server/api/routers/auth.ts +++ b/src/server/api/routers/auth.ts @@ -38,8 +38,6 @@ const authRouter = createRouter({ secure: env.NODE_ENV === 'production', }); - console.log(cookieStore.getAll()); - return url.href; }), }); diff --git a/src/server/auth/feide.ts b/src/server/auth/feide.ts index b4fa2cc..5fed75b 100644 --- a/src/server/auth/feide.ts +++ b/src/server/auth/feide.ts @@ -20,7 +20,16 @@ async function createFeideAuthorization() { const codeVerifier = generateCodeVerifier(); const url = await feideOAuthClient.createAuthorizationURL({ state, - scopes: ['openid', 'profile', 'email'], + scopes: [ + 'openid', + 'profile', + 'userinfo-name', + 'userid-feide', + 'email', + 'userinfo-mobile', + 'userinfo-photo', + 'userinfo-birthdate', + ], codeVerifier, }); return {