From 36da091c807f765f11b91effe34021ba518baf1c Mon Sep 17 00:00:00 2001 From: Arne Maier Date: Fri, 11 Aug 2023 21:04:43 +0200 Subject: [PATCH] 23/equipment with size (#30) Can order equipment and convert an order to equipment --------- Co-authored-by: Arne Maier --- config/config.go | 5 +- configuration | 1 + equipment/database.go | 18 ++ equipment/service.go | 43 ++++- frontend/src/App.svelte | 10 +- .../components/Navigation/Navigation.svelte | 2 + frontend/src/components/timeHelper.ts | 14 ++ frontend/src/routes.ts | 18 +- .../src/views/equipment/equipment.service.ts | 1 + frontend/src/views/member/MemberDetail.svelte | 62 ++++--- .../src/views/order/FulfillOrderModal.svelte | 73 ++++++++ .../src/views/order/FulfilledOrders.svelte | 28 +++ frontend/src/views/order/NewOrder.svelte | 80 ++++++++ frontend/src/views/order/OrderCard.svelte | 50 +++++ frontend/src/views/order/OrderDetails.svelte | 82 +++++++++ frontend/src/views/order/Orders.svelte | 31 ++++ frontend/src/views/order/order.service.ts | 73 ++++++++ main.go | 6 +- models/order.go | 50 +++++ orders/controller.go | 173 ++++++++++++++++++ orders/database.go | 101 ++++++++++ orders/service.go | 91 +++++++++ url/util.go | 8 + users/controller.go | 2 +- 24 files changed, 990 insertions(+), 32 deletions(-) create mode 100644 frontend/src/components/timeHelper.ts create mode 100644 frontend/src/views/order/FulfillOrderModal.svelte create mode 100644 frontend/src/views/order/FulfilledOrders.svelte create mode 100644 frontend/src/views/order/NewOrder.svelte create mode 100644 frontend/src/views/order/OrderCard.svelte create mode 100644 frontend/src/views/order/OrderDetails.svelte create mode 100644 frontend/src/views/order/Orders.svelte create mode 100644 frontend/src/views/order/order.service.ts create mode 100644 models/order.go create mode 100644 orders/controller.go create mode 100644 orders/database.go create mode 100644 orders/service.go diff --git a/config/config.go b/config/config.go index b917f11..bd80777 100644 --- a/config/config.go +++ b/config/config.go @@ -9,10 +9,10 @@ import ( type Config struct { Debug bool - DatebaseConnection string + DatabaseConnection string `yaml:"databaseConnection"` Domain string Origin string - JwtSecret string + JwtSecret string `yaml:"jwtSecret"` } func New(path string) (Config, error) { @@ -25,5 +25,6 @@ func New(path string) (Config, error) { if err := yaml.NewDecoder(configFile).Decode(&config); err != nil { return Config{}, fmt.Errorf("failed to decode config file: %w", err) } + return config, nil } diff --git a/configuration b/configuration index 4a88f9f..23bd3a3 100644 --- a/configuration +++ b/configuration @@ -2,3 +2,4 @@ debug: false domain: localhost origin: http://localhost:5173 jwtSecret: changeMe +databaseConnection: ./test.db diff --git a/equipment/database.go b/equipment/database.go index c3d4ceb..546dcaf 100644 --- a/equipment/database.go +++ b/equipment/database.go @@ -79,6 +79,24 @@ func (edb *equipmentDB) getFreeEquipment() ([]*models.Equipment, error) { return listFormDB(dbEquipment), nil } +func (edb *equipmentDB) save(equipment *models.Equipment) (*models.Equipment, error) { + e := equipment.ToDb() + err := edb.Save(&e).Error + if err != nil { + return nil, err + } + return e.FromDB(), nil +} + +func (edb *equipmentDB) getByMemberIdAndType(memberId uint64, eType models.EquipmentType) (*models.Equipment, error) { + dbEquipment := models.DbEquipment{} + err := edb.Where("type = ? AND member_id = ?", eType, memberId).Find(&dbEquipment).Error + if err != nil { + return nil, err + } + return dbEquipment.FromDB(), err +} + func listFormDB(dbEquipment []models.DbEquipment) []*models.Equipment { equipment := make([]*models.Equipment, 0) for _, v := range dbEquipment { diff --git a/equipment/service.go b/equipment/service.go index e3247ba..5de7489 100644 --- a/equipment/service.go +++ b/equipment/service.go @@ -6,12 +6,14 @@ import ( ) type EquipmentDatabase interface { + CreateEquipent(*models.Equipment) (*models.Equipment, error) getById(uint64) (*models.Equipment, error) getByType(string) ([]*models.Equipment, error) - CreateEquipent(*models.Equipment) (*models.Equipment, error) delete(uint64) error getAllByIds([]uint64) ([]*models.Equipment, error) getFreeEquipment() ([]*models.Equipment, error) + save(*models.Equipment) (*models.Equipment, error) + getByMemberIdAndType(uint64, models.EquipmentType) (*models.Equipment, error) } type EquipmentService struct { @@ -53,3 +55,42 @@ func (s EquipmentService) getFreeEquipment() (map[models.EquipmentType][]*models } return equipments, err } + +func (s EquipmentService) save(e models.Equipment) (*models.Equipment, error) { + return s.db.save(&e) +} + +func (s EquipmentService) CreateEquipmentFromOrder(order models.Order, registrationCode string) (*models.Equipment, error) { + newEquipment := models.Equipment{ + Id: 0, + Size: order.Size, + RegistrationCode: registrationCode, + Type: order.Type, + MemberID: order.MemberID, + } + return s.createEquipment(newEquipment) +} + +func (s EquipmentService) ReplaceEquipmentForMember(equipment models.Equipment) (*models.Equipment, error) { + newEquipment, err := s.getEquipmentById(equipment.Id) + if err != nil { + return nil, err + } + + oldEquipment, _ := s.db.getByMemberIdAndType(equipment.MemberID, equipment.Type) + if oldEquipment != nil { + oldEquipment.MemberID = 0 + _, err := s.save(*oldEquipment) + if err != nil { + return nil, err + } + } + + newEquipment.MemberID = equipment.MemberID + e, err := s.save(*newEquipment) + if err != nil { + return nil, err + } + + return e, nil +} diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index 23f1a3f..a047131 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -1,5 +1,5 @@ + + + +

+ Soll die Bestellung für {translateEquipmentType(order.type)} eingelöst werden? +

+
fulfillOrder_internal()} disabled={loading} id="fulfilOrderForm"> + + +
+ + {#if loading} + + {:else} + + + {/if} + +
diff --git a/frontend/src/views/order/FulfilledOrders.svelte b/frontend/src/views/order/FulfilledOrders.svelte new file mode 100644 index 0000000..dc248f0 --- /dev/null +++ b/frontend/src/views/order/FulfilledOrders.svelte @@ -0,0 +1,28 @@ + + + +

Fertige Bestellungen

+ +{#await orderPromise} + +{:then orders} +
+ Aktuell {orders.length} Bestellungen fertig +
+ {#each orders as order} + + {/each} +
+
+{:catch} + + Leider konnten die Bestellungen nicht geladen werden. + +{/await} diff --git a/frontend/src/views/order/NewOrder.svelte b/frontend/src/views/order/NewOrder.svelte new file mode 100644 index 0000000..4e55f24 --- /dev/null +++ b/frontend/src/views/order/NewOrder.svelte @@ -0,0 +1,80 @@ + + + + +

Neue Bestellung

+
+ + + +