diff --git a/README.md b/README.md index dad0cce9de0a55102ba4712a4e9c6f7f99886706..f1e61353f43be2a4268ba72430b5d192ba95ff4e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,237 @@ # stillasTracker -# Version 0.1 -# +stillasTracker is a software solution which provides MB-Stillas with an API, a database and two-front end solutions. +The readme will serve as endpoint documentation for the stillastracker API as well as a brief user guide for both of the front end solutions in the repository + +## Endpoint-Documentation: +The following endpoints are available in the current version of the API: + +### Scaffolding (stillasdel) endpoints + +The scaffolding endpoint has GET, POST, PUT and DELETE functionality. Get requests are used +get information regarding scaffolding parts, you can get scaffolding parts based on the queries listed +in the table below. + +**GET requests** + +The GET requests fetches scaffolding parts from the database +``` +/stillastracking/v1/api/unit?type={:type}&id={:id} +/stillastracking/v1/api/unit?type={:type} +/stillastracking/v1/api/unit +``` +**POST and PUT requests** + +The post and put requests are used to add in new scaffolding parts or update them. +``` +/stillastracking/v1/api/unit + +Example body: +{ + "id": "AB23GW", + "type": "Flooring", + "project": "CCHamar", + "batteryLevel": 100 +} +``` + +**DELETE** + +The delete request deletes scaffolding units from the database +``` +/stillastracking/v1/api/unit + +Example body: +[ + { + "id": "4A6352" + }, + { + "id": "56GWAG" + }, + { + "id": "8GTW21" + }, + { + "id": "LPW123" + } +] +``` + + +### Project (byggeprosjekt) endpoints +This endpoint handles all data regarding projects in the database. + +**GET** + +These endpoints are used to fetch information regarding projects from the database. Adding scaffolding=true +after the endpoint will list all the scaffolding parts associated with the project. +``` +/stillastracking/v1/api/project?id={:id}&scaffolding={:scaffolding} +/stillastracking/v1/api/project?name={:name}&scaffolding={:scaffolding} +/stillastracking/v1/api/project?id={:id} +/stillastracking/v1/api/project?name={:name} +/stillastracking/v1/api/project?id={:id} +/stillastracking/v1/api/project?scaffolding={:scaffolding} +/stillastracking/v1/api/project +/stillastracking/v1/api/storage +``` + +**POST and PUT** + +The following endpoint is used to add in new scaffoldingparts + +``` +/stillastracking/v1/api/project + +Example body +{ + "projectID":2321112, + "projectName":"MBStillas", + "latitude":60.79077759591496, + "longitude":10.683249543160402, + "state":"Active", + "size":322, + "period":{ + "startDate":"25-04-2022", + "endDate":"30-04-2022" + }, + "customer":{ + "name":"Martin Ivers", + "number":98435621, + "email":"martin@mail.no" + }, + "address":{ + "street":"Halsetsvea 40", + "zipcode":"2323", + "municipality":"Ingeberg", + "county":"Innlandet" + }, + "geofence":{ + "w-position":{"latitude":-73.98326396942211,"longitude":40.69287790858968}, + "x-position":{"latitude":-73.98387551307742,"longitude":40.6922433936175}, + "y-position":{"latitude":-73.98255586624245,"longitude":40.691999347788055}, + "z-position":{"latitude":-73.98124694824298,"longitude":40.69267453906423} + } + } + +/stillastracking/v1/api/project/scaffold + +Example body: +{ + "toProjectID":755, + "fromProjectID":12, + "scaffold":[{ + "type":"Bunnskrue", + "quantity":1 + },] +} +``` + +**DELETE** + +The endpoint is used to delete projects + +``` +/stillastracking/v1/api/project + +Example body: +[ + { + "id": 430 + }, + { + "id": 420 + } +] +``` + + +### Profile (bruker) endpoints + +The endpoint handles user creation,updates and removals. + +**GET** + +The endpoints below fetches users from the database +``` +/stillastracking/v1/api/user?id={:id} +/stillastracking/v1/api/user?role={:role} +/stillastracking/v1/api/user +``` + +**POST or PUT** + +The endpoint creates or updates users +``` +/stillastracking/v1/api/user + +Example body: +{ + "employeeID": 232, + "name": "Ola Nordmann", + "dateOfBirth": "01.04.1988", + "role": "Storage", + "admin": true +} +``` + +**DELETE** + +The endpoint deletes users from the database +``` +/stillastracking/v1/api/user + +Example body: +[ + {"id" : "12521"}, + {"id" : "12521"}, + {"id" : "12521"}, + {"id" : "12521"}, +] +``` + +### Gateway endpoints +The endpoint handles all management of BLE Gateways in the database + +**GET** + +The following endpoints can be used to fetch gateways from the database +``` +/stillastracking/v1/api/gateway?id={:id} +/stillastracking/v1/api/gateway?projectName={:projectName} +/stillastracking/v1/api/gateway?projectID={:projectID} +/stillastracking/v1/api/gateway +``` + +**POST or PUT** + +The endpoint creates and updates gateways +``` +/stillastracking/v1/api/gateway + +Example body: +{ + "Status": true + "gatewayID": "34AB954B54E4" + "latitude": 59.911491 + "longitude": 10.757933 + "projectID": 4 + "projectName": "CCHamar" +} +``` + +**DELETE** + +The endpoint deletes gateways +``` +/stillastracking/v1/api/gateway + +Example body: +[ + {"id" : "34AB954B54E4"}, + {"id" : "34AB954BABEE4"}, + {"id" : "34TQWD21SDAE4"}, + {"id" : "1241WADQWDQW4"}, +] +``` diff --git a/api/apiTools/basicTools.go b/api/apiTools/basicTools.go index 3e470af5c30ad9b7491bf717560bcbb3b2fba74c..eea24345bba8e035b07ccd3cfa2be68d85583ff5 100644 --- a/api/apiTools/basicTools.go +++ b/api/apiTools/basicTools.go @@ -9,6 +9,12 @@ import ( "strings" ) +/* +Class basicTools contains functions for assisting API endpoints +Last update 19.05.2022 Martin Ivesren +@version 1.0 +*/ + func CreatePath(segments []string) string { var finalPath string for _, s := range segments { diff --git a/api/apiTools/errorHandling.go b/api/apiTools/errorHandling.go index 1e395b26b090e1dfd2543faabe31760efd38f451..57e5e77ec49e5a92ad07b2e66e1e0ca7621b4a3b 100644 --- a/api/apiTools/errorHandling.go +++ b/api/apiTools/errorHandling.go @@ -10,7 +10,7 @@ Code inspired by: Page authored by Matt Silverlock from questionable serviecs Last visit: 08.03.2022 -version 0.1 +version 1.0 Last edited 08.03.2022 by Martin Iversen */ diff --git a/api/cmd/main.go b/api/cmd/main.go index 833f9408718936cbc24cdc7348d1fd7ff5f9f1e2..0f763605a49bb52bc8172ddf245552eba9eb6cd6 100644 --- a/api/cmd/main.go +++ b/api/cmd/main.go @@ -9,7 +9,7 @@ import ( /** Class main Will run the api -Version 0.1 +Version 1.0 Last update 08.03.2022 Martin Iversen */ diff --git a/api/database/databaseSetup.go b/api/database/databaseSetup.go index 65874175edb2ee0ea9e0c6c2e83eb120f4d1ce0a..d3cac49a4223077bcf042871de286cd1e0f86584 100644 --- a/api/database/databaseSetup.go +++ b/api/database/databaseSetup.go @@ -11,6 +11,11 @@ import ( "path/filepath" ) +/* +Class databaseSetup.go created for communicating with database +Last update 19.05.2022 +@version 1.0 +*/ // Ctx Initializing the context to be used with firebase var Ctx context.Context diff --git a/api/endpoints/APIHandler.go b/api/endpoints/APIHandler.go index c4e41adee3895d8aa4c25a500b4b45f2cd9a0da8..8e19854387de4609967f4ce8f6d4c32ac90bf733 100644 --- a/api/endpoints/APIHandler.go +++ b/api/endpoints/APIHandler.go @@ -13,7 +13,7 @@ Class APIHandler.go Class forwards requests to the appropriate endpoint and assigns the port of the program Last modified by martiiv@stud.ntnu.no Date: 06.04.2022 -Version 0.8 +Version 1.0 */ var ( InfoLogger *log.Logger diff --git a/api/endpoints/gateway.go b/api/endpoints/gateway.go index e68964f6d363bb6889415312e3d7fabfa6c6a25c..ad3e6157a2615b55d4601523ac92f23dc05f2e48 100644 --- a/api/endpoints/gateway.go +++ b/api/endpoints/gateway.go @@ -16,6 +16,11 @@ import ( "strconv" ) +/** +Class gateway.go created for managing gateways +@version 1.0 +Last edit 19.05.2022 +*/ var gatewayCollection *firestore.CollectionRef var projectCollection *firestore.DocumentRef diff --git a/api/endpoints/homePage.go b/api/endpoints/homePage.go index b760538483e33c9f8cd33056c61d834efbe6359d..15f53605ef53ac829df786e306bd5a92740d4553 100644 --- a/api/endpoints/homePage.go +++ b/api/endpoints/homePage.go @@ -6,6 +6,12 @@ import ( tool "stillasTracker/api/apiTools" ) +/** +Class homepage.go created but never used, +@version 1.0 +last edit 19.05.2022 +*/ + func homePage(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") w.Header().Set("Access-Control-Allow-Origin", "*") diff --git a/api/endpoints/profiles.go b/api/endpoints/profiles.go index a83d8daf578fabe4f4d54369236240ac74910708..90d147a35d5ae197b632322c54a551fecd549ef2 100644 --- a/api/endpoints/profiles.go +++ b/api/endpoints/profiles.go @@ -20,7 +20,7 @@ import ( /** Class profiles This class will contain all data formatting and modification regarding the users of the system -Version 0.9 +Version 1.0 Last modified Martin Iversen 07.04.2022 TODO Maybe modularize som functionality the marshall, unmarshall encode routine is repeated often */ diff --git a/api/endpoints/projectTools.go b/api/endpoints/projectTools.go index 143998d59ce08ef2da5a2b85dd79153f7ee9a642..fd806bf26ac3a7099b570ed08be05b59e35d12f6 100644 --- a/api/endpoints/projectTools.go +++ b/api/endpoints/projectTools.go @@ -17,7 +17,7 @@ import ( /* projectTools File contains tools used in the projects.go file Last edited Martin Iversen 07.04.2022 -Version 0.9 +Version 1.0 TODO Delete checkProjectBody? It isn't used */ diff --git a/api/endpoints/projects.go b/api/endpoints/projects.go index 148ac30e6fa91f2a56db5a7b6c96d6b594ea1826..be59a8806a33df68259a4255501362bbe11a97a8 100644 --- a/api/endpoints/projects.go +++ b/api/endpoints/projects.go @@ -22,7 +22,7 @@ import ( Class projects This class will contain all data formatting and handling of the clients projects Class contains the following functions: -Version 0.9 +Version 1.0 Last modified Martin Iversen 07.04.2022 TODO Find alternative for strings.Title since the function is deprecated TODO If possible modularize the unmarshalling and encoding of lists since there is a lot of duplicate code doing this diff --git a/api/endpoints/scaffolding.go b/api/endpoints/scaffolding.go index 14e368cbcd0ab860bc1c5148de63551147162c51..cf8bcce97533a8e7d553c92bae47ecc9dd03e623 100644 --- a/api/endpoints/scaffolding.go +++ b/api/endpoints/scaffolding.go @@ -15,7 +15,7 @@ import ( /** Class scaffolding This class will contain all functions used for the handling of scaffolding units -Version 0.9 +Version 1.0 Last modified Martin Iversen 07.04.2022 TODO make type non case sensitive */ diff --git a/api/endpoints/trackingTools.go b/api/endpoints/trackingTools.go index 8bf36de6e99f6c8739f5a8adeb7a50faccfe9c32..efe31b7587c5eb70d7f3b42b84f9d10ec0056b6f 100644 --- a/api/endpoints/trackingTools.go +++ b/api/endpoints/trackingTools.go @@ -24,8 +24,8 @@ Class gateway The class wil handle all information regarding the cellular gateways in the system The class will contain the following functions: -Version 0.1 -Last modified Martin Iversen +Version 1.0 +Last modified Martin Iversen 19.05.2022 */ func UpdatePosition(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") diff --git a/api/mqtt/mqttBroker.go b/api/mqtt/mqttBroker.go index b9a0e6166a15b9dabd7321b0546bea88aee990d7..226e541ab90da360dcf4dc5a7261d53b89c03212 100644 --- a/api/mqtt/mqttBroker.go +++ b/api/mqtt/mqttBroker.go @@ -10,6 +10,12 @@ import ( "strings" ) +/** +Class mqttBroker.go created for implementing an mqtt broker +This functionality was never implemented fully given time constraints +@version 0.5 +last edited Martin Iversen 19.05.2022 +*/ type AdvPacket struct { msg *igs.Message packet *ibs.Payload diff --git a/api/tests/diagnostics_test.go b/api/tests/diagnostics_test.go deleted file mode 100644 index ca8701d290df4ae2117e23918855f2d7ab28bcb4..0000000000000000000000000000000000000000 --- a/api/tests/diagnostics_test.go +++ /dev/null @@ -1 +0,0 @@ -package tests diff --git a/api/tests/scaffolding_test.go b/api/tests/scaffolding_test.go index 9d99fc7897ccaa9baf706a2ab7b365b324dc6962..c8e236b19068fcd89390a532e464069c97cf86e8 100644 --- a/api/tests/scaffolding_test.go +++ b/api/tests/scaffolding_test.go @@ -1,8 +1,10 @@ package tests import ( + "github.com/gorilla/mux" "github.com/steinfletcher/apitest" "net/http" + "net/http/httptest" "stillasTracker/api/endpoints" "testing" ) @@ -13,12 +15,15 @@ Function for testing the scaffolding endpoint */ func Test_ScaffoldingAPITEST(t *testing.T) { dataBaseTestConnection() - handler := http.HandlerFunc(endpoints.ScaffoldingRequest) + r := mux.NewRouter() //Add list of Scaffoldingparts which sends a post request and creates 12 scaffolding parts t.Run("Add list of Scaffoldingparts", func(t *testing.T) { + r.HandleFunc("/stillastracking/v1/api/unit/", endpoints.ScaffoldingRequest) + ts := httptest.NewServer(r) + defer ts.Close() apitest.New(). - HandlerFunc(handler). + Handler(r). Post("/stillastracking/v1/api/unit/"). Body(`[ { "id": 1, "type": "Spire", "batteryLevel": 100, "location": { "longitude": null, "latitude": null, "address":null } }, { "id": 2, "type": "Flooring", "batteryLevel": 100, "location": { "longitude": null, "latitude": null, "address": null } }, { "id": 3, "type": "Short-Flooring", "batteryLevel": 100, "location": { "longitude": null, "latitude": null, "address": null } }, { "id": 4, "type": "Staircase", "batteryLevel": 100, "location": { "longitude": null, "latitude": null, "address": null } }, { "id": 5, "type": "Bottom-Screw", "batteryLevel": 100, "location": { "longitude": null, "latitude": null, "address": null } }, { "id": 6, "type": "Diagonals", "batteryLevel": 100, "location": { "longitude": null, "latitude": null, "address": null } }, { "id": 7, "type": "Beam1", "batteryLevel": 100, "location": { "longitude": null, "latitude": null, "address": null } }, { "id": 8, "type": "Beam2", "batteryLevel": 100, "location": { "longitude": null, "latitude": null, "address": null } }, { "id": 9, "type": "Flooring", "batteryLevel": 100, "location": { "longitude": null, "latitude": null, "address": null } }, { "id": 10, "type": "Flooring", "batteryLevel": 100, "location": { "longitude": null, "latitude": null, "address": null } }, { "id": 11, "type": "Spire", "batteryLevel": 100, "location": { "longitude": null, "latitude": null, "address": null } }, { "id": 12, "type": "Railing", "batteryLevel": 100, "location": { "longitude": null, "latitude": null, "address": null } } ]`). Expect(t). @@ -29,8 +34,11 @@ func Test_ScaffoldingAPITEST(t *testing.T) { //Gets all Scaffolding parts t.Run("Get all Scaffolding parts", func(t *testing.T) { + r.HandleFunc("/stillastracking/v1/api/unit/", endpoints.ScaffoldingRequest) + ts := httptest.NewServer(r) + defer ts.Close() apitest.New(). - HandlerFunc(handler). + HandlerFunc(endpoints.ScaffoldingRequest). Get("/stillastracking/v1/api/unit/"). Expect(t). Body("{\"batteryLevel\":100,\"id\":7,\"location\":{\"address\":null,\"latitude\":null,\"longitude\":null},\"type\":\"Beam1\"}\n{\"batteryLevel\":100,\"id\":8,\"location\":{\"address\":null,\"latitude\":null,\"longitude\":null},\"type\":\"Beam2\"}\n{\"batteryLevel\":100,\"id\":5,\"location\":{\"address\":null,\"latitude\":null,\"longitude\":null},\"type\":\"Bottom-Screw\"}\n{\"batteryLevel\":100,\"id\":6,\"location\":{\"address\":null,\"latitude\":null,\"longitude\":null},\"type\":\"Diagonals\"}\n{\"batteryLevel\":100,\"id\":10,\"location\":{\"address\":null,\"latitude\":null,\"longitude\":null},\"type\":\"Flooring\"}\n{\"batteryLevel\":100,\"id\":2,\"location\":{\"address\":null,\"latitude\":null,\"longitude\":null},\"type\":\"Flooring\"}\n{\"batteryLevel\":100,\"id\":9,\"location\":{\"address\":null,\"latitude\":null,\"longitude\":null},\"type\":\"Flooring\"}\n{\"batteryLevel\":100,\"id\":12,\"location\":{\"address\":null,\"latitude\":null,\"longitude\":null},\"type\":\"Railing\"}\n{\"batteryLevel\":100,\"id\":3,\"location\":{\"address\":null,\"latitude\":null,\"longitude\":null},\"type\":\"Short-Flooring\"}\n{\"batteryLevel\":100,\"id\":1,\"location\":{\"address\":null,\"latitude\":null,\"longitude\":null},\"type\":\"Spire\"}\n{\"batteryLevel\":100,\"id\":11,\"location\":{\"address\":null,\"latitude\":null,\"longitude\":null},\"type\":\"Spire\"}\n{\"batteryLevel\":100,\"id\":4,\"location\":{\"address\":null,\"latitude\":null,\"longitude\":null},\"type\":\"Staircase\"}\n"). @@ -40,8 +48,11 @@ func Test_ScaffoldingAPITEST(t *testing.T) { //Gets all Scaffolding parts by Flooring t.Run("Get Scaffolding by type", func(t *testing.T) { + r.HandleFunc("/stillastracking/v1/api/unit", endpoints.ScaffoldingRequest).Queries() + ts := httptest.NewServer(r) + defer ts.Close() apitest.New(). - HandlerFunc(handler). + HandlerFunc(endpoints.ScaffoldingRequest). Get("/stillastracking/v1/api/unit"). Query("type", "Flooring"). Expect(t). @@ -50,7 +61,7 @@ func Test_ScaffoldingAPITEST(t *testing.T) { End() apitest.New(). - HandlerFunc(handler). + HandlerFunc(endpoints.ScaffoldingRequest). Get("/stillastracking/v1/api/unit"). Query("type", "Beam1"). Expect(t). @@ -59,7 +70,7 @@ func Test_ScaffoldingAPITEST(t *testing.T) { End() apitest.New(). - HandlerFunc(handler). + HandlerFunc(endpoints.ScaffoldingRequest). Get("/stillastracking/v1/api/unit"). Query("type", "Staircase"). Expect(t). @@ -71,7 +82,7 @@ func Test_ScaffoldingAPITEST(t *testing.T) { //Gets a specific scaffolding part t.Run("Get Individual Scaffolding part", func(t *testing.T) { apitest.New(). - HandlerFunc(handler). + HandlerFunc(endpoints.ScaffoldingRequest). Get("/stillastracking/v1/api/unit"). Query("type", "Flooring"). Query("id", "9"). @@ -83,7 +94,7 @@ func Test_ScaffoldingAPITEST(t *testing.T) { t.Run("Delete all scaffolding parts", func(t *testing.T) { apitest.New(). - HandlerFunc(handler). + HandlerFunc(endpoints.ScaffoldingRequest). Delete("/stillastracking/v1/api/unit/"). Body("[ { \"id\": 7, \"type\": \"Beam1\" }, { \"id\": 8, \"type\": \"Beam2\" }, { \"id\": 5, \"type\": \"Bottom-Screw\" }, { \"id\": 6, \"type\": \"Diagonals\" }, { \"id\": 10, \"type\": \"Flooring\" }, { \"id\": 2, \"type\": \"Flooring\" }, { \"id\": 9, \"type\": \"Flooring\" }, { \"id\": 12, \"type\": \"Railing\" }, { \"id\": 3, \"type\": \"Short-Flooring\" }, { \"id\": 1, \"type\": \"Spire\" }, { \"id\": 11, \"type\": \"Spire\" }, { \"id\": 4, \"type\": \"Staircase\" } ]"). Expect(t). diff --git a/stillasMobileApplication/stillasMobileApplication/Views/ProfileView/ProfileView.swift b/stillasMobileApplication/stillasMobileApplication/Views/ProfileView/ProfileView.swift index ab195642e6b3d88083b5198381ce080f8c9c7f63..ec0ad6ef32e10e0086e26bf943b19061df67b6cb 100644 --- a/stillasMobileApplication/stillasMobileApplication/Views/ProfileView/ProfileView.swift +++ b/stillasMobileApplication/stillasMobileApplication/Views/ProfileView/ProfileView.swift @@ -158,6 +158,21 @@ struct ProfileDetails: View { .background(colorScheme == .dark ? Color(UIColor.white) : Color(UIColor.white)).cornerRadius(7) .shadow(color: Color(UIColor.black).opacity(0.1), radius: 5, x: 0, y: 2) .shadow(color: Color(UIColor.black).opacity(0.2), radius: 20, x: 0, y: 10) + + Spacer() + + Button (action: { + viewModel.signOut() + }) { + Text("Logg av") + .frame(width: 150, height: 50, alignment: .center) + } + .foregroundColor(.white) + .background(Color.blue) + .cornerRadius(10) + + Spacer() + .frame(height:50) // limit spacer size by applying a frame } } .task {