package engine import ( "database/sql" "fmt" "time" ) type User struct { ID int Username string Email string OAuthSubject string OAuthProvider string CreatedAt int64 } func FindOrCreateOAuthUser(subject, username, email string) (*User, error) { db := GetDB() if db == nil { return nil, fmt.Errorf("database not initialized") } // Try to find existing user var user User err := db.QueryRow(` SELECT id, username, COALESCE(email, ''), COALESCE(oauth_subject, ''), COALESCE(oauth_provider, ''), created_at FROM users WHERE oauth_subject = ? `, subject).Scan(&user.ID, &user.Username, &user.Email, &user.OAuthSubject, &user.OAuthProvider, &user.CreatedAt) if err == nil { // User exists return &user, nil } if err != sql.ErrNoRows { return nil, err } // Create new user result, err := db.Exec(` INSERT INTO users (username, email, oauth_subject, oauth_provider, created_at) VALUES (?, ?, ?, ?, ?) `, username, email, subject, "authentik", time.Now().Unix()) if err != nil { return nil, err } id, err := result.LastInsertId() if err != nil { return nil, err } user.ID = int(id) user.Username = username user.Email = email user.OAuthSubject = subject user.OAuthProvider = "authentik" user.CreatedAt = time.Now().Unix() return &user, nil } func GetUser(id int) (*User, error) { db := GetDB() if db == nil { return nil, fmt.Errorf("database not initialized") } var user User err := db.QueryRow(` SELECT id, username, COALESCE(email, ''), COALESCE(oauth_subject, ''), COALESCE(oauth_provider, ''), created_at FROM users WHERE id = ? `, id).Scan(&user.ID, &user.Username, &user.Email, &user.OAuthSubject, &user.OAuthProvider, &user.CreatedAt) if err != nil { return nil, err } return &user, nil }