package services import ( "database/sql" "errors" "go-sjles-pta-vote/server/db" "go-sjles-pta-vote/server/models" ) var ErrQuestionAlreadyExists = errors.New("Question already exists") var ErrQuestionDoesntExist = errors.New("Question does not exist yet") func CreatePoll(poll *models.Poll) (*models.Poll, error) { new_poll := models.Poll{} db_conn, err := db.Connect() if err != nil { return nil, err } defer db.Close() get_stmt, err := db_conn.Prepare(` SELECT id FROM polls WHERE question == $1 `) if err != nil { return nil, err } defer get_stmt.Close() var id int err = get_stmt.QueryRow(poll.Question).Scan(&id) if err != sql.ErrNoRows { if err != nil { return nil, err } return nil, ErrQuestionAlreadyExists } stmt, err := db_conn.Prepare(` INSERT INTO polls ( question, expires_at ) VALUES ( $1, $2 ) RETURNING ID; `) if err != nil { return nil, err } defer stmt.Close() res, err := stmt.Exec(poll.Question, poll.ExpiresAt) if err != nil { return nil, err } new_poll.ID, err = res.LastInsertId() return &new_poll, err } func GetPollByQuestion(question string) (*models.Poll, error) { new_poll := models.Poll{} db_conn, err := db.Connect() if err != nil { return nil, err } defer db.Close() get_poll_stmt, err := db_conn.Prepare(` SELECT id, question, member_yes_votes, member_no_votes, non_member_yes_votes, non_member_no_votes, created_at, updated_at, expires_at FROM polls WHERE question == $1 `) if err != nil { return nil, err } defer get_poll_stmt.Close() err = get_poll_stmt.QueryRow(question).Scan( &new_poll.ID, &new_poll.Question, &new_poll.MemberYes, &new_poll.MemberNo, &new_poll.NonMemberYes, &new_poll.NonMemberNo, &new_poll.CreatedAt, &new_poll.UpdatedAt, &new_poll.ExpiresAt, ) if err == sql.ErrNoRows { return nil, ErrQuestionDoesntExist } else if err != nil { return nil, err } get_voters_stmt, err := db_conn.Prepare (` SELECT voter_email FROM voters WHERE poll_id == $1 `) if err != nil { return nil, err } defer get_voters_stmt.Close() rows, err := get_voters_stmt.Query(new_poll.ID) for rows.Next() { var voter_email string err = rows.Scan(&voter_email) if err != nil { return nil, err } new_poll.WhoVoted = append(new_poll.WhoVoted, voter_email) } return &new_poll, nil }