From 92da75fbee191c27b2bf2066ccb0705e1065db0c Mon Sep 17 00:00:00 2001 From: Danielle Dequin Date: Sun, 5 Mar 2023 21:30:40 +0100 Subject: [PATCH 01/24] Added Gravatar next to posts --- templates/timeline.html | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/templates/timeline.html b/templates/timeline.html index e5d6f71..89aa559 100644 --- a/templates/timeline.html +++ b/templates/timeline.html @@ -1,5 +1,5 @@ -{% block title %}Public Timeline{% endblock %} +Public Timeline

MiniTwit

@@ -18,7 +18,7 @@

MiniTwit

{{ if .user }}
-

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

+

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

@@ -28,11 +28,21 @@

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

{{ end }}

Twits

    + {{ range .messages }} +
  • + {{ .Author_id }} + {{ .Text }} + — {{ .Pub_Date }} + {{ else }} +

  • There's no message so far. + {{ end }} +
+ From db63e292a4ee77f69f291ddc2008fb7c0875e1c2 Mon Sep 17 00:00:00 2001 From: Danielle Dequin Date: Sun, 5 Mar 2023 22:12:03 +0100 Subject: [PATCH 02/24] Showing that there is no one logged in --- controllers/tweets_controller.go | 3 ++- templates/timeline.html | 8 ++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/controllers/tweets_controller.go b/controllers/tweets_controller.go index f556d45..eeb654b 100644 --- a/controllers/tweets_controller.go +++ b/controllers/tweets_controller.go @@ -36,7 +36,7 @@ func public(c *gin.Context) { //Displays the latest messages of all users // ENDPOINT: GET / func timeline(c *gin.Context) { - + // check if there exists a session user, if not, return all messages // For now just reuse the same endpoint handler as /public if user == -1 { @@ -55,6 +55,7 @@ func timeline(c *gin.Context) { c.HTML(http.StatusOK, "timeline.html", gin.H{ "messages": messages, + "user": user, }) } diff --git a/templates/timeline.html b/templates/timeline.html index 89aa559..9c89584 100644 --- a/templates/timeline.html +++ b/templates/timeline.html @@ -25,6 +25,8 @@

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

+ {{ else }} +

{{ .user }} is the .user variable

{{ end }}

Twits

- From f97b8b6580c5ac6fc7dce8fa40734516bf120914 Mon Sep 17 00:00:00 2001 From: Danielle Dequin Date: Mon, 6 Mar 2023 16:44:30 +0100 Subject: [PATCH 03/24] Attempting to debug login issues --- controllers/tweets_controller.go | 31 ++++++++++++++++--------------- controllers/user_controller.go | 2 ++ 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/controllers/tweets_controller.go b/controllers/tweets_controller.go index eeb654b..0271cbc 100644 --- a/controllers/tweets_controller.go +++ b/controllers/tweets_controller.go @@ -31,6 +31,7 @@ func public(c *gin.Context) { //Displays the latest messages of all users c.HTML(http.StatusOK, "timeline.html", gin.H{ "messages": messages, + "user": user, }) } @@ -39,24 +40,24 @@ func timeline(c *gin.Context) { // check if there exists a session user, if not, return all messages // For now just reuse the same endpoint handler as /public + username, _ := c.Cookie("user") if user == -1 { public(c) - return - } - - var messages []entities.Message - - if err := database.DB.Table("messages"). - Joins("left join followers on messages.author_id = followers.whom_id"). - Where("messages.flagged = ? AND (messages.author_id = ? OR followers.who_id = ?)", false, user, user). - Limit(Per_page).Find(&messages).Error; err != nil { // ORDER BY DATE - log.Print("Ran into error during " + c.Request.RequestURI + ": " + err.Error()) + } else { + var messages []entities.Message + + if err := database.DB.Table("messages"). + Joins("left join followers on messages.author_id = followers.whom_id"). + Where("messages.flagged = ? AND (messages.author_id = ? OR followers.who_id = ?)", false, user, user). + Limit(Per_page).Find(&messages).Error; err != nil { // ORDER BY DATE + log.Print("Ran into error during " + c.Request.RequestURI + ": " + err.Error()) + } + + c.HTML(http.StatusOK, "timeline.html", gin.H{ + "messages": messages, + "user": username, + }) } - - c.HTML(http.StatusOK, "timeline.html", gin.H{ - "messages": messages, - "user": user, - }) } // ENDPOINT: POST /add_message diff --git a/controllers/user_controller.go b/controllers/user_controller.go index c1225b7..ea0a868 100644 --- a/controllers/user_controller.go +++ b/controllers/user_controller.go @@ -78,6 +78,7 @@ func username(c *gin.Context) { //Displays a user's tweets c.HTML(http.StatusOK, "timeline.html", gin.H{ "messagesFromUser": messagesFromUser, + "username": username, }) } @@ -166,6 +167,7 @@ func login_user(c *gin.Context) { //Logs the user in. user_path := "/" + body.Username location := url.URL{Path: user_path} c.Redirect(http.StatusFound, location.RequestURI()) + c.SetCookie("user", body.Username, 3600, "/", "/", false, false) // Temporarily dont redirect //c.String(200, "You were logged in") From 0fd37c8f5f896e567e3fe3ef38b196603b43324f Mon Sep 17 00:00:00 2001 From: Danielle Dequin Date: Mon, 6 Mar 2023 19:00:00 +0100 Subject: [PATCH 04/24] After signing it, the correct page is dis displayed, showing the user logged in --- controllers/tweets_controller.go | 5 +++-- controllers/user_controller.go | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/controllers/tweets_controller.go b/controllers/tweets_controller.go index 0271cbc..8573e62 100644 --- a/controllers/tweets_controller.go +++ b/controllers/tweets_controller.go @@ -31,7 +31,7 @@ func public(c *gin.Context) { //Displays the latest messages of all users c.HTML(http.StatusOK, "timeline.html", gin.H{ "messages": messages, - "user": user, + //"user": user, }) } @@ -55,7 +55,8 @@ func timeline(c *gin.Context) { c.HTML(http.StatusOK, "timeline.html", gin.H{ "messages": messages, - "user": username, + "user": user, + "username": username, }) } } diff --git a/controllers/user_controller.go b/controllers/user_controller.go index ea0a868..0345eee 100644 --- a/controllers/user_controller.go +++ b/controllers/user_controller.go @@ -79,6 +79,7 @@ func username(c *gin.Context) { //Displays a user's tweets c.HTML(http.StatusOK, "timeline.html", gin.H{ "messagesFromUser": messagesFromUser, "username": username, + "user": user, }) } From 21b2808461631766f1a2191b0b2dc660e0609381 Mon Sep 17 00:00:00 2001 From: Danielle Dequin Date: Tue, 7 Mar 2023 11:09:55 +0100 Subject: [PATCH 05/24] Added username to tweetbox on user's page --- templates/timeline.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/templates/timeline.html b/templates/timeline.html index 9c89584..6a7a52c 100644 --- a/templates/timeline.html +++ b/templates/timeline.html @@ -18,15 +18,13 @@

MiniTwit

{{ if .user }}
-

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

+

What's on your mind {{ .username }}?

- {{ else }} -

{{ .user }} is the .user variable

{{ end }}

Twits

    From 93aa0778855aba9bb579dce2203dcfc71c6a79fb Mon Sep 17 00:00:00 2001 From: adamjhr Date: Tue, 7 Mar 2023 11:25:07 +0100 Subject: [PATCH 06/24] Added chicken in egg favicon --- static/favicon_io/about.txt | 6 ++++++ static/favicon_io/android-chrome-192x192.png | Bin 0 -> 13144 bytes static/favicon_io/android-chrome-512x512.png | Bin 0 -> 41937 bytes static/favicon_io/apple-touch-icon.png | Bin 0 -> 11776 bytes static/favicon_io/favicon-16x16.png | Bin 0 -> 654 bytes static/favicon_io/favicon-32x32.png | Bin 0 -> 1477 bytes static/favicon_io/favicon.ico | Bin 0 -> 15406 bytes static/favicon_io/site.webmanifest | 1 + templates/index.html | 8 +++++++- templates/login.html | 8 +++++++- templates/register.html | 8 +++++++- templates/timeline.html | 8 +++++++- 12 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 static/favicon_io/about.txt create mode 100644 static/favicon_io/android-chrome-192x192.png create mode 100644 static/favicon_io/android-chrome-512x512.png create mode 100644 static/favicon_io/apple-touch-icon.png create mode 100644 static/favicon_io/favicon-16x16.png create mode 100644 static/favicon_io/favicon-32x32.png create mode 100644 static/favicon_io/favicon.ico create mode 100644 static/favicon_io/site.webmanifest diff --git a/static/favicon_io/about.txt b/static/favicon_io/about.txt new file mode 100644 index 0000000..e141ac2 --- /dev/null +++ b/static/favicon_io/about.txt @@ -0,0 +1,6 @@ +This favicon was generated using the following graphics from Twitter Twemoji: + +- Graphics Title: 1f423.svg +- Graphics Author: Copyright 2020 Twitter, Inc and other contributors (https://github.com/twitter/twemoji) +- Graphics Source: https://github.com/twitter/twemoji/blob/master/assets/svg/1f423.svg +- Graphics License: CC-BY 4.0 (https://creativecommons.org/licenses/by/4.0/) diff --git a/static/favicon_io/android-chrome-192x192.png b/static/favicon_io/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..63c5c3577fc40d6e3c18a504ca100d5b6c4a1695 GIT binary patch literal 13144 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�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 G=>GxxyNg!< literal 0 HcmV?d00001 diff --git a/static/favicon_io/apple-touch-icon.png b/static/favicon_io/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..53e216a6c6810c390bd07da41da2b94f30179d76 GIT binary patch literal 11776 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 i&CMNJ>a{@a-v0sI`-GOlGJ6*Q0000}}_MQ07s? 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 DlM9WS literal 0 HcmV?d00001 diff --git a/static/favicon_io/site.webmanifest b/static/favicon_io/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/static/favicon_io/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/templates/index.html b/templates/index.html index 4573a55..330e846 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,5 +1,11 @@ -Welcome | MiniTwit + + Welcome | MiniTwit + + + + +

    MiniTwit

    diff --git a/templates/login.html b/templates/login.html index 5e62a1a..cc6a432 100644 --- a/templates/login.html +++ b/templates/login.html @@ -1,5 +1,11 @@ -Welcome | MiniTwit + + Welcome | MiniTwit + + + + +

    MiniTwit

    diff --git a/templates/register.html b/templates/register.html index c193ac6..05bcd6f 100644 --- a/templates/register.html +++ b/templates/register.html @@ -1,5 +1,11 @@ -Welcome | MiniTwit + + Welcome | MiniTwit + + + + +

    MiniTwit | Sign Up

    diff --git a/templates/timeline.html b/templates/timeline.html index 9c89584..9765cae 100644 --- a/templates/timeline.html +++ b/templates/timeline.html @@ -1,5 +1,11 @@ -Public Timeline + + Welcome | MiniTwit + + + + +

    MiniTwit

    From 698272ba5e98fd03bdc1797d302af7985a4ce841 Mon Sep 17 00:00:00 2001 From: Danielle Dequin Date: Tue, 7 Mar 2023 13:38:21 +0100 Subject: [PATCH 07/24] Added correct redirect for logout --- controllers/tweets_controller.go | 24 ++++++++++++++---------- controllers/user_controller.go | 14 ++++++++++++-- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/controllers/tweets_controller.go b/controllers/tweets_controller.go index 8573e62..9c532ca 100644 --- a/controllers/tweets_controller.go +++ b/controllers/tweets_controller.go @@ -23,15 +23,19 @@ func public(c *gin.Context) { //Displays the latest messages of all users var messages []entities.Message - if err := database.DB.Where("Flagged = false").Order("Pub_Date desc").Limit(Per_page).Find(&messages).Error; err != nil { - log.Print("Ran into error during " + c.Request.RequestURI + ": " + err.Error()) - c.AbortWithStatus(400) - return - } + if err := database.DB.Table("messages"). + Joins("join users on messages.author_id = users.id"). + Where("Flagged = false"). + Order("Pub_Date desc"). + Limit(Per_page). + Find(&messages).Error; err != nil { + log.Print("Ran into error during " + c.Request.RequestURI + ": " + err.Error()) + c.AbortWithStatus(400) + return + } c.HTML(http.StatusOK, "timeline.html", gin.H{ "messages": messages, - //"user": user, }) } @@ -39,8 +43,7 @@ func public(c *gin.Context) { //Displays the latest messages of all users func timeline(c *gin.Context) { // check if there exists a session user, if not, return all messages - // For now just reuse the same endpoint handler as /public - username, _ := c.Cookie("user") + //username, _ := c.Cookie("user") if user == -1 { public(c) } else { @@ -48,6 +51,7 @@ func timeline(c *gin.Context) { if err := database.DB.Table("messages"). Joins("left join followers on messages.author_id = followers.whom_id"). + //Joins("join users on messages.author_id = users.id"). Where("messages.flagged = ? AND (messages.author_id = ? OR followers.who_id = ?)", false, user, user). Limit(Per_page).Find(&messages).Error; err != nil { // ORDER BY DATE log.Print("Ran into error during " + c.Request.RequestURI + ": " + err.Error()) @@ -56,7 +60,7 @@ func timeline(c *gin.Context) { c.HTML(http.StatusOK, "timeline.html", gin.H{ "messages": messages, "user": user, - "username": username, + //"username": username, }) } } @@ -92,7 +96,6 @@ func addMessage(c *gin.Context) { //Registers a new message for the user. //redirect to timeline ("/") //c.Redirect(200, "/") // For some reason, this returns error 500, but I assume it's because the path doesn't exist yet? - // Temporarily dont redirect c.String(200, "Your message was recorded") } @@ -114,6 +117,7 @@ func SetupRouter() *gin.Engine { router.POST("/add_message", addMessage) router.POST("/login", login_user) router.GET("/login", loginf) + router.GET("/logout", logout_user) router.PUT("/logout", logoutf) // Changed temporarily to satisfy tests, should it be put or get? router.GET("/sim/latest", simLatest) diff --git a/controllers/user_controller.go b/controllers/user_controller.go index 0345eee..3443e78 100644 --- a/controllers/user_controller.go +++ b/controllers/user_controller.go @@ -70,7 +70,10 @@ func username(c *gin.Context) { //Displays a user's tweets var messagesFromUser []entities.Message - if err := database.DB.Where("author_id = ?", userID).Limit(Per_page).Find(&messagesFromUser).Error; err != nil { + if err := database.DB. + Where("author_id = ?", userID). + Limit(Per_page). + Find(&messagesFromUser).Error; err != nil { log.Print("Ran into error during " + c.Request.RequestURI + ": " + err.Error()) c.AbortWithStatus(404) return @@ -179,13 +182,20 @@ func login_user(c *gin.Context) { //Logs the user in. } +// ENDPOINT: GET /logout +func logout_user(c *gin.Context) { + + //location := url.URL{Path: "/"} + c.Redirect(http.StatusFound, "/") +} + + // ENDPOINT: PUT /logout func logoutf(c *gin.Context) { //clear session user user = -1 //c.Redirect(200, "/") - // Temporarily don't redirect c.String(200, "You were logged out") } From a31655312f75f8718647c6d5091d72ee8b482ce6 Mon Sep 17 00:00:00 2001 From: Danielle Dequin Date: Tue, 7 Mar 2023 13:54:10 +0100 Subject: [PATCH 08/24] Correctly functioning logout endpoint --- controllers/tweets_controller.go | 3 +-- controllers/user_controller.go | 14 +++----------- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/controllers/tweets_controller.go b/controllers/tweets_controller.go index 9c532ca..5938696 100644 --- a/controllers/tweets_controller.go +++ b/controllers/tweets_controller.go @@ -60,7 +60,6 @@ func timeline(c *gin.Context) { c.HTML(http.StatusOK, "timeline.html", gin.H{ "messages": messages, "user": user, - //"username": username, }) } } @@ -118,7 +117,7 @@ func SetupRouter() *gin.Engine { router.POST("/login", login_user) router.GET("/login", loginf) router.GET("/logout", logout_user) - router.PUT("/logout", logoutf) // Changed temporarily to satisfy tests, should it be put or get? + //router.PUT("/logout", logoutf) // Changed temporarily to satisfy tests, should it be put or get? router.GET("/sim/latest", simLatest) router.POST("/sim/register", simRegister) diff --git a/controllers/user_controller.go b/controllers/user_controller.go index 3443e78..8eec3fc 100644 --- a/controllers/user_controller.go +++ b/controllers/user_controller.go @@ -184,19 +184,11 @@ func login_user(c *gin.Context) { //Logs the user in. // ENDPOINT: GET /logout func logout_user(c *gin.Context) { - - //location := url.URL{Path: "/"} - c.Redirect(http.StatusFound, "/") -} - - -// ENDPOINT: PUT /logout -func logoutf(c *gin.Context) { //clear session user user = -1 - - //c.Redirect(200, "/") - c.String(200, "You were logged out") + + //c.String(200, "You were logged out") + c.Redirect(http.StatusFound, "/") } // ENDPOINT: GET /register From db8805d0d6de61c4100901d34fc08877d907969d Mon Sep 17 00:00:00 2001 From: Danielle Dequin Date: Tue, 7 Mar 2023 17:14:30 +0100 Subject: [PATCH 09/24] Have a working username on the timeline html. Co-authored-by: Sabrina Pereira --- controllers/tweets_controller.go | 19 ++++++++++++++++--- templates/timeline.html | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/controllers/tweets_controller.go b/controllers/tweets_controller.go index 5938696..8ef950d 100644 --- a/controllers/tweets_controller.go +++ b/controllers/tweets_controller.go @@ -21,8 +21,8 @@ func ping(c *gin.Context) { // ENDPOINT: GET /public func public(c *gin.Context) { //Displays the latest messages of all users - var messages []entities.Message - + //var messages []entities.Message +/* if err := database.DB.Table("messages"). Joins("join users on messages.author_id = users.id"). Where("Flagged = false"). @@ -32,10 +32,23 @@ func public(c *gin.Context) { //Displays the latest messages of all users log.Print("Ran into error during " + c.Request.RequestURI + ": " + err.Error()) c.AbortWithStatus(400) return + }*/ + + type result struct { + Author_id uint + Username string + Text string + Pub_Date uint } + + var results []result + + database.DB.Table("messages").Select("messages.Author_id", "users.Username" ,"messages.Text", "messages.Pub_Date").Joins("left join users on users.id = messages.Author_id").Scan(&results) + //database.DB.Model(&message{}).Select("messages.Author_id", "messages.Text", "messages.Pub_Date").Joins("left join users on users.id = messages.Author_id").Scan(&result{}) + // SELECT users.name, emails.email FROM `users` left join emails on emails.user_id = users.id c.HTML(http.StatusOK, "timeline.html", gin.H{ - "messages": messages, + "messages": results, }) } diff --git a/templates/timeline.html b/templates/timeline.html index 9783335..400f5d6 100644 --- a/templates/timeline.html +++ b/templates/timeline.html @@ -36,7 +36,7 @@

    Twits

      {{ range .messages }}
    • - {{ .Author_id }} + {{ .Username }} {{ .Text }} — {{ .Pub_Date }} {{ else }} From f9ce9ab72845846db0777f378126b368477873b6 Mon Sep 17 00:00:00 2001 From: Danielle Dequin Date: Tue, 7 Mar 2023 17:20:12 +0100 Subject: [PATCH 10/24] Cleaned up. Co-authored-by: Sabrina Pereira --- controllers/tweets_controller.go | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/controllers/tweets_controller.go b/controllers/tweets_controller.go index 8ef950d..775eb2b 100644 --- a/controllers/tweets_controller.go +++ b/controllers/tweets_controller.go @@ -21,19 +21,6 @@ func ping(c *gin.Context) { // ENDPOINT: GET /public func public(c *gin.Context) { //Displays the latest messages of all users - //var messages []entities.Message -/* - if err := database.DB.Table("messages"). - Joins("join users on messages.author_id = users.id"). - Where("Flagged = false"). - Order("Pub_Date desc"). - Limit(Per_page). - Find(&messages).Error; err != nil { - log.Print("Ran into error during " + c.Request.RequestURI + ": " + err.Error()) - c.AbortWithStatus(400) - return - }*/ - type result struct { Author_id uint Username string @@ -42,10 +29,11 @@ func public(c *gin.Context) { //Displays the latest messages of all users } var results []result - - database.DB.Table("messages").Select("messages.Author_id", "users.Username" ,"messages.Text", "messages.Pub_Date").Joins("left join users on users.id = messages.Author_id").Scan(&results) - //database.DB.Model(&message{}).Select("messages.Author_id", "messages.Text", "messages.Pub_Date").Joins("left join users on users.id = messages.Author_id").Scan(&result{}) - // SELECT users.name, emails.email FROM `users` left join emails on emails.user_id = users.id + + // Join messages and users tables + database.DB.Table("messages"). + Select("messages.Author_id", "users.Username" ,"messages.Text", "messages.Pub_Date"). + Joins("left join users on users.id = messages.Author_id").Scan(&results) c.HTML(http.StatusOK, "timeline.html", gin.H{ "messages": results, @@ -55,7 +43,7 @@ func public(c *gin.Context) { //Displays the latest messages of all users // ENDPOINT: GET / func timeline(c *gin.Context) { - // check if there exists a session user, if not, return all messages + // check if there exists a session user, else show my_timeline //username, _ := c.Cookie("user") if user == -1 { public(c) From 66ce5674f5f0e54ea4b23cbd0340bdcb6ab56b49 Mon Sep 17 00:00:00 2001 From: Danielle Dequin Date: Tue, 7 Mar 2023 17:32:25 +0100 Subject: [PATCH 11/24] Fixed redirect for login. Co-authored-by: Sabrina Pereira --- controllers/user_controller.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/controllers/user_controller.go b/controllers/user_controller.go index 8eec3fc..183a2cd 100644 --- a/controllers/user_controller.go +++ b/controllers/user_controller.go @@ -168,8 +168,8 @@ func login_user(c *gin.Context) { //Logs the user in. //redirect to timeline ("/") //c.Redirect(200, "/") - user_path := "/" + body.Username - location := url.URL{Path: user_path} + //user_path := "/" + body.Username + location := url.URL{Path: "/"} c.Redirect(http.StatusFound, location.RequestURI()) c.SetCookie("user", body.Username, 3600, "/", "/", false, false) From 67a3721e1d0d39e2ff134aedca3c19e0993fb081 Mon Sep 17 00:00:00 2001 From: Danielle Dequin Date: Tue, 7 Mar 2023 17:52:49 +0100 Subject: [PATCH 12/24] Changed button name. Co-authored-by: Sabrina Pereira --- controllers/user_controller.go | 6 ++---- templates/timeline.html | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/controllers/user_controller.go b/controllers/user_controller.go index 183a2cd..564d24e 100644 --- a/controllers/user_controller.go +++ b/controllers/user_controller.go @@ -80,7 +80,7 @@ func username(c *gin.Context) { //Displays a user's tweets } c.HTML(http.StatusOK, "timeline.html", gin.H{ - "messagesFromUser": messagesFromUser, + "messages": messagesFromUser, "username": username, "user": user, }) @@ -167,13 +167,11 @@ func login_user(c *gin.Context) { //Logs the user in. } //redirect to timeline ("/") - //c.Redirect(200, "/") //user_path := "/" + body.Username location := url.URL{Path: "/"} c.Redirect(http.StatusFound, location.RequestURI()) - c.SetCookie("user", body.Username, 3600, "/", "/", false, false) + //c.SetCookie("user", body.Username, 3600, "/", "/", false, false) - // Temporarily dont redirect //c.String(200, "You were logged in") } else { diff --git a/templates/timeline.html b/templates/timeline.html index 400f5d6..5b4fa94 100644 --- a/templates/timeline.html +++ b/templates/timeline.html @@ -12,9 +12,9 @@

      MiniTwit