chore(webui): prepare lock code for webui force unlock
Some checks failed
main / main (push) Failing after 20s
main / deploy (push) Has been skipped
main / publish (push) Has been skipped

#13
This commit is contained in:
Julien Dessaux 2025-05-02 00:26:32 +02:00
parent 0a63e1f593
commit 8f17a3661e
Signed by: adyxax
GPG key ID: F92E51B86E07177E
10 changed files with 135 additions and 49 deletions

View file

@ -2,6 +2,7 @@ package database
import (
"database/sql"
"encoding/json"
"errors"
"fmt"
"time"
@ -17,14 +18,16 @@ func (db *DB) LoadVersionById(id uuid.UUID) (*model.Version, error) {
var (
created int64
encryptedData []byte
lock []byte
)
err := db.QueryRow(
`SELECT account_id, state_id, data, lock, created FROM versions WHERE id = ?;`,
`SELECT account_id, state_id, data, json_extract(lock, '$'), created
FROM versions WHERE id = ?;`,
id).Scan(
&version.AccountId,
&version.StateId,
&encryptedData,
&version.Lock,
&lock,
&created)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
@ -32,6 +35,9 @@ func (db *DB) LoadVersionById(id uuid.UUID) (*model.Version, error) {
}
return nil, fmt.Errorf("failed to load version id %s from database: %w", id, err)
}
if err := json.Unmarshal(lock, &version.Lock); err != nil {
return nil, fmt.Errorf("failed to unmarshal lock data: %w", err)
}
version.Created = time.Unix(created, 0)
version.Data, err = db.dataEncryptionKey.DecryptAES256(encryptedData)
if err != nil {
@ -42,7 +48,7 @@ func (db *DB) LoadVersionById(id uuid.UUID) (*model.Version, error) {
func (db *DB) LoadVersionsByState(state *model.State) ([]model.Version, error) {
rows, err := db.Query(
`SELECT account_id, created, data, id, lock
`SELECT account_id, created, data, id, json_extract(lock, '$')
FROM versions
WHERE state_id = ?
ORDER BY id DESC;`, state.Id)
@ -54,10 +60,14 @@ func (db *DB) LoadVersionsByState(state *model.State) ([]model.Version, error) {
for rows.Next() {
version := model.Version{StateId: state.Id}
var created int64
err = rows.Scan(&version.AccountId, &created, &version.Data, &version.Id, &version.Lock)
var lock []byte
err = rows.Scan(&version.AccountId, &created, &version.Data, &version.Id, &lock)
if err != nil {
return nil, fmt.Errorf("failed to load version from row: %w", err)
}
if err := json.Unmarshal(lock, &version.Lock); err != nil {
return nil, fmt.Errorf("failed to unmarshal lock data: %w", err)
}
version.Created = time.Unix(created, 0)
versions = append(versions, version)
}
@ -69,7 +79,7 @@ func (db *DB) LoadVersionsByState(state *model.State) ([]model.Version, error) {
func (db *DB) LoadVersionsByAccount(account *model.Account) ([]model.Version, error) {
rows, err := db.Query(
`SELECT created, data, id, lock, state_id
`SELECT created, data, id, json_extract(lock, '$'), state_id
FROM versions
WHERE account_id = ?
ORDER BY id DESC;`, account.Id)
@ -81,10 +91,16 @@ func (db *DB) LoadVersionsByAccount(account *model.Account) ([]model.Version, er
for rows.Next() {
version := model.Version{AccountId: account.Id}
var created int64
err = rows.Scan(&created, &version.Data, &version.Id, &version.Lock, &version.StateId)
var lock []byte
err = rows.Scan(&created, &version.Data, &version.Id, &lock, &version.StateId)
if err != nil {
return nil, fmt.Errorf("failed to load version from row: %w", err)
}
if lock != nil {
if err := json.Unmarshal(lock, &version.Lock); err != nil {
return nil, fmt.Errorf("failed to unmarshal lock data: %w", err)
}
}
version.Created = time.Unix(created, 0)
versions = append(versions, version)
}