Added Database Logic to Reserve, Abort, Release and Confirm

This commit is contained in:
Marco Kittel 2025-07-18 15:32:00 +02:00
parent 1f9fea0bb6
commit dd8d914b33
1 changed files with 63 additions and 6 deletions

View File

@ -25,6 +25,8 @@ type DatabaseReader struct {
DatabaseWriter DatabaseWriter
} }
type UUID string
func NewDatabaseReader(connectionString string) *DatabaseReader { func NewDatabaseReader(connectionString string) *DatabaseReader {
return &DatabaseReader{*NewDatabaseWriter(connectionString)} return &DatabaseReader{*NewDatabaseWriter(connectionString)}
} }
@ -82,11 +84,11 @@ func (d *DatabaseWriter) createDeliveryTableIfNotExist() error {
func (d *DatabaseWriter) createReservationTableIfNotExist() error { func (d *DatabaseWriter) createReservationTableIfNotExist() error {
_, err := d.db.Exec(` _, err := d.db.Exec(`
CREATE TABLE IF NOT EXISTS reservations ( CREATE TABLE IF NOT EXISTS reservations (
id CHAR(36) PRIMARY KEY, id CHAR(36) PRIMARY KEY DEFAULT UUID(),
deliveryId INT, deliveryId INT,
warehouseId INT, warehouseId INT,
amount INT DEFAULT 0, 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, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_delivery_id CONSTRAINT fk_delivery_id
FOREIGN KEY (deliveryId) REFERENCES deliverytimes (id) FOREIGN KEY (deliveryId) REFERENCES deliverytimes (id)
@ -118,6 +120,11 @@ func NewDatabaseWriter(connectionString string) *DatabaseWriter {
fmt.Printf("Delivery-Tabellen-Erstellung fehlgeschlagen. %s", err) fmt.Printf("Delivery-Tabellen-Erstellung fehlgeschlagen. %s", err)
os.Exit(1) os.Exit(1)
} }
err = db.createReservationTableIfNotExist()
if err != nil {
fmt.Printf("Reservations-Tabellen-Erstellung fehlgeschlagen. %s", err)
os.Exit(1)
}
return &db 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) rows, err := d.db.Query(stmt, prod_id, delivery_country, delivery_country_state)
defer rows.Close()
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer rows.Close()
var products []ProductDelivery var products []ProductDelivery
@ -189,6 +196,51 @@ func (d *DatabaseReader) GetProductByProductIdDeliveryCountryAndState(prod_id, d
return products, nil 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 { func (db *DatabaseWriter) HandleData(ctx context.Context, data eliofile.CountryCsvData) error {
// a.log.Info("HandleData") // a.log.Info("HandleData")
if strings.Contains(strings.Join(data.Data, ","), "product_id") || strings.Contains(strings.Join(data.Data, ","), "delivery_time") { 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) fmt.Println(err)
return 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": case "delivery":
{ {
@ -214,9 +269,11 @@ func (db *DatabaseWriter) HandleData(ctx context.Context, data eliofile.CountryC
fmt.Println(err) fmt.Println(err)
return 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 return nil
} }