diff --git a/app/log/goInventorize.log b/app/log/goInventorize.log
index 0a05187..3071b82 100644
--- a/app/log/goInventorize.log
+++ b/app/log/goInventorize.log
@@ -80,3 +80,143 @@
{"level":"debug","time":"2021-12-27T21:40:29-05:00","message":"{Timezone:America/New_York Server:{Port:3500 LocationPhotoDir:./app/photos/locations/} Logger:{Level:debug LoggingFile:./app/log/goInventorize.log} Authentication:{BasicAuth:false UserName:admin Password:password} Development:false}"}
{"level":"info","time":"2021-12-27T21:40:29-05:00","message":"Database and Config loaded, starting webserver..."}
{"logtype":"webserver", "pid":"20308", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations/1"}
+{"level":"info","time":"2022-01-08T21:51:07-05:00","message":"Configuration loaded successfully..."}
+{"level":"debug","time":"2022-01-08T21:51:07-05:00","message":"{Timezone:America/New_York Server:{Port:3500 LocationPhotoDir:./app/photos/locations/} Logger:{Level:debug LoggingFile:./app/log/goInventorize.log} Authentication:{BasicAuth:false UserName:admin Password:password} Development:false}"}
+{"level":"info","time":"2022-01-08T21:51:07-05:00","message":"Database and Config loaded, starting webserver..."}
+{"logtype":"webserver", "pid":"22268", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"level":"debug","time":"2022-01-08T21:51:34-05:00","message":"Returning Locations: [{ID:1 Name:Location1 Description: CoverPhoto:./app/photos/locations/Location1/Location1_cover.png Photos:[./app/photos/locations/Location1/Location1_0.png ./app/photos/locations/Location1/Location1_1.png] Rooms:[] Notes:Notes for my location!}]"}
+{"logtype":"webserver", "pid":"22268", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations"}
+{"logtype":"webserver", "pid":"22268", "requestid":"", "status":"404", "method":"GET", "path":"/photos/locations/Location1/app/photos/locations/Location1/Location1_cover.png"}
+{"level":"info","time":"2022-01-08T21:53:50-05:00","message":"Deleting location from database: %!(EXTRA main.Location={1 Location1 ./app/photos/locations/Location1/Location1_cover.png [./app/photos/locations/Location1/Location1_0.png ./app/photos/locations/Location1/Location1_1.png] [] Notes for my location!})"}
+{"logtype":"webserver", "pid":"22268", "requestid":"", "status":"200", "method":"DELETE", "path":"/api/locations/1"}
+{"level":"info","time":"2022-01-08T21:58:01-05:00","message":"Configuration loaded successfully..."}
+{"level":"debug","time":"2022-01-08T21:58:01-05:00","message":"{Timezone:America/New_York Server:{Port:3500 LocationPhotoDir:./app/photos/locations/} Logger:{Level:debug LoggingFile:./app/log/goInventorize.log} Authentication:{BasicAuth:false UserName:admin Password:password} Development:false}"}
+{"level":"info","time":"2022-01-08T21:58:01-05:00","message":"Database and Config loaded, starting webserver..."}
+{"level":"info","time":"2022-01-08T21:58:07-05:00","message":"Adding new location to database: %!(EXTRA main.Location={0 Location1 Location1/Location1_cover.png [Location1/Location1_0.png Location1/Location1_1.png] [] Notes for my location!})"}
+{"level":"debug","time":"2022-01-08T21:58:07-05:00","message":"Adding new location: {0 Location1 Location1/Location1_cover.png [Location1/Location1_0.png Location1/Location1_1.png] [] Notes for my location!}"}
+{"logtype":"webserver", "pid":"7868", "requestid":"", "status":"200", "method":"POST", "path":"/api/locations/new"}
+{"level":"error","time":"2022-01-08T21:58:10-05:00","message":"Unable to fetch all rooms at location: not found"}
+{"logtype":"webserver", "pid":"7868", "requestid":"", "status":"500", "method":"GET", "path":"/api/locations/1"}
+{"level":"debug","time":"2022-01-08T21:58:18-05:00","message":"Returning Locations: [{ID:2 Name:Location1 Description: CoverPhoto:Location1/Location1_cover.png Photos:[Location1/Location1_0.png Location1/Location1_1.png] Rooms:[] Notes:Notes for my location!}]"}
+{"logtype":"webserver", "pid":"7868", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations"}
+{"level":"debug","time":"2022-01-08T21:58:30-05:00","message":"Returning Locations: [{ID:2 Name:Location1 Description: CoverPhoto:Location1/Location1_cover.png Photos:[Location1/Location1_0.png Location1/Location1_1.png] Rooms:[] Notes:Notes for my location!}]"}
+{"logtype":"webserver", "pid":"7868", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations"}
+{"logtype":"webserver", "pid":"7868", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"level":"debug","time":"2022-01-08T21:58:31-05:00","message":"Returning Locations: [{ID:2 Name:Location1 Description: CoverPhoto:Location1/Location1_cover.png Photos:[Location1/Location1_0.png Location1/Location1_1.png] Rooms:[] Notes:Notes for my location!}]"}
+{"logtype":"webserver", "pid":"7868", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations"}
+{"logtype":"webserver", "pid":"7868", "requestid":"", "status":"404", "method":"GET", "path":"/photos/locations/Location1/Location1/Location1_cover.png"}
+{"level":"info","time":"2022-01-08T22:00:24-05:00","message":"Deleting location from database: %!(EXTRA main.Location={2 Location1 Location1/Location1_cover.png [Location1/Location1_0.png Location1/Location1_1.png] [] Notes for my location!})"}
+{"logtype":"webserver", "pid":"7868", "requestid":"", "status":"200", "method":"DELETE", "path":"/api/locations/2"}
+{"level":"info","time":"2022-01-08T22:00:30-05:00","message":"Configuration loaded successfully..."}
+{"level":"debug","time":"2022-01-08T22:00:30-05:00","message":"{Timezone:America/New_York Server:{Port:3500 LocationPhotoDir:./app/photos/locations/} Logger:{Level:debug LoggingFile:./app/log/goInventorize.log} Authentication:{BasicAuth:false UserName:admin Password:password} Development:false}"}
+{"level":"info","time":"2022-01-08T22:00:30-05:00","message":"Database and Config loaded, starting webserver..."}
+{"level":"info","time":"2022-01-08T22:00:34-05:00","message":"Adding new location to database: %!(EXTRA main.Location={0 Location1 Location1_cover.png [Location1_0.png Location1_1.png] [] Notes for my location!})"}
+{"level":"debug","time":"2022-01-08T22:00:34-05:00","message":"Adding new location: {0 Location1 Location1_cover.png [Location1_0.png Location1_1.png] [] Notes for my location!}"}
+{"logtype":"webserver", "pid":"32476", "requestid":"", "status":"200", "method":"POST", "path":"/api/locations/new"}
+{"level":"debug","time":"2022-01-08T22:00:39-05:00","message":"Returning Locations: [{ID:3 Name:Location1 Description: CoverPhoto:Location1_cover.png Photos:[Location1_0.png Location1_1.png] Rooms:[] Notes:Notes for my location!}]"}
+{"logtype":"webserver", "pid":"32476", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations"}
+{"level":"debug","time":"2022-01-08T22:00:46-05:00","message":"Returning Locations: [{ID:3 Name:Location1 Description: CoverPhoto:Location1_cover.png Photos:[Location1_0.png Location1_1.png] Rooms:[] Notes:Notes for my location!}]"}
+{"logtype":"webserver", "pid":"32476", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations"}
+{"logtype":"webserver", "pid":"32476", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"level":"debug","time":"2022-01-08T22:00:47-05:00","message":"Returning Locations: [{ID:3 Name:Location1 Description: CoverPhoto:Location1_cover.png Photos:[Location1_0.png Location1_1.png] Rooms:[] Notes:Notes for my location!}]"}
+{"logtype":"webserver", "pid":"32476", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations"}
+{"logtype":"webserver", "pid":"32476", "requestid":"", "status":"200", "method":"GET", "path":"/photos/locations/Location1/Location1_cover.png"}
+{"logtype":"webserver", "pid":"32476", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"logtype":"webserver", "pid":"32476", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations/3"}
+{"level":"info","time":"2022-01-08T22:09:01-05:00","message":"Configuration loaded successfully..."}
+{"level":"debug","time":"2022-01-08T22:09:01-05:00","message":"{Timezone:America/New_York Server:{Port:3500 LocationPhotoDir:./app/photos/locations/} Logger:{Level:debug LoggingFile:./app/log/goInventorize.log} Authentication:{BasicAuth:false UserName:admin Password:password} Development:false}"}
+{"level":"info","time":"2022-01-08T22:09:01-05:00","message":"Database and Config loaded, starting webserver..."}
+{"level":"debug","time":"2022-01-08T22:09:09-05:00","message":"Returning Locations: [{ID:3 Name:Location1 Description: CoverPhoto:Location1_cover.png Photos:[Location1_0.png Location1_1.png] Rooms:[] Notes:Notes for my location!}]"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"304", "method":"GET", "path":"/photos/locations/Location1/Location1_cover.png"}
+{"level":"info","time":"2022-01-08T22:10:08-05:00","message":"Adding new location to database: %!(EXTRA main.Location={0 Location4 Location4_cover.png [Location4_0.png Location4_1.png] [] Notes for my location!})"}
+{"level":"debug","time":"2022-01-08T22:10:08-05:00","message":"Adding new location: {0 Location4 Location4_cover.png [Location4_0.png Location4_1.png] [] Notes for my location!}"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"POST", "path":"/api/locations/new"}
+{"level":"debug","time":"2022-01-08T22:10:11-05:00","message":"Returning Locations: [{ID:3 Name:Location1 Description: CoverPhoto:Location1_cover.png Photos:[Location1_0.png Location1_1.png] Rooms:[] Notes:Notes for my location!} {ID:4 Name:Location4 Description: CoverPhoto:Location4_cover.png Photos:[Location4_0.png Location4_1.png] Rooms:[] Notes:Notes for my location!}]"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations"}
+{"level":"debug","time":"2022-01-08T22:10:15-05:00","message":"Returning Locations: [{ID:3 Name:Location1 Description: CoverPhoto:Location1_cover.png Photos:[Location1_0.png Location1_1.png] Rooms:[] Notes:Notes for my location!} {ID:4 Name:Location4 Description: CoverPhoto:Location4_cover.png Photos:[Location4_0.png Location4_1.png] Rooms:[] Notes:Notes for my location!}]"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"level":"debug","time":"2022-01-08T22:10:17-05:00","message":"Returning Locations: [{ID:3 Name:Location1 Description: CoverPhoto:Location1_cover.png Photos:[Location1_0.png Location1_1.png] Rooms:[] Notes:Notes for my location!} {ID:4 Name:Location4 Description: CoverPhoto:Location4_cover.png Photos:[Location4_0.png Location4_1.png] Rooms:[] Notes:Notes for my location!}]"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"304", "method":"GET", "path":"/photos/locations/Location1/Location1_cover.png"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/photos/locations/Location4/Location4_cover.png"}
+{"level":"debug","time":"2022-01-08T22:17:30-05:00","message":"Returning Locations: [{ID:3 Name:Location1 Description: CoverPhoto:Location1_cover.png Photos:[Location1_0.png Location1_1.png] Rooms:[] Notes:Notes for my location!} {ID:4 Name:Location4 Description: CoverPhoto:Location4_cover.png Photos:[Location4_0.png Location4_1.png] Rooms:[] Notes:Notes for my location!}]"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"500", "method":"GET", "path":"/api/rooms/undefined"}
+{"level":"error","time":"2022-01-08T22:18:34-05:00","message":"Unable to fetch all rooms at location: not found"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"500", "method":"GET", "path":"/api/rooms/1"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"level":"debug","time":"2022-01-08T22:27:19-05:00","message":"Returning Locations: [{ID:3 Name:Location1 Description: CoverPhoto:Location1_cover.png Photos:[Location1_0.png Location1_1.png] Rooms:[] Notes:Notes for my location!} {ID:4 Name:Location4 Description: CoverPhoto:Location4_cover.png Photos:[Location4_0.png Location4_1.png] Rooms:[] Notes:Notes for my location!}]"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"304", "method":"GET", "path":"/photos/locations/Location1/Location1_cover.png"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"304", "method":"GET", "path":"/photos/locations/Location4/Location4_cover.png"}
+{"level":"error","time":"2022-01-08T22:27:23-05:00","message":"Unable to fetch all rooms at location: not found"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"500", "method":"GET", "path":"/api/rooms/3"}
+{"level":"error","time":"2022-01-08T22:27:58-05:00","message":"Unable to fetch all rooms at location: not found"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"500", "method":"GET", "path":"/api/rooms/3"}
+{"level":"debug","time":"2022-01-08T22:28:00-05:00","message":"Returning Locations: [{ID:3 Name:Location1 Description: CoverPhoto:Location1_cover.png Photos:[Location1_0.png Location1_1.png] Rooms:[] Notes:Notes for my location!} {ID:4 Name:Location4 Description: CoverPhoto:Location4_cover.png Photos:[Location4_0.png Location4_1.png] Rooms:[] Notes:Notes for my location!}]"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"level":"info","time":"2022-01-08T22:28:34-05:00","message":"Getting all Rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"level":"info","time":"2022-01-08T22:28:44-05:00","message":"Getting all Rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"404", "method":"GET", "path":"/api/api/rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"level":"info","time":"2022-01-08T22:29:49-05:00","message":"Getting all Rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"404", "method":"GET", "path":"/api/api/rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"level":"info","time":"2022-01-08T22:31:07-05:00","message":"Getting all Rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"level":"info","time":"2022-01-08T22:32:40-05:00","message":"Getting all Rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"level":"info","time":"2022-01-08T22:33:04-05:00","message":"Getting all Rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"level":"info","time":"2022-01-08T22:34:50-05:00","message":"Getting all Rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"level":"info","time":"2022-01-08T22:35:43-05:00","message":"Getting all Rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/rooms"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"level":"debug","time":"2022-01-08T22:36:03-05:00","message":"Returning Locations: [{ID:3 Name:Location1 Description: CoverPhoto:Location1_cover.png Photos:[Location1_0.png Location1_1.png] Rooms:[] Notes:Notes for my location!} {ID:4 Name:Location4 Description: CoverPhoto:Location4_cover.png Photos:[Location4_0.png Location4_1.png] Rooms:[] Notes:Notes for my location!}]"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"304", "method":"GET", "path":"/photos/locations/Location4/Location4_cover.png"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"304", "method":"GET", "path":"/photos/locations/Location1/Location1_cover.png"}
+{"level":"error","time":"2022-01-08T22:36:04-05:00","message":"Unable to fetch all rooms at location: not found"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"500", "method":"GET", "path":"/api/rooms/3"}
+{"level":"error","time":"2022-01-08T22:36:39-05:00","message":"Unable to fetch all rooms at location: not found"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"500", "method":"GET", "path":"/api/rooms/3"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/config"}
+{"level":"debug","time":"2022-01-08T22:36:46-05:00","message":"Returning Locations: [{ID:3 Name:Location1 Description: CoverPhoto:Location1_cover.png Photos:[Location1_0.png Location1_1.png] Rooms:[] Notes:Notes for my location!} {ID:4 Name:Location4 Description: CoverPhoto:Location4_cover.png Photos:[Location4_0.png Location4_1.png] Rooms:[] Notes:Notes for my location!}]"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"200", "method":"GET", "path":"/api/locations"}
+{"level":"error","time":"2022-01-08T22:36:49-05:00","message":"Unable to fetch all rooms at location: not found"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"500", "method":"GET", "path":"/api/rooms/3"}
+{"level":"error","time":"2022-01-08T22:37:08-05:00","message":"Unable to fetch all rooms at location: not found"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"500", "method":"GET", "path":"/api/rooms/3"}
+{"level":"error","time":"2022-01-08T22:37:13-05:00","message":"Unable to fetch all rooms at location: not found"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"500", "method":"GET", "path":"/api/rooms/1"}
+{"level":"error","time":"2022-01-08T22:37:36-05:00","message":"Unable to fetch all rooms at location: not found"}
+{"logtype":"webserver", "pid":"22076", "requestid":"", "status":"500", "method":"GET", "path":"/api/rooms/3"}
+{"level":"info","time":"2022-01-08T22:43:16-05:00","message":"Configuration loaded successfully..."}
+{"level":"debug","time":"2022-01-08T22:43:16-05:00","message":"{Timezone:America/New_York Server:{Port:3500 LocationPhotoDir:./app/photos/locations/} Logger:{Level:debug LoggingFile:./app/log/goInventorize.log} Authentication:{BasicAuth:false UserName:admin Password:password} Development:false}"}
+{"level":"info","time":"2022-01-08T22:43:16-05:00","message":"Database and Config loaded, starting webserver..."}
+{"level":"info","time":"2022-01-08T22:48:14-05:00","message":"Configuration loaded successfully..."}
+{"level":"debug","time":"2022-01-08T22:48:14-05:00","message":"{Timezone:America/New_York Server:{Port:3500 LocationPhotoDir:./app/photos/locations/} Logger:{Level:debug LoggingFile:./app/log/goInventorize.log} Authentication:{BasicAuth:false UserName:admin Password:password} Development:false}"}
+{"level":"info","time":"2022-01-08T22:48:14-05:00","message":"Database and Config loaded, starting webserver..."}
+{"level":"info","time":"2022-01-08T22:49:52-05:00","message":"Configuration loaded successfully..."}
+{"level":"debug","time":"2022-01-08T22:49:52-05:00","message":"{Timezone:America/New_York Server:{Port:3500 LocationPhotoDir:./app/photos/locations/} Logger:{Level:debug LoggingFile:./app/log/goInventorize.log} Authentication:{BasicAuth:false UserName:admin Password:password} Development:false}"}
+{"level":"info","time":"2022-01-08T22:49:52-05:00","message":"Database and Config loaded, starting webserver..."}
+{"level":"info","time":"2022-01-08T22:50:04-05:00","message":"Configuration loaded successfully..."}
+{"level":"debug","time":"2022-01-08T22:50:04-05:00","message":"{Timezone:America/New_York Server:{Port:3500 LocationPhotoDir:./app/photos/locations/} Logger:{Level:debug LoggingFile:./app/log/goInventorize.log} Authentication:{BasicAuth:false UserName:admin Password:password} Development:false}"}
+{"level":"info","time":"2022-01-08T22:50:04-05:00","message":"Database and Config loaded, starting webserver..."}
diff --git a/app/photos/locations/Location4/Location4_0.png b/app/photos/locations/Location4/Location4_0.png
new file mode 100644
index 0000000..87c5a8a
Binary files /dev/null and b/app/photos/locations/Location4/Location4_0.png differ
diff --git a/app/photos/locations/Location4/Location4_1.png b/app/photos/locations/Location4/Location4_1.png
new file mode 100644
index 0000000..81cd2ac
Binary files /dev/null and b/app/photos/locations/Location4/Location4_1.png differ
diff --git a/app/photos/locations/Location4/Location4_cover.png b/app/photos/locations/Location4/Location4_cover.png
new file mode 100644
index 0000000..bf50b0e
Binary files /dev/null and b/app/photos/locations/Location4/Location4_cover.png differ
diff --git a/database.go b/database.go
index 408e862..0e18c86 100644
--- a/database.go
+++ b/database.go
@@ -19,13 +19,16 @@ type Location struct {
// Room is a containerized area at a location
type Room struct {
- ID int `storm:"id,increment,index"`
+ ID int `storm:"id,increment,index"`
+ Name string `storm:"unique"`
+ Description string
CoverPhoto string // A "cover photo" for the room
Photos []string // A list of additional photos for the room
- Name string `storm:"unique"`
- Description string
- LocationID int //Which location room is assigned to
Notes string
+ Cabinets []Cabinet
+ Items []Item
+ LocationID int //Which location room is assigned to
+
}
// Cabinet is a containerized area in a room
@@ -42,7 +45,7 @@ type Item struct {
ID int `storm:"id, increment"`
RoomID int // Room ID that item is assigned to
CoverPhoto string // A "cover photo" for the item
- Photos []string // A list of additional photos for the room
+ Photos []string // A list of additional photos for the item
Count int // If item has duplicates
Name string
Product string
diff --git a/frontend/src/App.js b/frontend/src/App.js
index 489593c..7db0f6e 100644
--- a/frontend/src/App.js
+++ b/frontend/src/App.js
@@ -33,7 +33,7 @@ function App() {
useEffect(() => {
- navigate("/")// Reset to homepage on new load anywhere in the app
+ // navigate("/")// Reset to homepage on new load anywhere in the app
setIsLoading(true)
async function fetchSettings() {
backendAPI.get('/config').then(results => {
@@ -63,26 +63,20 @@ function App() {
}, [])
- useEffect(() => {
- console.log("Page Change!", currentPage)
-
- }, [currentPage])
-
-
- function showPage() {
- switch (currentPage.path) {
- case "home":
- return
- case "locations":
- console.log("RETURNING LOCATIONS: ", currentPage)
- return
- case "rooms":
- console.log("RETURNING ROOMS: ", currentPage)
- return
- default:
- break;
- }
- }
+ // function showPage() {
+ // switch (currentPage.path) {
+ // case "home":
+ // return
+ // case "locations":
+ // console.log("RETURNING LOCATIONS: ", currentPage)
+ // return
+ // case "rooms":
+ // console.log("RETURNING ROOMS: ", currentPage)
+ // return
+ // default:
+ // break;
+ // }
+ // }
return (
diff --git a/frontend/src/components/pages/Locations.js b/frontend/src/components/pages/Locations.js
index 895a2a3..cc0c60d 100644
--- a/frontend/src/components/pages/Locations.js
+++ b/frontend/src/components/pages/Locations.js
@@ -1,6 +1,7 @@
import React, {useState, useEffect, useContext, createContext} from 'react';
import { APIContext } from '../../App';
import { Text, Loader, Center, Card, Image, Badge, Button, SimpleGrid, Group } from '@mantine/core'
+import { useNavigate } from "react-router-dom";
import { useNotifications } from '@mantine/notifications';
import { backendAPI } from '../../services/backend-api';
@@ -14,6 +15,7 @@ function LocationsPage(props) {
const serverConfig = useContext(APIContext);
const notifications = useNotifications();
+ const navigate = useNavigate();
useEffect(() => {
console.log("LOADING LOCATIONS PAGE!")
@@ -47,7 +49,7 @@ function LocationsPage(props) {
Locations
{ locations.map((location, idx) =>
- {props.setCurrentPage({"path": "rooms", "id": location.ID})}} shadow="sm" padding="md">
+ {navigate("/rooms", { state: { locationID: location.ID}})}} shadow="sm" padding="md">
{location.CoverPhoto ? : No Photo}
diff --git a/frontend/src/components/pages/RoomsPage.js b/frontend/src/components/pages/RoomsPage.js
index 137c15b..c6a641e 100644
--- a/frontend/src/components/pages/RoomsPage.js
+++ b/frontend/src/components/pages/RoomsPage.js
@@ -1,6 +1,7 @@
import React, {useState, useEffect, useContext, createContext} from 'react';
import { APIContext } from '../../App';
import { Text, Loader, Center, Card, Image, Badge, Button, SimpleGrid, Group } from '@mantine/core'
+import { useLocation } from "react-router-dom";
import { useNotifications } from '@mantine/notifications';
import { backendAPI } from '../../services/backend-api';
@@ -9,23 +10,24 @@ import { backendAPI } from '../../services/backend-api';
function RoomsPage(props) {
// const [opened, setOpened] = useState(false);
const [isLoading, setIsLoading] = useState(false);
- const [rooms, setLocations] = useState([])
+ const [rooms, setRooms] = useState([])
const serverConfig = useContext(APIContext);
const notifications = useNotifications();
+ const {state} = useLocation();
useEffect(() => {
setIsLoading(true)
async function fetchSettings() {
- let url = `/rooms`
- console.log("CURRENT PAGE IN ROOMS: ", props.id)
- if (props.id !== -1) {
- url = `/rooms/${props.id}`
+ let url = `rooms`
+ console.log("CURRENT STATE: ", state)
+ if (state) {
+ url = `rooms/${state.locationID}`
}
backendAPI.get(url).then(results => {
- console.log("CONFIG IN LOCATIONS: ", serverConfig)
- setLocations(results.data)
+ console.log("ROOMS: ", results)
+ setRooms(results.data)
setIsLoading(false)
}).catch(err => {
notifications.showNotification({
@@ -47,9 +49,10 @@ function RoomsPage(props) {
return (
<>
{ isLoading && }
+ Rooms
{ rooms.map((room, idx) =>
- {props.setCurrentPage({"path": "rooms", "id": room.ID})}} shadow="sm" padding="md">
+ {}} shadow="sm" padding="md">
{room.CoverPhoto ? : No Photo}
diff --git a/handlers.go b/handlers.go
index 769125c..ad5cc75 100644
--- a/handlers.go
+++ b/handlers.go
@@ -35,7 +35,7 @@ func (s *Server) AddNewLocationHandler(c *fiber.Ctx) error {
if err != nil {
return err
}
- var photoPathsList []string
+ var photoURLsList []string
for i, photo := range locAdditionalPhotos {
src, err := photo.Open()
if err != nil {
@@ -44,7 +44,8 @@ func (s *Server) AddNewLocationHandler(c *fiber.Ctx) error {
defer src.Close()
photoPath := filepath.ToSlash(s.Config.Server.LocationPhotoDir + locName + "/" + locName + "_" + strconv.Itoa(i) + filepath.Ext(photo.Filename))
- photoPathsList = append(photoPathsList, photoPath)
+ photoURL := locName + "_" + strconv.Itoa(i) + filepath.Ext(photo.Filename)
+ photoURLsList = append(photoURLsList, photoURL)
photoData, err := io.ReadAll(src)
if err != nil {
return err
@@ -56,6 +57,8 @@ func (s *Server) AddNewLocationHandler(c *fiber.Ctx) error {
// 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
@@ -72,8 +75,8 @@ func (s *Server) AddNewLocationHandler(c *fiber.Ctx) error {
}
newLocation := Location{
Name: locName,
- CoverPhoto: coverImagePath,
- Photos: photoPathsList,
+ CoverPhoto: coverImageURL,
+ Photos: photoURLsList,
Notes: locNotes,
}
err = s.AddLocation(newLocation)
@@ -126,6 +129,77 @@ func (s *Server) DeleteLocationHandler(c *fiber.Ctx) error {
return c.Status(fiber.StatusOK).SendString(fmt.Sprintf("Location Deleted! %d", locID))
}
+// Add a new location
+func (s *Server) AddNewRoomHandler(c *fiber.Ctx) error {
+ form, err := c.MultipartForm()
+ if err != nil {
+ s.Log.Err(err).Msgf("Unable to fetch rooms: ", err)
+ return err
+ }
+ roomName := form.Value["Name"][0]
+ roomPhoto := form.File["CoverPhoto"][0]
+ if err != nil {
+ s.Log.Err(err).Msgf("Unable to get CoverPhoto for Room: ", err)
+ return err
+ }
+ roomAdditionalPhotos := form.File["AdditionalPhotos"]
+ // Create the directory for this location to store the photos
+ err = os.MkdirAll(s.Config.Server.LocationPhotoDir+roomName, 0755)
+ if err != nil {
+ return err
+ }
+ var photoURLsList []string
+ for i, photo := range roomAdditionalPhotos {
+ src, err := photo.Open()
+ if err != nil {
+ return err
+ }
+ defer src.Close()
+
+ photoPath := filepath.ToSlash(s.Config.Server.LocationPhotoDir + roomName + "/" + roomName + "_" + strconv.Itoa(i) + filepath.Ext(photo.Filename))
+ photoURL := roomName + "_" + 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 + roomName + "/" + roomName + "_cover" + filepath.Ext(roomPhoto.Filename))
+ // Creating the URL to retrieve photo
+ coverImageURL := roomName + "_cover" + filepath.Ext(roomPhoto.Filename)
+ src, err := roomPhoto.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: roomName,
+ 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))
+}
+
// GetAllRoomsHandler gets all of the rooms in the db
func (s *Server) GetAllRoomsHandler(c *fiber.Ctx) error {
rooms, err := s.GetAllRooms()
diff --git a/main.go b/main.go
index e63f25e..b96192e 100644
--- a/main.go
+++ b/main.go
@@ -97,11 +97,12 @@ func main() {
// Location Routes
server.WebServer.Get("/api/locations", server.GetAllLocationsHandler)
server.WebServer.Get("/api/locations/:locID", server.GetSingleLocationHandler)
- server.WebServer.Post("api/locations/new", server.AddNewLocationHandler)
- server.WebServer.Delete("api/locations/:locID", server.DeleteLocationHandler)
+ server.WebServer.Post("/api/locations/new", server.AddNewLocationHandler)
+ server.WebServer.Delete("/api/locations/:locID", server.DeleteLocationHandler)
// Room Routes
server.WebServer.Get("/api/rooms", server.GetAllRoomsHandler)
server.WebServer.Get("/api/rooms/:locID", server.GetRoomsAtLocationHandler)
+ server.WebServer.Post("/api/rooms/new", server.AddNewRoomHandler)
fmt.Println("Everything ready, starting server! ", fmt.Sprintf(":%s", server.Config.Server.Port))
server.WebServer.Listen(fmt.Sprintf(":%s", server.Config.Server.Port))
}