2019-11-05 12:31:22 +08:00
package routers
import (
2025-04-20 17:31:25 +08:00
"net/http"
"github.com/abslant/gzip"
"github.com/cloudreve/Cloudreve/v4/application/constants"
"github.com/cloudreve/Cloudreve/v4/application/dependency"
"github.com/cloudreve/Cloudreve/v4/inventory/types"
"github.com/cloudreve/Cloudreve/v4/middleware"
"github.com/cloudreve/Cloudreve/v4/pkg/cluster"
"github.com/cloudreve/Cloudreve/v4/pkg/conf"
"github.com/cloudreve/Cloudreve/v4/pkg/downloader/slave"
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/fs"
"github.com/cloudreve/Cloudreve/v4/pkg/hashid"
"github.com/cloudreve/Cloudreve/v4/pkg/logging"
"github.com/cloudreve/Cloudreve/v4/pkg/webdav"
"github.com/cloudreve/Cloudreve/v4/routers/controllers"
adminsvc "github.com/cloudreve/Cloudreve/v4/service/admin"
"github.com/cloudreve/Cloudreve/v4/service/basic"
"github.com/cloudreve/Cloudreve/v4/service/explorer"
"github.com/cloudreve/Cloudreve/v4/service/node"
"github.com/cloudreve/Cloudreve/v4/service/setting"
sharesvc "github.com/cloudreve/Cloudreve/v4/service/share"
usersvc "github.com/cloudreve/Cloudreve/v4/service/user"
2019-12-13 19:00:58 +08:00
"github.com/gin-contrib/cors"
2019-11-05 12:31:22 +08:00
"github.com/gin-gonic/gin"
)
2019-12-23 13:27:18 +08:00
// InitRouter 初始化路由
2025-04-20 17:31:25 +08:00
func InitRouter ( dep dependency . Dep ) * gin . Engine {
l := dep . Logger ( )
if dep . ConfigProvider ( ) . System ( ) . Mode == conf . MasterMode {
l . Info ( "Current running mode: Master." )
return initMasterRouter ( dep )
2019-12-16 19:43:00 +08:00
}
2019-12-23 13:27:18 +08:00
2025-04-20 17:31:25 +08:00
l . Info ( "Current running mode: Slave." )
return initSlaveRouter ( dep )
}
func newGinEngine ( dep dependency . Dep ) * gin . Engine {
r := gin . New ( )
r . ContextWithFallback = true
r . Use ( gin . Recovery ( ) )
r . Use ( middleware . InitializeHandling ( dep ) )
if dep . ConfigProvider ( ) . System ( ) . Mode == conf . SlaveMode {
r . Use ( middleware . InitializeHandlingSlave ( ) )
}
r . Use ( middleware . Logging ( ) )
return r
}
func initSlaveFileRouter ( v4 * gin . RouterGroup ) {
// Upload related, no signature required under this router group
upload := v4 . Group ( "upload" )
{
// 上传分片
upload . POST ( ":sessionId" ,
controllers . FromUri [ explorer . UploadService ] ( explorer . UploadParameterCtx { } ) ,
controllers . SlaveUpload ,
)
// 创建上传会话上传
upload . PUT ( "" ,
controllers . FromJSON [ explorer . SlaveCreateUploadSessionService ] ( explorer . SlaveCreateUploadSessionParamCtx { } ) ,
controllers . SlaveGetUploadSession ,
)
// 删除上传会话
upload . DELETE ( ":sessionId" ,
controllers . FromUri [ explorer . SlaveDeleteUploadSessionService ] ( explorer . SlaveDeleteUploadSessionParamCtx { } ) ,
controllers . SlaveDeleteUploadSession )
}
file := v4 . Group ( "file" )
{
// Get entity content for preview/download
file . GET ( "content/:nodeId/:src/:speed/:name" ,
middleware . Sandbox ( ) ,
controllers . FromUri [ explorer . EntityDownloadService ] ( explorer . EntityDownloadParameterCtx { } ) ,
controllers . SlaveServeEntity ,
)
file . HEAD ( "content/:nodeId/:src/:speed/:name" ,
controllers . FromUri [ explorer . EntityDownloadService ] ( explorer . EntityDownloadParameterCtx { } ) ,
controllers . SlaveServeEntity ,
)
// Get media metadata
file . GET ( "meta/:src/:ext" ,
controllers . FromUri [ explorer . SlaveMetaService ] ( explorer . SlaveMetaParamCtx { } ) ,
controllers . SlaveMeta ,
)
// Get thumbnail
file . GET ( "thumb/:src/:ext" ,
controllers . FromUri [ explorer . SlaveThumbService ] ( explorer . SlaveThumbParamCtx { } ) ,
controllers . SlaveThumb ,
)
// 删除文件
file . DELETE ( "" ,
controllers . FromJSON [ explorer . SlaveDeleteFileService ] ( explorer . SlaveDeleteFileParamCtx { } ) ,
controllers . SlaveDelete )
2025-05-20 10:45:16 +08:00
// 列出文件
file . GET ( "list" ,
controllers . FromQuery [ explorer . SlaveListService ] ( explorer . SlaveListParamCtx { } ) ,
controllers . SlaveList ,
)
2025-04-20 17:31:25 +08:00
}
2019-12-16 19:43:00 +08:00
}
2025-04-20 17:31:25 +08:00
// initSlaveRouter 初始化从机模式路由
func initSlaveRouter ( dep dependency . Dep ) * gin . Engine {
r := newGinEngine ( dep )
2019-12-23 13:27:18 +08:00
// 跨域相关
2025-04-20 17:31:25 +08:00
initCORS ( dep . Logger ( ) , dep . ConfigProvider ( ) , r )
v4 := r . Group ( constants . APIPrefix + "/slave" )
2019-12-23 13:27:18 +08:00
// 鉴权中间件
2025-04-20 17:31:25 +08:00
v4 . Use ( middleware . SignRequired ( dep . GeneralAuth ( ) ) )
2022-04-13 17:53:46 +08:00
// 禁止缓存
2025-04-20 17:31:25 +08:00
v4 . Use ( middleware . CacheControl ( ) )
2019-12-23 13:27:18 +08:00
2019-11-12 16:53:32 +08:00
/ *
2019-12-23 13:27:18 +08:00
路由
2019-11-12 16:53:32 +08:00
* /
2019-12-23 13:27:18 +08:00
{
2020-02-27 11:17:59 +08:00
// Ping
2025-04-20 17:31:25 +08:00
v4 . POST ( "ping" ,
controllers . FromJSON [ adminsvc . SlavePingService ] ( adminsvc . SlavePingParameterCtx { } ) ,
controllers . SlavePing ,
)
// // 测试 Aria2 RPC 连接
// v4.POST("ping/aria2", controllers.AdminTestAria2)
initSlaveFileRouter ( v4 )
2021-10-31 09:41:56 +08:00
// 离线下载
2025-04-20 17:31:25 +08:00
download := v4 . Group ( "download" )
2021-10-31 09:41:56 +08:00
{
// 创建离线下载任务
2025-04-20 17:31:25 +08:00
download . POST ( "task" ,
controllers . FromJSON [ slave . CreateSlaveDownload ] ( node . CreateSlaveDownloadTaskParamCtx { } ) ,
middleware . PrepareSlaveDownloader ( dep , node . CreateSlaveDownloadTaskParamCtx { } ) ,
controllers . SlaveDownloadTaskCreate )
2021-10-31 09:41:56 +08:00
// 获取任务状态
2025-04-20 17:31:25 +08:00
download . POST ( "status" ,
controllers . FromJSON [ slave . GetSlaveDownload ] ( node . GetSlaveDownloadTaskParamCtx { } ) ,
middleware . PrepareSlaveDownloader ( dep , node . GetSlaveDownloadTaskParamCtx { } ) ,
controllers . SlaveDownloadTaskStatus )
2021-10-31 09:41:56 +08:00
// 取消离线下载任务
2025-04-20 17:31:25 +08:00
download . POST ( "cancel" ,
controllers . FromJSON [ slave . CancelSlaveDownload ] ( node . CancelSlaveDownloadTaskParamCtx { } ) ,
middleware . PrepareSlaveDownloader ( dep , node . CancelSlaveDownloadTaskParamCtx { } ) ,
controllers . SlaveCancelDownloadTask )
2021-10-31 09:41:56 +08:00
// 选取任务文件
2025-04-20 17:31:25 +08:00
download . POST ( "select" ,
controllers . FromJSON [ slave . SetSlaveFilesToDownload ] ( node . SelectSlaveDownloadFilesParamCtx { } ) ,
middleware . PrepareSlaveDownloader ( dep , node . SelectSlaveDownloadFilesParamCtx { } ) ,
controllers . SlaveSelectFilesToDownload )
// 测试下载器连接
download . POST ( "test" ,
controllers . FromJSON [ slave . TestSlaveDownload ] ( node . TestSlaveDownloadParamCtx { } ) ,
middleware . PrepareSlaveDownloader ( dep , node . TestSlaveDownloadParamCtx { } ) ,
controllers . SlaveTestDownloader ,
)
2021-10-31 09:41:56 +08:00
}
// 异步任务
2025-04-20 17:31:25 +08:00
task := v4 . Group ( "task" )
2021-10-31 09:41:56 +08:00
{
2025-04-20 17:31:25 +08:00
task . PUT ( "" ,
controllers . FromJSON [ cluster . CreateSlaveTask ] ( node . CreateSlaveTaskParamCtx { } ) ,
controllers . SlaveCreateTask )
task . GET ( ":id" ,
controllers . FromUri [ node . GetSlaveTaskService ] ( node . GetSlaveTaskParamCtx { } ) ,
controllers . SlaveGetTask )
task . POST ( "cleanup" ,
controllers . FromJSON [ cluster . FolderCleanup ] ( node . FolderCleanupParamCtx { } ) ,
controllers . SlaveCleanupFolder )
2021-10-31 09:41:56 +08:00
}
2019-12-23 13:27:18 +08:00
}
return r
}
2019-11-12 16:53:32 +08:00
2025-04-20 17:31:25 +08:00
// initCORS 初始化跨域配置
func initCORS ( l logging . Logger , config conf . ConfigProvider , router * gin . Engine ) {
c := config . Cors ( )
if c . AllowOrigins [ 0 ] != "UNSET" {
2019-12-29 13:15:09 +08:00
router . Use ( cors . New ( cors . Config {
2025-04-20 17:31:25 +08:00
AllowOrigins : c . AllowOrigins ,
AllowMethods : c . AllowMethods ,
AllowHeaders : c . AllowHeaders ,
AllowCredentials : c . AllowCredentials ,
ExposeHeaders : c . ExposeHeaders ,
2019-12-13 19:00:58 +08:00
} ) )
2019-12-23 13:27:18 +08:00
return
2019-12-13 19:00:58 +08:00
}
2019-11-23 15:09:46 +08:00
2019-12-23 13:27:18 +08:00
// slave模式下未启动跨域的警告
2025-04-20 17:31:25 +08:00
if config . System ( ) . Mode == conf . SlaveMode {
l . Warning ( "You are running Cloudreve as slave node, if you are using slave storage policy, please enable CORS feature in config file, otherwise file cannot be uploaded from Master basic." )
2019-12-23 13:27:18 +08:00
}
}
2025-04-20 17:31:25 +08:00
// initMasterRouter 初始化主机模式路由
func initMasterRouter ( dep dependency . Dep ) * gin . Engine {
r := newGinEngine ( dep )
// 跨域相关
initCORS ( dep . Logger ( ) , dep . ConfigProvider ( ) , r ) // Done
2020-02-23 11:41:39 +08:00
/ *
静态资源
* /
2025-04-20 17:31:25 +08:00
r . Use ( gzip . GzipHandler ( ) ) // Done
r . Use ( middleware . FrontendFileHandler ( dep ) ) // Done
r . GET ( "manifest.json" , controllers . Manifest ) // Done
2020-02-23 11:41:39 +08:00
2025-04-20 17:31:25 +08:00
noAuth := r . Group ( constants . APIPrefix )
wopi := noAuth . Group ( "file/wopi" , middleware . HashID ( hashid . FileID ) , middleware . ViewerSessionValidation ( ) )
{
// 获取文件信息
wopi . GET ( ":id" , controllers . CheckFileInfo )
// 获取文件内容
wopi . GET ( ":id/contents" , controllers . GetFile )
// 更新文件内容
wopi . POST ( ":id/contents" , controllers . PutFile )
// 通用文件操作
wopi . POST ( ":id" , controllers . ModifyFile )
}
v4 := r . Group ( constants . APIPrefix )
2020-02-23 10:19:13 +08:00
2019-12-23 13:27:18 +08:00
/ *
中间件
* /
2025-04-20 17:31:25 +08:00
v4 . Use ( middleware . Session ( dep ) ) // Done
2022-04-13 17:53:46 +08:00
// 用户会话
2025-04-20 17:31:25 +08:00
v4 . Use ( middleware . CurrentUser ( ) )
2019-11-11 19:13:17 +08:00
2022-04-13 17:53:46 +08:00
// 禁止缓存
2025-04-20 17:31:25 +08:00
v4 . Use ( middleware . CacheControl ( ) ) // Done
2022-04-13 17:53:46 +08:00
2019-11-12 16:53:32 +08:00
/ *
路由
* /
2019-11-05 12:31:22 +08:00
{
2022-10-29 11:06:07 +08:00
// Redirect file source link
source := r . Group ( "f" )
{
source . GET ( ":id/:name" ,
middleware . HashID ( hashid . SourceLinkID ) ,
2025-07-15 13:22:04 +08:00
controllers . AnonymousPermLink ( false ) )
source . GET ( "d/:id/:name" ,
middleware . HashID ( hashid . SourceLinkID ) ,
controllers . AnonymousPermLink ( true ) )
2022-10-29 11:06:07 +08:00
}
2025-04-20 17:31:25 +08:00
shareShort := r . Group ( "s" )
{
shareShort . GET ( ":id" ,
controllers . FromUri [ sharesvc . ShortLinkRedirectService ] ( sharesvc . ShortLinkRedirectParamCtx { } ) ,
controllers . ShareRedirect ,
)
shareShort . GET ( ":id/:password" ,
controllers . FromUri [ sharesvc . ShortLinkRedirectService ] ( sharesvc . ShortLinkRedirectParamCtx { } ) ,
controllers . ShareRedirect ,
)
}
2019-12-10 17:10:34 +08:00
// 全局设置相关
2025-04-20 17:31:25 +08:00
site := v4 . Group ( "site" )
2019-12-10 17:10:34 +08:00
{
// 测试用路由
site . GET ( "ping" , controllers . Ping )
// 验证码
site . GET ( "captcha" , controllers . Captcha )
// 站点全局配置
2025-04-20 17:31:25 +08:00
site . GET ( "config/:section" ,
controllers . FromUri [ basic . GetSettingService ] ( basic . GetSettingParamCtx { } ) ,
controllers . SiteConfig ,
)
}
// User authentication
session := v4 . Group ( "session" )
{
token := session . Group ( "token" )
// Token based authentication
{
// 用户登录
token . POST ( "" ,
middleware . CaptchaRequired ( func ( c * gin . Context ) bool {
return dep . SettingProvider ( ) . LoginCaptchaEnabled ( c )
} ) ,
controllers . FromJSON [ usersvc . UserLoginService ] ( usersvc . LoginParameterCtx { } ) ,
controllers . UserLoginValidation ,
controllers . UserIssueToken ,
)
// 2-factor authentication
token . POST ( "2fa" ,
controllers . FromJSON [ usersvc . OtpValidationService ] ( usersvc . OtpValidationParameterCtx { } ) ,
controllers . UserLogin2FAValidation ,
controllers . UserIssueToken ,
)
token . POST ( "refresh" ,
controllers . FromJSON [ usersvc . RefreshTokenService ] ( usersvc . RefreshTokenParameterCtx { } ) ,
controllers . UserRefreshToken ,
)
2025-05-23 16:49:01 +08:00
token . DELETE ( "" ,
controllers . FromJSON [ usersvc . RefreshTokenService ] ( usersvc . RefreshTokenParameterCtx { } ) ,
controllers . UserSignOut ,
)
2025-04-20 17:31:25 +08:00
}
// Prepare login
session . GET ( "prepare" ,
controllers . FromQuery [ usersvc . PrepareLoginService ] ( usersvc . PrepareLoginParameterCtx { } ) ,
controllers . UserPrepareLogin ,
)
authn := session . Group ( "authn" )
{
// WebAuthn login prepare
authn . PUT ( "" ,
middleware . IsFunctionEnabled ( func ( c * gin . Context ) bool {
return dep . SettingProvider ( ) . AuthnEnabled ( c )
} ) ,
controllers . StartLoginAuthn ,
)
// WebAuthn finish login
authn . POST ( "" ,
middleware . IsFunctionEnabled ( func ( c * gin . Context ) bool {
return dep . SettingProvider ( ) . AuthnEnabled ( c )
} ) ,
controllers . FromJSON [ usersvc . FinishPasskeyLoginService ] ( usersvc . FinishPasskeyLoginParameterCtx { } ) ,
controllers . FinishLoginAuthn ,
controllers . UserIssueToken ,
)
}
2019-12-10 17:10:34 +08:00
}
2019-12-10 11:55:28 +08:00
2019-12-10 17:10:34 +08:00
// 用户相关路由
2025-04-20 17:31:25 +08:00
user := v4 . Group ( "user" )
2019-12-10 11:55:28 +08:00
{
2025-04-20 17:31:25 +08:00
// 用户注册 Done
2020-02-22 10:36:50 +08:00
user . POST ( "" ,
2025-04-20 17:31:25 +08:00
middleware . IsFunctionEnabled ( func ( c * gin . Context ) bool {
return dep . SettingProvider ( ) . RegisterEnabled ( c )
} ) ,
middleware . CaptchaRequired ( func ( c * gin . Context ) bool {
return dep . SettingProvider ( ) . RegCaptchaEnabled ( c )
} ) ,
controllers . FromJSON [ usersvc . UserRegisterService ] ( usersvc . RegisterParameterCtx { } ) ,
2020-02-22 10:36:50 +08:00
controllers . UserRegister ,
)
// 通过邮件里的链接重设密码
2025-04-20 17:31:25 +08:00
user . PATCH ( "reset/:id" ,
2020-02-22 09:50:34 +08:00
middleware . HashID ( hashid . UserID ) ,
2025-04-20 17:31:25 +08:00
controllers . FromJSON [ usersvc . UserResetService ] ( usersvc . UserResetParameterCtx { } ) ,
controllers . UserReset ,
2020-02-22 10:36:50 +08:00
)
2025-04-20 17:31:25 +08:00
// 发送密码重设邮件
user . POST ( "reset" ,
middleware . CaptchaRequired ( func ( c * gin . Context ) bool {
return dep . SettingProvider ( ) . ForgotPasswordCaptchaEnabled ( c )
} ) ,
controllers . FromJSON [ usersvc . UserResetEmailService ] ( usersvc . UserResetEmailParameterCtx { } ) ,
controllers . UserSendReset ,
2020-02-22 10:36:50 +08:00
)
2025-04-20 17:31:25 +08:00
// 邮件激活 Done
user . GET ( "activate/:id" ,
middleware . SignRequired ( dep . GeneralAuth ( ) ) ,
2020-02-18 15:34:40 +08:00
middleware . HashID ( hashid . UserID ) ,
2025-04-20 17:31:25 +08:00
controllers . UserActivate ,
2020-02-18 15:34:40 +08:00
)
2020-02-19 16:05:54 +08:00
// 获取用户头像
2025-04-20 17:31:25 +08:00
user . GET ( "avatar/:id" ,
2020-02-19 16:05:54 +08:00
middleware . HashID ( hashid . UserID ) ,
2025-04-20 17:31:25 +08:00
controllers . FromQuery [ usersvc . GetAvatarService ] ( usersvc . GetAvatarServiceParamsCtx { } ) ,
2020-02-19 16:05:54 +08:00
controllers . GetUserAvatar ,
)
2025-04-20 17:31:25 +08:00
// User info
user . GET ( "info/:id" , middleware . HashID ( hashid . UserID ) , controllers . UserGet )
// List user shares
user . GET ( "shares/:id" ,
middleware . HashID ( hashid . UserID ) ,
controllers . FromQuery [ sharesvc . ListShareService ] ( sharesvc . ListShareParamCtx { } ) ,
controllers . ListPublicShare ,
)
2019-12-10 11:55:28 +08:00
}
2019-12-10 17:10:34 +08:00
// 需要携带签名验证的
2025-04-20 17:31:25 +08:00
sign := v4 . Group ( "" )
sign . Use ( middleware . SignRequired ( dep . GeneralAuth ( ) ) )
2019-12-10 17:10:34 +08:00
{
file := sign . Group ( "file" )
{
2025-04-20 17:31:25 +08:00
file . GET ( "archive/:sessionID/archive.zip" ,
controllers . FromUri [ explorer . ArchiveService ] ( explorer . ArchiveParamCtx { } ) ,
controllers . DownloadArchive ,
2022-12-14 15:28:19 +08:00
)
2019-12-10 17:10:34 +08:00
}
2022-12-19 17:34:57 +08:00
2022-12-19 17:35:39 +08:00
// Copy user session
sign . GET (
"user/session/copy/:id" ,
middleware . MobileRequestOnly ( ) ,
controllers . UserPerformCopySession ,
)
2019-12-10 17:10:34 +08:00
}
2019-11-05 12:31:22 +08:00
2025-04-20 17:31:25 +08:00
// Receive calls from slave node
slave := v4 . Group ( "slave" )
slave . Use (
middleware . SlaveRPCSignRequired ( ) ,
)
2021-10-31 09:41:56 +08:00
{
2025-04-20 17:31:25 +08:00
initSlaveFileRouter ( slave )
// Get credential
slave . GET ( "credential/:id" ,
controllers . FromUri [ node . OauthCredentialService ] ( node . OauthCredentialParamCtx { } ) ,
controllers . SlaveGetCredential )
statelessUpload := slave . Group ( "statelessUpload" )
2022-03-13 16:20:50 +08:00
{
2025-04-20 17:31:25 +08:00
// Prepare upload
statelessUpload . PUT ( "prepare" ,
controllers . FromJSON [ fs . StatelessPrepareUploadService ] ( node . StatelessPrepareUploadParamCtx { } ) ,
controllers . StatelessPrepareUpload )
// Complete upload
statelessUpload . POST ( "complete" ,
controllers . FromJSON [ fs . StatelessCompleteUploadService ] ( node . StatelessCompleteUploadParamCtx { } ) ,
controllers . StatelessCompleteUpload )
// On upload failed
statelessUpload . POST ( "failed" ,
controllers . FromJSON [ fs . StatelessOnUploadFailedService ] ( node . StatelessOnUploadFailedParamCtx { } ) ,
controllers . StatelessOnUploadFailed )
// Create file
statelessUpload . POST ( "create" ,
controllers . FromJSON [ fs . StatelessCreateFileService ] ( node . StatelessCreateFileParamCtx { } ) ,
controllers . StatelessCreateFile )
2022-03-13 16:20:50 +08:00
}
2021-10-31 09:41:56 +08:00
}
2019-12-30 19:08:38 +08:00
// 回调接口
2025-04-20 17:31:25 +08:00
callback := v4 . Group ( "callback" )
2019-12-30 19:08:38 +08:00
{
2020-01-15 10:14:15 +08:00
// 远程策略上传回调
2019-12-30 19:08:38 +08:00
callback . POST (
2022-03-03 19:17:25 +08:00
"remote/:sessionID/:key" ,
2025-04-20 17:31:25 +08:00
middleware . UseUploadSession ( types . PolicyTypeRemote ) ,
2019-12-30 19:08:38 +08:00
middleware . RemoteCallbackAuth ( ) ,
2025-04-20 17:31:25 +08:00
controllers . ProcessCallback ( http . StatusOK , false ) ,
2019-12-30 19:08:38 +08:00
)
2025-04-20 17:31:25 +08:00
// OSS callback
2020-01-15 10:14:15 +08:00
callback . POST (
2025-04-20 17:31:25 +08:00
"oss/:sessionID/:key" ,
middleware . UseUploadSession ( types . PolicyTypeOss ) ,
2020-01-16 13:36:13 +08:00
middleware . OSSCallbackAuth ( ) ,
2025-04-20 17:31:25 +08:00
controllers . OSSCallbackValidate ,
controllers . ProcessCallback ( http . StatusBadRequest , false ) ,
2020-01-16 13:36:13 +08:00
)
2020-01-18 10:40:03 +08:00
// 又拍云策略上传回调
callback . POST (
2025-04-20 17:31:25 +08:00
"upyun/:sessionID/:key" ,
middleware . UseUploadSession ( types . PolicyTypeUpyun ) ,
controllers . UpyunCallbackAuth ,
controllers . ProcessCallback ( http . StatusBadRequest , false ) ,
2020-01-18 10:40:03 +08:00
)
2020-01-20 14:34:21 +08:00
onedrive := callback . Group ( "onedrive" )
{
// 文件上传完成
onedrive . POST (
2025-04-20 17:31:25 +08:00
":sessionID/:key" ,
middleware . UseUploadSession ( types . PolicyTypeOd ) ,
controllers . ProcessCallback ( http . StatusOK , false ) ,
2020-03-01 17:57:18 +08:00
)
2020-01-20 14:34:21 +08:00
}
2023-05-24 14:39:54 +08:00
// Google Drive related
gdrive := callback . Group ( "googledrive" )
{
// OAuth 完成
gdrive . GET (
"auth" ,
controllers . GoogleDriveOAuth ,
)
}
2020-01-23 12:38:32 +08:00
// 腾讯云COS策略上传回调
callback . GET (
2025-04-20 17:31:25 +08:00
"cos/:sessionID/:key" ,
middleware . UseUploadSession ( types . PolicyTypeCos ) ,
controllers . ProcessCallback ( http . StatusBadRequest , false ) ,
2020-01-23 12:38:32 +08:00
)
2020-06-05 14:45:24 +08:00
// AWS S3策略上传回调
callback . GET (
2025-04-20 17:31:25 +08:00
"s3/:sessionID/:key" ,
middleware . UseUploadSession ( types . PolicyTypeS3 ) ,
controllers . ProcessCallback ( http . StatusBadRequest , false ) ,
)
2025-07-21 16:08:22 +08:00
// 金山 ks3策略上传回调
callback . GET (
"ks3/:sessionID/:key" ,
middleware . UseUploadSession ( types . PolicyTypeKs3 ) ,
controllers . ProcessCallback ( http . StatusBadRequest , false ) ,
)
2025-04-20 17:31:25 +08:00
// Huawei OBS upload callback
callback . POST (
"obs/:sessionID/:key" ,
middleware . UseUploadSession ( types . PolicyTypeObs ) ,
controllers . ProcessCallback ( http . StatusBadRequest , false ) ,
)
// Qiniu callback
callback . POST (
"qiniu/:sessionID/:key" ,
middleware . UseUploadSession ( types . PolicyTypeQiniu ) ,
controllers . QiniuCallbackValidate ,
controllers . ProcessCallback ( http . StatusBadRequest , true ) ,
2020-06-05 14:45:24 +08:00
)
2019-12-30 19:08:38 +08:00
}
2025-04-20 17:31:25 +08:00
// Workflows
wf := v4 . Group ( "workflow" )
wf . Use ( middleware . LoginRequired ( ) )
{
// List
wf . GET ( "" ,
controllers . FromQuery [ explorer . ListTaskService ] ( explorer . ListTaskParamCtx { } ) ,
controllers . ListTasks ,
)
// GetTaskProgress
wf . GET ( "progress/:id" ,
middleware . HashID ( hashid . TaskID ) ,
controllers . GetTaskPhaseProgress ,
)
// Create task to create an archive file
wf . POST ( "archive" ,
controllers . FromJSON [ explorer . ArchiveWorkflowService ] ( explorer . CreateArchiveParamCtx { } ) ,
controllers . CreateArchive ,
)
// Create task to extract an archive file
wf . POST ( "extract" ,
controllers . FromJSON [ explorer . ArchiveWorkflowService ] ( explorer . CreateArchiveParamCtx { } ) ,
controllers . ExtractArchive ,
)
remoteDownload := wf . Group ( "download" )
{
// Create task to download a file
remoteDownload . POST ( "" ,
controllers . FromJSON [ explorer . DownloadWorkflowService ] ( explorer . CreateDownloadParamCtx { } ) ,
controllers . CreateRemoteDownload ,
)
// Set download target
remoteDownload . PATCH ( ":id" ,
middleware . HashID ( hashid . TaskID ) ,
controllers . FromJSON [ explorer . SetDownloadFilesService ] ( explorer . SetDownloadFilesParamCtx { } ) ,
controllers . SetDownloadTaskTarget ,
)
remoteDownload . DELETE ( ":id" ,
middleware . HashID ( hashid . TaskID ) ,
controllers . CancelDownloadTask ,
)
}
}
// 文件
file := v4 . Group ( "file" )
2020-01-26 14:57:07 +08:00
{
2025-04-20 17:31:25 +08:00
// List files
file . GET ( "" ,
controllers . FromQuery [ explorer . ListFileService ] ( explorer . ListFileParameterCtx { } ) ,
controllers . ListDirectory ,
)
2025-09-02 11:54:04 +08:00
file . GET ( "archive" ,
controllers . FromQuery [ explorer . ArchiveListFilesService ] ( explorer . ArchiveListFilesParamCtx { } ) ,
controllers . ListArchiveFiles ,
)
2025-04-20 17:31:25 +08:00
// Create file
file . POST ( "create" ,
controllers . FromJSON [ explorer . CreateFileService ] ( explorer . CreateFileParameterCtx { } ) ,
controllers . CreateFile ,
)
// Rename file
file . POST ( "rename" ,
controllers . FromJSON [ explorer . RenameFileService ] ( explorer . RenameFileParameterCtx { } ) ,
controllers . RenameFile ,
2020-01-31 15:12:15 +08:00
)
2025-04-20 17:31:25 +08:00
// Move or copy files
file . POST ( "move" ,
controllers . FromJSON [ explorer . MoveFileService ] ( explorer . MoveFileParameterCtx { } ) ,
middleware . ValidateBatchFileCount ( dep , explorer . MoveFileParameterCtx { } ) ,
controllers . MoveFile )
// Get URL of the file for preview/download
file . POST ( "url" ,
middleware . ContextHint ( ) ,
controllers . FromJSON [ explorer . FileURLService ] ( explorer . FileURLParameterCtx { } ) ,
middleware . ValidateBatchFileCount ( dep , explorer . FileURLParameterCtx { } ) ,
controllers . FileURL ,
)
// Update file content
file . PUT ( "content" ,
controllers . FromQuery [ explorer . FileUpdateService ] ( explorer . FileUpdateParameterCtx { } ) ,
controllers . PutContent )
// Get entity content for preview/download
content := file . Group ( "content" )
contentCors := cors . New ( cors . Config {
AllowOrigins : [ ] string { "*" } ,
} )
content . Use ( contentCors )
{
content . OPTIONS ( "*option" , contentCors )
content . GET ( ":id/:speed/:name" ,
middleware . SignRequired ( dep . GeneralAuth ( ) ) ,
middleware . HashID ( hashid . EntityID ) ,
middleware . Sandbox ( ) ,
controllers . FromUri [ explorer . EntityDownloadService ] ( explorer . EntityDownloadParameterCtx { } ) ,
controllers . ServeEntity ,
)
content . HEAD ( ":id/:speed/:name" ,
middleware . SignRequired ( dep . GeneralAuth ( ) ) ,
middleware . HashID ( hashid . EntityID ) ,
controllers . FromUri [ explorer . EntityDownloadService ] ( explorer . EntityDownloadParameterCtx { } ) ,
controllers . ServeEntity ,
)
}
2025-09-23 11:24:38 +08:00
// get thumb
2025-04-20 17:31:25 +08:00
file . GET ( "thumb" ,
middleware . ContextHint ( ) ,
controllers . FromQuery [ explorer . FileThumbService ] ( explorer . FileThumbParameterCtx { } ) ,
controllers . Thumb ,
)
// Delete files
file . DELETE ( "" ,
controllers . FromJSON [ explorer . DeleteFileService ] ( explorer . DeleteFileParameterCtx { } ) ,
middleware . ValidateBatchFileCount ( dep , explorer . DeleteFileParameterCtx { } ) ,
controllers . Delete ,
)
// Force unlock
file . DELETE ( "lock" ,
controllers . FromJSON [ explorer . UnlockFileService ] ( explorer . UnlockFileParameterCtx { } ) ,
controllers . Unlock ,
)
// Restore files
file . POST ( "restore" ,
controllers . FromJSON [ explorer . DeleteFileService ] ( explorer . DeleteFileParameterCtx { } ) ,
middleware . ValidateBatchFileCount ( dep , explorer . DeleteFileParameterCtx { } ) ,
controllers . Restore ,
)
// Patch metadata
file . PATCH ( "metadata" ,
controllers . FromJSON [ explorer . PatchMetadataService ] ( explorer . PatchMetadataParameterCtx { } ) ,
middleware . ValidateBatchFileCount ( dep , explorer . PatchMetadataParameterCtx { } ) ,
controllers . PatchMetadata ,
)
// Upload related
upload := file . Group ( "upload" )
{
// Create upload session
upload . PUT ( "" ,
controllers . FromJSON [ explorer . CreateUploadSessionService ] ( explorer . CreateUploadSessionParameterCtx { } ) ,
controllers . CreateUploadSession ,
)
// Upload file data
upload . POST ( ":sessionId/:index" ,
controllers . FromUri [ explorer . UploadService ] ( explorer . UploadParameterCtx { } ) ,
controllers . FileUpload ,
)
upload . DELETE ( "" ,
controllers . FromJSON [ explorer . DeleteUploadSessionService ] ( explorer . DeleteUploadSessionParameterCtx { } ) ,
controllers . DeleteUploadSession ,
)
}
// Pin file
pin := file . Group ( "pin" )
{
// Pin file
pin . PUT ( "" ,
controllers . FromJSON [ explorer . PinFileService ] ( explorer . PinFileParameterCtx { } ) ,
controllers . Pin ,
)
// Unpin file
pin . DELETE ( "" ,
controllers . FromJSON [ explorer . PinFileService ] ( explorer . PinFileParameterCtx { } ) ,
controllers . Unpin ,
)
}
// Get file info
file . GET ( "info" ,
controllers . FromQuery [ explorer . GetFileInfoService ] ( explorer . GetFileInfoParameterCtx { } ) ,
controllers . GetFileInfo ,
)
// Version management
version := file . Group ( "version" )
{
// Set current version
version . POST ( "current" ,
controllers . FromJSON [ explorer . SetCurrentVersionService ] ( explorer . SetCurrentVersionParamCtx { } ) ,
controllers . SetCurrentVersion ,
)
// Delete a version from a file
version . DELETE ( "" ,
controllers . FromJSON [ explorer . DeleteVersionService ] ( explorer . DeleteVersionParamCtx { } ) ,
controllers . DeleteVersion ,
)
}
file . PUT ( "viewerSession" ,
controllers . FromJSON [ explorer . CreateViewerSessionService ] ( explorer . CreateViewerSessionParamCtx { } ) ,
controllers . CreateViewerSession ,
2020-02-01 10:34:23 +08:00
)
2025-05-20 10:45:16 +08:00
// Create task to import files
wf . POST ( "import" ,
middleware . IsAdmin ( ) ,
controllers . FromJSON [ explorer . ImportWorkflowService ] ( explorer . CreateImportParamCtx { } ) ,
controllers . ImportFiles ,
)
2025-04-20 17:31:25 +08:00
// 取得文件外链
2025-06-26 18:45:54 +08:00
source := file . Group ( "source" )
{
source . PUT ( "" ,
controllers . FromJSON [ explorer . GetDirectLinkService ] ( explorer . GetDirectLinkParamCtx { } ) ,
middleware . ValidateBatchFileCount ( dep , explorer . GetDirectLinkParamCtx { } ) ,
controllers . GetSource ,
)
source . DELETE ( ":id" ,
middleware . HashID ( hashid . SourceLinkID ) ,
controllers . DeleteDirectLink ,
)
}
2025-06-05 10:00:37 +08:00
// Patch view
file . PATCH ( "view" ,
controllers . FromJSON [ explorer . PatchViewService ] ( explorer . PatchViewParameterCtx { } ) ,
controllers . PatchView ,
)
2020-01-26 14:57:07 +08:00
}
2025-04-20 17:31:25 +08:00
// 分享相关
share := v4 . Group ( "share" )
2023-01-09 19:37:46 +08:00
{
2025-04-20 17:31:25 +08:00
// Create share link
share . PUT ( "" ,
middleware . LoginRequired ( ) ,
controllers . FromJSON [ sharesvc . ShareCreateService ] ( sharesvc . ShareCreateParamCtx { } ) ,
controllers . CreateShare ,
)
// Edit existing share link
share . POST ( ":id" ,
middleware . LoginRequired ( ) ,
middleware . HashID ( hashid . ShareID ) ,
controllers . FromJSON [ sharesvc . ShareCreateService ] ( sharesvc . ShareCreateParamCtx { } ) ,
controllers . EditShare ,
)
// Get share link info
share . GET ( "info/:id" ,
middleware . HashID ( hashid . ShareID ) ,
controllers . FromQuery [ sharesvc . ShareInfoService ] ( sharesvc . ShareInfoParamCtx { } ) ,
controllers . GetShare ,
)
// List my shares
share . GET ( "" ,
middleware . LoginRequired ( ) ,
controllers . FromQuery [ sharesvc . ListShareService ] ( sharesvc . ListShareParamCtx { } ) ,
controllers . ListShare ,
)
// 删除分享
share . DELETE ( ":id" ,
middleware . LoginRequired ( ) ,
middleware . HashID ( hashid . ShareID ) ,
controllers . DeleteShare ,
)
//// 获取README文本文件内容
//share.GET("readme/:id",
// middleware.CheckShareUnlocked(),
// controllers.PreviewShareReadme,
//)
//// 举报分享
//share.POST("report/:id",
// middleware.CheckShareUnlocked(),
// controllers.ReportShare,
//)
2023-01-09 19:37:46 +08:00
}
2019-11-12 15:34:54 +08:00
// 需要登录保护的
2025-04-20 17:31:25 +08:00
auth := v4 . Group ( "" )
auth . Use ( middleware . LoginRequired ( ) )
2019-11-12 15:34:54 +08:00
{
2020-02-22 16:22:04 +08:00
// 管理
admin := auth . Group ( "admin" , middleware . IsAdmin ( ) )
{
2025-04-20 17:31:25 +08:00
admin . GET ( "summary" ,
controllers . FromQuery [ adminsvc . SummaryService ] ( adminsvc . SummaryParamCtx { } ) ,
controllers . AdminSummary ,
)
settings := admin . Group ( "settings" )
2023-04-07 19:33:02 +08:00
{
2025-04-20 17:31:25 +08:00
// Get settings
settings . POST ( "" ,
controllers . FromJSON [ adminsvc . GetSettingService ] ( adminsvc . GetSettingParamCtx { } ) ,
controllers . AdminGetSettings ,
)
// Patch settings
settings . PATCH ( "" ,
controllers . FromJSON [ adminsvc . SetSettingService ] ( adminsvc . SetSettingParamCtx { } ) ,
controllers . AdminSetSettings ,
)
2023-04-07 19:33:02 +08:00
}
2020-02-24 15:52:13 +08:00
2025-04-20 17:31:25 +08:00
// 用户组管理
group := admin . Group ( "group" )
2020-02-26 15:11:06 +08:00
{
2025-04-20 17:31:25 +08:00
// 列出用户组
group . POST ( "" ,
controllers . FromJSON [ adminsvc . AdminListService ] ( adminsvc . AdminListServiceParamsCtx { } ) ,
controllers . AdminListGroups ,
)
// 获取用户组
group . GET ( ":id" ,
controllers . FromUri [ adminsvc . SingleGroupService ] ( adminsvc . SingleGroupParamCtx { } ) ,
controllers . AdminGetGroup ,
)
// 创建用户组
group . PUT ( "" ,
controllers . FromJSON [ adminsvc . UpsertGroupService ] ( adminsvc . UpsertGroupParamCtx { } ) ,
controllers . AdminCreateGroup ,
)
// 更新用户组
group . PUT ( ":id" ,
controllers . FromJSON [ adminsvc . UpsertGroupService ] ( adminsvc . UpsertGroupParamCtx { } ) ,
controllers . AdminUpdateGroup ,
)
// 删除用户组
group . DELETE ( ":id" ,
controllers . FromUri [ adminsvc . SingleGroupService ] ( adminsvc . SingleGroupParamCtx { } ) ,
controllers . AdminDeleteGroup ,
)
}
tool := admin . Group ( "tool" )
{
tool . GET ( "wopi" ,
controllers . FromQuery [ adminsvc . FetchWOPIDiscoveryService ] ( adminsvc . FetchWOPIDiscoveryParamCtx { } ) ,
controllers . AdminFetchWopi ,
)
tool . POST ( "thumbExecutable" ,
controllers . FromJSON [ adminsvc . ThumbGeneratorTestService ] ( adminsvc . ThumbGeneratorTestParamCtx { } ) ,
controllers . AdminTestThumbGenerator )
tool . POST ( "mail" ,
controllers . FromJSON [ adminsvc . TestSMTPService ] ( adminsvc . TestSMTPParamCtx { } ) ,
controllers . AdminSendTestMail ,
)
tool . DELETE ( "entityUrlCache" ,
controllers . AdminClearEntityUrlCache ,
)
}
queue := admin . Group ( "queue" )
{
queue . GET ( "metrics" , controllers . AdminGetQueueMetrics )
// List tasks
queue . POST ( "" ,
controllers . FromJSON [ adminsvc . AdminListService ] ( adminsvc . AdminListServiceParamsCtx { } ) ,
controllers . AdminListTasks ,
)
// Get task
queue . GET ( ":id" ,
controllers . FromUri [ adminsvc . SingleTaskService ] ( adminsvc . SingleTaskParamCtx { } ) ,
controllers . AdminGetTask ,
)
// Batch delete task
queue . POST ( "batch/delete" ,
controllers . FromJSON [ adminsvc . BatchTaskService ] ( adminsvc . BatchTaskParamCtx { } ) ,
controllers . AdminBatchDeleteTask ,
)
2025-07-05 11:52:15 +08:00
// Cleanup tasks
queue . POST ( "cleanup" ,
controllers . FromJSON [ adminsvc . CleanupTaskService ] ( adminsvc . CleanupTaskParameterCtx { } ) ,
controllers . AdminCleanupTask ,
)
2025-04-20 17:31:25 +08:00
// // 列出任务
// queue.POST("list", controllers.AdminListTask)
// // 新建文件导入任务
// queue.POST("import", controllers.AdminCreateImportTask)
2020-02-26 15:11:06 +08:00
}
2020-03-07 13:00:51 +08:00
// 存储策略管理
2020-02-26 15:11:06 +08:00
policy := admin . Group ( "policy" )
{
// 列出存储策略
2025-04-20 17:31:25 +08:00
policy . POST ( "" ,
controllers . FromJSON [ adminsvc . AdminListService ] ( adminsvc . AdminListServiceParamsCtx { } ) ,
controllers . AdminListPolicies ,
)
// 获取存储策略详情
policy . GET ( ":id" ,
controllers . FromUri [ adminsvc . SingleStoragePolicyService ] ( adminsvc . GetStoragePolicyParamCtx { } ) ,
controllers . AdminGetPolicy ,
)
2020-02-26 15:11:06 +08:00
// 创建存储策略
2025-04-20 17:31:25 +08:00
policy . PUT ( "" ,
controllers . FromJSON [ adminsvc . CreateStoragePolicyService ] ( adminsvc . CreateStoragePolicyParamCtx { } ) ,
controllers . AdminCreatePolicy ,
)
// 更新存储策略
policy . PUT ( ":id" ,
controllers . FromJSON [ adminsvc . UpdateStoragePolicyService ] ( adminsvc . UpdateStoragePolicyParamCtx { } ) ,
controllers . AdminUpdatePolicy ,
)
2020-03-01 16:25:56 +08:00
// 创建跨域策略
2025-04-20 17:31:25 +08:00
policy . POST ( "cors" ,
controllers . FromJSON [ adminsvc . CreateStoragePolicyCorsService ] ( adminsvc . CreateStoragePolicyCorsParamCtx { } ) ,
controllers . AdminCreateStoragePolicyCors ,
)
// // 获取 OneDrive OAuth URL
oauth := policy . Group ( "oauth" )
2023-05-24 14:39:54 +08:00
{
// 获取 OneDrive OAuth URL
2025-04-20 17:31:25 +08:00
oauth . POST ( "signin" ,
controllers . FromJSON [ adminsvc . GetOauthRedirectService ] ( adminsvc . GetOauthRedirectParamCtx { } ) ,
controllers . AdminOdOAuthURL ,
)
// 获取 OAuth 回调 URL
oauth . GET ( "redirect" , controllers . AdminGetPolicyOAuthCallbackURL )
oauth . GET ( "status/:id" ,
controllers . FromUri [ adminsvc . SingleStoragePolicyService ] ( adminsvc . GetStoragePolicyParamCtx { } ) ,
controllers . AdminGetPolicyOAuthStatus ,
)
oauth . POST ( "callback" ,
controllers . FromJSON [ adminsvc . FinishOauthCallbackService ] ( adminsvc . FinishOauthCallbackParamCtx { } ) ,
controllers . AdminFinishOauthCallback ,
)
oauth . GET ( "root/:id" ,
controllers . FromUri [ adminsvc . SingleStoragePolicyService ] ( adminsvc . GetStoragePolicyParamCtx { } ) ,
controllers . AdminGetSharePointDriverRoot ,
)
2023-05-24 14:39:54 +08:00
}
2025-04-20 17:31:25 +08:00
// // 获取 存储策略
// policy.GET(":id", controllers.AdminGetPolicy)
2020-03-02 16:20:33 +08:00
// 删除 存储策略
2025-04-20 17:31:25 +08:00
policy . DELETE ( ":id" ,
controllers . FromUri [ adminsvc . SingleStoragePolicyService ] ( adminsvc . GetStoragePolicyParamCtx { } ) ,
controllers . AdminDeletePolicy ,
)
2020-02-26 15:11:06 +08:00
}
2025-04-20 17:31:25 +08:00
node := admin . Group ( "node" )
2020-03-07 13:00:51 +08:00
{
2025-04-20 17:31:25 +08:00
node . POST ( "" ,
controllers . FromJSON [ adminsvc . AdminListService ] ( adminsvc . AdminListServiceParamsCtx { } ) ,
controllers . AdminListNodes ,
)
node . GET ( ":id" ,
controllers . FromUri [ adminsvc . SingleNodeService ] ( adminsvc . SingleNodeParamCtx { } ) ,
controllers . AdminGetNode ,
)
node . POST ( "test" ,
controllers . FromJSON [ adminsvc . TestNodeService ] ( adminsvc . TestNodeParamCtx { } ) ,
controllers . AdminTestSlave ,
)
node . POST ( "test/downloader" ,
controllers . FromJSON [ adminsvc . TestNodeDownloaderService ] ( adminsvc . TestNodeDownloaderParamCtx { } ) ,
controllers . AdminTestDownloader ,
)
node . PUT ( "" ,
controllers . FromJSON [ adminsvc . UpsertNodeService ] ( adminsvc . UpsertNodeParamCtx { } ) ,
controllers . AdminCreateNode ,
)
node . PUT ( ":id" ,
controllers . FromJSON [ adminsvc . UpsertNodeService ] ( adminsvc . UpsertNodeParamCtx { } ) ,
controllers . AdminUpdateNode ,
)
node . DELETE ( ":id" ,
controllers . FromUri [ adminsvc . SingleNodeService ] ( adminsvc . SingleNodeParamCtx { } ) ,
controllers . AdminDeleteNode ,
)
2020-03-07 13:00:51 +08:00
}
2020-03-07 14:04:18 +08:00
user := admin . Group ( "user" )
{
// 列出用户
2025-04-20 17:31:25 +08:00
user . POST ( "" ,
controllers . FromJSON [ adminsvc . AdminListService ] ( adminsvc . AdminListServiceParamsCtx { } ) ,
controllers . AdminListUsers ,
)
2020-03-08 10:49:34 +08:00
// 获取用户
2025-04-20 17:31:25 +08:00
user . GET ( ":id" ,
controllers . FromUri [ adminsvc . SingleUserService ] ( adminsvc . SingleUserParamCtx { } ) ,
controllers . AdminGetUser ,
)
// 更新用户
user . PUT ( ":id" ,
controllers . FromJSON [ adminsvc . UpsertUserService ] ( adminsvc . UpsertUserParamCtx { } ) ,
controllers . AdminUpdateUser ,
)
// 创建用户
user . PUT ( "" ,
controllers . FromJSON [ adminsvc . UpsertUserService ] ( adminsvc . UpsertUserParamCtx { } ) ,
controllers . AdminCreateUser ,
)
batch := user . Group ( "batch" )
{
// 批量删除用户
batch . POST ( "delete" ,
controllers . FromJSON [ adminsvc . BatchUserService ] ( adminsvc . BatchUserParamCtx { } ) ,
controllers . AdminDeleteUser ,
)
}
user . POST ( ":id/calibrate" ,
controllers . FromUri [ adminsvc . SingleUserService ] ( adminsvc . SingleUserParamCtx { } ) ,
controllers . AdminCalibrateStorage ,
)
2020-03-07 14:04:18 +08:00
}
2020-03-08 13:53:13 +08:00
file := admin . Group ( "file" )
{
// 列出文件
2025-04-20 17:31:25 +08:00
file . POST ( "" ,
controllers . FromJSON [ adminsvc . AdminListService ] ( adminsvc . AdminListServiceParamsCtx { } ) ,
controllers . AdminListFiles ,
)
// 获取文件
file . GET ( ":id" ,
controllers . FromUri [ adminsvc . SingleFileService ] ( adminsvc . SingleFileParamCtx { } ) ,
controllers . AdminGetFile ,
)
// 更新文件
file . PUT ( ":id" ,
controllers . FromJSON [ adminsvc . UpsertFileService ] ( adminsvc . UpsertFileParamCtx { } ) ,
controllers . AdminUpdateFile ,
)
// 获取文件 URL
file . GET ( "url/:id" ,
controllers . FromUri [ adminsvc . SingleFileService ] ( adminsvc . SingleFileParamCtx { } ) ,
controllers . AdminGetFileUrl ,
)
// 批量删除文件
file . POST ( "batch/delete" ,
controllers . FromJSON [ adminsvc . BatchFileService ] ( adminsvc . BatchFileParamCtx { } ) ,
controllers . AdminBatchDeleteFile ,
)
2020-03-09 10:17:59 +08:00
}
2025-04-20 17:31:25 +08:00
entity := admin . Group ( "entity" )
2020-03-09 12:30:43 +08:00
{
2025-04-20 17:31:25 +08:00
// List blobs
entity . POST ( "" ,
controllers . FromJSON [ adminsvc . AdminListService ] ( adminsvc . AdminListServiceParamsCtx { } ) ,
controllers . AdminListEntities ,
)
// Get entity
entity . GET ( ":id" ,
controllers . FromUri [ adminsvc . SingleEntityService ] ( adminsvc . SingleEntityParamCtx { } ) ,
controllers . AdminGetEntity ,
)
// Batch delete entity
entity . POST ( "batch/delete" ,
controllers . FromJSON [ adminsvc . BatchEntityService ] ( adminsvc . BatchEntityParamCtx { } ) ,
controllers . AdminBatchDeleteEntity ,
)
// Get entity url
entity . GET ( "url/:id" ,
controllers . FromUri [ adminsvc . SingleEntityService ] ( adminsvc . SingleEntityParamCtx { } ) ,
controllers . AdminGetEntityUrl ,
)
2020-03-09 12:30:43 +08:00
}
2025-04-20 17:31:25 +08:00
share := admin . Group ( "share" )
2021-10-31 09:41:56 +08:00
{
2025-04-20 17:31:25 +08:00
// List shares
share . POST ( "" ,
controllers . FromJSON [ adminsvc . AdminListService ] ( adminsvc . AdminListServiceParamsCtx { } ) ,
controllers . AdminListShares ,
)
// Get share
share . GET ( ":id" ,
controllers . FromUri [ adminsvc . SingleShareService ] ( adminsvc . SingleShareParamCtx { } ) ,
controllers . AdminGetShare ,
)
// Batch delete shares
share . POST ( "batch/delete" ,
controllers . FromJSON [ adminsvc . BatchShareService ] ( adminsvc . BatchShareParamCtx { } ) ,
controllers . AdminBatchDeleteShare ,
)
2021-10-31 09:41:56 +08:00
}
2020-02-22 16:22:04 +08:00
}
2019-11-23 15:37:13 +08:00
// 用户
2019-11-23 16:58:56 +08:00
user := auth . Group ( "user" )
2019-11-12 15:34:54 +08:00
{
// 当前登录用户信息
2019-11-23 16:58:56 +08:00
user . GET ( "me" , controllers . UserMe )
2020-01-28 13:40:19 +08:00
// 存储信息
2025-04-20 17:31:25 +08:00
user . GET ( "capacity" , controllers . UserStorage )
// Search user by keywords
user . GET ( "search" ,
controllers . FromQuery [ usersvc . SearchUserService ] ( usersvc . SearchUserParamCtx { } ) ,
controllers . UserSearch ,
)
2019-12-08 22:17:36 +08:00
// WebAuthn 注册相关
2020-02-21 10:08:47 +08:00
authn := user . Group ( "authn" ,
2025-04-20 17:31:25 +08:00
middleware . IsFunctionEnabled ( func ( c * gin . Context ) bool {
return dep . SettingProvider ( ) . AuthnEnabled ( c )
} ) )
2019-12-08 22:17:36 +08:00
{
authn . PUT ( "" , controllers . StartRegAuthn )
2025-04-20 17:31:25 +08:00
authn . POST ( "" ,
controllers . FromJSON [ usersvc . FinishPasskeyRegisterService ] ( usersvc . FinishPasskeyRegisterParameterCtx { } ) ,
controllers . FinishRegAuthn ,
)
authn . DELETE ( "" ,
controllers . FromQuery [ usersvc . DeletePasskeyService ] ( usersvc . DeletePasskeyParameterCtx { } ) ,
controllers . UserDeletePasskey ,
)
2019-12-08 22:17:36 +08:00
}
2020-02-18 13:45:59 +08:00
// 用户设置
setting := user . Group ( "setting" )
{
2020-02-19 16:05:54 +08:00
// 获取当前用户设定
setting . GET ( "" , controllers . UserSetting )
// 从文件上传头像
2025-04-20 17:31:25 +08:00
setting . PUT ( "avatar" , controllers . UploadAvatar )
2020-02-19 16:05:54 +08:00
// 更改用户设定
2025-04-20 17:31:25 +08:00
setting . PATCH ( "" ,
controllers . FromJSON [ usersvc . PatchUserSetting ] ( usersvc . PatchUserSettingParamsCtx { } ) ,
controllers . UpdateOption ,
)
2020-02-20 12:42:38 +08:00
// 获得二步验证初始化信息
setting . GET ( "2fa" , controllers . UserInit2FA )
2020-02-18 13:45:59 +08:00
}
2019-11-12 15:34:54 +08:00
}
2025-04-20 17:31:25 +08:00
// WebDAV and devices
devices := auth . Group ( "devices" )
2020-01-26 13:07:05 +08:00
{
2025-04-20 17:31:25 +08:00
dav := devices . Group ( "dav" )
{
// List WebDAV accounts
dav . GET ( "" ,
controllers . FromQuery [ setting . ListDavAccountsService ] ( setting . ListDavAccountParamCtx { } ) ,
controllers . ListDavAccounts ,
)
// Create WebDAV account
dav . PUT ( "" ,
controllers . FromJSON [ setting . CreateDavAccountService ] ( setting . CreateDavAccountParamCtx { } ) ,
controllers . CreateDAVAccounts ,
)
// Create WebDAV account
dav . PATCH ( ":id" ,
middleware . HashID ( hashid . DavAccountID ) ,
controllers . FromJSON [ setting . CreateDavAccountService ] ( setting . CreateDavAccountParamCtx { } ) ,
controllers . UpdateDAVAccounts ,
)
// Delete WebDAV account
dav . DELETE ( ":id" ,
middleware . HashID ( hashid . DavAccountID ) ,
controllers . DeleteDAVAccounts ,
)
}
//// 获取账号信息
//devices.GET("dav", controllers.GetWebDAVAccounts)
//// 删除目录挂载
//devices.DELETE("mount/:id",
// middleware.HashID(hashid.FolderID),
// controllers.DeleteWebDAVMounts,
//)
//// 创建目录挂载
//devices.POST("mount", controllers.CreateWebDAVMounts)
//// 更新账号可读性
//devices.PATCH("accounts", controllers.UpdateWebDAVAccountsReadonly)
2020-02-18 12:10:28 +08:00
}
2019-11-12 15:34:54 +08:00
}
2019-11-05 12:31:22 +08:00
}
2019-12-16 19:43:00 +08:00
// 初始化WebDAV相关路由
2019-12-17 12:02:50 +08:00
initWebDAV ( r . Group ( "dav" ) )
2019-11-05 12:31:22 +08:00
return r
}
2019-12-23 13:27:18 +08:00
// initWebDAV 初始化WebDAV相关路由
func initWebDAV ( group * gin . RouterGroup ) {
{
2025-04-20 17:31:25 +08:00
group . Use ( middleware . CacheControl ( ) , middleware . WebDAVAuth ( ) )
group . Any ( "/*path" , webdav . ServeHTTP )
group . Any ( "" , webdav . ServeHTTP )
group . Handle ( "PROPFIND" , "/*path" , webdav . ServeHTTP )
group . Handle ( "PROPFIND" , "" , webdav . ServeHTTP )
group . Handle ( "MKCOL" , "/*path" , webdav . ServeHTTP )
group . Handle ( "LOCK" , "/*path" , webdav . ServeHTTP )
group . Handle ( "UNLOCK" , "/*path" , webdav . ServeHTTP )
group . Handle ( "PROPPATCH" , "/*path" , webdav . ServeHTTP )
group . Handle ( "COPY" , "/*path" , webdav . ServeHTTP )
group . Handle ( "MOVE" , "/*path" , webdav . ServeHTTP )
2019-12-23 13:27:18 +08:00
}
}