sum changes
parent
43d05ce727
commit
0c491a6500
@ -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": "."
|
||||
}
|
||||
]
|
||||
}
|
@ -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
|
||||
}
|
@ -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,
|
||||
})
|
||||
})
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
package types
|
||||
|
||||
type IItem interface {
|
||||
GetId() int
|
||||
GetMessage() string
|
||||
}
|
||||
package types
|
||||
|
||||
type IItem interface {
|
||||
GetId() int
|
||||
GetMessage() string
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
package types
|
||||
|
||||
type IUser interface {
|
||||
GetId() int
|
||||
GetUsername() string
|
||||
}
|
||||
package types
|
||||
|
||||
type IUser interface {
|
||||
GetId() int
|
||||
GetUsername() string
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
Loading…
Reference in New Issue