-
Notifications
You must be signed in to change notification settings - Fork 0
/
coalesce.go
116 lines (94 loc) · 3.21 KB
/
coalesce.go
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
// coalesce/coalesce.go
package main
import (
"flag"
"log"
"os"
"runtime"
gcfg "gopkg.in/gcfg.v1"
_ "github.com/mattn/go-sqlite3"
"github.com/nytopop/coalesce/controllers"
"github.com/nytopop/coalesce/models"
"github.com/gin-gonic/contrib/sessions"
"github.com/gin-gonic/gin"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
// process flags
var configFile = flag.String("cfg", "/etc/coalesce.conf", "path to configuration file")
flag.Parse()
// Configuration file
err := gcfg.ReadFileInto(&cfg, *configFile)
if err != nil {
log.Fatalln(err)
}
// Logging
errlog, err := os.Create(cfg.System.ErrorLog)
if err != nil {
log.Fatalln(err)
}
acclog, err := os.Create(cfg.System.AccessLog)
if err != nil {
log.Fatalln(err)
}
logs := controllers.Logs{
Error: log.New(errlog, "", log.Ldate|log.Ltime),
Access: log.New(acclog, "", log.Ldate|log.Ltime),
}
// Database initialization
err = models.InitDB(cfg.System.Database, cfg.System.DatabaseInit)
if err != nil {
logs.Error.Fatalln(err)
}
defer models.CloseDB()
models.Site.SiteTitle = cfg.Site.Title
models.Site.Copyright = cfg.Site.Copyright
models.Site.Email = cfg.Site.Email
gin.SetMode(gin.ReleaseMode)
pub := gin.New()
// middleware
pub.Use(controllers.Logger(logs))
pub.Use(gin.Recovery())
// session management TODO secret
secret := []byte(os.Getenv("SESSION_SECRET"))
store := sessions.NewCookieStore(secret)
pub.Use(sessions.Sessions("coalesce", store))
// authentication
pub.Use(controllers.AuthCheckpoint())
commentors := pub.Group("/", controllers.AccessLevelAuth(1))
editors := pub.Group("/", controllers.AccessLevelAuth(2))
admins := pub.Group("/", controllers.AccessLevelAuth(3))
// templates
pub.LoadHTMLGlob(cfg.System.ResourceDir + "/templates/**/*.html")
// routes
pub.Static("/static", cfg.System.ResourceDir+"/static")
pub.StaticFile("favicon.png", cfg.System.ResourceDir+"/favicon.png")
pub.GET("/", controllers.Home)
// /posts
pub.GET("/posts", controllers.PostsPage)
pub.GET("/posts/view/:id", controllers.PostsView)
editors.GET("/posts/new", controllers.PostsNew)
editors.POST("/posts/new", controllers.PostsTryNew)
editors.GET("/posts/edit/:id", controllers.PostsEdit)
editors.POST("/posts/edit/:id", controllers.PostsTryEdit)
editors.GET("/posts/del/:id", controllers.PostsTryDelete)
// /comments
commentors.POST("/comments/new", controllers.CommentsTryNew)
commentors.POST("/comments/reply", controllers.CommentsTryReply)
commentors.GET("/comments/del/:id", controllers.CommentsTryDelete)
// /auth
pub.GET("/auth/sign-in", controllers.AuthSignIn)
pub.POST("/auth/sign-in", controllers.AuthTrySignIn)
pub.GET("/auth/sign-out", controllers.AuthSignOut)
pub.GET("/auth/register", controllers.AuthRegister)
pub.POST("/auth/register", controllers.AuthTryRegister)
// /users
commentors.GET("/users/me", controllers.UsersMe)
commentors.POST("/users/passchange", controllers.UsersTryPassChange)
commentors.GET("/users/myposts", controllers.UsersMyPosts)
admins.GET("/users/all", controllers.UsersAll)
admins.GET("/users/promote/:id", controllers.UsersTryPromote)
admins.GET("/users/demote/:id", controllers.UsersTryDemote)
admins.GET("/users/del/:id", controllers.UsersTryDelete)
pub.Run(cfg.System.Listen)
}