sql privider

This commit is contained in:
2022-01-24 13:14:36 +01:00
parent 78f1cc8339
commit 892307185a
13 changed files with 197 additions and 13 deletions

View File

@@ -21,12 +21,16 @@ func (item ItemDTO) GetMessage() string {
}
type UserDTO struct {
id int
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{}
@@ -132,13 +136,18 @@ func RegisterRoutes(router *gin.RouterGroup, prov types.IPersitenceProvider) {
})
router.POST("/user", func(c *gin.Context) {
var user struct {
id int
username string
}
if err := c.BindJSON(&user); err != nil {
c.String(http.StatusBadRequest, err.Error())
return
}
prov.CreateUser(UserDTO{user.id})
c.Status(200)
id, err := prov.CreateUser(UserDTO{username: user.username})
if err != nil {
c.String(404, err.Error())
}
c.JSON(200, &gin.H{
"id": id,
})
})
}

View File

@@ -95,6 +95,6 @@ func (prov MemoryProvider) DeleteItem(item types.IItem) error {
return nil
}
func (prov MemoryProvider) CreateUser(user types.IUser) error {
return nil
func (prov MemoryProvider) CreateUser(user types.IUser) (int, error) {
return prov.index, nil
}

View File

@@ -0,0 +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
}

17
internal/models/Item.go Normal file
View File

@@ -0,0 +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
}

17
internal/models/User.go Normal file
View File

@@ -0,0 +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
}

20
internal/models/setup.go Normal file
View File

@@ -0,0 +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
}

View File

@@ -3,6 +3,7 @@ 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"
)
@@ -14,8 +15,10 @@ func registerRoutes(router *gin.Engine) {
memoryProv := implementations.MemoryProvider{}
api.RegisterRoutes(memory, memoryProv)
}
// sql := router.Group("/sql")
// {
// api.RegisterRoutes(sql)
// }
sql := router.Group("/sql")
{
models.ConnectDatabase()
sqlProvider := implementations.SqlProvider{}
api.RegisterRoutes(sql, sqlProvider)
}
}

View File

@@ -2,6 +2,7 @@ package server
import (
"fmt"
"log"
"net/http"
"dymatrix.de/jspahl/todo/internal/config"
@@ -27,6 +28,8 @@ func ListenAndServe() error {
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
}

View File

@@ -8,5 +8,5 @@ type IPersitenceProvider interface {
GetAllItems() ([]IItem, error)
Link(user IUser, item IItem) error
DeleteItem(item IItem) error
CreateUser(user IUser) error
CreateUser(user IUser) (int, error)
}

View File

@@ -2,4 +2,5 @@ package types
type IUser interface {
GetId() int
GetUsername() string
}