diff --git a/db.go b/db.go new file mode 100644 index 0000000..65fc995 --- /dev/null +++ b/db.go @@ -0,0 +1,62 @@ +package main + +import ( + "crypto/rand" + "database/sql" + "fmt" + "log" + "math/big" +) + +const createPinTableSql = `CREATE TABLE IF NOT EXISTS pin ( + "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + "pin" STRING NOT NULL, + "active" BOOLEAN DEFAULT TRUE, + "createdAt" DATETIME NOT NULL DEFAULT (datetime('now','localtime')), + )` + +const createPeerTableSql = `CREATE TABLE IF NOT EXISTS peer ( + "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + "publicKey" STRING NOT NULL, + "createdAt" DATETIME NOT NULL DEFAULT (datetime('now','localtime')), +)` + +func InitDb() *sql.DB { + db, err := sql.Open("sqlite3", "./sqlite-database.db") + _, err = db.Exec(createPinTableSql) + if err != nil { + log.Fatal(err.Error()) + } + + _, err = db.Exec(createPeerTableSql) + if err != nil { + log.Fatal(err.Error()) + } + + return db +} + +func NewPin(db *sql.DB) (string, error) { + pin := randomPin() + _, err := db.Exec(`INSERT INTO PIN pin = ?`, pin) + + if err != nil { + return "", err + } + + return pin, nil +} + +func VerifyPin(db *sql.DB, pin string) bool { + row := db.QueryRow(`SELECT EXISTS (SELECT 1 FROM pin WHERE pin = ? AND active = True)`, pin) + + var exists bool + row.Scan(&exists) + + return exists +} + +func randomPin() string { + num, _ := rand.Int(rand.Reader, big.NewInt(999999+1)) + return fmt.Sprintf("%06d", num) +}