2023-03-15 00:05:24 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2023-04-25 09:37:42 +00:00
|
|
|
"context"
|
|
|
|
"errors"
|
2023-03-15 00:05:24 +00:00
|
|
|
"log"
|
|
|
|
"net/http"
|
2023-04-25 09:37:42 +00:00
|
|
|
"os"
|
2023-03-17 01:16:51 +00:00
|
|
|
"personalwebsite/routewde"
|
2023-04-29 13:58:39 +00:00
|
|
|
"personalwebsite/wde"
|
2023-04-25 09:37:42 +00:00
|
|
|
"personalwebsite/webfilesystem"
|
2023-03-17 01:16:51 +00:00
|
|
|
"personalwebsite/websiteapp"
|
2023-04-14 15:53:23 +00:00
|
|
|
"personalwebsite/websiteapp/blogviewer"
|
2023-03-20 11:20:37 +00:00
|
|
|
"personalwebsite/websiteapp/finder"
|
2023-04-12 21:05:23 +00:00
|
|
|
imgviewer "personalwebsite/websiteapp/img-viewer"
|
2023-03-17 01:16:51 +00:00
|
|
|
"personalwebsite/websiteapp/personalprops"
|
2023-03-15 00:05:24 +00:00
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
2023-04-25 09:37:42 +00:00
|
|
|
"github.com/joho/godotenv"
|
2023-04-29 10:17:25 +00:00
|
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
2023-04-25 09:37:42 +00:00
|
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
2023-03-15 00:05:24 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
|
2023-04-25 09:37:42 +00:00
|
|
|
if err := godotenv.Load(); err != nil {
|
|
|
|
println("No .env file found")
|
|
|
|
}
|
|
|
|
|
|
|
|
mongoConnect, err := FindEnv("MONGO_CONNECT")
|
|
|
|
if err != nil {
|
|
|
|
panic(err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
dBName, err := FindEnv("DATABASE")
|
|
|
|
if err != nil {
|
|
|
|
panic(err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
webFsCollection, err := FindEnv("COLLECTION_WEBFS")
|
|
|
|
if err != nil {
|
|
|
|
panic(err.Error())
|
|
|
|
}
|
|
|
|
|
|
|
|
clientOptions := options.Client().ApplyURI(mongoConnect)
|
|
|
|
client, err := mongo.Connect(context.TODO(), clientOptions)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
err = client.Ping(context.TODO(), nil)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
router := gin.New()
|
2023-03-18 00:34:56 +00:00
|
|
|
router.LoadHTMLGlob("templates/**/*")
|
2023-03-15 00:05:24 +00:00
|
|
|
router.Static("/res", "resources")
|
2023-03-15 12:32:41 +00:00
|
|
|
|
2023-03-18 00:34:56 +00:00
|
|
|
router.GET("/", func(ctx *gin.Context) {
|
|
|
|
ctx.HTML(http.StatusOK, "index.tmpl", gin.H{})
|
2023-03-15 00:05:24 +00:00
|
|
|
})
|
2023-03-18 00:34:56 +00:00
|
|
|
|
2023-04-25 09:37:42 +00:00
|
|
|
webfs := webfilesystem.NewWebFileSystem(client, dBName, webFsCollection)
|
2023-04-29 13:58:39 +00:00
|
|
|
wde := wde.NewWDE(webfs)
|
2023-04-29 19:37:08 +00:00
|
|
|
persPropsApp := personalprops.NewPersPropsApp(webfs)
|
2023-04-29 20:17:34 +00:00
|
|
|
|
2023-04-29 13:58:39 +00:00
|
|
|
// finderApp := finder.FinderApplication{}
|
|
|
|
finderApp := finder.NewFinderApplication(webfs)
|
2023-04-29 16:47:12 +00:00
|
|
|
imgViewerApp := imgviewer.NewImgViewerApp(webfs)
|
2023-04-29 12:02:25 +00:00
|
|
|
blogViewerApp := blogviewer.NewBlogViewerApp(webfs)
|
2023-03-17 01:16:51 +00:00
|
|
|
appsStorage := websiteapp.ApplicationsStorage{
|
|
|
|
Apps: map[string]websiteapp.WebDEApplication{},
|
|
|
|
}
|
|
|
|
appsStorage.Apps["personal-properties"] = &persPropsApp
|
2023-04-29 13:58:39 +00:00
|
|
|
appsStorage.Apps["finder"] = finderApp
|
2023-04-12 21:05:23 +00:00
|
|
|
appsStorage.Apps["img-viewer"] = &imgViewerApp
|
2023-04-14 15:53:23 +00:00
|
|
|
appsStorage.Apps["blog-viewer"] = blogViewerApp
|
2023-03-17 01:16:51 +00:00
|
|
|
system := router.Group("system")
|
2023-03-15 12:32:41 +00:00
|
|
|
{
|
2023-03-18 00:34:56 +00:00
|
|
|
|
2023-04-29 13:58:39 +00:00
|
|
|
wdeGroup := system.Group("wde")
|
2023-03-17 01:16:51 +00:00
|
|
|
{
|
2023-04-29 13:58:39 +00:00
|
|
|
routewde.Route(wdeGroup, wde)
|
2023-03-17 01:16:51 +00:00
|
|
|
}
|
|
|
|
apps := system.Group("applications")
|
|
|
|
{
|
|
|
|
apps.GET("/:appid/:method", func(ctx *gin.Context) {
|
|
|
|
appId := ctx.Param("appid")
|
|
|
|
method := ctx.Param("method")
|
|
|
|
|
|
|
|
app, isExist := appsStorage.Apps[appId]
|
|
|
|
if !isExist {
|
|
|
|
ctx.Status(http.StatusNoContent)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
switch method {
|
|
|
|
case "getmanifest":
|
|
|
|
ctx.JSON(http.StatusOK, app.GetManifest())
|
|
|
|
case "app.js":
|
2023-03-20 11:20:37 +00:00
|
|
|
ctx.File("resources/sys/" + appId + "/" + appId + ".js")
|
2023-03-17 01:16:51 +00:00
|
|
|
case "app.css":
|
2023-03-20 11:20:37 +00:00
|
|
|
ctx.File("resources/sys/" + appId + "/" + appId + ".css")
|
2023-03-17 01:16:51 +00:00
|
|
|
default:
|
|
|
|
ctx.Status(http.StatusBadRequest)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
websiteapp.Route(apps.Group("/storage"), &appsStorage)
|
2023-03-15 12:32:41 +00:00
|
|
|
}
|
2023-03-17 01:16:51 +00:00
|
|
|
|
2023-04-25 09:37:42 +00:00
|
|
|
fs := router.Group("fs")
|
|
|
|
{
|
2023-04-29 10:17:25 +00:00
|
|
|
fs.GET("writeFile", func(ctx *gin.Context) {
|
|
|
|
parentPath := ctx.Query("parentPath")
|
|
|
|
if parentPath == "" {
|
|
|
|
ctx.JSON(http.StatusBadRequest, "TODO") //TODO json error struct
|
|
|
|
return
|
|
|
|
}
|
|
|
|
file := webfilesystem.WebFSFile{
|
|
|
|
MongoId: primitive.NewObjectID(),
|
|
|
|
Name: "pp",
|
|
|
|
Type: "test",
|
|
|
|
Data: nil,
|
|
|
|
}
|
|
|
|
err := webfs.CreateFile(&file, parentPath)
|
|
|
|
if err != nil {
|
|
|
|
ctx.JSON(http.StatusInternalServerError, "TODO") //TODO json error struct
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx.JSON(http.StatusOK, "OK")
|
|
|
|
})
|
2023-04-29 09:02:55 +00:00
|
|
|
fs.GET("createDir", func(ctx *gin.Context) {
|
|
|
|
path := ctx.Query("path")
|
|
|
|
if path == "" {
|
|
|
|
ctx.JSON(http.StatusBadRequest, "TODO") //TODO json error struct
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
err := webfs.CreateDirectory(path)
|
|
|
|
if err != nil {
|
|
|
|
ctx.JSON(http.StatusInternalServerError, "TODO") //TODO json error struct
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx.JSON(http.StatusOK, "OK")
|
|
|
|
})
|
|
|
|
|
2023-04-25 09:37:42 +00:00
|
|
|
fs.GET("list", func(ctx *gin.Context) {
|
|
|
|
path := ctx.Query("path")
|
|
|
|
if path == "" {
|
|
|
|
ctx.JSON(http.StatusBadRequest, "TODO") //TODO json error struct
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
files, err := webfs.List(path)
|
|
|
|
if err != nil {
|
|
|
|
ctx.JSON(http.StatusInternalServerError, "TODO") //TODO json error struct
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx.JSON(http.StatusOK, &files)
|
|
|
|
})
|
|
|
|
|
|
|
|
fs.GET("read", func(ctx *gin.Context) {
|
|
|
|
path := ctx.Query("path")
|
|
|
|
if path == "" {
|
|
|
|
ctx.JSON(http.StatusBadRequest, "TODO") //TODO json error struct
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
file, err := webfs.Read(path)
|
|
|
|
if err != nil {
|
|
|
|
ctx.JSON(http.StatusInternalServerError, "TODO") //TODO json error struct
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
ctx.JSON(http.StatusOK, &file)
|
|
|
|
})
|
|
|
|
}
|
2023-03-17 01:16:51 +00:00
|
|
|
app := router.Group("application")
|
|
|
|
{
|
|
|
|
persPropApp := app.Group("personal-properties")
|
|
|
|
{
|
2023-03-18 00:34:56 +00:00
|
|
|
persPropApp.GET("render", func(ctx *gin.Context) {
|
2023-04-13 01:09:07 +00:00
|
|
|
isMobileParam := ctx.Query("isMobile")
|
|
|
|
isMobile := isMobileParam == "true"
|
2023-04-29 19:37:08 +00:00
|
|
|
ginH, err := persPropsApp.Render()
|
|
|
|
if err != nil {
|
|
|
|
ctx.JSON(http.StatusInternalServerError, "TODO") //TODO
|
|
|
|
}
|
2023-04-13 01:09:07 +00:00
|
|
|
if isMobile {
|
2023-04-29 19:37:08 +00:00
|
|
|
ctx.HTML(http.StatusOK, "personal-properties/mobile-app.tmpl", ginH)
|
2023-04-13 01:09:07 +00:00
|
|
|
} else {
|
2023-04-29 19:37:08 +00:00
|
|
|
ctx.HTML(http.StatusOK, "personal-properties/app.tmpl", ginH)
|
2023-04-13 01:09:07 +00:00
|
|
|
}
|
2023-03-17 01:16:51 +00:00
|
|
|
})
|
|
|
|
}
|
2023-03-22 18:00:04 +00:00
|
|
|
finderAppRoute := app.Group("finder")
|
|
|
|
{
|
|
|
|
finderAppRoute.GET("render", func(ctx *gin.Context) {
|
2023-04-13 01:09:07 +00:00
|
|
|
isMobileParam := ctx.Query("isMobile")
|
|
|
|
isMobile := isMobileParam == "true"
|
|
|
|
if isMobile {
|
|
|
|
ctx.HTML(http.StatusOK, "finder/mobile-app.tmpl", finderApp.Render(isMobile))
|
|
|
|
} else {
|
|
|
|
ctx.HTML(http.StatusOK, "finder/app.tmpl", finderApp.Render(isMobile))
|
|
|
|
}
|
|
|
|
|
|
|
|
})
|
|
|
|
finderAppRoute.GET("renderMobileDesktop", func(ctx *gin.Context) {
|
|
|
|
ctx.HTML(http.StatusOK, "finder/mobile-desktop.tmpl", gin.H{})
|
2023-03-22 18:00:04 +00:00
|
|
|
})
|
2023-04-29 21:01:23 +00:00
|
|
|
finderAppRoute.GET("renderDesktop", func(ctx *gin.Context) {
|
|
|
|
path := ctx.Query("path")
|
|
|
|
if path == "" {
|
|
|
|
ctx.JSON(http.StatusBadRequest, "no path provided")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
ctx.HTML(http.StatusOK, "finder/desktop.tmpl", gin.H{})
|
|
|
|
})
|
2023-03-22 18:00:04 +00:00
|
|
|
}
|
2023-04-12 21:05:23 +00:00
|
|
|
imgViewerRoute := app.Group("img-viewer")
|
|
|
|
{
|
|
|
|
imgViewerRoute.GET("render", func(ctx *gin.Context) {
|
2023-04-13 01:09:07 +00:00
|
|
|
isMobileParam := ctx.Query("isMobile")
|
|
|
|
isMobile := isMobileParam == "true"
|
2023-04-29 16:47:12 +00:00
|
|
|
path := ctx.Query("path")
|
|
|
|
if path == "" {
|
|
|
|
ctx.JSON(http.StatusBadRequest, "no path provided")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
ginH, err := imgViewerApp.Render(path, isMobile)
|
|
|
|
if err != nil {
|
|
|
|
ctx.JSON(http.StatusInternalServerError, "TODO")
|
|
|
|
return
|
|
|
|
}
|
2023-04-13 01:09:07 +00:00
|
|
|
if isMobile {
|
2023-04-29 16:47:12 +00:00
|
|
|
ctx.HTML(http.StatusOK, "img-viewer/mobile-app.tmpl", ginH)
|
2023-04-13 01:09:07 +00:00
|
|
|
} else {
|
2023-04-29 16:47:12 +00:00
|
|
|
ctx.HTML(http.StatusOK, "img-viewer/app.tmpl", ginH)
|
2023-04-13 01:09:07 +00:00
|
|
|
}
|
|
|
|
|
2023-04-12 21:05:23 +00:00
|
|
|
})
|
|
|
|
}
|
2023-04-14 15:53:23 +00:00
|
|
|
blogViewerRoute := app.Group("blog-viewer")
|
|
|
|
{
|
2023-04-29 12:02:25 +00:00
|
|
|
blogViewerRoute.GET("writeMockBlog", func(ctx *gin.Context) {
|
|
|
|
path := ctx.Query("path")
|
|
|
|
if path == "" {
|
|
|
|
ctx.JSON(http.StatusBadRequest, "no path provided")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
blogViewerApp.WriteMock(path)
|
|
|
|
ctx.JSON(http.StatusOK, "OK")
|
|
|
|
})
|
|
|
|
|
2023-04-14 15:53:23 +00:00
|
|
|
blogViewerRoute.GET("render", func(ctx *gin.Context) {
|
|
|
|
isMobileParam := ctx.Query("isMobile")
|
2023-04-29 12:02:25 +00:00
|
|
|
path := ctx.Query("path")
|
|
|
|
if path == "" {
|
|
|
|
ctx.JSON(http.StatusBadRequest, "no path provided")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-04-14 15:53:23 +00:00
|
|
|
isMobile := isMobileParam == "true"
|
2023-04-29 13:58:39 +00:00
|
|
|
ginH, err := blogViewerApp.Render(path, isMobile)
|
|
|
|
if err != nil {
|
|
|
|
ctx.JSON(http.StatusInternalServerError, "TODO")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-04-14 15:53:23 +00:00
|
|
|
if isMobile {
|
2023-04-29 13:58:39 +00:00
|
|
|
ctx.HTML(http.StatusOK, "blog-viewer/mobile-app.tmpl", ginH)
|
2023-04-14 15:53:23 +00:00
|
|
|
} else {
|
2023-04-29 13:58:39 +00:00
|
|
|
ctx.HTML(http.StatusOK, "blog-viewer/app.tmpl", ginH)
|
2023-04-14 15:53:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
})
|
|
|
|
}
|
2023-03-17 01:16:51 +00:00
|
|
|
}
|
2023-03-17 16:13:41 +00:00
|
|
|
router.GET("/test", func(ctx *gin.Context) {
|
|
|
|
ctx.HTML(200, "kek/kek.tmpl", gin.H{})
|
|
|
|
})
|
2023-03-15 00:05:24 +00:00
|
|
|
|
|
|
|
if err := router.Run(":8080"); err != nil {
|
|
|
|
log.Panicf("error: %s", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func index(c *gin.Context) {
|
|
|
|
c.HTML(http.StatusOK, "base.html", nil)
|
|
|
|
}
|
2023-04-25 09:37:42 +00:00
|
|
|
|
|
|
|
func FindEnv(parameter string) (string, error) {
|
|
|
|
path, exists := os.LookupEnv(parameter)
|
|
|
|
|
|
|
|
if exists {
|
|
|
|
println("[ENV] Requsted " + parameter + " = " + path) //FIXME Only in Debug log
|
|
|
|
return path, nil
|
|
|
|
} else {
|
|
|
|
panic("[ENV] Requsted " + parameter + " not found")
|
|
|
|
return "", errors.New("env parameter not found")
|
|
|
|
}
|
|
|
|
}
|