From a82355cf473812d7d3b5faa6e6134d6f2d3a5ccd Mon Sep 17 00:00:00 2001 From: The Magician Date: Sat, 7 Jun 2025 15:19:00 +0100 Subject: [PATCH] Fix order of SQL migrations, modify scanner script --- scanner/card_scanner | 10 +-- sevenkeys/.gitignore | 1 + sevenkeys/database/cardtraderblueprint.go | 2 +- ...=> 00002_add_scanned_card_placeholder.sql} | 0 ...le.sql => 00003_add_storagearea_table.sql} | 0 ...ql => 00004_add_productlocation_table.sql} | 0 ...table.sql => 00005_add_cardscan_table.sql} | 3 +- sevenkeys/database/productlocation.go | 24 ++++++ sevenkeys/logic/storage.go | 36 ++++++--- sevenkeys/main.go | 24 +++++- sevenkeys/webui/webui.go | 75 +++++++++++++++++++ 11 files changed, 156 insertions(+), 19 deletions(-) rename sevenkeys/database/migrations/{00005_add_scanned_card_placeholder.sql => 00002_add_scanned_card_placeholder.sql} (100%) rename sevenkeys/database/migrations/{00002_add_storagearea_table.sql => 00003_add_storagearea_table.sql} (100%) rename sevenkeys/database/migrations/{00003_add_productlocation_table.sql => 00004_add_productlocation_table.sql} (100%) rename sevenkeys/database/migrations/{00004_add_cardscan_table.sql => 00005_add_cardscan_table.sql} (73%) create mode 100644 sevenkeys/webui/webui.go diff --git a/scanner/card_scanner b/scanner/card_scanner index 111a95e..0633203 100755 --- a/scanner/card_scanner +++ b/scanner/card_scanner @@ -17,7 +17,7 @@ printf "Storage area name: " read storageAreaName ADD_CARDS=0 -echo "scantap: Beginning scan loop" +echo "card_scanner: Beginning scan loop" while true; do rng="$(cat /dev/random | tr -cd 'a-f0-9' | head -c 32)" filename="$STORAGE_DIR/$rng.png" @@ -28,7 +28,7 @@ while true; do if test $? -eq 7; then if test $ADD_CARDS -eq 0; then ADD_CARDS=1 - echo "scantap: No more cards in feeder" >&2 + echo "card_scanner: No more cards in feeder" >&2 fi # If we have generated a zero-length file, then delete it @@ -44,13 +44,13 @@ while true; do convert -rotate 180 "$filename" "$filename" check_error "convert" - cardLocationId="$(./sevenkeys --profile="$profile" store --storagearea="$storageAreaName" --id="00000000-0000-0000-0000-0000000000000")" + cardLocationId="$(./sevenkeys --profile="$profile" store --storagearea="$storageAreaName" --id="-1")" check_error "sevenkeys" if test "$profile" == "development"; then - databaseName="sevenkeys_development" + databaseName="sevenkeys_dev" else - databaseName="sevenkeys" + databaseName="sevenkeys_prod" fi mysql --silent --silent --user=root --password="$(pass show sevenkeys/mysql)" \ diff --git a/sevenkeys/.gitignore b/sevenkeys/.gitignore index 969fad0..8f62a25 100644 --- a/sevenkeys/.gitignore +++ b/sevenkeys/.gitignore @@ -2,3 +2,4 @@ cache/ config.dev.json config.prod.json sevenkeys.sql +log.txt diff --git a/sevenkeys/database/cardtraderblueprint.go b/sevenkeys/database/cardtraderblueprint.go index bda45af..6a61eb8 100644 --- a/sevenkeys/database/cardtraderblueprint.go +++ b/sevenkeys/database/cardtraderblueprint.go @@ -62,7 +62,7 @@ func GetAllCardtraderBlueprints(db *sql.DB) ([]cardtrader.Blueprint, error) { var blueprint cardtrader.Blueprint for rows.Next() { - err := rows.Scan(&blueprint.Id, &blueprint.CategoryId, &blueprint.ExpansionId, &blueprint.Name, &blueprint.FixedProperties.Number) + err := rows.Scan(&blueprint.Id, &blueprint.ScryfallId, &blueprint.CategoryId, &blueprint.ExpansionId, &blueprint.Name, &blueprint.FixedProperties.Number) if err != nil { return blueprints, err } diff --git a/sevenkeys/database/migrations/00005_add_scanned_card_placeholder.sql b/sevenkeys/database/migrations/00002_add_scanned_card_placeholder.sql similarity index 100% rename from sevenkeys/database/migrations/00005_add_scanned_card_placeholder.sql rename to sevenkeys/database/migrations/00002_add_scanned_card_placeholder.sql diff --git a/sevenkeys/database/migrations/00002_add_storagearea_table.sql b/sevenkeys/database/migrations/00003_add_storagearea_table.sql similarity index 100% rename from sevenkeys/database/migrations/00002_add_storagearea_table.sql rename to sevenkeys/database/migrations/00003_add_storagearea_table.sql diff --git a/sevenkeys/database/migrations/00003_add_productlocation_table.sql b/sevenkeys/database/migrations/00004_add_productlocation_table.sql similarity index 100% rename from sevenkeys/database/migrations/00003_add_productlocation_table.sql rename to sevenkeys/database/migrations/00004_add_productlocation_table.sql diff --git a/sevenkeys/database/migrations/00004_add_cardscan_table.sql b/sevenkeys/database/migrations/00005_add_cardscan_table.sql similarity index 73% rename from sevenkeys/database/migrations/00004_add_cardscan_table.sql rename to sevenkeys/database/migrations/00005_add_cardscan_table.sql index c2a0fab..ea38864 100644 --- a/sevenkeys/database/migrations/00004_add_cardscan_table.sql +++ b/sevenkeys/database/migrations/00005_add_cardscan_table.sql @@ -2,7 +2,8 @@ -- +goose StatementBegin CREATE TABLE IF NOT EXISTS CardScan ( Id INT PRIMARY KEY AUTO_INCREMENT, - CardLocationId INT NOT NULL, + ProductLocationId INT NOT NULL, + FOREIGN KEY (ProductLocationId) REFERENCES ProductLocation(Id), Filename VARCHAR(100) NOT NULL ); -- +goose StatementEnd diff --git a/sevenkeys/database/productlocation.go b/sevenkeys/database/productlocation.go index 5f9b3b3..cd43814 100644 --- a/sevenkeys/database/productlocation.go +++ b/sevenkeys/database/productlocation.go @@ -65,3 +65,27 @@ func InsertProductInExistingLocation(db *sql.DB, productLocation ProductLocation return nil } + +func GetAllProductsInStorageArea(db *sql.DB, storageAreaId int) ([]ProductLocation, error) { + var productLocations []ProductLocation + + query := `SELECT * FROM ProductLocation WHERE StorageAreaId = ?;` + + rows, err := db.Query(query) + defer rows.Close() + if err != nil { + return productLocations, err + } + + var productLocation ProductLocation + for rows.Next() { + err = rows.Scan(&productLocation.Id, &productLocation.CardtraderBlueprintId, &productLocation.StorageAreaId, &productLocation.Position, &productLocation.CardtraderProductId) + if err != nil { + return productLocations, err + } + + productLocations = append(productLocations, productLocation) + } + + return productLocations, nil +} diff --git a/sevenkeys/logic/storage.go b/sevenkeys/logic/storage.go index 7f81864..c0d7652 100644 --- a/sevenkeys/logic/storage.go +++ b/sevenkeys/logic/storage.go @@ -3,9 +3,29 @@ package logic import ( "database/sql" "errors" + "log" "sevenkeys/database" ) +func CreateStorageArea(db *sql.DB, storageArea database.StorageArea) error { + // TODO: Check if there's already a storage are with the same name + // TODO: Check if the type entered is valid + err := database.InsertStorageArea(db, storageArea) + if err != nil { + return err + } + + return nil +} + +func GetAllStorageAreas(db *sql.DB) ([]database.StorageArea, error) { + storageAreas, err := database.GetAllStorageAreas(db) + if err != nil { + log.Fatal(err) + } + return storageAreas, err +} + var ErrCouldNotGetStorageAreaId error = errors.New("Could not get storage area ID.") func GetStorageAreaId(db *sql.DB, storageAreaName string) (int, error) { @@ -31,17 +51,6 @@ func GetStorageAreaId(db *sql.DB, storageAreaName string) (int, error) { return id, ErrCouldNotGetStorageAreaId } -func CreateStorageArea(db *sql.DB, storageArea database.StorageArea) error { - // TODO: Check if there's already a storage are with the same name - // TODO: Check if the type entered is valid - err := database.InsertStorageArea(db, storageArea) - if err != nil { - return err - } - - return nil -} - type StorageAreaSearchOptions map[string]int func GetStorageAreaSearchOptions(db *sql.DB) (StorageAreaSearchOptions, error) { @@ -129,3 +138,8 @@ func Replace(db *sql.DB, productLocationId int, cardtraderBlueprintId int) error return database.InsertProductInExistingLocation(db, productLocation) } + +func GetAllProductsInStorageArea(db *sql.DB, storageAreaId int) ([]database.ProductLocation, error) { + productLocations, err := database.GetAllProductsInStorageArea(db, storageAreaId) + return productLocations, err +} diff --git a/sevenkeys/main.go b/sevenkeys/main.go index 1909169..57b01b6 100644 --- a/sevenkeys/main.go +++ b/sevenkeys/main.go @@ -11,6 +11,7 @@ import ( "sevenkeys/delverlens" "sevenkeys/logic" "sevenkeys/update" + "sevenkeys/webui" ) const ( @@ -23,13 +24,15 @@ const ( AddSubcommand string = "add" RemoveSubcommand string = "remove" ReplaceSubcommand string = "replace" + WebUiSubcommand string = "webui" + BlueprintsCommand string = "blueprints" ) func main() { log.SetFlags(log.LstdFlags | log.Lshortfile) var profile string - flag.StringVar(&profile, "profile", "development", "The database profile to use.") + flag.StringVar(&profile, "profile", "dev", "The database profile to use.") flag.Parse() @@ -201,6 +204,25 @@ func main() { err := logic.Replace(db, *cardLocationId, *cardtraderBlueprintId) logic.Check(err) break + case WebUiSubcommand: + webui.Start(db) + /* + storageAreas, err := database.GetAllStorageAreas(db) + if err != nil { + log.Fatal(err) + } + + fmt.Println(storageAreas) + */ + break + case BlueprintsCommand: + blueprints, err := database.GetAllCardtraderBlueprints(db) + if err != nil { + log.Fatal(err) + } + + fmt.Println(blueprints) + break default: fmt.Fprintf(os.Stderr, "Unrecognized subcommand: %s\n", os.Args[1]) break diff --git a/sevenkeys/webui/webui.go b/sevenkeys/webui/webui.go new file mode 100644 index 0000000..2d64ad0 --- /dev/null +++ b/sevenkeys/webui/webui.go @@ -0,0 +1,75 @@ +package webui + +import ( + "database/sql" + "html/template" + "net/http" + "sevenkeys/logic" + "strconv" +) + +type BaseHandler struct { + db *sql.DB +} + +func NewBaseHandler(db *sql.DB) *BaseHandler { + return &BaseHandler{ + db: db, + } +} + +func (h *BaseHandler) storageAreasHandler(w http.ResponseWriter, r *http.Request) { + storageAreas, err := logic.GetAllStorageAreas(h.db) + if err != nil { + return + } + + const tmpl = ` + +Sevenkeys + +{{range $val := .}} + {{$val.Name}} ({{$val.StorageType}})
+{{end}} + + +` + t := template.Must(template.New("tmpl").Parse(tmpl)) + t.Execute(w, storageAreas) +} + +func (h *BaseHandler) storageHandler(w http.ResponseWriter, r *http.Request) { + storageAreaIdParam := r.PathValue("id") + + storageAreaId, err := strconv.Atoi(storageAreaIdParam) + if err != nil { + return + } + productLocations, err := logic.GetAllProductsInStorageArea(h.db, storageAreaId) + if err != nil { + return + } + + const tmpl = ` + +Sevenkeys + +
    +{{range $val := .}} +
  1. {{$val}}
  2. +{{end}} +
      + + +` + t := template.Must(template.New("tmpl").Parse(tmpl)) + t.Execute(w, productLocations) +} + +func Start(db *sql.DB) { + handlers := NewBaseHandler(db) + + http.HandleFunc("/", handlers.storageAreasHandler) + http.HandleFunc("/storage/{id}", handlers.storageHandler) + http.ListenAndServe(":8080", nil) +}