Intial webserver runtime
This commit is contained in:
		@ -1,10 +1,14 @@
 | 
			
		||||
package runtime
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/gorilla/mux"
 | 
			
		||||
	"github.com/josephbmanley/OpenSkins-Common/datastore"
 | 
			
		||||
	"github.com/josephbmanley/OpenSkins-Common/datatypes"
 | 
			
		||||
	"github.com/josephbmanley/OpenSkins/pluginmanager"
 | 
			
		||||
	"io"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net/http"
 | 
			
		||||
)
 | 
			
		||||
@ -17,6 +21,9 @@ func healthCheck(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getCharacter(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	w.WriteHeader(501)
 | 
			
		||||
	return
 | 
			
		||||
 | 
			
		||||
	vars := mux.Vars(r)
 | 
			
		||||
	userID := vars["user"]
 | 
			
		||||
	charID := vars["char"]
 | 
			
		||||
@ -25,7 +32,7 @@ func getCharacter(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
 | 
			
		||||
	// Check if there was an error getting the user
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Panicf("An error occured when getting a character: %v", err.Error())
 | 
			
		||||
		log.Printf("An error occured when getting a character: %v", err.Error())
 | 
			
		||||
		w.WriteHeader(500)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
@ -36,21 +43,185 @@ func getCharacter(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Find character
 | 
			
		||||
	for _, character := range user.Characters {
 | 
			
		||||
		if character.UID == charID {
 | 
			
		||||
			json.NewEncoder(w).Encode(character)
 | 
			
		||||
			return
 | 
			
		||||
			json.NewEncoder(w).Encode(character) // Return character Json
 | 
			
		||||
			return                               // Return 200
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Return 404
 | 
			
		||||
	w.WriteHeader(404)
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func createCharacter(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	w.WriteHeader(501)
 | 
			
		||||
	return
 | 
			
		||||
 | 
			
		||||
	vars := mux.Vars(r)
 | 
			
		||||
	userID := vars["user"]
 | 
			
		||||
	charID := vars["char"]
 | 
			
		||||
 | 
			
		||||
	user, err := activeUserstore.GetUser(userID)
 | 
			
		||||
 | 
			
		||||
	// Check if there was an error getting the user
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Printf("CREATE CHARACTER - Failed to get user: %v", err.Error())
 | 
			
		||||
		w.WriteHeader(500)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Check if user exists
 | 
			
		||||
	if user == nil {
 | 
			
		||||
		w.WriteHeader(400)
 | 
			
		||||
		w.Write([]byte("User does not exist!"))
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Check if character already exists
 | 
			
		||||
	for _, character := range user.Characters {
 | 
			
		||||
		if character.UID == charID {
 | 
			
		||||
			w.WriteHeader(400)
 | 
			
		||||
			w.Write([]byte("Character already exists!"))
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	newCharacter := datatypes.Character{
 | 
			
		||||
		UID: charID,
 | 
			
		||||
		Skin: datatypes.Skin{
 | 
			
		||||
			UID: "none",
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Add character to user object
 | 
			
		||||
	user.Characters = append(user.Characters, newCharacter)
 | 
			
		||||
	err = activeUserstore.SetUser(user)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Printf("CREATE CHARACTER - Failed to set user %v", err.Error())
 | 
			
		||||
		w.WriteHeader(500)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getSkin(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	vars := mux.Vars(r)
 | 
			
		||||
	skinID := vars["skin"]
 | 
			
		||||
 | 
			
		||||
	// Get skin
 | 
			
		||||
	skin, err := activeSkinstore.GetSkin(skinID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Printf("GET SKIN - Failed to get skin %v", err.Error())
 | 
			
		||||
		w.WriteHeader(500)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Check if skin exists
 | 
			
		||||
	if skin == nil {
 | 
			
		||||
		w.WriteHeader(404)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	json.NewEncoder(w).Encode(skin) // Return skin Json
 | 
			
		||||
	return                          // Return 200
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func createSkin(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
 | 
			
		||||
	vars := mux.Vars(r)
 | 
			
		||||
	skinID := vars["skin"]
 | 
			
		||||
 | 
			
		||||
	// Lookup skin object
 | 
			
		||||
	skin, err := activeSkinstore.GetSkin(skinID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Printf("CREATE SKIN - Failed to get skin: %v", err.Error())
 | 
			
		||||
		w.WriteHeader(500)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Check if skin exists
 | 
			
		||||
	if skin != nil {
 | 
			
		||||
		w.WriteHeader(400)
 | 
			
		||||
		w.Write([]byte("Skin already exists!"))
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Load skin data from request
 | 
			
		||||
	skinBytes, err := readfile(r, "skin")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Printf("CREATE SKIN - Failed to read upload: %v", err.Error())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Verify data exists
 | 
			
		||||
	if skinBytes == nil {
 | 
			
		||||
		w.WriteHeader(400)
 | 
			
		||||
		w.Write([]byte("Missing skin data!"))
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Create new skin object
 | 
			
		||||
	err = activeSkinstore.AddSkin(skinID, skinBytes)
 | 
			
		||||
 | 
			
		||||
	// Validate skin creation
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Printf("CREATE SKIN - Failed to add skin: %v", err.Error())
 | 
			
		||||
		w.WriteHeader(500)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return // Return 200
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Helper function to read a file from a request form
 | 
			
		||||
func readfile(r *http.Request, fileName string) ([]byte, error) {
 | 
			
		||||
 | 
			
		||||
	err := r.ParseMultipartForm(32 << 20) // Limit upload size
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var buf bytes.Buffer
 | 
			
		||||
 | 
			
		||||
	file, _, err := r.FormFile(fileName)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	defer file.Close()
 | 
			
		||||
 | 
			
		||||
	// Copy the file data to my buffer
 | 
			
		||||
	_, err = io.Copy(&buf, file)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	contents := buf.Bytes() // Get data
 | 
			
		||||
	buf.Reset()             // Clear buffer
 | 
			
		||||
 | 
			
		||||
	return contents, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StartWebserver starts the webserver
 | 
			
		||||
func StartWebserver(port int) {
 | 
			
		||||
 | 
			
		||||
	activeSkinstore = pluginmanager.LoadedSkinstores[0] // Load first skinstore
 | 
			
		||||
 | 
			
		||||
	// Intialize router
 | 
			
		||||
	myRouter := mux.NewRouter().StrictSlash(true)
 | 
			
		||||
	myRouter.HandleFunc("/health", healthCheck)
 | 
			
		||||
	myRouter.HandleFunc("/get/character/{user}/{char}", getCharacter)
 | 
			
		||||
 | 
			
		||||
	// Health check path
 | 
			
		||||
	myRouter.HandleFunc("/health", healthCheck).Methods("GET")
 | 
			
		||||
 | 
			
		||||
	// Character routes
 | 
			
		||||
	myRouter.HandleFunc("/get/character/{user}/{char}", getCharacter).Methods("GET")
 | 
			
		||||
	myRouter.HandleFunc("/create/character/{user}/{char}", createCharacter).Methods("POST")
 | 
			
		||||
 | 
			
		||||
	// Skin routes
 | 
			
		||||
	myRouter.HandleFunc("/get/skin/{skin}", getSkin).Methods("GET")
 | 
			
		||||
	myRouter.HandleFunc("/create/skin/{skin}", createSkin).Methods("POST")
 | 
			
		||||
 | 
			
		||||
	// Run webserver
 | 
			
		||||
	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", port), myRouter))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user