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

View File

@ -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
}