mirror of
https://github.com/gosticks/DroneChaingGoServer.git
synced 2025-10-16 11:45:44 +00:00
Created server
This commit is contained in:
commit
0fa174410d
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "web"]
|
||||
path = web
|
||||
url = git@github.com:gosticks/DroneChainWeb.git
|
||||
BIN
drone-chain-server-go
Executable file
BIN
drone-chain-server-go
Executable file
Binary file not shown.
152
main.go
Normal file
152
main.go
Normal file
@ -0,0 +1,152 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/GeertJohan/go.rice"
|
||||
"github.com/gorilla/mux"
|
||||
)
|
||||
|
||||
var bookingCounter = 0
|
||||
|
||||
type Booking struct {
|
||||
ID int `json:"id"`
|
||||
StationAddress string `json:"station"`
|
||||
}
|
||||
|
||||
// Structs for json communication.
|
||||
type NewBooking struct {
|
||||
DroneAddress string `json:"droneID"`
|
||||
StationAddress string `json:"stationID"`
|
||||
}
|
||||
|
||||
type DroneStatus struct {
|
||||
Status string `json:"status"`
|
||||
Station string `json:"station"`
|
||||
}
|
||||
|
||||
var bookingsMap = make(map[string][]Booking)
|
||||
|
||||
var bookings []Booking
|
||||
var drones []DroneStatus
|
||||
|
||||
type handler func(w http.ResponseWriter, r *http.Request)
|
||||
|
||||
func basicAuth(pass handler) handler {
|
||||
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
auth := strings.SplitN(r.Header.Get("Authorization"), " ", 2)
|
||||
|
||||
if len(auth) != 2 || auth[0] != "Basic" {
|
||||
http.Error(w, "authorization failed", http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
|
||||
payload, _ := base64.StdEncoding.DecodeString(auth[1])
|
||||
pair := strings.SplitN(string(payload), ":", 2)
|
||||
|
||||
if len(pair) != 2 || !validate(pair[0], pair[1]) {
|
||||
http.Error(w, "authorization failed", http.StatusUnauthorized)
|
||||
return
|
||||
}
|
||||
|
||||
pass(w, r)
|
||||
}
|
||||
}
|
||||
|
||||
func validate(username, password string) bool {
|
||||
if username == "test" && password == "test" {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// POST <- api/book/new {DroneAddress: WalletAddress, StationAddress: WalletAddress}
|
||||
// GET -> api/drone/bookings/:id [] ? [{id: booking_id, station: station_address}]
|
||||
// POST <- api/drone/status/:id {ConnectedStation: address ? '', Idle: Boolean}
|
||||
|
||||
func handlerNewBooking(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Println("NEW BOOKING")
|
||||
decoder := json.NewDecoder(r.Body)
|
||||
var b NewBooking
|
||||
err := decoder.Decode(&b)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
booking := Booking{ID: bookingCounter, StationAddress: b.StationAddress}
|
||||
// Add booking to store
|
||||
bookings = append(bookings, booking)
|
||||
bookingsMap[b.DroneAddress] = append(bookingsMap[b.DroneAddress], booking)
|
||||
bookingCounter++
|
||||
defer r.Body.Close()
|
||||
log.Println("Testing booking for drone:" + b.DroneAddress + " station: " + b.StationAddress)
|
||||
}
|
||||
|
||||
func handlerDroneStatus(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Println("Called drone status")
|
||||
params := mux.Vars(r)
|
||||
id := params["id"]
|
||||
decoder := json.NewDecoder(r.Body)
|
||||
var d DroneStatus
|
||||
err := decoder.Decode(&d)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
fmt.Println("Parsed json")
|
||||
// w.WriteHeader(http.StatusOK)
|
||||
//drones = append(drones, d)
|
||||
defer r.Body.Close()
|
||||
log.Println("Storing status for drone " + id + " station " + d.Station + " status" + d.Status)
|
||||
}
|
||||
|
||||
func handlerGetBookings(w http.ResponseWriter, r *http.Request) {
|
||||
params := mux.Vars(r)
|
||||
arr, found := bookingsMap[params["id"]]
|
||||
fmt.Println(params["id"])
|
||||
if found == false {
|
||||
fmt.Fprintf(w, "[]")
|
||||
return
|
||||
}
|
||||
json, err := json.Marshal(arr)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
//w.WriteHeader(http.StatusOK)
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
w.Write(json)
|
||||
}
|
||||
|
||||
func handleRoot(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Println("Radnom request: %s", r.URL.Path)
|
||||
//w http.ResponseWriter, r *http.Request
|
||||
fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
|
||||
}
|
||||
|
||||
func apiHandler(w http.ResponseWriter, r *http.Request) {
|
||||
id := strings.TrimPrefix(r.URL.Path, "/api/")
|
||||
fmt.Fprintf(w, "Hi there, I love %s!, %s", r.URL.Path[1:], id)
|
||||
}
|
||||
|
||||
func main() {
|
||||
r := mux.NewRouter()
|
||||
port := flag.String("p", "8100", "port to serve on")
|
||||
directory := flag.String("d", "./web/dist", "the directory of static file to host")
|
||||
flag.Parse()
|
||||
fmt.Println("Hello from DroneChain server")
|
||||
r.HandleFunc("/api/drone/status/{id}", handlerDroneStatus).Methods("POST")
|
||||
r.HandleFunc("/api/booking/new", handlerNewBooking) // .Methods("POST")
|
||||
r.HandleFunc("/api/drone/bookings/{id}", handlerGetBookings) // .Methods("GET")
|
||||
r.HandleFunc("/api/status/{id}", handlerDroneStatus).Methods("POST")
|
||||
r.PathPrefix("/").Handler(http.FileServer(rice.MustFindBox("web/dist").HTTPBox()))
|
||||
|
||||
http.Handle("/", r)
|
||||
log.Printf("Serving %s on HTTP port: %s\n", *directory, *port)
|
||||
log.Fatal(http.ListenAndServe(":"+*port, nil))
|
||||
}
|
||||
291
rice-box.go
Normal file
291
rice-box.go
Normal file
File diff suppressed because one or more lines are too long
1
web
Submodule
1
web
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 3f63bb1ad5b845f97f6ad20f60acc5581dad435b
|
||||
Loading…
Reference in New Issue
Block a user