Micro-service for file storage and processing written in Go
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

99 lines
2.8 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. package main
  2. import (
  3. "github.com/geplauder/lithium/controllers"
  4. "net/http"
  5. "os"
  6. "io"
  7. "github.com/geplauder/lithium/middlewares"
  8. "github.com/geplauder/lithium/pipelines"
  9. "github.com/geplauder/lithium/settings"
  10. "github.com/geplauder/lithium/storage"
  11. "github.com/gorilla/mux"
  12. "github.com/sirupsen/logrus"
  13. "github.com/spf13/afero"
  14. )
  15. var GitCommit string
  16. func RegisterRoutes(r *mux.Router, appSettings settings.Settings, pipelines []pipelines.IPipeline, storageProvider storage.IStorageProvider) {
  17. index := r.Methods(http.MethodGet).Subrouter()
  18. index.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  19. controllers.IndexHandler(pipelines, w, r, GitCommit)
  20. })
  21. upload := r.Methods(http.MethodPost).Subrouter()
  22. upload.HandleFunc("/upload", func(w http.ResponseWriter, r *http.Request) {
  23. controllers.UploadHandler(w, r, pipelines, storageProvider)
  24. })
  25. pipeline := r.Methods(http.MethodGet).Subrouter()
  26. pipeline.HandleFunc("/pipelines/{pipeline}", func(w http.ResponseWriter, r *http.Request) {
  27. for _, pipeline := range pipelines {
  28. if pipeline.GetSlug() == mux.Vars(r)["pipeline"] {
  29. controllers.PipelineHandler(pipeline, storageProvider, w, r)
  30. return
  31. }
  32. }
  33. w.WriteHeader(404)
  34. })
  35. if appSettings.Authentication.Enabled {
  36. authMiddleware := middlewares.CreateAuthenticationMiddleware(appSettings.Authentication.Token)
  37. upload.Use(authMiddleware.Middleware)
  38. pipeline.Use(authMiddleware.Middleware)
  39. }
  40. }
  41. func main() {
  42. logFile, err := os.OpenFile("lithium.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
  43. if err == nil {
  44. multiWriter := io.MultiWriter(os.Stdout, logFile)
  45. logrus.SetOutput(multiWriter)
  46. } else {
  47. logrus.SetOutput(os.Stdout)
  48. }
  49. logrus.SetFormatter(&logrus.JSONFormatter{})
  50. appSettings, err := settings.LoadSettings(afero.NewOsFs())
  51. if err != nil {
  52. logrus.Fatal("Unexpected error while loading settings: ", err)
  53. }
  54. var storageProvider storage.IStorageProvider
  55. if appSettings.StorageProvider.Type == 0 {
  56. storageProvider = storage.GetFileSystemStorageProvider(appSettings.StorageProvider.BasePath, "")
  57. } else {
  58. logrus.WithFields(logrus.Fields{
  59. "StorageProviderType": appSettings.StorageProvider.Type,
  60. }).Fatal("Invalid file system provided")
  61. }
  62. pipes := pipelines.LoadPipelines()
  63. r := mux.NewRouter()
  64. if appSettings.RateLimiter.Enabled {
  65. rateLimiterMiddleware, err := middlewares.CreateRateLimiterMiddleware(appSettings.RateLimiter.RequestsPerMinute, appSettings.RateLimiter.AllowedBurst)
  66. if err != nil {
  67. logrus.Fatal("Unexpected error while creating rate limiter middleware: ", err)
  68. }
  69. r.Use(rateLimiterMiddleware.Middleware)
  70. }
  71. RegisterRoutes(r, appSettings, pipes, storageProvider)
  72. logrus.Info("Lithium started, listening for requests...")
  73. err = http.ListenAndServe(appSettings.Endpoint, r)
  74. if err != nil {
  75. logrus.Fatal("Unexpected error while serving http server: ", err)
  76. }
  77. }