From 683a8c31335f5b28c0533d9e406e4ff7599f119a Mon Sep 17 00:00:00 2001 From: cdricms <36056008+cdricms@users.noreply.github.com> Date: Wed, 15 Jan 2025 11:54:39 +0100 Subject: [PATCH] Yes --- backend/auth.go | 72 ++++++++++++++++++++++++++ backend/go.mod | 1 + backend/go.sum | 4 ++ backend/main.go | 2 + backend/schemas.go | 1 + frontend/app/(auth)/dashboard/page.tsx | 3 +- frontend/app/(auth)/layout.tsx | 30 +---------- frontend/app/(main)/about/page.tsx | 14 +++-- frontend/app/(main)/layout.tsx | 34 +++--------- frontend/app/layout.tsx | 42 +++++++++++++++ frontend/deno.lock | 19 +++++++ frontend/next.config.ts | 11 ++-- frontend/package.json | 1 + 13 files changed, 165 insertions(+), 69 deletions(-) create mode 100644 backend/auth.go create mode 100644 frontend/app/layout.tsx diff --git a/backend/auth.go b/backend/auth.go new file mode 100644 index 0000000..2e3645e --- /dev/null +++ b/backend/auth.go @@ -0,0 +1,72 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "io" + "log" + "net/http" + "time" + + "github.com/golang-jwt/jwt/v5" +) + +type LoginInformation struct { + Email string `json:"email"` + Password string `json:"password"` +} + +type Claims struct { + UserID string `json:"user_id"` + jwt.RegisteredClaims +} + +func HandleLogin(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + log.Fatal("Not post method") + } + + if r.Body == nil { + log.Fatal("No body") + } + + body, err := io.ReadAll(r.Body) + if err != nil { + log.Fatal(err) + } + var login LoginInformation + err = json.Unmarshal(body, &login) + if err != nil { + log.Fatal(err) + } + + var user User + err = DB.NewSelect(). + Model(&user). + Where("email = ? AND password = ?", login.Email, login.Password). + Limit(1). + Scan(context.Background()) + + if err != nil { + log.Fatal(err) + } + + claims := Claims{ + UserID: user.UserID.String(), + RegisteredClaims: jwt.RegisteredClaims{ + Issuer: "latosa-escrima.fr", + Subject: "authentification", + ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour * 24)), + IssuedAt: jwt.NewNumericDate(time.Now()), + }, + } + + token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) + signed, err := token.SignedString([]byte("hello")) + if err != nil { + log.Fatal(err) + } + + fmt.Println(signed) +} diff --git a/backend/go.mod b/backend/go.mod index 29a0ae2..4dcb277 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -3,6 +3,7 @@ module fr.latosa-escrima go 1.23.4 require ( + github.com/golang-jwt/jwt/v5 v5.2.1 github.com/google/uuid v1.6.0 github.com/joho/godotenv v1.5.1 github.com/lib/pq v1.10.9 diff --git a/backend/go.sum b/backend/go.sum index e957a67..dc8aaad 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -1,5 +1,9 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= diff --git a/backend/main.go b/backend/main.go index bb322db..68e6260 100644 --- a/backend/main.go +++ b/backend/main.go @@ -43,6 +43,7 @@ func handlerCreateUser(w http.ResponseWriter, r *http.Request) { LastName: "Doe", Email: "john.doe@example.com", Phone: "1234567890", + Password: "1234", } _, err := DB.NewInsert().Model(user).Exec(context.Background()) @@ -79,6 +80,7 @@ func main() { http.HandleFunc("/", handler) http.HandleFunc("/user/new", handlerCreateUser) + http.HandleFunc("/users/login", HandleLogin) fmt.Printf("Serving on port %s\n", port) err = http.ListenAndServe(fmt.Sprintf(":%s", port), nil) diff --git a/backend/schemas.go b/backend/schemas.go index 5e7ee67..f845c3e 100644 --- a/backend/schemas.go +++ b/backend/schemas.go @@ -25,6 +25,7 @@ type User struct { FirstName string `bun:"firstname,notnull"` LastName string `bun:"lastname,notnull"` Email string `bun:"email,unique,notnull"` + Password string `bun:"password,notnull"` Phone string `bun:"phone,notnull"` Role Role `bun:"role,notnull,default:'user'"` CreatedAt time.Time `bun:"created_at,default:current_timestamp"` diff --git a/frontend/app/(auth)/dashboard/page.tsx b/frontend/app/(auth)/dashboard/page.tsx index 36e2957..7f9ebfa 100644 --- a/frontend/app/(auth)/dashboard/page.tsx +++ b/frontend/app/(auth)/dashboard/page.tsx @@ -1,3 +1,4 @@ +"use server"; import { AppSidebar } from "@/components/app-sidebar"; import { Breadcrumb, @@ -14,7 +15,7 @@ import { SidebarTrigger, } from "@/components/ui/sidebar"; -export default function Page() { +export default async function Page() { return ( diff --git a/frontend/app/(auth)/layout.tsx b/frontend/app/(auth)/layout.tsx index 0bf3e6b..dc2b33e 100644 --- a/frontend/app/(auth)/layout.tsx +++ b/frontend/app/(auth)/layout.tsx @@ -1,35 +1,7 @@ -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; -import "@/app/globals.css"; -import Navbar from "@/components/nav-bar"; - -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); - -export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; - export default function RootLayout({ children, }: Readonly<{ children: React.ReactNode; }>) { - return ( - - - {children} - - - ); + return <>{children}; } diff --git a/frontend/app/(main)/about/page.tsx b/frontend/app/(main)/about/page.tsx index 85f4e66..ea63966 100644 --- a/frontend/app/(main)/about/page.tsx +++ b/frontend/app/(main)/about/page.tsx @@ -1,16 +1,14 @@ -"use server" +"use server"; export default async function About() { + const res = await fetch("http://localhost:8000/api"); + console.log(res); return (
- About us - will : - +explain what we - +pricing - - +plannign for what will come next + About us will : +explain what we +pricing +plannign for what + will come next
- ) + ); } diff --git a/frontend/app/(main)/layout.tsx b/frontend/app/(main)/layout.tsx index 798ff81..9ed3a36 100644 --- a/frontend/app/(main)/layout.tsx +++ b/frontend/app/(main)/layout.tsx @@ -1,23 +1,5 @@ -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; -import "@/app/globals.css"; -import Navbar from "@/components/nav-bar"; import Footer from "@/components/footer"; - -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); - -export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; +import Navbar from "@/components/nav-bar"; export default function RootLayout({ children, @@ -25,14 +7,10 @@ export default function RootLayout({ children: React.ReactNode; }>) { return ( - - - - {children} -