From aa7c5de1fc6236a771bfc3b75f55960068e3e1c3 Mon Sep 17 00:00:00 2001
From: Imbus <>
Date: Thu, 14 Mar 2024 21:25:14 +0100
Subject: [PATCH] GetUserProjects handler

---
 backend/internal/handlers/global_state.go | 29 ++++++++++++++++++-----
 backend/main.go                           |  1 +
 2 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/backend/internal/handlers/global_state.go b/backend/internal/handlers/global_state.go
index 9c42133..0f3fcc0 100644
--- a/backend/internal/handlers/global_state.go
+++ b/backend/internal/handlers/global_state.go
@@ -11,12 +11,12 @@ import (
 
 // The actual interface that we will use
 type GlobalState interface {
-	Register(c *fiber.Ctx) error      // To register a new user
-	UserDelete(c *fiber.Ctx) error    // To delete a user
-	Login(c *fiber.Ctx) error         // To get the token
-	LoginRenew(c *fiber.Ctx) error    // To renew the token
-	CreateProject(c *fiber.Ctx) error // To create a new project
-	// GetProjects(c *fiber.Ctx) error          // To get all projects
+	Register(c *fiber.Ctx) error        // To register a new user
+	UserDelete(c *fiber.Ctx) error      // To delete a user
+	Login(c *fiber.Ctx) error           // To get the token
+	LoginRenew(c *fiber.Ctx) error      // To renew the token
+	CreateProject(c *fiber.Ctx) error   // To create a new project
+	GetUserProjects(c *fiber.Ctx) error // To get all projects
 	// GetProject(c *fiber.Ctx) error           // To get a specific project
 	// UpdateProject(c *fiber.Ctx) error        // To update a project
 	// DeleteProject(c *fiber.Ctx) error        // To delete a project
@@ -163,3 +163,20 @@ func (gs *GState) CreateProject(c *fiber.Ctx) error {
 
 	return c.Status(200).SendString("Project added")
 }
+
+// GetUserProjects returns all projects that the user is a member of
+func (gs *GState) GetUserProjects(c *fiber.Ctx) error {
+	// First we get the username from the token
+	user := c.Locals("user").(*jwt.Token)
+	claims := user.Claims.(jwt.MapClaims)
+	username := claims["name"].(string)
+
+	// Then dip into the database to get the projects
+	projects, err := gs.Db.GetProjectsForUser(username)
+	if err != nil {
+		return c.Status(500).SendString(err.Error())
+	}
+
+	// Return a json serialized list of projects
+	return c.JSON(projects)
+}
diff --git a/backend/main.go b/backend/main.go
index bba3fa6..f7b0f7f 100644
--- a/backend/main.go
+++ b/backend/main.go
@@ -69,6 +69,7 @@ func main() {
 		SigningKey: jwtware.SigningKey{Key: []byte("secret")},
 	}))
 
+	server.Get("/api/getUserProjects", gs.GetUserProjects)
 	server.Post("/api/loginrenew", gs.LoginRenew)
 	server.Delete("/api/userdelete", gs.UserDelete) // Perhaps just use POST to avoid headaches
 	server.Post("/api/project", gs.CreateProject)