diff --git a/backend/api_test.go b/backend/api_test.go index 597d14c..e3de9f0 100644 --- a/backend/api_test.go +++ b/backend/api_test.go @@ -40,3 +40,19 @@ func TestGetUserBadId(t *testing.T) { e := startServer(t) e.GET("/user/bad-id").Expect().Status(400) } + +func TestGetUserGoalsWhenNoGoalsPresent(t *testing.T) { + e := startServer(t) + result := e.GET("/user/1/goals").Expect().Status(200).JSON().Array() + result.Length().IsEqual(0) +} + +func TestGetUserGoalsNoUser(t *testing.T) { + e := startServer(t) + e.GET("/user/999/goals").Expect().Status(404) +} + +func TestGetUserGoalsBadId(t *testing.T) { + e := startServer(t) + e.GET("/user/bad-id/goals").Expect().Status(400) +} diff --git a/backend/db.go b/backend/db.go index b479b8a..06fe17a 100644 --- a/backend/db.go +++ b/backend/db.go @@ -57,3 +57,32 @@ func (db *Db) GetUser(id int) (*User, error) { } return user, nil } + +func (db *Db) UserExists(userId int) (bool, error) { + count := 0 + err := db.db.Query("select count(*) from users where id = ?"). + Bind(userId).ScanSingle(&count) + if err != nil { + return false, err + } + return count > 0, nil +} + +func (db *Db) GetUserGoals(userId int) ([]Goal, error) { + goals := make([]Goal, 0) + var err error + + for row := range db.db.Query("select id, name, target, progress, weight from goals where user_id = ?"). + Bind(userId).Range(&err) { + goal := Goal{} + err = row.Scan(&goal.ID, &goal.Name, &goal.Target, &goal.Progress, &goal.Weight) + if err != nil { + return nil, err + } + goals = append(goals, goal) + } + if err != nil { + return nil, err + } + return goals, nil +} diff --git a/backend/main.go b/backend/main.go index 295e717..e9ec6f1 100644 --- a/backend/main.go +++ b/backend/main.go @@ -54,6 +54,36 @@ func getUser(c *gin.Context) { c.IndentedJSON(http.StatusOK, user) } +func getUserGoals(c *gin.Context) { + userIdStr := c.Param("userId") + userId, err := strconv.Atoi(userIdStr) + if err != nil { + log.Printf("Invalid user ID: %v", err) + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"}) + return + } + + exists, err := db.UserExists(userId) + if err != nil { + log.Printf("Error checking user existence: %v", err) + c.JSON(http.StatusInternalServerError, gin.H{"error": "Internal Server Error"}) + return + } + if !exists { + log.Printf("Error checking user existence: %v", err) + c.JSON(http.StatusNotFound, gin.H{"error": "User not found"}) + return + } + + goals, err := db.GetUserGoals(userId) + if err != nil { + log.Printf("Error getting user goals: %v", err) + c.JSON(http.StatusInternalServerError, gin.H{"error": "Internal Server Error"}) + return + } + c.IndentedJSON(http.StatusOK, goals) +} + func start(ctx context.Context, config *ServerConfig) { db = NewDb(config.Datasource) defer db.db.MustClose() @@ -61,6 +91,7 @@ func start(ctx context.Context, config *ServerConfig) { router := gin.Default() router.GET("/api/users", getUsers) router.GET("/api/user/:userId", getUser) + router.GET("/api/user/:userId/goals", getUserGoals) srv := &http.Server{ Addr: ":" + config.Port, diff --git a/backend/migrations/1_initial.sql b/backend/migrations/1_initial.sql index 25869d3..14866d5 100644 --- a/backend/migrations/1_initial.sql +++ b/backend/migrations/1_initial.sql @@ -15,6 +15,7 @@ create table history create table goals ( id integer primary key, + user_id integer not null, name text not null, target integer not null, progress integer not null,