package main import ( "fmt" "io" "os" "path/filepath" "strconv" "github.com/gofiber/fiber/v2" ) // GetServeConfig fetches the server configuration func (s *Server) GetServerConfig(c *fiber.Ctx) error { fmt.Println("SENDING CONFIG!") return c.Status(fiber.StatusOK).JSON(fiber.Map{"BasicAuth": s.Config.Authentication.BasicAuth, "Timezone": s.Config.Timezone}) } // AddNewLocationHandler adds a new location func (s *Server) AddNewLocationHandler(c *fiber.Ctx) error { form, err := c.MultipartForm() if err != nil { s.Log.Err(err).Msgf("Unable to fetch locations: ", err) return err } locName := form.Value["Name"][0] locPhoto := form.File["CoverPhoto"][0] if err != nil { s.Log.Err(err).Msgf("Unable to get CoverPhoto for location: ", err) return err } locAdditionalPhotos := form.File["AdditionalPhotos"] // Create the directory for this location to store the photos err = os.MkdirAll(s.Config.Server.LocationPhotoDir+locName, 0755) if err != nil { return err } var photoURLsList []string for i, photo := range locAdditionalPhotos { src, err := photo.Open() if err != nil { return err } defer src.Close() photoPath := filepath.ToSlash(s.Config.Server.LocationPhotoDir + locName + "/" + locName + "_" + strconv.Itoa(i) + filepath.Ext(photo.Filename)) photoURL := locName + "_" + strconv.Itoa(i) + filepath.Ext(photo.Filename) photoURLsList = append(photoURLsList, photoURL) photoData, err := io.ReadAll(src) if err != nil { return err } os.WriteFile(photoPath, photoData, 0644) } // create files on server for all uploads locNotes := form.Value["Notes"][0] // saving the uploaded image to our images dir coverImagePath := filepath.ToSlash(s.Config.Server.LocationPhotoDir + locName + "/" + locName + "_cover" + filepath.Ext(locPhoto.Filename)) // Creating the URL to retrieve photo coverImageURL := locName + "_cover" + filepath.Ext(locPhoto.Filename) src, err := locPhoto.Open() if err != nil { return err } defer src.Close() coverImageData, err := io.ReadAll(src) if err != nil { s.Log.Err(err).Msgf("Unable to read cover photo file: ", err) return err } err = os.WriteFile(coverImagePath, coverImageData, 0644) if err != nil { return err } newLocation := Location{ Name: locName, CoverPhoto: coverImageURL, Photos: photoURLsList, Notes: locNotes, } err = s.AddLocation(newLocation) if err != nil { return err } s.Log.Debug().Msgf("Adding new location: %v", newLocation) return c.Status(fiber.StatusOK).SendString(fmt.Sprintf("New Location Created! %s", newLocation.Name)) } // GetAllLocationsHandler returns all locations func (s *Server) GetAllLocationsHandler(c *fiber.Ctx) error { locations, err := s.GetLocations() if err != nil { s.Log.Err(err).Msgf("Unable to fetch locations: ", err) return err } s.Log.Debug().Msgf("Returning Locations: %+v", locations) return c.Status(fiber.StatusOK).JSON(locations) } // GetSingleLocationHandler gets a single location by locationID func (s *Server) GetSingleLocationHandler(c *fiber.Ctx) error { locID, err := c.ParamsInt("locID") if err != nil { return err } location, err := s.GetLocation(locID) if err != nil { return err } fmt.Println("Returning A single location: ", location) return c.Status(fiber.StatusOK).JSON(location) } // DeleteLocationHandler deletes a location by locationID func (s *Server) DeleteLocationHandler(c *fiber.Ctx) error { locID, err := c.ParamsInt("locID") if err != nil { return err } location, err := s.GetLocation(locID) if err != nil { s.Log.Err(err).Msgf("Unable to fetch location with id: %d", locID) return err } err = s.DeleteLocation(location) if err != nil { s.Log.Err(err).Msgf("Unable to delete location with id: %d", locID) return err } return c.Status(fiber.StatusOK).SendString(fmt.Sprintf("Location Deleted! %d", locID)) }