'fetch_user' and 'fetch_user_by_id' subcommands now check for conflicting user handle errors and rescrape if needed

This commit is contained in:
Alessio 2024-09-22 22:11:00 -07:00
parent 6ed8beae26
commit 381e9e0706
3 changed files with 56 additions and 27 deletions

View File

@ -284,12 +284,39 @@ func create_profile(target_dir string) {
} }
} }
/** func _fetch_user_by_id(id scraper.UserID) error {
* Scrape a user and save it in the database. user, err := scraper.GetUserByID(id)
* if errors.Is(err, scraper.ErrDoesntExist) {
* args: // Mark them as deleted.
* - handle: e.g., "michaelmalice" // Handle and display name won't be updated if the user exists.
*/ user = scraper.User{ID: id, DisplayName: "<Unknown User>", Handle: "<UNKNOWN USER>", IsDeleted: true}
} else if err != nil {
return err
}
log.Debugf("%#v\n", user)
err = profile.SaveUser(&user)
var conflict_err persistence.ErrConflictingUserHandle
if errors.As(err, &conflict_err) {
log.Warnf(
"Conflicting user handle found (ID %d); old user has been marked deleted. Rescraping them",
conflict_err.ConflictingUserID,
)
if err := _fetch_user_by_id(conflict_err.ConflictingUserID); err != nil {
return fmt.Errorf("error scraping conflicting user (ID %d): %w", conflict_err.ConflictingUserID, err)
}
} else if err != nil {
return fmt.Errorf("error saving user: %w", err)
}
user, err = profile.GetUserByID(user.ID)
if err != nil {
panic(fmt.Sprintf("User not found for some reason: %s", err.Error()))
}
download_user_content(user.Handle)
return nil
}
func fetch_user(handle scraper.UserHandle) { func fetch_user(handle scraper.UserHandle) {
user, err := scraper.GetUser(handle) user, err := scraper.GetUser(handle)
if errors.Is(err, scraper.ErrDoesntExist) { if errors.Is(err, scraper.ErrDoesntExist) {
@ -303,11 +330,20 @@ func fetch_user(handle scraper.UserHandle) {
} else if is_scrape_failure(err) { } else if is_scrape_failure(err) {
die(err.Error(), false, -1) die(err.Error(), false, -1)
} }
log.Debug(user) log.Debugf("%#v\n", user)
err = profile.SaveUser(&user) err = profile.SaveUser(&user)
if err != nil { var conflict_err persistence.ErrConflictingUserHandle
die(fmt.Sprintf("Error saving user: %s", err.Error()), false, 4) if errors.As(err, &conflict_err) {
log.Warnf(
"Conflicting user handle found (ID %d); old user has been marked deleted. Rescraping them",
conflict_err.ConflictingUserID,
)
if err := _fetch_user_by_id(conflict_err.ConflictingUserID); err != nil {
die(fmt.Sprintf("error scraping conflicting user (ID %d): %s", conflict_err.ConflictingUserID, err.Error()), false, 4)
}
} else if err != nil {
die(fmt.Sprintf("error saving user: %s", err.Error()), false, 4)
} }
download_user_content(handle) download_user_content(handle)
@ -315,22 +351,10 @@ func fetch_user(handle scraper.UserHandle) {
} }
func fetch_user_by_id(id scraper.UserID) { func fetch_user_by_id(id scraper.UserID) {
session, err := scraper.NewGuestSession() // This endpoint works better if you're not logged in err := _fetch_user_by_id(id)
if err != nil { if err != nil {
panic(err) die(err.Error(), false, -1)
} }
user, err := session.GetUserByID(id)
if err != nil {
panic(err)
}
log.Debug(user)
err = profile.SaveUser(&user)
if err != nil {
die(fmt.Sprintf("Error saving user: %s", err.Error()), false, 4)
}
download_user_content(user.Handle)
happy_exit("Saved the user", nil) happy_exit("Saved the user", nil)
} }

View File

@ -114,14 +114,11 @@ func TestSetUserBannedDeleted(t *testing.T) {
user.IsContentDownloaded = true user.IsContentDownloaded = true
// Save the user so it can be modified // Save the user so it can be modified
fmt.Println("---------- Saving the user for the first time; should do insert")
err := profile.SaveUser(&user) err := profile.SaveUser(&user)
require.NoError(err) require.NoError(err)
// Now the user deactivates // Now the user deactivates
user.IsDeleted = true err = profile.SaveUser(&scraper.User{ID: user.ID, IsDeleted: true})
fmt.Println("---------- Saving the user for the second time; should do update")
err = profile.SaveUser(&user)
require.NoError(err) require.NoError(err)
// Reload the modified user // Reload the modified user
new_user, err := profile.GetUserByID(user.ID) new_user, err := profile.GetUserByID(user.ID)

View File

@ -181,6 +181,14 @@ func GetUser(handle UserHandle) (User, error) {
} }
return session.GetUser(handle) return session.GetUser(handle)
} }
// Calls API#GetUserByID and returns the parsed result
func GetUserByID(u_id UserID) (User, error) {
session, err := NewGuestSession() // This endpoint works better if you're not logged in
if err != nil {
return User{}, err
}
return session.GetUserByID(u_id)
}
/** /**
* Make a filename for the profile image, that hopefully won't clobber other ones * Make a filename for the profile image, that hopefully won't clobber other ones