1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-08-17 10:56:24 -07:00

More postgres fixes (building, deletion)

This commit is contained in:
Eggbertx 2022-12-13 16:23:16 -08:00
parent 813b194f27
commit d1f7769cc7
7 changed files with 72 additions and 87 deletions

View file

@ -18,6 +18,10 @@ import (
func deletePosts(checkedPosts []int, writer http.ResponseWriter, request *http.Request) {
// Delete a post or thread
errEv := gcutil.LogError(nil).
Str("IP", gcutil.GetRealIP(request))
defer errEv.Discard()
password := request.FormValue("password")
passwordMD5 := gcutil.Md5Sum(password)
rank := manage.GetStaffRank(request)
@ -30,21 +34,18 @@ func deletePosts(checkedPosts []int, writer http.ResponseWriter, request *http.R
}
boardid, err := strconv.Atoi(request.FormValue("boardid"))
if err != nil {
gcutil.LogError(err).
Str("IP", gcutil.GetRealIP(request)).
errEv.Err(err).Caller().
Str("boardid", request.FormValue("boardid")).
Msg("Invalid form data (boardid)")
writer.WriteHeader(http.StatusBadRequest)
serverutil.ServeError(writer, err.Error(), wantsJSON, nil)
return
}
errEv.Int("boardid", boardid)
board, err := gcsql.GetBoardFromID(boardid)
if err != nil {
serverutil.ServeErrorPage(writer, "Invalid form data: "+err.Error())
gcutil.LogError(err).
Str("IP", gcutil.GetRealIP(request)).
Int("boardid", boardid).
errEv.Err(err).Caller().
Msg("Invalid form data (error populating data")
return
}
@ -63,14 +64,11 @@ func deletePosts(checkedPosts []int, writer http.ResponseWriter, request *http.R
})
return
} else if err != nil {
gcutil.Logger().Error().
Str("requestType", "deletePost").
Err(err).
Int("postid", post.ID).
Int("boardid", board.ID).
errEv.Err(err).Caller().
Int("postid", checkedPostID).
Msg("Error deleting post")
serverutil.ServeError(writer, "Error deleting post: "+err.Error(), wantsJSON, map[string]interface{}{
"postid": post.ID,
"postid": checkedPostID,
"boardid": board.ID,
})
return
@ -87,8 +85,7 @@ func deletePosts(checkedPosts []int, writer http.ResponseWriter, request *http.R
if fileOnly {
upload, err := post.GetUpload()
if err != nil {
gcutil.LogError(err).
Str("IP", gcutil.GetRealIP(request)).
errEv.Err(err).Caller().
Int("postid", post.ID).
Msg("Unable to get file upload info")
serverutil.ServeError(writer, "Error getting file uplaod info: "+err.Error(),
@ -99,8 +96,7 @@ func deletePosts(checkedPosts []int, writer http.ResponseWriter, request *http.R
if upload != nil && upload.Filename != "deleted" {
filePath := path.Join(documentRoot, board.Dir, "src", upload.Filename)
if err = os.Remove(filePath); err != nil {
gcutil.LogError(err).
Str("IP", gcutil.GetRealIP(request)).
errEv.Err(err).Caller().
Int("postid", post.ID).
Str("filename", upload.Filename).
Msg("Unable to delete file")
@ -111,8 +107,7 @@ func deletePosts(checkedPosts []int, writer http.ResponseWriter, request *http.R
// delete the file's thumbnail
thumbPath := path.Join(documentRoot, board.Dir, "thumb", upload.ThumbnailPath("thumb"))
if err = os.Remove(thumbPath); err != nil {
gcutil.LogError(err).
Str("IP", gcutil.GetRealIP(request)).
errEv.Err(err).Caller().
Int("postid", post.ID).
Str("thumbnail", upload.ThumbnailPath("thumb")).
Msg("Unable to delete thumbnail")
@ -124,8 +119,7 @@ func deletePosts(checkedPosts []int, writer http.ResponseWriter, request *http.R
if post.IsTopPost {
thumbPath := path.Join(documentRoot, board.Dir, "thumb", upload.ThumbnailPath("catalog"))
if err = os.Remove(thumbPath); err != nil {
gcutil.LogError(err).
Str("IP", gcutil.GetRealIP(request)).
errEv.Err(err).Caller().
Int("postid", post.ID).
Str("catalogThumb", upload.ThumbnailPath("catalog")).
Msg("Unable to delete catalog thumbnail")
@ -135,7 +129,7 @@ func deletePosts(checkedPosts []int, writer http.ResponseWriter, request *http.R
}
}
if err = post.UnlinkUploads(true); err != nil {
gcutil.LogError(err).
errEv.Err(err).Caller().
Str("requestType", "deleteFile").
Int("postid", post.ID).
Msg("Error unlinking post uploads")
@ -144,27 +138,21 @@ func deletePosts(checkedPosts []int, writer http.ResponseWriter, request *http.R
return
}
}
// _board, err := post.GetBoard()
// if err != nil {
// gcutil.LogError(err).
// Int("postid", post.ID).
// Str("IP", post.IP).
// Msg("Unable to get board info from post")
// serverutil.ServeError(writer, "Unable to get board info from post: "+err.Error(), wantsJSON, map[string]interface{}{
// "postid": post.ID,
// })
// }
// building.BuildBoardPages(_board)
building.BuildBoardPages(board)
if err = building.BuildBoardPages(board); err != nil {
errEv.Err(err).Caller().Send()
serverutil.ServeError(writer, "Unable to build board pages for /"+board.Dir+"/: "+err.Error(), wantsJSON, map[string]interface{}{
"boardDir": board.Dir,
})
return
}
var opPost *gcsql.Post
if post.IsTopPost {
opPost = post
} else {
if opPost, err = post.GetTopPost(); err != nil {
gcutil.LogError(err).
errEv.Err(err).Caller().
Int("postid", post.ID).
Str("IP", post.IP).
Msg("Unable to get thread information from post")
serverutil.ServeError(writer, "Unable to get thread info from post: "+err.Error(), wantsJSON, map[string]interface{}{
"postid": post.ID,
@ -173,9 +161,8 @@ func deletePosts(checkedPosts []int, writer http.ResponseWriter, request *http.R
}
}
if building.BuildThreadPages(opPost); err != nil {
gcutil.LogError(err).
errEv.Err(err).Caller().
Int("postid", post.ID).
Str("IP", post.IP).
Msg("Unable to build thread pages")
serverutil.ServeError(writer, "Unable to get board info from post: "+err.Error(), wantsJSON, map[string]interface{}{
"postid": post.ID,
@ -185,7 +172,7 @@ func deletePosts(checkedPosts []int, writer http.ResponseWriter, request *http.R
} else {
// delete the post
if err = post.Delete(); err != nil {
gcutil.LogError(err).
errEv.Err(err).Caller().
Str("requestType", "deletePost").
Int("postid", post.ID).
Msg("Error deleting post")

View file

@ -210,9 +210,6 @@ func BuildBoardPages(board *gcsql.Board) error {
"currentPage": catalog.currentPage,
"board": board,
"board_config": boardCfg,
"posts": []interface{}{
gcsql.Post{},
},
}, currentPageFile, "text/html"); err != nil {
errEv.Err(err).
Caller().Send()
@ -373,7 +370,6 @@ func buildBoard(board *gcsql.Board, force bool) error {
}
if err = BuildBoardPages(board); err != nil {
errEv.Err(err).Caller().Send()
return err
}
if err = BuildThreads(true, board.ID, 0); err != nil {

View file

@ -32,6 +32,7 @@ func getRecentPosts() ([]recentPost, error) {
siteCfg := config.GetSiteConfig()
query := `SELECT
DBPREFIXposts.id,
DBPREFIXposts.message,
DBPREFIXposts.message_raw,
(SELECT dir FROM DBPREFIXboards WHERE id = t.board_id) AS dir,
p.id AS top_post
@ -54,9 +55,9 @@ func getRecentPosts() ([]recentPost, error) {
for rows.Next() {
var post recentPost
var id, threadID, topPostID string
var id, topPostID string
var message, boardDir, filename string
err = rows.Scan(&id, &threadID, &message, &boardDir, &filename, &topPostID)
err = rows.Scan(&id, &message, &boardDir, &filename, &topPostID)
if err != nil {
return nil, err
}

View file

@ -84,13 +84,13 @@ func BuildCatalog(boardID int) error {
catalogFile, err := os.OpenFile(catalogPath, os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0777)
if err != nil {
errEv.Err(err).Caller().Send()
return fmt.Errorf("failed opening /%s/catalog.html: %s<br/>", board.Dir, err.Error())
return fmt.Errorf("failed opening /%s/catalog.html: %s", board.Dir, err.Error())
}
threadOPs, err := getBoardTopPosts(boardID)
if err != nil {
errEv.Err(err).Caller().Send()
return fmt.Errorf("failed building catalog for /%s/: %s<br/>", board.Dir, err.Error())
return fmt.Errorf("failed building catalog for /%s/: %s", board.Dir, err.Error())
}
boardConfig := config.GetBoardConfig(board.Dir)

View file

@ -3,7 +3,6 @@ package building
import (
"encoding/json"
"errors"
"fmt"
"html/template"
"os"
"path"
@ -35,8 +34,9 @@ const (
SELECT id, board_id FROM DBPREFIXthreads
) t ON t.id = DBPREFIXposts.thread_id
INNER JOIN (
SELECT id, thread_id FROM DBPREFIXposts where is_top_post
) p on p.thread_id = DBPREFIXposts.thread_id`
SELECT id, thread_id FROM DBPREFIXposts WHERE is_top_post
) p on p.thread_id = DBPREFIXposts.thread_id
WHERE is_deleted = FALSE `
)
func truncateString(msg string, limit int, ellipsis bool) string {
@ -163,10 +163,9 @@ func GetBuildablePostsByIP(ip string, limit int) ([]Post, error) {
}
func getBoardTopPosts(boardID int) ([]Post, error) {
const query = postQueryBase + " WHERE is_top_post AND t.board_id = ?"
const query = postQueryBase + " AND is_top_post AND t.board_id = ?"
rows, err := gcsql.QuerySQL(query, boardID)
if err != nil {
fmt.Println(query)
return nil, err
}
defer rows.Close()
@ -176,7 +175,7 @@ func getBoardTopPosts(boardID int) ([]Post, error) {
var threadID int
err = rows.Scan(
&post.ID, &threadID, &post.IP, &post.Name, &post.Tripcode, &post.Email, &post.Subject, &post.Timestamp,
&post.LastModified, &post.ParentID, &post.Message, &post.MessageRaw, &post.BoardID, &post.BoardDir,
&post.LastModified, &post.ParentID, &post.Message, &post.MessageRaw, &post.BoardDir,
&post.OriginalFilename, &post.Filename, &post.Checksum, &post.Filesize,
&post.ThumbnailWidth, &post.ThumbnailHeight, &post.UploadWidth, &post.UploadHeight,
)
@ -202,7 +201,7 @@ func getThreadPosts(thread *gcsql.Thread) ([]Post, error) {
var threadID int
err = rows.Scan(
&post.ID, &threadID, &post.IP, &post.Name, &post.Tripcode, &post.Email, &post.Subject, &post.Timestamp,
&post.LastModified, &post.ParentID, &post.Message, &post.MessageRaw, &post.BoardID, &post.BoardDir,
&post.LastModified, &post.ParentID, &post.Message, &post.MessageRaw, &post.BoardDir,
&post.OriginalFilename, &post.Filename, &post.Checksum, &post.Filesize,
&post.ThumbnailWidth, &post.ThumbnailHeight, &post.UploadWidth, &post.UploadHeight,
)

View file

@ -34,7 +34,7 @@ var (
func GetPostFromID(id int, onlyNotDeleted bool) (*Post, error) {
query := selectPostsBaseSQL + "WHERE id = ?"
if onlyNotDeleted {
query += " AND is_deleted = 0"
query += " AND is_deleted = FALSE"
}
post := new(Post)
err := QueryRowSQL(query, interfaceSlice(id), interfaceSlice(
@ -54,7 +54,7 @@ func GetPostFromID(id int, onlyNotDeleted bool) (*Post, error) {
func GetPostsFromIP(ip string, limit int, onlyNotDeleted bool) ([]Post, error) {
sql := selectPostsBaseSQL + ` WHERE DBPREFIXposts.ip = ?`
if onlyNotDeleted {
sql += " AND is_deleted = 0"
sql += " AND is_deleted = FALSE"
}
sql += " ORDER BY id DESC LIMIT ?"
@ -349,14 +349,20 @@ func (p *Post) Insert(bumpThread bool, boardID int, locked bool, stickied bool,
func (p *Post) WebPath() string {
webRoot := config.GetSystemCriticalConfig().WebRoot
var threadID, opID, boardID int
var opID int
var boardDir string
const query = `SELECT thread_id as threadid,
(SELECT id from DBPREFIXposts WHERE thread_id = threadid AND is_top_post = TRUE LIMIT 1) as op,
(SELECT board_id from DBPREFIXthreads WHERE id = threadid) AS boardid,
(SELECT dir FROM DBPREFIXboards WHERE id = boardid) AS dir
FROM DBPREFIXposts WHERE id = ?`
err := QueryRowSQL(query, interfaceSlice(p.ID), interfaceSlice(&threadID, &opID, &boardID, &boardDir))
const query = `SELECT
op.id,
(SELECT dir FROM DBPREFIXboards WHERE id = t.board_id) AS dir
FROM DBPREFIXposts
LEFT JOIN (
SELECT id, board_id FROM DBPREFIXthreads
) t ON t.id = DBPREFIXposts.thread_id
INNER JOIN (
SELECT id, thread_id FROM DBPREFIXposts WHERE is_top_post
) op on op.thread_id = DBPREFIXposts.thread_id
WHERE DBPREFIXposts.id = ?`
err := QueryRowSQL(query, interfaceSlice(p.ID), interfaceSlice(&opID, &boardDir))
if err != nil {
return webRoot
}

View file

@ -294,9 +294,7 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
data, err := io.ReadAll(file)
if err != nil {
gcutil.LogError(err).
Str("IP", post.IP).
Str("upload", "read").Send()
errEv.Err(err).Caller().Send()
serverutil.ServeErrorPage(writer, "Error while trying to read file: "+err.Error())
return
}
@ -324,9 +322,8 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
catalogThumbPath = path.Join(systemCritical.DocumentRoot, postBoard.Dir, "thumb", upload.ThumbnailPath("catalog"))
if err = os.WriteFile(filePath, data, 0644); err != nil {
gcutil.LogError(err).
errEv.Err(err).Caller().
Str("posting", "upload").
Str("IP", post.IP).
Str("filename", upload.Filename).
Str("originalFilename", upload.OriginalFilename).
Send()
@ -335,14 +332,12 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
}
if ext == "webm" || ext == "mp4" {
gcutil.LogInfo().
Str("post", "withVideo").
Str("IP", post.IP).
infoEv.Str("post", "withVideo").
Str("filename", handler.Filename).
Str("referer", request.Referer()).Send()
if post.IsTopPost {
if err := createVideoThumbnail(filePath, thumbPath, boardConfig.ThumbWidth); err != nil {
gcutil.LogError(err).
errEv.Err(err).Caller().
Str("filePath", filePath).
Str("thumbPath", thumbPath).
Int("thumbWidth", boardConfig.ThumbWidth).
@ -352,7 +347,7 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
}
} else {
if err := createVideoThumbnail(filePath, thumbPath, boardConfig.ThumbWidthReply); err != nil {
gcutil.LogError(err).
errEv.Err(err).Caller().
Str("filePath", filePath).
Str("thumbPath", thumbPath).
Int("thumbWidth", boardConfig.ThumbWidthReply).
@ -363,7 +358,7 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
}
if err := createVideoThumbnail(filePath, catalogThumbPath, boardConfig.ThumbWidthCatalog); err != nil {
gcutil.LogError(err).
errEv.Err(err).Caller().
Str("filePath", filePath).
Str("thumbPath", thumbPath).
Int("thumbWidth", boardConfig.ThumbWidthCatalog).
@ -463,9 +458,8 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
thumbnail = createImageThumbnail(img, postBoard.Dir, "op")
catalogThumbnail = createImageThumbnail(img, postBoard.Dir, "catalog")
if err = imaging.Save(catalogThumbnail, catalogThumbPath); err != nil {
gcutil.LogError(err).
errEv.Err(err).Caller().
Str("thumbPath", catalogThumbPath).
Str("IP", post.IP).
Msg("Couldn't generate catalog thumbnail")
serverutil.ServeErrorPage(writer, "Couldn't generate catalog thumbnail: "+err.Error())
return
@ -474,9 +468,8 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
thumbnail = createImageThumbnail(img, postBoard.Dir, "reply")
}
if err = imaging.Save(thumbnail, thumbPath); err != nil {
gcutil.LogError(err).
errEv.Err(err).Caller().
Str("thumbPath", thumbPath).
Str("IP", post.IP).
Msg("Couldn't generate catalog thumbnail")
serverutil.ServeErrorPage(writer, "Couldn't save thumbnail: "+err.Error())
return
@ -486,9 +479,8 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
upload.ThumbnailWidth = img.Bounds().Max.X
upload.ThumbnailHeight = img.Bounds().Max.Y
if err := syscall.Symlink(filePath, thumbPath); err != nil {
gcutil.LogError(err).
errEv.Err(err).Caller().
Str("thumbPath", thumbPath).
Str("IP", post.IP).
Msg("Couldn't generate catalog thumbnail")
serverutil.ServeErrorPage(writer, "Couldn't create thumbnail: "+err.Error())
return
@ -497,9 +489,8 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
// Generate catalog thumbnail
catalogThumbnail := createImageThumbnail(img, postBoard.Dir, "catalog")
if err = imaging.Save(catalogThumbnail, catalogThumbPath); err != nil {
gcutil.LogError(err).
errEv.Err(err).Caller().
Str("thumbPath", catalogThumbPath).
Str("IP", post.IP).
Msg("Couldn't generate catalog thumbnail")
serverutil.ServeErrorPage(writer, "Couldn't generate catalog thumbnail: "+err.Error())
return
@ -510,8 +501,7 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
}
if err = post.Insert(emailCommand != "sage", postBoard.ID, false, false, false, false); err != nil {
gcutil.LogError(err).
Str("IP", post.IP).
errEv.Err(err).Caller().
Str("sql", "postInsertion").
Msg("Unable to insert post")
if upload != nil {
@ -524,8 +514,7 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
}
if err = post.AttachFile(upload); err != nil {
gcutil.LogError(err).
Str("IP", post.IP).
errEv.Err(err).Caller().
Str("sql", "postInsertion").
Msg("Unable to attach upload to post")
os.Remove(filePath)
@ -536,8 +525,15 @@ func MakePost(writer http.ResponseWriter, request *http.Request) {
}
// rebuild the board page
building.BuildBoards(false, postBoard.ID)
building.BuildFrontPage()
if err = building.BuildBoards(false, postBoard.ID); err != nil {
serverutil.ServeErrorPage(writer, "Error building boards: "+err.Error())
return
}
if err = building.BuildFrontPage(); err != nil {
serverutil.ServeErrorPage(writer, "Error building front page: "+err.Error())
return
}
if emailCommand == "noko" {
if post.IsTopPost {