Can create db and working on login

This commit is contained in:
Sebastiaan de Schaetzen 2025-01-29 19:05:14 +01:00
parent 6020624ed9
commit 925318a0be
3 changed files with 95 additions and 48 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
.idea .idea
*.iml *.iml
*.db3

View File

@ -4,71 +4,88 @@ import (
"database/sql" "database/sql"
"embed" "embed"
"fmt" "fmt"
"github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3"
"log" "log"
"os" "strconv"
"strings"
) )
//go:embed migrations/*.sql //go:embed migrations/*.sql
var migrations embed.FS var embeddedMigrations embed.FS
func openDatabase() *sql.DB { func openDatabase() *sql.DB {
// Initialize the database connection // Initialize the database connection
db, err := sqlite3.Open("videos.db") db, err := sql.Open("sqlite3", "videos.db3")
if err != nil { if err != nil {
log.Fatalf("Error opening database: %v\n", err) log.Fatalf("error opening database: %v", err)
}
// Read all migrations
migrationFiles, err := embeddedMigrations.ReadDir("migrations")
if err != nil {
log.Fatalf("error reading migration files: %v", err)
}
var migrations = make(map[int]string)
latestVersion := 0
for _, f := range migrationFiles {
versionStr := f.Name()
version, err := strconv.Atoi(strings.SplitN(versionStr, "_", 2)[0])
if err != nil {
log.Fatalf("invalid version number for migration script: %v", err)
}
migrations[version] = versionStr
latestVersion = max(latestVersion, version)
} }
// Get current migration version from user_version // Get current migration version from user_version
var currentVersion int var currentVersion int
err = db.QueryRow("PRAGMA user_version").Scan(&currentVersion) err = db.QueryRow("PRAGMA user_version").Scan(&currentVersion)
if err != nil { if err != nil {
fmt.Printf("Error getting current version: %v\n", err) log.Fatalf("error getting current version: %v", err)
os.Exit(1)
} }
log.Printf("Current database migration version is %d, latest version is %d", currentVersion, latestVersion)
// Read all migrations // If we are no up-to-date, bring the db up-to-date
migrationFiles, err := migrations.ReadDir(migrationDir) for currentVersion != latestVersion {
targetVersion := currentVersion + 1
migrationFile := migrations[targetVersion]
log.Printf("migration to version %s", migrationFile)
migrationScript, err := embeddedMigrations.ReadFile("migrations/" + migrationFile)
if err != nil { if err != nil {
fmt.Printf("Error reading migration files: %v\n", err) log.Fatalf("error opening migration script %s: %v", migrationScript, err)
os.Exit(1)
} }
// Sort and process each migration file (assuming filenames are versioned like 1.sql, 2.sql, etc.) tx, err := db.Begin()
for _, f := range migrationFiles {
if !f.IsDir() {
versionStr := f.Name()
version, err := extractVersion(versionStr)
if err != nil { if err != nil {
fmt.Printf("Error extracting version from %s: %v\n", versionStr, err) log.Fatalf("error beginning transaction: %v", err)
continue
} }
if version > currentVersion { _, err = tx.Exec(string(migrationScript))
// Apply the migration
sqlContent, err := readMigrationFile(f.Name())
if err != nil { if err != nil {
fmt.Printf("Error reading migration file %s: %v\n", f.Name(), err) rollbackIgnoringErrors(tx)
os.Exit(1) log.Fatalf("error performing migration: %v", err)
} }
_, err = db.Exec(sqlContent) _, err = tx.Exec(fmt.Sprintf("PRAGMA user_version = %d", targetVersion))
if err != nil { if err != nil {
fmt.Printf("Error applying migration %d: %v\n", version, err) rollbackIgnoringErrors(tx)
os.Exit(1) log.Fatalf("error updating version: %v", err)
} }
// Update the user_version err = tx.Commit()
_, err = db.Exec(fmt.Sprintf("PRAGMA user_version=%d", version))
if err != nil { if err != nil {
fmt.Printf("Error updating user_version to %d: %v\n", version, err) log.Fatalf("error commiting transaction: %v", err)
os.Exit(1) }
currentVersion = targetVersion
} }
fmt.Printf("Applied migration %d successfully\n", version) log.Println("All migrations applied")
} return db
} }
}
func rollbackIgnoringErrors(tx *sql.Tx) {
fmt.Println("All migrations applied") err := tx.Rollback()
if err != nil {
log.Printf("error rolling back: %v", err)
}
} }

29
main.go
View File

@ -1,6 +1,35 @@
package main package main
import (
"encoding/base64"
"log"
"net/http"
"net/url"
"os"
"strings"
)
func main() { func main() {
db := openDatabase() db := openDatabase()
defer db.Close() defer db.Close()
username := os.Getenv("VIVAPLUS_USER")
password, err := base64.StdEncoding.DecodeString(os.Getenv("VIVAPLUS_PASS"))
if err != nil {
log.Fatalf("error decoding password: %v", err)
}
form := url.Values{}
form.Set("email", username)
form.Set("password", string(password))
// First fetch csrf token by doing a get. It is found in a meta tag with name="csrf-token"
resp, err := http.Post("https://vivaplus.tv/supporters/sign_in", "application/x-www-form-urlencoded;charset=UTF-8", strings.NewReader(form.Encode()))
if err != nil {
log.Fatalf("error logging in: %v", err)
}
log.Printf("Status code: %d", resp.StatusCode)
//println(resp)
} }