portal/main.go

149 lines
4.1 KiB
Go
Raw Normal View History

2023-04-29 17:38:21 +00:00
package main
import (
"context"
2023-04-29 17:38:21 +00:00
"embed"
"fmt"
2023-04-29 17:38:21 +00:00
"git.lumeweb.com/LumeWeb/portal/config"
"git.lumeweb.com/LumeWeb/portal/controller"
2023-04-29 17:38:21 +00:00
"git.lumeweb.com/LumeWeb/portal/db"
2023-04-30 06:18:42 +00:00
_ "git.lumeweb.com/LumeWeb/portal/docs"
"git.lumeweb.com/LumeWeb/portal/logger"
"git.lumeweb.com/LumeWeb/portal/middleware"
"git.lumeweb.com/LumeWeb/portal/service/auth"
"git.lumeweb.com/LumeWeb/portal/service/files"
"git.lumeweb.com/LumeWeb/portal/shared"
"git.lumeweb.com/LumeWeb/portal/tus"
nriris "github.com/iris-contrib/middleware/newrelic"
2023-04-30 06:18:42 +00:00
"github.com/iris-contrib/swagger"
"github.com/iris-contrib/swagger/swaggerFiles"
2023-04-29 17:38:21 +00:00
"github.com/kataras/iris/v12"
irisContext "github.com/kataras/iris/v12/context"
2023-06-28 05:06:38 +00:00
"github.com/kataras/iris/v12/middleware/cors"
2023-04-29 17:38:21 +00:00
"github.com/kataras/iris/v12/mvc"
2023-08-05 21:19:03 +00:00
"github.com/newrelic/go-agent/v3/newrelic"
"github.com/spf13/viper"
2023-05-19 13:04:47 +00:00
"go.uber.org/zap"
2023-04-29 17:38:21 +00:00
"log"
"net/http"
"os"
2023-04-29 17:38:21 +00:00
)
// Embed a directory of static files for serving from the app's root path
2023-05-04 08:21:39 +00:00
//
2023-04-29 17:38:21 +00:00
//go:embed app/*
var embedFrontend embed.FS
2023-04-30 06:46:47 +00:00
// @title Lume Web Portal
// @version 1.0
// @description A decentralized data storage portal for the open web
2023-04-30 06:18:42 +00:00
2023-04-30 06:46:47 +00:00
// @contact.name Lume Web Project
// @contact.url https://lumeweb.com
// @contact.email contact@lumeweb.com
2023-04-30 06:18:42 +00:00
2023-04-30 06:46:47 +00:00
// @license.name MIT
// @license.url https://opensource.org/license/mit/
2023-04-30 06:18:42 +00:00
// @externalDocs.description OpenAPI
// @externalDocs.url https://swagger.io/resources/open-api/
2023-04-29 17:38:21 +00:00
func main() {
// Initialize the configuration settings
config.Init()
2023-04-30 06:10:52 +00:00
// Initialize the database connection
db.Init()
defer func() {
err := db.Close()
if err != nil {
logger.Get().Error("Failed to close db connection", zap.Error(err))
}
}()
logger.Init()
files.Init()
auth.Init()
2023-05-04 08:21:39 +00:00
2023-04-29 17:38:21 +00:00
// Create a new Iris app instance
app := iris.New()
// Enable Gzip compression for responses
app.Use(iris.Compression)
2023-06-28 05:06:38 +00:00
app.UseRouter(cors.New().Handler())
2023-04-29 17:38:21 +00:00
// Serve static files from the embedded directory at the app's root path
app.HandleDir("/", embedFrontend)
2023-04-30 07:30:03 +00:00
api := app.Party("/api")
v1 := api.Party("/v1")
tusHandler := tus.Init()
if viper.IsSet("newrelic.license") {
nrAapp, err := newrelic.NewApplication(
newrelic.ConfigAppName(viper.GetString("newrelic.appname")),
newrelic.ConfigLicense(viper.GetString("newrelic.license")),
newrelic.ConfigAppLogForwardingEnabled(true),
)
if nil != err {
fmt.Println(err)
os.Exit(1)
}
app.Use(nriris.New(nrAapp))
}
// Register the AccountController with the MVC framework and attach it to the "/api/account" path
2023-04-30 07:30:03 +00:00
mvc.Configure(v1.Party("/account"), func(app *mvc.Application) {
app.Handle(new(controller.AccountController))
2023-04-29 17:38:21 +00:00
})
2023-04-30 07:30:03 +00:00
mvc.Configure(v1.Party("/auth"), func(app *mvc.Application) {
app.Handle(new(controller.AuthController))
2023-04-29 17:38:21 +00:00
})
2023-05-04 08:21:39 +00:00
mvc.Configure(v1.Party("/files"), func(app *mvc.Application) {
tusRoute := app.Router.Party(tus.TUS_API_PATH)
tusRoute.Use(middleware.VerifyJwt)
fromStd := func(handler http.Handler) func(ctx *irisContext.Context) {
return func(ctx *irisContext.Context) {
newCtx := context.WithValue(ctx.Request().Context(), shared.TusRequestContextKey, ctx)
handler.ServeHTTP(ctx.ResponseWriter(), ctx.Request().WithContext(newCtx))
}
}
2023-05-04 08:21:39 +00:00
tusRoute.Any("/{fileparam:path}", fromStd(http.StripPrefix(v1.GetRelPath()+tus.TUS_API_PATH+"/", tusHandler)))
tusRoute.Post("/", fromStd(http.StripPrefix(tusRoute.GetRelPath()+tus.TUS_API_PATH, tusHandler)))
app.Handle(new(controller.FilesController))
})
swaggerConfig := swagger.Config{
2023-04-30 06:18:42 +00:00
// The url pointing to API definition.
URL: "http://localhost:8080/swagger/doc.json",
DeepLinking: true,
DocExpansion: "list",
DomID: "#swagger-ui",
// The UI prefix URL (see route).
Prefix: "/swagger",
}
swaggerUI := swagger.Handler(swaggerFiles.Handler, swaggerConfig)
2023-04-30 06:18:42 +00:00
app.Get("/swagger", swaggerUI)
// And the wildcard one for index.html, *.js, *.css and e.t.c.
app.Get("/swagger/{any:path}", swaggerUI)
2023-04-29 17:38:21 +00:00
// Start the Iris app and listen for incoming requests on port 80
err := app.Listen(":8080", func(app *iris.Application) {
routes := app.GetRoutes()
for _, route := range routes {
log.Println(route)
}
})
if err != nil {
logger.Get().Error("Failed starting webserver", zap.Error(err))
2023-08-03 12:48:49 +00:00
}
2023-04-29 17:38:21 +00:00
}