Add clan-purge and player-purge. Optimized performance with template-init.
This commit is contained in:
3
.idea/inspectionProfiles/Project_Default.xml
generated
3
.idea/inspectionProfiles/Project_Default.xml
generated
@@ -4,13 +4,14 @@
|
|||||||
<inspection_tool class="HtmlUnknownAttribute" enabled="true" level="WARNING" enabled_by_default="true">
|
<inspection_tool class="HtmlUnknownAttribute" enabled="true" level="WARNING" enabled_by_default="true">
|
||||||
<option name="myValues">
|
<option name="myValues">
|
||||||
<value>
|
<value>
|
||||||
<list size="6">
|
<list size="7">
|
||||||
<item index="0" class="java.lang.String" itemvalue="hx-get" />
|
<item index="0" class="java.lang.String" itemvalue="hx-get" />
|
||||||
<item index="1" class="java.lang.String" itemvalue="hx-target" />
|
<item index="1" class="java.lang.String" itemvalue="hx-target" />
|
||||||
<item index="2" class="java.lang.String" itemvalue="hx-vals" />
|
<item index="2" class="java.lang.String" itemvalue="hx-vals" />
|
||||||
<item index="3" class="java.lang.String" itemvalue="hx-post" />
|
<item index="3" class="java.lang.String" itemvalue="hx-post" />
|
||||||
<item index="4" class="java.lang.String" itemvalue="hx-trigger" />
|
<item index="4" class="java.lang.String" itemvalue="hx-trigger" />
|
||||||
<item index="5" class="java.lang.String" itemvalue="hx-swap" />
|
<item index="5" class="java.lang.String" itemvalue="hx-swap" />
|
||||||
|
<item index="6" class="java.lang.String" itemvalue="hx-delete" />
|
||||||
</list>
|
</list>
|
||||||
</value>
|
</value>
|
||||||
</option>
|
</option>
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
"gorm.io/gorm/clause"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
@@ -131,6 +132,20 @@ func DeleteClanByID(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeleteAllClans DELETE /admin/clan
|
||||||
|
func DeleteAllClans(c *gin.Context) {
|
||||||
|
var clans []models.Clan
|
||||||
|
if err := models.DB.
|
||||||
|
Session(&gorm.Session{AllowGlobalUpdate: true}).
|
||||||
|
Clauses(clause.Returning{}).
|
||||||
|
Delete(&clans).Error; err != nil {
|
||||||
|
c.String(http.StatusBadRequest, "Purge failed! Error: "+err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.String(http.StatusOK, "Purged "+utils.UintToString(uint(len(clans)))+" clans!")
|
||||||
|
}
|
||||||
|
|
||||||
func FindClanByName(out interface{}, name string) *gorm.DB {
|
func FindClanByName(out interface{}, name string) *gorm.DB {
|
||||||
return models.DB.Where("name = ?", name).First(out)
|
return models.DB.Where("name = ?", name).First(out)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
"gorm.io/gorm/clause"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
@@ -145,6 +146,20 @@ func DeletePlayerByID(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeleteAllPlayers DELETE /admin/player
|
||||||
|
func DeleteAllPlayers(c *gin.Context) {
|
||||||
|
var players []models.Player
|
||||||
|
if err := models.DB.
|
||||||
|
Session(&gorm.Session{AllowGlobalUpdate: true}).
|
||||||
|
Clauses(clause.Returning{}).
|
||||||
|
Delete(&players).Error; err != nil {
|
||||||
|
c.String(http.StatusBadRequest, "Purge failed! Error: "+err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
c.String(http.StatusOK, "Purged "+utils.UintToString(uint(len(players)))+" players!")
|
||||||
|
}
|
||||||
|
|
||||||
func FindPlayerByID(id uint) *models.Player {
|
func FindPlayerByID(id uint) *models.Player {
|
||||||
var res models.Player
|
var res models.Player
|
||||||
if err := models.DB.Where("id = ?", id).First(&res).Error; err != nil {
|
if err := models.DB.Where("id = ?", id).First(&res).Error; err != nil {
|
||||||
|
|||||||
48
main.go
48
main.go
@@ -6,11 +6,55 @@ import (
|
|||||||
"InfantrySkillCalculator/utils"
|
"InfantrySkillCalculator/utils"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
_ "github.com/gorilla/sessions"
|
_ "github.com/gorilla/sessions"
|
||||||
|
"html/template"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var mainPageTemplates *template.Template
|
||||||
|
var loginPageTemplates *template.Template
|
||||||
|
var registerPageTemplates *template.Template
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
var err error
|
||||||
|
mainPageTemplates, err = template.ParseFiles(
|
||||||
|
"./templates/index.html",
|
||||||
|
"./templates/components/home_clan_bar.html",
|
||||||
|
"./templates/components/opp_clan_bar.html",
|
||||||
|
"./templates/components/home_player_list.html",
|
||||||
|
"./templates/components/opp_player_list.html",
|
||||||
|
"./templates/components/bottom_controls.html",
|
||||||
|
"./templates/modals/delete_clan.html",
|
||||||
|
"./templates/modals/add_clan.html",
|
||||||
|
"./templates/modals/edit_clan.html",
|
||||||
|
"./templates/modals/add_player.html",
|
||||||
|
"./templates/modals/delete_player.html",
|
||||||
|
"./templates/modals/edit_player.html",
|
||||||
|
"./templates/modals/settings.html",
|
||||||
|
"./templates/components/header.html",
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
loginPageTemplates, err = template.ParseFiles(
|
||||||
|
"./templates/login.html",
|
||||||
|
"./templates/components/header.html",
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
registerPageTemplates, err = template.ParseFiles(
|
||||||
|
"./templates/register.html",
|
||||||
|
"./templates/components/header.html",
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
//gin.SetMode(gin.ReleaseMode) // uncomment upon release
|
//gin.SetMode(gin.ReleaseMode) // uncomment upon release
|
||||||
|
|
||||||
@@ -73,7 +117,9 @@ func main() {
|
|||||||
protected.GET("/settings", controllers.GetSettings)
|
protected.GET("/settings", controllers.GetSettings)
|
||||||
protected.PATCH("/settings", controllers.UpdateSettings)
|
protected.PATCH("/settings", controllers.UpdateSettings)
|
||||||
|
|
||||||
admin.GET("/clear_cache", controllers.DeleteAllCaches)
|
admin.DELETE("/clear_cache", controllers.DeleteAllCaches)
|
||||||
|
admin.DELETE("/purge_players", controllers.DeleteAllPlayers)
|
||||||
|
admin.DELETE("/purge_clans", controllers.DeleteAllClans)
|
||||||
admin.POST("/create_code", controllers.CreateCode)
|
admin.POST("/create_code", controllers.CreateCode)
|
||||||
|
|
||||||
log.Println("Running on 8000...")
|
log.Println("Running on 8000...")
|
||||||
|
|||||||
38
pages.go
38
pages.go
@@ -4,38 +4,16 @@ import (
|
|||||||
"InfantrySkillCalculator/controllers"
|
"InfantrySkillCalculator/controllers"
|
||||||
"InfantrySkillCalculator/utils"
|
"InfantrySkillCalculator/utils"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"html/template"
|
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
func mainPage(c *gin.Context) {
|
func mainPage(c *gin.Context) {
|
||||||
files := []string{
|
|
||||||
"./templates/index.html",
|
|
||||||
"./templates/components/home_clan_bar.html",
|
|
||||||
"./templates/components/opp_clan_bar.html",
|
|
||||||
"./templates/components/home_player_list.html",
|
|
||||||
"./templates/components/opp_player_list.html",
|
|
||||||
"./templates/components/bottom_controls.html",
|
|
||||||
"./templates/modals/delete_clan.html",
|
|
||||||
"./templates/modals/add_clan.html",
|
|
||||||
"./templates/modals/edit_clan.html",
|
|
||||||
"./templates/modals/add_player.html",
|
|
||||||
"./templates/modals/delete_player.html",
|
|
||||||
"./templates/modals/edit_player.html",
|
|
||||||
"./templates/modals/settings.html",
|
|
||||||
"./templates/components/header.html",
|
|
||||||
}
|
|
||||||
tmpl, err := template.ParseFiles(files...)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
data := map[string]interface{}{
|
data := map[string]interface{}{
|
||||||
"isAdmin": isUserAdmin(c),
|
"isAdmin": isUserAdmin(c),
|
||||||
}
|
}
|
||||||
|
|
||||||
err = tmpl.Execute(c.Writer, data)
|
err := mainPageTemplates.Execute(c.Writer, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -49,12 +27,7 @@ func loginPage(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
tmpl, err := template.ParseFiles([]string{"./templates/login.html", "./templates/components/header.html"}...)
|
err := loginPageTemplates.Execute(c.Writer, nil)
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = tmpl.Execute(c.Writer, nil)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -102,12 +75,7 @@ func registerPage(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
tmpl, err := template.ParseFiles([]string{"./templates/register.html", "./templates/components/header.html"}...)
|
err := registerPageTemplates.Execute(c.Writer, nil)
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = tmpl.Execute(c.Writer, nil)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,54 +17,40 @@
|
|||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<li><h6 class="dropdown-header">ACCOUNTS</h6></li>
|
<li><h6 class="dropdown-header">ACCOUNTS</h6></li>
|
||||||
<li>
|
<li>
|
||||||
<button class="dropdown-item fs-5 text-info-emphasis fst-italic"
|
<button class="dropdown-item fs-5 text-info-emphasis"
|
||||||
hx-post="/admin/create_code" hx-trigger="confirmed" hx-swap="none"
|
hx-post="/admin/create_code" hx-trigger="confirmed" hx-swap="none"
|
||||||
onclick="createCodeDialog(this)">
|
onclick="createCodeDialog(this)">
|
||||||
Create Code
|
Create Code
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<button class="dropdown-item fs-5 text-info-emphasis fst-italic"
|
|
||||||
hx-get="/admin/reset_password" hx-trigger="confirmed" hx-swap="none"
|
|
||||||
onclick="confirmAndTrigger(this)">
|
|
||||||
Reset Password
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<button class="dropdown-item fs-5 text-info-emphasis fst-italic"
|
|
||||||
hx-get="/admin/disable_account" hx-trigger="confirmed" hx-swap="none"
|
|
||||||
onclick="confirmAndTrigger(this)">
|
|
||||||
Disable Account
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
<li><hr class="dropdown-divider"></li>
|
<li><hr class="dropdown-divider"></li>
|
||||||
<li><h6 class="dropdown-header">TOOLS</h6></li>
|
<li><h6 class="dropdown-header">TOOLS</h6></li>
|
||||||
<li>
|
<li>
|
||||||
<button class="dropdown-item fs-5 text-warning-emphasis"
|
<button class="dropdown-item fs-5 text-warning-emphasis"
|
||||||
hx-get="/admin/clear_cache" hx-trigger="confirmed" hx-swap="none"
|
hx-delete="/admin/clear_cache" hx-trigger="confirmed" hx-swap="none"
|
||||||
onclick="confirmAndTrigger(this)">
|
onclick="confirmAndTrigger(this)">
|
||||||
Clear Cache
|
Clear Cache
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<button class="dropdown-item fs-5 text-warning-emphasis fst-italic"
|
<button class="dropdown-item fs-5 text-warning-emphasis visually-hidden"
|
||||||
hx-get="/admin/update_cache" hx-trigger="confirmed" hx-swap="none"
|
hx-get="/admin/update_cache" hx-trigger="confirmed" hx-swap="none"
|
||||||
onclick="confirmAndTrigger(this)">
|
onclick="alert('Not implemented yet')">
|
||||||
Update Cache
|
Update Cache
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
<li><hr class="dropdown-divider"></li>
|
<li><hr class="dropdown-divider"></li>
|
||||||
<li><h6 class="dropdown-header">DANGER ZONE</h6></li>
|
<li><h6 class="dropdown-header">DANGER ZONE</h6></li>
|
||||||
<li>
|
<li>
|
||||||
<button class="dropdown-item fs-5 text-danger-emphasis fst-italic"
|
<button class="dropdown-item fs-5 text-danger-emphasis"
|
||||||
hx-get="/admin/purge_players" hx-trigger="confirmed" hx-swap="none"
|
hx-delete="/admin/purge_players" hx-trigger="confirmed" hx-swap="none"
|
||||||
onclick="confirmAndTrigger(this)">
|
onclick="confirmAndTrigger(this)">
|
||||||
Purge Players
|
Purge Players
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<button class="dropdown-item fs-5 text-danger-emphasis fst-italic"
|
<button class="dropdown-item fs-5 text-danger-emphasis"
|
||||||
hx-get="/admin/purge_cache" hx-trigger="confirmed" hx-swap="none"
|
hx-delete="/admin/purge_clans" hx-trigger="confirmed" hx-swap="none"
|
||||||
onclick="confirmAndTrigger(this)">
|
onclick="confirmAndTrigger(this)">
|
||||||
Purge Clans
|
Purge Clans
|
||||||
</button>
|
</button>
|
||||||
@@ -95,6 +81,10 @@
|
|||||||
title: 'Action executed',
|
title: 'Action executed',
|
||||||
text: event.detail.xhr.response,
|
text: event.detail.xhr.response,
|
||||||
icon: event.detail.xhr.status === 200 ? 'success' : 'error'
|
icon: event.detail.xhr.status === 200 ? 'success' : 'error'
|
||||||
|
}).then(() => {
|
||||||
|
if (event.detail.requestConfig.verb === "delete") {
|
||||||
|
location.reload();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user