diff --git a/internal/database/database.go b/internal/database/database.go index 52737b4..620549d 100644 --- a/internal/database/database.go +++ b/internal/database/database.go @@ -25,6 +25,8 @@ type DatabaseReader struct { DatabaseWriter } +type UUID string + func NewDatabaseReader(connectionString string) *DatabaseReader { return &DatabaseReader{*NewDatabaseWriter(connectionString)} } @@ -82,11 +84,11 @@ func (d *DatabaseWriter) createDeliveryTableIfNotExist() error { func (d *DatabaseWriter) createReservationTableIfNotExist() error { _, err := d.db.Exec(` CREATE TABLE IF NOT EXISTS reservations ( - id CHAR(36) PRIMARY KEY, + id CHAR(36) PRIMARY KEY DEFAULT UUID(), deliveryId INT, warehouseId INT, amount INT DEFAULT 0, - status VARCHAR(30) CHECK(status IN ('RESERVED', 'CONFIRMED', 'ABORTED')), + status VARCHAR(30) CHECK(status IN ('RESERVED', 'CONFIRMED', 'ABORTED', 'RELEASED')), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT fk_delivery_id FOREIGN KEY (deliveryId) REFERENCES deliverytimes (id) @@ -118,6 +120,11 @@ func NewDatabaseWriter(connectionString string) *DatabaseWriter { fmt.Printf("Delivery-Tabellen-Erstellung fehlgeschlagen. %s", err) os.Exit(1) } + err = db.createReservationTableIfNotExist() + if err != nil { + fmt.Printf("Reservations-Tabellen-Erstellung fehlgeschlagen. %s", err) + os.Exit(1) + } return &db } @@ -171,10 +178,10 @@ func (d *DatabaseReader) GetProductByProductIdDeliveryCountryAndState(prod_id, d ` rows, err := d.db.Query(stmt, prod_id, delivery_country, delivery_country_state) - defer rows.Close() if err != nil { return nil, err } + defer rows.Close() var products []ProductDelivery @@ -189,6 +196,51 @@ func (d *DatabaseReader) GetProductByProductIdDeliveryCountryAndState(prod_id, d return products, nil } +func (d *DatabaseReader) GetReservationStateById(productId UUID) (string, error) { + stmt := ` + SELECT status FROM reservations WHERE id = ? + ` + row, err := d.db.Query(stmt, productId) + if err != nil { + return "", err + } + defer row.Close() + row.Next() + var status string + err = row.Scan(&status) + if err != nil { + return "", err + } + return status, nil +} + +func (d *DatabaseWriter) updateReservationState(productId UUID, status string) error { + _, err := d.db.Exec("UPDATE reservations SET Status=? WHERE id=?", status, productId) + if err != nil { + return err + } + return nil +} + +func (d *DatabaseWriter) AbortReservation(productId UUID) error { + return d.updateReservationState(productId, "ABORTED") +} + +func (d *DatabaseWriter) ConfirmReservation(productId UUID) error { + return d.updateReservationState(productId, "CONFIRMED") +} +func (d *DatabaseWriter) ReleaseReservation(productId UUID) error { + return d.updateReservationState(productId, "RELEASED") +} + +func (d *DatabaseWriter) ReserveReservation(deliveryId, warehouseId, amount int) error { + _, err := d.db.Exec("INSERT INTO reservations (deliveryId, warehouseId, amount, status) VALUES (?,?,?,'RESERVED')") + if err != nil { + return err + } + return nil +} + func (db *DatabaseWriter) HandleData(ctx context.Context, data eliofile.CountryCsvData) error { // a.log.Info("HandleData") if strings.Contains(strings.Join(data.Data, ","), "product_id") || strings.Contains(strings.Join(data.Data, ","), "delivery_time") { @@ -204,7 +256,10 @@ func (db *DatabaseWriter) HandleData(ctx context.Context, data eliofile.CountryC fmt.Println(err) return err } - db.UpdateOrInsertWarehouseProduct(data.CountryID, menge[0], amount) + err = db.UpdateOrInsertWarehouseProduct(data.CountryID, menge[0], amount) + if err != nil { + return err + } } case "delivery": { @@ -214,9 +269,11 @@ func (db *DatabaseWriter) HandleData(ctx context.Context, data eliofile.CountryC fmt.Println(err) return err } - db.UpdateOrInsertDelivery(data.CountryID, menge[0], menge[1], amount) + err = db.UpdateOrInsertDelivery(data.CountryID, menge[0], menge[1], amount) + if err != nil { + return err + } } } - return nil }