diff --git a/appview/db/profile.go b/appview/db/profile.go index fdc5d993..a2a8ead2 100644 --- a/appview/db/profile.go +++ b/appview/db/profile.go @@ -131,8 +131,6 @@ func monthsBetween(from, to time.Time) int { } func UpsertProfile(tx *sql.Tx, profile *models.Profile) error { - defer tx.Rollback() - // update links _, err := tx.Exec(`delete from profile_links where did = ?`, profile.Did) if err != nil { @@ -228,8 +226,7 @@ func UpsertProfile(tx *sql.Tx, profile *models.Profile) error { return err } } - - return tx.Commit() + return nil } func GetProfiles(e Execer, filters ...orm.Filter) (map[string]*models.Profile, error) { diff --git a/appview/ingester.go b/appview/ingester.go index efa86412..d9f5af83 100644 --- a/appview/ingester.go +++ b/appview/ingester.go @@ -347,6 +347,7 @@ func (i *Ingester) ingestProfile(e *jmodels.Event) error { if err != nil { return fmt.Errorf("failed to start transaction") } + defer tx.Rollback() err = db.ValidateProfile(tx, &profile) if err != nil { @@ -354,6 +355,11 @@ func (i *Ingester) ingestProfile(e *jmodels.Event) error { } err = db.UpsertProfile(tx, &profile) + if err != nil { + return fmt.Errorf("upserting profile: %w", err) + } + + err = tx.Commit() case jmodels.CommitOperationDelete: err = db.DeleteArtifact(i.Db, orm.FilterEq("did", did), orm.FilterEq("rkey", e.Commit.RKey)) } diff --git a/appview/state/profile.go b/appview/state/profile.go index 564ee1f8..aa9838bc 100644 --- a/appview/state/profile.go +++ b/appview/state/profile.go @@ -657,6 +657,14 @@ func (s *State) updateProfile(profile *models.Profile, w http.ResponseWriter, r s.pages.Notice(w, "update-profile", "Failed to update profile, try again later.") return } + defer tx.Rollback() + + err = db.UpsertProfile(tx, profile) + if err != nil { + log.Println("failed to update profile", err) + s.pages.Notice(w, "update-profile", "Failed to update profile, try again later.") + return + } client, err := s.oauth.AuthorizedClient(r) if err != nil { @@ -705,11 +713,10 @@ func (s *State) updateProfile(profile *models.Profile, w http.ResponseWriter, r return } - err = db.UpsertProfile(tx, profile) - if err != nil { - log.Println("failed to update profile", err) - s.pages.Notice(w, "update-profile", "Failed to update profile, try again later.") - return + if err := tx.Commit(); err != nil { + s.logger.Error("failed to commit transaction", "err", err) + // db failed, but PDS operation succeed. + // log error and continue } s.notifier.UpdateProfile(r.Context(), profile)