diff --git a/internal/api/api.go b/internal/api/api.go index 6dca25d..5acd839 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -12,6 +12,14 @@ type ItemDTO struct { id int message string } + +func (item ItemDTO) GetId() int { + return item.id +} +func (item ItemDTO) GetMessage() string { + return item.message +} + type UserDTO struct { id int } @@ -70,8 +78,67 @@ func RegisterRoutes(router *gin.RouterGroup, prov types.IPersitenceProvider) { } c.JSON(http.StatusOK, ItemsToDTOs(items)) }) - 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) {}) + router.POST("/item", func(c *gin.Context) { + var item struct { + message string + } + if err := c.BindJSON(&item); err != nil { + c.String(http.StatusBadRequest, err.Error()) + return + } + prov.CreateItem(ItemDTO{message: item.message}) + c.Status(200) + }) + router.PUT("/item", func(c *gin.Context) { + var item ItemDTO + if err := c.BindJSON(&item); err != nil { + c.String(http.StatusBadRequest, err.Error()) + return + } + if err := prov.UpdateItem(item); err != nil { + c.String(http.StatusInternalServerError, err.Error()) + return + } + c.Status(200) + }) + router.DELETE("/item/:id", func(c *gin.Context) { + id, err := strconv.Atoi(c.Param("id")) + if err != nil { + c.String(404, err.Error()) + return + } + if err := prov.DeleteItem(ItemDTO{id: id}); err != nil { + c.String(404, err.Error()) + return + } + c.Status(200) + }) + router.GET("/link/:itemId/:userId", func(c *gin.Context) { + itemId, err := strconv.Atoi(c.Param("itemId")) + if err != nil { + c.String(404, err.Error()) + return + } + userId, err := strconv.Atoi(c.Param("userId")) + if err != nil { + c.String(404, err.Error()) + return + } + if err := prov.Link(UserDTO{id: userId}, ItemDTO{id: itemId}); err != nil { + c.String(404, err.Error()) + return + } + c.Status(200) + }) + router.POST("/user", func(c *gin.Context) { + var user struct { + id int + } + if err := c.BindJSON(&user); err != nil { + c.String(http.StatusBadRequest, err.Error()) + return + } + prov.CreateUser(UserDTO{user.id}) + c.Status(200) + }) } diff --git a/internal/implementations/MemoryProvider.go b/internal/implementations/MemoryProvider.go index b4ff513..890f231 100644 --- a/internal/implementations/MemoryProvider.go +++ b/internal/implementations/MemoryProvider.go @@ -19,10 +19,6 @@ func (item Item) GetMessage() string { return item.message } -type User struct { - id int -} - type MemoryProvider struct { index int items []Item @@ -89,3 +85,16 @@ func (prov MemoryProvider) Link(user types.IUser, item types.IItem) error { prov.itemsByUsers[user.GetId()] = append(prov.itemsByUsers[user.GetId()], storedItem) return nil } + +func (prov MemoryProvider) DeleteItem(item types.IItem) error { + storedItem, err := prov.GetItemPtr(item.GetId()) + if err != nil { + return err + } + storedItem.deleted = true + return nil +} + +func (prov MemoryProvider) CreateUser(user types.IUser) error { + return nil +} diff --git a/internal/types/IPersistentProvider.go b/internal/types/IPersistentProvider.go index ee6f25b..652b3ef 100644 --- a/internal/types/IPersistentProvider.go +++ b/internal/types/IPersistentProvider.go @@ -7,4 +7,6 @@ type IPersitenceProvider interface { GetItemByUser(user IUser) ([]IItem, error) GetAllItems() ([]IItem, error) Link(user IUser, item IItem) error + DeleteItem(item IItem) error + CreateUser(user IUser) error }