package sql import ( "database/sql" "errors" "mangezmieux-backend/internal/postgres" "mangezmieux-backend/internal/users/model" "github.com/lib/pq" ) type SQLDao struct { client *sql.DB } func NewDao(client *sql.DB) Dao { return &SQLDao{client: client} } func (sqlDAO *SQLDao) FindByMailAndPassword(mail string, password string) (*model.User, error) { q := ` SELECT u.ID, u.first_name, u.last_name, u.creation_date, u.last_update_date FROM mangezmieux.user u WHERE u.email = $1 AND u.password = $2 ` row := sqlDAO.client.QueryRow(q, mail, password) u := model.User{} err := row.Scan(&u.Email, &u.Firstname, &u.Lastname, &u.CreatedAt, &u.UpdatedAt) var errPq *pq.Error if errors.As(err, &errPq) { return nil, postgres.HandlePgError(errPq) } if errors.Is(err, sql.ErrNoRows) { return nil, postgres.NewDAOError(postgres.ErrTypeNotFound, err) } return &u, err } func (sqlDAO *SQLDao) FindByMail(mail string) (*model.User, error) { q := ` SELECT u.ID, u.email, u.first_name, u.last_name, u.creation_date, u.last_update_date, u.password FROM mangezmieux.user u WHERE u.email = $1 ` row := sqlDAO.client.QueryRow(q, mail) u := model.User{} err := row.Scan(&u.ID, &u.Email, &u.Firstname, &u.Lastname, &u.CreatedAt, &u.UpdatedAt, &u.Password) var errPq *pq.Error if errors.As(err, &errPq) { return nil, postgres.HandlePgError(errPq) } if errors.Is(err, sql.ErrNoRows) { return nil, postgres.NewDAOError(postgres.ErrTypeNotFound, err) } return &u, err } func (sqlDAO *SQLDao) FindByID(id string) (*model.User, error) { q := ` SELECT u.ID, u.email, u.first_name, u.last_name, u.creation_date, u.last_update_date FROM mangezmieux.user u WHERE u.id = $1 ` row := sqlDAO.client.QueryRow(q, id) u := model.User{} err := row.Scan(&u.ID, &u.Email, &u.Firstname, &u.Lastname, &u.CreatedAt, &u.UpdatedAt) var errPq *pq.Error if errors.As(err, &errPq) { return nil, postgres.HandlePgError(errPq) } if errors.Is(err, sql.ErrNoRows) { return nil, postgres.NewDAOError(postgres.ErrTypeNotFound, err) } return &u, err } func (sqlDAO *SQLDao) Create(user *model.User) error { q := ` INSERT INTO mangezmieux.user (email, password, first_name, last_name, creation_date, last_update_date) VALUES ($1, $2, $3, $4, $5, $6) RETURNING id, creation_date ` err := sqlDAO.client. QueryRow(q, user.Email, user.Password, user.Firstname, user.Lastname, user.CreatedAt, user.UpdatedAt). Scan(&user.ID, &user.CreatedAt) var errPq *pq.Error if errors.As(err, &errPq) { return postgres.HandlePgError(errPq) } return err } func (sqlDAO *SQLDao) Delete(id string) error { q := ` DELETE FROM mangezmieux.user WHERE id = $1 ` _, err := sqlDAO.client.Exec(q, id) var errPq *pq.Error if errors.As(err, &errPq) { return postgres.HandlePgError(errPq) } return err }