mirror of
https://github.com/thomiceli/opengist.git
synced 2025-01-09 10:02:39 +00:00
238 lines
7 KiB
Go
238 lines
7 KiB
Go
package handler
|
|
|
|
import (
|
|
"github.com/thomiceli/opengist/internal/actions"
|
|
"github.com/thomiceli/opengist/internal/config"
|
|
"github.com/thomiceli/opengist/internal/db"
|
|
"github.com/thomiceli/opengist/internal/git"
|
|
"github.com/thomiceli/opengist/internal/web/context"
|
|
"runtime"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
func AdminIndex(ctx *context.OGContext) error {
|
|
ctx.SetData("htmlTitle", ctx.TrH("admin.admin_panel"))
|
|
ctx.SetData("adminHeaderPage", "index")
|
|
|
|
ctx.SetData("opengistVersion", config.OpengistVersion)
|
|
ctx.SetData("goVersion", runtime.Version())
|
|
gitVersion, err := git.GetGitVersion()
|
|
if err != nil {
|
|
return ctx.ErrorRes(500, "Cannot get git version", err)
|
|
}
|
|
ctx.SetData("gitVersion", gitVersion)
|
|
|
|
countUsers, err := db.CountAll(&db.User{})
|
|
if err != nil {
|
|
return ctx.ErrorRes(500, "Cannot count users", err)
|
|
}
|
|
ctx.SetData("countUsers", countUsers)
|
|
|
|
countGists, err := db.CountAll(&db.Gist{})
|
|
if err != nil {
|
|
return ctx.ErrorRes(500, "Cannot count gists", err)
|
|
}
|
|
ctx.SetData("countGists", countGists)
|
|
|
|
countKeys, err := db.CountAll(&db.SSHKey{})
|
|
if err != nil {
|
|
return ctx.ErrorRes(500, "Cannot count SSH keys", err)
|
|
}
|
|
ctx.SetData("countKeys", countKeys)
|
|
|
|
ctx.SetData("syncReposFromFS", actions.IsRunning(actions.SyncReposFromFS))
|
|
ctx.SetData("syncReposFromDB", actions.IsRunning(actions.SyncReposFromDB))
|
|
ctx.SetData("gitGcRepos", actions.IsRunning(actions.GitGcRepos))
|
|
ctx.SetData("syncGistPreviews", actions.IsRunning(actions.SyncGistPreviews))
|
|
ctx.SetData("resetHooks", actions.IsRunning(actions.ResetHooks))
|
|
ctx.SetData("indexGists", actions.IsRunning(actions.IndexGists))
|
|
return ctx.HTML_("admin_index.html")
|
|
}
|
|
|
|
func AdminUsers(ctx *context.OGContext) error {
|
|
ctx.SetData("htmlTitle", ctx.TrH("admin.users")+" - "+ctx.TrH("admin.admin_panel"))
|
|
ctx.SetData("adminHeaderPage", "users")
|
|
ctx.SetData("loadStartTime", time.Now())
|
|
|
|
pageInt := getPage(ctx)
|
|
|
|
var data []*db.User
|
|
var err error
|
|
if data, err = db.GetAllUsers(pageInt - 1); err != nil {
|
|
return ctx.ErrorRes(500, "Cannot get users", err)
|
|
}
|
|
|
|
if err = paginate(ctx, data, pageInt, 10, "data", "admin-panel/users", 1); err != nil {
|
|
return ctx.ErrorRes(404, ctx.Tr("error.page-not-found"), nil)
|
|
}
|
|
|
|
return ctx.HTML_("admin_users.html")
|
|
}
|
|
|
|
func AdminGists(ctx *context.OGContext) error {
|
|
ctx.SetData("htmlTitle", ctx.TrH("admin.gists")+" - "+ctx.TrH("admin.admin_panel"))
|
|
ctx.SetData("adminHeaderPage", "gists")
|
|
pageInt := getPage(ctx)
|
|
|
|
var data []*db.Gist
|
|
var err error
|
|
if data, err = db.GetAllGists(pageInt - 1); err != nil {
|
|
return ctx.ErrorRes(500, "Cannot get gists", err)
|
|
}
|
|
|
|
if err = paginate(ctx, data, pageInt, 10, "data", "admin-panel/gists", 1); err != nil {
|
|
return ctx.ErrorRes(404, ctx.Tr("error.page-not-found"), nil)
|
|
}
|
|
|
|
return ctx.HTML_("admin_gists.html")
|
|
}
|
|
|
|
func AdminUserDelete(ctx *context.OGContext) error {
|
|
userId, _ := strconv.ParseUint(ctx.Param("user"), 10, 64)
|
|
user, err := db.GetUserById(uint(userId))
|
|
if err != nil {
|
|
return ctx.ErrorRes(500, "Cannot retrieve user", err)
|
|
}
|
|
|
|
if err := user.Delete(); err != nil {
|
|
return ctx.ErrorRes(500, "Cannot delete this user", err)
|
|
}
|
|
|
|
ctx.AddFlash(ctx.Tr("flash.admin.user-deleted"), "success")
|
|
return ctx.RedirectTo("/admin-panel/users")
|
|
}
|
|
|
|
func AdminGistDelete(ctx *context.OGContext) error {
|
|
gist, err := db.GetGistByID(ctx.Param("gist"))
|
|
if err != nil {
|
|
return ctx.ErrorRes(500, "Cannot retrieve gist", err)
|
|
}
|
|
|
|
if err = gist.DeleteRepository(); err != nil {
|
|
return ctx.ErrorRes(500, "Cannot delete the repository", err)
|
|
}
|
|
|
|
if err = gist.Delete(); err != nil {
|
|
return ctx.ErrorRes(500, "Cannot delete this gist", err)
|
|
}
|
|
|
|
gist.RemoveFromIndex()
|
|
|
|
ctx.AddFlash(ctx.Tr("flash.admin.gist-deleted"), "success")
|
|
return ctx.RedirectTo("/admin-panel/gists")
|
|
}
|
|
|
|
func AdminSyncReposFromFS(ctx *context.OGContext) error {
|
|
ctx.AddFlash(ctx.Tr("flash.admin.sync-fs"), "success")
|
|
go actions.Run(actions.SyncReposFromFS)
|
|
return ctx.RedirectTo("/admin-panel")
|
|
}
|
|
|
|
func AdminSyncReposFromDB(ctx *context.OGContext) error {
|
|
ctx.AddFlash(ctx.Tr("flash.admin.sync-db"), "success")
|
|
go actions.Run(actions.SyncReposFromDB)
|
|
return ctx.RedirectTo("/admin-panel")
|
|
}
|
|
|
|
func AdminGcRepos(ctx *context.OGContext) error {
|
|
ctx.AddFlash(ctx.Tr("flash.admin.git-gc"), "success")
|
|
go actions.Run(actions.GitGcRepos)
|
|
return ctx.RedirectTo("/admin-panel")
|
|
}
|
|
|
|
func AdminSyncGistPreviews(ctx *context.OGContext) error {
|
|
ctx.AddFlash(ctx.Tr("flash.admin.sync-previews"), "success")
|
|
go actions.Run(actions.SyncGistPreviews)
|
|
return ctx.RedirectTo("/admin-panel")
|
|
}
|
|
|
|
func AdminResetHooks(ctx *context.OGContext) error {
|
|
ctx.AddFlash(ctx.Tr("flash.admin.reset-hooks"), "success")
|
|
go actions.Run(actions.ResetHooks)
|
|
return ctx.RedirectTo("/admin-panel")
|
|
}
|
|
|
|
func AdminIndexGists(ctx *context.OGContext) error {
|
|
ctx.AddFlash(ctx.Tr("flash.admin.index-gists"), "success")
|
|
go actions.Run(actions.IndexGists)
|
|
return ctx.RedirectTo("/admin-panel")
|
|
}
|
|
|
|
func AdminConfig(ctx *context.OGContext) error {
|
|
ctx.SetData("htmlTitle", ctx.TrH("admin.configuration")+" - "+ctx.TrH("admin.admin_panel"))
|
|
ctx.SetData("adminHeaderPage", "config")
|
|
|
|
ctx.SetData("dbtype", db.DatabaseInfo.Type.String())
|
|
ctx.SetData("dbname", db.DatabaseInfo.Database)
|
|
|
|
return ctx.HTML_("admin_config.html")
|
|
}
|
|
|
|
func AdminSetConfig(ctx *context.OGContext) error {
|
|
key := ctx.FormValue("key")
|
|
value := ctx.FormValue("value")
|
|
|
|
if err := db.UpdateSetting(key, value); err != nil {
|
|
return ctx.ErrorRes(500, "Cannot set setting", err)
|
|
}
|
|
|
|
return ctx.JSON(200, map[string]interface{}{
|
|
"success": true,
|
|
})
|
|
}
|
|
|
|
func AdminInvitations(ctx *context.OGContext) error {
|
|
ctx.SetData("htmlTitle", ctx.TrH("admin.invitations")+" - "+ctx.TrH("admin.admin_panel"))
|
|
ctx.SetData("adminHeaderPage", "invitations")
|
|
|
|
var invitations []*db.Invitation
|
|
var err error
|
|
if invitations, err = db.GetAllInvitations(); err != nil {
|
|
return ctx.ErrorRes(500, "Cannot get invites", err)
|
|
}
|
|
|
|
ctx.SetData("invitations", invitations)
|
|
return ctx.HTML_("admin_invitations.html")
|
|
}
|
|
|
|
func AdminInvitationsCreate(ctx *context.OGContext) error {
|
|
code := ctx.FormValue("code")
|
|
nbMax, err := strconv.ParseUint(ctx.FormValue("nbMax"), 10, 64)
|
|
if err != nil {
|
|
nbMax = 10
|
|
}
|
|
|
|
expiresAtUnix, err := strconv.ParseInt(ctx.FormValue("expiredAtUnix"), 10, 64)
|
|
if err != nil {
|
|
expiresAtUnix = time.Now().Unix() + 604800 // 1 week
|
|
}
|
|
|
|
invitation := &db.Invitation{
|
|
Code: code,
|
|
ExpiresAt: expiresAtUnix,
|
|
NbMax: uint(nbMax),
|
|
}
|
|
|
|
if err := invitation.Create(); err != nil {
|
|
return ctx.ErrorRes(500, "Cannot create invitation", err)
|
|
}
|
|
|
|
ctx.AddFlash(ctx.Tr("flash.admin.invitation-created"), "success")
|
|
return ctx.RedirectTo("/admin-panel/invitations")
|
|
}
|
|
|
|
func AdminInvitationsDelete(ctx *context.OGContext) error {
|
|
id, _ := strconv.ParseUint(ctx.Param("id"), 10, 64)
|
|
invitation, err := db.GetInvitationByID(uint(id))
|
|
if err != nil {
|
|
return ctx.ErrorRes(500, "Cannot retrieve invitation", err)
|
|
}
|
|
|
|
if err := invitation.Delete(); err != nil {
|
|
return ctx.ErrorRes(500, "Cannot delete this invitation", err)
|
|
}
|
|
|
|
ctx.AddFlash(ctx.Tr("flash.admin.invitation-deleted"), "success")
|
|
return ctx.RedirectTo("/admin-panel/invitations")
|
|
}
|