2021-01-02 12:09:16 +01:00
|
|
|
package db
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/google/uuid"
|
|
|
|
)
|
|
|
|
|
|
|
|
// AccountCreate writes a user to database
|
|
|
|
func (d Db) AccountCreate(input AccountCreateInput) (CreatedAccount, error) {
|
2021-01-03 18:21:42 +01:00
|
|
|
accountSQL := "INSERT INTO accounts (id, name, \"apiKey\", password) VALUES($1,$2,$3,$4);"
|
2021-01-02 12:09:16 +01:00
|
|
|
|
2021-01-03 18:21:42 +01:00
|
|
|
_, err := d.DbPool.Exec(context.Background(), accountSQL, input.ID, input.Name, input.APIKey, input.Password)
|
2021-01-02 12:09:16 +01:00
|
|
|
if err != nil {
|
|
|
|
if strings.HasPrefix(err.Error(), "ERROR: duplicate key") {
|
2021-06-22 22:52:48 +02:00
|
|
|
d.Log.Debug("Duplicate name in accounts database", "name", input.Name)
|
2021-01-02 12:09:16 +01:00
|
|
|
} else {
|
2021-06-22 22:52:48 +02:00
|
|
|
d.Log.Error("Database error when trying to add account", "err", err.Error())
|
2021-01-02 12:09:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return CreatedAccount{}, err
|
|
|
|
}
|
|
|
|
|
2021-06-22 22:52:48 +02:00
|
|
|
d.Log.Info("Added account to database", "id", input.ID, "name", input.Name)
|
2021-01-02 12:09:16 +01:00
|
|
|
|
|
|
|
accountFieldsSQL := "INSERT INTO \"accountsFields\" (id, \"accountId\", name, value) VALUES($1,$2,$3,$4);"
|
|
|
|
for _, field := range input.Fields {
|
|
|
|
newFieldID, uuidErr := uuid.NewRandom()
|
|
|
|
if uuidErr != nil {
|
2021-06-22 22:52:48 +02:00
|
|
|
d.Log.Fatal("Could not create new Uuid", "err", uuidErr.Error())
|
2021-01-02 12:09:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
_, err := d.DbPool.Exec(context.Background(), accountFieldsSQL, newFieldID, input.ID, field.Name, field.Values)
|
|
|
|
if err != nil {
|
|
|
|
if strings.HasPrefix(err.Error(), "ERROR: duplicate key") {
|
2021-06-22 22:52:48 +02:00
|
|
|
d.Log.Error("Database error when trying to account field", "err", err.Error())
|
2021-01-02 12:09:16 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-22 22:52:48 +02:00
|
|
|
d.Log.Debug("Added account field", "accountId", input.ID, "fieldName", field.Name, "fieldValues", field.Values)
|
2021-01-02 12:09:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return CreatedAccount{
|
2021-01-03 18:21:42 +01:00
|
|
|
ID: input.ID,
|
|
|
|
Name: input.Name,
|
|
|
|
APIKey: input.APIKey,
|
2021-01-02 12:09:16 +01:00
|
|
|
}, nil
|
|
|
|
}
|
2021-01-03 18:21:42 +01:00
|
|
|
|
|
|
|
// AccountGet fetches an account from the database
|
2021-01-05 16:23:18 +01:00
|
|
|
func (d Db) AccountGet(accountID string, APIKey string, Name string) (Account, error) {
|
2021-06-22 22:52:48 +02:00
|
|
|
d.Log.Debug("Trying to get account", "accountID", accountID, "len(APIKey)", len(APIKey))
|
2021-01-03 18:21:42 +01:00
|
|
|
|
|
|
|
var account Account
|
|
|
|
var searchParam string
|
|
|
|
accountSQL := "SELECT id, created, name, \"password\" FROM accounts WHERE "
|
|
|
|
if accountID != "" {
|
|
|
|
accountSQL = accountSQL + "id = $1"
|
|
|
|
searchParam = accountID
|
|
|
|
} else if APIKey != "" {
|
|
|
|
accountSQL = accountSQL + "\"apiKey\" = $1"
|
|
|
|
searchParam = APIKey
|
2021-01-05 16:23:18 +01:00
|
|
|
} else if Name != "" {
|
|
|
|
accountSQL = accountSQL + "name = $1"
|
|
|
|
searchParam = Name
|
2021-01-03 18:21:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
accountErr := d.DbPool.QueryRow(context.Background(), accountSQL, searchParam).Scan(&account.ID, &account.Created, &account.Name, &account.Password)
|
|
|
|
if accountErr != nil {
|
|
|
|
if accountErr.Error() == "no rows in result set" {
|
2021-06-22 22:52:48 +02:00
|
|
|
d.Log.Debug("No account found", "accountID", accountID, "APIKey", len(APIKey))
|
2021-01-03 18:21:42 +01:00
|
|
|
return Account{}, accountErr
|
|
|
|
}
|
|
|
|
|
2021-06-22 22:52:48 +02:00
|
|
|
d.Log.Error("Database error when fetching account", "err", accountErr.Error(), "accountID", accountID, "APIKey", len(APIKey))
|
2021-01-03 18:21:42 +01:00
|
|
|
return Account{}, accountErr
|
|
|
|
}
|
|
|
|
|
|
|
|
fieldsSQL := "SELECT name, value FROM \"accountsFields\" WHERE \"accountId\" = $1"
|
|
|
|
rows, fieldsErr := d.DbPool.Query(context.Background(), fieldsSQL, account.ID)
|
|
|
|
if fieldsErr != nil {
|
2021-06-22 22:52:48 +02:00
|
|
|
d.Log.Error("Database error when fetching account fields", "err", accountErr.Error(), "accountID", accountID, "APIKey", len(APIKey))
|
2021-01-03 18:21:42 +01:00
|
|
|
return Account{}, fieldsErr
|
|
|
|
}
|
|
|
|
|
|
|
|
account.Fields = make(map[string][]string)
|
|
|
|
for rows.Next() {
|
|
|
|
var name string
|
|
|
|
var value []string
|
|
|
|
err := rows.Scan(&name, &value)
|
|
|
|
if err != nil {
|
2021-06-22 22:52:48 +02:00
|
|
|
d.Log.Error("Could not get name or value from database row", "err", err.Error(), "accountID", accountID, "APIKey", len(APIKey))
|
2021-01-03 18:21:42 +01:00
|
|
|
return Account{}, err
|
|
|
|
}
|
|
|
|
account.Fields[name] = value
|
|
|
|
}
|
|
|
|
|
|
|
|
return account, nil
|
|
|
|
}
|