[add] better log page, [add] admin users page, [add] admin nav
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2024-01-20 14:26:26 -05:00
parent a65750ae21
commit f0a2d2cf69
20 changed files with 265 additions and 77 deletions

View File

@@ -112,6 +112,7 @@ func (api *API) registerWebAppRoutes() {
api.Router.GET("/register", api.appGetRegister)
api.Router.GET("/settings", api.authWebAppMiddleware, api.appGetSettings)
api.Router.GET("/admin/logs", api.authWebAppMiddleware, api.authAdminWebAppMiddleware, api.appGetAdminLogs)
api.Router.GET("/admin/users", api.authWebAppMiddleware, api.authAdminWebAppMiddleware, api.appGetAdminUsers)
api.Router.GET("/admin", api.authWebAppMiddleware, api.authAdminWebAppMiddleware, api.appGetAdmin)
api.Router.POST("/admin", api.authWebAppMiddleware, api.authAdminWebAppMiddleware, api.appPerformAdminAction)
api.Router.POST("/login", api.appAuthFormLogin)
@@ -184,6 +185,7 @@ func (api *API) generateTemplates() *multitemplate.Renderer {
"GetUTCOffsets": getUTCOffsets,
"NiceSeconds": niceSeconds,
"dict": dict,
"hasPrefix": strings.HasPrefix,
}
// Load Base

View File

@@ -2,6 +2,7 @@ package api
import (
"archive/zip"
"bufio"
"crypto/md5"
"database/sql"
"fmt"
@@ -132,8 +133,7 @@ func (api *API) appDocumentReader(c *gin.Context) {
}
func (api *API) appGetDocuments(c *gin.Context) {
templateVars := api.getBaseTemplateVars("documents", c)
auth := templateVars["Authorization"].(authData)
templateVars, auth := api.getBaseTemplateVars("documents", c)
qParams := bindQueryParams(c, 9)
var query *string
@@ -184,8 +184,7 @@ func (api *API) appGetDocuments(c *gin.Context) {
}
func (api *API) appGetDocument(c *gin.Context) {
templateVars := api.getBaseTemplateVars("document", c)
auth := templateVars["Authorization"].(authData)
templateVars, auth := api.getBaseTemplateVars("document", c)
var rDocID requestDocumentID
if err := c.ShouldBindUri(&rDocID); err != nil {
@@ -211,8 +210,7 @@ func (api *API) appGetDocument(c *gin.Context) {
}
func (api *API) appGetProgress(c *gin.Context) {
templateVars := api.getBaseTemplateVars("progress", c)
auth := templateVars["Authorization"].(authData)
templateVars, auth := api.getBaseTemplateVars("progress", c)
qParams := bindQueryParams(c, 15)
@@ -240,8 +238,7 @@ func (api *API) appGetProgress(c *gin.Context) {
}
func (api *API) appGetActivity(c *gin.Context) {
templateVars := api.getBaseTemplateVars("activity", c)
auth := templateVars["Authorization"].(authData)
templateVars, auth := api.getBaseTemplateVars("activity", c)
qParams := bindQueryParams(c, 15)
activityFilter := database.GetActivityParams{
@@ -268,8 +265,7 @@ func (api *API) appGetActivity(c *gin.Context) {
}
func (api *API) appGetHome(c *gin.Context) {
templateVars := api.getBaseTemplateVars("home", c)
auth := templateVars["Authorization"].(authData)
templateVars, auth := api.getBaseTemplateVars("home", c)
start := time.Now()
graphData, _ := api.DB.Queries.GetDailyReadStats(api.DB.Ctx, auth.UserName)
@@ -293,8 +289,7 @@ func (api *API) appGetHome(c *gin.Context) {
}
func (api *API) appGetSettings(c *gin.Context) {
templateVars := api.getBaseTemplateVars("settings", c)
auth := templateVars["Authorization"].(authData)
templateVars, auth := api.getBaseTemplateVars("settings", c)
user, err := api.DB.Queries.GetUser(api.DB.Ctx, auth.UserName)
if err != nil {
@@ -319,11 +314,13 @@ func (api *API) appGetSettings(c *gin.Context) {
}
func (api *API) appGetAdmin(c *gin.Context) {
templateVars := api.getBaseTemplateVars("admin", c)
templateVars, _ := api.getBaseTemplateVars("admin", c)
c.HTML(http.StatusOK, "page/admin", templateVars)
}
func (api *API) appGetAdminLogs(c *gin.Context) {
templateVars, _ := api.getBaseTemplateVars("admin-logs", c)
// Open Log File
logPath := path.Join(api.Config.ConfigPath, "logs/antholume.log")
logFile, err := os.Open(logPath)
@@ -333,18 +330,38 @@ func (api *API) appGetAdminLogs(c *gin.Context) {
}
defer logFile.Close()
// Write Log File
c.Stream(func(w io.Writer) bool {
_, err = io.Copy(w, logFile)
if err != nil {
return true
}
return false
})
// Log Lines
var logLines []string
scanner := bufio.NewScanner(logFile)
for scanner.Scan() {
logLines = append(logLines, scanner.Text())
}
templateVars["Data"] = logLines
c.HTML(http.StatusOK, "page/admin-logs", templateVars)
}
func (api *API) appGetAdminUsers(c *gin.Context) {
templateVars, _ := api.getBaseTemplateVars("admin-users", c)
users, err := api.DB.Queries.GetUsers(api.DB.Ctx)
if err != nil {
log.Error("[appGetAdminUsers] GetUsers DB Error:", err)
errorPage(c, http.StatusInternalServerError, fmt.Sprintf("GetUsers DB Error: %v", err))
return
}
templateVars["Data"] = users
c.HTML(http.StatusOK, "page/admin-users", templateVars)
}
// Tabs:
// - General (Import, Backup & Restore, Version (githash?), Stats?)
// - Users
// - Metadata
func (api *API) appPerformAdminAction(c *gin.Context) {
templateVars := api.getBaseTemplateVars("admin", c)
templateVars, _ := api.getBaseTemplateVars("admin", c)
var rAdminAction requestAdminAction
if err := c.ShouldBind(&rAdminAction); err != nil {
@@ -438,7 +455,7 @@ func (api *API) appPerformAdminAction(c *gin.Context) {
}
func (api *API) appGetSearch(c *gin.Context) {
templateVars := api.getBaseTemplateVars("search", c)
templateVars, _ := api.getBaseTemplateVars("search", c)
var sParams searchParams
c.BindQuery(&sParams)
@@ -462,7 +479,7 @@ func (api *API) appGetSearch(c *gin.Context) {
}
func (api *API) appGetLogin(c *gin.Context) {
templateVars := api.getBaseTemplateVars("login", c)
templateVars, _ := api.getBaseTemplateVars("login", c)
templateVars["RegistrationEnabled"] = api.Config.RegistrationEnabled
c.HTML(http.StatusOK, "page/login", templateVars)
}
@@ -473,7 +490,7 @@ func (api *API) appGetRegister(c *gin.Context) {
return
}
templateVars := api.getBaseTemplateVars("login", c)
templateVars, _ := api.getBaseTemplateVars("login", c)
templateVars["RegistrationEnabled"] = api.Config.RegistrationEnabled
templateVars["Register"] = true
c.HTML(http.StatusOK, "page/login", templateVars)
@@ -842,8 +859,7 @@ func (api *API) appIdentifyDocument(c *gin.Context) {
}
// Get Template Variables
templateVars := api.getBaseTemplateVars("document", c)
auth := templateVars["Authorization"].(authData)
templateVars, auth := api.getBaseTemplateVars("document", c)
// Get Metadata
metadataResults, err := metadata.SearchMetadata(metadata.GBOOK, metadata.MetadataInfo{
@@ -900,12 +916,15 @@ func (api *API) appSaveNewDocument(c *gin.Context) {
}
// Render Initial Template
templateVars := api.getBaseTemplateVars("search", c)
templateVars, _ := api.getBaseTemplateVars("search", c)
c.HTML(http.StatusOK, "page/search", templateVars)
// Create Streamer
stream := api.newStreamer(c)
defer stream.close()
stream := api.newStreamer(c, `
<div class="absolute top-0 left-0 w-full h-full z-50">
<div class="fixed top-0 left-0 bg-black opacity-50 w-screen h-screen"></div>
<div id="stream-main" class="relative max-h-[95%] -translate-x-2/4 top-1/2 left-1/2 w-5/6">`)
defer stream.close(`</div></div>`)
// Stream Helper Function
sendDownloadMessage := func(msg string, args ...map[string]any) {
@@ -1061,8 +1080,7 @@ func (api *API) appEditSettings(c *gin.Context) {
return
}
templateVars := api.getBaseTemplateVars("settings", c)
auth := templateVars["Authorization"].(authData)
templateVars, auth := api.getBaseTemplateVars("settings", c)
newUserSettings := database.UpdateUserParams{
UserID: auth.UserName,
@@ -1167,7 +1185,7 @@ func (api *API) getDocumentsWordCount(documents []database.GetDocumentsWithStats
return nil
}
func (api *API) getBaseTemplateVars(routeName string, c *gin.Context) gin.H {
func (api *API) getBaseTemplateVars(routeName string, c *gin.Context) (gin.H, authData) {
var auth authData
if data, _ := c.Get("Authorization"); data != nil {
auth = data.(authData)
@@ -1181,7 +1199,7 @@ func (api *API) getBaseTemplateVars(routeName string, c *gin.Context) gin.H {
"SearchEnabled": api.Config.SearchEnabled,
"RegistrationEnabled": api.Config.RegistrationEnabled,
},
}
}, auth
}
func bindQueryParams(c *gin.Context, defaultLimit int64) queryParams {

View File

@@ -141,7 +141,7 @@ func (api *API) authAdminWebAppMiddleware(c *gin.Context) {
}
func (api *API) appAuthFormLogin(c *gin.Context) {
templateVars := api.getBaseTemplateVars("login", c)
templateVars, _ := api.getBaseTemplateVars("login", c)
username := strings.TrimSpace(c.PostForm("username"))
rawPassword := strings.TrimSpace(c.PostForm("password"))
@@ -179,7 +179,7 @@ func (api *API) appAuthFormRegister(c *gin.Context) {
return
}
templateVars := api.getBaseTemplateVars("login", c)
templateVars, _ := api.getBaseTemplateVars("login", c)
templateVars["Register"] = true
username := strings.TrimSpace(c.PostForm("username"))

View File

@@ -17,7 +17,7 @@ type streamer struct {
completeCh chan struct{}
}
func (api *API) newStreamer(c *gin.Context) *streamer {
func (api *API) newStreamer(c *gin.Context, data string) *streamer {
stream := &streamer{
templates: api.Templates,
writer: c.Writer,
@@ -32,10 +32,7 @@ func (api *API) newStreamer(c *gin.Context) *streamer {
stream.writer.WriteHeader(http.StatusOK)
// Send Open Element Tags
stream.write(`
<div class="absolute top-0 left-0 w-full h-full z-50">
<div class="fixed top-0 left-0 bg-black opacity-50 w-screen h-screen"></div>
<div id="stream-main" class="relative max-h-[95%] -translate-x-2/4 top-1/2 left-1/2 w-5/6">`)
stream.write(data)
// Keep Alive
go func() {
@@ -70,9 +67,9 @@ func (stream *streamer) send(templateName string, templateVars gin.H) {
stream.write(buf.String())
}
func (stream *streamer) close() {
func (stream *streamer) close(data string) {
// Send Close Element Tags
stream.write(`</div></div>`)
stream.write(data)
// Close
close(stream.completeCh)