// Sofaraum server is the server which collects the statistics // for the sofaraum-heatmap application. // Copyright 2018 K.Langenberg and contributors. All rights reserved. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // @title Sofaraum Server API // @license.name GPLv3 // @BasePath /api/v1 // @securityDefinitions.apikey ApiKeyAuth // @in header // @name Authorization package routes import ( _ "code.sofaraum.de/server/docs" // To generate swagger docs "code.sofaraum.de/server/pkg/log" "code.sofaraum.de/server/pkg/models" apiv1 "code.sofaraum.de/server/pkg/routes/api/v1" "code.vikunja.io/web" "github.com/asaskevich/govalidator" "github.com/labstack/echo" "github.com/labstack/echo/middleware" "github.com/spf13/viper" "github.com/swaggo/echo-swagger" ) // CustomValidator is a dummy struct to use govalidator with echo type CustomValidator struct{} // Validate validates stuff func (cv *CustomValidator) Validate(i interface{}) error { if _, err := govalidator.ValidateStruct(i); err != nil { var errs []string for field, e := range govalidator.ErrorsByField(err) { errs = append(errs, field+": "+e) } httperr := models.ValidationHTTPError{ web.HTTPError{ Code: models.ErrCodeInvalidData, Message: "Invalid Data", }, errs, } return httperr } return nil } // NewEcho registers a new Echo instance func NewEcho() *echo.Echo { e := echo.New() e.HideBanner = true // Logger e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{ Format: "${time_rfc3339_nano}: ${remote_ip} ${method} ${status} ${uri} ${latency_human} - ${user_agent}\n", })) // Validation e.Validator = &CustomValidator{} return e } // RegisterRoutes registers all routes for the application func RegisterRoutes(e *echo.Echo) { // CORS_SHIT e.Use(middleware.CORSWithConfig(middleware.CORSConfig{ AllowOrigins: []string{"*"}, })) // API Routes a := e.Group("/api/v1") // Swagger UI a.GET("/swagger/*", echoSwagger.WrapHandler) a.POST("/user/auth", apiv1.Login) // ===== Routes with Authetification ===== // Authetification a.Use(middleware.JWT([]byte(viper.GetString("service.JWTSecret")))) // Put the authprovider in the context to be able to use it later e.Use(func(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { c.Set("AuthProvider", &web.Auths{ AuthObject: func(echo.Context) (web.Auth, error) { return models.GetCurrentUser(c) }, }) c.Set("LoggingProvider", log.Log) return next(c) } }) a.POST("/tokenTest", apiv1.CheckToken) // User stuff a.GET("/user", apiv1.UserShow) a.POST("/user/new", apiv1.CreateUser) }