dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit 29f9059377614ae50d0e98aa4a2a8b7c7748df83
parent 8ef9ea676be2e3df28fb087e5a315e373bf607e2
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Mon,  5 Jun 2023 08:42:13 -0700

Display news from database

Diffstat:
Acmd/dkf/migrations/137.sql | 4++++
Mpkg/database/table_forum_threads.go | 20++++++++++++++++++++
Mpkg/web/handlers/data.go | 4+++-
Mpkg/web/handlers/handlers.go | 4++++
Mpkg/web/public/views/pages/news.gohtml | 15+++++++++++++++
Mpkg/web/public/views/pages/thread-edit.gohtml | 6+++---
6 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/cmd/dkf/migrations/137.sql b/cmd/dkf/migrations/137.sql @@ -0,0 +1,4 @@ +-- +migrate Up +INSERT INTO forum_categories (name, slug) VALUES ('News', 'news'); + +-- +migrate Down diff --git a/pkg/database/table_forum_threads.go b/pkg/database/table_forum_threads.go @@ -179,6 +179,12 @@ func (d *DkfDB) GetForumThreads() (out []ForumThread, err error) { return } +type ForumNews struct { + ForumThread + ForumMessage + User +} + type ForumThreadAug struct { ForumThread Author string @@ -236,6 +242,20 @@ ORDER BY m.created_at DESC, t.id DESC`, userID, categoryID).Scan(&out).Error return } +func (d *DkfDB) GetForumNews(categoryID ForumCategoryID) (out []ForumNews, err error) { + err = d.db.Raw(`SELECT t.*, + m.*, + mu.* +FROM forum_threads t +-- Find first message for thread +INNER JOIN forum_messages m ON m.thread_id = t.id AND m.id = (SELECT min(id) FROM forum_messages WHERE thread_id = t.id) +-- Join last message user +INNER JOIN users mu ON mu.id = m.user_id +WHERE t.category_id = ? +ORDER BY m.created_at DESC, t.id DESC`, categoryID).Scan(&out).Error + return +} + func (d *DkfDB) GetPublicForumThreadsSearch(userID UserID) (out []ForumThreadAug, err error) { err = d.db.Raw(`SELECT t.*, u.username as author, diff --git a/pkg/web/handlers/data.go b/pkg/web/handlers/data.go @@ -143,6 +143,7 @@ type forgotPasswordResetData struct { } type newsData struct { + News []database.ForumNews } type gistData struct { @@ -302,7 +303,8 @@ type deleteLinkMirrorData struct { } type editForumThreadData struct { - Thread database.ForumThread + Thread database.ForumThread + Categories []database.ForumCategory } type deleteForumThreadData struct { diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go @@ -1174,7 +1174,10 @@ func MemeHandler(c echo.Context) error { } func NewsHandler(c echo.Context) error { + db := c.Get("database").(*database.DkfDB) var data newsData + category, _ := db.GetForumCategoryBySlug("news") + data.News, _ = db.GetForumNews(category.ID) return c.Render(http.StatusOK, "news", data) } @@ -2167,6 +2170,7 @@ func ThreadEditHandler(c echo.Context) error { } var data editForumThreadData data.Thread = thread + data.Categories, _ = db.GetForumCategories() if c.Request().Method == http.MethodPost { thread.CategoryID = database.ForumCategoryID(utils.DoParseInt64(c.Request().PostFormValue("category_id"))) diff --git a/pkg/web/public/views/pages/news.gohtml b/pkg/web/public/views/pages/news.gohtml @@ -10,6 +10,21 @@ <div class="container"> + {{ range .Data.News }} + <div> + <h3>{{ .ForumThread.Name }}</h3> + <div class="mb-3"> + <time datetime="2021-08-23 00:00">{{ .ForumMessage.CreatedAt.Format "Jan 02, 2006" }}</time> | + <a {{ .User.GenerateChatStyle | attr }} href="/u/{{ .User.Username }}">{{ .User.Username }}</a> + {{- if .IsSigned -}} + <a href="/t/{{ .ForumThread.UUID }}/messages/{{ .ForumMessage.UUID }}/raw" class="ml-2" title="PGP signed" rel="noopener noreferrer" target="_blank">✅</a> + {{- end -}} + </div> + {{ .Escape $.DB | safe }} + </div> + <hr class="mt-5 mb-5" /> + {{ end }} + <div> <h3>dkforest I2P address</h3> <div class="mb-3"><time datetime="2021-08-23 00:00">Jan 20, 2023</time></div> diff --git a/pkg/web/public/views/pages/thread-edit.gohtml b/pkg/web/public/views/pages/thread-edit.gohtml @@ -9,9 +9,9 @@ <input type="hidden" name="csrf" value="{{ .CSRF }}" /> <div class="form-group"> <select name="category_id" class="form-control"> - <option value="1"{{ if eq .Data.Thread.CategoryID 1 }} selected{{ end }}>General</option> - <option value="2"{{ if eq .Data.Thread.CategoryID 2 }} selected{{ end }}>Random</option> - <option value="3"{{ if eq .Data.Thread.CategoryID 3 }} selected{{ end }}>Retarded Area</option> + {{ range .Data.Categories }} + <option value="{{ .ID }}"{{ if eq $.Data.Thread.CategoryID .ID }} selected{{ end }}>{{ .Name }}</option> + {{ end }} </select> </div> <div class="form-group">