Files
smt/models/safe.go
Nathan Coad 73c487fd3d
All checks were successful
continuous-integration/drone/push Build is passing
different test
2024-01-11 09:35:19 +11:00

150 lines
4.2 KiB
Go

package models
import (
"errors"
"log"
"smt/utils"
)
type Safe struct {
SafeId int `db:"SafeId" json:"safeId"`
SafeName string `db:"SafeName" json:"safeName"`
}
// SafeGetByName queries the database for the specified safe name
func SafeGetByName(safename string) (Safe, error) {
var s Safe
// Query database for matching group object
err := db.QueryRowx("SELECT * FROM safes WHERE SafeName=?", safename).StructScan(&s)
if err != nil {
return s, errors.New("safe not found")
}
return s, nil
}
// SafeList returns a list of all safes in database
func SafeList() ([]Safe, error) {
var results []Safe
// Query database for safes
rows, err := db.Queryx("SELECT * FROM safes")
if err != nil {
log.Printf("SafeList error executing sql record : '%s'\n", err)
return results, err
} else {
// parse all the results into a slice
for rows.Next() {
var s Safe
err = rows.StructScan(&s)
if err != nil {
log.Printf("SafeList error parsing sql record : '%s'\n", err)
return results, err
}
results = append(results, s)
}
log.Printf("SafeList retrieved '%d' results\n", len(results))
}
return results, nil
}
// SafeList returns a list of safes in database that a user has access to
func SafeListAllowed(userId int) ([]Safe, error) {
var results []Safe
// Query database for safes
rows, err := db.Queryx(`
SELECT safes.* FROM safes INNER JOIN permissions ON safes.SafeId = permissions.SafeId INNER JOIN users ON users.GroupId = permissions.GroupId WHERE users.UserId = ?
UNION
SELECT safes.* FROM safes INNER JOIN permissions ON safes.SafeId = permissions.SafeId INNER JOIN users ON users.UserId = permissions.UserId WHERE users.UserId = ?
`, userId, userId)
if err != nil {
log.Printf("SafeListAllowed error executing sql record : '%s'\n", err)
return results, err
} else {
// parse all the results into a slice
for rows.Next() {
var s Safe
err = rows.StructScan(&s)
if err != nil {
log.Printf("SafeListAllowed error parsing sql record : '%s'\n", err)
return results, err
}
results = append(results, s)
debugPrint := utils.PrintStructContents(&s, 0)
log.Printf("SafeListAllowed adding record :\n%s\n", debugPrint)
}
log.Printf("SafeListAllowed retrieved '%d' results\n", len(results))
}
return results, nil
}
// SafeAdd adds a new safe definition to the database
func (s *Safe) SafeAdd() (*Safe, error) {
var err error
// Validate group not already in use
_, err = SafeGetByName(s.SafeName)
if err != nil && err.Error() == "safe not found" {
log.Printf("SafeAdd confirmed no existing safe, continuing with creation of safe '%s'\n", s.SafeName)
result, err := db.NamedExec(("INSERT INTO safes (SafeName) VALUES (:SafeName) RETURNING SafeId;"), s)
//err = db.QueryRowx(`INSERT INTO users (user_id, user_nme, user_email, user_address_id) VALUES ($1, $2, $3, $4) RETURNING *;`, 6, fake.UserName(), fake.EmailAddress(), lastInsertId).StructScan(&user)
if err != nil {
log.Printf("SafeAdd error executing sql record : '%s'\n", err)
return &Safe{}, err
} else {
affected, _ := result.RowsAffected()
id, _ := result.LastInsertId()
log.Printf("SafeAdd insert returned result id '%d' affecting %d row(s).\n", id, affected)
log.Printf("safe: %v\n", s)
}
} else {
log.Printf("SafeAdd safe name already exists : '%v'\n", err)
}
return s, nil
}
// SafeDelete removes a safe definition from the database
func (s *Safe) SafeDelete() error {
var err error
// Validate group exists
safe, err := SafeGetByName(s.SafeName)
if err != nil && err.Error() == "safe not found" {
log.Printf("SafeDelete unable to validate safe exists : '%s'\n", err)
return err
}
// Make sure we have a safe ID
if s.SafeId == 0 {
s.SafeId = safe.SafeId
}
// Delete the safe
log.Printf("SafeDelete confirmed safe exists, continuing with deletion of safe '%s'\n", s.SafeName)
result, err := db.NamedExec((`DELETE FROM safes WHERE SafeId = :SafeId`), s)
if err != nil {
log.Printf("SafeDelete error executing sql delete : '%s'\n", err)
return err
} else {
affected, _ := result.RowsAffected()
id, _ := result.LastInsertId()
log.Printf("SafeDelete returned result id '%d' affecting %d row(s).\n", id, affected)
}
return nil
}