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);"), s) 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) } } else { log.Printf("SafeAdd safe name already exists : '%v'\n", err) } return s, nil }