243 lines
7.7 KiB
Go
243 lines
7.7 KiB
Go
package admin
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"log"
|
|
"net/http"
|
|
"path/filepath"
|
|
"strconv"
|
|
|
|
"gitlab.thpeetz.de/kontor/kontor-go/pkg/auth"
|
|
"gitlab.thpeetz.de/kontor/kontor-go/pkg/comics"
|
|
"gitlab.thpeetz.de/kontor/kontor-go/pkg/dao"
|
|
"gitlab.thpeetz.de/kontor/kontor-go/pkg/util"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/smallfish/simpleyaml"
|
|
)
|
|
|
|
const (
|
|
// KontorUserAdministrationTitle defines the text of the page title
|
|
KontorUserAdministrationTitle = "Kontor User Administration"
|
|
// DataUploadTemplate defines the name of the template file for the data upload
|
|
DataUploadTemplate = "kontor/data-upload.html"
|
|
)
|
|
|
|
// ShowLoginPage renders login page.
|
|
func ShowLoginPage(c *gin.Context) {
|
|
// Call the render function with the name of the template to render
|
|
util.Render(c, gin.H{"title": "Login"}, "login.html")
|
|
}
|
|
|
|
// PerformLogin reads data from login form and validates input.
|
|
func PerformLogin(c *gin.Context) {
|
|
// Obtain the POSTed username and password values
|
|
username := c.PostForm("username")
|
|
password := c.PostForm("password")
|
|
|
|
var userDao = UserDAO{Db: dao.KontorDb}
|
|
|
|
// Check if the username/password combination is valid
|
|
if userDao.IsUserValid(username, password) {
|
|
sessionInterface, _ := c.Get("session")
|
|
sessionID := sessionInterface.(string)
|
|
user, _ := userDao.FindByUsername(username)
|
|
sessionDao := auth.SessionDAO{Db: dao.KontorDb}
|
|
session, _ := sessionDao.FindByID(sessionID)
|
|
session.Username = username
|
|
session.IsAdmin = user.IsAdmin
|
|
sessionDao.Update(session)
|
|
util.Render(c, gin.H{"title": "Successful Login", "InfoMessage": "Login successfull"}, "kontor/index.html")
|
|
} else {
|
|
// If the username/password combination is invalid,
|
|
// show the error message on the login page
|
|
c.HTML(http.StatusBadRequest, "login.html", gin.H{
|
|
"ErrorTitle": "Login Failed",
|
|
"ErrorMessage": "Invalid credentials provided"})
|
|
}
|
|
}
|
|
|
|
// Logout invalidates session.
|
|
func Logout(c *gin.Context) {
|
|
sessionInterface, _ := c.Get("session")
|
|
sessionID := sessionInterface.(string)
|
|
c.SetCookie("session", sessionID, -1, "", "", false, true)
|
|
|
|
// Redirect to the home page
|
|
c.Redirect(http.StatusTemporaryRedirect, "/")
|
|
}
|
|
|
|
func showAdminIndex(c *gin.Context) {
|
|
// Call the render function with the name of the template to render
|
|
util.Render(c, gin.H{"title": "Kontor", "payload": nil}, "kontor/admin.html")
|
|
}
|
|
|
|
func showUserIndex(c *gin.Context) {
|
|
var dao = UserDAO{Db: dao.KontorDb}
|
|
if users, err := dao.FindAll(); err == nil && users != nil {
|
|
util.Render(c, gin.H{"title": KontorUserAdministrationTitle, "payload": users}, "kontor/users.html")
|
|
} else {
|
|
util.Render(c, gin.H{"title": KontorUserAdministrationTitle, "payload": users, "ErrorMessage": err}, "kontor/users.html")
|
|
}
|
|
}
|
|
|
|
func showUserDetails(c *gin.Context) {
|
|
userID := c.Param("userid")
|
|
var userDao = UserDAO{Db: dao.KontorDb}
|
|
if user, err := userDao.FindByID(userID); err == nil && &user != nil {
|
|
util.Render(c, gin.H{"title": KontorUserAdministrationTitle, "payload": user, "action": util.SaveAction}, "kontor/user-detail.html")
|
|
} else {
|
|
c.AbortWithError(http.StatusNotFound, err)
|
|
}
|
|
}
|
|
|
|
func showUserCreation(c *gin.Context) {
|
|
var user = User{}
|
|
util.Render(c, gin.H{"title": KontorUserAdministrationTitle, "payload": user, "action": util.AddAction}, "kontor/user-detail.html")
|
|
}
|
|
|
|
func validateUserCreation(c *gin.Context) {
|
|
// Obtain the POSTed username and password values
|
|
username := c.PostForm("username")
|
|
firstname := c.PostForm("firstname")
|
|
lastname := c.PostForm("lastname")
|
|
password := c.PostForm("password")
|
|
adminFormVar := c.PostForm("admin")
|
|
action := c.PostForm("action")
|
|
userid := c.PostForm("userid")
|
|
isAdmin, _ := strconv.ParseBool(adminFormVar)
|
|
|
|
var err error
|
|
var dao = UserDAO{Db: dao.KontorDb}
|
|
var user = User{}
|
|
|
|
switch action {
|
|
case util.AddAction:
|
|
user.Username = username
|
|
user.Firstname = firstname
|
|
user.Lastname = lastname
|
|
user.IsAdmin = isAdmin
|
|
user.Password, _ = HashPassword(password)
|
|
_, err = dao.Upsert(user)
|
|
case util.SaveAction:
|
|
user, _ = dao.FindByID(userid)
|
|
user.Username = username
|
|
user.Firstname = firstname
|
|
user.Lastname = lastname
|
|
user.IsAdmin = isAdmin
|
|
user.Password, _ = HashPassword(password)
|
|
err = dao.Update(user)
|
|
case util.DeleteAction:
|
|
user, _ = dao.FindByID(userid)
|
|
err = dao.Delete(user)
|
|
}
|
|
if err == nil {
|
|
c.Redirect(http.StatusTemporaryRedirect, "/admin/user")
|
|
} else {
|
|
c.HTML(http.StatusBadRequest, "kontor/create-user.html", gin.H{
|
|
"ErrorTitle": "User Creation Failed",
|
|
"ErrorMessage": err.Error()})
|
|
}
|
|
}
|
|
|
|
func showDataUpload(c *gin.Context) {
|
|
// Call the render function with the name of the template to render
|
|
//util.Render(c, gin.H{"title": "Kontor", "payload": nil}, "kontor/admin.html")
|
|
util.Render(c, gin.H{"title": "Kontor Data Upload", "payload": nil}, DataUploadTemplate)
|
|
}
|
|
|
|
func validateDataUpload(c *gin.Context) {
|
|
// Call the render function with the name of the template to render
|
|
//util.Render(c, gin.H{"title": "Kontor", "payload": nil}, "kontor/admin.html")
|
|
datafile, err := c.FormFile("datafile")
|
|
if err != nil {
|
|
c.HTML(http.StatusBadRequest, DataUploadTemplate, gin.H{
|
|
"ErrorTitle": "Data Upload Failed",
|
|
"ErrorMessage": err.Error()})
|
|
return
|
|
}
|
|
log.Printf("Data File: %v", datafile.Filename)
|
|
filename := filepath.Base(datafile.Filename)
|
|
if err := c.SaveUploadedFile(datafile, filename); err != nil {
|
|
c.HTML(http.StatusBadRequest, DataUploadTemplate, gin.H{
|
|
"ErrorTitle": "Data Upload Failed",
|
|
"ErrorMessage": err.Error()})
|
|
return
|
|
}
|
|
source, err := ioutil.ReadFile(filename)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
yaml, err := simpleyaml.NewYaml(source)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if yaml.IsArray() {
|
|
size, err := yaml.GetArraySize()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
log.Printf("Found %d entries.\n", size)
|
|
var publisherDao comics.PublisherDAO
|
|
publisherDao.Db = dao.KontorDb
|
|
var artistDao comics.ArtistDAO
|
|
artistDao.Db = dao.KontorDb
|
|
var comicDao comics.ComicDAO
|
|
comicDao.Db = dao.KontorDb
|
|
publisherMap := make(map[int]string)
|
|
for index := 0; index < size; index++ {
|
|
entry := yaml.GetIndex(index)
|
|
if entry.IsMap() {
|
|
model, err := entry.Get("model").String()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
pk, _ := entry.Get("pk").Int()
|
|
switch model {
|
|
case "comics.publisher":
|
|
name, err := entry.Get("fields").Get("name").String()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
log.Printf(" %v %v %v\n", pk, model, name)
|
|
publisherMap[pk] = name
|
|
publisher := comics.Publisher{}
|
|
publisher.Name = name
|
|
info, _ := publisherDao.Upsert(publisher)
|
|
log.Printf("Publisher records changed: %d", info.Updated)
|
|
case "comics.artist":
|
|
name, err := entry.Get("fields").Get("name").String()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
log.Printf(" %v %v %v\n", pk, model, name)
|
|
artist := comics.Artist{}
|
|
artist.Name = name
|
|
info, _ := artistDao.Upsert(artist)
|
|
log.Printf("Artist records changed: %d", info.Updated)
|
|
case "comics.comic":
|
|
title, err := entry.Get("fields").Get("title").String()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
publisherID, err := entry.Get("fields").Get("publisher").Int()
|
|
publisher, err := publisherDao.FindByName(publisherMap[publisherID])
|
|
completed, err := entry.Get("fields").Get("completed").Bool()
|
|
if err != nil {
|
|
log.Printf("Error occured: %v", err)
|
|
}
|
|
log.Printf(" %v %v %v %v\n", pk, model, title, completed)
|
|
comic := comics.Comic{}
|
|
comic.Title = title
|
|
comic.Completed = completed
|
|
comic.Publisher = publisher.ID
|
|
info, _ := comicDao.Upsert(comic)
|
|
log.Printf("Comic records changed: %d", info.Updated)
|
|
}
|
|
//fmt.Printf("Entry %d: %v\n", index, entry)
|
|
}
|
|
}
|
|
}
|
|
util.Render(c, gin.H{"title": "Kontor Data Upload", "payload": nil}, DataUploadTemplate)
|
|
}
|