From 8206d16be0891a8d4ebd535749ef31423522fa2c Mon Sep 17 00:00:00 2001 From: nikurasu Date: Sun, 26 May 2024 01:14:46 +0200 Subject: [PATCH] feat(view): add view and backend for regulars tables --- .gitignore | 3 +- src/app/controller/attendies_controller.go | 12 ++-- src/app/controller/webhook_controller.go | 67 +++++++++++++++++---- src/app/routes/private_routes.go | 5 +- src/app/routes/public_routes.go | 1 + src/app/service/db_attendie.go | 8 ++- src/app/util/pretix.go | 64 ++++++++++++++++++-- src/app/views/index.html | 6 +- src/app/views/regularstable.html | 32 ++++++++++ src/app/views/{table.html => suitwalk.html} | 4 +- src/config/localization.go | 5 ++ src/entities/db_attendies.go | 9 +-- src/entities/db_event.go | 3 +- src/go.mod | 4 +- src/localization/active.de.json | 9 ++- src/localization/active.en.json | 6 +- 16 files changed, 198 insertions(+), 40 deletions(-) create mode 100644 src/app/views/regularstable.html rename src/app/views/{table.html => suitwalk.html} (96%) diff --git a/.gitignore b/.gitignore index a6dc356..b9617ef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ go.sum .env pretix-proxy -main.db \ No newline at end of file +main.db +src/db.db diff --git a/src/app/controller/attendies_controller.go b/src/app/controller/attendies_controller.go index b757b65..0f72318 100644 --- a/src/app/controller/attendies_controller.go +++ b/src/app/controller/attendies_controller.go @@ -95,11 +95,15 @@ func GetAttendiesByEventPublicTable(c *fiber.Ctx) error { "No": localizer.MustLocalize(&i18n.LocalizeConfig{ MessageID: "No", }), + "AfterParty": localizer.MustLocalize(&i18n.LocalizeConfig{ + MessageID: "AfterParty", + PluralCount: 1, + }), } return c.Render("app/views/index", fiber.Map{ - "Event Name": event.Name, - "Attendies": attendies, - "Locals": localizations, - "EventType": *(event).EventType, + "EventName": *(event).Name, + "Attendies": attendies, + "Locals": localizations, + "EventType": *(event).EventType, }) } diff --git a/src/app/controller/webhook_controller.go b/src/app/controller/webhook_controller.go index 856fcbd..d865694 100644 --- a/src/app/controller/webhook_controller.go +++ b/src/app/controller/webhook_controller.go @@ -14,17 +14,10 @@ func PostPretixRoleQuestion(c *fiber.Ctx) error { if err := c.BodyParser(data); err != nil { return c.Status(fiber.ErrBadRequest.Code).SendString(err.Error()) } - pretixOrders, err := util.GetPretixOrders(&data.Organizer, &data.Event) + pretixOrders, err := getAllPretixOrders(&data.Organizer, &data.Event) if err != nil { - return c.Status(500).SendString("Internal Server Error") - } - for link := pretixOrders.Next; link != nil; { - next_page, err := util.GetPretixOrdersByLink(link) - if err != nil { - return c.Status(500).SendString("Internal Server Error") - } - pretixOrders.Results = append(pretixOrders.Results, next_page.Results...) - link = next_page.Next + fmt.Println(err) + return c.SendStatus(fiber.StatusInternalServerError) } event, err := service.Get_db_event_by_event(data.Event) if err != nil { @@ -33,13 +26,16 @@ func PostPretixRoleQuestion(c *fiber.Ctx) error { attendies, err := util.GetAttendiesFromPretixJsonWithRoleQuestion(pretixOrders, &event) if err != nil { fmt.Println(err) + return c.SendStatus(fiber.StatusInternalServerError) } if err := service.DeleteAttendiesByEvent(event); err != nil { fmt.Println(err) + return c.SendStatus(fiber.StatusInternalServerError) } for _, attendie := range attendies { if err := service.CreateNewAttendie(attendie); err != nil { fmt.Print(err) + return c.SendStatus(fiber.StatusInternalServerError) } } return c.SendStatus(fiber.StatusOK) @@ -50,9 +46,7 @@ func PostPretixRoleProduct(c *fiber.Ctx) error { if err := c.BodyParser(data); err != nil { return c.Status(fiber.ErrBadRequest.Code).SendString(err.Error()) } - //TODO: Update attendies from pretix - pretixOrders, err := util.GetPretixOrders(&data.Organizer, &data.Event) - _ = pretixOrders + pretixOrders, err := getAllPretixOrders(&data.Organizer, &data.Event) if err != nil { return c.Status(500).SendString("Internal Server Error") } @@ -63,14 +57,61 @@ func PostPretixRoleProduct(c *fiber.Ctx) error { attendies, err := util.GetAttendiesFromPretixJsonWithRoleProduct(pretixOrders, &event) if err != nil { fmt.Println(err) + return c.SendStatus(fiber.StatusInternalServerError) } if err := service.DeleteAttendiesByEvent(event); err != nil { fmt.Println(err) + return c.SendStatus(fiber.StatusInternalServerError) } for _, attendie := range attendies { if err := service.CreateNewAttendie(attendie); err != nil { fmt.Print(err) + return c.SendStatus(fiber.StatusInternalServerError) } } return c.SendStatus(fiber.StatusOK) } + +func PostPretixRegularsTable(c *fiber.Ctx) error { + data := new(entities.Pretix_Webhook) + if err := c.BodyParser(data); err != nil { + return c.Status(fiber.ErrBadGateway.Code).SendString(err.Error()) + } + pretixOrders, err := getAllPretixOrders(&data.Organizer, &data.Event) + if err != nil { + return c.Status(500).SendString("Internal Server Error") + } + event, err := service.Get_db_event_by_event(data.Event) + if err != nil { + return c.Status(fiber.StatusNotFound).SendString("Event not found") + } + attendies, err := util.GetAttendiesFromPretixJsonWithSeperateSubProducts(pretixOrders, &event) + if err != nil { + fmt.Println(err) + return c.SendStatus(fiber.StatusInternalServerError) + } + if err := service.DeleteAttendiesByEvent(event); err != nil { + fmt.Println(err) + return c.SendStatus(fiber.StatusInternalServerError) + } + for _, attendie := range attendies { + if err := service.CreateNewAttendie(attendie); err != nil { + fmt.Print(err) + return c.SendStatus(fiber.StatusInternalServerError) + } + } + return c.SendStatus(fiber.StatusOK) +} + +func getAllPretixOrders(organizer, event *string) (*entities.Pretix_Event, error) { + pretixOrders, err := util.GetPretixOrders(organizer, event) + for link := pretixOrders.Next; link != nil; { + next_page, err := util.GetPretixOrdersByLink(link) + if err != nil { + return nil, err + } + pretixOrders.Results = append(pretixOrders.Results, next_page.Results...) + link = next_page.Next + } + return pretixOrders, err +} diff --git a/src/app/routes/private_routes.go b/src/app/routes/private_routes.go index 71aeb37..9312318 100644 --- a/src/app/routes/private_routes.go +++ b/src/app/routes/private_routes.go @@ -15,8 +15,9 @@ func PrivateRoutes(app *fiber.App) { event.Get("/:id", controller.ReturnEventById) event.Delete("/:id", controller.DeleteEventById) event.Put("/:id", controller.UpdateEventById) - event.Put("", controller.CreateEvent) + event.Post("", controller.CreateEvent) role := apiv1.Group("/role") + role.Use(config.JwtMiddleware) role.Get("", controller.ReturnAllRoles) role.Get("/:id", controller.ReturnRoleById) role.Delete("/:id", controller.DeleteRoleById) @@ -24,5 +25,5 @@ func PrivateRoutes(app *fiber.App) { role.Put("", controller.CreateRole) user := apiv1.Group("/user") user.Use(config.AuthMiddleware) - user.Put("", controller.CreateUser) + user.Post("", controller.CreateUser) } diff --git a/src/app/routes/public_routes.go b/src/app/routes/public_routes.go index 946e462..2f61868 100644 --- a/src/app/routes/public_routes.go +++ b/src/app/routes/public_routes.go @@ -14,6 +14,7 @@ func PublicRoutes(app *fiber.App) { webhooks := apiv1.Group("/webhooks") webhooks.Post("/pretix/role_question", controller.PostPretixRoleQuestion) webhooks.Post("/pretix/role_product", controller.PostPretixRoleProduct) + webhooks.Post("/pretix/subproduct", controller.PostPretixRegularsTable) apiv1.Post("/login", controller.LoginUser) apiv1.Get("/event", controller.ReturnAllEventsPublic) apiv1.Get("/ping", controller.Ping) diff --git a/src/app/service/db_attendie.go b/src/app/service/db_attendie.go index b18cc56..aabe665 100644 --- a/src/app/service/db_attendie.go +++ b/src/app/service/db_attendie.go @@ -2,6 +2,7 @@ package service import ( "errors" + "fmt" "gorm.io/gorm" "ulmer-furs.de/pretix-proxy/v2/config" @@ -46,7 +47,7 @@ func GetAttendiesByEvent(event entities.Db_Event) ([]entities.Db_Attendies, erro func GetAttendiesByEventPrivacy(event entities.Db_Event, privacy bool) (entities.AttendiesList, error) { var attendies []entities.Db_Attendies - result := config.Database.Model(&entities.Db_Attendies{}).Preload("Event").Preload("Role").Where("event_id = ?", event.ID).Where("privacy = ?", privacy).Find(&attendies) + result := config.Database.Model(&entities.Db_Attendies{}).Preload("Role").Where("event_id = ?", event.ID).Where("privacy = ?", privacy).Find(&attendies) if result.Error != nil { return attendies, result.Error } @@ -54,6 +55,11 @@ func GetAttendiesByEventPrivacy(event entities.Db_Event, privacy bool) (entities } func CreateNewAttendie(attendie entities.Db_Attendies) error { + if attendie.Privacy { + fmt.Println("Privacy activated") + } else { + fmt.Println("Noone needs privacy") + } result := config.Database.Create(&attendie) if result.Error != nil { return result.Error diff --git a/src/app/util/pretix.go b/src/app/util/pretix.go index c6a37fb..bb185a1 100644 --- a/src/app/util/pretix.go +++ b/src/app/util/pretix.go @@ -100,16 +100,16 @@ func GetAttendieListFromPretixJson(pretixEvent entities.Pretix_Event, event enti return attendies } -func GetAttendiesFromPretixJsonWithRoleQuestion(pretixEvent *entities.Pretix_Event, event *entities.Db_Event) ([]entities.Db_Attendies, error) { +func GetAttendiesFromPretixJsonWithRoleQuestion(pretixEvent *entities.Pretix_Event, event *entities.Db_Event) (entities.AttendiesList, error) { var attendies entities.AttendiesList for _, order := range pretixEvent.Results { if order.Status == "c" || order.Status == "e" { continue } var attendie entities.Db_Attendies - attendie.Event = *event + attendie.Event = event if event.ItemIdParticipation == nil { - return attendies, errors.New("no participation found") + return attendies, errors.New("event has no ItemIdParticipation") } indexParticipation := slices.IndexFunc(order.Positions, func(p entities.Pretix_Position) bool { return p.Item == *event.ItemIdParticipation }) if indexParticipation == -1 { @@ -160,16 +160,16 @@ func GetAttendiesFromPretixJsonWithRoleQuestion(pretixEvent *entities.Pretix_Eve return attendies, nil } -func GetAttendiesFromPretixJsonWithRoleProduct(pretixEvent *entities.Pretix_Event, event *entities.Db_Event) ([]entities.Db_Attendies, error) { +func GetAttendiesFromPretixJsonWithRoleProduct(pretixEvent *entities.Pretix_Event, event *entities.Db_Event) (entities.AttendiesList, error) { var attendies entities.AttendiesList for _, order := range pretixEvent.Results { if order.Status == "c" || order.Status == "e" { continue } var attendie entities.Db_Attendies - attendie.Event = *event + attendie.Event = event if event.ItemIdParticipation == nil { - return attendies, errors.New("no participation found") + return attendies, errors.New("event has no ItemIdParticipation") } indexParticipation := slices.IndexFunc(order.Positions, func(p entities.Pretix_Position) bool { return p.Item == *event.ItemIdParticipation }) if event.ItemIdRestaurant == nil { @@ -215,3 +215,55 @@ func GetAttendiesFromPretixJsonWithRoleProduct(pretixEvent *entities.Pretix_Even MarkWatingListAttendies(&attendies, (*event).SuiterPerSpotter, suiter, spotter, specialAnimal) return attendies, nil } + +func GetAttendiesFromPretixJsonWithSeperateSubProducts(pretixEvent *entities.Pretix_Event, event *entities.Db_Event) (entities.AttendiesList, error) { + var attendies entities.AttendiesList + for _, order := range pretixEvent.Results { + if order.Status == "c" || order.Status == "e" { + continue + } + var attendie entities.Db_Attendies + attendie.Event = event + if event.ItemIdParticipation == nil { + return attendies, errors.New("event has no ItemIdParticipation") + } + indexParticipation := slices.IndexFunc(order.Positions, func(p entities.Pretix_Position) bool { return p.Item == *event.ItemIdParticipation }) + if event.ItemIdRestaurant == nil { + attendie.AttendsRestaurant = false + } else { + indexRestaurant := slices.IndexFunc(order.Positions, func(p entities.Pretix_Position) bool { return p.Item == *event.ItemIdRestaurant }) + if indexRestaurant != -1 { + attendie.AttendsRestaurant = true + } else { + attendie.AttendsRestaurant = false + } + } + if event.ItemIdBar == nil { + attendie.AttendsBar = false + } else { + indexBar := slices.IndexFunc(order.Positions, func(p entities.Pretix_Position) bool { return p.Item == *event.ItemIdRestaurant }) + if indexBar != -1 { + attendie.AttendsBar = true + } else { + attendie.AttendsBar = false + } + } + indexName := slices.IndexFunc(order.Positions[indexParticipation].Answers, func(a entities.Pretix_Answer) bool { return a.QuestionsIdentififer == *event.QuestionIdName }) + indexPrivacy := slices.IndexFunc(order.Positions[indexParticipation].Answers, func(a entities.Pretix_Answer) bool { return a.QuestionsIdentififer == *event.QuestionIdPrivacy }) + + attendie.Nickname = order.Positions[indexParticipation].Answers[indexName].Answer + var err error + attendie.Privacy, err = strconv.ParseBool(order.Positions[indexParticipation].Answers[indexPrivacy].Answer) + if attendie.Privacy { + fmt.Println("Yey, privacy") + } else { + fmt.Println("no privacy") + } + if err != nil { + return attendies, err + } + attendies = append(attendies, attendie) + } + fmt.Printf("%+v", attendies) + return attendies, nil +} diff --git a/src/app/views/index.html b/src/app/views/index.html index 4f244d3..607d167 100644 --- a/src/app/views/index.html +++ b/src/app/views/index.html @@ -9,7 +9,11 @@

{{.Title}}

- {{template "table" .}} + {{ if eq .EventType "Suitwalk" }} + {{template "suitwalk" .}} + {{ else if eq .EventType "RegularsTable" }} + {{ template "regularstable" .}} + {{ end }}
\ No newline at end of file diff --git a/src/app/views/regularstable.html b/src/app/views/regularstable.html new file mode 100644 index 0000000..c760728 --- /dev/null +++ b/src/app/views/regularstable.html @@ -0,0 +1,32 @@ +{{ define "regularstable" }} +

{{ .EventName }} {{ .Locals.Attendie }}

+

{{ .Locals.Registered }}

+ + + + + + + + + + {{range $suiter := .Attendies }} + {{if not $suiter.OnWaitingList }} + + + {{ if $suiter.AttendsRestaurant }} + + {{ else }} + + {{ end }} + {{ if $suiter.AttendsBar }} + + {{ else }} + + {{ end }} + + {{end}} + {{end}} + +
{{ .Locals.Name }}{{ .Locals.Restaurant }}{{ .Locals.AfterParty }}
{{ $suiter.Nickname }}✓ {{ $.Locals.Yes }}❌ {{ $.Locals.No }}✓ {{ $.Locals.Yes }}❌ {{ $.Locals.No }}
+{{end}} \ No newline at end of file diff --git a/src/app/views/table.html b/src/app/views/suitwalk.html similarity index 96% rename from src/app/views/table.html rename to src/app/views/suitwalk.html index c41f343..fd1a316 100644 --- a/src/app/views/table.html +++ b/src/app/views/suitwalk.html @@ -1,5 +1,5 @@ -{{define "table"}} -

{{ index . "Event Name" }} {{ .Locals.Attendie }}

+{{define "suitwalk"}} +

{{ .EventName }} {{ .Locals.Attendie }}

{{ .Locals.Registered }}

diff --git a/src/config/localization.go b/src/config/localization.go index 13b55c5..d85be85 100644 --- a/src/config/localization.go +++ b/src/config/localization.go @@ -89,4 +89,9 @@ var defaultMessages = []i18n.Message{ ID: "No", Other: "No", }, + { + ID: "AfterParty", + One: "AfterParty", + Other: "AfterParties", + }, } diff --git a/src/entities/db_attendies.go b/src/entities/db_attendies.go index 1db1c07..2d6df32 100644 --- a/src/entities/db_attendies.go +++ b/src/entities/db_attendies.go @@ -24,11 +24,12 @@ type Db_Attendies struct { gorm.Model Nickname string `gorm:"column:nickname;not null"` EventID int `gorm:"not null"` - Event Db_Event - RoleID int `gorm:"not null"` + Event *Db_Event + RoleID int `gorm:""` Role *Role - AttendsRestaurant bool `gorm:"column:attends_restaurant;not null"` - Privacy bool `gorm:"column:privacy;not null"` + AttendsRestaurant bool `gorm:"column:attends_restaurant;not null;default:false"` + AttendsBar bool `gorm:"attends_restaurant;not null;default:false"` + Privacy bool `gorm:"column:privacy;not null;default:false"` RegistrationTime time.Time `gorm:"column:registration_time;not null;default:CURRENT_TIMESTAMP"` OnWaitingList bool `gorm:"column:on_wating_list;not null;default:false"` } diff --git a/src/entities/db_event.go b/src/entities/db_event.go index fff0eff..b9fd1f7 100644 --- a/src/entities/db_event.go +++ b/src/entities/db_event.go @@ -11,6 +11,7 @@ type Db_Event struct { Event *string `gorm:"column:event;not null" validate:"required"` ItemIdBadge *int `gorm:"column:item_id_badge"` ItemIdRestaurant *int `gorm:"column:item_id_restaurant"` + ItemIdBar *int `gorm:"column:item_id_bar"` ItemIdParticipation *int `gorm:"column:item_id_participation"` ItemIdRole *int `gorm:"column:item_id_role"` QuestionIdRole *string `gorm:"column:question_id_role"` @@ -27,7 +28,7 @@ type Db_Event struct { VariationIdPhotograph *int `gorm:"variation_id_photograph"` VariationIdSpecialAnimal *int `gorm:"variation_id_special_animal"` EventType *string `gorm:"cloumn:event_type;not null" validate:"required"` - SuiterPerSpotter *int `gorm:"column:suiter_per_spotter;not null;default:5" validate:"required"` + SuiterPerSpotter *int `gorm:"column:suiter_per_spotter;not null;default:5"` } type Db_Event_Public struct { diff --git a/src/go.mod b/src/go.mod index a6f9999..02d9662 100644 --- a/src/go.mod +++ b/src/go.mod @@ -9,7 +9,9 @@ require ( github.com/golang-jwt/jwt/v5 v5.1.0 github.com/jinzhu/copier v0.4.0 github.com/joho/godotenv v1.5.1 + github.com/nicksnyder/go-i18n/v2 v2.4.0 golang.org/x/crypto v0.15.0 + golang.org/x/text v0.14.0 gorm.io/driver/sqlite v1.5.3 gorm.io/gorm v1.25.4 ) @@ -20,9 +22,7 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/leodido/go-urn v1.2.4 // indirect - github.com/nicksnyder/go-i18n/v2 v2.4.0 // indirect golang.org/x/net v0.10.0 // indirect - golang.org/x/text v0.14.0 // indirect ) require ( diff --git a/src/localization/active.de.json b/src/localization/active.de.json index d6ad04f..9da2a77 100644 --- a/src/localization/active.de.json +++ b/src/localization/active.de.json @@ -1,4 +1,9 @@ { + "AfterParty": { + "hash": "sha1-78064d491b346faba9074905e42300788f3b2de7", + "one": "AfterStammi", + "other": "AfterStammis" + }, "Attendie": { "hash": "sha1-4c29d6c952ccd2b114d1792c7b18fa7f7052ebed", "one": "Teilnehmer*in", @@ -32,9 +37,9 @@ "other": "Angemeldet" }, "Restaurant": { - "hash": "sha1-2b8fd2cb645ab1f1b09fbecda98978ec3518a9d9", + "hash": "sha1-b19c390d03b991e33ecbb225687fcaf21da87a89", "one": "Restaurant", - "other": "Restaurnts" + "other": "Restaurants" }, "Role": { "hash": "sha1-47dcc27d6e87ece8baebe7e3877a261a5467093d", diff --git a/src/localization/active.en.json b/src/localization/active.en.json index e431c39..4ba8e19 100644 --- a/src/localization/active.en.json +++ b/src/localization/active.en.json @@ -1,4 +1,8 @@ { + "AfterParty": { + "one": "AfterParty", + "other": "AfterParties" + }, "Attendie": { "one": "Attendie", "other": "Attendies" @@ -20,7 +24,7 @@ "Registered": "Registered", "Restaurant": { "one": "Restaurant", - "other": "Restaurnts" + "other": "Restaurantes" }, "Role": { "one": "Role",