Skip to content
user.go 1.03 KiB
Newer Older
Lo^2's avatar
Lo^2 committed
package model

import (
	"code.electrolab.fr/it/vote.electrolab.fr/service/db"
	"context"
	"crypto/sha256"
	"database/sql"
	"encoding/hex"
	"fmt"
	"time"
)

type User struct {
	Uuid         string
	PublicToken  string
	PrivateToken string
	Fullname     string
	Email        string
	Admin        bool
	CreatedAt    time.Time
}

func FetchUser(ctx context.Context, db db.Service, privateToken string) (*User, error) {
	var err error

	user := new(User)
	user.PrivateToken = privateToken

	privateTokenSha := sha256.Sum256([]byte(user.PrivateToken))
	user.PublicToken = hex.EncodeToString(privateTokenSha[:])

	q := `
		SELECT
			uuid,
			public_token,
			fullname,
			email,
			admin,
			created_at
		FROM users
		WHERE
			public_token = $1
	`
	err = db.QueryRowContext(ctx, q, user.PublicToken).Scan(
		&user.Uuid,
		&user.PublicToken,
		&user.Fullname,
		&user.Email,
		&user.Admin,
		&user.CreatedAt,
	)
	if err != nil {
		if err == sql.ErrNoRows {
			return nil, nil
		} else {
			return nil, fmt.Errorf("Query error: %w", err)
		}
	}

	return user, nil
}