-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
134 lines (109 loc) · 2.63 KB
/
Copy pathmain.go
File metadata and controls
134 lines (109 loc) · 2.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package main
import (
"embed"
"io/fs"
"log"
"makedotcsh/database"
"makedotcsh/routes"
"makedotcsh/worker"
"net/http"
"os"
"strings"
"time"
_ "makedotcsh/docs"
cshauth "github.com/computersciencehouse/csh-auth/v2"
"github.com/gin-contrib/cors"
"github.com/gin-contrib/gzip"
"github.com/gin-contrib/logger"
"github.com/gin-gonic/gin"
"github.com/joho/godotenv"
swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
)
//go:embed web/dist/*
var staticFS embed.FS
var distFS fs.FS
var assetsFS fs.FS
func errorHandler(c *gin.Context) {
c.Next()
if c.Writer.Written() {
return
}
err := c.Errors.Last()
if err != nil {
c.AbortWithStatusJSON(500, gin.H{
"error": "Internal server error",
})
}
}
func serveIndex(c *gin.Context) {
data, err := fs.ReadFile(distFS, "index.html")
if err != nil {
c.String(500, err.Error())
return
}
c.Data(200, "text/html; charset=utf-8", data)
}
// @title makedotcsh API
// @host localhost:8080
// @BasePath /api/
func main() {
godotenv.Load()
router := gin.New()
host := os.Getenv("MAKE_HOST")
var err error
// init embed fs
distFS, err = fs.Sub(staticFS, "web/dist")
if err != nil {
panic(err)
}
assetsFS, err = fs.Sub(distFS, "assets")
if err != nil {
panic(err)
}
// init db
database.Init()
defer database.DB.Close()
// init auth
auth, err := cshauth.Init(
os.Getenv("MAKE_OIDC_ID"),
os.Getenv("MAKE_OIDC_SECRET"),
host,
host+"/auth/login",
host+"/auth/callback",
[]string{"profile", "email", "groups"},
)
if err != nil {
log.Panicf("Error initializing CSH auth %v", err)
}
// start worker
worker.StartWorker(10*time.Minute, worker.WorkerTrigger)
router.Use(gzip.Gzip(gzip.DefaultCompression))
router.Use(cors.Default())
router.Use(logger.SetLogger())
router.Use(errorHandler)
// auth
router.GET("/auth/login", auth.HandleLogin) // This endpoint should match the path for loginURL
router.GET("/auth/callback", auth.HandleCallback) // This endpoint should match the path for callbackURL
router.GET("/auth/logout", auth.HandleLogout)
// api
routes.SetRoutes(router, auth)
// frontend
if os.Getenv("DEV") == "true" {
router.NoRoute(auth.CookieMiddleware(), createViteProxy())
} else {
gin.SetMode(gin.ReleaseMode)
router.StaticFS("/assets", http.FS(assetsFS))
router.NoRoute(auth.CookieMiddleware(), func(c *gin.Context) {
if strings.HasPrefix(c.Request.URL.Path, "/api") {
c.JSON(404, gin.H{"error": "not found"})
return
}
serveIndex(c)
})
}
// swag
router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
log.Println("[MAIN] server started")
log.Fatal(router.Run())
}