feat: WIP accessAuths crud view
This commit is contained in:
103
controllers/accessAuthController.go
Normal file
103
controllers/accessAuthController.go
Normal 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)
|
||||
}
|
||||
4
main.go
4
main.go
@@ -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)
|
||||
|
||||
@@ -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
95
views/accessauths.html
Normal 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" . }}
|
||||
|
||||
Reference in New Issue
Block a user