diff options
-rw-r--r-- | persistence/sqlite/sqliteRepository.go | 54 |
1 files changed, 52 insertions, 2 deletions
diff --git a/persistence/sqlite/sqliteRepository.go b/persistence/sqlite/sqliteRepository.go index 7b66c80..0ae7132 100644 --- a/persistence/sqlite/sqliteRepository.go +++ b/persistence/sqlite/sqliteRepository.go @@ -3,6 +3,7 @@ package sqlite import ( "context" "database/sql" + "fmt" "log" "os" @@ -85,8 +86,57 @@ func (repo *sqliteRepository) GetUnconfirmedRegistrations() ([]*registration.Reg } func (repo *sqliteRepository) ConfirmRegistration(registrationId string) (*registration.Registration, error) { - repo.checkInit() - panic("not implemented") // TODO: Implement + db, err := repo.checkInit() + + if err != nil { + return nil, err + } + defer db.Close() + + transaction, err := db.BeginTx(repo.context, nil) + if err != nil { + return nil, err + } + defer transaction.Rollback() + + updateRes, err := transaction.Exec( + "UPDATE registrations SET confirmed=1 WHERE reg_id=? AND confirmed=0", + registrationId) + + if err != nil { + return nil, err + } + count, err := updateRes.RowsAffected() + switch { + case err != nil: + return nil, err + case count == 0: + return nil, sql.ErrNoRows + case count > 1: + newError := fmt.Errorf("more than one result for registration ID %v", registrationId) + return nil, newError + } + transaction.Commit() + + queryRes := db.QueryRowContext( + repo.context, + `SELECT reg_id, first_name, last_name, email, company, training_code, date, privacy_policy_accepted + FROM registrations + WHERE reg_id=? + `, + registrationId) + + reg, err := rowToRegistration(queryRes) + // Not included in result set + reg.Confirmed = true + switch { + // case err == sql.ErrNoRows: + // return nil, err + case err != nil: + return nil, err + default: + return reg, nil + } } func (repo *sqliteRepository) checkInit() (*sql.DB, error) { |