package main import ( "context" "atlas9.dev/c/core" "atlas9.dev/c/core/dbi" "atlas9.dev/c/core/iam" ) type SqliteUserStore struct { db dbi.DBI } var _ iam.UserStore = (*SqliteUserStore)(nil) func NewSqliteUserStore(db dbi.DBI) *SqliteUserStore { return &SqliteUserStore{db: db} } func (s *SqliteUserStore) Save(ctx context.Context, user *iam.User) (bool, error) { if user.ID.IsZero() { user.ID = core.NewID() } res, err := s.db.Exec(ctx, ` INSERT INTO users (id, email) VALUES ($1, $2) ON CONFLICT (email) DO NOTHING `, user.ID, user.Email) if err != nil { return false, err } n, err := res.RowsAffected() if err != nil { return false, err } created := n > 0 if !created { // emails are unique, so if there's a conflict on email, fetch the existing ID. err = dbi.Get(ctx, s.db, &user, `SELECT id FROM users WHERE email = $1`, user.Email) } return created, err } func (s *SqliteUserStore) GetByEmail(ctx context.Context, email string) (*iam.User, error) { var user iam.User err := dbi.Get(ctx, s.db, &user, `SELECT id, email FROM users WHERE email = $1`, email) return &user, err } func (s *SqliteUserStore) Get(ctx context.Context, id core.ID) (*iam.User, error) { var user iam.User err := dbi.Get(ctx, s.db, &user, `SELECT id, email FROM users WHERE id = $1`, id) return &user, err }