2018-08-26 13:15:48 +02:00
|
|
|
//
|
|
|
|
// Copyright (c) 2018
|
|
|
|
// Mainflux
|
|
|
|
//
|
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
//
|
|
|
|
|
2018-03-11 18:06:01 +01:00
|
|
|
package postgres
|
|
|
|
|
|
|
|
import (
|
2019-07-18 15:01:09 +02:00
|
|
|
"context"
|
2018-05-11 01:00:10 +02:00
|
|
|
"database/sql"
|
|
|
|
|
2019-04-16 14:58:56 +02:00
|
|
|
"github.com/jmoiron/sqlx"
|
|
|
|
|
2018-03-11 18:06:01 +01:00
|
|
|
"github.com/lib/pq"
|
2018-05-10 23:53:25 +02:00
|
|
|
"github.com/mainflux/mainflux/users"
|
2018-03-11 18:06:01 +01:00
|
|
|
)
|
|
|
|
|
2018-05-10 23:53:25 +02:00
|
|
|
var _ users.UserRepository = (*userRepository)(nil)
|
2018-03-11 18:06:01 +01:00
|
|
|
|
2018-05-11 01:00:10 +02:00
|
|
|
const errDuplicate = "unique_violation"
|
|
|
|
|
2018-03-11 18:06:01 +01:00
|
|
|
type userRepository struct {
|
2019-04-16 14:58:56 +02:00
|
|
|
db *sqlx.DB
|
2018-03-11 18:06:01 +01:00
|
|
|
}
|
|
|
|
|
2018-05-10 23:53:25 +02:00
|
|
|
// New instantiates a PostgreSQL implementation of user
|
2018-03-11 18:06:01 +01:00
|
|
|
// repository.
|
2019-04-16 14:58:56 +02:00
|
|
|
func New(db *sqlx.DB) users.UserRepository {
|
2018-03-11 18:06:01 +01:00
|
|
|
return &userRepository{db}
|
|
|
|
}
|
|
|
|
|
2019-07-18 15:01:09 +02:00
|
|
|
func (ur userRepository) Save(_ context.Context, user users.User) error {
|
2019-04-16 14:58:56 +02:00
|
|
|
q := `INSERT INTO users (email, password) VALUES (:email, :password)`
|
2018-05-11 01:00:10 +02:00
|
|
|
|
2019-04-16 14:58:56 +02:00
|
|
|
dbu := toDBUser(user)
|
|
|
|
if _, err := ur.db.NamedExec(q, dbu); err != nil {
|
2018-03-11 18:06:01 +01:00
|
|
|
if pqErr, ok := err.(*pq.Error); ok && errDuplicate == pqErr.Code.Name() {
|
2018-05-10 23:53:25 +02:00
|
|
|
return users.ErrConflict
|
2018-03-11 18:06:01 +01:00
|
|
|
}
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2019-07-18 15:01:09 +02:00
|
|
|
func (ur userRepository) RetrieveByID(_ context.Context, email string) (users.User, error) {
|
2018-05-11 01:00:10 +02:00
|
|
|
q := `SELECT password FROM users WHERE email = $1`
|
2018-03-11 18:06:01 +01:00
|
|
|
|
2019-04-16 14:58:56 +02:00
|
|
|
dbu := dbUser{
|
|
|
|
Email: email,
|
|
|
|
}
|
|
|
|
if err := ur.db.QueryRowx(q, email).StructScan(&dbu); err != nil {
|
2018-05-11 01:00:10 +02:00
|
|
|
if err == sql.ErrNoRows {
|
2019-04-16 14:58:56 +02:00
|
|
|
return users.User{}, users.ErrNotFound
|
2018-03-11 18:06:01 +01:00
|
|
|
}
|
2019-04-16 14:58:56 +02:00
|
|
|
return users.User{}, err
|
2018-03-11 18:06:01 +01:00
|
|
|
}
|
|
|
|
|
2019-04-16 14:58:56 +02:00
|
|
|
user := toUser(dbu)
|
2018-05-11 01:00:10 +02:00
|
|
|
|
2018-03-11 18:06:01 +01:00
|
|
|
return user, nil
|
|
|
|
}
|
2019-04-16 14:58:56 +02:00
|
|
|
|
|
|
|
type dbUser struct {
|
|
|
|
Email string `json:"email"`
|
|
|
|
Password string `json:"password"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func toDBUser(u users.User) dbUser {
|
|
|
|
return dbUser{
|
|
|
|
Email: u.Email,
|
|
|
|
Password: u.Password,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func toUser(dbu dbUser) users.User {
|
|
|
|
return users.User{
|
|
|
|
Email: dbu.Email,
|
|
|
|
Password: dbu.Password,
|
|
|
|
}
|
|
|
|
}
|