170 lines
4.8 KiB
Go
170 lines
4.8 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strconv"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
// DeleteRoomHandler deletes a room based on an ID
|
|
func (s *Server) DeleteRoomHandler(c *fiber.Ctx) error {
|
|
roomID, err := c.ParamsInt("roomID")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
room, err := s.GetRoom(roomID)
|
|
if err != nil {
|
|
s.Log.Err(err).Msgf("Unable to fetch room with id: %d", roomID)
|
|
return err
|
|
}
|
|
err = s.DeleteRoom(room)
|
|
if err != nil {
|
|
s.Log.Err(err).Msgf("Unable to delete room with id: %d", roomID)
|
|
return err
|
|
}
|
|
return c.Status(fiber.StatusOK).SendString(fmt.Sprintf("Room Deleted! %d", roomID))
|
|
}
|
|
|
|
// GetRoomHandler returns a single room from an ID
|
|
func (s *Server) GetRoomHandler(c *fiber.Ctx) error {
|
|
roomID, err := c.ParamsInt("roomID")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
room, err := s.GetRoom(roomID)
|
|
if err != nil {
|
|
s.Log.Err(err).Msgf("Unable to fetch room with id: %d", roomID)
|
|
return err
|
|
}
|
|
return c.Status(fiber.StatusOK).JSON(room)
|
|
}
|
|
|
|
// AddNewRoomHandler adds a new room
|
|
func (s *Server) AddNewRoomHandler(c *fiber.Ctx) error {
|
|
locID, err := c.ParamsInt("locID")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
form, err := c.MultipartForm()
|
|
if err != nil {
|
|
s.Log.Err(err).Msgf("Unable to fetch new room form details: ", err)
|
|
return err
|
|
}
|
|
// Both of these should be required on frontend, so not checking them because I'm lazy
|
|
// TODO: Check to make sure these exist
|
|
roomName := form.Value["Name"][0]
|
|
roomPhoto := form.File["CoverPhoto"][0]
|
|
|
|
// Fetch the location information
|
|
loc, err := s.GetLocation(locID)
|
|
if err != nil {
|
|
s.Log.Err(err).Msgf("Unable to fetch location by id: %d with error: %s", locID, err)
|
|
return err
|
|
}
|
|
|
|
// Create the directory for this room to store the photos
|
|
err = os.MkdirAll(filepath.ToSlash(s.Config.Server.LocationFilesDir+"/"+loc.Name+"/"+roomName), 0755)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// setting the path prepend for the photos
|
|
urlPrepend := loc.Name + "/" + roomName + "/"
|
|
pathPrepend := s.Config.Server.LocationFilesDir + "/" + urlPrepend
|
|
|
|
// saving the uploaded image to our images dir
|
|
coverImagePath := filepath.ToSlash(pathPrepend + roomName + "_cover" + filepath.Ext(roomPhoto.Filename))
|
|
err = c.SaveFile(roomPhoto, coverImagePath)
|
|
if err != nil {
|
|
s.Log.Err(err).Msgf("Unable to write file: %s to path: %s, encountered err: %s", roomPhoto.Filename, coverImagePath, err)
|
|
return err
|
|
}
|
|
// Creating the URL to retrieve photo
|
|
coverImageURL := urlPrepend + roomName + "_cover" + filepath.Ext(roomPhoto.Filename)
|
|
|
|
var photoURLsList []string
|
|
if roomAdditionalPhotos := form.File["AdditionalPhotos"]; len(roomAdditionalPhotos) > 0 {
|
|
for i, photo := range roomAdditionalPhotos {
|
|
photoPath := filepath.ToSlash(pathPrepend + roomName + "_" + strconv.Itoa(i) + filepath.Ext(photo.Filename))
|
|
photoURL := urlPrepend + roomName + "_" + strconv.Itoa(i) + filepath.Ext(photo.Filename)
|
|
photoURLsList = append(photoURLsList, photoURL)
|
|
err = c.SaveFile(photo, photoPath)
|
|
if err != nil {
|
|
s.Log.Err(err).Msgf("Unable to write photo: %s to path: %s, encountered err: %s", photo.Filename, photoPath, err)
|
|
return err
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
// Parse all the other fields
|
|
roomNotes := ""
|
|
roomNotes = form.Value["Notes"][0]
|
|
|
|
description := ""
|
|
description = form.Value["Description"][0]
|
|
|
|
squareFeet := ""
|
|
squareFeet = form.Value["SquareFeet"][0]
|
|
|
|
squareFeetInt, err := strconv.ParseInt(squareFeet, 10, 64)
|
|
if err != nil {
|
|
s.Log.Err(err).Msgf("Unable to parse Square feet, input: %s error: %s", squareFeet, err)
|
|
}
|
|
|
|
paint := ""
|
|
paint = form.Value["Paint"][0]
|
|
|
|
newRoom := Room{
|
|
Name: roomName,
|
|
Description: description,
|
|
SquareFeet: int(squareFeetInt),
|
|
Paint: paint,
|
|
CoverPhoto: coverImageURL,
|
|
Photos: photoURLsList,
|
|
Notes: roomNotes,
|
|
LocationID: locID,
|
|
LocationName: loc.Name,
|
|
}
|
|
err = s.AddRoom(newRoom)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
roomList := loc.Rooms
|
|
roomList = append(roomList, newRoom)
|
|
|
|
err = s.Database.UpdateField(&Location{ID: locID}, "Rooms", roomList)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
s.Log.Debug().Msgf("Adding new Room: %v", newRoom)
|
|
return c.Status(fiber.StatusOK).SendString(fmt.Sprintf("New Room Created! %s", newRoom.Name))
|
|
}
|
|
|
|
// GetAllRoomsHandler gets all of the rooms in the db
|
|
func (s *Server) GetAllRoomsHandler(c *fiber.Ctx) error {
|
|
rooms, err := s.GetAllRooms()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return c.Status(fiber.StatusOK).JSON(rooms)
|
|
}
|
|
|
|
// GetRoomsAtLocationHandler gets rooms at a location
|
|
func (s *Server) GetRoomsAtLocationHandler(c *fiber.Ctx) error {
|
|
locID, err := c.ParamsInt("locID")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
rooms, err := s.GetRoomsAtLocation(locID)
|
|
fmt.Println("ROOMS: ", rooms)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return c.Status(fiber.StatusOK).JSON(rooms)
|
|
}
|