Skip to content

Commit

Permalink
Merge pull request #53 from green-ecolution/feature/implement-treeclu…
Browse files Browse the repository at this point in the history
…sert-api

feat: implement treeclusert api
  • Loading branch information
choffmann committed Sep 14, 2024
2 parents e095675 + d6e471f commit b1f50dc
Show file tree
Hide file tree
Showing 4 changed files with 283 additions and 0 deletions.
75 changes: 75 additions & 0 deletions internal/server/http/entities/treecluster/treecluster.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package treecluster

import (
"time"

"github.com/green-ecolution/green-ecolution-backend/internal/server/http/entities/pagination"
"github.com/green-ecolution/green-ecolution-backend/internal/server/http/entities/tree"
)

type TreeClusterWateringStatus string // @Name WateringStatus

const (
TreeClusterWateringStatusGood TreeClusterWateringStatus = "good"
TreeClusterWateringStatusModerate TreeClusterWateringStatus = "moderate"
TreeClusterWateringStatusBad TreeClusterWateringStatus = "bad"
TreeClusterWateringStatusUnknown TreeClusterWateringStatus = "unknown"
)

type TreeSoilCondition string // @Name SoilCondition

const (
TreeSoilConditionSchluffig TreeSoilCondition = "schluffig"
)

type TreeClusterResponse struct {
ID int32 `json:"id,omitempty"`
CreatedAt time.Time `json:"created_at,omitempty"`
UpdatedAt time.Time `json:"updated_at,omitempty"`
WateringStatus TreeClusterWateringStatus `json:"watering_status,omitempty"`
LastWatered time.Time `json:"last_watered,omitempty"`
MoistureLevel float64 `json:"moisture_level,omitempty"`
Region string `json:"region,omitempty"`
Address string `json:"address,omitempty"`
Description string `json:"description,omitempty"`
Archived bool `json:"archived,omitempty"`
Latitude float64 `json:"latitude,omitempty"`
Longitude float64 `json:"longitude,omitempty"`
Trees []*tree.TreeResponse `json:"trees,omitempty"`
SoilCondition TreeSoilCondition `json:"soil_condition,omitempty"`
} // @Name TreeCluster

type TreeClusterListResponse struct {
Data []*TreeClusterResponse `json:"data,omitempty"`
Pagination *pagination.Pagination `json:"pagination,omitempty"`
} // @Name TreeClusterList

type TreeClusterCreateRequest struct {
WateringStatus TreeClusterWateringStatus `json:"watering_status,omitempty"`
Region string `json:"region,omitempty"`
Address string `json:"address,omitempty"`
Description string `json:"description,omitempty"`
Archived bool `json:"archived,omitempty"`
Latitude float64 `json:"latitude,omitempty"`
Longitude float64 `json:"longitude,omitempty"`
TreeIDs []*int32 `json:"tree_ids,omitempty"`
SoilCondition TreeSoilCondition `json:"soil_condition,omitempty"`
} // @Name TreeClusterCreate

type TreeClusterUpdateRequest struct {
WateringStatus TreeClusterWateringStatus `json:"watering_status,omitempty"`
LastWatered time.Time `json:"last_watered,omitempty"`
MoistureLevel float64 `json:"moisture_level,omitempty"`
Region string `json:"region,omitempty"`
Address string `json:"address,omitempty"`
Description string `json:"description,omitempty"`
Archived bool `json:"archived,omitempty"`
Latitude float64 `json:"latitude,omitempty"`
Longitude float64 `json:"longitude,omitempty"`
TreeIDs []*int32 `json:"tree_ids,omitempty"`
SoilCondition TreeSoilCondition `json:"soil_condition,omitempty"`
} // @Name TreeClusterUpdate

type TreeClusterAddTreesRequest struct {
TreeIDs []*int32 `json:"tree_ids,omitempty"`
} // @Name TreeClusterAddTrees
185 changes: 185 additions & 0 deletions internal/server/http/handler/v1/treecluster/handler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
package treecluster

import (
"github.com/gofiber/fiber/v2"
"github.com/green-ecolution/green-ecolution-backend/internal/server/http/entities/tree"
"github.com/green-ecolution/green-ecolution-backend/internal/server/http/entities/treecluster"
"github.com/green-ecolution/green-ecolution-backend/internal/service"
)

// @Summary Get all tree clusters
// @Description Get all tree clusters
// @Id get-all-tree-clusters
// @Tags Tree Cluster
// @Produce json
// @Success 200 {object} treecluster.TreeClusterListResponse
// @Failure 400 {object} HTTPError
// @Failure 401 {object} HTTPError
// @Failure 403 {object} HTTPError
// @Failure 404 {object} HTTPError
// @Failure 500 {object} HTTPError
// @Router /v1/cluster [get]
// @Param page query string false "Page"
// @Param limit query string false "Limit"
// @Param status query string false "Status"
// @Param Authorization header string true "Insert your access token" default(Bearer <Add access token here>)
func GetAllTreeClusters(_ service.Service) fiber.Handler {
return func(c *fiber.Ctx) error {
// TODO: Implement
return c.JSON(treecluster.TreeClusterListResponse{})
}
}

// @Summary Get tree cluster by ID
// @Description Get tree cluster by ID
// @Id get-tree-cluster-by-id
// @Tags Tree Cluster
// @Produce json
// @Success 200 {object} treecluster.TreeClusterResponse
// @Failure 400 {object} HTTPError
// @Failure 401 {object} HTTPError
// @Failure 403 {object} HTTPError
// @Failure 404 {object} HTTPError
// @Failure 500 {object} HTTPError
// @Router /v1/cluster/{cluster_id} [get]
// @Param cluster_id path string true "Tree Cluster ID"
// @Param Authorization header string true "Insert your access token" default(Bearer <Add access token here>)
func GetTreeClusterByID(_ service.Service) fiber.Handler {
return func(c *fiber.Ctx) error {
// TODO: Implement
return c.JSON(treecluster.TreeClusterResponse{})
}
}

// @Summary Create tree cluster
// @Description Create tree cluster
// @Id create-tree-cluster
// @Tags Tree Cluster
// @Produce json
// @Success 200 {object} treecluster.TreeClusterResponse
// @Failure 400 {object} HTTPError
// @Failure 401 {object} HTTPError
// @Failure 403 {object} HTTPError
// @Failure 404 {object} HTTPError
// @Failure 500 {object} HTTPError
// @Router /v1/cluster [post]
// @Param body body treecluster.TreeClusterCreateRequest true "Tree Cluster Create Request"
// @Param Authorization header string true "Insert your access token" default(Bearer <Add access token here>)
func CreateTreeCluster(_ service.Service) fiber.Handler {
return func(c *fiber.Ctx) error {
// TODO: Implement
return c.JSON(treecluster.TreeClusterResponse{})
}
}

// @Summary Update tree cluster
// @Description Update tree cluster
// @Id update-tree-cluster
// @Tags Tree Cluster
// @Produce json
// @Success 200 {object} treecluster.TreeClusterResponse
// @Failure 400 {object} HTTPError
// @Failure 401 {object} HTTPError
// @Failure 403 {object} HTTPError
// @Failure 404 {object} HTTPError
// @Failure 500 {object} HTTPError
// @Router /v1/cluster/{cluster_id} [put]
// @Param cluster_id path string true "Tree Cluster ID"
// @Param body body treecluster.TreeClusterUpdateRequest true "Tree Cluster Update Request"
// @Param Authorization header string true "Insert your access token" default(Bearer <Add access token here>)
func UpdateTreeCluster(_ service.Service) fiber.Handler {
return func(c *fiber.Ctx) error {
// TODO: Implement
return c.JSON(treecluster.TreeClusterResponse{})
}
}

// @Summary Delete tree cluster
// @Description Delete tree cluster
// @Id delete-tree-cluster
// @Tags Tree Cluster
// @Produce json
// @Success 200 {object} treecluster.TreeClusterResponse
// @Failure 400 {object} HTTPError
// @Failure 401 {object} HTTPError
// @Failure 403 {object} HTTPError
// @Failure 404 {object} HTTPError
// @Failure 500 {object} HTTPError
// @Router /v1/cluster/{cluster_id} [delete]
// @Param cluster_id path string true "Tree Cluster ID"
// @Param Authorization header string true "Insert your access token" default(Bearer <Add access token here>)
func DeleteTreeCluster(_ service.Service) fiber.Handler {
return func(c *fiber.Ctx) error {
// TODO: Implement
return c.JSON(treecluster.TreeClusterResponse{})
}
}

// @Summary Get all trees in tree cluster
// @Description Get all trees in tree cluster
// @Id get-all-trees-in-tree-cluster
// @Tags Tree Cluster
// @Produce json
// @Success 200 {object} tree.TreeResponse
// @Failure 400 {object} HTTPError
// @Failure 401 {object} HTTPError
// @Failure 403 {object} HTTPError
// @Failure 404 {object} HTTPError
// @Failure 500 {object} HTTPError
// @Router /v1/cluster/{cluster_id}/trees [get]
// @Param cluster_id path string true "Tree Cluster ID"
// @Param page query string false "Page"
// @Param limit query string false "Limit"
// @Param age query string false "Age"
// @Param Authorization header string true "Insert your access token" default(Bearer <Add access token here>)
func GetTreesInTreeCluster(_ service.Service) fiber.Handler {
// TODO: Change response @Success to tree.TreeListResponse
return func(c *fiber.Ctx) error {
// TODO: Implement
return c.JSON(tree.TreeResponse{})
}
}

// @Summary Add trees to tree cluster
// @Description Add trees to tree cluster
// @Id add-trees-to-tree-cluster
// @Tags Tree Cluster
// @Produce json
// @Success 200 {object} treecluster.TreeClusterResponse
// @Failure 400 {object} HTTPError
// @Failure 401 {object} HTTPError
// @Failure 403 {object} HTTPError
// @Failure 404 {object} HTTPError
// @Failure 500 {object} HTTPError
// @Router /v1/cluster/{cluster_id}/trees [post]
// @Param cluster_id path string true "Tree Cluster ID"
// @Param body body treecluster.TreeClusterAddTreesRequest true "Tree Cluster Add Trees Request"
// @Param Authorization header string true "Insert your access token" default(Bearer <Add access token here>)
func AddTreesToTreeCluster(_ service.Service) fiber.Handler {
return func(c *fiber.Ctx) error {
// TODO: Implement
return c.JSON(treecluster.TreeClusterResponse{})
}
}

// @Summary Remove trees from tree cluster
// @Description Remove trees from tree cluster
// @Id remove-trees-from-tree-cluster
// @Tags Tree Cluster
// @Produce json
// @Success 200 {object} treecluster.TreeClusterResponse
// @Failure 400 {object} HTTPError
// @Failure 401 {object} HTTPError
// @Failure 403 {object} HTTPError
// @Failure 404 {object} HTTPError
// @Failure 500 {object} HTTPError
// @Router /v1/cluster/{cluster_id}/trees/{tree_id} [delete]
// @Param cluster_id path string true "Tree Cluster ID"
// @Param tree_id path string true "Tree ID"
// @Param Authorization header string true "Insert your access token" default(Bearer <Add access token here>)
func RemoveTreesFromTreeCluster(_ service.Service) fiber.Handler {
return func(c *fiber.Ctx) error {
// TODO: Implement
return c.JSON(treecluster.TreeClusterResponse{})
}
}
21 changes: 21 additions & 0 deletions internal/server/http/handler/v1/treecluster/routes.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package treecluster

import (
"github.com/gofiber/fiber/v2"
"github.com/green-ecolution/green-ecolution-backend/internal/service"
)

func RegisterRoutes(svc service.Service) *fiber.App {
app := fiber.New()

app.Get("/", GetAllTreeClusters(svc))
app.Get("/:treecluster_id", GetTreeClusterByID(svc))
app.Post("/", CreateTreeCluster(svc))
app.Put("/:treecluster_id", UpdateTreeCluster(svc))
app.Delete("/:treecluster_id", DeleteTreeCluster(svc))
app.Get("/:treecluster_id/trees", GetTreesInTreeCluster(svc))
app.Post("/:treecluster_id/trees", AddTreesToTreeCluster(svc))
app.Delete("/:treecluster_id/trees/:tree_id", RemoveTreesFromTreeCluster(svc))

return app
}
2 changes: 2 additions & 0 deletions internal/server/http/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@ import (
"github.com/green-ecolution/green-ecolution-backend/internal/server/http/handler/v1/info"
"github.com/green-ecolution/green-ecolution-backend/internal/server/http/handler/v1/sensor"
"github.com/green-ecolution/green-ecolution-backend/internal/server/http/handler/v1/tree"
"github.com/green-ecolution/green-ecolution-backend/internal/server/http/handler/v1/treecluster"
"github.com/green-ecolution/green-ecolution-backend/internal/server/http/middleware"
)

func (s *Server) privateRoutes(app *fiber.App) {
grp := app.Group("/api/v1")

grp.Mount("/info", info.RegisterRoutes(s.services.InfoService))
grp.Mount("/cluster", treecluster.RegisterRoutes(s.services.TreeService)) // TODO: Change to treecluster service
grp.Mount("/tree", tree.RegisterRoutes(s.services.TreeService))
grp.Mount("/sensor", sensor.RegisterRoutes(s.services.MqttService))
}
Expand Down

0 comments on commit b1f50dc

Please sign in to comment.