diff --git a/controllers/followController.go b/controllers/followController.go index 6a648a3..6c52cff 100644 --- a/controllers/followController.go +++ b/controllers/followController.go @@ -5,9 +5,11 @@ import ( "strconv" "github.com/gin-gonic/gin" + "gorm.io/gorm" "DevOps/globals" helpers "DevOps/helpers" + model "DevOps/model/gorm" simModels "DevOps/model/simulatorModel" ) @@ -20,16 +22,16 @@ func FollowHandler() gin.HandlerFunc { username := c.Param("username") // name of user to follow action := c.Param("action") // follow or unfollow - db := globals.GetDatabase() - whom_id, err := helpers.GetUserId(db, username) + db := globals.GetGormDatabase() + whom_id, err := helpers.GetUserIdGorm(db, username) if err != nil { c.AbortWithStatus(404) } else { if action == "/follow" { - db.Exec("insert into follower (who_id, whom_id) values (?, ?)", user.UserId, whom_id) + db.Create(&model.Following{UserID: user.ID, WhomId: whom_id}) } else if action == "/unfollow" { - db.Exec("delete from follower where who_id=? and whom_id=?", user.UserId, whom_id) + db.Where(&model.Following{UserID: user.ID, WhomId: whom_id}).Unscoped().Delete(&model.Following{}) } } @@ -46,10 +48,10 @@ func SimFollowHandler() gin.HandlerFunc { return } - db := globals.GetDatabase() + db := globals.GetGormDatabase() username := c.Param("username") - userId, err := helpers.GetUserId(db, username) + userId, err := helpers.GetUserIdGorm(db, username) if err != nil { // TODO: This has to be another error, likely 500??? c.AbortWithStatus(http.StatusNotFound) @@ -63,7 +65,7 @@ func SimFollowHandler() gin.HandlerFunc { targetUsername = request.Unfollow } - targetUserId, err := helpers.GetUserId(db, targetUsername) + targetUserId, err := helpers.GetUserIdGorm(db, targetUsername) if err != nil { // TODO: This has to be another error, likely 500??? c.AbortWithStatus(http.StatusNotFound) @@ -71,9 +73,9 @@ func SimFollowHandler() gin.HandlerFunc { } if request.Follow != "" { - db.Exec("insert into follower (who_id, whom_id) values (?, ?)", userId, targetUserId) + db.Create(&model.Following{UserID: userId, WhomId: targetUserId}) } else if request.Unfollow != "" { - db.Exec("DELETE FROM follower WHERE who_id=? and WHOM_ID=?", userId, targetUserId) + db.Where(&model.Following{UserID: userId, WhomId: targetUserId}).Unscoped().Delete(&model.Following{}) } c.Status(http.StatusNoContent) @@ -88,26 +90,27 @@ func SimGetFollowHandler() gin.HandlerFunc { numberFollowers = 100 } - db := globals.GetDatabase() - - query := `SELECT user.username FROM user - INNER JOIN follower ON follower.whom_id=user.user_id - WHERE follower.who_id=? - LIMIT ?` + db := globals.GetGormDatabase() username := c.Param("username") - userId, err := helpers.GetUserId(db, username) + _, err = helpers.GetUserIdGorm(db, username) if err != nil { c.AbortWithStatus(http.StatusNotFound) return } - var list []string - db.Select(&list, query, userId, numberFollowers) + var list model.User + + db.Preload("Followings", func(tx *gorm.DB) *gorm.DB { + return tx.Limit(numberFollowers) + }). + Where(&model.User{Username: username}). + Preload("Followings.WhomUser"). + First(&list) c.JSON(http.StatusOK, gin.H{ - "follows": list, + "follows": helpers.Map(list.Followings, func(x model.Following) string { return x.WhomUser.Username }), }) } } diff --git a/controllers/loginController.go b/controllers/loginController.go index edf123e..08c711a 100644 --- a/controllers/loginController.go +++ b/controllers/loginController.go @@ -8,7 +8,7 @@ import ( "DevOps/globals" helpers "DevOps/helpers" - model "DevOps/model" + gormModel "DevOps/model/gorm" simModels "DevOps/model/simulatorModel" ) @@ -32,7 +32,7 @@ func RegisterGetHandler() gin.HandlerFunc { func SimRegisterPostHandler() gin.HandlerFunc { return func(c *gin.Context) { - db := globals.GetDatabase() + db := globals.GetGormDatabase() var registerData simModels.RegisterRequest @@ -55,7 +55,7 @@ func SimRegisterPostHandler() gin.HandlerFunc { func RegisterPostHandler() gin.HandlerFunc { return func(c *gin.Context) { - db := globals.GetDatabase() + db := globals.GetGormDatabase() user, err := helpers.GetUserSession(c) if err == nil { c.HTML(http.StatusBadRequest, "register.html", @@ -71,32 +71,13 @@ func RegisterPostHandler() gin.HandlerFunc { password2 := c.PostForm("password2") email := c.PostForm("email") - if helpers.EmptyUserPass(username, password) { - c.HTML(http.StatusBadRequest, "register.html", gin.H{"content": "You have to enter a value"}) - return - } + _, signUpError := helpers.RegisterUser(db, username, password, password2, email) - if !helpers.CheckUserPasswords(password, password2) { - c.HTML(http.StatusBadRequest, "register.html", gin.H{"content": "The two passwords do not match"}) + if signUpError != nil { + c.HTML(http.StatusBadRequest, "register.html", gin.H{"content": signUpError.Error()}) return } - if !helpers.CheckUserEmail(email) { - c.HTML(http.StatusBadRequest, "register.html", gin.H{"content": "You have to enter a valid email address"}) - return - } - - if helpers.CheckUsernameExists(db, username) { - c.HTML(http.StatusBadRequest, "register.html", gin.H{"content": "The username is already taken"}) - return - } - - pw_hash, err := helpers.HashPassword(password) - if err != nil { - c.AbortWithStatus(http.StatusBadRequest) - } - db.Exec("insert into user (username, email, pw_hash) values (?, ?, ?)", username, email, pw_hash) - c.Redirect(http.StatusMovedPermanently, "/login") } } @@ -118,7 +99,7 @@ func LoginGetHandler() gin.HandlerFunc { func LoginPostHandler() gin.HandlerFunc { return func(c *gin.Context) { - db := globals.GetDatabase() + db := globals.GetGormDatabase() if _, err := helpers.GetUserSession(c); err == nil { c.HTML(http.StatusBadRequest, "login.html", gin.H{"content": "Please logout first"}) @@ -143,8 +124,8 @@ func LoginPostHandler() gin.HandlerFunc { return } - userStruct := model.User{} - db.Get(&userStruct, `select * from user where username = ?`, username) + var userStruct gormModel.User + db.Where(&gormModel.User{Username: username}).First(&userStruct) if err := helpers.SetUserSession(c, userStruct); err != nil { c.HTML(http.StatusInternalServerError, "login.html", gin.H{"content": "Failed to save session"}) diff --git a/controllers/messageController.go b/controllers/messageController.go index 4042ee6..014033b 100644 --- a/controllers/messageController.go +++ b/controllers/messageController.go @@ -3,7 +3,7 @@ package controllers import ( globals "DevOps/globals" helpers "DevOps/helpers" - model "DevOps/model" + model "DevOps/model/gorm" "net/http" "strconv" "time" @@ -22,9 +22,12 @@ func AddMessageHandler() gin.HandlerFunc { text := c.PostForm("text") if text != "" { - db := globals.GetDatabase() - db.Exec(`insert into message (author_id, text, pub_date, flagged) - values (?, ?, ?, 0)`, user.UserId, text, time.Now().Unix()) + db := globals.GetGormDatabase() + db.Create(&model.Message{UserID: user.ID, + User: model.User{}, + Text: text, + PubDate: time.Now().Unix(), + Flagged: 0}) } c.Redirect(http.StatusMovedPermanently, "/public") @@ -34,8 +37,8 @@ func AddMessageHandler() gin.HandlerFunc { func GetMessageHandler() gin.HandlerFunc { return func(c *gin.Context) { // query db - db := globals.GetDatabase() - entries := []model.TimelineMessage{} + db := globals.GetGormDatabase() + entries := []model.Message{} // check for parameter "no" (number of messages) noMsgs, err := strconv.Atoi(c.Query("no")) @@ -43,9 +46,12 @@ func GetMessageHandler() gin.HandlerFunc { // if undefined, use default value noMsgs = 100 } - db.Select(&entries, `SELECT message.*, user.* FROM message, user - WHERE message.flagged = 0 AND message.author_id = user.user_id - ORDER BY message.pub_date DESC LIMIT ?`, noMsgs) + + db.Preload("User"). + Where(&model.Message{Flagged: 0}). + Order("pub_date desc"). + Limit(noMsgs). + Find(&entries) // filter messages var messageList []simModels.FilteredMessageRequest @@ -54,7 +60,7 @@ func GetMessageHandler() gin.HandlerFunc { simModels.FilteredMessageRequest{ Text: message.Text, PubDate: message.PubDate, - Username: message.Username, + Username: message.User.Username, }) } @@ -64,22 +70,31 @@ func GetMessageHandler() gin.HandlerFunc { func GetMessageUserHandler() gin.HandlerFunc { return func(c *gin.Context) { - db := globals.GetDatabase() + db := globals.GetGormDatabase() // convert username to user id username := c.Param(globals.Username) - user_id, err := helpers.GetUserId(db, username) + user_id, err := helpers.GetUserIdGorm(db, username) if err != nil { c.AbortWithStatus(http.StatusNotFound) return } - entries := []model.TimelineMessage{} - db.Select(&entries, `SELECT message.*, user.* FROM message, user - WHERE message.flagged = 0 AND - user.user_id = message.author_id AND user.user_id = ? - ORDER BY message.pub_date DESC LIMIT 100`, user_id) + // check for parameter "no" (number of messages) + noMsgs, err := strconv.Atoi(c.Query("no")) + if err != nil { + // if undefined, use default value + noMsgs = 100 + } + + entries := []model.Message{} + + db.Preload("User"). + Where(&model.Message{Flagged: 0, UserID: user_id}). + Order("pub_date desc"). + Limit(noMsgs). + Find(&entries) // filter messages var messageList []simModels.FilteredMessageRequest @@ -88,7 +103,7 @@ func GetMessageUserHandler() gin.HandlerFunc { simModels.FilteredMessageRequest{ Text: message.Text, PubDate: message.PubDate, - Username: message.Username, + Username: message.User.Username, }) } @@ -108,19 +123,22 @@ func PostMessageUserHandler() gin.HandlerFunc { } // get DB - db := globals.GetDatabase() + db := globals.GetGormDatabase() // get username, and convert to user id username := c.Param("username") - userId, err := helpers.GetUserId(db, username) + userId, err := helpers.GetUserIdGorm(db, username) if err != nil { c.AbortWithStatus(404) } time := time.Now().Unix() - db.Exec(`insert into message (author_id, text, pub_date, flagged) values (?, ?, ?, 0)`, - userId, postMessage.Content, time) + db.Create(&model.Message{ + UserID: userId, + Text: postMessage.Content, + PubDate: time, + Flagged: 0}) // exit with status 204 c.Status(http.StatusNoContent) diff --git a/controllers/timelineController.go b/controllers/timelineController.go index 6539eb8..0cebef0 100644 --- a/controllers/timelineController.go +++ b/controllers/timelineController.go @@ -3,7 +3,7 @@ package controllers import ( "DevOps/globals" helpers "DevOps/helpers" - model "DevOps/model" + gormModel "DevOps/model/gorm" "net/http" "github.com/gin-gonic/gin" @@ -14,7 +14,7 @@ const PAGE_SIZE = 30 func UserTimelineHandler() gin.HandlerFunc { return func(c *gin.Context) { user, err := helpers.GetUserSession(c) - db := globals.GetDatabase() + db := globals.GetGormDatabase() userProfileName := c.Param("username") following := false @@ -22,30 +22,33 @@ func UserTimelineHandler() gin.HandlerFunc { isAuthorized := false //get the requested user - var profile = model.User{} - user_exists_err := db.Get(&profile, `select * from user where username = ?`, userProfileName) + var profile = gormModel.User{} + user_exists_err := db.Where(gormModel.User{Username: userProfileName}).First(&profile) - if user_exists_err != nil { + if user_exists_err.Error != nil { c.JSON(http.StatusNotFound, gin.H{"error": "User does not exist"}) return } //If the user is signed in, check if we follow said user or is that user ourselves if err == nil { - var result = model.FollowingEntry{} - err := db.Get(&result, `select * from follower where - follower.who_id = ? and follower.whom_id = ? limit 1`, user.UserId, profile.UserId) + var result = gormModel.Following{} + res := db.Where(gormModel.Following{UserID: user.ID, WhomId: profile.ID}).Limit(1).First(&result) + //error will be nil if zero rows are returned - following = err == nil - isSelf = user.UserId == profile.UserId + following = res.Error == nil + isSelf = user.ID == profile.ID isAuthorized = true } //get all the messages from the requested user - entries := []model.TimelineMessage{} - db.Select(&entries, `select message.*, user.* from message, user - where message.flagged = 0 and message.author_id = ? - order by message.pub_date desc limit ?`, profile.UserId, PAGE_SIZE) + entries := []gormModel.Message{} + + db.Preload("User"). + Where(gormModel.Message{Flagged: 0, UserID: profile.ID}). + Order("pub_date desc"). + Limit(PAGE_SIZE). + Find(&entries) c.HTML(http.StatusOK, "timeline.html", gin.H{ "authorized": isAuthorized, @@ -61,16 +64,19 @@ func UserTimelineHandler() gin.HandlerFunc { func PublicTimelineHandler() gin.HandlerFunc { return func(c *gin.Context) { - db := globals.GetDatabase() + db := globals.GetGormDatabase() user, err := helpers.GetUserSession(c) isAuthorized := false if err == nil { isAuthorized = true } - entries := []model.TimelineMessage{} - db.Select(&entries, `select message.*, user.* from message, user - where message.flagged = 0 and message.author_id = user.user_id - order by message.pub_date desc limit ?`, PAGE_SIZE) + var entries []gormModel.Message + db.Preload("User"). + Where(gormModel.Message{Flagged: 0}). + Order("pub_date desc"). + Limit(PAGE_SIZE). + Find(&entries) + c.HTML(http.StatusOK, "timeline.html", gin.H{ "authorized": isAuthorized, "user": user, @@ -85,18 +91,20 @@ func PublicTimelineHandler() gin.HandlerFunc { func SelfTimeline() gin.HandlerFunc { return func(c *gin.Context) { - db := globals.GetDatabase() + db := globals.GetGormDatabase() user, err := helpers.GetUserSession(c) if err != nil { c.AbortWithStatus(http.StatusUnauthorized) } - timelineEntries := []model.TimelineMessage{} - db.Select(&timelineEntries, `select message.*, user.* from message, user - where message.flagged = 0 and message.author_id = user.user_id and ( - user.user_id = ? or - user.user_id in (select whom_id from follower - where who_id = ?)) - order by message.pub_date desc limit ?`, user.UserId, user.UserId, PAGE_SIZE) + timelineEntries := []gormModel.Message{} + subQuery := db.Select("whom_id").Where(&gormModel.Following{UserID: user.ID}).Table("followings") + + db.Preload("User"). + Where(&gormModel.Message{UserID: user.ID}). + Or("user_id in (?)", subQuery). + Order("pub_date desc"). + Limit(PAGE_SIZE). + Find(&timelineEntries) c.HTML(http.StatusOK, "timeline.html", gin.H{ "authorized": true, diff --git a/globals/globals.go b/globals/globals.go index 4965829..bab1fa8 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -1,8 +1,11 @@ package globals import ( + model "DevOps/model/gorm" + "github.com/jmoiron/sqlx" _ "github.com/mattn/go-sqlite3" + "gorm.io/gorm" ) var Secret = []byte("secret") @@ -19,12 +22,21 @@ var latestRequestId int = -1 var db *sqlx.DB +var gormDb *gorm.DB + func GetDatabase() *sqlx.DB { return db } -func SetDatabase(database *sqlx.DB) { - db = database +func GetGormDatabase() *gorm.DB { + return gormDb +} +func SetDatabase(database *gorm.DB) { + + gormDb = database + gormDb.AutoMigrate(&model.User{}) + gormDb.AutoMigrate(&model.Message{}) + gormDb.AutoMigrate(&model.Following{}) } func GetDatabasePath() string { diff --git a/go.mod b/go.mod index 264c4d1..c541b92 100644 --- a/go.mod +++ b/go.mod @@ -14,6 +14,8 @@ require ( github.com/gorilla/context v1.1.1 // indirect github.com/gorilla/securecookie v1.1.1 // indirect github.com/gorilla/sessions v1.2.1 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/mattn/go-isatty v0.0.17 // indirect @@ -21,7 +23,6 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/tanimutomo/sqlfile v1.0.0 // indirect github.com/ugorji/go/codec v1.2.7 // indirect golang.org/x/net v0.4.0 // indirect golang.org/x/sys v0.3.0 // indirect @@ -32,9 +33,12 @@ require ( ) require ( - github.com/gin-contrib/sessions v0.0.5 + github.com/gin-contrib/sessions v0.0.4 github.com/jmoiron/sqlx v1.3.5 - github.com/mattn/go-sqlite3 v2.0.3+incompatible + github.com/mattn/go-sqlite3 v1.14.16 github.com/stretchr/testify v1.8.1 + github.com/tanimutomo/sqlfile v1.0.0 golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 + gorm.io/driver/sqlite v1.4.4 + gorm.io/gorm v1.24.5 ) diff --git a/go.sum b/go.sum index 223892d..773924a 100644 --- a/go.sum +++ b/go.sum @@ -1,20 +1,30 @@ +github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/antonlindstrom/pgstore v0.0.0-20200229204646-b08ebf1105e0/go.mod h1:2Ti6VUHVxpC0VSmTZzEvpzysnaGAfGBOoMIz5ykPyyw= +github.com/boj/redistore v0.0.0-20180917114910-cd5dcc76aeff/go.mod h1:+RTT1BOk5P97fT2CiHkbFQwkK3mjsFAP6zCYV2aXtjw= +github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= +github.com/bradleypeabody/gorilla-sessions-memcache v0.0.0-20181103040241-659414f458e1/go.mod h1:dkChI7Tbtx7H1Tj7TqGSZMOeGpMP5gLHtjroHd4agiI= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 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/sessions v0.0.5 h1:CATtfHmLMQrMNpJRgzjWXD7worTh7g7ritsQfmF+0jE= -github.com/gin-contrib/sessions v0.0.5/go.mod h1:vYAuaUPqie3WUSsft6HUlCjlwwoJQs97miaG2+7neKY= +github.com/gin-contrib/sessions v0.0.4 h1:gq4fNa1Zmp564iHP5G6EBuktilEos8VKhe2sza1KMgo= +github.com/gin-contrib/sessions v0.0.4/go.mod h1:pQ3sIyviBBGcxgyR8mkeJuXbeV3h3NYmhJADQTq5+Vo= 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.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= github.com/gin-gonic/gin v1.8.2 h1:UzKToD9/PoFj/V4rvlKqTRKnQYyz8Sc1MJlv4JHPtvY= github.com/gin-gonic/gin v1.8.2/go.mod h1:qw5AYuDrzRTnhvusDsrov+fDIxp9Dleuu12h8nfB398= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= 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/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -22,7 +32,9 @@ github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfC github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -30,12 +42,21 @@ github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8 github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.1.1/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= +github.com/gorilla/sessions v1.2.0/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kidstuff/mongostore v0.0.0-20181113001930-e650cd85ee4b/go.mod h1:g2nVr8KZVXJSS97Jo8pJ0jgq29P6H7dG0oplUA86MQw= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= @@ -44,24 +65,32 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.3 h1:v9QZf2Sn6AmjXtQeFpdoq/eaNtYP6IN+7lcrygsIAtg= +github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= -github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/memcachier/mc v2.0.1+incompatible/go.mod h1:7bkvFE61leUBvXz+yxsOnGBQSZpBSPIMUQSmmSHvuXc= 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/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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/quasoft/memstore v0.0.0-20191010062613-2bce066d2b0b/go.mod h1:wTPjTepVu7uJBYgZ0SdWHQlIas582j6cn2jgk4DDdlg= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= @@ -69,6 +98,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -77,14 +107,22 @@ github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKs github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/tanimutomo/sqlfile v1.0.0 h1:8Nnkd1ra7vBDb7yrv4zvvEdto0vO5Yuegv87C6Tcyp8= github.com/tanimutomo/sqlfile v1.0.0/go.mod h1:vdHiTAUB+JJn9lSFzv4iLGm54ghBOo444TthhTSvP4E= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 h1:0es+/5331RGQPcXlMfP+WrnIIS6dNnNRe0WB02W0F4M= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -93,6 +131,8 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +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/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= @@ -108,9 +148,16 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/sqlite v1.4.4 h1:gIufGoR0dQzjkyqDyYSCvsYR6fba1Gw5YKDqKeChxFc= +gorm.io/driver/sqlite v1.4.4/go.mod h1:0Aq3iPO+v9ZKbcdiz8gLWRw5VOPcBOPUQJFLq5e2ecI= +gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +gorm.io/gorm v1.24.5 h1:g6OPREKqqlWq4kh/3MCQbZKImeB9e6Xgc4zD+JgNZGE= +gorm.io/gorm v1.24.5/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= diff --git a/helpers/authenticationHelpers.go b/helpers/authenticationHelpers.go index 311978d..0e8d754 100644 --- a/helpers/authenticationHelpers.go +++ b/helpers/authenticationHelpers.go @@ -1,49 +1,48 @@ package helpers import ( - "DevOps/model" + model "DevOps/model/gorm" "errors" "strings" - "github.com/jmoiron/sqlx" "golang.org/x/crypto/bcrypt" + "gorm.io/gorm" ) -func RegisterUser(db *sqlx.DB, username string, password string, password2 string, email string) (model.User, error) { +func RegisterUser(db *gorm.DB, username string, password string, password2 string, email string) (model.User, error) { if EmptyUserPass(username, password) { - return model.User{}, errors.New("you have to enter a value") + return model.User{}, errors.New("You have to enter a value") } if !CheckUserPasswords(password, password2) { - return model.User{}, errors.New("the two passwords do not match") + return model.User{}, errors.New("The two passwords do not match") } if !CheckUserEmail(email) { - return model.User{}, errors.New("you have to enter a valid email address") + return model.User{}, errors.New("You have to enter a valid email address") } if CheckUsernameExists(db, username) { - return model.User{}, errors.New("the username is already taken") + return model.User{}, errors.New("The username is already taken") } pw_hash, err := HashPassword(password) if err != nil { panic("password hashing failed") } - result, err := db.Exec("insert into user (username, email, pw_hash) values (?, ?, ?)", username, email, pw_hash) + user := model.User{Username: username, Email: email, PwHash: pw_hash} + result := db.Create(&user) - id, err := result.LastInsertId() - - return model.User{Username: username, UserId: id, Email: email, PwHash: pw_hash}, err + return user, result.Error } func CheckUserPasswords(password, password2 string) bool { return password == password2 } -func CheckUsernameExists(db *sqlx.DB, username string) bool { - _, err := GetUserId(db, username) +func CheckUsernameExists(db *gorm.DB, username string) bool { + _, err := GetUserIdGorm(db, username) return err == nil } diff --git a/helpers/dbHelpers.go b/helpers/dbHelpers.go index b9e3e76..1fb1034 100644 --- a/helpers/dbHelpers.go +++ b/helpers/dbHelpers.go @@ -1,12 +1,33 @@ package helpers import ( + "DevOps/globals" + model "DevOps/model/gorm" + "log" + "github.com/jmoiron/sqlx" + "gorm.io/driver/sqlite" + "gorm.io/gorm" ) -// Convenience method to look up the id for a username. +// Deprecated: Uses old database func GetUserId(db *sqlx.DB, username string) (string, error) { var id string err := db.QueryRow("select user_id from user where username = ?", username).Scan(&id) return id, err } + +func GetUserIdGorm(db *gorm.DB, username string) (uint, error) { + var user model.User + res := db.Where(&model.User{Username: username}).First(&user) + return user.ID, res.Error +} + +// Open connection to DB, and return DB element +func GetGormDbConnection() *gorm.DB { + dbGorm, err := gorm.Open(sqlite.Open(globals.GetDatabasePath()), &gorm.Config{}) + if err != nil { + log.Fatal("failed to connect database") + } + return dbGorm +} diff --git a/helpers/helpers.go b/helpers/helpers.go index d0b6dc6..8151ac4 100644 --- a/helpers/helpers.go +++ b/helpers/helpers.go @@ -1,7 +1,8 @@ package helpers import ( - "DevOps/model" + model "DevOps/model" + gormModel "DevOps/model/gorm" "crypto/md5" "encoding/hex" "fmt" @@ -11,6 +12,7 @@ import ( "github.com/gin-gonic/gin" "github.com/jmoiron/sqlx" "golang.org/x/crypto/bcrypt" + "gorm.io/gorm" ) func CheckPasswordHash(password, hash string) bool { @@ -26,14 +28,15 @@ func EmptyUserPass(username, password string) bool { return strings.Trim(username, " ") == "" || strings.Trim(password, " ") == "" } -func ValidatePassword(db *sqlx.DB, username, password string) bool { - var pw_hash string - err := db.QueryRow("select pw_hash from user where username = ?", username).Scan(&pw_hash) - if err != nil { +func ValidatePassword(db *gorm.DB, username, password string) bool { + var user gormModel.User + res := db.Where(gormModel.User{Username: username}).First(&user) + if res.Error != nil { + return false } - return CheckPasswordHash(password, pw_hash) + return CheckPasswordHash(password, user.PwHash) } func GetTypedDb(c *gin.Context) *sqlx.DB { @@ -62,3 +65,11 @@ func FormatDatetime(unixTime int64) string { func RequestedUserExists(requestedUser string, users []model.User) bool { return len(users) >= 0 && len(requestedUser) != 0 } + +func Map[T, U any](ts []T, f func(T) U) []U { + us := make([]U, len(ts)) + for i := range ts { + us[i] = f(ts[i]) + } + return us +} diff --git a/helpers/sessionHelpers.go b/helpers/sessionHelpers.go index 6f48964..0f363e1 100644 --- a/helpers/sessionHelpers.go +++ b/helpers/sessionHelpers.go @@ -2,7 +2,7 @@ package helpers import ( "DevOps/globals" - "DevOps/model" + gormModel "DevOps/model/gorm" "encoding/json" "errors" @@ -10,18 +10,18 @@ import ( "github.com/gin-gonic/gin" ) -func GetUserSession(c *gin.Context) (model.User, error) { +func GetUserSession(c *gin.Context) (gormModel.User, error) { session := sessions.Default(c) user := session.Get(globals.Userkey) if user != nil { - var deserialized model.User + var deserialized gormModel.User err := json.Unmarshal(user.([]byte), &deserialized) return deserialized, err } - return model.User{}, errors.New("No session active") + return gormModel.User{}, errors.New("No session active") } -func SetUserSession(c *gin.Context, m model.User) error { +func SetUserSession(c *gin.Context, m gormModel.User) error { session := sessions.Default(c) serialized, err := json.Marshal(m) if err != nil { diff --git a/minitwit.go b/minitwit.go index d432923..3f3cf95 100644 --- a/minitwit.go +++ b/minitwit.go @@ -2,14 +2,13 @@ package main import ( "DevOps/globals" + helpers "DevOps/helpers" routes "DevOps/routes" - - "github.com/jmoiron/sqlx" ) func main() { - db := sqlx.MustConnect("sqlite3", globals.GetDatabasePath()) - globals.SetDatabase(db) + gormDb := helpers.GetGormDbConnection() + globals.SetDatabase(gormDb) r := routes.SetupRouter() r.Run(":8080") } diff --git a/model/gorm/following.go b/model/gorm/following.go new file mode 100644 index 0000000..922250c --- /dev/null +++ b/model/gorm/following.go @@ -0,0 +1,13 @@ +package model + +import ( + "gorm.io/gorm" +) + +type Following struct { + gorm.Model + UserID uint + User User + WhomId uint + WhomUser User `gorm:"foreignKey:WhomId"` +} diff --git a/model/gorm/message.go b/model/gorm/message.go new file mode 100644 index 0000000..9ae64e1 --- /dev/null +++ b/model/gorm/message.go @@ -0,0 +1,14 @@ +package model + +import ( + "gorm.io/gorm" +) + +type Message struct { + gorm.Model + UserID uint + User User + Text string + PubDate int64 + Flagged int +} diff --git a/model/gorm/user.go b/model/gorm/user.go new file mode 100644 index 0000000..5e81ac4 --- /dev/null +++ b/model/gorm/user.go @@ -0,0 +1,14 @@ +package model + +import ( + "gorm.io/gorm" +) + +type User struct { + gorm.Model + Username string + Email string + PwHash string + Messages []Message + Followings []Following +} diff --git a/templates/timeline.html b/templates/timeline.html index 23fbd90..49b8f2d 100644 --- a/templates/timeline.html +++ b/templates/timeline.html @@ -1,37 +1,43 @@ {{template "header.html" .}} {{.title}}

{{.title}}

-{{if .user.UserId}} - {{if .userProfile}} -
- {{if .isSelf}} - This is you! - {{else if .followed}} - You are currently following this user. - Unfollow user. - {{else}} - Follow user. - You are not yet following this user. - {{end}} -
- {{else}} -
-

What's on your mind {{ .user.Username }}?

-
-

- -

-
- {{end}} -{{end}} -