change templates
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 6s
Gitea Actions Demo / build-and-test (push) Failing after 2m49s

This commit is contained in:
Thomas Peetz
2026-10-25 04:05:11 +01:00
parent 05555a7750
commit 2889927416
15 changed files with 255 additions and 139 deletions
-1
View File
@@ -55,7 +55,6 @@ func main() {
handlers.NewComicsHandler(db), handlers.NewComicsHandler(db),
handlers.NewMediaHandler(db), handlers.NewMediaHandler(db),
handlers.NewTyscHandler(db), handlers.NewTyscHandler(db),
handlers.NewWebAppHandler(db, []byte(viper.GetString("api_secret"))),
) )
srv := &http.Server{ srv := &http.Server{
+4 -4
View File
@@ -1,13 +1,14 @@
package globals package globals
import ( import (
"fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
var ( var (
Secret = []byte("secret") Secret = []byte("secret")
Version = "0.4.0" Version = "unset"
Commit = "unset" Commit = "unset"
Date = "unset" Date = "unset"
) )
@@ -16,11 +17,10 @@ const UserKey = "user"
func GetDefaultValues(user interface{}, message string) gin.H { func GetDefaultValues(user interface{}, message string) gin.H {
values := gin.H{ values := gin.H{
"title": "Kontor MediaFiles", "title": "Kontor",
"version": Version, "version": fmt.Sprintf("%s %s", Version, Commit),
"message": message, "message": message,
"user": user, "user": user,
} }
return values return values
} }
+4 -7
View File
@@ -68,11 +68,8 @@ func (handler *ComicHandler) ListPage(c *gin.Context) {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return return
} }
c.HTML(http.StatusOK, "comics", gin.H{ data := globals.GetDefaultValues(user, "Comics...")
"title": "Kontor Comics", data["title"] = "Kontor Comics"
"version": "0.4.0", data["comics"] = comics
"message": "Comics...", c.HTML(http.StatusOK, "comics", data)
"comics": comics,
"user": user,
})
} }
+2 -7
View File
@@ -24,11 +24,6 @@ func Index(c *gin.Context) {
user := session.Get(globals.UserKey) user := session.Get(globals.UserKey)
logger := slog.Get(c) logger := slog.Get(c)
logger.Info("IndexGetHandler", globals.UserKey, user) logger.Info("IndexGetHandler", globals.UserKey, user)
c.HTML(http.StatusOK, "home", gin.H{ data := globals.GetDefaultValues(user, "This is an index page...")
"title": "Kontor Gin", c.HTML(http.StatusOK, "home", data)
"version": "0.4.0",
"message": "This is an index page...",
"user": user,
})
} }
+60 -7
View File
@@ -8,6 +8,7 @@ import (
"net/http" "net/http"
"github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions"
"github.com/gin-contrib/slog"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
) )
@@ -76,11 +77,63 @@ func (handler *MediaActorHandler) ListPage(c *gin.Context) {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return return
} }
c.HTML(http.StatusOK, "mediaactors", gin.H{ data := globals.GetDefaultValues(user, "MediaActors...")
"title": "Kontor MediaActors", data["actors"] = actors
"version": "0.4.0", c.HTML(http.StatusOK, "mediaactors", data)
"message": "MediaActors...", }
"actors": actors,
"user": user, func (handler *MediaActorHandler) EditPage(c *gin.Context) {
}) session := sessions.Default(c)
user := session.Get(globals.UserKey)
id := c.Param("id")
//logger := slog.Get(c)
actor, err := handler.Service.Get(c.Request.Context(), id)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
data := globals.GetDefaultValues(user, "MediaActors...")
data["actor"] = actor
c.HTML(http.StatusOK, "actor_detail", data)
}
func (handler *MediaActorHandler) UpdatePage(c *gin.Context) {
session := sessions.Default(c)
user := session.Get(globals.UserKey)
id := c.Param("id")
logger := slog.Get(c)
actor, err := handler.Service.Get(c.Request.Context(), id)
if err != nil {
logger.Info("MediaActorHandler#UpdatePage", "error", err.Error())
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
var form models.MediaActorForm
if err := c.ShouldBind(&form); err != nil {
logger.Info("MediaActorHandler#UpdatePage", "error", err.Error())
data := globals.GetDefaultValues(user, "MediaActors...")
data["actor"] = actor
data["Form"] = form
data["Errors"] = err.Error()
c.HTML(http.StatusBadRequest, "actor_detail", data)
return
}
logger.Info("MediaActorHandler#UpdatePage", "actor", actor)
//handler.Service.Update(c.Request.Context(), form.ConvertFormToMediaLofiDTO())
c.Redirect(http.StatusFound, "web/actors")
}
func (handler *MediaActorHandler) DeletePage(c *gin.Context) {
//session := sessions.Default(c)
//user := session.Get(globals.UserKey)
id := c.Param("id")
logger := slog.Get(c)
//actor, err := handler.Service.Get(c.Request.Context(), id)
// if err != nil {
// logger.Info("MediaActorHandler#DeletePage", "error", err.Error())
// c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
// return
// }
logger.Info("MediaActorHandler#DeletePage", "actor", id)
c.Redirect(http.StatusFound, "web/actors")
} }
+6 -14
View File
@@ -136,13 +136,9 @@ func (handler *MediaLoFiHandler) EditPage(c *gin.Context) {
return return
} }
logger.Info("MediaLoFiHandler#EditPage", "lofi", lofi) logger.Info("MediaLoFiHandler#EditPage", "lofi", lofi)
c.HTML(http.StatusOK, "lofi_detail", gin.H{ data := globals.GetDefaultValues(user, "MediaLofis...")
"title": "Kontor MediaFLofi", data["lofi"] = lofi
"version": "0.4.0", c.HTML(http.StatusOK, "lofi_detail", data)
"message": "MediaFiles...",
"lofi": lofi,
"user": user,
})
} }
func (handler *MediaLoFiHandler) ChangeReviewPage(c *gin.Context) { func (handler *MediaLoFiHandler) ChangeReviewPage(c *gin.Context) {
@@ -166,13 +162,9 @@ func (handler *MediaLoFiHandler) ChangeReviewPage(c *gin.Context) {
return return
} }
logger.Info("MediaLoFiHandler#ListPage", "lofis count", len(lofis)) logger.Info("MediaLoFiHandler#ListPage", "lofis count", len(lofis))
c.HTML(http.StatusOK, "lofi", gin.H{ data := globals.GetDefaultValues(user, "MediaLofis...")
"title": "Kontor MediaFiles", data["lofis"] = lofis
"version": "0.4.0", //c.HTML(http.StatusOK, "lofi", data)
"message": "MediaFiles...",
"lofis": lofis,
"user": user,
})
c.Redirect(http.StatusCreated, "/web/media-lofis") c.Redirect(http.StatusCreated, "/web/media-lofis")
} }
+4 -2
View File
@@ -37,13 +37,15 @@ func (handler *MediaVideoHandler) List(c *gin.Context) {
func (handler *MediaVideoHandler) ListPage(c *gin.Context) { func (handler *MediaVideoHandler) ListPage(c *gin.Context) {
session := sessions.Default(c) session := sessions.Default(c)
user := session.Get(globals.UserKey) user := session.Get(globals.UserKey)
logger := slog.Get(c)
videos, err := handler.Service.List(c.Request.Context()) videos, err := handler.Service.List(c.Request.Context())
if err != nil { if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return return
} }
data := globals.GetDefaultValues(user, "MediaFiles...") logger.Info("MediaLoFiHandler#ListPage", "videos count", len(videos))
data["title"] = "Kontor MediaFiles" data := globals.GetDefaultValues(user, "MediaVideos...")
data["title"] = "Kontor MediaVideos"
data["mediavideos"] = videos data["mediavideos"] = videos
c.HTML(http.StatusOK, "mediavideos", data) c.HTML(http.StatusOK, "mediavideos", data)
+16
View File
@@ -1,11 +1,13 @@
package handlers package handlers
import ( import (
"kontor-api-gin/internal/globals"
"kontor-api-gin/internal/models" "kontor-api-gin/internal/models"
"kontor-api-gin/internal/repository" "kontor-api-gin/internal/repository"
"kontor-api-gin/internal/service" "kontor-api-gin/internal/service"
"net/http" "net/http"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"gorm.io/gorm" "gorm.io/gorm"
) )
@@ -28,3 +30,17 @@ func (handler *PublisherHandler) List(c *gin.Context) {
dtos := models.ConvertPublishersToDtos(comics) dtos := models.ConvertPublishersToDtos(comics)
c.JSON(http.StatusOK, dtos) c.JSON(http.StatusOK, dtos)
} }
func (handler *PublisherHandler) ListPage(c *gin.Context) {
session := sessions.Default(c)
user := session.Get(globals.UserKey)
publishers, err := handler.Service.List(c.Request.Context())
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
data := globals.GetDefaultValues(user, "Publishers...")
data["title"] = "Kontor Comics"
data["publishers"] = publishers
c.HTML(http.StatusOK, "publishers", data)
}
-21
View File
@@ -1,21 +0,0 @@
package handlers
import (
"kontor-api-gin/internal/repository"
"kontor-api-gin/internal/service"
"gorm.io/gorm"
)
type WebAppHandler struct {
AuthHandler *AuthHandler
ComicHandler *ComicHandler
}
func NewWebAppHandler(db *gorm.DB, secret []byte) *WebAppHandler {
webapp := &WebAppHandler{
AuthHandler: &AuthHandler{Service: service.NewAuthService(repository.NewProfileRepository(db), secret)},
ComicHandler: &ComicHandler{Service: service.NewComicService(repository.NewComicRepository(db))},
}
return webapp
}
@@ -21,6 +21,11 @@ func (media_actor *MediaActor) TableName() string {
return "media_actor" return "media_actor"
} }
type MediaActorForm struct {
Name string `form:"name" binding:"required"`
Weblink string `form:"weblink" binding:"required"`
}
type MediaActorDTO struct { type MediaActorDTO struct {
ID string `json:"id" binding:"required"` ID string `json:"id" binding:"required"`
CreatedAt helpers.KontorTime `json:"created_date"` CreatedAt helpers.KontorTime `json:"created_date"`
+6 -5
View File
@@ -18,7 +18,7 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
func New(admin *handlers.AdminHandler, bookshelf *handlers.BookshelfHandler, comics *handlers.ComicsHandler, media *handlers.MediaHandler, tysc *handlers.TyscHandler, webApp *handlers.WebAppHandler) *gin.Engine { func New(admin *handlers.AdminHandler, bookshelf *handlers.BookshelfHandler, comics *handlers.ComicsHandler, media *handlers.MediaHandler, tysc *handlers.TyscHandler) *gin.Engine {
router := gin.New() router := gin.New()
router.Use(gin.Recovery()) router.Use(gin.Recovery())
router.Use(gin_slog.SetLogger( router.Use(gin_slog.SetLogger(
@@ -52,22 +52,23 @@ func New(admin *handlers.AdminHandler, bookshelf *handlers.BookshelfHandler, com
router.GET("/logout", admin.AuthHandler.LogoutPage) router.GET("/logout", admin.AuthHandler.LogoutPage)
comic := router.Group("/comics") comic := router.Group("/comics")
comic.GET("/comics", webApp.ComicHandler.ListPage) comic.GET("/comics", comics.ComicHandler.ListPage)
comic.GET("/publishers", comics.PublisherHandler.ListPage)
m := router.Group("/web") m := router.Group("/web")
m.Use(middleware.AuthRequired()) m.Use(middleware.AuthRequired())
m.GET("/actors", media.MediaActorHandler.ListPage) m.GET("/actors", media.MediaActorHandler.ListPage)
m.GET("/actors/:id", media.MediaActorHandler.EditPage)
m.GET("/actors/:id/edit", media.MediaActorHandler.EditPage)
m.POST("/actors/:id/edit", media.MediaActorHandler.UpdatePage)
m.GET("/articles", media.MediaFileHandler.ListPage) m.GET("/articles", media.MediaFileHandler.ListPage)
m.GET("/media-files", media.MediaFileHandler.ListPage) m.GET("/media-files", media.MediaFileHandler.ListPage)
m.GET("/files", media.MediaFileHandler.ListPage)
m.GET("/videos", media.MediaVideoHandler.ListPage)
m.GET("/media-videos", media.MediaVideoHandler.ListPage) m.GET("/media-videos", media.MediaVideoHandler.ListPage)
m.GET("/media-lofis", media.MediaLoFiHandler.ListPage) m.GET("/media-lofis", media.MediaLoFiHandler.ListPage)
m.GET("/media-lofis/:id/edit", media.MediaLoFiHandler.EditPage) m.GET("/media-lofis/:id/edit", media.MediaLoFiHandler.EditPage)
m.POST("/media-lofis/:id/edit", media.MediaLoFiHandler.UpdatePage) m.POST("/media-lofis/:id/edit", media.MediaLoFiHandler.UpdatePage)
m.GET("/media-lofis/:id/change-review", media.MediaLoFiHandler.ChangeReviewPage) m.GET("/media-lofis/:id/change-review", media.MediaLoFiHandler.ChangeReviewPage)
m.GET("/media-lofis/:id/delete", media.MediaLoFiHandler.DeletePage) m.GET("/media-lofis/:id/delete", media.MediaLoFiHandler.DeletePage)
m.GET("/lofis", media.MediaLoFiHandler.ListPage)
api := router.Group("/api") api := router.Group("/api")
api.POST("/login", admin.AuthHandler.Login) api.POST("/login", admin.AuthHandler.Login)
+7 -53
View File
@@ -18,81 +18,35 @@
</aside> </aside>
</div> </div>
</div> </div>
<div class="row">
<form class="form-inline" action="/web/media-lofis">
<input type="text" placeholder="Search" name="query" />
<label>
<input
type="checkbox"
name="review"
{{if
.isReview}}checked{{end}}
/>Review
</label>
<label>
<input
type="checkbox"
name="should_download"
{{if
.isDownload}}checked{{end}}
/>Download
</label>
<button type="submit">Search</button>
<div class="pill-nav">
<a href="/web/media-lofis/add">Add Lofi</a>
</div>
</form>
</div>
<div class="row">
{{ if .Errors }}
<div class="notification is-danger">{{ .Errors }}</div>
{{ end }}
</div>
<div class="row"> <div class="row">
{{ if .Errors }} {{ if .Errors }}
<div class="notification is-danger">{{ .Errors }}</div> <div class="notification is-danger">{{ .Errors }}</div>
{{ end }} {{ end }}
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-8">
<form action="/web/media-lofis/{{.lofi.ID}}/edit" method="POST"> <form action="/web/media-lofis/{{.lofi.ID}}/edit" method="POST">
<div class="form-group row"> <div class="form-group row">
<label for="inputWeblink" class="col-sm-2 -col-form-label" <label for="inputWeblink" class="col-sm-2 -col-form-label">URL</label>
>URL</label
>
<div class="col-sm-10"> <div class="col-sm-10">
<input <input type="text" class="form-control" id="inputWeblink" name="weblink" value="{{.lofi.WebLink}}"/>
type="text"
class="form-control"
id="inputWeblink"
name="weblink"
value="{{.lofi.WebLink}}"
/>
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label for="inputTitle" class="col-sm-2 -col-form-label" <label for="inputTitle" class="col-sm-2 -col-form-label">Title</label>
>Title</label
>
<div class="col-sm-10"> <div class="col-sm-10">
<input <input type="text" class="form-control" id="inputTitle" name="title" value="{{.lofi.Title}}"/>
type="text"
class="form-control"
id="inputTitle"
name="title"
value="{{.lofi.Title}}"
/>
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
<div class="col-sm-10"> <div class="col-sm-10">
<button class="btn btn-primary" type="submit">Update</button> <button class="btn btn-primary" type="submit">Update</button>
<button class="btn" type="button" onclick="/web/media-lofis"> <button class="btn" type="button" onclick="/web/media-lofis">Cancel</button>
Cancel
</button>
</div> </div>
</div> </div>
</form> </form>
</div> </div>
</div>
</main> </main>
{{ template "footer" . }} {{ template "footer" . }}
</body> </body>
@@ -0,0 +1,54 @@
{{ define "actor_detail" }}
<!doctype html>
<html lang="de">
{{ template "head" . }}
<body>
{{ template "navbar" . }}
<main>
<div class="row">
<div class="col-md-8">
<h1>Media Actor</h1>
<p>Hier steht der wesentliche Inhalt der Seite.</p>
</div>
<div class="col-md-4">
<aside class="bg-light p-3">
<h3>Seitenbereich</h3>
<p>Optionale Sidebar oder Zusatzinformationen.</p>
</aside>
</div>
</div>
<div class="row">
{{ if .Errors }}
<div class="notification is-danger">{{ .Errors }}</div>
{{ end }}
</div>
<div class="row">
<div class="col-md-8">
<form action="/web/actors/{{.actor.ID}}/edit" method="POST">
<div class="form-group row">
<label for="inputName" class="col-sm-2 -col-form-label">Name</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="inputName" name="name" value="{{.actor.Name}}"/>
</div>
</div>
<div class="form-group row">
<label for="inputWeblink" class="col-sm-2 -col-form-label">Link</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="inputWeblink" name="weblink" value="{{.actor.WebLink}}"/>
</div>
</div>
<div class="form-group row">
<div class="col-sm-10">
<button class="btn btn-primary" type="submit">Update</button>
<button class="btn" type="button" onclick="/web/actors">Cancel</button>
</div>
</div>
</form>
</div>
</div>
</main>
{{ template "footer" . }}
</body>
</html>
{{ end }}
+30 -3
View File
@@ -5,10 +5,37 @@
<body> <body>
{{ template "navbar" . }} {{ template "navbar" . }}
<div> <main>
<h1>{{ .message }}</h1> <div class="row">
<div class="col-md-8">
<h1>Media Actors</h1>
<p>Hier steht der wesentliche Inhalt der Seite.</p>
</div> </div>
{{ template "footer" . }} <div class="col-md-4">
<aside class="bg-light p-3">
<h3>Seitenbereich</h3>
<p>Optionale Sidebar oder Zusatzinformationen.</p>
</aside>
</div>
</div>
<div class="row">
<form class="form-inline" action="/web/actors">
<input type="text" placeholder="Search" name="query">
<button type="submit">Search</button>
<div class="pill-nav"><a href="/web/actors/add">Add Lofi</a></div>
</form>
</div>
<div class="row">
{{ range .actors }}
<div class="card shadow p-3 mb-2 bg-body rounded" style="width: 18rem;">
<div class="card-body">
<h5 class="card-title">{{.Name}}</h5>
<a href="/web/actors/{{.ID}}" class="btn btn-primary">Read more</a>
</div>
</div>
{{ end }}
</div>
</main>
</body> </body>
</html> </html>
{{ end }} {{ end }}
@@ -0,0 +1,42 @@
{{ define "publishers" }}
<!doctype html>
<html lang="de">
{{ template "head" . }}
<body>
{{ template "navbar" . }}
<main>
<div class="row">
<div class="col-md-8">
<h1>Comic Publishers</h1>
<p>Hier steht der wesentliche Inhalt der Seite.</p>
</div>
<div class="col-md-4">
<aside class="bg-light p-3">
<h3>Seitenbereich</h3>
<p>Optionale Sidebar oder Zusatzinformationen.</p>
</aside>
</div>
</div>
<div class="row">
<form class="form-inline" action="/comic/publishers">
<input type="text" placeholder="Search" name="query">
<button type="submit">Search</button>
<div class="pill-nav"><a href="/comic/publishers/add">Add Lofi</a></div>
</form>
</div>
<div class="row">
{{ range .publishers }}
<div class="card shadow p-3 mb-2 bg-body rounded" style="width: 18rem;">
<div class="card-body">
<h5 class="card-title">{{.Name}}</h5>
<a href="/comic/publishers/{{.ID}}" class="btn btn-primary">Read more</a>
</div>
</div>
{{ end }}
</div>
</main>
{{ template "footer" . }}
</body>
</html>
{{ end }}