-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
113 lines (88 loc) · 3.44 KB
/
main.go
File metadata and controls
113 lines (88 loc) · 3.44 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
package main
import (
"cdn_nerimity_go/config"
"cdn_nerimity_go/database"
"cdn_nerimity_go/handlers"
"cdn_nerimity_go/security"
"cdn_nerimity_go/utils"
"errors"
"path/filepath"
"runtime"
"github.com/cshum/vipsgen/vips"
"github.com/gofiber/fiber/v3"
)
func main() {
env := config.LoadConfig()
_, filename, _, _ := runtime.Caller(0)
env.ProjectRoot = filepath.Dir(filename)
pendingFilesManager := utils.NewPendingFilesManager()
pendingFilesManager.StartCleanup()
utils.FlushTempFilesWithRoot(env.ProjectRoot)
utils.StartVideoThumbnailCleanup(env.ProjectRoot)
// utils.StartFileCleanup()
flake := utils.NewFlake()
jwt := security.NewJWTService(env.JwtSecret)
database := database.NewDatabaseService(env.DatabaseUrl)
utils.StartDeleteExpiredFiles(database)
vips.Startup(nil)
defer vips.Shutdown()
app := fiber.New(fiber.Config{
StreamRequestBody: true,
ErrorHandler: func(c fiber.Ctx, err error) error {
code := fiber.StatusInternalServerError
var e *fiber.Error
if errors.As(err, &e) {
code = e.Code
}
return c.Status(code).JSON(fiber.Map{
"message": err.Error(),
})
},
})
app.Use(func(c fiber.Ctx) error {
origin := c.Get("Origin")
allowedOrigins := map[string]bool{
"https://nerimity.com": true,
"http://local.nerimity.com:3000": true,
"https://latest.nerimity.com": true,
"https://flutter.nerimity.com": true,
}
if origin != "" && allowedOrigins[origin] {
c.Set("Access-Control-Allow-Origin", origin)
} else {
c.Set("Access-Control-Allow-Origin", "https://nerimity.com")
}
if c.Method() == fiber.MethodOptions {
c.Set("Access-Control-Allow-Headers", "Content-Type, Authorization, File-Name")
c.Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, PATCH, OPTIONS")
return c.SendStatus(fiber.StatusNoContent)
}
return c.Next()
})
app.Get("/", func(c fiber.Ctx) error {
return c.SendString("Nerimity CDN Online.")
})
contentHandler := handlers.NewContentHandler(&handlers.ContentHandler{Env: env})
uploadHandler := handlers.NewUploadHandler(&handlers.UploadHandler{Env: env, Flake: flake, Jwt: jwt, PendingFilesManager: pendingFilesManager})
internalHandler := handlers.NewInternalHandler(&handlers.InternalHandler{Env: env, Jwt: jwt, PendingFileManager: pendingFilesManager, Database: database})
proxyHandler := handlers.NewProxyHandler(&handlers.ProxyHandler{Env: env})
// Video thumbnails
app.Get("/attachments/*/thumb.webp", contentHandler.GetContentThumb)
app.Get("/attachments/*", contentHandler.GetContent)
app.Get("/emojis/*", contentHandler.GetContent)
app.Get("/avatars/*", contentHandler.GetContent)
app.Get("/profile_banners/*", contentHandler.GetContent)
app.Get("/external-embed/*", contentHandler.GetContent)
app.Post("/attachments/:groupId", uploadHandler.UploadFile)
app.Post("/avatars/:groupId", uploadHandler.UploadFile)
app.Post("/profile_banners/:groupId", uploadHandler.UploadFile)
app.Post("/emojis", uploadHandler.UploadFile)
app.Get("/proxy-dimensions", proxyHandler.GetImageDimensions)
app.Get("/proxy/:imageUrl/:filename", proxyHandler.GetProxy)
app.Post("/internal/generate-token", internalHandler.GenerateToken)
app.Post("/internal/verify-file", internalHandler.VerifyFile)
app.Delete("/internal/batch", internalHandler.DeleteByFileIds)
app.Delete("/internal/attachments/:groupId/batch", internalHandler.DeleteAttachmentsByGroupId)
app.Delete("/internal/", internalHandler.DeleteFile)
app.Listen(":" + env.Port)
}