diff --git a/.vscode/launch.json b/.vscode/launch.json index 15500d1..0e2e4d4 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,11 +1,11 @@ -{ - "configurations": [ - { - "name": "Launch Package", - "type": "go", - "request": "launch", - "mode": "auto", - "program": "." - } - ] +{ + "configurations": [ + { + "name": "Launch Package", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "." + } + ] } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index c5de3fb..74b81eb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,11 +1,11 @@ -{ - "sqltools.connections": [ - { - "previewLimit": 50, - "driver": "SQLite", - "name": "devdb", - "database": "${workspaceFolder}/dev.db" - } - ], - "sqltools.useNodeRuntime": true +{ + "sqltools.connections": [ + { + "previewLimit": 50, + "driver": "SQLite", + "name": "devdb", + "database": "${workspaceFolder}/dev.db" + } + ], + "sqltools.useNodeRuntime": true } \ No newline at end of file diff --git a/dev.db b/dev.db new file mode 100644 index 0000000..c434317 Binary files /dev/null and b/dev.db differ diff --git a/go.mod b/go.mod index ac18b6b..f5beb3d 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.15 require ( github.com/gin-gonic/gin v1.7.7 - github.com/mattn/go-sqlite3 v1.14.10 + github.com/mattn/go-sqlite3 v1.14.10 // indirect gorm.io/driver/sqlite v1.2.6 gorm.io/gorm v1.22.5 ) diff --git a/go.sum b/go.sum index b62b75e..be0caa8 100644 --- a/go.sum +++ b/go.sum @@ -1,11 +1,9 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs= github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= @@ -21,7 +19,6 @@ github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkr github.com/jinzhu/now v1.1.2/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= @@ -30,16 +27,12 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-sqlite3 v1.14.9/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.10 h1:MLn+5bFRlWMGoSRmJour3CL1w/qL96mvipqpwQW/Sfk= github.com/mattn/go-sqlite3 v1.14.10/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= @@ -56,12 +49,10 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/sqlite v1.2.6 h1:SStaH/b+280M7C8vXeZLz/zo9cLQmIGwwj3cSj7p6l4= gorm.io/driver/sqlite v1.2.6/go.mod h1:gyoX0vHiiwi0g49tv+x2E7l8ksauLK0U/gShcdUsjWY= diff --git a/internal/api/api.go b/internal/api/api.go index 725ba26..ff5ebac 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -1,152 +1,153 @@ -package api - -import ( - "log" - "net/http" - "strconv" - - "dymatrix.de/jspahl/todo/internal/types" - "github.com/gin-gonic/gin" -) - -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 - username string -} - -func (user UserDTO) GetId() int { - return user.id -} -func (user UserDTO) GetUsername() string { - return user.username -} - -func ItemToDTO(item types.IItem) ItemDTO { - var itemDto = ItemDTO{} - itemDto.id = item.GetId() - itemDto.message = item.GetMessage() - return itemDto -} -func ItemsToDTOs(items []types.IItem) []ItemDTO { - var itemDtos []ItemDTO - for _, item := range items { - itemDtos = append(itemDtos, ItemToDTO(item)) - } - 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()) - } - log.Println(id) - item, err := prov.GetItem(id) - if err != nil { - c.String(http.StatusInternalServerError, err.Error()) - } - c.JSON(http.StatusOK, ItemToDTO(item)) - }) - router.GET("/itemByUser/:id", func(c *gin.Context) { - id, err := strconv.Atoi(c.Param("id")) - if err != nil { - c.String(404, err.Error()) - return - } - items, err := prov.GetItemByUser(UserDTO{id: id}) - if err != nil { - c.String(http.StatusInternalServerError, err.Error()) - return - } - c.JSON(http.StatusOK, ItemsToDTOs(items)) - }) - 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()) - } - 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 { - username string - } - if err := c.BindJSON(&user); err != nil { - c.String(http.StatusBadRequest, err.Error()) - return - } - id, err := prov.CreateUser(UserDTO{username: user.username}) - if err != nil { - c.String(404, err.Error()) - } - c.JSON(200, &gin.H{ - "id": id, - }) - }) -} +package api + +import ( + "log" + "net/http" + "strconv" + + "dymatrix.de/jspahl/todo/internal/types" + "github.com/gin-gonic/gin" +) + +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 + username string +} + +func (user UserDTO) GetId() int { + return user.id +} +func (user UserDTO) GetUsername() string { + return user.username +} + +func ItemToDTO(item types.IItem) ItemDTO { + var itemDto = ItemDTO{} + itemDto.id = item.GetId() + itemDto.message = item.GetMessage() + return itemDto +} +func ItemsToDTOs(items []types.IItem) []ItemDTO { + var itemDtos []ItemDTO + for _, item := range items { + itemDtos = append(itemDtos, ItemToDTO(item)) + } + 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()) + } + log.Println(id) + item, err := prov.GetItem(id) + if err != nil { + c.String(http.StatusInternalServerError, err.Error()) + } + c.JSON(http.StatusOK, ItemToDTO(item)) + }) + router.GET("/itemByUser/:id", func(c *gin.Context) { + id, err := strconv.Atoi(c.Param("id")) + if err != nil { + c.String(404, err.Error()) + return + } + items, err := prov.GetItemByUser(UserDTO{id: id}) + if err != nil { + c.String(http.StatusInternalServerError, err.Error()) + return + } + c.JSON(http.StatusOK, ItemsToDTOs(items)) + }) + 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 { + username string + } + if err := c.BindJSON(&user); err != nil { + c.String(http.StatusBadRequest, err.Error()) + return + } + id, err := prov.CreateUser(UserDTO{username: user.username}) + if err != nil { + c.String(404, err.Error()) + } + c.JSON(200, &gin.H{ + "id": id, + }) + }) +} diff --git a/internal/implementations/MemoryProvider.go b/internal/implementations/MemoryProvider.go index 55fe5b7..5d8a8c7 100644 --- a/internal/implementations/MemoryProvider.go +++ b/internal/implementations/MemoryProvider.go @@ -1,100 +1,102 @@ -package implementations - -import ( - "errors" - - "dymatrix.de/jspahl/todo/internal/types" -) - -type Item struct { - id int - message string - deleted bool -} - -func (item Item) GetId() int { - return item.id -} -func (item Item) GetMessage() string { - return item.message -} - -type MemoryProvider struct { - index int - items []Item - itemsByUsers [][]*Item -} - -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 types.IItem) error { - storedItem, err := prov.GetItemPtr(item.GetId()) - if err != nil { - return err - } - storedItem.message = item.GetMessage() - return nil -} - -func (prov MemoryProvider) GetItemPtr(id int) (*Item, error) { - for i, item := range prov.items { - if item.id == id && !item.deleted { - return &prov.items[i], nil - } - } - 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 -} - -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) (int, error) { - return prov.index, nil -} +package implementations + +import ( + "errors" + "log" + + "dymatrix.de/jspahl/todo/internal/types" +) + +type Item struct { + id int + message string + deleted bool +} + +func (item Item) GetId() int { + return item.id +} +func (item Item) GetMessage() string { + return item.message +} + +type MemoryProvider struct { + index int + items []Item + itemsByUsers [][]*Item +} + +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 types.IItem) error { + storedItem, err := prov.GetItemPtr(item.GetId()) + if err != nil { + return err + } + storedItem.message = item.GetMessage() + return nil +} + +func (prov MemoryProvider) GetItemPtr(id int) (*Item, error) { + log.Printf("Getting Item Ptr for %d\n", id) + for i, item := range prov.items { + if item.id == id && !item.deleted { + return &prov.items[i], nil + } + } + 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 +} + +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) (int, error) { + return prov.index, nil +} diff --git a/internal/implementations/SqlProvider.go b/internal/implementations/SqlProvider.go index 399e63c..9ce77ac 100644 --- a/internal/implementations/SqlProvider.go +++ b/internal/implementations/SqlProvider.go @@ -1,82 +1,82 @@ -package implementations - -import ( - "dymatrix.de/jspahl/todo/internal/models" - "dymatrix.de/jspahl/todo/internal/types" -) - -type SqlProvider struct { -} - -func (prov SqlProvider) CreateItem(item types.IItem) error { - storedItem := models.Item{Message: item.GetMessage()} - result := models.DB.Create(storedItem) - if result.Error != nil { - return result.Error - } - return nil -} -func (prov SqlProvider) UpdateItem(item types.IItem) error { - var dbItem models.Item - result := models.DB.First(&dbItem, item.GetId()) - if result.Error != nil { - return result.Error - } - dbItem.Message = item.GetMessage() - result = models.DB.Save(&dbItem) - if result.Error != nil { - return result.Error - } - return nil -} -func (prov SqlProvider) GetItem(id int) (types.IItem, error) { - var dbItem models.Item - result := models.DB.First(&dbItem, id) - if result.Error != nil { - return nil, result.Error - } - return dbItem, nil -} -func (prov SqlProvider) GetItemByUser(user types.IUser) ([]types.IItem, error) { - var dbUser models.User - if result := models.DB.Preload("Items").First(&dbUser, user.GetId()); result.Error != nil { - return nil, result.Error - } - var items []types.IItem - for _, item := range dbUser.Items { - items = append(items, item) - } - return items, nil -} -func (prov SqlProvider) GetAllItems() ([]types.IItem, error) { - var dbItems []models.Item - if err := models.DB.Find(&dbItems).Error; err != nil { - return nil, err - } - var items []types.IItem - for _, item := range dbItems { - items = append(items, item) - } - return items, nil -} -func (prov SqlProvider) Link(user types.IUser, item types.IItem) error { - var dbUser models.User - if err := models.DB.First(&dbUser, user.GetId()).Error; err != nil { - return err - } - var dbItem models.Item - if err := models.DB.First(&dbItem, item.GetId()).Error; err != nil { - return err - } - dbUser.Items = append(dbUser.Items, dbItem) - dbItem.UserID = dbUser.ID - return models.DB.Save(&dbUser).Save(&dbItem).Error -} -func (prov SqlProvider) DeleteItem(item types.IItem) error { - return models.DB.Where("id = ?", item.GetId()).Delete(&models.Item{}).Error -} -func (prov SqlProvider) CreateUser(user types.IUser) (int, error) { - dbUser := models.User{} - err := models.DB.Create(&dbUser).Error - return int(dbUser.ID), err -} +package implementations + +import ( + "dymatrix.de/jspahl/todo/internal/models" + "dymatrix.de/jspahl/todo/internal/types" +) + +type SqlProvider struct { +} + +func (prov SqlProvider) CreateItem(item types.IItem) error { + storedItem := models.Item{Message: item.GetMessage()} + result := models.DB.Create(storedItem) + if result.Error != nil { + return result.Error + } + return nil +} +func (prov SqlProvider) UpdateItem(item types.IItem) error { + var dbItem models.Item + result := models.DB.First(&dbItem, item.GetId()) + if result.Error != nil { + return result.Error + } + dbItem.Message = item.GetMessage() + result = models.DB.Save(&dbItem) + if result.Error != nil { + return result.Error + } + return nil +} +func (prov SqlProvider) GetItem(id int) (types.IItem, error) { + var dbItem models.Item + result := models.DB.First(&dbItem, id) + if result.Error != nil { + return nil, result.Error + } + return dbItem, nil +} +func (prov SqlProvider) GetItemByUser(user types.IUser) ([]types.IItem, error) { + var dbUser models.User + if result := models.DB.Preload("Items").First(&dbUser, user.GetId()); result.Error != nil { + return nil, result.Error + } + var items []types.IItem + for _, item := range dbUser.Items { + items = append(items, item) + } + return items, nil +} +func (prov SqlProvider) GetAllItems() ([]types.IItem, error) { + var dbItems []models.Item + if err := models.DB.Find(&dbItems).Error; err != nil { + return nil, err + } + var items []types.IItem + for _, item := range dbItems { + items = append(items, item) + } + return items, nil +} +func (prov SqlProvider) Link(user types.IUser, item types.IItem) error { + var dbUser models.User + if err := models.DB.First(&dbUser, user.GetId()).Error; err != nil { + return err + } + var dbItem models.Item + if err := models.DB.First(&dbItem, item.GetId()).Error; err != nil { + return err + } + dbUser.Items = append(dbUser.Items, dbItem) + dbItem.UserID = dbUser.ID + return models.DB.Save(&dbUser).Save(&dbItem).Error +} +func (prov SqlProvider) DeleteItem(item types.IItem) error { + return models.DB.Where("id = ?", item.GetId()).Delete(&models.Item{}).Error +} +func (prov SqlProvider) CreateUser(user types.IUser) (int, error) { + dbUser := models.User{} + err := models.DB.Create(&dbUser).Error + return int(dbUser.ID), err +} diff --git a/internal/models/Item.go b/internal/models/Item.go index f8d5002..7259327 100644 --- a/internal/models/Item.go +++ b/internal/models/Item.go @@ -1,17 +1,17 @@ -package models - -import "gorm.io/gorm" - -type Item struct { - gorm.Model - Message string - UserID uint -} - -func (item Item) GetId() int { - return int(item.ID) -} - -func (item Item) GetMessage() string { - return item.Message -} +package models + +import "gorm.io/gorm" + +type Item struct { + gorm.Model + Message string + UserID uint +} + +func (item Item) GetId() int { + return int(item.ID) +} + +func (item Item) GetMessage() string { + return item.Message +} diff --git a/internal/models/User.go b/internal/models/User.go index 0fb3774..b899289 100644 --- a/internal/models/User.go +++ b/internal/models/User.go @@ -1,17 +1,17 @@ -package models - -import "gorm.io/gorm" - -type User struct { - gorm.Model - UserName string - Items []Item -} - -func (user User) GetId() int { - return int(user.ID) -} - -func (user User) GetUsername() string { - return user.UserName -} +package models + +import "gorm.io/gorm" + +type User struct { + gorm.Model + UserName string + Items []Item +} + +func (user User) GetId() int { + return int(user.ID) +} + +func (user User) GetUsername() string { + return user.UserName +} diff --git a/internal/models/setup.go b/internal/models/setup.go index 679e1d4..6d7136a 100644 --- a/internal/models/setup.go +++ b/internal/models/setup.go @@ -1,20 +1,20 @@ -package models - -import ( - "gorm.io/driver/sqlite" - "gorm.io/gorm" -) - -var DB *gorm.DB - -func ConnectDatabase() error { - db, err := gorm.Open(sqlite.Open("dev.db"), &gorm.Config{}) - if err != nil { - return err - } - - db.AutoMigrate(&Item{}, &User{}) - - DB = db - return nil -} +package models + +import ( + "gorm.io/driver/sqlite" + "gorm.io/gorm" +) + +var DB *gorm.DB + +func ConnectDatabase() error { + db, err := gorm.Open(sqlite.Open("dev.db"), &gorm.Config{}) + if err != nil { + return err + } + + db.AutoMigrate(&Item{}, &User{}) + + DB = db + return nil +} diff --git a/internal/server/routes.go b/internal/server/routes.go index 57d95e1..717c2d0 100644 --- a/internal/server/routes.go +++ b/internal/server/routes.go @@ -1,24 +1,24 @@ -package server - -import ( - "dymatrix.de/jspahl/todo/internal/api" - "dymatrix.de/jspahl/todo/internal/implementations" - "dymatrix.de/jspahl/todo/internal/models" - "github.com/gin-gonic/gin" -) - -func registerRoutes(router *gin.Engine) { - router.RedirectTrailingSlash = true - - memory := router.Group("/memory") - { - memoryProv := implementations.MemoryProvider{} - api.RegisterRoutes(memory, memoryProv) - } - sql := router.Group("/sql") - { - models.ConnectDatabase() - sqlProvider := implementations.SqlProvider{} - api.RegisterRoutes(sql, sqlProvider) - } -} +package server + +import ( + "dymatrix.de/jspahl/todo/internal/api" + "dymatrix.de/jspahl/todo/internal/implementations" + "dymatrix.de/jspahl/todo/internal/models" + "github.com/gin-gonic/gin" +) + +func registerRoutes(router *gin.Engine) { + router.RedirectTrailingSlash = true + + memory := router.Group("/memory") + { + memoryProv := implementations.MemoryProvider{} + api.RegisterRoutes(memory, memoryProv) + } + sql := router.Group("/sql") + { + models.ConnectDatabase() + sqlProvider := implementations.SqlProvider{} + api.RegisterRoutes(sql, sqlProvider) + } +} diff --git a/internal/server/server.go b/internal/server/server.go index 64ad263..22cd4d0 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -1,35 +1,35 @@ -package server - -import ( - "fmt" - "log" - "net/http" - - "dymatrix.de/jspahl/todo/internal/config" - - "github.com/gin-gonic/gin" -) - -var httpServer *http.Server -var httpRouter *gin.Engine - -func Setup() { - httpRouter = gin.New() - - httpRouter.Use(gin.Logger()) - registerRoutes(httpRouter) -} - -func ListenAndServe() error { - var err error = nil - for err == nil || err == http.ErrServerClosed { - c := config.GetConfig() - httpServer = &http.Server{ - Handler: httpRouter, - Addr: fmt.Sprintf("%s:%d", c.Listen.Host, c.Listen.Port), - } - log.Printf("Starting web server at %s", httpServer.Addr) - err = httpServer.ListenAndServe() - } - return err -} +package server + +import ( + "fmt" + "log" + "net/http" + + "dymatrix.de/jspahl/todo/internal/config" + + "github.com/gin-gonic/gin" +) + +var httpServer *http.Server +var httpRouter *gin.Engine + +func Setup() { + httpRouter = gin.New() + + httpRouter.Use(gin.Logger()) + registerRoutes(httpRouter) +} + +func ListenAndServe() error { + var err error = nil + for err == nil || err == http.ErrServerClosed { + c := config.GetConfig() + httpServer = &http.Server{ + Handler: httpRouter, + Addr: fmt.Sprintf("%s:%d", c.Listen.Host, c.Listen.Port), + } + log.Printf("Starting web server at %s", httpServer.Addr) + err = httpServer.ListenAndServe() + } + return err +} diff --git a/internal/types/IItem.go b/internal/types/IItem.go index 082cdd3..982756b 100644 --- a/internal/types/IItem.go +++ b/internal/types/IItem.go @@ -1,6 +1,6 @@ -package types - -type IItem interface { - GetId() int - GetMessage() string -} +package types + +type IItem interface { + GetId() int + GetMessage() string +} diff --git a/internal/types/IPersistentProvider.go b/internal/types/IPersistentProvider.go index 62f5743..1cabb2f 100644 --- a/internal/types/IPersistentProvider.go +++ b/internal/types/IPersistentProvider.go @@ -1,12 +1,12 @@ -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 - DeleteItem(item IItem) error - CreateUser(user IUser) (int, error) -} +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 + DeleteItem(item IItem) error + CreateUser(user IUser) (int, error) +} diff --git a/internal/types/IUser.go b/internal/types/IUser.go index 6c0b80a..15f4890 100644 --- a/internal/types/IUser.go +++ b/internal/types/IUser.go @@ -1,6 +1,6 @@ -package types - -type IUser interface { - GetId() int - GetUsername() string -} +package types + +type IUser interface { + GetId() int + GetUsername() string +} diff --git a/main.go b/main.go index 89bc18a..565dd14 100644 --- a/main.go +++ b/main.go @@ -1,17 +1,17 @@ -package main - -import ( - "log" - - "dymatrix.de/jspahl/todo/internal/server" - - "github.com/gin-gonic/gin" -) - -func main() { - gin.SetMode(gin.ReleaseMode) - - server.Setup() - err := server.ListenAndServe() - log.Fatalf("http: webserver closed unexpected: %s", err) -} +package main + +import ( + "log" + + "dymatrix.de/jspahl/todo/internal/server" + + "github.com/gin-gonic/gin" +) + +func main() { + gin.SetMode(gin.ReleaseMode) + + server.Setup() + err := server.ListenAndServe() + log.Fatalf("http: webserver closed unexpected: %s", err) +}