1
0
Fork 0
mirror of https://github.com/Eggbertx/gochan.git synced 2025-09-06 11:46:24 -07:00

Add announcement functionality

This commit is contained in:
Eggbertx 2023-09-03 16:48:42 -07:00
parent d5e614b664
commit b80c8b3f76
5 changed files with 108 additions and 29 deletions

View file

@ -31,22 +31,6 @@ var funcMap = template.FuncMap{
return a - b
},
// Comparison functions (some copied from text/template for compatibility)
"ge": func(a int, b int) bool {
return a >= b
},
"gt": func(a int, b int) bool {
return a > b
},
"le": func(a int, b int) bool {
return a <= b
},
"lt": func(a int, b int) bool {
return a < b
},
"intEq": func(a, b int) bool {
return a == b
},
"isNil": func(i interface{}) bool {
return i == nil
},

View file

@ -52,10 +52,83 @@ func registerAdminPages() {
errEv.Err(err).Caller().Msg("Unable to get staff announcements")
return "", err
}
data := map[string]any{}
editIdStr := request.FormValue("edit")
var editID int
deleteIdStr := request.FormValue("delete")
var deleteID int
var announcement announcementWithName
if editIdStr != "" {
if editID, err = strconv.Atoi(editIdStr); err != nil {
errEv.Err(err).Str("editID", editIdStr).Send()
return "", err
}
data["editID"] = editID
for _, ann := range announcements {
if ann.ID == uint(editID) {
announcement = ann
break
}
}
if announcement.ID < 1 {
return "", fmt.Errorf("no announcement found with id %d", editID)
}
fmt.Println(announcement)
if request.PostFormValue("doedit") == "Submit" {
// announcement update submitted
announcement.Subject = request.PostFormValue("subject")
announcement.Message = request.PostFormValue("message")
if announcement.Message == "" {
errEv.Err(errMissingAnnouncementMessage).Caller().Send()
return "", errMissingAnnouncementMessage
}
updateSQL := `UPDATE DBPREFIXannouncements SET subject = ?, message = ?, timestamp = CURRENT_TIMESTAMP WHERE id = ?`
if _, err = gcsql.ExecSQL(updateSQL,
announcement.Subject,
announcement.Message,
announcement.ID); err != nil {
errEv.Err(err).Caller().
Str("subject", announcement.Subject).
Str("message", announcement.Message).
Uint("id", announcement.ID).
Msg("Unable to update announcement")
return "", errors.New("unable to update announcement")
}
fmt.Printf("Updated announcement #%d, message = %s\n", announcement.ID, announcement.Message)
}
} else if deleteIdStr != "" {
if deleteID, err = strconv.Atoi(deleteIdStr); err != nil {
errEv.Err(err).Str("deleteID", deleteIdStr).Send()
return "", err
}
deleteSQL := `DELETE FROM DBPREFIXannouncements WHERE id = ?`
if _, err = gcsql.ExecSQL(deleteSQL, deleteID); err != nil {
errEv.Err(err).Caller().
Int("deleteID", deleteID).
Msg("Unable to delete announcement")
return "", errors.New("unable to delete announcement")
}
} else if request.PostFormValue("newannouncement") == "Submit" {
insertSQL := `INSERT INTO DBPREFIXannouncements (staff_id, subject, message) VALUES(?, ?, ?)`
announcement.Subject = request.PostFormValue("subject")
announcement.Message = request.PostFormValue("message")
if _, err = gcsql.ExecSQL(insertSQL, staff.ID, announcement.Subject, announcement.Message); err != nil {
errEv.Err(err).Caller().
Str("subject", announcement.Subject).
Str("message", announcement.Message).
Msg("Unable to submit new announcement")
return "", errors.New("unable to submit announcement")
}
}
// update announcements array in data so the creation/edit/deletion shows up immediately
if data["announcements"], err = getAllAnnouncements(); err != nil {
errEv.Err(err).Caller().Msg("Unable to get staff announcements")
return "", err
}
data["announcement"] = announcement
pageBuffer := bytes.NewBufferString("")
err = serverutil.MinifyTemplate(gctemplates.ManageAnnouncements, map[string]any{
"announcements": announcements,
}, pageBuffer, "tex/thtml")
err = serverutil.MinifyTemplate(gctemplates.ManageAnnouncements, data,
pageBuffer, "tex/thtml")
return pageBuffer.String(), err
}},
Action{

View file

@ -129,7 +129,7 @@ func registerJanitorPages() {
Permissions: JanitorPerms,
JSONoutput: AlwaysJSON,
Callback: func(writer http.ResponseWriter, request *http.Request, staff *gcsql.Staff, wantsJSON bool, infoEv *zerolog.Event, errEv *zerolog.Event) (output interface{}, err error) {
// return an array of announcements and any errors
// return an array of announcements (with staff name instead of ID) and any errors
return getAllAnnouncements()
}},
Action{

View file

@ -1,11 +1,16 @@
package manage
import (
"errors"
"time"
"github.com/gochan-org/gochan/pkg/gcsql"
)
var (
errMissingAnnouncementMessage = errors.New("missing message field in announcement")
)
type announcementWithName struct {
ID uint `json:"no"`
Staff string `json:"name"`

View file

@ -1,6 +1,24 @@
<table>
<tr><th>Subject</th><th>Message</th><th>Staff</th><th>Timestamp</th></tr>
{{$pagePath := webPath "/manage/updateannouncements" -}}
{{$editing := (gt $.announcement.ID 0)}}
<style>
table#announcements, table#announcements th, table#announcements td {
border: 1px double;
}
</style>
<table id="announcements">
<tr>
<th style="width: 7%;"></th>
<th style="width: 18%;">Subject</th>
<th style="width: 50%;">Message</th>
<th style="width: 12.5%;">Staff</th>
<th style="width: 12.5%;">Timestamp</th>
</tr>
{{range $a, $announcement := $.announcements -}}<tr>
<td>
<a href="{{webPath $pagePath}}?edit={{$announcement.ID}}">Edit</a>
<a href="{{webPath $pagePath}}?delete={{$announcement.ID}}"
onclick="return confirm('Are you sure you want to delete this announcement?')">Delete</a>
</td>
<td>{{$announcement.Subject}}</td>
<td>{{$announcement.Message}}</td>
<td>{{$announcement.Staff}}</td>
@ -8,21 +26,20 @@
</tr>{{else}}<i>No announcements</i>{{end}}
</table>
<hr/>
<header>
<h1>Create new announcement</h1>
</header>
<form>
<header><h1>{{if $editing}}Edit announcement{{else}}Create new announcement{{end}}</h1></header>
<form method="POST" action="{{$pagePath}}">
{{if $editing}}<input type="hidden" name="edit" value="{{$.announcement.ID}}" />{{end}}
<table id="postbox-static">
<tr>
<th class="postblock">Subject</th>
<td>
<input type="text" name="subject" size="25" maxlength="100"/>
<input type="submit" value="Submit"/>
<input type="text" name="subject" size="25" maxlength="100" value="{{$.announcement.Subject}}"/>
<input type="submit" name="{{if $editing}}doedit{{else}}newannouncement{{end}}" value="Submit"/>
</td>
</tr>
<tr>
<th class="postblock">Message</th>
<td><textarea rows="5" cols="35" name="announcementmsg"></textarea></td>
<td><textarea rows="5" cols="35" name="message" required>{{$.announcement.Message}}</textarea></td>
</tr>
</table>
</form>