package models import ( "database/sql" "errors" ) type VoteModelInterface interface { Insert(voterIdentity string, electionId int, choiceText string, tokens int) (int, error) Exists(voterIdentity string, electionID int) (bool, error) } type VoteModel struct { DB *sql.DB } func (v *VoteModel) Insert(voterIdentity string, electionId int, choiceText string, tokens int) (int, error) { tx, err := v.DB.Begin() if err != nil { return 0, err } defer tx.Rollback() result, err := tx.Exec(` INSERT INTO votes (voter_identity, election_id, choice_text, tokens) VALUES (?, ?, ?, ?)`, voterIdentity, electionId, choiceText, tokens) if err != nil { return 0, err } if err = tx.Commit(); err != nil { return 0, err } voteId, err := result.LastInsertId() return int(voteId), nil } func (v *VoteModel) Exists(voterIdentity string, electionID int) (bool, error) { var exists bool query := ` SELECT EXISTS ( SELECT 1 FROM votes WHERE voter_identity = ? AND election_id = ? ) ` err := v.DB.QueryRow(query, voterIdentity, electionID).Scan(&exists) if err != nil { if errors.Is(sql.ErrNoRows, err) { return false, nil } return false, err } return exists, nil }