Files
artalkjs/server/server.go
T
qwqcode 9a680f0ef8 docs: add open api (#360)
* chore(api): add comment for open api

Signed-off-by: qwqcode <qwqcode@gmail.com>

* docs: add open api generation support

Signed-off-by: qwqcode <qwqcode@gmail.com>

---------

Signed-off-by: qwqcode <qwqcode@gmail.com>
2023-01-29 00:13:19 +08:00

159 lines
3.4 KiB
Go

package server
import (
"net/http"
_ "github.com/ArtalkJS/Artalk/docs/swagger"
"github.com/ArtalkJS/Artalk/internal/config"
"github.com/ArtalkJS/Artalk/internal/pkged"
"github.com/ArtalkJS/Artalk/server/common"
h "github.com/ArtalkJS/Artalk/server/handler"
"github.com/ArtalkJS/Artalk/server/middleware"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/filesystem"
"github.com/gofiber/fiber/v2/middleware/pprof"
"github.com/gofiber/swagger"
"github.com/sirupsen/logrus"
)
// @Title Artalk API
// @Version 1.0
// @Description This is an Artalk server.
// @BasePath /api/
// @Contact.name API Support
// @Contact.url https://artalk.js.org
// @Contact.email artalkjs@gmail.com
// @License.name LGPL-3.0
// @License.url https://github.com/ArtalkJS/Artalk/blob/master/LICENSE
// @SecurityDefinitions.apikey ApiKeyAuth
// @In header
// @Name Authorization
// @Description "Type 'Bearer TOKEN' to correctly set the API Key"
func Init(app *fiber.App) {
swaggerDocs(app)
cors(app)
actionLimit(app)
if config.Instance.Debug {
app.Use(pprof.New())
}
api := app.Group("/api", middleware.SiteOriginMiddleware())
{
h.CommentAdd(api)
h.CommentGet(api)
h.Vote(api)
h.PV(api)
h.Stat(api)
h.MarkRead(api)
h.ImgUpload(api)
h.Conf(api)
h.Version(api)
// captcha
h.Captcha(api)
// user
h.UserGet(api)
h.UserLogin(api)
h.UserLoginStatus(api)
h.UserLogout(api)
// admin
admin(api)
}
index(app)
static(app)
uploadedStatic(app)
}
func admin(f fiber.Router) {
admin := f.Group("/admin", middleware.AdminOnlyMiddleware())
{
h.AdminCommentEdit(admin)
h.AdminCommentDel(admin)
h.AdminPageGet(admin)
h.AdminPageEdit(admin)
h.AdminPageDel(admin)
h.AdminPageFetch(admin)
h.AdminSiteGet(admin)
h.AdminSiteAdd(admin)
h.AdminSiteEdit(admin)
h.AdminSiteDel(admin)
h.AdminUserGet(admin)
h.AdminUserAdd(admin)
h.AdminUserEdit(admin)
h.AdminUserDel(admin)
h.AdminCacheWarm(admin)
h.AdminCacheFlush(admin)
h.AdminSendMail(admin)
h.AdminVoteSync(admin)
h.AdminSettingGet(admin)
h.AdminSettingSave(admin)
h.AdminSettingTpl(admin)
h.AdminTransfer(admin)
}
}
func cors(f fiber.Router) {
f.Use(middleware.CorsMiddleware())
}
func actionLimit(f fiber.Router) {
f.Use(middleware.ActionLimitMiddleware(middleware.ActionLimitConf{
// 启用操作限制路径白名单
ProtectPaths: []string{
"/api/add",
"/api/login",
"/api/vote",
"/api/img-upload",
},
}))
}
func static(f fiber.Router) {
f.Use("/", filesystem.New(filesystem.Config{
Root: http.FS(pkged.FS()),
PathPrefix: "public",
Browse: false,
}))
}
func index(f fiber.Router) {
f.All("/", func(c *fiber.Ctx) error {
if _, err := pkged.FS().Open("public/sidebar/index.html"); err == nil {
return c.Redirect("./sidebar/", fiber.StatusFound)
}
return c.Status(fiber.StatusOK).JSON(common.GetApiVersionDataMap())
})
}
func uploadedStatic(f fiber.Router) {
if config.Instance.ImgUpload.Path == "" {
config.Instance.ImgUpload.Path = "./data/artalk-img/"
logrus.Warn("[Image Upload] img_upload.path is not configured, using the default value: " + config.Instance.ImgUpload.Path)
}
// 图片上传静态资源可访问路径
f.Static(config.IMG_UPLOAD_PUBLIC_PATH, config.Instance.ImgUpload.Path)
}
func swaggerDocs(f fiber.Router) {
f.Get("/swagger/*", swagger.HandlerDefault)
}