diff --git a/controllers/accessAuthController.go b/controllers/accessAuthController.go new file mode 100644 index 0000000..c7266eb --- /dev/null +++ b/controllers/accessAuthController.go @@ -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) +} diff --git a/main.go b/main.go index c1bb497..72214ba 100644 --- a/main.go +++ b/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) diff --git a/services/accessAuthService.go b/services/accessAuthService.go index 21939dd..e393b6d 100644 --- a/services/accessAuthService.go +++ b/services/accessAuthService.go @@ -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 +} diff --git a/views/accessauths.html b/views/accessauths.html new file mode 100644 index 0000000..345d5e9 --- /dev/null +++ b/views/accessauths.html @@ -0,0 +1,95 @@ +{{ template "header.html" . }} + + +
+