feat: WIP group handling

This commit is contained in:
2026-06-25 12:38:52 +02:00
parent a07940df20
commit 2c3afacf85
3 changed files with 109 additions and 3 deletions

View File

@@ -0,0 +1,51 @@
package controllers
import (
"fmt"
"net/http"
"github.com/gin-gonic/gin"
"git.dynamicdiscord.de/malobeo/portal/services"
)
type GroupController struct{}
func (gc *GroupController) GroupView(c *gin.Context) {
groups, err := services.Groups.GetAll(c)
if err != nil {
c.HTML(http.StatusBadRequest, "groups.html", gin.H{"data": gin.H{"error": err}})
}
data := CreateSessionData(c, gin.H{
"groups": groups,
})
if err != nil {
c.HTML(http.StatusBadRequest, "groups.html", data)
}
c.HTML(http.StatusOK, "groups.html", data)
}
func (gc *GroupController) AddGroupHandler(c *gin.Context) {
name := c.PostForm("name")
if len(name) == 0 {
fmt.Println("Adding group with empty name is forbidden")
c.HTML(http.StatusBadRequest, "groups.html", gin.H{"error": "Cant create group without name"})
return
}
err := services.Groups.Create(c, name)
if err != nil {
fmt.Println(err)
c.HTML(http.StatusBadRequest, "groups.html", gin.H{"error": err})
return
}
gc.GroupView(c)
}

11
main.go
View File

@@ -14,8 +14,9 @@ import (
)
var (
userController controllers.UserController = controllers.UserController{}
authValidator middlewares.AuthValidator = middlewares.AuthValidator{}
userController controllers.UserController = controllers.UserController{}
groupController controllers.GroupController = controllers.GroupController{}
authValidator middlewares.AuthValidator = middlewares.AuthValidator{}
)
func LoadEnvVariables() {
@@ -49,11 +50,15 @@ func main() {
server.Static("/static", os.Getenv("STATIC"))
server.LoadHTMLGlob(fmt.Sprintf("%s/*.html", os.Getenv("VIEWS")))
viewRoutes := server.Group("/", authValidator.OptionalAuth)
viewRoutes := server.Group("/")
{
viewRoutes.GET("/login", userController.LoginView)
viewRoutes.POST("/login", userController.LoginHandler)
viewRoutes.GET("/groups", authValidator.RequireAdmin, groupController.GroupView)
viewRoutes.POST("/groups", authValidator.RequireAdmin, groupController.AddGroupHandler)
//viewRoutes.POST("/groups/:id", authValidator.RequireAdmin, groupController.GroupHandler)
//write middleware that redirects to homescreen on register/login/reset for logged in users
//viewRoutes.GET("/login", userController.LoginView)
//viewRoutes.GET("/logout", userController.Logout)

50
views/groups.html Normal file
View File

@@ -0,0 +1,50 @@
{{ template "header.html" . }}
<div class="flex min-h-full flex-col justify-center px-6 py-12 lg:px-8">
<div class="sm:mx-auto sm:w-full sm:max-w-sm">
<img class="mx-auto h-10 w-auto" src="/static/img/logo-black.png" alt="Your Company">
<h2 class="mt-10 text-center text-2xl/9 font-bold tracking-tight text-gray-900">Edit Groups</h2>
</div>
<div class="mt-10 ">
<div class="w-full grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4 gap-4">
{{ range .data.groups }}
<form action="/groups/{{ .Id }}" method="POST">
<div class="max-w-md mx-auto p-4 m-4 bg-gray-100 flex flex-wrap border rounded shadow-md">
<div class="font-bold text-center mb-4">
{{ .Name }}
</div>
<div class="grid grid-cols-2 gap-4">
<div>
<label for="variant-value1" class="block text-sm/6 font-medium text-gray-900">Name</label>
<input type="text" id="name" name="name" value="{{ .Name }}" class="w-full border border-gray-300 rounded-md p-2 focus:outline-none focus:ring focus:ring-blue-500">
</div>
</div>
<div class="grid grid-cols-2 mt-4 flex flex-wrap gap-2 w-full">
<button type="submit" name="action" value="update" class="bg-blue-500 hover:bg-blue-700 text-white text-sm/6 font-bold py-2 px-4 rounded">Update</button>
<button type="submit" name="action" value="delete" class="bg-red-500 hover:bg-red-700 text-white text-sm/6 font-bold py-2 px-4 rounded">Delete</button>
</div>
</div>
</form>
{{ end }}
</div>
<form action="/groups" method="POST">
<div class="max-w-md mx-auto p-4 flex flex-wrap border rounded shadow-md">
<div class="font-bold text-center mb-4">
Create New Group
</div>
<div class="grid grid-cols-2 gap-4">
<div>
<label for="variant-value1" class="block text-sm/6 font-medium text-gray-900">Name</label>
<input type="text" id="name" name="name" placeholder="name" class="w-full border border-gray-300 rounded-md p-2 focus:outline-none focus:ring focus:ring-blue-500">
</div>
</div>
<div class="grid grid-cols-4 mt-4 flex flex-wrap gap-2 w-full">
<button type="submit" class="bg-green-500 hover:bg-green-700 text-white text-sm/6 font-bold py-2 px-4 rounded">Add</button>
</div>
</div>
</form>
</div>
{{ template "footer.html" . }}