feat: WIP accessAuths crud view

This commit is contained in:
2026-06-29 17:47:56 +02:00
parent 1526cc2b49
commit e4acb6918a
4 changed files with 310 additions and 1 deletions

View File

@@ -0,0 +1,103 @@
package controllers
import (
"fmt"
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"git.dynamicdiscord.de/malobeo/portal/services"
)
type AccessAuthController struct{}
func (gc *AccessAuthController) AccessAuthView(c *gin.Context) {
accessAuths, err := services.AccessAuths.GetAll(c)
if err != nil {
c.HTML(http.StatusBadRequest, "accessauths.html", gin.H{"data": gin.H{"error": err}})
}
data := CreateSessionData(c, gin.H{
"accessAuths": accessAuths,
})
if err != nil {
c.HTML(http.StatusBadRequest, "accessauths.html", data)
}
c.HTML(http.StatusOK, "accessauths.html", data)
}
func (gc *AccessAuthController) AddAccessAuthHandler(c *gin.Context) {
name := c.PostForm("name")
if len(name) == 0 {
fmt.Println("Adding accessAuth with empty name is forbidden")
c.HTML(http.StatusBadRequest, "accessAuths.html", gin.H{"error": "Cant create accessAuth without name"})
return
}
_, err := services.AccessAuths.Create(c, name)
if err != nil {
fmt.Println(err)
c.HTML(http.StatusBadRequest, "accessauths.html", gin.H{"error": err})
return
}
gc.AccessAuthView(c)
}
func (gc *AccessAuthController) AccessAuthHandler(c *gin.Context) {
action := c.PostForm("action")
idStr := c.Param("id")
id, err := strconv.Atoi(idStr)
if err != nil {
fmt.Println(err)
c.HTML(http.StatusBadRequest, "accessauths.html", gin.H{"error": err})
return
}
if action == "createTimetable" {
weekdayStr := c.PostForm("weekday")
starttime := c.PostForm("starttime")
durationStr := c.PostForm("duration")
duration, err := strconv.Atoi(durationStr)
if err != nil {
fmt.Println(err)
c.HTML(http.StatusBadRequest, "accessauths.html", gin.H{"error": err})
return
}
weekday, err := strconv.Atoi(weekdayStr)
if err != nil {
fmt.Println(err)
c.HTML(http.StatusBadRequest, "accessauths.html", gin.H{"error": err})
return
}
_, err = services.AccessAuths.AddTimetable(c, int32(id), int32(weekday), starttime, int32(duration))
if err != nil {
fmt.Println(err)
c.HTML(http.StatusBadRequest, "accessauths.html", gin.H{"error": err})
return
}
}
if action == "delete" {
err := services.AccessAuths.Delete(c, int32(id))
if err != nil {
fmt.Println(err)
c.HTML(http.StatusBadRequest, "accessauths.html", gin.H{"error": err})
return
}
}
gc.AccessAuthView(c)
}

View File

@@ -60,6 +60,10 @@ func main() {
viewRoutes.POST("/groups", authValidator.RequireAdmin, groupController.AddGroupHandler)
viewRoutes.POST("/groups/:id", authValidator.RequireAdmin, groupController.GroupHandler)
viewRoutes.GET("/access", authValidator.RequireAdmin, accessAuthController.AccessAuthView)
viewRoutes.POST("/access", authValidator.RequireAdmin, accessAuthController.AddAccessAuthHandler)
viewRoutes.POST("/access/:id", authValidator.RequireAdmin, accessAuthController.AccessAuthHandler)
//write middleware that redirects to homescreen on register/login/reset for logged in users
//viewRoutes.GET("/login", userController.LoginView)
//viewRoutes.GET("/logout", userController.Logout)

View File

@@ -30,8 +30,23 @@ func (u *AccessAuthService) GetAll(c *gin.Context) ([]openapi.AccessAuthorizatio
return resp, nil
}
func (u *AccessAuthService) GetById(c *gin.Context, id int32) (*openapi.AccessAuthorizationResponse, error) {
apiClient := internal.GetApiClient(c)
resp, r, err := apiClient.AccessAuthAPI.GetOneAccessauthApiV1AaAaIdGet(context.Background(), id).Execute()
if err != nil {
fmt.Fprintf(os.Stderr, "Error when calling `AccessAuthAPI.GetOneAccessauthApiV1AaAaIdGet``: %v\n", err)
fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
return nil, err
}
fmt.Fprintf(os.Stdout, "Response from `AccessAuthAPI.GetOneAccessauthApiV1AaAaIdGet`: %v\n", resp)
return resp, nil
}
func (u *AccessAuthService) Create(c *gin.Context, name string) (*openapi.AccessAuthorizationResponse, error) {
accessAuthorizationCreate := *openapi.NewAccessAuthorizationCreate("Name_example", false, []openapi.TimetableCreate{})
accessAuthorizationCreate := *openapi.NewAccessAuthorizationCreate(name, false, []openapi.TimetableCreate{})
apiClient := internal.GetApiClient(c)
resp, r, err := apiClient.AccessAuthAPI.AddAccessauthApiV1AaPost(context.Background()).AccessAuthorizationCreate(accessAuthorizationCreate).Execute()
@@ -46,6 +61,20 @@ func (u *AccessAuthService) Create(c *gin.Context, name string) (*openapi.Access
return resp, nil
}
func (u *AccessAuthService) Delete(c *gin.Context, id int32) error {
apiClient := internal.GetApiClient(c)
resp, r, err := apiClient.AccessAuthAPI.DeleteAccessauthApiV1AaAaIdDelete(context.Background(), id).Execute()
if err != nil {
fmt.Fprintf(os.Stderr, "Error when calling `AccessAuthAPI.DeleteAccessauthApiV1AaAaIdDelete``: %v\n", err)
fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
return err
}
fmt.Fprintf(os.Stdout, "Response from `AccessAuthAPI.DeleteAccessauthApiV1AaAaIdDelete`: %v\n", resp)
return nil
}
func (u *AccessAuthService) SetActive(c *gin.Context, accessAuthId int32, isActive bool) (*openapi.AccessAuthorizationResponse, error) {
apiClient := internal.GetApiClient(c)
accessAuthorizationUpdate := *openapi.NewAccessAuthorizationUpdate()
@@ -95,3 +124,81 @@ func (u *AccessAuthService) SetTimetables(c *gin.Context, accessAuthId int32, ti
fmt.Fprintf(os.Stdout, "Response from `AccessAuthAPI.ChangeAccessauthAaAaIdPatch`: %v\n", resp)
return resp, nil
}
func (u *AccessAuthService) AddTimetable(c *gin.Context, accessAuthId int32, weekDay int32, startTime string, duration int32) (*openapi.AccessAuthorizationResponse, error) {
apiClient := internal.GetApiClient(c)
currentAuthorizationAuth, err := u.GetById(c, accessAuthId)
if err != nil {
fmt.Fprintf(os.Stderr, "Error when calling retreiving accessAuth by ID: %v\n", err)
return nil, err
}
newTimetables := []openapi.TimetableCreate{}
for _, timetable := range currentAuthorizationAuth.Timetables {
newTimetables = append(newTimetables, openapi.TimetableCreate{
Weekday: timetable.Weekday,
Starttime: timetable.Starttime,
Duration: timetable.Duration,
})
}
newTimetables = append(newTimetables, openapi.TimetableCreate{
Weekday: weekDay,
Starttime: startTime,
Duration: duration,
})
accessAuthorizationUpdate := *openapi.NewAccessAuthorizationUpdate()
accessAuthorizationUpdate.Timetables = newTimetables
resp, r, err := apiClient.AccessAuthAPI.ChangeAccessauthApiV1AaAaIdPatch(context.Background(), accessAuthId).AccessAuthorizationUpdate(accessAuthorizationUpdate).Execute()
if err != nil {
fmt.Fprintf(os.Stderr, "Error when calling `AccessAuthAPI.ChangeAccessauthAaAaIdPatch``: %v\n", err)
fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
return nil, err
}
fmt.Fprintf(os.Stdout, "Response from `AccessAuthAPI.ChangeAccessauthAaAaIdPatch`: %v\n", resp)
return resp, nil
}
func (u *AccessAuthService) RemoveTimetable(c *gin.Context, accessAuthId int32, timetableId int32) (*openapi.AccessAuthorizationResponse, error) {
apiClient := internal.GetApiClient(c)
currentAuthorizationAuth, err := u.GetById(c, accessAuthId)
if err != nil {
fmt.Fprintf(os.Stderr, "Error when calling retreiving accessAuth by ID: %v\n", err)
return nil, err
}
newTimetables := []openapi.TimetableCreate{}
for _, timetable := range currentAuthorizationAuth.Timetables {
if timetable.Id == *openapi.NewNullableInt32(&timetableId) {
continue
}
newTimetables = append(newTimetables, openapi.TimetableCreate{
Weekday: timetable.Weekday,
Starttime: timetable.Starttime,
Duration: timetable.Duration,
})
}
accessAuthorizationUpdate := *openapi.NewAccessAuthorizationUpdate()
accessAuthorizationUpdate.Timetables = newTimetables
resp, r, err := apiClient.AccessAuthAPI.ChangeAccessauthApiV1AaAaIdPatch(context.Background(), accessAuthId).AccessAuthorizationUpdate(accessAuthorizationUpdate).Execute()
if err != nil {
fmt.Fprintf(os.Stderr, "Error when calling `AccessAuthAPI.ChangeAccessauthAaAaIdPatch``: %v\n", err)
fmt.Fprintf(os.Stderr, "Full HTTP response: %v\n", r)
return nil, err
}
fmt.Fprintf(os.Stdout, "Response from `AccessAuthAPI.ChangeAccessauthAaAaIdPatch`: %v\n", resp)
return resp, nil
}

95
views/accessauths.html Normal file
View File

@@ -0,0 +1,95 @@
{{ 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 Access</h2>
</div>
<div class="mt-10 ">
<div class="w-full grid grid-cols-1 lg:grid-cols-1 xl:grid-cols-2 2xl:grid-cols-3 gap-4">
{{ range .data.accessAuths }}
<div class="mx-auto grid-cols-1 p-4 m-4 bg-gray-100 flex flex-wrap border rounded shadow-md">
<div class="gap-4">
<div class="font-bold text-center mb-4">
{{ .Name }}<br>
</div>
</div>
<div class="grid grid-cols-1 gap-4">
<form action="/access/{{ .Id }}" method="POST">
<div class="font-bold text-center mb-4">
Add new Timetable Entry
</div>
<div class="mx-auto p-4 m-4 bg-gray-100 flex flex-wrap border rounded shadow-md">
<div class="grid grid-cols-4 gap-4">
<div>
<label for="weekday" class="block text-sm/6 font-medium text-gray-900">Weekday</label>
<select name="weekday" id="weekday">
<option value="1">Monday</option>
<option value="2">Tuesday</option>
<option value="3">Wednesday</option>
<option value="4">Thursday</option>
<option value="5">Friday</option>
<option value="6">Saturday</option>
<option value="7">Sunday</option>
</select>
</div>
<div>
<label for="starttime">Select a time:</label>
<input type="time" id="starttime" name="appt">
</div>
<div>
<label for="duration" class="block text-sm/6 font-medium text-gray-900">Duration in Minutes</label>
<input type="number" id="duration" name="duration" value="60" min="0" step="15" class="w-full border border-gray-300 rounded-md p-2 focus:outline-none focus:ring focus:ring-blue-500">
</div>
<div>
<button type="submit" name="action" value="createTimetable" class="bg-green-500 hover:bg-red-700
text-white text-sm/6 font-bold py-2 px-4 rounded">Add</button>
</div>
</div>
</form>
</div>
{{ range .Timetables }}
<form action="/access/{{ .Id }}" method="POST">
{{ .Weekday }} - {{ .Starttime }} - {{ .Duration }} -
<div>
<button type="submit" name="action" value="createTimetable" class="bg-green-500 hover:bg-red-700
text-white text-sm/6 font-bold py-2 px-4 rounded">Add</button>
</div>
</div>
</form>
{{ end }}
<form action="/access/{{ .Id }}" method="POST">
</div>
<div class="grid grid-cols-2 mt-4 flex flex-wrap gap-2 w-full">
<button type="submit" name="delete" 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>
</form>
</div>
</div>
</div>
{{ end }}
</div>
<form action="/access" 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 accessAuth
</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" . }}