diff --git a/frontend/sass/global/_manage.scss b/frontend/sass/global/_manage.scss index 89046c93..059da1b2 100755 --- a/frontend/sass/global/_manage.scss +++ b/frontend/sass/global/_manage.scss @@ -48,6 +48,16 @@ table#recentposts, table.filterhitslist { } } +table#recentposts { + td.post-upload { + text-align: center; + * { + display: inline-block; + float: none; + } + } +} + input.config-text { -moz-box-sizing: border-box; box-sizing: border-box; diff --git a/html/css/global.css b/html/css/global.css index 17726898..a5a9fcdd 100644 --- a/html/css/global.css +++ b/html/css/global.css @@ -420,6 +420,14 @@ table#recentposts td, table.filterhitslist td { border: 1px solid; } +table#recentposts td.post-upload { + text-align: center; +} +table#recentposts td.post-upload * { + display: inline-block; + float: none; +} + input.config-text { -moz-box-sizing: border-box; box-sizing: border-box; diff --git a/pkg/building/building.go b/pkg/building/building.go index 03ed78b3..459b1e76 100644 --- a/pkg/building/building.go +++ b/pkg/building/building.go @@ -18,8 +18,8 @@ import ( "github.com/gochan-org/gochan/pkg/gcsql" "github.com/gochan-org/gochan/pkg/gctemplates" "github.com/gochan-org/gochan/pkg/gcutil" - "github.com/gochan-org/gochan/pkg/posting/uploads" "github.com/gochan-org/gochan/pkg/server/serverutil" + "github.com/rs/zerolog" ) var ( @@ -30,57 +30,108 @@ type frontPagePost struct { Board string URL string ThumbURL string - Filename string FileDeleted bool MessageSample string + PostUploadBase } -func getFrontPagePosts() ([]frontPagePost, error) { +func (fp *frontPagePost) HasEmbed() bool { + return strings.HasPrefix(fp.Filename, "embed:") +} + +func (p *frontPagePost) GetEmbedThumbURL(board string) error { + if !p.HasEmbed() { + return nil + } + filenameParts := strings.SplitN(p.Filename, ":", 2) + if len(filenameParts) != 2 { + return fmt.Errorf("invalid embed filename: %s", p.Filename) + } + + boardConfig := config.GetBoardConfig(board) + + _, thumbURLTmpl, err := boardConfig.GetEmbedTemplates(filenameParts[1]) + if err != nil { + return err + } + if thumbURLTmpl == nil { + return nil + } + + templateData := config.EmbedTemplateData{ + MediaID: p.OriginalFilename, + } + var buf bytes.Buffer + if err = thumbURLTmpl.Execute(&buf, templateData); err != nil { + return err + } + p.ThumbURL = buf.String() + + return nil +} + +func getFrontPagePosts(errEv *zerolog.Event) ([]frontPagePost, error) { siteCfg := config.GetSiteConfig() var query string if siteCfg.RecentPostsWithNoFile { // get recent posts, including those with no file - query = "SELECT id, message_raw, dir, filename, op_id FROM DBPREFIXv_front_page_posts" + query = "SELECT id, message_raw, dir, filename, original_filename, op_id FROM DBPREFIXv_front_page_posts" } else { - query = "SELECT id, message_raw, dir, filename, op_id FROM DBPREFIXv_front_page_posts_with_file" + query = "SELECT id, message_raw, dir, filename, original_filename, op_id FROM DBPREFIXv_front_page_posts_with_file" } query += " ORDER BY id DESC LIMIT " + strconv.Itoa(siteCfg.MaxRecentPosts) rows, cancel, err := gcsql.QueryTimeoutSQL(nil, query) defer cancel() if err != nil { + errEv.Err(err).Caller().Send() return nil, err } defer rows.Close() var recentPosts []frontPagePost + boardConfig := config.GetBoardConfig("") for rows.Next() { var post frontPagePost var id, topPostID string - var message, boardDir, filename string - err = rows.Scan(&id, &message, &boardDir, &filename, &topPostID) + var message, boardDir, filename, originalFilename string + err = rows.Scan(&id, &message, &boardDir, &filename, &originalFilename, &topPostID) if err != nil { + errEv.Err(err).Caller().Send() return nil, err } message = bbcodeTagRE.ReplaceAllString(message, "") if len(message) > 40 { message = message[:37] + "..." } - thumbnail, _ := uploads.GetThumbnailFilenames(filename) + post = frontPagePost{ Board: boardDir, URL: config.WebPath(boardDir, "res", topPostID+".html") + "#" + id, FileDeleted: filename == "deleted", MessageSample: message, - } - if thumbnail != "" && !strings.HasPrefix(thumbnail, "embed:") { - post.ThumbURL = config.WebPath(boardDir, "thumb", thumbnail) - post.Filename = filename + PostUploadBase: PostUploadBase{ + Filename: filename, + OriginalFilename: originalFilename, + ThumbnailWidth: boardConfig.ThumbWidthReply, + ThumbnailHeight: boardConfig.ThumbHeightReply, + }, } + if post.HasEmbed() { + if err = post.GetEmbedThumbURL(boardDir); err != nil { + errEv.Err(err).Caller().Send() + return nil, err + } + post.Filename = post.ThumbURL + } recentPosts = append(recentPosts, post) } - return recentPosts, rows.Close() + if err = rows.Close(); err != nil { + errEv.Err(err).Caller().Send() + return nil, err + } + return recentPosts, nil } // BuildFrontPage builds the front page using templates/front.html @@ -107,7 +158,7 @@ func BuildFrontPage() error { var recentPostsArr []frontPagePost siteCfg := config.GetSiteConfig() - recentPostsArr, err = getFrontPagePosts() + recentPostsArr, err = getFrontPagePosts(errEv) if err != nil { errEv.Err(err).Caller().Send() return fmt.Errorf("failed loading recent posts: %w", err) diff --git a/pkg/building/posts.go b/pkg/building/posts.go index 0c15ce58..bb71bb6e 100644 --- a/pkg/building/posts.go +++ b/pkg/building/posts.go @@ -26,26 +26,59 @@ func truncateString(msg string, limit int, ellipsis bool) string { return msg } +type PostUploadBase struct { + Filename string `json:"tim"` + OriginalFilename string `json:"filename"` + ThumbnailWidth int `json:"tn_w"` + ThumbnailHeight int `json:"tn_h"` + + uploadPath string +} + +func (p *PostUploadBase) HasEmbed() bool { + return strings.HasPrefix(p.Filename, "embed:") +} + +func (p *PostUploadBase) GetEmbedURL(boardDir string) string { + if !p.HasEmbed() { + return "" + } + filenameParts := strings.SplitN(p.Filename, ":", 2) + if len(filenameParts) != 2 { + p.uploadPath = "#invalid-embed-ID" + return p.uploadPath + } + linkTmpl, err := config.GetBoardConfig(boardDir).GetLinkTemplate(filenameParts[1]) + if err != nil { + p.uploadPath = "#invalid-template" + return p.uploadPath + } + var buf bytes.Buffer + if err = linkTmpl.Execute(&buf, &config.EmbedTemplateData{MediaID: p.OriginalFilename}); err != nil { + p.uploadPath = "#template-error" + return p.uploadPath + } + p.uploadPath = buf.String() + return p.uploadPath +} + // Post represents a post in a thread for building (hence why ParentID is used instead of ThreadID) type Post struct { gcsql.Post - ParentID int `json:"resto"` - BoardID int `json:"-"` - BoardDir string `json:"-"` - IP net.IP `json:"-"` - Filename string `json:"tim"` - OriginalFilename string `json:"filename"` - Checksum string `json:"md5"` - Extension string `json:"extension"` - Filesize int `json:"fsize"` - UploadWidth int `json:"w"` - UploadHeight int `json:"h"` - ThumbnailWidth int `json:"tn_w"` - ThumbnailHeight int `json:"tn_h"` - LastModified string `json:"last_modified"` - Country geoip.Country `json:"-"` - thread gcsql.Thread - uploadPath string + ParentID int `json:"resto"` + BoardID int `json:"-"` + BoardDir string `json:"-"` + IP net.IP `json:"-"` + PostUploadBase + Checksum string `json:"md5"` + Extension string `json:"extension"` + Filesize int `json:"fsize"` + UploadWidth int `json:"w"` + UploadHeight int `json:"h"` + LastModified string `json:"last_modified"` + Country geoip.Country `json:"-"` + thread gcsql.Thread + uploadPath string } // TitleText returns the text to be used for the title of the page @@ -79,10 +112,6 @@ func (p *Post) WebPath() string { return p.ThreadPath() + "#" + strconv.Itoa(p.ID) } -func (p *Post) HasEmbed() bool { - return strings.HasPrefix(p.Filename, "embed:") -} - func (p *Post) ThumbnailPath() string { if p.Filename == "" || p.HasEmbed() { return "" @@ -99,22 +128,7 @@ func (p *Post) UploadPath() string { return p.uploadPath } if p.HasEmbed() { - filenameParts := strings.SplitN(p.Filename, ":", 2) - if len(filenameParts) != 2 { - p.uploadPath = "#invalid-embed-ID" - return p.uploadPath - } - linkTmpl, err := config.GetBoardConfig(p.BoardDir).GetLinkTemplate(filenameParts[1]) - if err != nil { - p.uploadPath = "#invalid-template" - return p.uploadPath - } - var buf bytes.Buffer - if err = linkTmpl.Execute(&buf, &config.EmbedTemplateData{MediaID: p.OriginalFilename}); err != nil { - p.uploadPath = "#template-error" - return p.uploadPath - } - p.uploadPath = buf.String() + return p.GetEmbedURL(p.BoardDir) } else { p.uploadPath = config.WebPath(p.BoardDir, "src", p.Filename) } diff --git a/pkg/manage/actionsJanitorPerm.go b/pkg/manage/actionsJanitorPerm.go index 4f96613d..5d7f3d1c 100644 --- a/pkg/manage/actionsJanitorPerm.go +++ b/pkg/manage/actionsJanitorPerm.go @@ -80,7 +80,9 @@ func recentPostsCallback(_ http.ResponseWriter, request *http.Request, _ *gcsql. if limitStr != "" { limit, err = strconv.Atoi(limitStr) if err != nil { - errEv.Err(err).Caller().Send() + errEv.Err(err).Caller(). + Str("limit", limitStr). + Msg("Invalid limit value") return "", err } } @@ -89,7 +91,9 @@ func recentPostsCallback(_ http.ResponseWriter, request *http.Request, _ *gcsql. var boardid int if boardidStr != "" { if boardid, err = strconv.Atoi(boardidStr); err != nil { - errEv.Err(err).Caller().Send() + errEv.Err(err).Caller(). + Str("boardid", boardidStr). + Msg("Invalid boardid value") return "", err } } @@ -101,17 +105,17 @@ func recentPostsCallback(_ http.ResponseWriter, request *http.Request, _ *gcsql. if wantsJSON { return recentposts, nil } - manageRecentsBuffer := bytes.NewBufferString("") + var buf bytes.Buffer if err = serverutil.MinifyTemplate(gctemplates.ManageRecentPosts, map[string]any{ "recentposts": recentposts, "allBoards": gcsql.AllBoards, "boardid": boardid, "limit": limit, - }, manageRecentsBuffer, "text/html"); err != nil { + }, &buf, "text/html"); err != nil { errEv.Err(err).Caller().Send() return "", fmt.Errorf("failed executing ban management page template: %w", err) } - return manageRecentsBuffer.String(), nil + return buf.String(), nil } func announcementsCallback(_ http.ResponseWriter, _ *http.Request, _ *gcsql.Staff, _ bool, _ *zerolog.Event, _ *zerolog.Event) (output any, err error) { diff --git a/sql/reset_views.sql b/sql/reset_views.sql index eb37e5e7..2232a28c 100644 --- a/sql/reset_views.sql +++ b/sql/reset_views.sql @@ -67,16 +67,17 @@ WHERE p.is_deleted = 0 AND d.is_top_post = 0 and t.cyclical = 1; CREATE VIEW DBPREFIXv_front_page_posts AS SELECT DBPREFIXposts.id, DBPREFIXposts.message_raw, (SELECT dir FROM DBPREFIXboards WHERE id = t.board_id) as dir, -COALESCE(f.filename, '') as filename, op.id as op_id +COALESCE(f.filename, '') as filename, op.id as op_id, +COALESCE(f.original_filename, '') as original_filename FROM DBPREFIXposts LEFT JOIN DBPREFIXv_thread_board_ids t ON t.id = DBPREFIXposts.thread_id -LEFT JOIN (SELECT post_id, filename FROM DBPREFIXfiles) f on f.post_id = DBPREFIXposts.id +LEFT JOIN (SELECT post_id, filename, original_filename FROM DBPREFIXfiles) f on f.post_id = DBPREFIXposts.id INNER JOIN DBPREFIXv_top_post_thread_ids op ON op.thread_id = DBPREFIXposts.thread_id WHERE DBPREFIXposts.is_deleted = FALSE; CREATE VIEW DBPREFIXv_front_page_posts_with_file AS SELECT * FROM DBPREFIXv_front_page_posts -WHERE filename IS NOT NULL AND filename <> '' AND filename <> 'deleted' and filename not like 'embed:%'; +WHERE filename IS NOT NULL AND filename <> '' AND filename <> 'deleted'; CREATE VIEW DBPREFIXv_upload_info AS SELECT p1.id as id, (SELECT id FROM DBPREFIXposts p2 WHERE p2.is_top_post AND p1.thread_id = p2.thread_id LIMIT 1) AS op, diff --git a/templates/front.html b/templates/front.html index ad7b1b6e..7a7b4120 100644 --- a/templates/front.html +++ b/templates/front.html @@ -33,9 +33,11 @@
{{- range $i, $post := $.recentPosts}}
- {{if and (not $post.FileDeleted) (ne $post.Filename "") -}} - post thumbnail
- {{else}} + {{if $post.HasEmbed -}} + + {{- else if and (not $post.FileDeleted) (ne $post.Filename "") -}} + post thumbnail
+ {{- else -}} {{- end}}
/{{$post.Board}}/
diff --git a/templates/manage_recentposts.html b/templates/manage_recentposts.html index 0feebc88..15dcfacf 100644 --- a/templates/manage_recentposts.html +++ b/templates/manage_recentposts.html @@ -22,10 +22,13 @@ Board: /{{$post.BoardDir}}/ {{$post.Message}} - + {{- if eq $post.Filename "deleted" -}} -
File removed
+
File removed
+ {{- else if $post.HasEmbed -}} + {{- else if ne $post.Filename "" -}} - -{{end}}{{end}} + + {{- end -}} +{{end}}