287 lines
8.6 KiB
Go
287 lines
8.6 KiB
Go
package main
|
|
|
|
import (
|
|
"path/filepath"
|
|
|
|
"github.com/asdine/storm/v3"
|
|
)
|
|
|
|
// Location Routes
|
|
|
|
//SetupDatabase initializes the storm/bbolt database
|
|
func SetupDatabase(s *Server) (db *storm.DB) {
|
|
db, err := storm.Open(filepath.Clean("./app/database/goInventorize.db"))
|
|
if err != nil {
|
|
s.Log.Fatal().Msgf("Unable to create/open database! %s", err)
|
|
}
|
|
return db
|
|
}
|
|
|
|
// AddLocation adds a location to the database
|
|
func (s *Server) AddLocation(loc Location) error {
|
|
s.Log.Info().Msgf("Adding new location to database: ", loc)
|
|
err := s.Database.Save(&loc)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to add new location to database: %s error: %s ", loc, err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// DeleteLocation deletes a location by ID
|
|
func (s *Server) DeleteLocation(loc Location) error {
|
|
s.Log.Info().Msgf("Deleting location from database: ", loc)
|
|
err := s.Database.DeleteStruct(&loc)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to delete location from database: %s error: %s ", loc, err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// GetLocations fetches all of the locations from the database
|
|
func (s *Server) GetLocations() (locations []Location, err error) {
|
|
err = s.Database.All(&locations)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to fetch all locations: %s", err)
|
|
return nil, err
|
|
}
|
|
return locations, nil
|
|
}
|
|
|
|
// GetLocation fetches a single location
|
|
func (s *Server) GetLocation(locID int) (location Location, err error) {
|
|
err = s.Database.One("ID", locID, &location)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to fetch all rooms at location: %s", err)
|
|
return location, err
|
|
}
|
|
return location, nil
|
|
}
|
|
|
|
// Room Routes
|
|
|
|
// AddRoom adds a room to a location
|
|
func (s *Server) AddRoom(room Room) error {
|
|
s.Log.Info().Msgf("Adding new room to location: %s", room)
|
|
err := s.Database.Save(&room)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to add new room to database: %s error: %s", room, err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// DeleteRoom deletes a room
|
|
func (s *Server) DeleteRoom(room Room) error {
|
|
s.Log.Info().Msgf("Deleting room from database: %s", room)
|
|
err := s.Database.DeleteStruct(&room)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to delete location from database: %s error: %s ", room, err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// GetAllRooms gets all of the rooms
|
|
func (s *Server) GetAllRooms() (rooms []Room, err error) {
|
|
s.Log.Info().Msg("Getting all Rooms")
|
|
err = s.Database.All(&rooms)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to fetch all room with error: %s", err)
|
|
return rooms, err
|
|
}
|
|
return rooms, nil
|
|
}
|
|
|
|
// GetRoom gets a room based on id
|
|
func (s *Server) GetRoom(roomID int) (room Room, err error) {
|
|
s.Log.Info().Msgf("Fetching room with id: %d", roomID)
|
|
err = s.Database.One("ID", roomID, &room)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to fetch room with id: %d with error: %s", roomID, err)
|
|
return room, err
|
|
}
|
|
return room, nil
|
|
}
|
|
|
|
// GetRoomsAtLocation fetches all the rooms assigned to a location by location ID
|
|
func (s *Server) GetRoomsAtLocation(locID int) (rooms []Room, err error) {
|
|
err = s.Database.Find("LocationID", locID, &rooms)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to fetch all rooms at location: %s", err)
|
|
return nil, err
|
|
}
|
|
return rooms, nil
|
|
}
|
|
|
|
// Cabinet ROUTES
|
|
|
|
// AddCabinet adds a new cabinet
|
|
func (s *Server) AddCabinet(cabinet Cabinet) error {
|
|
s.Log.Info().Msgf("Adding new cabinet to room: %s", cabinet)
|
|
err := s.Database.Save(&cabinet)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to add new cabinet to database: %s error: %s", cabinet, err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// DeleteCabinet deletes a cabinet
|
|
func (s *Server) DeleteCabinet(cabinet Cabinet) error {
|
|
s.Log.Info().Msgf("Deleting cabinet from database: %s", cabinet)
|
|
err := s.Database.DeleteStruct(&cabinet)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to delete room from database: %s error: %s ", cabinet, err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// GetAllCabinets gets all of the cabinets
|
|
func (s *Server) GetAllCabinets() (cabinets []Cabinet, err error) {
|
|
s.Log.Info().Msg("Getting all Cabinets")
|
|
err = s.Database.All(&cabinets)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to fetch all cabinet with error: %s", err)
|
|
return cabinets, err
|
|
}
|
|
return cabinets, nil
|
|
}
|
|
|
|
// GetCabinet gets a cabinet based on id
|
|
func (s *Server) GetCabinet(cabinetID int) (cabinet Cabinet, err error) {
|
|
s.Log.Info().Msgf("Fetching cabinet with id: %d", cabinetID)
|
|
err = s.Database.One("ID", cabinetID, &cabinet)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to fetch cabinet with id: %d with error: %s", cabinetID, err)
|
|
return cabinet, err
|
|
}
|
|
return cabinet, nil
|
|
}
|
|
|
|
// GetCabinetsInRoom fetches all of the cabinets assigned to a room
|
|
func (s *Server) GetCabinetsAtRoom(roomID int) (cabinets []Cabinet, err error) {
|
|
err = s.Database.Find("Room", roomID, &cabinets)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to fetch all cabinets in room: %s", err)
|
|
return nil, err
|
|
}
|
|
return cabinets, nil
|
|
}
|
|
|
|
// ITEM ROUTES
|
|
|
|
// GetItem gets an item by id
|
|
func (s *Server) GetItem(itemID int) (item Item, err error) {
|
|
s.Log.Info().Msgf("Fetching item with id: %d", itemID)
|
|
err = s.Database.One("ID", itemID, &item)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to fetch item with id: %d with error: %s", itemID, err)
|
|
return item, err
|
|
}
|
|
return item, nil
|
|
}
|
|
|
|
// GetAllItems gets all of the items
|
|
func (s *Server) GetAllItems() (items []Item, err error) {
|
|
s.Log.Info().Msg("Getting all Items")
|
|
err = s.Database.All(&items)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to fetch all items with error: %s", err)
|
|
return items, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
// GetItemsInRoom fetches all of the items assigned to a room
|
|
func (s *Server) GetItemsInRoom(roomID int) (items []Item, err error) {
|
|
err = s.Database.Find("Room", roomID, &items)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to fetch all items in room: %s", err)
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
// GetItemsInRoom fetches all of the items assigned to a room
|
|
func (s *Server) GetItemsInCabinet(cabinetID int) (items []Item, err error) {
|
|
err = s.Database.Find("Cabinet", cabinetID, &items)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to fetch all items in cabinet: %s", err)
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
// AddItem adds an item to a room
|
|
func (s *Server) AddItem(item Item) error {
|
|
s.Log.Info().Msgf("Adding new item to room: ", item)
|
|
err := s.Database.Save(&item)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to add new item to room: %s error: %s", item, err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// DeleteItem deletes an item
|
|
func (s *Server) DeleteItem(item Item) error {
|
|
s.Log.Info().Msgf("Deleting Item from database: %s", item)
|
|
err := s.Database.DeleteStruct(&item)
|
|
if err != nil {
|
|
s.Log.Error().Msgf("Unable to delete location from database: %s error: %s ", item, err)
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Misc calls
|
|
|
|
type SearchResults struct {
|
|
Locations []Location `json:"locations"`
|
|
Rooms []Room `json:"rooms"`
|
|
Cabinets []Cabinet `json:"cabinets"`
|
|
Items []Item `json:"items"`
|
|
}
|
|
|
|
// SearchAllByField searches the entire database (locs, rooms, cabinets, items) by the field and search term passed in
|
|
func (s *Server) SearchAllByField(fieldFilter string, searchTerm string) (results SearchResults, err error) {
|
|
s.Log.Info().Msgf("Searching all items for term: %s", searchTerm)
|
|
var locs []Location
|
|
var rooms []Room
|
|
var cabinets []Cabinet
|
|
var items []Item
|
|
results = SearchResults{}
|
|
|
|
err = s.Database.Find(fieldFilter, searchTerm, &locs)
|
|
if err != nil && err != storm.ErrNotFound {
|
|
s.Log.Error().Msgf("Unable to search locations in database with term: %s :error: %s ", searchTerm, err)
|
|
return results, err
|
|
}
|
|
err = s.Database.Find(fieldFilter, searchTerm, &rooms)
|
|
if err != nil && err != storm.ErrNotFound {
|
|
s.Log.Error().Msgf("Unable to search rooms in database with term: %s error: %s ", searchTerm, err)
|
|
return results, err
|
|
}
|
|
err = s.Database.Find(fieldFilter, searchTerm, &cabinets)
|
|
if err != nil && err != storm.ErrNotFound {
|
|
s.Log.Error().Msgf("Unable to search cabinets in database with term: %s error: %s ", searchTerm, err)
|
|
return results, err
|
|
}
|
|
err = s.Database.Find(fieldFilter, searchTerm, &items)
|
|
if err != nil && err != storm.ErrNotFound {
|
|
s.Log.Error().Msgf("Unable to search items in database with term: %s error: %s ", searchTerm, err)
|
|
return results, err
|
|
}
|
|
|
|
results.Locations = locs
|
|
results.Rooms = rooms
|
|
results.Cabinets = cabinets
|
|
results.Items = items
|
|
|
|
return results, nil
|
|
|
|
}
|