...

Source file src/codeberg.org/tslocum/sriracha/internal/server/server_status.go

Documentation: codeberg.org/tslocum/sriracha/internal/server

     1  package server
     2  
     3  import (
     4  	"bytes"
     5  	"html/template"
     6  	"net/http"
     7  	"strings"
     8  	"time"
     9  
    10  	"codeberg.org/tslocum/sriracha/internal/database"
    11  	. "codeberg.org/tslocum/sriracha/model"
    12  	. "codeberg.org/tslocum/sriracha/util"
    13  )
    14  
    15  func (s *Server) serveStatus(data *templateData, db *database.DB, w http.ResponseWriter, r *http.Request) {
    16  	if r.Method == http.MethodPost {
    17  		approve := FormInt(r, "approve")
    18  		if approve > 0 {
    19  			boardID := FormInt(r, "board")
    20  			if boardID > 0 {
    21  				b := db.BoardByID(boardID)
    22  				if b != nil {
    23  					post := db.PostByID(approve)
    24  					if post != nil {
    25  						rebuild := post.Moderated == ModeratedHidden
    26  
    27  						db.ModeratePost(post.ID, ModeratedApproved)
    28  						db.DeleteReports(post)
    29  
    30  						if rebuild {
    31  							db.BumpThread(post.Thread(), time.Now().Unix())
    32  							s.rebuildThread(db, post)
    33  							s.queueNotifications(db, post)
    34  						}
    35  					}
    36  				}
    37  			}
    38  		}
    39  
    40  		http.Redirect(w, r, "/sriracha/", http.StatusFound)
    41  		return
    42  	}
    43  
    44  	buf := &bytes.Buffer{}
    45  	data.Template = "manage_status"
    46  
    47  	// Allow super-administrators to verify remote address resolution.
    48  	if r.URL.Query().Has("remoteAddress") {
    49  		if data.forbidden(w, RoleSuperAdmin) {
    50  			return
    51  		}
    52  		data.Info = "Remote address: " + s.requestIP(r)
    53  	}
    54  
    55  	// Allow super-administrators to rebuild post nameblocks.
    56  	if r.URL.Query().Has("rebuildNameblocks") {
    57  		if data.forbidden(w, RoleSuperAdmin) {
    58  			return
    59  		}
    60  		for _, b := range db.AllBoards() {
    61  			for _, threadInfo := range db.AllThreads(b, false) {
    62  				for _, p := range db.AllPostsInThread(threadInfo[0], false) {
    63  					var capcode string
    64  					if strings.Contains(p.NameBlock, `<span style="color: red`) {
    65  						capcode = "Mod"
    66  					} else if strings.Contains(p.NameBlock, `<span style="color: purple`) {
    67  						capcode = "Admin"
    68  					}
    69  					p.SetNameBlock(p.Board.DefaultName, capcode, s.opt.Identifiers)
    70  
    71  					db.UpdatePostNameblock(p.ID, p.NameBlock)
    72  				}
    73  			}
    74  			s.rebuildBoard(db, b)
    75  		}
    76  		data.Info = "Rebuilt nameblocks"
    77  	}
    78  
    79  	reports := db.AllReports()
    80  	for i, report := range reports {
    81  		if i > 0 {
    82  			buf.WriteString("<hr>\n")
    83  		}
    84  
    85  		d := s.buildData(db, w, r)
    86  		d.Template = "manage_status_item"
    87  		d.Board = report.Post.Board
    88  		d.Post = report.Post
    89  		d.Threads = [][]*Post{{report.Post}}
    90  		d.Manage.Report = report
    91  		d.execute(buf)
    92  	}
    93  	data.Message = template.HTML(buf.String())
    94  
    95  	buf.Reset()
    96  	pending := db.PendingPosts()
    97  	for i, post := range pending {
    98  		if i > 0 {
    99  			buf.WriteString("<hr>\n")
   100  		}
   101  
   102  		d := s.buildData(db, w, r)
   103  		d.Template = "manage_status_item"
   104  		d.Board = post.Board
   105  		d.Post = post
   106  		d.Threads = [][]*Post{{post}}
   107  		d.execute(buf)
   108  	}
   109  	data.Message2 = template.HTML(buf.String())
   110  }
   111  

View as plain text