From b78aa4be3d28cf302f624bc8fa648a7e65e81089 Mon Sep 17 00:00:00 2001 From: Martin Geno Date: Tue, 16 Aug 2016 08:30:02 +0200 Subject: [PATCH] new api structur --- .gitignore | 2 +- lib/api/main.go | 30 +++++++++++++++++++++++++--- system/api.go | 52 ++++++++++++++++++++++++++++++------------------- 3 files changed, 60 insertions(+), 24 deletions(-) diff --git a/.gitignore b/.gitignore index 397fed3..c4a651b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ -/webroot +!/webroot test.log config.yml diff --git a/lib/api/main.go b/lib/api/main.go index 07def28..1095329 100644 --- a/lib/api/main.go +++ b/lib/api/main.go @@ -5,18 +5,26 @@ import ( "net/http" "github.com/astaxie/session" + "github.com/julienschmidt/httprouter" ) +type Handle func(w http.ResponseWriter, r *http.Request, ps httprouter.Params, sess session.Session) (interface{}, *ErrorResult) +type ErrorResult struct { + Fields []string `json:"fields"` + Message string `json:"msg"` +} + type JsonResult struct { - Data interface{} `json:"data"` + Data interface{} `json:"data"` + Error *ErrorResult `json:"error,omitemty"` Session struct { Login interface{} `json:"login"` Profil map[string]interface{} `json:"profil"` } `json:"session"` } -func JsonOutput(sess session.Session, w http.ResponseWriter, r *http.Request, data interface{}) { - result := JsonResult{Data: data} +func JsonOutput(w http.ResponseWriter, r *http.Request, sess session.Session, data interface{}, errorresult *ErrorResult) { + result := JsonResult{Data: data, Error: errorresult} result.Session.Login = sess.Get("login") js, err := json.Marshal(result) if err != nil { @@ -33,3 +41,19 @@ func JsonOutput(sess session.Session, w http.ResponseWriter, r *http.Request, da w.Header().Set("Access-Control-Allow-Credentials", "true") w.Write(js) } + +func SessionHandler(h Handle, sessions *session.Manager) httprouter.Handle { + return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { + sess := sessions.SessionStart(w, r) + data, err := h(w, r, ps, sess) + JsonOutput(w, r, sess, data, err) + } +} + +func LoginHandler(h Handle, sessions *session.Manager) httprouter.Handle { + return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { + sess := sessions.SessionStart(w, r) + data, err := h(w, r, ps, sess) + JsonOutput(w, r, sess, data, err) + } +} diff --git a/system/api.go b/system/api.go index cc127a1..904fbbe 100644 --- a/system/api.go +++ b/system/api.go @@ -33,33 +33,33 @@ func NewAPI(config *libconfig.Config, sessions *session.Manager, dbconnection *x dbconnection: dbconnection, log: log.NewModulLog(MODULNAME), } - router.GET(prefix+"/status", api.Status) - router.POST(prefix+"/login", api.Login) - router.GET(prefix+"/logout", api.Logout) - + router.GET(prefix+"/status", libapi.SessionHandler(api.Status, sessions)) + router.POST(prefix+"/login", libapi.SessionHandler(api.Login, sessions)) + router.GET(prefix+"/logout", libapi.LoginHandler(api.Logout, sessions)) + router.POST(prefix+"/password", libapi.LoginHandler(api.Password, sessions)) + router.GET(prefix+"/delete", libapi.LoginHandler(api.Status, sessions)) } // Status to get Login and Server status -func (api *API) Status(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - sess := api.sessions.SessionStart(w, r) +func (api *API) Status(w http.ResponseWriter, r *http.Request, _ httprouter.Params, sess session.Session) (returndata interface{}, returnerr *libapi.ErrorResult) { + returndata = false logger := api.log.GetLog(r, "status") result, err := api.dbconnection.Count(new(Login)) - connection := false if err != nil { + returnerr = &libapi.ErrorResult{Message: "Affe"} logger.Error("get login count: ", err) } else { if result > 0 { - connection = true + returndata = true } } logger.Info("status") - libapi.JsonOutput(sess, w, r, connection) + return } // Logout current user -func (api *API) Logout(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { +func (api *API) Logout(w http.ResponseWriter, r *http.Request, _ httprouter.Params, sess session.Session) (returndata interface{}, returnerr *libapi.ErrorResult) { api.sessions.SessionDestroy(w, r) - sess := api.sessions.SessionStart(w, r) logger := api.log.GetLog(r, "logout") if login := sess.Get("login"); login != nil { logger = logger.WithField("user", login.(Login).Username) @@ -67,19 +67,19 @@ func (api *API) Logout(w http.ResponseWriter, r *http.Request, _ httprouter.Para sess.Delete("login") sess.Delete("profil") logger.Info("logout") - libapi.JsonOutput(sess, w, r, true) + returndata = true + return } // Login of system -func (api *API) Login(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { - sess := api.sessions.SessionStart(w, r) +func (api *API) Login(w http.ResponseWriter, r *http.Request, _ httprouter.Params, sess session.Session) (returndata interface{}, returnerr *libapi.ErrorResult) { logger := api.log.GetLog(r, "login") var requestlogin RequestLogin err := json.NewDecoder(r.Body).Decode(&requestlogin) if err != nil { logger.Error("fetch request") http.Error(w, err.Error(), http.StatusInternalServerError) - libapi.JsonOutput(sess, w, r, false) + returndata = false return } logger = logger.WithField("user", requestlogin.Username) @@ -87,19 +87,19 @@ func (api *API) Login(w http.ResponseWriter, r *http.Request, _ httprouter.Param _, err = api.dbconnection.Get(&login) if err != nil { logger.Error("fetch database") - libapi.JsonOutput(sess, w, r, false) + returndata = false return } if login.Id <= 0 { logger.Warn("user not found") - libapi.JsonOutput(sess, w, r, false) + returndata = false return } - result := false + returndata = false if login.Active { output, _ := libpassword.Validate(login.Password, requestlogin.Password) if output { - result = true + returndata = true sess.Set("login", login) logger.Info("logged in") } else { @@ -109,5 +109,17 @@ func (api *API) Login(w http.ResponseWriter, r *http.Request, _ httprouter.Param logger.Warn("not active") } - libapi.JsonOutput(sess, w, r, result) + return +} +func (api *API) Password(w http.ResponseWriter, r *http.Request, _ httprouter.Params, sess session.Session) (returndata interface{}, returnerr *libapi.ErrorResult) { + logger := api.log.GetLog(r, "password") + logger.Warn("not implemented") + returndata = false + return +} +func (api *API) Delete(w http.ResponseWriter, r *http.Request, _ httprouter.Params, sess session.Session) (returndata interface{}, returnerr *libapi.ErrorResult) { + logger := api.log.GetLog(r, "delete") + logger.Warn("not implemented") + returndata = false + return }