Skip to content

Commit

Permalink
Merge pull request #45 from Lindharden/feature/gorm
Browse files Browse the repository at this point in the history
Feature/gorm
  • Loading branch information
Lindharden authored Mar 5, 2023
2 parents 55dfda7 + 13e8230 commit ee8fa45
Show file tree
Hide file tree
Showing 18 changed files with 326 additions and 194 deletions.
41 changes: 22 additions & 19 deletions controllers/followController.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand All @@ -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{})
}
}

Expand All @@ -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)
Expand All @@ -63,17 +65,17 @@ 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)
return
}

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)
Expand All @@ -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 }),
})
}
}
37 changes: 9 additions & 28 deletions controllers/loginController.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (

"DevOps/globals"
helpers "DevOps/helpers"
model "DevOps/model"
gormModel "DevOps/model/gorm"
simModels "DevOps/model/simulatorModel"
)

Expand All @@ -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

Expand All @@ -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",
Expand All @@ -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")
}
}
Expand All @@ -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"})
Expand All @@ -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"})
Expand Down
62 changes: 40 additions & 22 deletions controllers/messageController.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package controllers
import (
globals "DevOps/globals"
helpers "DevOps/helpers"
model "DevOps/model"
model "DevOps/model/gorm"
"net/http"
"strconv"
"time"
Expand All @@ -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")
Expand All @@ -34,18 +37,21 @@ 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"))
if err != nil {
// 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
Expand All @@ -54,7 +60,7 @@ func GetMessageHandler() gin.HandlerFunc {
simModels.FilteredMessageRequest{
Text: message.Text,
PubDate: message.PubDate,
Username: message.Username,
Username: message.User.Username,
})
}

Expand All @@ -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
Expand All @@ -88,7 +103,7 @@ func GetMessageUserHandler() gin.HandlerFunc {
simModels.FilteredMessageRequest{
Text: message.Text,
PubDate: message.PubDate,
Username: message.Username,
Username: message.User.Username,
})
}

Expand All @@ -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)
Expand Down
Loading

0 comments on commit ee8fa45

Please sign in to comment.