diff --git a/internal/api/api.go b/internal/api/api.go index 9a092ed..c976c8d 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -1,7 +1,54 @@ package api -import "github.com/gin-gonic/gin" +import ( + "net/http" + "strconv" -func RegisterRoutes(router *gin.RouterGroup) { + "dymatrix.de/jspahl/todo/internal/types" + "github.com/gin-gonic/gin" +) +type ItemDTO struct { + id int + message string +} + +func ItemsToDTOs(items []types.IItem) []ItemDTO { + var itemDtos []ItemDTO + for _, item := range items { + itemDtos = append(itemDtos, ItemDTO{id: item.GetId(), message: item.GetMessage()}) + } + return itemDtos +} + +func RegisterRoutes(router *gin.RouterGroup, prov types.IPersitenceProvider) { + router.GET("/item", func(c *gin.Context) { + items, err := prov.GetAllItems() + if err != nil { + c.String(http.StatusInternalServerError, err.Error()) + return + } + itemDTOs := ItemsToDTOs(items) + c.JSON(http.StatusOK, itemDTOs) + }) + router.GET("/item/:id", func(c *gin.Context) { + id, err := strconv.Atoi(c.Param("id")) + if err != nil { + c.String(http.StatusBadRequest, err.Error()) + return + } + item, err := prov.GetItem(id) + if err != nil { + c.String(http.StatusInternalServerError, err.Error()) + return + } + c.JSON(http.StatusOK, item.ToDTO()) + }) + router.GET("/itemByUser/:id", func(c *gin.Context) { + + }) + router.POST("/item", func(c *gin.Context) {}) + router.PUT("/item", func(c *gin.Context) {}) + router.DELETE("/item/:id", func(c *gin.Context) {}) + router.GET("/link/:itemId/:userId", func(c *gin.Context) {}) } diff --git a/internal/implementations/MemoryProvider.go b/internal/implementations/MemoryProvider.go index 1db25ac..b4ff513 100644 --- a/internal/implementations/MemoryProvider.go +++ b/internal/implementations/MemoryProvider.go @@ -3,7 +3,7 @@ package implementations import ( "errors" - "dymatrix.de/jspahl/todo/internal/interfaces" + "dymatrix.de/jspahl/todo/internal/types" ) type Item struct { @@ -12,6 +12,13 @@ type Item struct { deleted bool } +func (item Item) GetId() int { + return item.id +} +func (item Item) GetMessage() string { + return item.message +} + type User struct { id int } @@ -22,13 +29,14 @@ type MemoryProvider struct { itemsByUsers [][]*Item } -func (prov MemoryProvider) CreateItem(item interfaces.IItem) error { - storedItem := Item{id: item.GetId(), message: item.GetMessage(), deleted: false} +func (prov MemoryProvider) CreateItem(item types.IItem) error { + storedItem := Item{id: prov.index, message: item.GetMessage(), deleted: false} prov.items = append(prov.items, storedItem) + prov.index++ return nil } -func (prov MemoryProvider) UpdateItem(item interfaces.IItem) error { +func (prov MemoryProvider) UpdateItem(item types.IItem) error { storedItem, err := prov.GetItemPtr(item.GetId()) if err != nil { return err @@ -45,3 +53,39 @@ func (prov MemoryProvider) GetItemPtr(id int) (*Item, error) { } return nil, errors.New("Item not found") } + +func (prov MemoryProvider) GetItem(id int) (types.IItem, error) { + item, err := prov.GetItemPtr(id) + return *item, err + +} + +func (prov MemoryProvider) GetItemByUser(user types.IUser) ([]types.IItem, error) { + var items []types.IItem + for i := range prov.itemsByUsers[user.GetId()] { + items = append(items, *prov.itemsByUsers[user.GetId()][i]) + } + if len(items) == 0 { + return items, errors.New("no items for user ") + } + return items, nil +} + +func (prov MemoryProvider) GetAllItems() ([]types.IItem, error) { + var items []types.IItem + for _, item := range prov.items { + if !item.deleted { + items = append(items, item) + } + } + return items, nil +} + +func (prov MemoryProvider) Link(user types.IUser, item types.IItem) error { + storedItem, err := prov.GetItemPtr(item.GetId()) + if err != nil { + return err + } + prov.itemsByUsers[user.GetId()] = append(prov.itemsByUsers[user.GetId()], storedItem) + return nil +} diff --git a/internal/Server/routes.go b/internal/server/routes.go similarity index 50% rename from internal/Server/routes.go rename to internal/server/routes.go index e5d05a1..71f448e 100644 --- a/internal/Server/routes.go +++ b/internal/server/routes.go @@ -2,6 +2,7 @@ package server import ( "dymatrix.de/jspahl/todo/internal/api" + "dymatrix.de/jspahl/todo/internal/implementations" "github.com/gin-gonic/gin" ) @@ -10,10 +11,11 @@ func registerRoutes(router *gin.Engine) { memory := router.Group("/memory") { - api.RegisterRoutes(memory) - } - sql := router.Group("/sql") - { - api.RegisterRoutes(sql) + memoryProv := implementations.MemoryProvider{} + api.RegisterRoutes(memory, memoryProv) } + // sql := router.Group("/sql") + // { + // api.RegisterRoutes(sql) + // } } diff --git a/internal/Server/server.go b/internal/server/server.go similarity index 100% rename from internal/Server/server.go rename to internal/server/server.go diff --git a/internal/interfaces/IItem.go b/internal/types/IItem.go similarity index 75% rename from internal/interfaces/IItem.go rename to internal/types/IItem.go index ff14ec2..082cdd3 100644 --- a/internal/interfaces/IItem.go +++ b/internal/types/IItem.go @@ -1,4 +1,4 @@ -package interfaces +package types type IItem interface { GetId() int diff --git a/internal/interfaces/IPersistentProvider.go b/internal/types/IPersistentProvider.go similarity index 82% rename from internal/interfaces/IPersistentProvider.go rename to internal/types/IPersistentProvider.go index 32c7160..ee6f25b 100644 --- a/internal/interfaces/IPersistentProvider.go +++ b/internal/types/IPersistentProvider.go @@ -1,9 +1,10 @@ -package interfaces +package types type IPersitenceProvider interface { CreateItem(item IItem) error UpdateItem(item IItem) error GetItem(id int) (IItem, error) GetItemByUser(user IUser) ([]IItem, error) + GetAllItems() ([]IItem, error) Link(user IUser, item IItem) error } diff --git a/internal/interfaces/IUser.go b/internal/types/IUser.go similarity index 67% rename from internal/interfaces/IUser.go rename to internal/types/IUser.go index 2ee8a87..e16e914 100644 --- a/internal/interfaces/IUser.go +++ b/internal/types/IUser.go @@ -1,4 +1,4 @@ -package interfaces +package types type IUser interface { GetId() int diff --git a/main.go b/main.go index 64792a6..89bc18a 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,6 @@ package main import ( - "errors" "log" "dymatrix.de/jspahl/todo/internal/server" @@ -9,68 +8,6 @@ import ( "github.com/gin-gonic/gin" ) -type ItemDTO struct { - id int - message string -} - -func (prov MemoryProvider) GetItem(id int) (Item, error) { - item, err := prov.GetItemPtr(id) - return *item, err - -} -func (prov MemoryProvider) GetItemByUser(user User) ([]Item, error) { - var items []Item - for i := range prov.itemsByUsers[user.id] { - items = append(items, *prov.itemsByUsers[user.id][i]) - } - if len(items) == 0 { - return items, errors.New("no items for user " + user.toString()) - } - return items, nil -} -func (prov MemoryProvider) GetAllItems() []Item { - var items []Item - for _, item := range prov.items { - if !item.deleted { - items = append(items, item) - } - } - return items -} - -func (prov MemoryProvider) Link(user User, item Item) error { - storedItem, err := prov.GetItemPtr(item.id) - if err != nil { - return err - } - prov.itemsByUsers[user.id] = append(prov.itemsByUsers[user.id], storedItem) - return nil -} - -//func main() { -// var prov = MemoryProvider{} -// rItems := router.Group("/item") -// { -// rItems.GET("/:id", func(c *gin.Context) { -// id, err := strconv.Atoi(c.Param("id")) -// if err != nil { -// c.String(http.StatusNotFound, err.Error()) -// } -// item, err := prov.GetItem(id) -// if err != nil { -// c.String(http.StatusNotFound, err.Error()) -// } -// c.JSON(http.StatusOK, item.toDto()) -// }) -// rItems.POST("/", func(c *gin.Context) { -// -// }) -// } -// router.Run() -// -//} - func main() { gin.SetMode(gin.ReleaseMode)