Add navigation

This commit is contained in:
Senad Uka
2022-02-16 19:11:48 +01:00
parent 47987ff395
commit ba918d1f57
7 changed files with 113 additions and 4 deletions

View File

@@ -133,3 +133,43 @@ func ArticleByID(store *Store, ID int, slug string) (article model.DisplayArticl
return result, nil
}
func PreviousAndNextArticleUrlByID(store *Store, ID int) (nextUrl string, previousUrl string, err error) {
nextResult, previousResult := "#", "#"
query, err := store.Prepare(`
select id,title, content, slug, original_url, source_id, created_at from articles where id = $1;
`)
if err != nil {
return nextResult, previousResult, err
}
defer query.Close()
row := query.QueryRow(ID - 1)
if err != nil {
return nextResult, previousResult, err
}
r := model.DisplayArticle{}
content := ""
err = row.Scan(&r.ID, &r.Title, &content, &r.Slug, &r.OriginalUrl, &r.SourceId, &r.CreatedAt)
if err != nil {
return nextResult, previousResult, err
}
previousResult = fmt.Sprintf("/%d/%s", r.ID, r.Slug)
row = query.QueryRow(ID + 1)
if err != nil {
return nextResult, previousResult, err
}
content = ""
err = row.Scan(&r.ID, &r.Title, &content, &r.Slug, &r.OriginalUrl, &r.SourceId, &r.CreatedAt)
if err != nil {
return nextResult, previousResult, err
}
nextResult = fmt.Sprintf("/%d/%s", r.ID, r.Slug)
return nextResult, previousResult, nil
}

View File

@@ -1,6 +1,7 @@
package server
import (
"fmt"
"github.com/gorilla/mux"
"gitlab.com/kbr4/svevijesti/internal/database"
"net/http"
@@ -21,9 +22,51 @@ func rootHandler(wr http.ResponseWriter, req *http.Request) {
http.Error(wr, err.Error(), http.StatusInternalServerError)
}
dayBefore := "/dan/" + time.Now().Add(-24*time.Hour).Format("2006-01-02")
data := map[string]interface{}{
"title": title,
"articles": articles,
"previous": dayBefore,
"next": "/",
}
err = templates.ExecuteTemplate(wr, "homeHTML", data)
if err != nil {
http.Error(wr, err.Error(), http.StatusInternalServerError)
}
}
func dailyArticlesHandler(wr http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req)
day, err := time.Parse("2006-01-02", vars["date"])
if err != nil {
http.Error(wr, err.Error(), http.StatusNotFound)
}
dayBefore := "/dan/" + day.Add(-24*time.Hour).Format("2006-01-02")
dayAfter := "/dan/" + day.Add(24*time.Hour).Format("2006-01-02")
if day.Add(24*time.Hour).Format("2006-01-02") == time.Now().Format("2006-01-02") {
dayAfter = "/"
}
title := fmt.Sprintf("Stare novine na dan %s", day.Format("2006-01-02"))
store, err := database.Connect()
if err != nil {
http.Error(wr, err.Error(), http.StatusInternalServerError)
}
defer store.Close()
articles, err := database.ArticlesForDay(store, day)
if err != nil {
http.Error(wr, err.Error(), http.StatusInternalServerError)
}
data := map[string]interface{}{
"title": title,
"articles": articles,
"previous": dayBefore,
"next": dayAfter,
}
err = templates.ExecuteTemplate(wr, "homeHTML", data)
@@ -50,10 +93,14 @@ func articleHandler(wr http.ResponseWriter, req *http.Request) {
http.Error(wr, err.Error(), http.StatusNotFound)
}
next, previous, _ := database.PreviousAndNextArticleUrlByID(store, articleID)
title := article.Title
data := map[string]interface{}{
"title": title,
"article": article,
"title": title,
"article": article,
"previous": previous,
"next": next,
}
err = templates.ExecuteTemplate(wr, "articleHTML", data)

View File

@@ -39,7 +39,8 @@ func init() {
func CreateRoutes() *mux.Router {
r := mux.NewRouter()
r.HandleFunc("/", rootHandler)
r.HandleFunc("/dan/{date}", dailyArticlesHandler)
r.HandleFunc("/{id:[0-9]+}/{slug}", articleHandler)
r.HandleFunc("/", rootHandler)
return r
}

BIN
server

Binary file not shown.

View File

@@ -2,5 +2,12 @@
<footer>
SN
<div>
<nav>
<a href="{{.previous}}">&lt;----</a> |
<a href="/">Početna</a> |
<a href="{{.next}}">----&gt;</a>
</nav>
</div>
</footer>
{{end}}

View File

@@ -12,7 +12,9 @@
</pre>
<br>
<nav>
<a href="/">Početna</a>
<a href="{{.previous}}">&lt;----</a> |
<a href="/">Početna</a> |
<a href="{{.next}}">----&gt;</a>
</nav>
</header>
{{end}}

View File

@@ -0,0 +1,12 @@
{{define "homeHTML"}}
{{template "headHTML" .}}
<body>
{{template "headerHTML" .}}
{{template "articlesHTML" .}}
{{template "footerHTML" .}}
</body>
</html>
{{end}}